diff --git a/src/agents/subagent-registry.context-engine.test.ts b/src/agents/subagent-registry.context-engine.test.ts deleted file mode 100644 index 5cdfe3ddc83..00000000000 --- a/src/agents/subagent-registry.context-engine.test.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { SubagentRunRecord } from "./subagent-registry.types.js"; - -const noop = () => {}; - -const mocks = vi.hoisted(() => ({ - loadConfig: vi.fn(() => ({})), - ensureRuntimePluginsLoaded: vi.fn(), - ensureContextEnginesInitialized: vi.fn(), - resolveContextEngine: vi.fn(), - onSubagentEnded: vi.fn(async () => {}), - onAgentEvent: vi.fn(() => noop), - persistSubagentRunsToDisk: vi.fn(), - restoreSubagentRunsFromDisk: vi.fn(() => 0), - getSubagentRunsSnapshotForRead: vi.fn((runs: Map) => new Map(runs)), -})); - -vi.mock("../config/config.js", async () => { - const actual = await vi.importActual("../config/config.js"); - return { - ...actual, - loadConfig: mocks.loadConfig, - }; -}); - -vi.mock("../context-engine/init.js", () => ({ - ensureContextEnginesInitialized: mocks.ensureContextEnginesInitialized, -})); - -vi.mock("../context-engine/registry.js", () => ({ - resolveContextEngine: mocks.resolveContextEngine, -})); - -vi.mock("../infra/agent-events.js", () => ({ - onAgentEvent: mocks.onAgentEvent, -})); - -vi.mock("./runtime-plugins.js", () => ({ - ensureRuntimePluginsLoaded: mocks.ensureRuntimePluginsLoaded, -})); - -vi.mock("./subagent-registry-state.js", () => ({ - getSubagentRunsSnapshotForRead: mocks.getSubagentRunsSnapshotForRead, - persistSubagentRunsToDisk: mocks.persistSubagentRunsToDisk, - restoreSubagentRunsFromDisk: mocks.restoreSubagentRunsFromDisk, -})); - -vi.mock("./subagent-announce-queue.js", () => ({ - resetAnnounceQueuesForTests: vi.fn(), -})); - -vi.mock("./timeout.js", () => ({ - resolveAgentTimeoutMs: vi.fn(() => 1_000), -})); - -describe("subagent-registry context-engine bootstrap", () => { - let mod: typeof import("./subagent-registry.js"); - - beforeAll(async () => { - mod = await import("./subagent-registry.js"); - }); - - beforeEach(() => { - vi.clearAllMocks(); - mocks.resolveContextEngine.mockResolvedValue({ - onSubagentEnded: mocks.onSubagentEnded, - }); - mod.__testing.setDepsForTest({ - loadConfig: mocks.loadConfig, - ensureRuntimePluginsLoaded: mocks.ensureRuntimePluginsLoaded, - ensureContextEnginesInitialized: mocks.ensureContextEnginesInitialized, - resolveContextEngine: mocks.resolveContextEngine, - onAgentEvent: mocks.onAgentEvent, - persistSubagentRunsToDisk: mocks.persistSubagentRunsToDisk, - restoreSubagentRunsFromDisk: mocks.restoreSubagentRunsFromDisk, - getSubagentRunsSnapshotForRead: mocks.getSubagentRunsSnapshotForRead, - }); - mod.resetSubagentRegistryForTests({ persist: false }); - }); - - afterEach(() => { - mod.__testing.setDepsForTest(); - mod.resetSubagentRegistryForTests({ persist: false }); - }); - - it("reloads runtime plugins with the spawned workspace before released subagent end hooks", async () => { - mod.addSubagentRunForTests({ - runId: "run-1", - childSessionKey: "agent:main:session:child", - controllerSessionKey: "agent:main:session:parent", - requesterSessionKey: "agent:main:session:parent", - requesterOrigin: undefined, - requesterDisplayKey: "parent", - task: "task", - cleanup: "keep", - expectsCompletionMessage: undefined, - spawnMode: "run", - workspaceDir: "/tmp/workspace", - createdAt: 1, - startedAt: 1, - sessionStartedAt: 1, - accumulatedRuntimeMs: 0, - cleanupHandled: false, - }); - - mod.releaseSubagentRun("run-1"); - - await vi.waitFor(() => { - expect(mocks.onSubagentEnded).toHaveBeenCalledWith({ - childSessionKey: "agent:main:session:child", - reason: "released", - workspaceDir: "/tmp/workspace", - }); - }); - expect(mocks.ensureRuntimePluginsLoaded).toHaveBeenCalledWith({ - config: {}, - workspaceDir: "/tmp/workspace", - allowGatewaySubagentBinding: true, - }); - expect(mocks.ensureContextEnginesInitialized).toHaveBeenCalledTimes(1); - }); -}); diff --git a/src/agents/subagent-registry.test.ts b/src/agents/subagent-registry.test.ts index 3cb6ac856b9..0becee9fd4c 100644 --- a/src/agents/subagent-registry.test.ts +++ b/src/agents/subagent-registry.test.ts @@ -508,4 +508,44 @@ describe("subagent registry seam flow", () => { }); }); }); + + it("loads plugin and context-engine runtime before released end hooks", async () => { + mod.addSubagentRunForTests({ + runId: "run-release-context-engine", + childSessionKey: "agent:main:session:child", + controllerSessionKey: "agent:main:session:parent", + requesterSessionKey: "agent:main:session:parent", + requesterOrigin: undefined, + requesterDisplayKey: "parent", + task: "task", + cleanup: "keep", + expectsCompletionMessage: undefined, + spawnMode: "run", + workspaceDir: "/tmp/workspace", + createdAt: 1, + startedAt: 1, + sessionStartedAt: 1, + accumulatedRuntimeMs: 0, + cleanupHandled: false, + }); + + mod.releaseSubagentRun("run-release-context-engine"); + + await vi.waitFor(() => { + expect(mocks.onSubagentEnded).toHaveBeenCalledWith({ + childSessionKey: "agent:main:session:child", + reason: "released", + workspaceDir: "/tmp/workspace", + }); + }); + expect(mocks.ensureRuntimePluginsLoaded).toHaveBeenCalledWith({ + config: { + agents: { defaults: { subagents: { archiveAfterMinutes: 0 } } }, + session: { mainKey: "main", scope: "per-sender" }, + }, + workspaceDir: "/tmp/workspace", + allowGatewaySubagentBinding: true, + }); + expect(mocks.ensureContextEnginesInitialized).toHaveBeenCalledTimes(1); + }); });