102 lines · 3.5 KB · TypeScript
RawDownload
import { assert, it } from "@effect/vitest";import {  type ModelSelection,  NodeId,  type OrchestrationV2AppThread,  ProjectId,  ProviderInstanceId,  ProviderThreadId,  ThreadId,} from "@t3tools/contracts";import * as DateTime from "effect/DateTime"; import { makeSubagentChildThread } from "./SubagentProjection.ts"; const parentThreadId = ThreadId.make("thread:subagent-snoozed-parent");const childThreadId = ThreadId.make("thread:subagent-awake-child");const parentProviderInstanceId = ProviderInstanceId.make("codex");const childProviderInstanceId = ProviderInstanceId.make("claude");const parentModelSelection = {  instanceId: parentProviderInstanceId,  model: "gpt-5.4",} satisfies ModelSelection;const childModelSelection = {  instanceId: childProviderInstanceId,  model: "claude-opus-4-1",} satisfies ModelSelection;const parentCreatedAt = DateTime.makeUnsafe("2026-07-24T09:00:00.000Z");const snoozedAt = DateTime.makeUnsafe("2026-07-24T09:05:00.000Z");const snoozedUntil = DateTime.makeUnsafe("2026-07-25T09:00:00.000Z");const childCreatedAt = DateTime.makeUnsafe("2026-07-24T09:10:00.000Z"); function makeParentThread(): OrchestrationV2AppThread {  return {    createdBy: "user",    creationSource: "web",    id: parentThreadId,    projectId: ProjectId.make("project:subagent-snooze"),    title: "Snoozed parent",    providerInstanceId: parentProviderInstanceId,    modelSelection: parentModelSelection,    runtimeMode: "full-access",    interactionMode: "plan",    branch: "feature/source",    worktreePath: "/tmp/source-worktree",    activeProviderThreadId: ProviderThreadId.make("provider-thread:subagent-snoozed-parent"),    lineage: {      parentThreadId: null,      relationshipToParent: null,      rootThreadId: parentThreadId,    },    forkedFrom: null,    createdAt: parentCreatedAt,    updatedAt: snoozedAt,    archivedAt: null,    settledOverride: null,    settledAt: null,    lastVisitedAt: null,    snoozedUntil,    snoozedAt,    deletedAt: null,    historyOrigin: "v1_import",  };} it("keeps a subagent child awake when its parent thread is snoozed", () => {  const parentThread = makeParentThread();  const childProviderThreadId = ProviderThreadId.make("provider-thread:subagent-awake-child");  const parentNodeId = NodeId.make("node:subagent-parent");  const childThread = makeSubagentChildThread({    parentThread,    childThreadId,    parentNodeId,    activeProviderThreadId: childProviderThreadId,    providerInstanceId: childProviderInstanceId,    modelSelection: childModelSelection,    title: "Awake child",    now: childCreatedAt,    createdBy: "agent",    creationSource: "provider",  });   assert.isNull(childThread.snoozedUntil);  assert.isNull(childThread.snoozedAt);  assert.equal(childThread.projectId, parentThread.projectId);  assert.equal(childThread.runtimeMode, parentThread.runtimeMode);  assert.equal(childThread.interactionMode, parentThread.interactionMode);  assert.equal(childThread.branch, parentThread.branch);  assert.equal(childThread.worktreePath, parentThread.worktreePath);  assert.equal(childThread.providerInstanceId, childProviderInstanceId);  assert.deepEqual(childThread.modelSelection, childModelSelection);  assert.equal(childThread.activeProviderThreadId, childProviderThreadId);  assert.isUndefined(childThread.historyOrigin);  assert.deepEqual(childThread.lineage, {    parentThreadId,    relationshipToParent: "subagent",    rootThreadId: parentThreadId,  });  assert.deepEqual(childThread.forkedFrom, {    type: "node",    nodeId: parentNodeId,  });});