macro-agent 0.0.17 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +3 -1
- package/.sudocode/specs.jsonl +4 -0
- package/CLAUDE.md +16 -14
- package/README.md +11 -29
- package/dist/acp/macro-agent.d.ts +17 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +183 -55
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +32 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager.d.ts +65 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +464 -183
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +37 -6
- package/dist/api/server.js.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token.d.ts +41 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +73 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/cli/acp.d.ts +2 -23
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +127 -61
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +147 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +268 -181
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/parse-args.d.ts +20 -0
- package/dist/cli/parse-args.d.ts.map +1 -0
- package/dist/cli/parse-args.js +43 -0
- package/dist/cli/parse-args.js.map +1 -0
- package/dist/cli/stable-instance-id.d.ts +8 -0
- package/dist/cli/stable-instance-id.d.ts.map +1 -0
- package/dist/cli/stable-instance-id.js +14 -0
- package/dist/cli/stable-instance-id.js.map +1 -0
- package/dist/config/project-config.d.ts +74 -7
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +123 -20
- package/dist/config/project-config.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts +23 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +482 -55
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/connection-manager.d.ts.map +1 -1
- package/dist/map/adapter/connection-manager.js +3 -0
- package/dist/map/adapter/connection-manager.js.map +1 -1
- package/dist/map/adapter/event-log.d.ts +87 -0
- package/dist/map/adapter/event-log.d.ts.map +1 -0
- package/dist/map/adapter/event-log.js +122 -0
- package/dist/map/adapter/event-log.js.map +1 -0
- package/dist/map/adapter/event-translator.js +6 -6
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +10 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +34 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
- package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
- package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
- package/dist/map/adapter/extensions/rename.d.ts +29 -0
- package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
- package/dist/map/adapter/extensions/rename.js +49 -0
- package/dist/map/adapter/extensions/rename.js.map +1 -0
- package/dist/map/adapter/extensions/task.d.ts.map +1 -1
- package/dist/map/adapter/extensions/task.js +10 -0
- package/dist/map/adapter/extensions/task.js.map +1 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
- package/dist/map/adapter/extensions/update-metadata.js +67 -0
- package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
- package/dist/map/adapter/index.d.ts +2 -1
- package/dist/map/adapter/index.d.ts.map +1 -1
- package/dist/map/adapter/index.js +8 -2
- package/dist/map/adapter/index.js.map +1 -1
- package/dist/map/adapter/interface.d.ts +2 -0
- package/dist/map/adapter/interface.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.d.ts +4 -0
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +302 -30
- package/dist/map/adapter/map-adapter.js.map +1 -1
- package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
- package/dist/map/adapter/subscription-manager.js +5 -1
- package/dist/map/adapter/subscription-manager.js.map +1 -1
- package/dist/map/adapter/types.d.ts +2 -0
- package/dist/map/adapter/types.d.ts.map +1 -1
- package/dist/mcp/map-client.d.ts +39 -0
- package/dist/mcp/map-client.d.ts.map +1 -0
- package/dist/mcp/map-client.js +129 -0
- package/dist/mcp/map-client.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +14 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +113 -85
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/types.d.ts +9 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/metrics/metrics.js +1 -1
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/roles/capabilities.d.ts +3 -1
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +17 -7
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +6 -6
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +6 -6
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/registry.d.ts +2 -2
- package/dist/roles/registry.js +2 -2
- package/dist/server/combined-server.d.ts +20 -0
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +107 -8
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts +7 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +91 -8
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +23 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +1 -1
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/task/backend/index.d.ts +47 -29
- package/dist/task/backend/index.d.ts.map +1 -1
- package/dist/task/backend/index.js +109 -71
- package/dist/task/backend/index.js.map +1 -1
- package/dist/task/backend/memory.d.ts +1 -0
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +3 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/opentasks/backend.d.ts +140 -0
- package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
- package/dist/task/backend/opentasks/backend.js +1023 -0
- package/dist/task/backend/opentasks/backend.js.map +1 -0
- package/dist/task/backend/opentasks/client.d.ts +337 -0
- package/dist/task/backend/opentasks/client.d.ts.map +1 -0
- package/dist/task/backend/opentasks/client.js +225 -0
- package/dist/task/backend/opentasks/client.js.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.js +195 -0
- package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
- package/dist/task/backend/opentasks/index.d.ts +21 -0
- package/dist/task/backend/opentasks/index.d.ts.map +1 -0
- package/dist/task/backend/opentasks/index.js +21 -0
- package/dist/task/backend/opentasks/index.js.map +1 -0
- package/dist/task/backend/opentasks/mapping.d.ts +48 -0
- package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
- package/dist/task/backend/opentasks/mapping.js +77 -0
- package/dist/task/backend/opentasks/mapping.js.map +1 -0
- package/dist/task/backend/types.d.ts +33 -53
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js +7 -11
- package/dist/task/backend/types.js.map +1 -1
- package/dist/task/backend/unified-tool-provider.d.ts +57 -0
- package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
- package/dist/task/backend/unified-tool-provider.js +623 -0
- package/dist/task/backend/unified-tool-provider.js.map +1 -0
- package/dist/teams/team-loader.d.ts +2 -2
- package/dist/teams/team-loader.js +3 -3
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-runtime.d.ts.map +1 -1
- package/dist/teams/team-runtime.js +2 -0
- package/dist/teams/team-runtime.js.map +1 -1
- package/docs/architecture.md +7 -6
- package/docs/configuration.md +26 -62
- package/docs/implementation-details.md +5 -5
- package/docs/implementation-summary.md +17 -17
- package/docs/plan-self-driving-support.md +4 -4
- package/docs/spec-self-driving-support.md +10 -10
- package/docs/team-templates.md +2 -2
- package/docs/teams.md +3 -3
- package/docs/troubleshooting.md +10 -11
- package/package.json +6 -4
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
- package/src/acp/__tests__/history.test.ts +8 -4
- package/src/acp/__tests__/integration.test.ts +56 -31
- package/src/acp/__tests__/macro-agent.test.ts +16 -7
- package/src/acp/macro-agent.ts +230 -62
- package/src/acp/types.ts +46 -1
- package/src/agent/__tests__/agent-manager.test.ts +228 -2
- package/src/agent/agent-manager.ts +714 -261
- package/src/agent/types.ts +3 -1
- package/src/api/server.ts +41 -7
- package/src/auth/__tests__/token.test.ts +100 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/token.ts +82 -0
- package/src/cli/__tests__/acp.test.ts +1 -1
- package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
- package/src/cli/acp.ts +130 -72
- package/src/cli/index.ts +120 -14
- package/src/cli/mcp.ts +311 -207
- package/src/cli/parse-args.ts +54 -0
- package/src/cli/stable-instance-id.ts +14 -0
- package/src/config/project-config.ts +190 -27
- package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +820 -0
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +724 -2
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
- package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
- package/src/map/adapter/__tests__/event-log.test.ts +527 -0
- package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
- package/src/map/adapter/__tests__/extensions.test.ts +408 -0
- package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
- package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
- package/src/map/adapter/acp-over-map.ts +777 -92
- package/src/map/adapter/connection-manager.ts +3 -0
- package/src/map/adapter/event-log.ts +208 -0
- package/src/map/adapter/event-translator.ts +6 -6
- package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
- package/src/map/adapter/extensions/index.ts +60 -0
- package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
- package/src/map/adapter/extensions/task.ts +11 -0
- package/src/map/adapter/extensions/update-metadata.ts +126 -0
- package/src/map/adapter/index.ts +28 -0
- package/src/map/adapter/interface.ts +2 -0
- package/src/map/adapter/map-adapter.ts +373 -38
- package/src/map/adapter/subscription-manager.ts +5 -1
- package/src/map/adapter/types.ts +2 -0
- package/src/mcp/__tests__/map-client.test.ts +386 -0
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
- package/src/mcp/__tests__/mcp-server.test.ts +100 -1
- package/src/mcp/map-client.ts +177 -0
- package/src/mcp/mcp-server.ts +191 -100
- package/src/mcp/types.ts +6 -1
- package/src/metrics/metrics.ts +1 -1
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
- package/src/roles/__tests__/config-loader.test.ts +7 -7
- package/src/roles/capabilities.ts +17 -7
- package/src/roles/config-loader.ts +6 -6
- package/src/roles/registry.ts +2 -2
- package/src/server/__tests__/combined-server.test.ts +94 -21
- package/src/server/combined-server.ts +189 -33
- package/src/steering/__tests__/steering-integration.test.ts +1 -1
- package/src/store/__tests__/event-store.test.ts +236 -1
- package/src/store/__tests__/instance.test.ts +3 -3
- package/src/store/event-store.ts +109 -8
- package/src/store/types/agents.ts +16 -0
- package/src/store/types/events.ts +1 -1
- package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
- package/src/task/backend/index.ts +156 -106
- package/src/task/backend/memory.ts +4 -0
- package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
- package/src/task/backend/opentasks/backend.ts +1323 -0
- package/src/task/backend/opentasks/client.ts +652 -0
- package/src/task/backend/opentasks/daemon-manager.ts +253 -0
- package/src/task/backend/opentasks/index.ts +69 -0
- package/src/task/backend/opentasks/mapping.ts +94 -0
- package/src/task/backend/types.ts +42 -66
- package/src/task/backend/unified-tool-provider.ts +779 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
- package/src/teams/team-loader.ts +3 -3
- package/src/teams/team-runtime.ts +2 -0
- package/test_fixtures/README.md +2 -3
- package/test_fixtures/fixtures/index.ts +0 -3
- package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
- package/test_fixtures/fixtures/repos/index.ts +1 -3
- package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
- package/test_fixtures/fixtures/repos/types.ts +0 -11
- package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
- package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
- package/vitest.config.ts +1 -1
- package/vitest.e2e.config.ts +1 -1
- package/vitest.setup.ts +1 -30
- package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
- package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
- package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
- package/.macro-agent/teams/self-driving/team.yaml +0 -103
- package/.macro-agent/teams/structured/prompts/developer.md +0 -26
- package/.macro-agent/teams/structured/prompts/lead.md +0 -25
- package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
- package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
- package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
- package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
- package/.macro-agent/teams/structured/team.yaml +0 -89
- package/docs/sudocode-integration.md +0 -383
- package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
- package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
- package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
- package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
- package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
- package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
- package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
- package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
- package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
- package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
- package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
- package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
- package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
- package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
- package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
- package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
- package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
- package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
- package/src/task/backend/sudocode/backend.ts +0 -1237
- package/src/task/backend/sudocode/client.ts +0 -515
- package/src/task/backend/sudocode/index.ts +0 -120
- package/src/task/backend/sudocode/mapping.ts +0 -93
- package/src/task/backend/sudocode/server-client.ts +0 -522
- package/src/task/backend/sudocode/standalone-client.ts +0 -623
- package/src/task/backend/sudocode/sync-policy.ts +0 -387
- package/src/task/backend/sudocode/tools.ts +0 -896
- package/src/task/backend/tool-provider.ts +0 -506
- package/test_fixtures/fixtures/sudocode/index.ts +0 -29
- package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
- package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
|
@@ -97,7 +97,7 @@ describe("AgentManager", () => {
|
|
|
97
97
|
|
|
98
98
|
// Terminate one
|
|
99
99
|
eventStore.emit({
|
|
100
|
-
type: "
|
|
100
|
+
type: "stop",
|
|
101
101
|
source: { agent_id: "agent_2" },
|
|
102
102
|
payload: { reason: "completed" },
|
|
103
103
|
});
|
|
@@ -562,6 +562,82 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
|
|
|
562
562
|
expect(cwdEnv.value).toBe("/test/cwd");
|
|
563
563
|
});
|
|
564
564
|
|
|
565
|
+
it("should propagate OPENTASKS_SOCKET_PATH from config to child agents", async () => {
|
|
566
|
+
// Create manager with explicit socket path
|
|
567
|
+
await agentManager.close();
|
|
568
|
+
agentManager = createAgentManager(eventStore, messageRouter, {
|
|
569
|
+
openTasksSocketPath: "/tmp/opentasks.sock",
|
|
570
|
+
taskBackend: "opentasks",
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
await agentManager.spawn({
|
|
574
|
+
task: "Test task",
|
|
575
|
+
cwd: "/tmp",
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
const createSessionArgs = mockHandle.createSession.mock.calls[0];
|
|
579
|
+
const sessionOptions = createSessionArgs[1];
|
|
580
|
+
const macroAgentMcp = sessionOptions.mcpServers.find(
|
|
581
|
+
(s: any) => s.name === "macro-agent"
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
const socketPathEnv = macroAgentMcp.env.find(
|
|
585
|
+
(e: any) => e.name === "OPENTASKS_SOCKET_PATH"
|
|
586
|
+
);
|
|
587
|
+
expect(socketPathEnv).toBeDefined();
|
|
588
|
+
expect(socketPathEnv.value).toBe("/tmp/opentasks.sock");
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
it("should use setOpenTasksSocketPath to override config value", async () => {
|
|
592
|
+
// Create manager WITHOUT a socket path (simulates autoStart mode)
|
|
593
|
+
await agentManager.close();
|
|
594
|
+
agentManager = createAgentManager(eventStore, messageRouter, {
|
|
595
|
+
taskBackend: "opentasks",
|
|
596
|
+
// No openTasksSocketPath — simulating daemon auto-start
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
// Late-bind the runtime socket path (as createTaskBackend would provide)
|
|
600
|
+
agentManager.setOpenTasksSocketPath("/run/daemon/opentasks.sock");
|
|
601
|
+
|
|
602
|
+
await agentManager.spawn({
|
|
603
|
+
task: "Test task",
|
|
604
|
+
cwd: "/tmp",
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
const createSessionArgs = mockHandle.createSession.mock.calls[0];
|
|
608
|
+
const sessionOptions = createSessionArgs[1];
|
|
609
|
+
const macroAgentMcp = sessionOptions.mcpServers.find(
|
|
610
|
+
(s: any) => s.name === "macro-agent"
|
|
611
|
+
);
|
|
612
|
+
|
|
613
|
+
const socketPathEnv = macroAgentMcp.env.find(
|
|
614
|
+
(e: any) => e.name === "OPENTASKS_SOCKET_PATH"
|
|
615
|
+
);
|
|
616
|
+
expect(socketPathEnv).toBeDefined();
|
|
617
|
+
expect(socketPathEnv.value).toBe("/run/daemon/opentasks.sock");
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
it("should propagate empty OPENTASKS_SOCKET_PATH when not set", async () => {
|
|
621
|
+
// Manager with no socket path and no env var
|
|
622
|
+
await agentManager.spawn({
|
|
623
|
+
task: "Test task",
|
|
624
|
+
cwd: "/tmp",
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
const createSessionArgs = mockHandle.createSession.mock.calls[0];
|
|
628
|
+
const sessionOptions = createSessionArgs[1];
|
|
629
|
+
const macroAgentMcp = sessionOptions.mcpServers.find(
|
|
630
|
+
(s: any) => s.name === "macro-agent"
|
|
631
|
+
);
|
|
632
|
+
|
|
633
|
+
const socketPathEnv = macroAgentMcp.env.find(
|
|
634
|
+
(e: any) => e.name === "OPENTASKS_SOCKET_PATH"
|
|
635
|
+
);
|
|
636
|
+
expect(socketPathEnv).toBeDefined();
|
|
637
|
+
// Should be empty string when nothing is configured
|
|
638
|
+
expect(socketPathEnv.value).toBe("");
|
|
639
|
+
});
|
|
640
|
+
|
|
565
641
|
it("should persist events after spawning for cross-process visibility", async () => {
|
|
566
642
|
// Spy on eventStore.persist
|
|
567
643
|
const persistSpy = vi.spyOn(eventStore, "persist");
|
|
@@ -700,6 +776,10 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
|
|
|
700
776
|
expect(mockHandle.loadSession).toHaveBeenCalledWith(
|
|
701
777
|
expect.any(String), // session ID
|
|
702
778
|
"/custom/project/path",
|
|
779
|
+
expect.arrayContaining([
|
|
780
|
+
expect.objectContaining({ name: "macro-agent" }),
|
|
781
|
+
]),
|
|
782
|
+
undefined,
|
|
703
783
|
);
|
|
704
784
|
});
|
|
705
785
|
|
|
@@ -717,6 +797,10 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
|
|
|
717
797
|
expect(mockHandle.loadSession).toHaveBeenCalledWith(
|
|
718
798
|
agent!.provider_session_id,
|
|
719
799
|
expect.any(String),
|
|
800
|
+
expect.arrayContaining([
|
|
801
|
+
expect.objectContaining({ name: "macro-agent" }),
|
|
802
|
+
]),
|
|
803
|
+
undefined,
|
|
720
804
|
);
|
|
721
805
|
});
|
|
722
806
|
|
|
@@ -745,7 +829,11 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
|
|
|
745
829
|
await agentManager.resume(agentId);
|
|
746
830
|
|
|
747
831
|
// Should create a new session instead of loading with invalid macro-agent session_id
|
|
748
|
-
expect(mockHandle.createSession).toHaveBeenCalledWith("/tmp"
|
|
832
|
+
expect(mockHandle.createSession).toHaveBeenCalledWith("/tmp", {
|
|
833
|
+
mcpServers: expect.arrayContaining([
|
|
834
|
+
expect.objectContaining({ name: "macro-agent" }),
|
|
835
|
+
]),
|
|
836
|
+
});
|
|
749
837
|
expect(mockHandle.loadSession).not.toHaveBeenCalled();
|
|
750
838
|
});
|
|
751
839
|
});
|
|
@@ -995,6 +1083,144 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
|
|
|
995
1083
|
expect(result).toBe(false);
|
|
996
1084
|
});
|
|
997
1085
|
});
|
|
1086
|
+
|
|
1087
|
+
describe("Process cleanup on spawn failure", () => {
|
|
1088
|
+
it("should close handle when createSession throws", async () => {
|
|
1089
|
+
mockHandle.createSession = vi.fn().mockRejectedValue(
|
|
1090
|
+
new Error("Session creation failed")
|
|
1091
|
+
);
|
|
1092
|
+
|
|
1093
|
+
await expect(
|
|
1094
|
+
agentManager.spawn({ task: "Test", cwd: "/tmp" })
|
|
1095
|
+
).rejects.toThrow("Failed to spawn agent");
|
|
1096
|
+
|
|
1097
|
+
// The handle should have been closed to prevent orphaned process
|
|
1098
|
+
expect(mockHandle.close).toHaveBeenCalled();
|
|
1099
|
+
});
|
|
1100
|
+
|
|
1101
|
+
it("should not leave handle in activeSessions when createSession throws", async () => {
|
|
1102
|
+
mockHandle.createSession = vi.fn().mockRejectedValue(
|
|
1103
|
+
new Error("Session creation failed")
|
|
1104
|
+
);
|
|
1105
|
+
|
|
1106
|
+
await expect(
|
|
1107
|
+
agentManager.spawn({ task: "Test", cwd: "/tmp" })
|
|
1108
|
+
).rejects.toThrow();
|
|
1109
|
+
|
|
1110
|
+
// No active sessions should remain
|
|
1111
|
+
const agents = agentManager.list({ state: "running" as any });
|
|
1112
|
+
for (const agent of agents) {
|
|
1113
|
+
expect(agentManager.hasActiveSession(agent.id)).toBe(false);
|
|
1114
|
+
}
|
|
1115
|
+
});
|
|
1116
|
+
|
|
1117
|
+
it("should close handle even if handle.close() itself throws", async () => {
|
|
1118
|
+
mockHandle.createSession = vi.fn().mockRejectedValue(
|
|
1119
|
+
new Error("Session creation failed")
|
|
1120
|
+
);
|
|
1121
|
+
mockHandle.close = vi.fn().mockRejectedValue(
|
|
1122
|
+
new Error("Close also failed")
|
|
1123
|
+
);
|
|
1124
|
+
|
|
1125
|
+
// Should still throw the original spawn error, not the close error
|
|
1126
|
+
await expect(
|
|
1127
|
+
agentManager.spawn({ task: "Test", cwd: "/tmp" })
|
|
1128
|
+
).rejects.toThrow("Failed to spawn agent");
|
|
1129
|
+
|
|
1130
|
+
// close() was attempted
|
|
1131
|
+
expect(mockHandle.close).toHaveBeenCalled();
|
|
1132
|
+
});
|
|
1133
|
+
});
|
|
1134
|
+
|
|
1135
|
+
describe("Process cleanup on resume failure", () => {
|
|
1136
|
+
it("should close handle when loadSession throws", async () => {
|
|
1137
|
+
// Spawn and terminate to create a resumable agent
|
|
1138
|
+
const spawned = await agentManager.spawn({ task: "Test" });
|
|
1139
|
+
await agentManager.terminate(spawned.id, "completed");
|
|
1140
|
+
|
|
1141
|
+
// Make loadSession fail on resume
|
|
1142
|
+
mockHandle.loadSession = vi.fn().mockRejectedValue(
|
|
1143
|
+
new Error("Load session failed")
|
|
1144
|
+
);
|
|
1145
|
+
|
|
1146
|
+
await expect(
|
|
1147
|
+
agentManager.resume(spawned.id)
|
|
1148
|
+
).rejects.toThrow("Load session failed");
|
|
1149
|
+
|
|
1150
|
+
// The handle should have been closed to prevent orphaned process
|
|
1151
|
+
expect(mockHandle.close).toHaveBeenCalledTimes(2); // once for terminate, once for failed resume
|
|
1152
|
+
});
|
|
1153
|
+
|
|
1154
|
+
it("should close handle when createSession throws during resume (no provider_session_id)", async () => {
|
|
1155
|
+
// Create agent directly without provider_session_id
|
|
1156
|
+
const agentId = "agent_no_provider_resume";
|
|
1157
|
+
eventStore.emit({
|
|
1158
|
+
type: "spawn",
|
|
1159
|
+
source: { agent_id: "system" },
|
|
1160
|
+
payload: {
|
|
1161
|
+
agent_id: agentId,
|
|
1162
|
+
session_id: "session_no_provider_resume",
|
|
1163
|
+
task: "Test",
|
|
1164
|
+
parent: null,
|
|
1165
|
+
cwd: "/tmp",
|
|
1166
|
+
},
|
|
1167
|
+
});
|
|
1168
|
+
eventStore.emit({
|
|
1169
|
+
type: "status",
|
|
1170
|
+
source: { agent_id: agentId },
|
|
1171
|
+
payload: { status_type: "started" },
|
|
1172
|
+
});
|
|
1173
|
+
|
|
1174
|
+
// Make createSession fail on resume
|
|
1175
|
+
mockHandle.createSession = vi.fn().mockRejectedValue(
|
|
1176
|
+
new Error("Create session failed")
|
|
1177
|
+
);
|
|
1178
|
+
|
|
1179
|
+
await expect(
|
|
1180
|
+
agentManager.resume(agentId)
|
|
1181
|
+
).rejects.toThrow("Create session failed");
|
|
1182
|
+
|
|
1183
|
+
// The handle should have been closed
|
|
1184
|
+
expect(mockHandle.close).toHaveBeenCalled();
|
|
1185
|
+
});
|
|
1186
|
+
});
|
|
1187
|
+
|
|
1188
|
+
describe("Shutdown guard", () => {
|
|
1189
|
+
it("should reject spawn() after close() is called", async () => {
|
|
1190
|
+
await agentManager.close();
|
|
1191
|
+
|
|
1192
|
+
await expect(
|
|
1193
|
+
agentManager.spawn({ task: "Test", cwd: "/tmp" })
|
|
1194
|
+
).rejects.toThrow("Cannot spawn agent during shutdown");
|
|
1195
|
+
});
|
|
1196
|
+
|
|
1197
|
+
it("should reject resume() after close() is called", async () => {
|
|
1198
|
+
// Create a resumable agent before shutdown
|
|
1199
|
+
const spawned = await agentManager.spawn({ task: "Test" });
|
|
1200
|
+
await agentManager.terminate(spawned.id, "completed");
|
|
1201
|
+
|
|
1202
|
+
await agentManager.close();
|
|
1203
|
+
|
|
1204
|
+
await expect(
|
|
1205
|
+
agentManager.resume(spawned.id)
|
|
1206
|
+
).rejects.toThrow("Cannot resume agent during shutdown");
|
|
1207
|
+
});
|
|
1208
|
+
|
|
1209
|
+
it("should not spawn new processes after close()", async () => {
|
|
1210
|
+
const { AgentFactory } = await import("acp-factory");
|
|
1211
|
+
const spawnSpy = vi.mocked(AgentFactory.spawn);
|
|
1212
|
+
|
|
1213
|
+
await agentManager.close();
|
|
1214
|
+
spawnSpy.mockClear();
|
|
1215
|
+
|
|
1216
|
+
await expect(
|
|
1217
|
+
agentManager.spawn({ task: "Test", cwd: "/tmp" })
|
|
1218
|
+
).rejects.toThrow("Cannot spawn agent during shutdown");
|
|
1219
|
+
|
|
1220
|
+
// AgentFactory.spawn should never have been called
|
|
1221
|
+
expect(spawnSpy).not.toHaveBeenCalled();
|
|
1222
|
+
});
|
|
1223
|
+
});
|
|
998
1224
|
});
|
|
999
1225
|
|
|
1000
1226
|
describe("AgentManager HealthCheckService Integration", () => {
|