test: merge subagent context-engine coverage into registry suite

This commit is contained in:
Shakker 2026-04-02 00:28:34 +01:00 committed by Peter Steinberger
parent a78dba4396
commit 335b472c37
2 changed files with 40 additions and 122 deletions

View File

@ -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<string, SubagentRunRecord>) => new Map(runs)),
}));
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../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);
});
});

View File

@ -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);
});
});