Files
tutti/packages/agent/daemon/activity/runtime_projection_test.go
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

502 lines
15 KiB
Go

package agentsessionstore
import "testing"
func TestNormalizeSessionOriginRuntimeOnly(t *testing.T) {
t.Parallel()
tests := []struct {
name string
origin string
want string
}{
{name: "empty defaults to runtime", origin: "", want: WorkspaceAgentSessionOriginRuntime},
{name: "runtime is accepted", origin: WorkspaceAgentSessionOriginRuntime, want: WorkspaceAgentSessionOriginRuntime},
{name: "hook alias is not accepted", origin: "hook", want: ""},
{name: "uppercase hook alias is not accepted", origin: "HOOK", want: ""},
{name: "numeric hook alias is not accepted", origin: "1", want: ""},
{name: "unknown explicit origin is not accepted", origin: "WORKSPACE_AGENT_SESSION_ORIGIN_UNKNOWN", want: ""},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if got := NormalizeSessionOrigin(tt.origin); got != tt.want {
t.Fatalf("NormalizeSessionOrigin(%q) = %q, want %q", tt.origin, got, tt.want)
}
})
}
}
func TestFilterTimelineItemsDropsZeroIDRowsAfterCursor(t *testing.T) {
t.Parallel()
items := []WorkspaceAgentTimelineItem{
{ID: 0, EventID: "local-provisional"},
{ID: 2, EventID: "already-seen"},
{ID: 3, EventID: "next"},
}
filtered := FilterTimelineItems(items, 2, 0)
if len(filtered) != 1 {
t.Fatalf("filtered items = %#v, want only durable item after cursor", filtered)
}
if filtered[0].EventID != "next" {
t.Fatalf("filtered event id = %q, want next", filtered[0].EventID)
}
}
func TestFilterTimelineItemsKeepsZeroIDRowsBeforeCursor(t *testing.T) {
t.Parallel()
items := []WorkspaceAgentTimelineItem{
{ID: 0, EventID: "local-provisional"},
{ID: 1, EventID: "durable"},
}
filtered := FilterTimelineItems(items, 0, 0)
if len(filtered) != 2 {
t.Fatalf("filtered items = %#v, want zero-id item before cursor advances", filtered)
}
}
func TestRuntimeTimelineItemsForDisplayReplaysLocalItemsWhenCursorOutrunsLocalIDs(t *testing.T) {
t.Parallel()
local := []WorkspaceAgentTimelineItem{
{
ID: 101561,
EventID: "local-user",
ItemType: "message.user",
Role: "user",
OccurredAtUnixMS: 1710000000100,
},
{
ID: 101563,
EventID: "local-assistant",
ItemType: "message.assistant",
Role: "assistant",
OccurredAtUnixMS: 1710000000200,
},
}
filtered := RuntimeTimelineItemsForDisplay(nil, local, 104646, 20)
if len(filtered) != 2 {
t.Fatalf("filtered items = %#v, want local items replayed when upstream tail is empty", filtered)
}
if filtered[0].EventID != "local-user" || filtered[1].EventID != "local-assistant" {
t.Fatalf("filtered event ids = %#v", filtered)
}
}
func TestRuntimeTimelineItemsForDisplayDoesNotReplaySettledCompletedLocalTail(t *testing.T) {
t.Parallel()
local := []WorkspaceAgentTimelineItem{
{
ID: 0,
EventID: "local-user",
ItemType: "message.user",
Role: "user",
Status: "completed",
OccurredAtUnixMS: 1710000000100,
},
{
ID: 0,
EventID: "local-assistant",
ItemType: "message.assistant",
Role: "assistant",
Status: "completed",
OccurredAtUnixMS: 1710000000200,
},
}
filtered := RuntimeTimelineItemsForDisplay(nil, local, 104646, 20)
if len(filtered) != 0 {
t.Fatalf("filtered items = %#v, want settled completed local tail dropped after cursor", filtered)
}
}
func TestRuntimeTimelineItemsForSummaryDisplayReturnsMinimalSettledMessageTail(t *testing.T) {
t.Parallel()
local := []WorkspaceAgentTimelineItem{
{
ID: 0,
EventID: "local-user-old",
ItemType: "message.user",
Role: "user",
Status: "completed",
Payload: map[string]any{"content": "older user"},
OccurredAtUnixMS: 1710000000000,
},
{
ID: 0,
EventID: "local-user-latest",
ItemType: "message.user",
Role: "user",
Status: "completed",
Payload: map[string]any{"content": "latest user"},
OccurredAtUnixMS: 1710000000100,
},
{
ID: 0,
EventID: "local-assistant-latest",
ItemType: "message.assistant",
Role: "assistant",
Status: "completed",
Payload: map[string]any{"content": "latest assistant"},
OccurredAtUnixMS: 1710000000200,
},
{
ID: 0,
EventID: "call-finished",
ItemType: "call.completed",
Status: "completed",
OccurredAtUnixMS: 1710000000300,
},
}
filtered := RuntimeTimelineItemsForSummaryDisplay(local, 20)
if len(filtered) != 2 {
t.Fatalf("filtered items = %#v, want latest user and assistant summary tail", filtered)
}
if filtered[0].EventID != "local-user-latest" || filtered[1].EventID != "local-assistant-latest" {
t.Fatalf("filtered items = %#v", filtered)
}
}
func TestRuntimeSnapshotForDisplayKeepsLocalCompletedTurnAgainstStaleWorkingSync(t *testing.T) {
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
ID: 42,
AgentSessionID: "agent-1",
Provider: "codex",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "working",
EffectiveStatus: "working",
StartedAtUnixMS: 1000,
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
}},
}
local := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-1",
Provider: "codex",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "idle",
StartedAtUnixMS: 1000,
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 2000,
EndedAtUnixMS: 2000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, local)
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one merged session", display.Sessions)
}
session := display.Sessions[0]
if session.EffectiveStatus != "idle" || session.TurnPhase != "idle" {
t.Fatalf("session status = %#v, want local completed turn to stay idle", session)
}
if session.ID != 42 || session.EndedAtUnixMS != 2000 {
t.Fatalf("session metadata = %#v, want upstream identity and local end time", session)
}
}
func TestRuntimeSnapshotForDisplayKeepsLocalFailedTurnAgainstStaleWorkingSync(t *testing.T) {
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
ID: 42,
AgentSessionID: "agent-1",
Provider: "claude-code",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "working",
EffectiveStatus: "working",
StartedAtUnixMS: 1000,
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
}},
}
local := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-1",
Provider: "claude-code",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "failed",
EffectiveStatus: "failed",
StartedAtUnixMS: 1000,
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 2000,
EndedAtUnixMS: 2000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, local)
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one merged session", display.Sessions)
}
session := display.Sessions[0]
if session.EffectiveStatus != "failed" || session.TurnPhase != "failed" {
t.Fatalf("session status = %#v, want local failed turn to stay failed", session)
}
if session.ID != 42 || session.EndedAtUnixMS != 2000 {
t.Fatalf("session metadata = %#v, want upstream identity and local end time", session)
}
}
func TestRuntimeSnapshotForDisplayAllowsNewWorkingTurnAfterLocalCompletedTurn(t *testing.T) {
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-1",
Provider: "codex",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "working",
EffectiveStatus: "working",
StartedAtUnixMS: 2500,
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
}},
}
local := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-1",
Provider: "codex",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "idle",
StartedAtUnixMS: 1000,
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 2000,
EndedAtUnixMS: 2000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, local)
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one merged session", display.Sessions)
}
session := display.Sessions[0]
if session.EffectiveStatus != "working" || session.TurnPhase != "working" {
t.Fatalf("session status = %#v, want newer upstream turn to stay working", session)
}
}
func TestRuntimeSnapshotForDisplayNormalizesUpstreamActiveIdleStatus(t *testing.T) {
t.Parallel()
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
ID: 42,
AgentSessionID: "agent-1",
Provider: "nexight",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "active",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, WorkspaceAgentSnapshot{})
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one session", display.Sessions)
}
session := display.Sessions[0]
if session.EffectiveStatus != "idle" || session.TurnPhase != "idle" {
t.Fatalf("session status = %#v, want active lifecycle with idle turn to display idle", session)
}
if session.ID != 42 || session.UpdatedAtUnixMS != 3000 {
t.Fatalf("session metadata = %#v, want upstream metadata preserved", session)
}
}
func TestRuntimeSnapshotForDisplayNormalizesNewerUpstreamActiveIdleOverLocalIdle(t *testing.T) {
t.Parallel()
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
ID: 42,
AgentSessionID: "agent-1",
Provider: "nexight",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "active",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
}},
}
local := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-1",
Provider: "nexight",
ProviderSessionID: "provider-1",
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "idle",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 2000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, local)
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one merged session", display.Sessions)
}
session := display.Sessions[0]
if session.EffectiveStatus != "idle" || session.TurnPhase != "idle" {
t.Fatalf("session status = %#v, want newer active+idle upstream to display idle", session)
}
if session.ID != 42 || session.UpdatedAtUnixMS != 3000 {
t.Fatalf("session metadata = %#v, want upstream metadata preserved", session)
}
}
func TestRuntimeSnapshotForDisplayMergesRuntimeFallbackSessionByProviderSessionID(t *testing.T) {
t.Parallel()
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
ID: 42,
AgentSessionID: "agent-session-1",
Provider: "codex",
ProviderSessionID: "provider-session-1",
SessionOrigin: WorkspaceAgentSessionOriginRuntime,
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "idle",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 2000,
}},
}
local := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "provider-session-1",
Provider: "codex",
ProviderSessionID: "provider-session-1",
SessionOrigin: WorkspaceAgentSessionOriginRuntime,
LifecycleStatus: "active",
TurnPhase: "working",
EffectiveStatus: "working",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, local)
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one merged session", display.Sessions)
}
session := display.Sessions[0]
if session.AgentSessionID != "agent-session-1" {
t.Fatalf("agent session id = %q, want upstream control-plane session id", session.AgentSessionID)
}
if session.ProviderSessionID != "provider-session-1" {
t.Fatalf("provider session id = %q, want shared provider session id", session.ProviderSessionID)
}
if session.SessionOrigin != WorkspaceAgentSessionOriginRuntime {
t.Fatalf("session origin = %q, want runtime origin preserved", session.SessionOrigin)
}
if session.EffectiveStatus != "working" || session.TurnPhase != "working" {
t.Fatalf("session status = %#v, want newer local working state", session)
}
}
func TestRuntimeSnapshotForDisplayKeepsLocalBusyStateAgainstNewerUpstreamIdle(t *testing.T) {
t.Parallel()
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
ID: 42,
AgentSessionID: "agent-session-1",
Provider: "codex",
ProviderSessionID: "provider-session-1",
SessionOrigin: WorkspaceAgentSessionOriginRuntime,
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "idle",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 4000,
}},
}
local := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-session-1",
Provider: "codex",
ProviderSessionID: "provider-session-1",
SessionOrigin: WorkspaceAgentSessionOriginRuntime,
LifecycleStatus: "active",
TurnPhase: "working",
EffectiveStatus: "working",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 3000,
Title: "Local runtime title",
}},
}
display := RuntimeSnapshotForDisplay(upstream, local)
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want one merged session", display.Sessions)
}
session := display.Sessions[0]
if session.EffectiveStatus != "working" || session.TurnPhase != "working" {
t.Fatalf("session status = %#v, want local busy state preserved against stale upstream idle", session)
}
if session.Title != "Local runtime title" {
t.Fatalf("session title = %q, want local title preserved", session.Title)
}
if session.ID != 42 {
t.Fatalf("session identity = %#v, want upstream identity preserved", session)
}
}
func TestRuntimeSnapshotForDisplayKeepsIdleRuntimePlaceholderForHandlerLevelFiltering(t *testing.T) {
t.Parallel()
upstream := WorkspaceAgentSnapshot{
Sessions: []ProviderActivitySessionProjection{{
AgentSessionID: "agent-session-placeholder",
Provider: "codex",
ProviderSessionID: "provider-session-placeholder",
SessionOrigin: WorkspaceAgentSessionOriginRuntime,
LifecycleStatus: "active",
TurnPhase: "idle",
EffectiveStatus: "idle",
Title: "Codex",
CreatedAtUnixMS: 1000,
UpdatedAtUnixMS: 2000,
}},
}
display := RuntimeSnapshotForDisplay(upstream, WorkspaceAgentSnapshot{})
if len(display.Sessions) != 1 {
t.Fatalf("sessions = %#v, want runtime placeholder preserved for handler filtering", display.Sessions)
}
}