172 lines · 4.5 KB · TypeScript
RawDownload
import { describe, expect, it } from "vite-plus/test"; import {  EventId,  ProjectId,  ProviderInstanceId,  ThreadId,  TurnId,  type OrchestrationThread,  type OrchestrationThreadActivity,} from "@t3tools/contracts"; import { buildThreadFeed } from "./threadActivity"; function makeActivity(  input: Partial<OrchestrationThreadActivity> &    Pick<OrchestrationThreadActivity, "id" | "kind" | "summary" | "createdAt">,): OrchestrationThreadActivity {  return {    tone: "info",    payload: {},    turnId: null,    ...input,  };} function makeThread(  input: Partial<OrchestrationThread> & Pick<OrchestrationThread, "id" | "projectId" | "title">,): OrchestrationThread {  return {    modelSelection: { instanceId: ProviderInstanceId.make("codex"), model: "gpt-5.4" },    runtimeMode: "full-access",    interactionMode: "default",    branch: null,    worktreePath: null,    latestTurn: null,    createdAt: "2026-04-01T00:00:00.000Z",    updatedAt: "2026-04-01T00:00:00.000Z",    archivedAt: null,    deletedAt: null,    messages: [],    proposedPlans: [],    activities: [],    checkpoints: [],    session: null,    ...input,  };} describe("buildThreadFeed", () => {  it("includes runtime warnings from the latest turn", () => {    const thread = makeThread({      id: ThreadId.make("thread-1"),      projectId: ProjectId.make("project-1"),      title: "Runtime warning thread",      latestTurn: {        turnId: TurnId.make("turn-latest"),        state: "running",        requestedAt: "2026-04-01T00:00:00.000Z",        startedAt: "2026-04-01T00:00:01.000Z",        completedAt: null,        assistantMessageId: null,      },      activities: [        makeActivity({          id: EventId.make("activity-old"),          kind: "runtime.warning",          summary: "Runtime warning",          createdAt: "2026-04-01T00:00:02.000Z",          turnId: TurnId.make("turn-old"),          payload: {            message: "Old warning",          },        }),        makeActivity({          id: EventId.make("activity-latest"),          kind: "runtime.warning",          summary: "Runtime warning",          createdAt: "2026-04-01T00:00:03.000Z",          turnId: TurnId.make("turn-latest"),          payload: {            message: "Latest warning",          },        }),      ],    });     const feed = buildThreadFeed(thread, [], null);    const group = feed[0];     expect(group).toMatchObject({      type: "activity-group",    });    if (!group || group.type !== "activity-group") {      return;    }     expect(group.activities).toEqual([      {        id: "activity-latest",        createdAt: "2026-04-01T00:00:03.000Z",        summary: "Runtime warning",        detail: null,        status: null,      },    ]);  });   it("collapses matching tool lifecycle rows like desktop", () => {    const thread = makeThread({      id: ThreadId.make("thread-2"),      projectId: ProjectId.make("project-1"),      title: "Collapsed tools",      latestTurn: {        turnId: TurnId.make("turn-1"),        state: "completed",        requestedAt: "2026-04-01T00:00:00.000Z",        startedAt: "2026-04-01T00:00:01.000Z",        completedAt: "2026-04-01T00:00:03.000Z",        assistantMessageId: null,      },      activities: [        makeActivity({          id: EventId.make("tool-updated"),          kind: "tool.updated",          tone: "tool",          summary: "Run tests",          createdAt: "2026-04-01T00:00:01.000Z",          turnId: TurnId.make("turn-1"),          payload: {            title: "Run tests",            itemType: "command_execution",            detail: "/bin/zsh -lc 'bun run test'",          },        }),        makeActivity({          id: EventId.make("tool-completed"),          kind: "tool.completed",          tone: "tool",          summary: "Run tests completed",          createdAt: "2026-04-01T00:00:02.000Z",          turnId: TurnId.make("turn-1"),          payload: {            title: "Run tests",            itemType: "command_execution",            detail: "/bin/zsh -lc 'bun run test'",          },        }),      ],    });     const feed = buildThreadFeed(thread, [], null);    const group = feed[0];     expect(group).toMatchObject({      type: "activity-group",    });    if (!group || group.type !== "activity-group") {      return;    }     expect(group.activities).toEqual([      {        id: "tool-completed",        createdAt: "2026-04-01T00:00:02.000Z",        summary: "Run tests",        detail: "bun run test",        status: null,      },    ]);  });});