




















@@ -1,5 +1,5 @@
11import path from "node:path";
2-import { beforeEach, describe, expect, it, vi } from "vitest";
2+import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
33import {
44loadSubagentSpawnModuleForTest,
55setupAcceptedSubagentGatewayMock,
@@ -8,22 +8,45 @@ import {
88type SessionStore = Record<string, Record<string, unknown>>;
99type GatewayRequest = { method?: string; params?: Record<string, unknown> };
101011-function createPersistentStoreMock(store: SessionStore) {
12-return vi.fn(async (_storePath: unknown, mutator: unknown) => {
13-if (typeof mutator !== "function") {
14-throw new Error("missing session store mutator");
15-}
16-return await mutator(store);
11+describe("sessions_spawn context modes", () => {
12+const storePath = "/tmp/subagent-context-session-store.json";
13+const callGatewayMock = vi.fn();
14+const updateSessionStoreMock = vi.fn();
15+const forkSessionFromParentMock = vi.fn();
16+const resolveContextEngineMock = vi.fn();
17+let spawnSubagentDirect: Awaited<
18+ReturnType<typeof loadSubagentSpawnModuleForTest>
19+>["spawnSubagentDirect"];
20+21+beforeAll(async () => {
22+({ spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
23+ callGatewayMock,
24+ updateSessionStoreMock,
25+ forkSessionFromParentMock,
26+ resolveContextEngineMock,
27+sessionStorePath: storePath,
28+}));
1729});
18-}
193020-describe("sessions_spawn context modes", () => {
2131beforeEach(() => {
22-vi.resetModules();
32+callGatewayMock.mockReset();
33+updateSessionStoreMock.mockReset();
34+forkSessionFromParentMock.mockReset();
35+resolveContextEngineMock.mockReset();
36+setupAcceptedSubagentGatewayMock(callGatewayMock);
37+resolveContextEngineMock.mockResolvedValue({});
2338});
243940+function usePersistentStoreMock(store: SessionStore) {
41+updateSessionStoreMock.mockImplementation(async (_storePath: unknown, mutator: unknown) => {
42+if (typeof mutator !== "function") {
43+throw new Error("missing session store mutator");
44+}
45+return await mutator(store);
46+});
47+}
48+2549it("forks the requester transcript when context=fork", async () => {
26-const storePath = "/tmp/subagent-context-session-store.json";
2750const store: SessionStore = {
2851main: {
2952sessionId: "parent-session-id",
@@ -32,20 +55,13 @@ describe("sessions_spawn context modes", () => {
3255totalTokens: 1200,
3356},
3457};
35-const callGatewayMock = vi.fn();
36-setupAcceptedSubagentGatewayMock(callGatewayMock);
37-const forkSessionFromParentMock = vi.fn(async () => ({
58+usePersistentStoreMock(store);
59+forkSessionFromParentMock.mockImplementation(async () => ({
3860sessionId: "forked-session-id",
3961sessionFile: "/tmp/forked-session.jsonl",
4062}));
4163const prepareSubagentSpawn = vi.fn(async () => undefined);
42-const { spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
43- callGatewayMock,
44-updateSessionStoreMock: createPersistentStoreMock(store),
45- forkSessionFromParentMock,
46-resolveContextEngineMock: vi.fn(async () => ({ prepareSubagentSpawn })),
47-sessionStorePath: storePath,
48-});
64+resolveContextEngineMock.mockResolvedValue({ prepareSubagentSpawn });
49655066const result = await spawnSubagentDirect(
5167{ task: "inspect the current thread", context: "fork" },
@@ -79,16 +95,9 @@ describe("sessions_spawn context modes", () => {
7995const store: SessionStore = {
8096main: { sessionId: "parent-session-id", updatedAt: 1 },
8197};
82-const callGatewayMock = vi.fn();
83-setupAcceptedSubagentGatewayMock(callGatewayMock);
84-const forkSessionFromParentMock = vi.fn();
98+usePersistentStoreMock(store);
8599const prepareSubagentSpawn = vi.fn(async () => undefined);
86-const { spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
87- callGatewayMock,
88-updateSessionStoreMock: createPersistentStoreMock(store),
89- forkSessionFromParentMock,
90-resolveContextEngineMock: vi.fn(async () => ({ prepareSubagentSpawn })),
91-});
100+resolveContextEngineMock.mockResolvedValue({ prepareSubagentSpawn });
9210193102const result = await spawnSubagentDirect({ task: "clean worker" }, { agentSessionKey: "main" });
94103@@ -107,20 +116,17 @@ describe("sessions_spawn context modes", () => {
107116const store: SessionStore = {
108117main: { sessionId: "parent-session-id", updatedAt: 1 },
109118};
119+usePersistentStoreMock(store);
110120const rollback = vi.fn(async () => undefined);
111-const callGatewayMock = vi.fn(async (requestUnknown: unknown) => {
121+callGatewayMock.mockImplementation(async (requestUnknown: unknown) => {
112122const request = requestUnknown as GatewayRequest;
113123if (request.method === "agent") {
114124throw new Error("agent start failed");
115125}
116126return { ok: true };
117127});
118-const { spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
119- callGatewayMock,
120-updateSessionStoreMock: createPersistentStoreMock(store),
121-resolveContextEngineMock: vi.fn(async () => ({
122-prepareSubagentSpawn: vi.fn(async () => ({ rollback })),
123-})),
128+resolveContextEngineMock.mockResolvedValue({
129+prepareSubagentSpawn: vi.fn(async () => ({ rollback })),
124130});
125131126132const result = await spawnSubagentDirect({ task: "clean worker" }, { agentSessionKey: "main" });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。