macro-agent 0.1.0 → 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 +15 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +131 -35
- 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 +17 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +384 -23
- 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 +3 -0
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +258 -35
- 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 +2 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +69 -20
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +18 -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__/integration.test.ts +56 -31
- package/src/acp/__tests__/macro-agent.test.ts +16 -7
- package/src/acp/macro-agent.ts +170 -36
- 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 +22 -4
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
- 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 +678 -66
- 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 +312 -47
- 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 +196 -1
- package/src/store/__tests__/instance.test.ts +3 -3
- package/src/store/event-store.ts +80 -21
- package/src/store/types/agents.ts +15 -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
package/src/acp/types.ts
CHANGED
|
@@ -291,6 +291,12 @@ export interface ForkAgentRequest {
|
|
|
291
291
|
|
|
292
292
|
/** Optional name for the forked agent */
|
|
293
293
|
name?: string;
|
|
294
|
+
|
|
295
|
+
/** Optional initial prompt to send after fork */
|
|
296
|
+
prompt?: string;
|
|
297
|
+
|
|
298
|
+
/** Optional working directory override */
|
|
299
|
+
cwd?: string;
|
|
294
300
|
}
|
|
295
301
|
|
|
296
302
|
/**
|
|
@@ -305,6 +311,9 @@ export interface ForkAgentResponse {
|
|
|
305
311
|
|
|
306
312
|
/** Original agent ID (for reference) */
|
|
307
313
|
originalAgentId: AgentId;
|
|
314
|
+
|
|
315
|
+
/** Provider session ID (Claude Code UUID) for stream connection */
|
|
316
|
+
providerSessionId?: string;
|
|
308
317
|
}
|
|
309
318
|
|
|
310
319
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -605,6 +614,38 @@ export interface CancelPermissionResponse {
|
|
|
605
614
|
error?: string;
|
|
606
615
|
}
|
|
607
616
|
|
|
617
|
+
// ─────────────────────────────────────────────────────────────────
|
|
618
|
+
// ACP Extension: _macro/setPermissionMode
|
|
619
|
+
// ─────────────────────────────────────────────────────────────────
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Request for _macro/setPermissionMode extension
|
|
623
|
+
*
|
|
624
|
+
* Changes the permission mode for a running agent at runtime.
|
|
625
|
+
* Takes effect on the next permission request; in-flight requests use the old mode.
|
|
626
|
+
*/
|
|
627
|
+
export interface SetPermissionModeRequest {
|
|
628
|
+
/** Agent ID to change (looked up directly, bypassing session mapper) */
|
|
629
|
+
agentId: string;
|
|
630
|
+
|
|
631
|
+
/** New permission mode */
|
|
632
|
+
permissionMode: ACPPermissionMode;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Response for _macro/setPermissionMode extension
|
|
637
|
+
*/
|
|
638
|
+
export interface SetPermissionModeResponse {
|
|
639
|
+
/** Whether the mode was changed successfully */
|
|
640
|
+
success: boolean;
|
|
641
|
+
|
|
642
|
+
/** The previous permission mode (if success) */
|
|
643
|
+
previousMode?: ACPPermissionMode;
|
|
644
|
+
|
|
645
|
+
/** Error message if success is false */
|
|
646
|
+
error?: string;
|
|
647
|
+
}
|
|
648
|
+
|
|
608
649
|
// ─────────────────────────────────────────────────────────────────
|
|
609
650
|
// ACP Extension: _macro/resume
|
|
610
651
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -691,8 +732,10 @@ export type ACPExtensionMethod =
|
|
|
691
732
|
| "_macro/checkCapability"
|
|
692
733
|
| "_macro/respondToPermission"
|
|
693
734
|
| "_macro/cancelPermission"
|
|
735
|
+
| "_macro/setPermissionMode"
|
|
694
736
|
| "_macro/resume"
|
|
695
|
-
| "_macro/getHistory"
|
|
737
|
+
| "_macro/getHistory"
|
|
738
|
+
| "_macro/getModels";
|
|
696
739
|
|
|
697
740
|
/**
|
|
698
741
|
* Map of extension methods to their request types
|
|
@@ -713,6 +756,7 @@ export interface ACPExtensionRequests {
|
|
|
713
756
|
"_macro/checkCapability": CheckCapabilityRequest;
|
|
714
757
|
"_macro/respondToPermission": RespondToPermissionRequest;
|
|
715
758
|
"_macro/cancelPermission": CancelPermissionRequest;
|
|
759
|
+
"_macro/setPermissionMode": SetPermissionModeRequest;
|
|
716
760
|
"_macro/resume": ResumeAgentRequest;
|
|
717
761
|
"_macro/getHistory": GetHistoryRequest;
|
|
718
762
|
}
|
|
@@ -736,6 +780,7 @@ export interface ACPExtensionResponses {
|
|
|
736
780
|
"_macro/checkCapability": CheckCapabilityResponse;
|
|
737
781
|
"_macro/respondToPermission": RespondToPermissionResponse;
|
|
738
782
|
"_macro/cancelPermission": CancelPermissionResponse;
|
|
783
|
+
"_macro/setPermissionMode": SetPermissionModeResponse;
|
|
739
784
|
"_macro/resume": ResumeAgentResponse;
|
|
740
785
|
"_macro/getHistory": GetHistoryResponse;
|
|
741
786
|
}
|
|
@@ -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", () => {
|