import { classifyTaskAgentKind, EventId, MessageId, ThreadId, TurnId, type OrchestrationThreadActivity,} from "@t3tools/contracts";import { describe, expect, it } from "vite-plus/test";import { resolveWorkEntryToolPresentation } from "@t3tools/client-runtime/work-log/presentation"; import { createMessageAttachmentPreviewProjector, deriveActiveWorkStartedAt, deriveActivePlanState, deriveTimelineEntries, deriveTimelineEntriesWithState, deriveWorkLogEntries, findLatestProposedPlan, hasActionableProposedPlan, isLatestTurnSettled, selectHandoffImageResources, selectMessageImageResources, workEntryIndicatesToolNeutralStatus,} from "./session-logic"; let nextActivityId = 0; function makeActivity(overrides: { id?: string; createdAt?: string; kind?: string; summary?: string; tone?: OrchestrationThreadActivity["tone"]; payload?: Record<string, unknown>; turnId?: string; sequence?: number;}): OrchestrationThreadActivity { // Fixtures model post-ingestion rows: ingestion stamps agentKind on every // task.* payload. Pass an explicit agentKind to model legacy rows. const rawPayload = overrides.payload ?? {}; const payload = overrides.kind?.startsWith("task.") && !("agentKind" in rawPayload) ? { ...rawPayload, agentKind: classifyTaskAgentKind({ taskType: typeof rawPayload.taskType === "string" ? rawPayload.taskType : undefined, agentId: typeof rawPayload.agentId === "string" ? rawPayload.agentId : undefined, }), } : rawPayload; return { id: EventId.make(overrides.id ?? `activity-${nextActivityId++}`), createdAt: overrides.createdAt ?? "2026-02-23T00:00:00.000Z", kind: overrides.kind ?? "tool.started", summary: overrides.summary ?? "Tool call", tone: overrides.tone ?? "tool", payload, turnId: overrides.turnId ? TurnId.make(overrides.turnId) : null, ...(overrides.sequence !== undefined ? { sequence: overrides.sequence } : {}), };} describe("deriveActivePlanState", () => { it("returns the latest plan update for the active turn", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-old", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { explanation: "Initial plan", plan: [{ step: "Inspect code", status: "pending" }], }, }), makeActivity({ id: "plan-latest", createdAt: "2026-02-23T00:00:02.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { explanation: "Refined plan", plan: [{ step: "Implement Codex user input", status: "inProgress" }], }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))).toEqual({ createdAt: "2026-02-23T00:00:02.000Z", turnId: "turn-1", explanation: "Refined plan", steps: [{ step: "Implement Codex user input", status: "inProgress" }], }); }); it("falls back to the most recent plan from a previous turn", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-from-turn-1", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Write tests", status: "completed" }], }, }), ]; // Current turn is turn-2, which has no plan activity — should fall back to turn-1's plan const result = deriveActivePlanState(activities, TurnId.make("turn-2")); expect(result).toEqual({ createdAt: "2026-02-23T00:00:01.000Z", turnId: "turn-1", steps: [{ step: "Write tests", status: "completed" }], }); }); it("starts timing again after a plan is cleared and recreated", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-old-start", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "inProgress" }] }, }), makeActivity({ id: "plan-old-complete", createdAt: "2026-02-23T00:00:05.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "completed" }] }, }), makeActivity({ id: "plan-clear", createdAt: "2026-02-23T00:00:06.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [] }, }), makeActivity({ id: "plan-new-start", createdAt: "2026-02-23T00:00:10.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "inProgress" }] }, }), makeActivity({ id: "plan-new-complete", createdAt: "2026-02-23T00:00:13.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "completed" }] }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toEqual([ { durationMs: 3_000, step: "Check", status: "completed" }, ]); }); it("tracks repeated step labels independently", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-1a", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "Check", status: "inProgress" }, { step: "Check", status: "pending" }, ], }, }), makeActivity({ id: "plan-1b", createdAt: "2026-02-23T00:00:05.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "Check", status: "completed" }, { step: "Check", status: "inProgress" }, ], }, }), makeActivity({ id: "plan-1c", createdAt: "2026-02-23T00:00:11.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "Check", status: "completed" }, { step: "Check", status: "completed" }, ], }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toEqual([ { durationMs: 4_000, step: "Check", status: "completed" }, { durationMs: 6_000, step: "Check", status: "completed" }, ]); }); it("derives fallback durations in completion order", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-start", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "First", status: "pending" }, { step: "Second", status: "pending" }, ], }, }), makeActivity({ id: "plan-second-complete", createdAt: "2026-02-23T00:00:06.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "First", status: "pending" }, { step: "Second", status: "completed" }, ], }, }), makeActivity({ id: "plan-first-complete", createdAt: "2026-02-23T00:00:11.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "First", status: "completed" }, { step: "Second", status: "completed" }, ], }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toEqual([ { durationMs: 5_000, step: "First", status: "completed" }, { durationMs: 5_000, step: "Second", status: "completed" }, ]); }); it("clears the active plan when a later snapshot has no steps", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-set", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Inspect code", status: "inProgress" }] }, }), makeActivity({ id: "plan-clear", createdAt: "2026-02-23T00:00:02.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [] }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))).toBeNull(); });}); describe("findLatestProposedPlan", () => { it("prefers the latest proposed plan for the active turn", () => { expect( findLatestProposedPlan( [ { id: "plan:thread-1:turn:turn-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Older", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:01.000Z", }, { id: "plan:thread-1:turn:turn-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Latest", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:02.000Z", }, { id: "plan:thread-1:turn:turn-2", turnId: TurnId.make("turn-2"), planMarkdown: "# Different turn", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:03.000Z", updatedAt: "2026-02-23T00:00:03.000Z", }, ], TurnId.make("turn-1"), ), ).toEqual({ id: "plan:thread-1:turn:turn-1", turnId: "turn-1", planMarkdown: "# Latest", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:02.000Z", }); }); it("falls back to the most recently updated proposed plan", () => { const latestPlan = findLatestProposedPlan( [ { id: "plan:thread-1:turn:turn-1", turnId: TurnId.make("turn-1"), planMarkdown: "# First", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:01.000Z", }, { id: "plan:thread-1:turn:turn-2", turnId: TurnId.make("turn-2"), planMarkdown: "# Latest", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:02.000Z", updatedAt: "2026-02-23T00:00:03.000Z", }, ], null, ); expect(latestPlan?.planMarkdown).toBe("# Latest"); });}); describe("hasActionableProposedPlan", () => { it("returns true for an unimplemented proposed plan", () => { expect( hasActionableProposedPlan({ id: "plan-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Plan", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:00.000Z", updatedAt: "2026-02-23T00:00:01.000Z", }), ).toBe(true); }); it("returns false for a proposed plan already implemented elsewhere", () => { expect( hasActionableProposedPlan({ id: "plan-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Plan", implementedAt: "2026-02-23T00:00:02.000Z", implementationThreadId: ThreadId.make("thread-implement"), createdAt: "2026-02-23T00:00:00.000Z", updatedAt: "2026-02-23T00:00:02.000Z", }), ).toBe(false); });}); describe("workEntryIndicatesToolNeutralStatus", () => { it("keeps active tools neutral and agent spawns visible", () => { const entry = { id: "work-1", createdAt: "2026-01-01T00:00:00.000Z", label: "Read", tone: "tool" as const, toolLifecycleStatus: "inProgress" as const, }; expect(workEntryIndicatesToolNeutralStatus(entry)).toBe(true); expect( workEntryIndicatesToolNeutralStatus({ ...entry, agentSpawn: { workflowId: null, agentTaskIds: ["agent-1"] }, }), ).toBe(false); expect( workEntryIndicatesToolNeutralStatus({ ...entry, toolLifecycleStatus: "completed" }), ).toBe(false); }); it.each(["waiting", "cancelled", "interrupted"])( "keeps the status of a %s background task", (status) => { const entries = deriveWorkLogEntries([ makeActivity({ kind: "task.progress", payload: { taskId: "background-1", agentKind: "background", status }, }), ]); expect(entries).toHaveLength(1); expect(entries[0]).toMatchObject({ toolLifecycleStatus: status === "waiting" ? "inProgress" : "stopped", }); expect(workEntryIndicatesToolNeutralStatus(entries[0]!)).toBe(true); }, );}); describe("deriveWorkLogEntries", () => { it("keeps the latest task progress without emitting plan-update log entries", () => { const activities = [ makeActivity({ id: "before", kind: "tool.completed", summary: "Read files", sequence: 0 }), makeActivity({ id: "plan-1", kind: "turn.plan.updated", summary: "Plan updated", turnId: "turn-1", sequence: 1, payload: { plan: [{ step: "Verify the composer", status: "inProgress" }] }, }), makeActivity({ id: "plan-2", kind: "turn.plan.updated", summary: "Plan updated", turnId: "turn-1", sequence: 2, payload: { plan: [{ step: "Verify the composer", status: "completed" }] }, }), makeActivity({ id: "after", kind: "tool.completed", summary: "Ran tests", sequence: 3 }), ]; expect(deriveWorkLogEntries(activities).map((entry) => entry.id)).toEqual(["before", "after"]); expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toMatchObject([ { step: "Verify the composer", status: "completed" }, ]); }); it("omits tool started entries and keeps completed entries", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "tool-complete", createdAt: "2026-02-23T00:00:03.000Z", summary: "Tool call complete", kind: "tool.completed", }), makeActivity({ id: "tool-start", createdAt: "2026-02-23T00:00:02.000Z", summary: "Tool call", kind: "tool.started", }), ]; const entries = deriveWorkLogEntries(activities); expect(entries.map((entry) => entry.id)).toEqual(["tool-complete"]); }); it("omits routine setup updates before work starts and after later turn activity", () => {Lines 1–500 of 2377. Load more
import { classifyTaskAgentKind, EventId, MessageId, ThreadId, TurnId, type OrchestrationThreadActivity, } from "@t3tools/contracts"; import { describe, expect, it } from "vite-plus/test"; import { resolveWorkEntryToolPresentation } from "@t3tools/client-runtime/work-log/presentation"; import { createMessageAttachmentPreviewProjector, deriveActiveWorkStartedAt, deriveActivePlanState, deriveTimelineEntries, deriveTimelineEntriesWithState, deriveWorkLogEntries, findLatestProposedPlan, hasActionableProposedPlan, isLatestTurnSettled, selectHandoffImageResources, selectMessageImageResources, workEntryIndicatesToolNeutralStatus, } from "./session-logic"; let nextActivityId = 0; function makeActivity(overrides: { id?: string; createdAt?: string; kind?: string; summary?: string; tone?: OrchestrationThreadActivity["tone"]; payload?: Record<string, unknown>; turnId?: string; sequence?: number; }): OrchestrationThreadActivity { // Fixtures model post-ingestion rows: ingestion stamps agentKind on every // task.* payload. Pass an explicit agentKind to model legacy rows. const rawPayload = overrides.payload ?? {}; const payload = overrides.kind?.startsWith("task.") && !("agentKind" in rawPayload) ? { ...rawPayload, agentKind: classifyTaskAgentKind({ taskType: typeof rawPayload.taskType === "string" ? rawPayload.taskType : undefined, agentId: typeof rawPayload.agentId === "string" ? rawPayload.agentId : undefined, }), } : rawPayload; return { id: EventId.make(overrides.id ?? `activity-${nextActivityId++}`), createdAt: overrides.createdAt ?? "2026-02-23T00:00:00.000Z", kind: overrides.kind ?? "tool.started", summary: overrides.summary ?? "Tool call", tone: overrides.tone ?? "tool", payload, turnId: overrides.turnId ? TurnId.make(overrides.turnId) : null, ...(overrides.sequence !== undefined ? { sequence: overrides.sequence } : {}), }; } describe("deriveActivePlanState", () => { it("returns the latest plan update for the active turn", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-old", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { explanation: "Initial plan", plan: [{ step: "Inspect code", status: "pending" }], }, }), makeActivity({ id: "plan-latest", createdAt: "2026-02-23T00:00:02.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { explanation: "Refined plan", plan: [{ step: "Implement Codex user input", status: "inProgress" }], }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))).toEqual({ createdAt: "2026-02-23T00:00:02.000Z", turnId: "turn-1", explanation: "Refined plan", steps: [{ step: "Implement Codex user input", status: "inProgress" }], }); }); it("falls back to the most recent plan from a previous turn", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-from-turn-1", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Write tests", status: "completed" }], }, }), ]; // Current turn is turn-2, which has no plan activity — should fall back to turn-1's plan const result = deriveActivePlanState(activities, TurnId.make("turn-2")); expect(result).toEqual({ createdAt: "2026-02-23T00:00:01.000Z", turnId: "turn-1", steps: [{ step: "Write tests", status: "completed" }], }); }); it("starts timing again after a plan is cleared and recreated", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-old-start", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "inProgress" }] }, }), makeActivity({ id: "plan-old-complete", createdAt: "2026-02-23T00:00:05.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "completed" }] }, }), makeActivity({ id: "plan-clear", createdAt: "2026-02-23T00:00:06.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [] }, }), makeActivity({ id: "plan-new-start", createdAt: "2026-02-23T00:00:10.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "inProgress" }] }, }), makeActivity({ id: "plan-new-complete", createdAt: "2026-02-23T00:00:13.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Check", status: "completed" }] }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toEqual([ { durationMs: 3_000, step: "Check", status: "completed" }, ]); }); it("tracks repeated step labels independently", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-1a", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "Check", status: "inProgress" }, { step: "Check", status: "pending" }, ], }, }), makeActivity({ id: "plan-1b", createdAt: "2026-02-23T00:00:05.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "Check", status: "completed" }, { step: "Check", status: "inProgress" }, ], }, }), makeActivity({ id: "plan-1c", createdAt: "2026-02-23T00:00:11.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "Check", status: "completed" }, { step: "Check", status: "completed" }, ], }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toEqual([ { durationMs: 4_000, step: "Check", status: "completed" }, { durationMs: 6_000, step: "Check", status: "completed" }, ]); }); it("derives fallback durations in completion order", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-start", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "First", status: "pending" }, { step: "Second", status: "pending" }, ], }, }), makeActivity({ id: "plan-second-complete", createdAt: "2026-02-23T00:00:06.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "First", status: "pending" }, { step: "Second", status: "completed" }, ], }, }), makeActivity({ id: "plan-first-complete", createdAt: "2026-02-23T00:00:11.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [ { step: "First", status: "completed" }, { step: "Second", status: "completed" }, ], }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toEqual([ { durationMs: 5_000, step: "First", status: "completed" }, { durationMs: 5_000, step: "Second", status: "completed" }, ]); }); it("clears the active plan when a later snapshot has no steps", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "plan-set", createdAt: "2026-02-23T00:00:01.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [{ step: "Inspect code", status: "inProgress" }] }, }), makeActivity({ id: "plan-clear", createdAt: "2026-02-23T00:00:02.000Z", kind: "turn.plan.updated", summary: "Plan updated", tone: "info", turnId: "turn-1", payload: { plan: [] }, }), ]; expect(deriveActivePlanState(activities, TurnId.make("turn-1"))).toBeNull(); }); }); describe("findLatestProposedPlan", () => { it("prefers the latest proposed plan for the active turn", () => { expect( findLatestProposedPlan( [ { id: "plan:thread-1:turn:turn-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Older", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:01.000Z", }, { id: "plan:thread-1:turn:turn-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Latest", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:02.000Z", }, { id: "plan:thread-1:turn:turn-2", turnId: TurnId.make("turn-2"), planMarkdown: "# Different turn", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:03.000Z", updatedAt: "2026-02-23T00:00:03.000Z", }, ], TurnId.make("turn-1"), ), ).toEqual({ id: "plan:thread-1:turn:turn-1", turnId: "turn-1", planMarkdown: "# Latest", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:02.000Z", }); }); it("falls back to the most recently updated proposed plan", () => { const latestPlan = findLatestProposedPlan( [ { id: "plan:thread-1:turn:turn-1", turnId: TurnId.make("turn-1"), planMarkdown: "# First", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:01.000Z", updatedAt: "2026-02-23T00:00:01.000Z", }, { id: "plan:thread-1:turn:turn-2", turnId: TurnId.make("turn-2"), planMarkdown: "# Latest", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:02.000Z", updatedAt: "2026-02-23T00:00:03.000Z", }, ], null, ); expect(latestPlan?.planMarkdown).toBe("# Latest"); }); }); describe("hasActionableProposedPlan", () => { it("returns true for an unimplemented proposed plan", () => { expect( hasActionableProposedPlan({ id: "plan-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Plan", implementedAt: null, implementationThreadId: null, createdAt: "2026-02-23T00:00:00.000Z", updatedAt: "2026-02-23T00:00:01.000Z", }), ).toBe(true); }); it("returns false for a proposed plan already implemented elsewhere", () => { expect( hasActionableProposedPlan({ id: "plan-1", turnId: TurnId.make("turn-1"), planMarkdown: "# Plan", implementedAt: "2026-02-23T00:00:02.000Z", implementationThreadId: ThreadId.make("thread-implement"), createdAt: "2026-02-23T00:00:00.000Z", updatedAt: "2026-02-23T00:00:02.000Z", }), ).toBe(false); }); }); describe("workEntryIndicatesToolNeutralStatus", () => { it("keeps active tools neutral and agent spawns visible", () => { const entry = { id: "work-1", createdAt: "2026-01-01T00:00:00.000Z", label: "Read", tone: "tool" as const, toolLifecycleStatus: "inProgress" as const, }; expect(workEntryIndicatesToolNeutralStatus(entry)).toBe(true); expect( workEntryIndicatesToolNeutralStatus({ ...entry, agentSpawn: { workflowId: null, agentTaskIds: ["agent-1"] }, }), ).toBe(false); expect( workEntryIndicatesToolNeutralStatus({ ...entry, toolLifecycleStatus: "completed" }), ).toBe(false); }); it.each(["waiting", "cancelled", "interrupted"])( "keeps the status of a %s background task", (status) => { const entries = deriveWorkLogEntries([ makeActivity({ kind: "task.progress", payload: { taskId: "background-1", agentKind: "background", status }, }), ]); expect(entries).toHaveLength(1); expect(entries[0]).toMatchObject({ toolLifecycleStatus: status === "waiting" ? "inProgress" : "stopped", }); expect(workEntryIndicatesToolNeutralStatus(entries[0]!)).toBe(true); }, ); }); describe("deriveWorkLogEntries", () => { it("keeps the latest task progress without emitting plan-update log entries", () => { const activities = [ makeActivity({ id: "before", kind: "tool.completed", summary: "Read files", sequence: 0 }), makeActivity({ id: "plan-1", kind: "turn.plan.updated", summary: "Plan updated", turnId: "turn-1", sequence: 1, payload: { plan: [{ step: "Verify the composer", status: "inProgress" }] }, }), makeActivity({ id: "plan-2", kind: "turn.plan.updated", summary: "Plan updated", turnId: "turn-1", sequence: 2, payload: { plan: [{ step: "Verify the composer", status: "completed" }] }, }), makeActivity({ id: "after", kind: "tool.completed", summary: "Ran tests", sequence: 3 }), ]; expect(deriveWorkLogEntries(activities).map((entry) => entry.id)).toEqual(["before", "after"]); expect(deriveActivePlanState(activities, TurnId.make("turn-1"))?.steps).toMatchObject([ { step: "Verify the composer", status: "completed" }, ]); }); it("omits tool started entries and keeps completed entries", () => { const activities: OrchestrationThreadActivity[] = [ makeActivity({ id: "tool-complete", createdAt: "2026-02-23T00:00:03.000Z", summary: "Tool call complete", kind: "tool.completed", }), makeActivity({ id: "tool-start", createdAt: "2026-02-23T00:00:02.000Z", summary: "Tool call", kind: "tool.started", }), ]; const entries = deriveWorkLogEntries(activities); expect(entries.map((entry) => entry.id)).toEqual(["tool-complete"]); }); it("omits routine setup updates before work starts and after later turn activity", () => {