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
|
@@ -161,6 +161,28 @@ function createMockAgentManager(): AgentManager {
|
|
|
161
161
|
getSession: vi.fn().mockReturnValue(null),
|
|
162
162
|
onLifecycleEvent: vi.fn().mockReturnValue(() => {}),
|
|
163
163
|
close: vi.fn().mockResolvedValue(undefined),
|
|
164
|
+
forkAgent: vi.fn().mockImplementation((sourceId) => {
|
|
165
|
+
const agentId = `agent-${++agentCounter}`;
|
|
166
|
+
const sessionId = `session-${++sessionCounter}`;
|
|
167
|
+
const agent: Agent = {
|
|
168
|
+
id: agentId,
|
|
169
|
+
session_id: sessionId,
|
|
170
|
+
state: "running",
|
|
171
|
+
task: `[Fork of ${sourceId}]`,
|
|
172
|
+
task_id: `task-${++taskCounter}`,
|
|
173
|
+
parent: null,
|
|
174
|
+
lineage: [],
|
|
175
|
+
created_at: Date.now(),
|
|
176
|
+
started_at: Date.now(),
|
|
177
|
+
};
|
|
178
|
+
agentStore.set(agent.id, agent);
|
|
179
|
+
return Promise.resolve({
|
|
180
|
+
id: agent.id,
|
|
181
|
+
session_id: agent.session_id,
|
|
182
|
+
agent,
|
|
183
|
+
session: { id: `provider-${sessionId}` },
|
|
184
|
+
});
|
|
185
|
+
}),
|
|
164
186
|
} as unknown as AgentManager;
|
|
165
187
|
}
|
|
166
188
|
|
|
@@ -238,7 +260,7 @@ describe("ACP Mode Integration", () => {
|
|
|
238
260
|
expect(initResponse.agentCapabilities).toBeDefined();
|
|
239
261
|
expect(initResponse.agentCapabilities?.loadSession).toBe(true);
|
|
240
262
|
expect(initResponse.agentCapabilities?._meta?.extensions).toContain(
|
|
241
|
-
"_macro/spawnAgent"
|
|
263
|
+
"_macro/spawnAgent",
|
|
242
264
|
);
|
|
243
265
|
|
|
244
266
|
// Step 2: Create new session
|
|
@@ -286,8 +308,8 @@ describe("ACP Mode Integration", () => {
|
|
|
286
308
|
cwd: "/test/project",
|
|
287
309
|
});
|
|
288
310
|
|
|
289
|
-
// loadSession returns
|
|
290
|
-
expect(loadResponse).toEqual({});
|
|
311
|
+
// loadSession returns model state (null when no models available)
|
|
312
|
+
expect(loadResponse).toEqual({ models: null });
|
|
291
313
|
});
|
|
292
314
|
|
|
293
315
|
it("should load session by agentId via _meta", async () => {
|
|
@@ -314,7 +336,7 @@ describe("ACP Mode Integration", () => {
|
|
|
314
336
|
_meta: { agentId: originalAgentId },
|
|
315
337
|
} as any);
|
|
316
338
|
|
|
317
|
-
expect(loadResponse).toEqual({});
|
|
339
|
+
expect(loadResponse).toEqual({ models: null });
|
|
318
340
|
});
|
|
319
341
|
|
|
320
342
|
it("should throw when _meta.agentId references non-existent agent", async () => {
|
|
@@ -323,7 +345,7 @@ describe("ACP Mode Integration", () => {
|
|
|
323
345
|
sessionId: "_resume_",
|
|
324
346
|
cwd: "/test/project",
|
|
325
347
|
_meta: { agentId: "non-existent-agent" },
|
|
326
|
-
} as any)
|
|
348
|
+
} as any),
|
|
327
349
|
).rejects.toThrow("Agent not found: non-existent-agent");
|
|
328
350
|
});
|
|
329
351
|
|
|
@@ -345,7 +367,7 @@ describe("ACP Mode Integration", () => {
|
|
|
345
367
|
await expect(
|
|
346
368
|
macroAgent.cancel({
|
|
347
369
|
sessionId: sessionResponse.sessionId,
|
|
348
|
-
})
|
|
370
|
+
}),
|
|
349
371
|
).resolves.toBeUndefined();
|
|
350
372
|
});
|
|
351
373
|
|
|
@@ -373,10 +395,11 @@ describe("ACP Mode Integration", () => {
|
|
|
373
395
|
expect(extensions).toContain("_macro/cancelPermission");
|
|
374
396
|
expect(extensions).toContain("_macro/resume");
|
|
375
397
|
expect(extensions).toContain("_macro/getHistory");
|
|
376
|
-
expect(extensions
|
|
398
|
+
expect(extensions).toContain("_macro/forkAgent");
|
|
399
|
+
expect(extensions?.length).toBe(19);
|
|
377
400
|
|
|
378
401
|
expect(initResponse.agentCapabilities?._meta?.agentType).toBe(
|
|
379
|
-
"macro-agent"
|
|
402
|
+
"macro-agent",
|
|
380
403
|
);
|
|
381
404
|
});
|
|
382
405
|
});
|
|
@@ -474,7 +497,7 @@ describe("ACP Mode Integration", () => {
|
|
|
474
497
|
expect.objectContaining({
|
|
475
498
|
task: "Integration test task",
|
|
476
499
|
cwd: "/test/spawn",
|
|
477
|
-
})
|
|
500
|
+
}),
|
|
478
501
|
);
|
|
479
502
|
});
|
|
480
503
|
|
|
@@ -497,7 +520,7 @@ describe("ACP Mode Integration", () => {
|
|
|
497
520
|
expect.objectContaining({
|
|
498
521
|
task: "Child agent task",
|
|
499
522
|
parent: parentId,
|
|
500
|
-
})
|
|
523
|
+
}),
|
|
501
524
|
);
|
|
502
525
|
});
|
|
503
526
|
});
|
|
@@ -545,7 +568,7 @@ describe("ACP Mode Integration", () => {
|
|
|
545
568
|
await expect(
|
|
546
569
|
macroAgent.extMethod("macro/getHierarchy", {
|
|
547
570
|
rootAgentId: "non-existent-agent",
|
|
548
|
-
})
|
|
571
|
+
}),
|
|
549
572
|
).rejects.toThrow(ACPError);
|
|
550
573
|
});
|
|
551
574
|
});
|
|
@@ -576,7 +599,7 @@ describe("ACP Mode Integration", () => {
|
|
|
576
599
|
await expect(
|
|
577
600
|
macroAgent.extMethod("macro/getTask", {
|
|
578
601
|
taskId: "non-existent-task",
|
|
579
|
-
})
|
|
602
|
+
}),
|
|
580
603
|
).rejects.toThrow(ACPError);
|
|
581
604
|
});
|
|
582
605
|
});
|
|
@@ -640,7 +663,7 @@ describe("ACP Mode Integration", () => {
|
|
|
640
663
|
macroAgent.extMethod("macro/mountAgent", {
|
|
641
664
|
sessionId: "non-existent-session",
|
|
642
665
|
agentId: "some-agent",
|
|
643
|
-
})
|
|
666
|
+
}),
|
|
644
667
|
).rejects.toThrow(ACPError);
|
|
645
668
|
});
|
|
646
669
|
|
|
@@ -653,7 +676,7 @@ describe("ACP Mode Integration", () => {
|
|
|
653
676
|
macroAgent.extMethod("macro/mountAgent", {
|
|
654
677
|
sessionId: sessionResponse.sessionId,
|
|
655
678
|
agentId: "non-existent-agent",
|
|
656
|
-
})
|
|
679
|
+
}),
|
|
657
680
|
).rejects.toThrow(ACPError);
|
|
658
681
|
});
|
|
659
682
|
});
|
|
@@ -666,7 +689,7 @@ describe("ACP Mode Integration", () => {
|
|
|
666
689
|
});
|
|
667
690
|
|
|
668
691
|
const originalAgentId = macroAgent.getMappedAgentId(
|
|
669
|
-
sessionResponse.sessionId
|
|
692
|
+
sessionResponse.sessionId,
|
|
670
693
|
);
|
|
671
694
|
|
|
672
695
|
// Fork the agent
|
|
@@ -678,18 +701,20 @@ describe("ACP Mode Integration", () => {
|
|
|
678
701
|
expect(forkResponse.newAgentId).toBeDefined();
|
|
679
702
|
expect(forkResponse.newSessionId).toBeDefined();
|
|
680
703
|
expect(forkResponse.originalAgentId).toBe(originalAgentId);
|
|
704
|
+
expect(forkResponse.providerSessionId).toBeDefined();
|
|
681
705
|
|
|
682
|
-
// Verify
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
706
|
+
// Verify forkAgent was called with correct args
|
|
707
|
+
expect(mockAgentManager.forkAgent).toHaveBeenCalledWith(
|
|
708
|
+
originalAgentId,
|
|
709
|
+
expect.objectContaining({ name: "Forked for testing" }),
|
|
710
|
+
);
|
|
686
711
|
});
|
|
687
712
|
|
|
688
713
|
it("should throw for non-existent agent", async () => {
|
|
689
714
|
await expect(
|
|
690
715
|
macroAgent.extMethod("macro/forkAgent", {
|
|
691
716
|
agentId: "non-existent-agent",
|
|
692
|
-
})
|
|
717
|
+
}),
|
|
693
718
|
).rejects.toThrow(ACPError);
|
|
694
719
|
});
|
|
695
720
|
});
|
|
@@ -697,7 +722,7 @@ describe("ACP Mode Integration", () => {
|
|
|
697
722
|
describe("Extension Error Handling", () => {
|
|
698
723
|
it("should throw for unknown extension method", async () => {
|
|
699
724
|
await expect(macroAgent.extMethod("unknown/method", {})).rejects.toThrow(
|
|
700
|
-
ACPError
|
|
725
|
+
ACPError,
|
|
701
726
|
);
|
|
702
727
|
|
|
703
728
|
try {
|
|
@@ -736,7 +761,7 @@ describe("ACP Mode Integration", () => {
|
|
|
736
761
|
|
|
737
762
|
// Verify session2 is now controlling the child agent
|
|
738
763
|
expect(macroAgent.getMappedAgentId(session2.sessionId)).toBe(
|
|
739
|
-
childSpawn.agentId
|
|
764
|
+
childSpawn.agentId,
|
|
740
765
|
);
|
|
741
766
|
|
|
742
767
|
// 5. Fork the child from session2's perspective
|
|
@@ -763,7 +788,7 @@ describe("ACP Mode Integration", () => {
|
|
|
763
788
|
|
|
764
789
|
// Get session2's original agent
|
|
765
790
|
const session2AgentBefore = macroAgent.getMappedAgentId(
|
|
766
|
-
session2.sessionId
|
|
791
|
+
session2.sessionId,
|
|
767
792
|
);
|
|
768
793
|
|
|
769
794
|
// Mount session1 to new agent
|
|
@@ -774,10 +799,10 @@ describe("ACP Mode Integration", () => {
|
|
|
774
799
|
|
|
775
800
|
// Session2 should still point to its original head manager
|
|
776
801
|
expect(macroAgent.getMappedAgentId(session1.sessionId)).toBe(
|
|
777
|
-
spawn1.agentId
|
|
802
|
+
spawn1.agentId,
|
|
778
803
|
);
|
|
779
804
|
expect(macroAgent.getMappedAgentId(session2.sessionId)).toBe(
|
|
780
|
-
session2AgentBefore
|
|
805
|
+
session2AgentBefore,
|
|
781
806
|
);
|
|
782
807
|
});
|
|
783
808
|
});
|
|
@@ -883,7 +908,7 @@ describe("ACP Protocol Compliance", () => {
|
|
|
883
908
|
headManagers.length = 0;
|
|
884
909
|
const hierarchyResponse = await macroAgent.extMethod(
|
|
885
910
|
"macro/getHierarchy",
|
|
886
|
-
{}
|
|
911
|
+
{},
|
|
887
912
|
);
|
|
888
913
|
expect(hierarchyResponse).toBeDefined();
|
|
889
914
|
expect(hierarchyResponse.totalAgents).toBe(0);
|
|
@@ -967,7 +992,7 @@ describe("ACP Protocol Compliance", () => {
|
|
|
967
992
|
await expect(
|
|
968
993
|
macroAgent.extMethod("_macro/resume", {
|
|
969
994
|
agentId: childAgentId,
|
|
970
|
-
})
|
|
995
|
+
}),
|
|
971
996
|
).rejects.toThrow("only stopped or failed");
|
|
972
997
|
});
|
|
973
998
|
|
|
@@ -975,14 +1000,14 @@ describe("ACP Protocol Compliance", () => {
|
|
|
975
1000
|
await expect(
|
|
976
1001
|
macroAgent.extMethod("_macro/resume", {
|
|
977
1002
|
agentId: "non-existent-agent",
|
|
978
|
-
})
|
|
1003
|
+
}),
|
|
979
1004
|
).rejects.toThrow("Agent not found");
|
|
980
1005
|
});
|
|
981
1006
|
|
|
982
1007
|
it("should reject resume without agentId", async () => {
|
|
983
|
-
await expect(
|
|
984
|
-
|
|
985
|
-
)
|
|
1008
|
+
await expect(macroAgent.extMethod("_macro/resume", {})).rejects.toThrow(
|
|
1009
|
+
"agentId is required",
|
|
1010
|
+
);
|
|
986
1011
|
});
|
|
987
1012
|
|
|
988
1013
|
it("full lifecycle: spawn → stop → resume", async () => {
|
|
@@ -98,6 +98,12 @@ function createMockAgentManager(): AgentManager {
|
|
|
98
98
|
close: vi.fn().mockResolvedValue(undefined),
|
|
99
99
|
respondToPermission: vi.fn().mockReturnValue(true),
|
|
100
100
|
cancelPermission: vi.fn().mockReturnValue(true),
|
|
101
|
+
forkAgent: vi.fn().mockResolvedValue({
|
|
102
|
+
id: "agent-forked",
|
|
103
|
+
session_id: "session-forked",
|
|
104
|
+
agent: createMockAgent({ id: "agent-forked", session_id: "session-forked" }),
|
|
105
|
+
session: { id: "provider-session-forked" },
|
|
106
|
+
}),
|
|
101
107
|
} as unknown as AgentManager;
|
|
102
108
|
}
|
|
103
109
|
|
|
@@ -612,21 +618,23 @@ describe("MacroAgent", () => {
|
|
|
612
618
|
agentId: "agent-1",
|
|
613
619
|
});
|
|
614
620
|
|
|
615
|
-
expect(response).toHaveProperty("newAgentId");
|
|
616
|
-
expect(response).toHaveProperty("newSessionId");
|
|
621
|
+
expect(response).toHaveProperty("newAgentId", "agent-forked");
|
|
622
|
+
expect(response).toHaveProperty("newSessionId", "session-forked");
|
|
617
623
|
expect(response).toHaveProperty("originalAgentId", "agent-1");
|
|
618
|
-
expect(
|
|
624
|
+
expect(response).toHaveProperty("providerSessionId", "provider-session-forked");
|
|
625
|
+
expect(mockAgentManager.forkAgent).toHaveBeenCalledWith("agent-1", expect.any(Object));
|
|
619
626
|
});
|
|
620
627
|
|
|
621
|
-
it("should
|
|
628
|
+
it("should pass custom name to forkAgent", async () => {
|
|
622
629
|
await macroAgent.extMethod("macro/forkAgent", {
|
|
623
630
|
agentId: "agent-1",
|
|
624
631
|
name: "Custom fork name",
|
|
625
632
|
});
|
|
626
633
|
|
|
627
|
-
expect(mockAgentManager.
|
|
634
|
+
expect(mockAgentManager.forkAgent).toHaveBeenCalledWith(
|
|
635
|
+
"agent-1",
|
|
628
636
|
expect.objectContaining({
|
|
629
|
-
|
|
637
|
+
name: "Custom fork name",
|
|
630
638
|
})
|
|
631
639
|
);
|
|
632
640
|
});
|
|
@@ -641,8 +649,9 @@ describe("MacroAgent", () => {
|
|
|
641
649
|
).rejects.toThrow(ACPError);
|
|
642
650
|
});
|
|
643
651
|
|
|
644
|
-
it("should throw if agent has no active session", async () => {
|
|
652
|
+
it("should throw if agent has no active session and no provider_session_id", async () => {
|
|
645
653
|
vi.mocked(mockAgentManager.hasActiveSession).mockReturnValue(false);
|
|
654
|
+
// Default mock agent has no provider_session_id
|
|
646
655
|
|
|
647
656
|
await expect(
|
|
648
657
|
macroAgent.extMethod("macro/forkAgent", {
|