2377 lines · 73.3 KB · TypeScript
RawDownload
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.