macro-agent 0.1.1 → 0.1.3
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/.gitattributes +3 -0
- package/.opentasks/config.json +9 -0
- package/.sudocode/issues.jsonl +28 -0
- package/.sudocode/specs.jsonl +4 -0
- package/CLAUDE.md +433 -201
- package/README.md +129 -371
- package/dist/acp/index.d.ts +9 -51
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js +5 -46
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/macro-agent.d.ts +28 -255
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +593 -1231
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/map-bridge.d.ts +62 -0
- package/dist/acp/map-bridge.d.ts.map +1 -0
- package/dist/acp/map-bridge.js +123 -0
- package/dist/acp/map-bridge.js.map +1 -0
- package/dist/acp/session-mapper.d.ts +29 -126
- package/dist/acp/session-mapper.d.ts.map +1 -1
- package/dist/acp/session-mapper.js +36 -234
- package/dist/acp/session-mapper.js.map +1 -1
- package/dist/acp/types.d.ts +24 -535
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js +7 -7
- package/dist/acp/types.js.map +1 -1
- package/dist/acp/websocket-server.d.ts +16 -136
- package/dist/acp/websocket-server.d.ts.map +1 -1
- package/dist/acp/websocket-server.js +131 -371
- package/dist/acp/websocket-server.js.map +1 -1
- package/dist/adapters/federation.d.ts +76 -0
- package/dist/adapters/federation.d.ts.map +1 -0
- package/dist/adapters/federation.js +120 -0
- package/dist/adapters/federation.js.map +1 -0
- package/dist/adapters/inbox-adapter.d.ts +72 -0
- package/dist/adapters/inbox-adapter.d.ts.map +1 -0
- package/dist/adapters/inbox-adapter.js +196 -0
- package/dist/adapters/inbox-adapter.js.map +1 -0
- package/dist/adapters/inbox-client-adapter.d.ts +40 -0
- package/dist/adapters/inbox-client-adapter.d.ts.map +1 -0
- package/dist/adapters/inbox-client-adapter.js +135 -0
- package/dist/adapters/inbox-client-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +10 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opentasks-daemon.d.ts +32 -0
- package/dist/adapters/opentasks-daemon.d.ts.map +1 -0
- package/dist/adapters/opentasks-daemon.js +190 -0
- package/dist/adapters/opentasks-daemon.js.map +1 -0
- package/dist/adapters/tasks-adapter.d.ts +49 -0
- package/dist/adapters/tasks-adapter.d.ts.map +1 -0
- package/dist/adapters/tasks-adapter.js +209 -0
- package/dist/adapters/tasks-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +198 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +13 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/agent/agent-manager-v2.d.ts +38 -0
- package/dist/agent/agent-manager-v2.d.ts.map +1 -0
- package/dist/agent/agent-manager-v2.js +1097 -0
- package/dist/agent/agent-manager-v2.js.map +1 -0
- package/dist/agent/agent-manager.d.ts +52 -42
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +11 -1255
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/agent-store.d.ts +89 -0
- package/dist/agent/agent-store.d.ts.map +1 -0
- package/dist/agent/agent-store.js +279 -0
- package/dist/agent/agent-store.js.map +1 -0
- package/dist/agent/types.d.ts +7 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/index.d.ts +5 -3
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -3
- package/dist/api/index.js.map +1 -1
- package/dist/api/server.d.ts +6 -123
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +247 -1489
- package/dist/api/server.js.map +1 -1
- package/dist/api/types.d.ts +20 -248
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +3 -1
- package/dist/api/types.js.map +1 -1
- package/dist/boot-v2.d.ts +165 -0
- package/dist/boot-v2.d.ts.map +1 -0
- package/dist/boot-v2.js +315 -0
- package/dist/boot-v2.js.map +1 -0
- package/dist/cli/acp.d.ts +6 -28
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +39 -373
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.d.ts +1 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +65 -449
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +18 -8
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +231 -282
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cognitive/analyst-role.d.ts +13 -0
- package/dist/cognitive/analyst-role.d.ts.map +1 -0
- package/dist/cognitive/analyst-role.js +48 -0
- package/dist/cognitive/analyst-role.js.map +1 -0
- package/dist/cognitive/index.d.ts +18 -0
- package/dist/cognitive/index.d.ts.map +1 -0
- package/dist/cognitive/index.js +21 -0
- package/dist/cognitive/index.js.map +1 -0
- package/dist/cognitive/macro-agent-backend.d.ts +40 -0
- package/dist/cognitive/macro-agent-backend.d.ts.map +1 -0
- package/dist/cognitive/macro-agent-backend.js +290 -0
- package/dist/cognitive/macro-agent-backend.js.map +1 -0
- package/dist/cognitive/session-converter.d.ts +30 -0
- package/dist/cognitive/session-converter.d.ts.map +1 -0
- package/dist/cognitive/session-converter.js +119 -0
- package/dist/cognitive/session-converter.js.map +1 -0
- package/dist/cognitive/types.d.ts +129 -0
- package/dist/cognitive/types.d.ts.map +1 -0
- package/dist/cognitive/types.js +12 -0
- package/dist/cognitive/types.js.map +1 -0
- package/dist/cognitive/workspace-handler.d.ts +46 -0
- package/dist/cognitive/workspace-handler.d.ts.map +1 -0
- package/dist/cognitive/workspace-handler.js +135 -0
- package/dist/cognitive/workspace-handler.js.map +1 -0
- package/dist/config/project-config.d.ts +13 -2
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +12 -2
- package/dist/config/project-config.js.map +1 -1
- package/dist/control/control-client.d.ts +63 -0
- package/dist/control/control-client.d.ts.map +1 -0
- package/dist/control/control-client.js +276 -0
- package/dist/control/control-client.js.map +1 -0
- package/dist/control/control-server.d.ts +46 -0
- package/dist/control/control-server.d.ts.map +1 -0
- package/dist/control/control-server.js +237 -0
- package/dist/control/control-server.js.map +1 -0
- package/dist/control/index.d.ts +9 -0
- package/dist/control/index.d.ts.map +1 -0
- package/dist/control/index.js +8 -0
- package/dist/control/index.js.map +1 -0
- package/dist/control/types.d.ts +64 -0
- package/dist/control/types.d.ts.map +1 -0
- package/dist/control/types.js +10 -0
- package/dist/control/types.js.map +1 -0
- package/dist/index.d.ts +15 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -34
- package/dist/index.js.map +1 -1
- package/dist/integrations/context-builder.d.ts +49 -0
- package/dist/integrations/context-builder.d.ts.map +1 -0
- package/dist/integrations/context-builder.js +160 -0
- package/dist/integrations/context-builder.js.map +1 -0
- package/dist/integrations/sessionlog.d.ts +58 -0
- package/dist/integrations/sessionlog.d.ts.map +1 -0
- package/dist/integrations/sessionlog.js +152 -0
- package/dist/integrations/sessionlog.js.map +1 -0
- package/dist/integrations/skilltree.d.ts +53 -0
- package/dist/integrations/skilltree.d.ts.map +1 -0
- package/dist/integrations/skilltree.js +140 -0
- package/dist/integrations/skilltree.js.map +1 -0
- package/dist/lifecycle/cleanup.d.ts +5 -14
- package/dist/lifecycle/cleanup.d.ts.map +1 -1
- package/dist/lifecycle/cleanup.js +4 -34
- package/dist/lifecycle/cleanup.js.map +1 -1
- package/dist/lifecycle/handlers-v2.d.ts +33 -0
- package/dist/lifecycle/handlers-v2.d.ts.map +1 -0
- package/dist/lifecycle/handlers-v2.js +319 -0
- package/dist/lifecycle/handlers-v2.js.map +1 -0
- package/dist/lifecycle/index.d.ts +3 -5
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +3 -12
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/dist/map/acp-bridge.d.ts +39 -0
- package/dist/map/acp-bridge.d.ts.map +1 -0
- package/dist/map/acp-bridge.js +180 -0
- package/dist/map/acp-bridge.js.map +1 -0
- package/dist/map/cc-swarm-hooks.d.ts +36 -0
- package/dist/map/cc-swarm-hooks.d.ts.map +1 -0
- package/dist/map/cc-swarm-hooks.js +218 -0
- package/dist/map/cc-swarm-hooks.js.map +1 -0
- package/dist/map/coordination-handler.d.ts +36 -0
- package/dist/map/coordination-handler.d.ts.map +1 -0
- package/dist/map/coordination-handler.js +166 -0
- package/dist/map/coordination-handler.js.map +1 -0
- package/dist/map/index.d.ts +5 -10
- package/dist/map/index.d.ts.map +1 -1
- package/dist/map/index.js +4 -13
- package/dist/map/index.js.map +1 -1
- package/dist/map/lifecycle-bridge.d.ts +34 -0
- package/dist/map/lifecycle-bridge.d.ts.map +1 -0
- package/dist/map/lifecycle-bridge.js +96 -0
- package/dist/map/lifecycle-bridge.js.map +1 -0
- package/dist/map/server.d.ts +38 -0
- package/dist/map/server.d.ts.map +1 -0
- package/dist/map/server.js +461 -0
- package/dist/map/server.js.map +1 -0
- package/dist/map/sidecar.d.ts +24 -0
- package/dist/map/sidecar.d.ts.map +1 -0
- package/dist/map/sidecar.js +263 -0
- package/dist/map/sidecar.js.map +1 -0
- package/dist/map/task-bridge.d.ts +22 -0
- package/dist/map/task-bridge.d.ts.map +1 -0
- package/dist/map/task-bridge.js +67 -0
- package/dist/map/task-bridge.js.map +1 -0
- package/dist/map/trajectory-reporter.d.ts +24 -0
- package/dist/map/trajectory-reporter.d.ts.map +1 -0
- package/dist/map/trajectory-reporter.js +86 -0
- package/dist/map/trajectory-reporter.js.map +1 -0
- package/dist/map/types.d.ts +162 -226
- package/dist/map/types.d.ts.map +1 -1
- package/dist/map/types.js +6 -165
- package/dist/map/types.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-server-v2.d.ts +44 -0
- package/dist/mcp/mcp-server-v2.d.ts.map +1 -0
- package/dist/mcp/mcp-server-v2.js +376 -0
- package/dist/mcp/mcp-server-v2.js.map +1 -0
- package/dist/mcp/tools/done-v2.d.ts +57 -0
- package/dist/mcp/tools/done-v2.d.ts.map +1 -0
- package/dist/mcp/tools/done-v2.js +129 -0
- package/dist/mcp/tools/done-v2.js.map +1 -0
- package/dist/metrics/index.d.ts +7 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +6 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/metrics.d.ts +9 -70
- package/dist/metrics/metrics.d.ts.map +1 -1
- package/dist/metrics/metrics.js +89 -145
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/metrics/types.d.ts +44 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +7 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/roles/builtin/coordinator.d.ts.map +1 -1
- package/dist/roles/builtin/coordinator.js +2 -1
- package/dist/roles/builtin/coordinator.js.map +1 -1
- package/dist/roles/builtin/integrator.d.ts.map +1 -1
- package/dist/roles/builtin/integrator.js +2 -1
- package/dist/roles/builtin/integrator.js.map +1 -1
- package/dist/roles/builtin/worker.d.ts.map +1 -1
- package/dist/roles/builtin/worker.js +3 -1
- package/dist/roles/builtin/worker.js.map +1 -1
- package/dist/roles/capabilities.d.ts +6 -0
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +10 -0
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +1 -1
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +3 -2
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/types.d.ts +3 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/store/index.d.ts +3 -6
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +3 -21
- package/dist/store/index.js.map +1 -1
- package/dist/store/types/agents.d.ts +5 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +3 -60
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/store/types/events.js +3 -46
- package/dist/store/types/events.js.map +1 -1
- package/dist/store/types/index.d.ts +0 -3
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/types/index.js +0 -3
- package/dist/store/types/index.js.map +1 -1
- package/dist/teams/index.d.ts +2 -2
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.js +1 -1
- package/dist/teams/index.js.map +1 -1
- package/dist/teams/seed-defaults.d.ts +20 -0
- package/dist/teams/seed-defaults.d.ts.map +1 -0
- package/dist/teams/seed-defaults.js +71 -0
- package/dist/teams/seed-defaults.js.map +1 -0
- package/dist/teams/team-loader.d.ts +6 -2
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +154 -162
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-manager-v2.d.ts +87 -0
- package/dist/teams/team-manager-v2.d.ts.map +1 -0
- package/dist/teams/team-manager-v2.js +203 -0
- package/dist/teams/team-manager-v2.js.map +1 -0
- package/dist/teams/team-runtime-v2.d.ts +149 -0
- package/dist/teams/team-runtime-v2.d.ts.map +1 -0
- package/dist/teams/team-runtime-v2.js +741 -0
- package/dist/teams/team-runtime-v2.js.map +1 -0
- package/dist/teams/types.d.ts +41 -151
- package/dist/teams/types.d.ts.map +1 -1
- package/dist/teams/types.js +2 -3
- package/dist/teams/types.js.map +1 -1
- package/dist/trigger/index.d.ts +2 -2
- package/dist/trigger/index.d.ts.map +1 -1
- package/dist/trigger/index.js +4 -4
- package/dist/trigger/index.js.map +1 -1
- package/dist/trigger/sources/cron/cron-service.d.ts +1 -1
- package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
- package/dist/trigger/sources/webhook/webhook-handler.d.ts +1 -1
- package/dist/trigger/sources/webhook/webhook-handler.d.ts.map +1 -1
- package/dist/trigger/strategies/ai-router.d.ts +31 -0
- package/dist/trigger/strategies/ai-router.d.ts.map +1 -0
- package/dist/trigger/strategies/ai-router.js +132 -0
- package/dist/trigger/strategies/ai-router.js.map +1 -0
- package/dist/trigger/trigger-system-v2.d.ts +106 -0
- package/dist/trigger/trigger-system-v2.d.ts.map +1 -0
- package/dist/trigger/trigger-system-v2.js +347 -0
- package/dist/trigger/trigger-system-v2.js.map +1 -0
- package/dist/trigger/types.d.ts +8 -0
- package/dist/trigger/types.d.ts.map +1 -1
- package/dist/trigger/types.js.map +1 -1
- package/dist/workspace/strategies/optimistic.d.ts +13 -3
- package/dist/workspace/strategies/optimistic.d.ts.map +1 -1
- package/dist/workspace/strategies/optimistic.js +4 -4
- package/dist/workspace/strategies/optimistic.js.map +1 -1
- package/docs/design-subsystem-extraction.md +627 -0
- package/docs/lifecycle-events-design.md +111 -0
- package/docs/openhive-capability-summary.md +415 -0
- package/docs/openhive-integration.md +415 -0
- package/docs/roadmap-v2-gaps.md +216 -0
- package/docs/teams.md +73 -0
- package/package.json +26 -6
- package/src/__tests__/boot-v2.test.ts +196 -0
- package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +496 -0
- package/src/__tests__/e2e/acp-over-map.e2e.test.ts +365 -0
- package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +770 -0
- package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +253 -0
- package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +282 -0
- package/src/__tests__/e2e/done-scenarios.e2e.test.ts +322 -0
- package/src/__tests__/e2e/live-agent.e2e.test.ts +1330 -0
- package/src/__tests__/e2e/map-server.e2e.test.ts +128 -0
- package/src/__tests__/e2e/map-sidecar.e2e.test.ts +139 -0
- package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +280 -0
- package/src/__tests__/e2e/pull-mode.e2e.test.ts +632 -0
- package/src/__tests__/e2e/resume-continue.e2e.test.ts +312 -0
- package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +562 -0
- package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +1049 -0
- package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +258 -0
- package/src/__tests__/e2e/trigger-wake.e2e.test.ts +257 -0
- package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +375 -0
- package/src/acp/__tests__/macro-agent.test.ts +234 -945
- package/src/acp/__tests__/session-mapper.test.ts +82 -155
- package/src/acp/__tests__/websocket-server.test.ts +121 -270
- package/src/acp/index.ts +18 -118
- package/src/acp/macro-agent.ts +692 -1752
- package/src/acp/map-bridge.ts +193 -0
- package/src/acp/session-mapper.ts +43 -276
- package/src/acp/types.ts +39 -767
- package/src/acp/websocket-server.ts +152 -588
- package/src/adapters/__tests__/federation.test.ts +256 -0
- package/src/adapters/__tests__/inbox-adapter.test.ts +316 -0
- package/src/adapters/__tests__/tasks-adapter.test.ts +269 -0
- package/src/adapters/federation.ts +185 -0
- package/src/adapters/inbox-adapter.ts +292 -0
- package/src/adapters/inbox-client-adapter.ts +173 -0
- package/src/adapters/index.ts +44 -0
- package/src/adapters/opentasks-daemon.ts +252 -0
- package/src/adapters/tasks-adapter.ts +327 -0
- package/src/adapters/types.ts +285 -0
- package/src/agent/__tests__/agent-manager-v2.test.ts +554 -0
- package/src/agent/__tests__/agent-store.test.ts +413 -0
- package/src/agent/agent-manager-v2.ts +1476 -0
- package/src/agent/agent-manager.ts +41 -1723
- package/src/agent/agent-store.ts +385 -0
- package/src/agent/types.ts +9 -0
- package/src/api/__tests__/server.test.ts +238 -961
- package/src/api/index.ts +5 -3
- package/src/api/server.ts +276 -1870
- package/src/api/types.ts +25 -337
- package/src/boot-v2.ts +527 -0
- package/src/cli/acp.ts +40 -435
- package/src/cli/index.ts +68 -466
- package/src/cli/mcp.ts +260 -326
- package/src/cognitive/__tests__/macro-agent-backend.test.ts +478 -0
- package/src/cognitive/__tests__/session-converter.test.ts +423 -0
- package/src/cognitive/__tests__/workspace-handler.test.ts +221 -0
- package/src/cognitive/analyst-role.ts +59 -0
- package/src/cognitive/index.ts +49 -0
- package/src/cognitive/macro-agent-backend.ts +354 -0
- package/src/cognitive/session-converter.ts +151 -0
- package/src/cognitive/types.ts +163 -0
- package/src/cognitive/workspace-handler.ts +163 -0
- package/src/config/project-config.ts +27 -3
- package/src/control/__tests__/control-resilience.test.ts +251 -0
- package/src/control/__tests__/control-socket.test.ts +240 -0
- package/src/control/control-client.ts +337 -0
- package/src/control/control-server.ts +298 -0
- package/src/control/index.ts +17 -0
- package/src/control/types.ts +95 -0
- package/src/index.ts +43 -222
- package/src/integrations/__tests__/context-builder.test.ts +218 -0
- package/src/integrations/__tests__/sessionlog.test.ts +498 -0
- package/src/integrations/__tests__/skilltree.test.ts +136 -0
- package/src/integrations/context-builder.ts +280 -0
- package/src/integrations/sessionlog.ts +194 -0
- package/src/integrations/skilltree.ts +183 -0
- package/src/lifecycle/__tests__/handlers-v2.test.ts +565 -0
- package/src/lifecycle/cleanup.ts +6 -46
- package/src/lifecycle/handlers-v2.ts +437 -0
- package/src/lifecycle/index.ts +2 -28
- package/src/lifecycle/types.ts +3 -0
- package/src/map/__tests__/lifecycle-bridge.test.ts +223 -0
- package/src/map/__tests__/permission-forwarding.test.ts +143 -0
- package/src/map/__tests__/sidecar-integration.test.ts +190 -0
- package/src/map/__tests__/task-bridge.test.ts +153 -0
- package/src/map/__tests__/trajectory-reporter.test.ts +173 -0
- package/src/map/acp-bridge.ts +270 -0
- package/src/map/cc-swarm-hooks.ts +242 -0
- package/src/map/coordination-handler.ts +220 -0
- package/src/map/index.ts +13 -14
- package/src/map/lifecycle-bridge.ts +140 -0
- package/src/map/server.ts +527 -0
- package/src/map/sidecar.ts +312 -0
- package/src/map/task-bridge.ts +89 -0
- package/src/map/trajectory-reporter.ts +124 -0
- package/src/map/types.ts +195 -367
- package/src/mcp/__tests__/mcp-server-v2.test.ts +236 -0
- package/src/mcp/index.ts +2 -2
- package/src/mcp/mcp-server-v2.ts +485 -0
- package/src/mcp/tools/done-v2.ts +203 -0
- package/src/metrics/__tests__/metrics.test.ts +205 -0
- package/src/metrics/index.ts +13 -9
- package/src/metrics/metrics.ts +110 -239
- package/src/metrics/types.ts +63 -0
- package/src/roles/builtin/coordinator.ts +2 -0
- package/src/roles/builtin/integrator.ts +2 -0
- package/src/roles/builtin/worker.ts +3 -0
- package/src/roles/capabilities.ts +11 -0
- package/src/roles/config-loader.ts +3 -2
- package/src/roles/types.ts +7 -0
- package/src/store/index.ts +3 -64
- package/src/store/types/agents.ts +5 -0
- package/src/store/types/events.ts +5 -100
- package/src/store/types/index.ts +0 -3
- package/src/teams/__tests__/team-manager-v2.test.ts +425 -0
- package/src/teams/__tests__/team-runtime-v2.test.ts +402 -0
- package/src/teams/index.ts +20 -4
- package/src/teams/seed-defaults.ts +79 -0
- package/src/teams/team-loader.ts +200 -234
- package/src/teams/team-manager-v2.ts +268 -0
- package/src/teams/team-runtime-v2.ts +898 -0
- package/src/teams/types.ts +99 -200
- package/src/trigger/__tests__/trigger-system-v2.test.ts +257 -0
- package/src/trigger/index.ts +16 -31
- package/src/trigger/sources/cron/cron-service.ts +1 -1
- package/src/trigger/sources/webhook/webhook-handler.ts +1 -1
- package/src/trigger/strategies/ai-router.ts +170 -0
- package/src/trigger/trigger-system-v2.ts +536 -0
- package/src/trigger/types.ts +13 -0
- package/src/workspace/strategies/optimistic.ts +9 -6
- package/.claude/settings.local.json +0 -61
- package/dist/acp/websocket-stream.d.ts +0 -30
- package/dist/acp/websocket-stream.d.ts.map +0 -1
- package/dist/acp/websocket-stream.js +0 -118
- package/dist/acp/websocket-stream.js.map +0 -1
- package/dist/activity/deduplication.d.ts +0 -85
- package/dist/activity/deduplication.d.ts.map +0 -1
- package/dist/activity/deduplication.js +0 -149
- package/dist/activity/deduplication.js.map +0 -1
- package/dist/activity/index.d.ts +0 -16
- package/dist/activity/index.d.ts.map +0 -1
- package/dist/activity/index.js +0 -17
- package/dist/activity/index.js.map +0 -1
- package/dist/activity/relevance.d.ts +0 -81
- package/dist/activity/relevance.d.ts.map +0 -1
- package/dist/activity/relevance.js +0 -161
- package/dist/activity/relevance.js.map +0 -1
- package/dist/activity/types.d.ts +0 -169
- package/dist/activity/types.d.ts.map +0 -1
- package/dist/activity/types.js +0 -33
- package/dist/activity/types.js.map +0 -1
- package/dist/activity/watcher.d.ts +0 -64
- package/dist/activity/watcher.d.ts.map +0 -1
- package/dist/activity/watcher.js +0 -212
- package/dist/activity/watcher.js.map +0 -1
- package/dist/agent/wake.d.ts +0 -85
- package/dist/agent/wake.d.ts.map +0 -1
- package/dist/agent/wake.js +0 -278
- package/dist/agent/wake.js.map +0 -1
- package/dist/lifecycle/handlers/generic.d.ts +0 -27
- package/dist/lifecycle/handlers/generic.d.ts.map +0 -1
- package/dist/lifecycle/handlers/generic.js +0 -56
- package/dist/lifecycle/handlers/generic.js.map +0 -1
- package/dist/lifecycle/handlers/index.d.ts +0 -47
- package/dist/lifecycle/handlers/index.d.ts.map +0 -1
- package/dist/lifecycle/handlers/index.js +0 -93
- package/dist/lifecycle/handlers/index.js.map +0 -1
- package/dist/lifecycle/handlers/integrator.d.ts +0 -81
- package/dist/lifecycle/handlers/integrator.d.ts.map +0 -1
- package/dist/lifecycle/handlers/integrator.js +0 -451
- package/dist/lifecycle/handlers/integrator.js.map +0 -1
- package/dist/lifecycle/handlers/monitor.d.ts +0 -29
- package/dist/lifecycle/handlers/monitor.d.ts.map +0 -1
- package/dist/lifecycle/handlers/monitor.js +0 -79
- package/dist/lifecycle/handlers/monitor.js.map +0 -1
- package/dist/lifecycle/handlers/worker.d.ts +0 -56
- package/dist/lifecycle/handlers/worker.d.ts.map +0 -1
- package/dist/lifecycle/handlers/worker.js +0 -381
- package/dist/lifecycle/handlers/worker.js.map +0 -1
- package/dist/mail/conversation-map.d.ts +0 -33
- package/dist/mail/conversation-map.d.ts.map +0 -1
- package/dist/mail/conversation-map.js +0 -61
- package/dist/mail/conversation-map.js.map +0 -1
- package/dist/mail/index.d.ts +0 -11
- package/dist/mail/index.d.ts.map +0 -1
- package/dist/mail/index.js +0 -11
- package/dist/mail/index.js.map +0 -1
- package/dist/mail/mail-service.d.ts +0 -85
- package/dist/mail/mail-service.d.ts.map +0 -1
- package/dist/mail/mail-service.js +0 -121
- package/dist/mail/mail-service.js.map +0 -1
- package/dist/mail/stores/eventstore-conversation-store.d.ts +0 -40
- package/dist/mail/stores/eventstore-conversation-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-conversation-store.js +0 -131
- package/dist/mail/stores/eventstore-conversation-store.js.map +0 -1
- package/dist/mail/stores/eventstore-participant-store.d.ts +0 -43
- package/dist/mail/stores/eventstore-participant-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-participant-store.js +0 -145
- package/dist/mail/stores/eventstore-participant-store.js.map +0 -1
- package/dist/mail/stores/eventstore-thread-store.d.ts +0 -46
- package/dist/mail/stores/eventstore-thread-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-thread-store.js +0 -118
- package/dist/mail/stores/eventstore-thread-store.js.map +0 -1
- package/dist/mail/stores/eventstore-turn-store.d.ts +0 -47
- package/dist/mail/stores/eventstore-turn-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-turn-store.js +0 -153
- package/dist/mail/stores/eventstore-turn-store.js.map +0 -1
- package/dist/mail/stores/index.d.ts +0 -12
- package/dist/mail/stores/index.d.ts.map +0 -1
- package/dist/mail/stores/index.js +0 -12
- package/dist/mail/stores/index.js.map +0 -1
- package/dist/mail/stores/types.d.ts +0 -146
- package/dist/mail/stores/types.d.ts.map +0 -1
- package/dist/mail/stores/types.js +0 -13
- package/dist/mail/stores/types.js.map +0 -1
- package/dist/mail/turn-recorder.d.ts +0 -30
- package/dist/mail/turn-recorder.d.ts.map +0 -1
- package/dist/mail/turn-recorder.js +0 -98
- package/dist/mail/turn-recorder.js.map +0 -1
- package/dist/map/adapter/acp-over-map.d.ts +0 -115
- package/dist/map/adapter/acp-over-map.d.ts.map +0 -1
- package/dist/map/adapter/acp-over-map.js +0 -1024
- package/dist/map/adapter/acp-over-map.js.map +0 -1
- package/dist/map/adapter/connection-manager.d.ts +0 -150
- package/dist/map/adapter/connection-manager.d.ts.map +0 -1
- package/dist/map/adapter/connection-manager.js +0 -207
- package/dist/map/adapter/connection-manager.js.map +0 -1
- package/dist/map/adapter/event-log.d.ts +0 -87
- package/dist/map/adapter/event-log.d.ts.map +0 -1
- package/dist/map/adapter/event-log.js +0 -122
- package/dist/map/adapter/event-log.js.map +0 -1
- package/dist/map/adapter/event-translator.d.ts +0 -85
- package/dist/map/adapter/event-translator.d.ts.map +0 -1
- package/dist/map/adapter/event-translator.js +0 -295
- package/dist/map/adapter/event-translator.js.map +0 -1
- package/dist/map/adapter/extensions/agent-detection.d.ts +0 -49
- package/dist/map/adapter/extensions/agent-detection.d.ts.map +0 -1
- package/dist/map/adapter/extensions/agent-detection.js +0 -91
- package/dist/map/adapter/extensions/agent-detection.js.map +0 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +0 -82
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +0 -1
- package/dist/map/adapter/extensions/agent-lifecycle.js +0 -164
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +0 -1
- package/dist/map/adapter/extensions/index.d.ts +0 -89
- package/dist/map/adapter/extensions/index.d.ts.map +0 -1
- package/dist/map/adapter/extensions/index.js +0 -187
- package/dist/map/adapter/extensions/index.js.map +0 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +0 -57
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +0 -1
- package/dist/map/adapter/extensions/mcp-bridge.js +0 -745
- package/dist/map/adapter/extensions/mcp-bridge.js.map +0 -1
- package/dist/map/adapter/extensions/rename.d.ts +0 -29
- package/dist/map/adapter/extensions/rename.d.ts.map +0 -1
- package/dist/map/adapter/extensions/rename.js +0 -49
- package/dist/map/adapter/extensions/rename.js.map +0 -1
- package/dist/map/adapter/extensions/resume.d.ts +0 -47
- package/dist/map/adapter/extensions/resume.d.ts.map +0 -1
- package/dist/map/adapter/extensions/resume.js +0 -59
- package/dist/map/adapter/extensions/resume.js.map +0 -1
- package/dist/map/adapter/extensions/task.d.ts +0 -40
- package/dist/map/adapter/extensions/task.d.ts.map +0 -1
- package/dist/map/adapter/extensions/task.js +0 -197
- package/dist/map/adapter/extensions/task.js.map +0 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +0 -29
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +0 -1
- package/dist/map/adapter/extensions/update-metadata.js +0 -67
- package/dist/map/adapter/extensions/update-metadata.js.map +0 -1
- package/dist/map/adapter/extensions/wake.d.ts +0 -60
- package/dist/map/adapter/extensions/wake.d.ts.map +0 -1
- package/dist/map/adapter/extensions/wake.js +0 -144
- package/dist/map/adapter/extensions/wake.js.map +0 -1
- package/dist/map/adapter/extensions/workspace-files.d.ts +0 -42
- package/dist/map/adapter/extensions/workspace-files.d.ts.map +0 -1
- package/dist/map/adapter/extensions/workspace-files.js +0 -338
- package/dist/map/adapter/extensions/workspace-files.js.map +0 -1
- package/dist/map/adapter/extensions/workspace.d.ts +0 -57
- package/dist/map/adapter/extensions/workspace.d.ts.map +0 -1
- package/dist/map/adapter/extensions/workspace.js +0 -81
- package/dist/map/adapter/extensions/workspace.js.map +0 -1
- package/dist/map/adapter/index.d.ts +0 -20
- package/dist/map/adapter/index.d.ts.map +0 -1
- package/dist/map/adapter/index.js +0 -38
- package/dist/map/adapter/index.js.map +0 -1
- package/dist/map/adapter/interface.d.ts +0 -450
- package/dist/map/adapter/interface.d.ts.map +0 -1
- package/dist/map/adapter/interface.js +0 -24
- package/dist/map/adapter/interface.js.map +0 -1
- package/dist/map/adapter/mail-handler-adapter.d.ts +0 -27
- package/dist/map/adapter/mail-handler-adapter.d.ts.map +0 -1
- package/dist/map/adapter/mail-handler-adapter.js +0 -292
- package/dist/map/adapter/mail-handler-adapter.js.map +0 -1
- package/dist/map/adapter/map-adapter.d.ts +0 -200
- package/dist/map/adapter/map-adapter.d.ts.map +0 -1
- package/dist/map/adapter/map-adapter.js +0 -1199
- package/dist/map/adapter/map-adapter.js.map +0 -1
- package/dist/map/adapter/rpc-handler.d.ts +0 -263
- package/dist/map/adapter/rpc-handler.d.ts.map +0 -1
- package/dist/map/adapter/rpc-handler.js +0 -365
- package/dist/map/adapter/rpc-handler.js.map +0 -1
- package/dist/map/adapter/subscription-manager.d.ts +0 -174
- package/dist/map/adapter/subscription-manager.d.ts.map +0 -1
- package/dist/map/adapter/subscription-manager.js +0 -248
- package/dist/map/adapter/subscription-manager.js.map +0 -1
- package/dist/map/adapter/types.d.ts +0 -194
- package/dist/map/adapter/types.d.ts.map +0 -1
- package/dist/map/adapter/types.js +0 -27
- package/dist/map/adapter/types.js.map +0 -1
- package/dist/map/adapter/websocket-integration.d.ts +0 -113
- package/dist/map/adapter/websocket-integration.d.ts.map +0 -1
- package/dist/map/adapter/websocket-integration.js +0 -134
- package/dist/map/adapter/websocket-integration.js.map +0 -1
- package/dist/map/federation/envelope.d.ts +0 -98
- package/dist/map/federation/envelope.d.ts.map +0 -1
- package/dist/map/federation/envelope.js +0 -160
- package/dist/map/federation/envelope.js.map +0 -1
- package/dist/map/federation/federation-handler.d.ts +0 -50
- package/dist/map/federation/federation-handler.d.ts.map +0 -1
- package/dist/map/federation/federation-handler.js +0 -306
- package/dist/map/federation/federation-handler.js.map +0 -1
- package/dist/map/federation/index.d.ts +0 -14
- package/dist/map/federation/index.d.ts.map +0 -1
- package/dist/map/federation/index.js +0 -13
- package/dist/map/federation/index.js.map +0 -1
- package/dist/map/federation/types.d.ts +0 -239
- package/dist/map/federation/types.d.ts.map +0 -1
- package/dist/map/federation/types.js +0 -23
- package/dist/map/federation/types.js.map +0 -1
- package/dist/map/utils/address-translation.d.ts +0 -99
- package/dist/map/utils/address-translation.d.ts.map +0 -1
- package/dist/map/utils/address-translation.js +0 -285
- package/dist/map/utils/address-translation.js.map +0 -1
- package/dist/map/utils/index.d.ts +0 -7
- package/dist/map/utils/index.d.ts.map +0 -1
- package/dist/map/utils/index.js +0 -7
- package/dist/map/utils/index.js.map +0 -1
- package/dist/mcp/map-client.d.ts +0 -39
- package/dist/mcp/map-client.d.ts.map +0 -1
- package/dist/mcp/map-client.js +0 -129
- package/dist/mcp/map-client.js.map +0 -1
- package/dist/mcp/mcp-server.d.ts +0 -70
- package/dist/mcp/mcp-server.d.ts.map +0 -1
- package/dist/mcp/mcp-server.js +0 -1015
- package/dist/mcp/mcp-server.js.map +0 -1
- package/dist/mcp/tools/claim_task.d.ts +0 -35
- package/dist/mcp/tools/claim_task.d.ts.map +0 -1
- package/dist/mcp/tools/claim_task.js +0 -58
- package/dist/mcp/tools/claim_task.js.map +0 -1
- package/dist/mcp/tools/done.d.ts +0 -102
- package/dist/mcp/tools/done.d.ts.map +0 -1
- package/dist/mcp/tools/done.js +0 -234
- package/dist/mcp/tools/done.js.map +0 -1
- package/dist/mcp/tools/inject_context.d.ts +0 -61
- package/dist/mcp/tools/inject_context.d.ts.map +0 -1
- package/dist/mcp/tools/inject_context.js +0 -123
- package/dist/mcp/tools/inject_context.js.map +0 -1
- package/dist/mcp/tools/list_claimable_tasks.d.ts +0 -38
- package/dist/mcp/tools/list_claimable_tasks.d.ts.map +0 -1
- package/dist/mcp/tools/list_claimable_tasks.js +0 -63
- package/dist/mcp/tools/list_claimable_tasks.js.map +0 -1
- package/dist/mcp/tools/unclaim_task.d.ts +0 -31
- package/dist/mcp/tools/unclaim_task.d.ts.map +0 -1
- package/dist/mcp/tools/unclaim_task.js +0 -47
- package/dist/mcp/tools/unclaim_task.js.map +0 -1
- package/dist/mcp/tools/wait_for_activity.d.ts +0 -60
- package/dist/mcp/tools/wait_for_activity.d.ts.map +0 -1
- package/dist/mcp/tools/wait_for_activity.js +0 -135
- package/dist/mcp/tools/wait_for_activity.js.map +0 -1
- package/dist/monitor/health-check-service.d.ts +0 -143
- package/dist/monitor/health-check-service.d.ts.map +0 -1
- package/dist/monitor/health-check-service.js +0 -240
- package/dist/monitor/health-check-service.js.map +0 -1
- package/dist/monitor/index.d.ts +0 -14
- package/dist/monitor/index.d.ts.map +0 -1
- package/dist/monitor/index.js +0 -14
- package/dist/monitor/index.js.map +0 -1
- package/dist/monitor/stall-detector.d.ts +0 -109
- package/dist/monitor/stall-detector.d.ts.map +0 -1
- package/dist/monitor/stall-detector.js +0 -152
- package/dist/monitor/stall-detector.js.map +0 -1
- package/dist/peer/capability-manager.d.ts +0 -56
- package/dist/peer/capability-manager.d.ts.map +0 -1
- package/dist/peer/capability-manager.js +0 -186
- package/dist/peer/capability-manager.js.map +0 -1
- package/dist/peer/encapsulation-manager.d.ts +0 -190
- package/dist/peer/encapsulation-manager.d.ts.map +0 -1
- package/dist/peer/encapsulation-manager.js +0 -486
- package/dist/peer/encapsulation-manager.js.map +0 -1
- package/dist/peer/federation-manager.d.ts +0 -223
- package/dist/peer/federation-manager.d.ts.map +0 -1
- package/dist/peer/federation-manager.js +0 -528
- package/dist/peer/federation-manager.js.map +0 -1
- package/dist/peer/hierarchy-errors.d.ts +0 -208
- package/dist/peer/hierarchy-errors.d.ts.map +0 -1
- package/dist/peer/hierarchy-errors.js +0 -268
- package/dist/peer/hierarchy-errors.js.map +0 -1
- package/dist/peer/hierarchy-protocol.d.ts +0 -159
- package/dist/peer/hierarchy-protocol.d.ts.map +0 -1
- package/dist/peer/hierarchy-protocol.js +0 -142
- package/dist/peer/hierarchy-protocol.js.map +0 -1
- package/dist/peer/index.d.ts +0 -15
- package/dist/peer/index.d.ts.map +0 -1
- package/dist/peer/index.js +0 -15
- package/dist/peer/index.js.map +0 -1
- package/dist/peer/peer-manager.d.ts +0 -99
- package/dist/peer/peer-manager.d.ts.map +0 -1
- package/dist/peer/peer-manager.js +0 -333
- package/dist/peer/peer-manager.js.map +0 -1
- package/dist/peer/task-delegation.d.ts +0 -189
- package/dist/peer/task-delegation.d.ts.map +0 -1
- package/dist/peer/task-delegation.js +0 -303
- package/dist/peer/task-delegation.js.map +0 -1
- package/dist/peer/transports/index.d.ts +0 -8
- package/dist/peer/transports/index.d.ts.map +0 -1
- package/dist/peer/transports/index.js +0 -8
- package/dist/peer/transports/index.js.map +0 -1
- package/dist/peer/transports/local-transport.d.ts +0 -56
- package/dist/peer/transports/local-transport.d.ts.map +0 -1
- package/dist/peer/transports/local-transport.js +0 -263
- package/dist/peer/transports/local-transport.js.map +0 -1
- package/dist/peer/transports/websocket-transport.d.ts +0 -86
- package/dist/peer/transports/websocket-transport.d.ts.map +0 -1
- package/dist/peer/transports/websocket-transport.js +0 -338
- package/dist/peer/transports/websocket-transport.js.map +0 -1
- package/dist/peer/types.d.ts +0 -268
- package/dist/peer/types.d.ts.map +0 -1
- package/dist/peer/types.js +0 -36
- package/dist/peer/types.js.map +0 -1
- package/dist/router/address-resolver.d.ts +0 -102
- package/dist/router/address-resolver.d.ts.map +0 -1
- package/dist/router/address-resolver.js +0 -198
- package/dist/router/address-resolver.js.map +0 -1
- package/dist/router/broadcast.d.ts +0 -53
- package/dist/router/broadcast.d.ts.map +0 -1
- package/dist/router/broadcast.js +0 -75
- package/dist/router/broadcast.js.map +0 -1
- package/dist/router/channels.d.ts +0 -148
- package/dist/router/channels.d.ts.map +0 -1
- package/dist/router/channels.js +0 -126
- package/dist/router/channels.js.map +0 -1
- package/dist/router/index.d.ts +0 -21
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/index.js +0 -18
- package/dist/router/index.js.map +0 -1
- package/dist/router/message-router.d.ts +0 -197
- package/dist/router/message-router.d.ts.map +0 -1
- package/dist/router/message-router.js +0 -903
- package/dist/router/message-router.js.map +0 -1
- package/dist/router/message-types.d.ts +0 -183
- package/dist/router/message-types.d.ts.map +0 -1
- package/dist/router/message-types.js +0 -79
- package/dist/router/message-types.js.map +0 -1
- package/dist/router/role-resolver.d.ts +0 -67
- package/dist/router/role-resolver.d.ts.map +0 -1
- package/dist/router/role-resolver.js +0 -106
- package/dist/router/role-resolver.js.map +0 -1
- package/dist/router/signals.d.ts +0 -253
- package/dist/router/signals.d.ts.map +0 -1
- package/dist/router/signals.js +0 -53
- package/dist/router/signals.js.map +0 -1
- package/dist/router/types.d.ts +0 -191
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -34
- package/dist/router/types.js.map +0 -1
- package/dist/router/wake.d.ts +0 -111
- package/dist/router/wake.d.ts.map +0 -1
- package/dist/router/wake.js +0 -180
- package/dist/router/wake.js.map +0 -1
- package/dist/server/combined-server.d.ts +0 -88
- package/dist/server/combined-server.d.ts.map +0 -1
- package/dist/server/combined-server.js +0 -331
- package/dist/server/combined-server.js.map +0 -1
- package/dist/steering/index.d.ts +0 -11
- package/dist/steering/index.d.ts.map +0 -1
- package/dist/steering/index.js +0 -11
- package/dist/steering/index.js.map +0 -1
- package/dist/steering/inject.d.ts +0 -39
- package/dist/steering/inject.d.ts.map +0 -1
- package/dist/steering/inject.js +0 -197
- package/dist/steering/inject.js.map +0 -1
- package/dist/steering/types.d.ts +0 -100
- package/dist/steering/types.d.ts.map +0 -1
- package/dist/steering/types.js +0 -11
- package/dist/steering/types.js.map +0 -1
- package/dist/store/backends/index.d.ts +0 -11
- package/dist/store/backends/index.d.ts.map +0 -1
- package/dist/store/backends/index.js +0 -15
- package/dist/store/backends/index.js.map +0 -1
- package/dist/store/backends/json-backend.d.ts +0 -23
- package/dist/store/backends/json-backend.d.ts.map +0 -1
- package/dist/store/backends/json-backend.js +0 -220
- package/dist/store/backends/json-backend.js.map +0 -1
- package/dist/store/backends/memory-backend.d.ts +0 -12
- package/dist/store/backends/memory-backend.d.ts.map +0 -1
- package/dist/store/backends/memory-backend.js +0 -205
- package/dist/store/backends/memory-backend.js.map +0 -1
- package/dist/store/backends/sqlite-backend.d.ts +0 -27
- package/dist/store/backends/sqlite-backend.d.ts.map +0 -1
- package/dist/store/backends/sqlite-backend.js +0 -231
- package/dist/store/backends/sqlite-backend.js.map +0 -1
- package/dist/store/backends/tinybase-backend.d.ts +0 -22
- package/dist/store/backends/tinybase-backend.d.ts.map +0 -1
- package/dist/store/backends/tinybase-backend.js +0 -203
- package/dist/store/backends/tinybase-backend.js.map +0 -1
- package/dist/store/backends/types.d.ts +0 -175
- package/dist/store/backends/types.d.ts.map +0 -1
- package/dist/store/backends/types.js +0 -28
- package/dist/store/backends/types.js.map +0 -1
- package/dist/store/event-store.d.ts +0 -128
- package/dist/store/event-store.d.ts.map +0 -1
- package/dist/store/event-store.js +0 -1739
- package/dist/store/event-store.js.map +0 -1
- package/dist/store/instance.d.ts +0 -283
- package/dist/store/instance.d.ts.map +0 -1
- package/dist/store/instance.js +0 -363
- package/dist/store/instance.js.map +0 -1
- package/dist/store/migrations.d.ts +0 -41
- package/dist/store/migrations.d.ts.map +0 -1
- package/dist/store/migrations.js +0 -79
- package/dist/store/migrations.js.map +0 -1
- package/dist/store/types/config.d.ts +0 -16
- package/dist/store/types/config.d.ts.map +0 -1
- package/dist/store/types/config.js +0 -8
- package/dist/store/types/config.js.map +0 -1
- package/dist/store/types/conversations.d.ts +0 -91
- package/dist/store/types/conversations.d.ts.map +0 -1
- package/dist/store/types/conversations.js +0 -8
- package/dist/store/types/conversations.js.map +0 -1
- package/dist/store/types/sessions.d.ts +0 -44
- package/dist/store/types/sessions.d.ts.map +0 -1
- package/dist/store/types/sessions.js +0 -9
- package/dist/store/types/sessions.js.map +0 -1
- package/dist/task/backend/index.d.ts +0 -93
- package/dist/task/backend/index.d.ts.map +0 -1
- package/dist/task/backend/index.js +0 -178
- package/dist/task/backend/index.js.map +0 -1
- package/dist/task/backend/memory.d.ts +0 -70
- package/dist/task/backend/memory.d.ts.map +0 -1
- package/dist/task/backend/memory.js +0 -621
- package/dist/task/backend/memory.js.map +0 -1
- package/dist/task/backend/opentasks/backend.d.ts +0 -140
- package/dist/task/backend/opentasks/backend.d.ts.map +0 -1
- package/dist/task/backend/opentasks/backend.js +0 -1023
- package/dist/task/backend/opentasks/backend.js.map +0 -1
- package/dist/task/backend/opentasks/client.d.ts +0 -337
- package/dist/task/backend/opentasks/client.d.ts.map +0 -1
- package/dist/task/backend/opentasks/client.js +0 -225
- package/dist/task/backend/opentasks/client.js.map +0 -1
- package/dist/task/backend/opentasks/daemon-manager.d.ts +0 -89
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +0 -1
- package/dist/task/backend/opentasks/daemon-manager.js +0 -195
- package/dist/task/backend/opentasks/daemon-manager.js.map +0 -1
- package/dist/task/backend/opentasks/index.d.ts +0 -21
- package/dist/task/backend/opentasks/index.d.ts.map +0 -1
- package/dist/task/backend/opentasks/index.js +0 -21
- package/dist/task/backend/opentasks/index.js.map +0 -1
- package/dist/task/backend/opentasks/mapping.d.ts +0 -48
- package/dist/task/backend/opentasks/mapping.d.ts.map +0 -1
- package/dist/task/backend/opentasks/mapping.js +0 -77
- package/dist/task/backend/opentasks/mapping.js.map +0 -1
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +0 -54
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +0 -1
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +0 -88
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +0 -1
- package/dist/task/backend/sudocode/backend.d.ts +0 -155
- package/dist/task/backend/sudocode/backend.d.ts.map +0 -1
- package/dist/task/backend/sudocode/backend.js +0 -942
- package/dist/task/backend/sudocode/backend.js.map +0 -1
- package/dist/task/backend/sudocode/client.d.ts +0 -303
- package/dist/task/backend/sudocode/client.d.ts.map +0 -1
- package/dist/task/backend/sudocode/client.js +0 -101
- package/dist/task/backend/sudocode/client.js.map +0 -1
- package/dist/task/backend/sudocode/index.d.ts +0 -19
- package/dist/task/backend/sudocode/index.d.ts.map +0 -1
- package/dist/task/backend/sudocode/index.js +0 -17
- package/dist/task/backend/sudocode/index.js.map +0 -1
- package/dist/task/backend/sudocode/mapping.d.ts +0 -51
- package/dist/task/backend/sudocode/mapping.d.ts.map +0 -1
- package/dist/task/backend/sudocode/mapping.js +0 -86
- package/dist/task/backend/sudocode/mapping.js.map +0 -1
- package/dist/task/backend/sudocode/server-client.d.ts +0 -56
- package/dist/task/backend/sudocode/server-client.d.ts.map +0 -1
- package/dist/task/backend/sudocode/server-client.js +0 -367
- package/dist/task/backend/sudocode/server-client.js.map +0 -1
- package/dist/task/backend/sudocode/standalone-client.d.ts +0 -91
- package/dist/task/backend/sudocode/standalone-client.d.ts.map +0 -1
- package/dist/task/backend/sudocode/standalone-client.js +0 -476
- package/dist/task/backend/sudocode/standalone-client.js.map +0 -1
- package/dist/task/backend/sudocode/sync-policy.d.ts +0 -166
- package/dist/task/backend/sudocode/sync-policy.d.ts.map +0 -1
- package/dist/task/backend/sudocode/sync-policy.js +0 -221
- package/dist/task/backend/sudocode/sync-policy.js.map +0 -1
- package/dist/task/backend/sudocode/tools.d.ts +0 -87
- package/dist/task/backend/sudocode/tools.d.ts.map +0 -1
- package/dist/task/backend/sudocode/tools.js +0 -743
- package/dist/task/backend/sudocode/tools.js.map +0 -1
- package/dist/task/backend/tool-provider.d.ts +0 -56
- package/dist/task/backend/tool-provider.d.ts.map +0 -1
- package/dist/task/backend/tool-provider.js +0 -424
- package/dist/task/backend/tool-provider.js.map +0 -1
- package/dist/task/backend/types.d.ts +0 -297
- package/dist/task/backend/types.d.ts.map +0 -1
- package/dist/task/backend/types.js +0 -27
- package/dist/task/backend/types.js.map +0 -1
- package/dist/task/backend/unified-tool-provider.d.ts +0 -57
- package/dist/task/backend/unified-tool-provider.d.ts.map +0 -1
- package/dist/task/backend/unified-tool-provider.js +0 -623
- package/dist/task/backend/unified-tool-provider.js.map +0 -1
- package/dist/task/index.d.ts +0 -7
- package/dist/task/index.d.ts.map +0 -1
- package/dist/task/index.js +0 -7
- package/dist/task/index.js.map +0 -1
- package/dist/task/retry-policy.d.ts +0 -89
- package/dist/task/retry-policy.d.ts.map +0 -1
- package/dist/task/retry-policy.js +0 -160
- package/dist/task/retry-policy.js.map +0 -1
- package/dist/task/task-manager.d.ts +0 -70
- package/dist/task/task-manager.d.ts.map +0 -1
- package/dist/task/task-manager.js +0 -319
- package/dist/task/task-manager.js.map +0 -1
- package/dist/task/types.d.ts +0 -72
- package/dist/task/types.d.ts.map +0 -1
- package/dist/task/types.js +0 -33
- package/dist/task/types.js.map +0 -1
- package/dist/teams/team-runtime.d.ts +0 -139
- package/dist/teams/team-runtime.d.ts.map +0 -1
- package/dist/teams/team-runtime.js +0 -615
- package/dist/teams/team-runtime.js.map +0 -1
- package/dist/trigger/router/index.d.ts +0 -11
- package/dist/trigger/router/index.d.ts.map +0 -1
- package/dist/trigger/router/index.js +0 -10
- package/dist/trigger/router/index.js.map +0 -1
- package/dist/trigger/router/strategies/ai-router-strategy.d.ts +0 -34
- package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +0 -1
- package/dist/trigger/router/strategies/ai-router-strategy.js +0 -359
- package/dist/trigger/router/strategies/ai-router-strategy.js.map +0 -1
- package/dist/trigger/router/strategies/direct-strategy.d.ts +0 -32
- package/dist/trigger/router/strategies/direct-strategy.d.ts.map +0 -1
- package/dist/trigger/router/strategies/direct-strategy.js +0 -119
- package/dist/trigger/router/strategies/direct-strategy.js.map +0 -1
- package/dist/trigger/router/strategies/index.d.ts +0 -11
- package/dist/trigger/router/strategies/index.d.ts.map +0 -1
- package/dist/trigger/router/strategies/index.js +0 -11
- package/dist/trigger/router/strategies/index.js.map +0 -1
- package/dist/trigger/router/strategies/role-strategy.d.ts +0 -39
- package/dist/trigger/router/strategies/role-strategy.d.ts.map +0 -1
- package/dist/trigger/router/strategies/role-strategy.js +0 -207
- package/dist/trigger/router/strategies/role-strategy.js.map +0 -1
- package/dist/trigger/router/trigger-router.d.ts +0 -54
- package/dist/trigger/router/trigger-router.d.ts.map +0 -1
- package/dist/trigger/router/trigger-router.js +0 -362
- package/dist/trigger/router/trigger-router.js.map +0 -1
- package/dist/trigger/router/types.d.ts +0 -225
- package/dist/trigger/router/types.d.ts.map +0 -1
- package/dist/trigger/router/types.js +0 -10
- package/dist/trigger/router/types.js.map +0 -1
- package/dist/trigger/trigger-system.d.ts +0 -77
- package/dist/trigger/trigger-system.d.ts.map +0 -1
- package/dist/trigger/trigger-system.js +0 -84
- package/dist/trigger/trigger-system.js.map +0 -1
- package/references/acp-factory-ref/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/LICENSE +0 -21
- package/references/acp-factory-ref/README.md +0 -341
- package/references/acp-factory-ref/package-lock.json +0 -3102
- package/references/acp-factory-ref/package.json +0 -96
- package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/python/LICENSE +0 -21
- package/references/acp-factory-ref/python/Makefile +0 -57
- package/references/acp-factory-ref/python/README.md +0 -253
- package/references/acp-factory-ref/python/pyproject.toml +0 -73
- package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
- package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
- package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
- package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
- package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
- package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
- package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
- package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
- package/references/claude-code-acp/.prettierrc.json +0 -4
- package/references/claude-code-acp/CHANGELOG.md +0 -249
- package/references/claude-code-acp/LICENSE +0 -222
- package/references/claude-code-acp/README.md +0 -53
- package/references/claude-code-acp/docs/RELEASES.md +0 -24
- package/references/claude-code-acp/eslint.config.js +0 -48
- package/references/claude-code-acp/package-lock.json +0 -4570
- package/references/claude-code-acp/package.json +0 -88
- package/references/claude-code-acp/scripts/release.sh +0 -119
- package/references/claude-code-acp/src/acp-agent.ts +0 -2076
- package/references/claude-code-acp/src/index.ts +0 -26
- package/references/claude-code-acp/src/lib.ts +0 -38
- package/references/claude-code-acp/src/mcp-server.ts +0 -911
- package/references/claude-code-acp/src/settings.ts +0 -522
- package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
- package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
- package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
- package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
- package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
- package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
- package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
- package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
- package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
- package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
- package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
- package/references/claude-code-acp/src/tools.ts +0 -819
- package/references/claude-code-acp/src/utils.ts +0 -171
- package/references/claude-code-acp/tsconfig.json +0 -18
- package/references/claude-code-acp/vitest.config.ts +0 -19
- package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
- package/references/multi-agent-protocol/LICENSE +0 -21
- package/references/multi-agent-protocol/README.md +0 -113
- package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
- package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
- package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
- package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
- package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
- package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
- package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
- package/references/multi-agent-protocol/docs/07-federation.md +0 -259
- package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
- package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
- package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
- package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
- package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
- package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
- package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
- package/references/multi-agent-protocol/docs-site/README.md +0 -82
- package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
- package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
- package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
- package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
- package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
- package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
- package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
- package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
- package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
- package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
- package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
- package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
- package/references/multi-agent-protocol/docs-site/index.md +0 -136
- package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
- package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
- package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
- package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
- package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
- package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
- package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
- package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
- package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
- package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
- package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
- package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
- package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
- package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
- package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
- package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
- package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
- package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
- package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
- package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
- package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
- package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
- package/references/multi-agent-protocol/package-lock.json +0 -3886
- package/references/multi-agent-protocol/package.json +0 -56
- package/references/multi-agent-protocol/schema/meta.json +0 -467
- package/references/multi-agent-protocol/schema/schema.json +0 -2558
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +0 -761
- package/src/__tests__/e2e/cascade-termination.e2e.test.ts +0 -588
- package/src/__tests__/e2e/conflict-resolution-flow.e2e.test.ts +0 -790
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +0 -714
- package/src/__tests__/e2e/full-agent-orchestration.e2e.test.ts +0 -536
- package/src/__tests__/e2e/mcp-server-debug.e2e.test.ts +0 -372
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +0 -304
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +0 -324
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +0 -1527
- package/src/__tests__/e2e/multi-coordinator.e2e.test.ts +0 -602
- package/src/__tests__/e2e/orchestration-flow.e2e.test.ts +0 -686
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +0 -563
- package/src/__tests__/e2e/steering-task.e2e.test.ts +0 -840
- package/src/__tests__/integration.e2e.test.ts +0 -407
- package/src/acp/__tests__/combined-websocket-server.test.ts +0 -260
- package/src/acp/__tests__/history.test.ts +0 -530
- package/src/acp/__tests__/integration.test.ts +0 -1049
- package/src/acp/__tests__/multi-client-mounting.test.ts +0 -303
- package/src/acp/__tests__/session-persistence.test.ts +0 -276
- package/src/acp/__tests__/websocket-full.e2e.test.ts +0 -401
- package/src/acp/__tests__/websocket-integration.test.ts +0 -484
- package/src/acp/__tests__/websocket-stream.test.ts +0 -281
- package/src/acp/__tests__/websocket.e2e.test.ts +0 -390
- package/src/acp/websocket-stream.ts +0 -140
- package/src/activity/__tests__/deduplication.test.ts +0 -345
- package/src/activity/__tests__/relevance.test.ts +0 -347
- package/src/activity/__tests__/watcher.test.ts +0 -344
- package/src/activity/deduplication.ts +0 -219
- package/src/activity/index.ts +0 -51
- package/src/activity/relevance.ts +0 -258
- package/src/activity/types.ts +0 -263
- package/src/activity/watcher.ts +0 -345
- package/src/agent/__tests__/agent-manager.test.ts +0 -1382
- package/src/agent/__tests__/wake.test.ts +0 -768
- package/src/agent/wake.ts +0 -357
- package/src/api/__tests__/conversation-api.test.ts +0 -468
- package/src/cli/__tests__/acp.test.ts +0 -214
- package/src/lifecycle/__tests__/cascade-termination.test.ts +0 -919
- package/src/lifecycle/__tests__/cascade.test.ts +0 -595
- package/src/lifecycle/__tests__/cleanup.test.ts +0 -322
- package/src/lifecycle/__tests__/handlers.test.ts +0 -1826
- package/src/lifecycle/__tests__/lifecycle.e2e.test.ts +0 -354
- package/src/lifecycle/__tests__/merge-queue.e2e.test.ts +0 -602
- package/src/lifecycle/handlers/generic.ts +0 -87
- package/src/lifecycle/handlers/index.ts +0 -166
- package/src/lifecycle/handlers/integrator.ts +0 -672
- package/src/lifecycle/handlers/monitor.ts +0 -114
- package/src/lifecycle/handlers/worker.ts +0 -506
- package/src/mail/__tests__/conversation-lifecycle.test.ts +0 -409
- package/src/mail/__tests__/eventstore-stores.test.ts +0 -1073
- package/src/mail/__tests__/mail-full-agent.e2e.test.ts +0 -575
- package/src/mail/__tests__/mail-integration.test.ts +0 -759
- package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +0 -1068
- package/src/mail/__tests__/mail-service.test.ts +0 -506
- package/src/mail/__tests__/turn-recorder.test.ts +0 -328
- package/src/mail/conversation-map.ts +0 -107
- package/src/mail/index.ts +0 -25
- package/src/mail/mail-service.ts +0 -257
- package/src/mail/stores/eventstore-conversation-store.ts +0 -146
- package/src/mail/stores/eventstore-participant-store.ts +0 -172
- package/src/mail/stores/eventstore-thread-store.ts +0 -129
- package/src/mail/stores/eventstore-turn-store.ts +0 -173
- package/src/mail/stores/index.ts +0 -12
- package/src/mail/stores/types.ts +0 -160
- package/src/mail/turn-recorder.ts +0 -124
- package/src/map/README.md +0 -79
- package/src/map/__tests__/adapter-types.test.ts +0 -326
- package/src/map/__tests__/interface-types.test.ts +0 -342
- package/src/map/__tests__/types.test.ts +0 -411
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +0 -820
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +0 -355
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +0 -1386
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +0 -440
- package/src/map/adapter/__tests__/connection-manager.test.ts +0 -344
- package/src/map/adapter/__tests__/event-broadcast.test.ts +0 -420
- package/src/map/adapter/__tests__/event-log.test.ts +0 -527
- package/src/map/adapter/__tests__/event-translator.test.ts +0 -550
- package/src/map/adapter/__tests__/extensions.test.ts +0 -1387
- package/src/map/adapter/__tests__/map-adapter.test.ts +0 -926
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +0 -1187
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +0 -711
- package/src/map/adapter/__tests__/rpc-handler.test.ts +0 -644
- package/src/map/adapter/__tests__/subscription-manager.test.ts +0 -536
- package/src/map/adapter/__tests__/websocket-integration.test.ts +0 -487
- package/src/map/adapter/__tests__/workspace-files.test.ts +0 -673
- package/src/map/adapter/acp-over-map.ts +0 -1483
- package/src/map/adapter/connection-manager.ts +0 -400
- package/src/map/adapter/event-log.ts +0 -208
- package/src/map/adapter/event-translator.ts +0 -415
- package/src/map/adapter/extensions/agent-detection.ts +0 -201
- package/src/map/adapter/extensions/agent-lifecycle.ts +0 -267
- package/src/map/adapter/extensions/index.ts +0 -280
- package/src/map/adapter/extensions/mcp-bridge.ts +0 -995
- package/src/map/adapter/extensions/resume.ts +0 -114
- package/src/map/adapter/extensions/task.ts +0 -326
- package/src/map/adapter/extensions/update-metadata.ts +0 -126
- package/src/map/adapter/extensions/wake.ts +0 -239
- package/src/map/adapter/extensions/workspace-files.ts +0 -449
- package/src/map/adapter/extensions/workspace.ts +0 -176
- package/src/map/adapter/index.ts +0 -158
- package/src/map/adapter/interface.ts +0 -581
- package/src/map/adapter/mail-handler-adapter.ts +0 -429
- package/src/map/adapter/map-adapter.ts +0 -1749
- package/src/map/adapter/rpc-handler.ts +0 -604
- package/src/map/adapter/subscription-manager.ts +0 -474
- package/src/map/adapter/types.ts +0 -259
- package/src/map/adapter/websocket-integration.ts +0 -229
- package/src/map/federation/__tests__/envelope.test.ts +0 -362
- package/src/map/federation/__tests__/federation-handler.test.ts +0 -461
- package/src/map/federation/envelope.ts +0 -243
- package/src/map/federation/federation-handler.ts +0 -442
- package/src/map/federation/index.ts +0 -65
- package/src/map/federation/types.ts +0 -344
- package/src/mcp/__tests__/map-client.test.ts +0 -386
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +0 -368
- package/src/mcp/__tests__/mcp-server.test.ts +0 -1002
- package/src/mcp/map-client.ts +0 -177
- package/src/mcp/mcp-server.ts +0 -1395
- package/src/mcp/tools/__tests__/done.test.ts +0 -484
- package/src/mcp/tools/claim_task.ts +0 -86
- package/src/mcp/tools/done.ts +0 -338
- package/src/mcp/tools/inject_context.ts +0 -173
- package/src/mcp/tools/list_claimable_tasks.ts +0 -93
- package/src/mcp/tools/unclaim_task.ts +0 -71
- package/src/mcp/tools/wait_for_activity.ts +0 -185
- package/src/monitor/__tests__/health-check-service.test.ts +0 -425
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +0 -393
- package/src/monitor/__tests__/stall-detector.test.ts +0 -395
- package/src/monitor/health-check-service.ts +0 -359
- package/src/monitor/index.ts +0 -28
- package/src/monitor/stall-detector.ts +0 -238
- package/src/peer/__tests__/capability-manager.test.ts +0 -454
- package/src/peer/__tests__/encapsulation-manager.test.ts +0 -787
- package/src/peer/__tests__/federation-manager.test.ts +0 -828
- package/src/peer/__tests__/hierarchy-errors.test.ts +0 -307
- package/src/peer/__tests__/peer-manager.test.ts +0 -535
- package/src/peer/__tests__/task-delegation.test.ts +0 -741
- package/src/peer/capability-manager.ts +0 -289
- package/src/peer/encapsulation-manager.ts +0 -831
- package/src/peer/federation-manager.ts +0 -897
- package/src/peer/hierarchy-errors.ts +0 -382
- package/src/peer/hierarchy-protocol.ts +0 -328
- package/src/peer/index.ts +0 -15
- package/src/peer/peer-manager.ts +0 -540
- package/src/peer/task-delegation.ts +0 -594
- package/src/peer/transports/__tests__/local-transport.test.ts +0 -355
- package/src/peer/transports/__tests__/websocket-transport.test.ts +0 -270
- package/src/peer/transports/index.ts +0 -18
- package/src/peer/transports/local-transport.ts +0 -348
- package/src/peer/transports/websocket-transport.ts +0 -452
- package/src/peer/types.ts +0 -331
- package/src/roles/__tests__/capability-enforcement.test.ts +0 -989
- package/src/roles/__tests__/message-routing.e2e.test.ts +0 -464
- package/src/roles/__tests__/role-resolution.test.ts +0 -576
- package/src/router/README.md +0 -120
- package/src/router/__tests__/address-resolver.test.ts +0 -340
- package/src/router/__tests__/broadcast.test.ts +0 -185
- package/src/router/__tests__/message-router.test.ts +0 -1070
- package/src/router/__tests__/role-channel.test.ts +0 -213
- package/src/router/__tests__/send-to-address.test.ts +0 -731
- package/src/router/__tests__/wake.test.ts +0 -459
- package/src/router/address-resolver.ts +0 -303
- package/src/router/broadcast.ts +0 -117
- package/src/router/channels.ts +0 -283
- package/src/router/index.ts +0 -148
- package/src/router/message-router.ts +0 -1392
- package/src/router/message-types.ts +0 -294
- package/src/router/role-resolver.ts +0 -164
- package/src/router/signals.ts +0 -335
- package/src/router/types.ts +0 -306
- package/src/router/wake.ts +0 -270
- package/src/server/__tests__/combined-server.test.ts +0 -360
- package/src/server/combined-server.ts +0 -530
- package/src/steering/__tests__/inject.test.ts +0 -405
- package/src/steering/__tests__/injection.e2e.test.ts +0 -932
- package/src/steering/__tests__/steering-integration.test.ts +0 -747
- package/src/steering/index.ts +0 -25
- package/src/steering/inject.ts +0 -262
- package/src/steering/types.ts +0 -143
- package/src/store/README.md +0 -134
- package/src/store/__tests__/event-store.test.ts +0 -1446
- package/src/store/__tests__/instance.test.ts +0 -556
- package/src/store/__tests__/migrations.test.ts +0 -109
- package/src/store/backends/__tests__/memory-backend.test.ts +0 -383
- package/src/store/backends/__tests__/sqlite-backend.test.ts +0 -427
- package/src/store/backends/index.ts +0 -42
- package/src/store/backends/json-backend.ts +0 -295
- package/src/store/backends/memory-backend.ts +0 -256
- package/src/store/backends/sqlite-backend.ts +0 -337
- package/src/store/backends/tinybase-backend.ts +0 -276
- package/src/store/backends/types.ts +0 -252
- package/src/store/event-store.ts +0 -2204
- package/src/store/instance.ts +0 -681
- package/src/store/migrations.ts +0 -96
- package/src/store/types/config.ts +0 -19
- package/src/store/types/conversations.ts +0 -129
- package/src/store/types/sessions.ts +0 -53
- package/src/task/__tests__/retry-policy.test.ts +0 -409
- package/src/task/__tests__/task-integration.test.ts +0 -457
- package/src/task/__tests__/task-manager.test.ts +0 -815
- package/src/task/backend/__tests__/create-task-backend.test.ts +0 -225
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +0 -524
- package/src/task/backend/__tests__/memory.test.ts +0 -1274
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +0 -579
- package/src/task/backend/index.ts +0 -310
- package/src/task/backend/memory.ts +0 -828
- package/src/task/backend/opentasks/__tests__/backend.test.ts +0 -968
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +0 -406
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +0 -84
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +0 -1338
- package/src/task/backend/opentasks/backend.ts +0 -1323
- package/src/task/backend/opentasks/client.ts +0 -652
- package/src/task/backend/opentasks/daemon-manager.ts +0 -253
- package/src/task/backend/opentasks/index.ts +0 -69
- package/src/task/backend/opentasks/mapping.ts +0 -94
- package/src/task/backend/types.ts +0 -458
- package/src/task/backend/unified-tool-provider.ts +0 -779
- package/src/task/index.ts +0 -7
- package/src/task/retry-policy.ts +0 -204
- package/src/task/task-manager.ts +0 -515
- package/src/task/types.ts +0 -136
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +0 -983
- package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +0 -553
- package/src/teams/__tests__/team-system.test.ts +0 -1280
- package/src/teams/team-runtime.ts +0 -729
- package/src/trigger/CLAUDE.md +0 -308
- package/src/trigger/README.md +0 -429
- package/src/trigger/__tests__/macro-agent-regression.test.ts +0 -946
- package/src/trigger/__tests__/routing-strategies.test.ts +0 -329
- package/src/trigger/__tests__/trigger-router.test.ts +0 -433
- package/src/trigger/__tests__/trigger-system-integration.test.ts +0 -581
- package/src/trigger/router/index.ts +0 -36
- package/src/trigger/router/strategies/ai-router-strategy.ts +0 -481
- package/src/trigger/router/strategies/direct-strategy.ts +0 -162
- package/src/trigger/router/strategies/index.ts +0 -26
- package/src/trigger/router/strategies/role-strategy.ts +0 -274
- package/src/trigger/router/trigger-router.ts +0 -463
- package/src/trigger/router/types.ts +0 -273
- package/src/trigger/trigger-system.ts +0 -206
- package/src/workspace/__tests__/multi-coordinator.test.ts +0 -1005
- package/src/workspace/__tests__/workspace-manager.test.ts +0 -391
- package/src/workspace/__tests__/workspace.e2e.test.ts +0 -1155
- package/src/workspace/merge-queue/__tests__/hierarchical-consolidation.e2e.test.ts +0 -414
- package/test_fixtures/harness/__tests__/behavior-executor-and-stepper.test.ts +0 -714
- package/test_fixtures/harness/__tests__/fixtures.test.ts +0 -347
- package/test_fixtures/harness/__tests__/merge-queue-and-worktrees.test.ts +0 -452
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -422
- package/test_fixtures/harness/__tests__/test-harness-and-assertions.test.ts +0 -568
- /package/{references/acp-factory-ref/python/tests/__init__.py → .opentasks/graph.jsonl} +0 -0
|
@@ -1,1527 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Agent E2E Tests
|
|
3
|
-
*
|
|
4
|
-
* Comprehensive E2E tests for multi-agent lifecycle, WebSocket ACP multi-client,
|
|
5
|
-
* and inter-agent communication.
|
|
6
|
-
*
|
|
7
|
-
* REQUIRES: RUN_FULL_AGENT_TESTS=true environment variable (and authenticated Claude Code)
|
|
8
|
-
* REQUIRES: RUN_FULL_AGENT_TESTS=true environment variable (and authenticated Claude Code)
|
|
9
|
-
*
|
|
10
|
-
* Run with:
|
|
11
|
-
* RUN_FULL_AGENT_TESTS=true npm run test:e2e -- src/__tests__/e2e/multi-agent.e2e.test.ts
|
|
12
|
-
* RUN_FULL_AGENT_TESTS=true npm run test:e2e -- src/__tests__/e2e/multi-agent.e2e.test.ts
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
describe,
|
|
17
|
-
it,
|
|
18
|
-
expect,
|
|
19
|
-
beforeEach,
|
|
20
|
-
afterEach,
|
|
21
|
-
beforeAll,
|
|
22
|
-
afterAll,
|
|
23
|
-
} from "vitest";
|
|
24
|
-
import { WebSocket } from "ws";
|
|
25
|
-
import * as fs from "fs";
|
|
26
|
-
import * as path from "path";
|
|
27
|
-
import * as os from "os";
|
|
28
|
-
import { execSync } from "child_process";
|
|
29
|
-
import { createEventStore, type EventStore } from "../../store/event-store.js";
|
|
30
|
-
import {
|
|
31
|
-
createAgentManager,
|
|
32
|
-
type AgentManager,
|
|
33
|
-
} from "../../agent/agent-manager.js";
|
|
34
|
-
import {
|
|
35
|
-
createTaskManager,
|
|
36
|
-
type TaskManager,
|
|
37
|
-
} from "../../task/task-manager.js";
|
|
38
|
-
import {
|
|
39
|
-
createMessageRouter,
|
|
40
|
-
type MessageRouter,
|
|
41
|
-
} from "../../router/message-router.js";
|
|
42
|
-
import {
|
|
43
|
-
createWebSocketACPServer,
|
|
44
|
-
type WebSocketACPServer,
|
|
45
|
-
} from "../../acp/websocket-server.js";
|
|
46
|
-
|
|
47
|
-
// ─────────────────────────────────────────────────────────────────
|
|
48
|
-
// Test Configuration
|
|
49
|
-
// ─────────────────────────────────────────────────────────────────
|
|
50
|
-
|
|
51
|
-
const RUN_FULL_AGENT = !!process.env.RUN_FULL_AGENT_TESTS;
|
|
52
|
-
const testFn = RUN_FULL_AGENT ? it : it.skip;
|
|
53
|
-
|
|
54
|
-
// Timeouts for different test types
|
|
55
|
-
const TIMEOUT = {
|
|
56
|
-
SPAWN: 60000, // Single agent spawn
|
|
57
|
-
MULTI_SPAWN: 180000, // Multiple agent spawns
|
|
58
|
-
PROMPT: 90000, // Agent prompt with response
|
|
59
|
-
HIERARCHY: 120000, // Hierarchy operations
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Create an isolated test git repo to avoid polluting real repo
|
|
64
|
-
*/
|
|
65
|
-
function createTestRepo(prefix: string): { path: string; cleanup: () => void } {
|
|
66
|
-
const tmpDir = fs.mkdtempSync(
|
|
67
|
-
path.join(os.tmpdir(), `multi-agent-${prefix}-`),
|
|
68
|
-
);
|
|
69
|
-
const repoPath = path.join(tmpDir, "test-repo");
|
|
70
|
-
fs.mkdirSync(repoPath);
|
|
71
|
-
execSync("git init", { cwd: repoPath, stdio: "pipe" });
|
|
72
|
-
execSync('git config user.email "test@test.com"', {
|
|
73
|
-
cwd: repoPath,
|
|
74
|
-
stdio: "pipe",
|
|
75
|
-
});
|
|
76
|
-
execSync('git config user.name "Test User"', {
|
|
77
|
-
cwd: repoPath,
|
|
78
|
-
stdio: "pipe",
|
|
79
|
-
});
|
|
80
|
-
fs.writeFileSync(path.join(repoPath, "README.md"), "# Test Repo\n");
|
|
81
|
-
execSync("git add -A", { cwd: repoPath, stdio: "pipe" });
|
|
82
|
-
execSync('git commit -m "Initial commit"', { cwd: repoPath, stdio: "pipe" });
|
|
83
|
-
|
|
84
|
-
return {
|
|
85
|
-
path: repoPath,
|
|
86
|
-
cleanup: () => fs.rmSync(tmpDir, { recursive: true, force: true }),
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ─────────────────────────────────────────────────────────────────
|
|
91
|
-
// ACP Wire Protocol Client
|
|
92
|
-
// ─────────────────────────────────────────────────────────────────
|
|
93
|
-
|
|
94
|
-
interface JsonRpcMessage {
|
|
95
|
-
jsonrpc: "2.0";
|
|
96
|
-
id?: number;
|
|
97
|
-
method?: string;
|
|
98
|
-
params?: unknown;
|
|
99
|
-
result?: unknown;
|
|
100
|
-
error?: { code: number; message: string; data?: unknown };
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
class ACPTestClient {
|
|
104
|
-
private ws: WebSocket;
|
|
105
|
-
private waiters: Map<number, (msg: JsonRpcMessage) => void> = new Map();
|
|
106
|
-
private notifications: JsonRpcMessage[] = [];
|
|
107
|
-
private nextId = 1;
|
|
108
|
-
private connected = false;
|
|
109
|
-
private closeResolve?: () => void;
|
|
110
|
-
private closePromise: Promise<void>;
|
|
111
|
-
|
|
112
|
-
constructor(url: string) {
|
|
113
|
-
this.ws = new WebSocket(url);
|
|
114
|
-
this.closePromise = new Promise((resolve) => {
|
|
115
|
-
this.closeResolve = resolve;
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async connect(): Promise<void> {
|
|
120
|
-
return new Promise((resolve, reject) => {
|
|
121
|
-
const timeout = setTimeout(
|
|
122
|
-
() => reject(new Error("Connection timeout")),
|
|
123
|
-
10000,
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
this.ws.on("open", () => {
|
|
127
|
-
clearTimeout(timeout);
|
|
128
|
-
this.connected = true;
|
|
129
|
-
resolve();
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
this.ws.on("error", (err) => {
|
|
133
|
-
clearTimeout(timeout);
|
|
134
|
-
reject(err);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
this.ws.on("message", (data: Buffer) => {
|
|
138
|
-
try {
|
|
139
|
-
const msg = JSON.parse(data.toString()) as JsonRpcMessage;
|
|
140
|
-
if (msg.id !== undefined) {
|
|
141
|
-
const waiter = this.waiters.get(msg.id);
|
|
142
|
-
if (waiter) {
|
|
143
|
-
this.waiters.delete(msg.id);
|
|
144
|
-
waiter(msg);
|
|
145
|
-
}
|
|
146
|
-
} else {
|
|
147
|
-
this.notifications.push(msg);
|
|
148
|
-
}
|
|
149
|
-
} catch {
|
|
150
|
-
// Ignore parse errors
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
this.ws.on("close", () => {
|
|
155
|
-
this.connected = false;
|
|
156
|
-
this.closeResolve?.();
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async request(
|
|
162
|
-
method: string,
|
|
163
|
-
params?: unknown,
|
|
164
|
-
timeoutMs = 30000,
|
|
165
|
-
): Promise<JsonRpcMessage> {
|
|
166
|
-
const id = this.nextId++;
|
|
167
|
-
return new Promise((resolve, reject) => {
|
|
168
|
-
const timeout = setTimeout(() => {
|
|
169
|
-
this.waiters.delete(id);
|
|
170
|
-
reject(new Error(`Timeout waiting for ${method}`));
|
|
171
|
-
}, timeoutMs);
|
|
172
|
-
|
|
173
|
-
this.waiters.set(id, (response) => {
|
|
174
|
-
clearTimeout(timeout);
|
|
175
|
-
resolve(response);
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
this.ws.send(JSON.stringify({ jsonrpc: "2.0", method, params, id }));
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
async initialize(): Promise<JsonRpcMessage> {
|
|
183
|
-
return this.request("initialize", {
|
|
184
|
-
protocolVersion: 1,
|
|
185
|
-
capabilities: {},
|
|
186
|
-
clientInfo: { name: "e2e-test-client", version: "1.0.0" },
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
async newSession(params: { cwd?: string } = {}): Promise<JsonRpcMessage> {
|
|
191
|
-
return this.request(
|
|
192
|
-
"session/new",
|
|
193
|
-
{
|
|
194
|
-
mcpServers: [],
|
|
195
|
-
...params,
|
|
196
|
-
},
|
|
197
|
-
60000,
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
async prompt(
|
|
202
|
-
sessionId: string,
|
|
203
|
-
text: string,
|
|
204
|
-
timeoutMs = 60000,
|
|
205
|
-
): Promise<JsonRpcMessage> {
|
|
206
|
-
return this.request(
|
|
207
|
-
"session/prompt",
|
|
208
|
-
{
|
|
209
|
-
sessionId,
|
|
210
|
-
prompt: [{ type: "text", text }],
|
|
211
|
-
},
|
|
212
|
-
timeoutMs,
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
async extMethod(
|
|
217
|
-
method: string,
|
|
218
|
-
params: unknown,
|
|
219
|
-
timeoutMs = 30000,
|
|
220
|
-
): Promise<JsonRpcMessage> {
|
|
221
|
-
return this.request(method, params, timeoutMs);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
getNotifications(): JsonRpcMessage[] {
|
|
225
|
-
return [...this.notifications];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
clearNotifications(): void {
|
|
229
|
-
this.notifications.length = 0;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
close(): void {
|
|
233
|
-
if (this.ws.readyState === WebSocket.OPEN) {
|
|
234
|
-
this.ws.close();
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
async waitForClose(): Promise<void> {
|
|
239
|
-
return this.closePromise;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
get isConnected(): boolean {
|
|
243
|
-
return this.connected && this.ws.readyState === WebSocket.OPEN;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// ─────────────────────────────────────────────────────────────────
|
|
248
|
-
// Test Helpers
|
|
249
|
-
// ─────────────────────────────────────────────────────────────────
|
|
250
|
-
|
|
251
|
-
function log(message: string): void {
|
|
252
|
-
console.log(`[E2E] ${message}`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
function logError(message: string, error?: unknown): void {
|
|
256
|
-
console.error(`[E2E ERROR] ${message}`, error);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// ─────────────────────────────────────────────────────────────────
|
|
260
|
-
// Part 1: Multi-Agent Lifecycle Tests
|
|
261
|
-
// ─────────────────────────────────────────────────────────────────
|
|
262
|
-
|
|
263
|
-
describe("Part 1: Multi-Agent Lifecycle E2E", () => {
|
|
264
|
-
let eventStore: EventStore;
|
|
265
|
-
let agentManager: AgentManager;
|
|
266
|
-
let taskManager: TaskManager;
|
|
267
|
-
let messageRouter: MessageRouter;
|
|
268
|
-
let server: WebSocketACPServer;
|
|
269
|
-
let testPort: number;
|
|
270
|
-
let testRepo: { path: string; cleanup: () => void };
|
|
271
|
-
let testInstanceId: string;
|
|
272
|
-
const clients: ACPTestClient[] = [];
|
|
273
|
-
|
|
274
|
-
beforeEach(async () => {
|
|
275
|
-
if (!RUN_FULL_AGENT) {
|
|
276
|
-
log("⚠️ Skipping: RUN_FULL_AGENT_TESTS not set");
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Create isolated test repo to avoid polluting real repo
|
|
281
|
-
testRepo = createTestRepo("lifecycle");
|
|
282
|
-
|
|
283
|
-
// Create services with file-based storage (required for MCP subprocess access)
|
|
284
|
-
testInstanceId = `lifecycle-e2e-${Date.now()}`;
|
|
285
|
-
eventStore = await createEventStore({
|
|
286
|
-
instanceId: testInstanceId,
|
|
287
|
-
baseDir: testRepo.path,
|
|
288
|
-
});
|
|
289
|
-
messageRouter = createMessageRouter(eventStore);
|
|
290
|
-
taskManager = createTaskManager(eventStore);
|
|
291
|
-
agentManager = createAgentManager(eventStore, messageRouter, {
|
|
292
|
-
defaultPermissionMode: "auto-approve",
|
|
293
|
-
defaultCwd: testRepo.path,
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// Start WebSocket server
|
|
297
|
-
testPort = 10000 + Math.floor(Math.random() * 50000);
|
|
298
|
-
server = createWebSocketACPServer(
|
|
299
|
-
{ eventStore, agentManager, taskManager },
|
|
300
|
-
{ port: testPort, host: "localhost", path: "/acp" },
|
|
301
|
-
);
|
|
302
|
-
await server.start();
|
|
303
|
-
log(`Server started on port ${testPort}`);
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
afterEach(async () => {
|
|
307
|
-
if (!RUN_FULL_AGENT) return;
|
|
308
|
-
|
|
309
|
-
// Close all clients
|
|
310
|
-
for (const client of clients) {
|
|
311
|
-
client.close();
|
|
312
|
-
}
|
|
313
|
-
clients.length = 0;
|
|
314
|
-
|
|
315
|
-
// Terminate all agents
|
|
316
|
-
try {
|
|
317
|
-
const heads = agentManager.listHeadManagers();
|
|
318
|
-
for (const head of heads) {
|
|
319
|
-
try {
|
|
320
|
-
await agentManager.terminate(head.id, "test_cleanup");
|
|
321
|
-
} catch {
|
|
322
|
-
// Ignore termination errors during cleanup
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
} catch {
|
|
326
|
-
// Ignore errors during cleanup
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// Stop server and services
|
|
330
|
-
await server?.stop();
|
|
331
|
-
await agentManager?.close();
|
|
332
|
-
await eventStore?.close();
|
|
333
|
-
testRepo?.cleanup();
|
|
334
|
-
log("Cleanup complete");
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
describe("SPAWN: Agent Spawning", () => {
|
|
338
|
-
testFn(
|
|
339
|
-
"SPAWN-01: should create session and spawn head manager agent",
|
|
340
|
-
async () => {
|
|
341
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
342
|
-
clients.push(client);
|
|
343
|
-
|
|
344
|
-
await client.connect();
|
|
345
|
-
expect(client.isConnected).toBe(true);
|
|
346
|
-
|
|
347
|
-
const initResult = await client.initialize();
|
|
348
|
-
expect(initResult.error).toBeUndefined();
|
|
349
|
-
expect(initResult.result).toBeDefined();
|
|
350
|
-
log("✓ Client initialized");
|
|
351
|
-
|
|
352
|
-
// Create session (spawns head manager)
|
|
353
|
-
const sessionResult = await client.newSession({ cwd: testRepo.path });
|
|
354
|
-
expect(sessionResult.error).toBeUndefined();
|
|
355
|
-
expect(sessionResult.result).toBeDefined();
|
|
356
|
-
|
|
357
|
-
const session = sessionResult.result as { sessionId: string };
|
|
358
|
-
expect(session.sessionId).toBeDefined();
|
|
359
|
-
log(`✓ Session created: ${session.sessionId}`);
|
|
360
|
-
|
|
361
|
-
// Verify agent exists in EventStore
|
|
362
|
-
const agents = agentManager.list();
|
|
363
|
-
expect(agents.length).toBeGreaterThanOrEqual(1);
|
|
364
|
-
log(`✓ Agent count: ${agents.length}`);
|
|
365
|
-
|
|
366
|
-
// Verify spawn event was emitted
|
|
367
|
-
const spawnEvents = eventStore.query({ type: "spawn" });
|
|
368
|
-
expect(spawnEvents.length).toBeGreaterThanOrEqual(1);
|
|
369
|
-
log(`✓ Spawn events: ${spawnEvents.length}`);
|
|
370
|
-
},
|
|
371
|
-
{ timeout: TIMEOUT.SPAWN },
|
|
372
|
-
);
|
|
373
|
-
|
|
374
|
-
testFn(
|
|
375
|
-
"SPAWN-05: should spawn multiple children from same parent via extension",
|
|
376
|
-
async () => {
|
|
377
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
378
|
-
clients.push(client);
|
|
379
|
-
|
|
380
|
-
await client.connect();
|
|
381
|
-
await client.initialize();
|
|
382
|
-
|
|
383
|
-
// Create head manager session
|
|
384
|
-
const sessionResult = await client.newSession({ cwd: testRepo.path });
|
|
385
|
-
const session = sessionResult.result as { sessionId: string };
|
|
386
|
-
log(`✓ Head manager session: ${session.sessionId}`);
|
|
387
|
-
|
|
388
|
-
// Get the head manager's agent ID
|
|
389
|
-
const headManagers = agentManager.listHeadManagers();
|
|
390
|
-
expect(headManagers.length).toBeGreaterThanOrEqual(1);
|
|
391
|
-
const headManagerId = headManagers[0].id;
|
|
392
|
-
log(`✓ Head manager ID: ${headManagerId}`);
|
|
393
|
-
|
|
394
|
-
// Spawn first child via extension
|
|
395
|
-
const spawn1Result = await client.extMethod("_macro/spawnAgent", {
|
|
396
|
-
task_description: "Worker 1 - Process data",
|
|
397
|
-
parentId: headManagerId,
|
|
398
|
-
});
|
|
399
|
-
expect(spawn1Result.error).toBeUndefined();
|
|
400
|
-
const child1 = spawn1Result.result as { agentId: string };
|
|
401
|
-
log(`✓ Child 1 spawned: ${child1.agentId}`);
|
|
402
|
-
|
|
403
|
-
// Spawn second child via extension
|
|
404
|
-
const spawn2Result = await client.extMethod("_macro/spawnAgent", {
|
|
405
|
-
task_description: "Worker 2 - Analyze results",
|
|
406
|
-
parentId: headManagerId,
|
|
407
|
-
});
|
|
408
|
-
expect(spawn2Result.error).toBeUndefined();
|
|
409
|
-
const child2 = spawn2Result.result as { agentId: string };
|
|
410
|
-
log(`✓ Child 2 spawned: ${child2.agentId}`);
|
|
411
|
-
|
|
412
|
-
// Verify both children exist
|
|
413
|
-
const children = agentManager.getChildren(headManagerId);
|
|
414
|
-
expect(children.length).toBe(2);
|
|
415
|
-
log(`✓ Children count: ${children.length}`);
|
|
416
|
-
|
|
417
|
-
// Verify both have the same parent
|
|
418
|
-
expect(children[0].parent).toBe(headManagerId);
|
|
419
|
-
expect(children[1].parent).toBe(headManagerId);
|
|
420
|
-
log("✓ Both children have correct parent");
|
|
421
|
-
},
|
|
422
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
423
|
-
);
|
|
424
|
-
|
|
425
|
-
testFn(
|
|
426
|
-
"SPAWN-06: should maintain correct lineage in 3-level hierarchy",
|
|
427
|
-
async () => {
|
|
428
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
429
|
-
clients.push(client);
|
|
430
|
-
|
|
431
|
-
await client.connect();
|
|
432
|
-
await client.initialize();
|
|
433
|
-
|
|
434
|
-
// Create head manager (Level 0)
|
|
435
|
-
const sessionResult = await client.newSession({ cwd: testRepo.path });
|
|
436
|
-
const session = sessionResult.result as { sessionId: string };
|
|
437
|
-
const headManagers = agentManager.listHeadManagers();
|
|
438
|
-
const level0Id = headManagers[0].id;
|
|
439
|
-
log(`✓ Level 0 (Head): ${level0Id}`);
|
|
440
|
-
|
|
441
|
-
// Spawn Level 1 agent
|
|
442
|
-
const spawn1Result = await client.extMethod("_macro/spawnAgent", {
|
|
443
|
-
task_description: "Level 1 - Team Lead",
|
|
444
|
-
parentId: level0Id,
|
|
445
|
-
});
|
|
446
|
-
expect(spawn1Result.error).toBeUndefined();
|
|
447
|
-
const level1 = spawn1Result.result as { agentId: string };
|
|
448
|
-
log(`✓ Level 1 spawned: ${level1.agentId}`);
|
|
449
|
-
|
|
450
|
-
// Spawn Level 2 agent (child of Level 1)
|
|
451
|
-
const spawn2Result = await client.extMethod("_macro/spawnAgent", {
|
|
452
|
-
task_description: "Level 2 - Worker",
|
|
453
|
-
parentId: level1.agentId,
|
|
454
|
-
});
|
|
455
|
-
expect(spawn2Result.error).toBeUndefined();
|
|
456
|
-
const level2 = spawn2Result.result as { agentId: string };
|
|
457
|
-
log(`✓ Level 2 spawned: ${level2.agentId}`);
|
|
458
|
-
|
|
459
|
-
// Verify hierarchy structure
|
|
460
|
-
const hierarchy = agentManager.getHierarchy(level0Id);
|
|
461
|
-
expect(hierarchy).not.toBeNull();
|
|
462
|
-
expect(hierarchy!.depth).toBe(3);
|
|
463
|
-
expect(hierarchy!.totalAgents).toBe(3);
|
|
464
|
-
log(
|
|
465
|
-
`✓ Hierarchy depth: ${hierarchy!.depth}, total: ${hierarchy!.totalAgents}`,
|
|
466
|
-
);
|
|
467
|
-
|
|
468
|
-
// Verify lineage
|
|
469
|
-
const level1Agent = agentManager.get(level1.agentId);
|
|
470
|
-
const level2Agent = agentManager.get(level2.agentId);
|
|
471
|
-
|
|
472
|
-
expect(level1Agent?.lineage).toEqual([level0Id]);
|
|
473
|
-
expect(level2Agent?.lineage).toEqual([level0Id, level1.agentId]);
|
|
474
|
-
log("✓ Lineages verified correctly");
|
|
475
|
-
},
|
|
476
|
-
{ timeout: TIMEOUT.HIERARCHY },
|
|
477
|
-
);
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
describe("TERM: Agent Termination", () => {
|
|
481
|
-
testFn(
|
|
482
|
-
"TERM-04: should cascade terminate to all descendants",
|
|
483
|
-
async () => {
|
|
484
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
485
|
-
clients.push(client);
|
|
486
|
-
|
|
487
|
-
await client.connect();
|
|
488
|
-
await client.initialize();
|
|
489
|
-
|
|
490
|
-
// Create head manager
|
|
491
|
-
await client.newSession({ cwd: testRepo.path });
|
|
492
|
-
const headManagers = agentManager.listHeadManagers();
|
|
493
|
-
const headId = headManagers[0].id;
|
|
494
|
-
log(`✓ Head manager: ${headId}`);
|
|
495
|
-
|
|
496
|
-
// Spawn child
|
|
497
|
-
const childResult = await client.extMethod("_macro/spawnAgent", {
|
|
498
|
-
task_description: "Child agent",
|
|
499
|
-
parentId: headId,
|
|
500
|
-
});
|
|
501
|
-
const child = childResult.result as { agentId: string };
|
|
502
|
-
log(`✓ Child spawned: ${child.agentId}`);
|
|
503
|
-
|
|
504
|
-
// Spawn grandchild
|
|
505
|
-
const grandchildResult = await client.extMethod("_macro/spawnAgent", {
|
|
506
|
-
task_description: "Grandchild agent",
|
|
507
|
-
parentId: child.agentId,
|
|
508
|
-
});
|
|
509
|
-
const grandchild = grandchildResult.result as { agentId: string };
|
|
510
|
-
log(`✓ Grandchild spawned: ${grandchild.agentId}`);
|
|
511
|
-
|
|
512
|
-
// Verify all running
|
|
513
|
-
expect(agentManager.get(headId)?.state).toBe("running");
|
|
514
|
-
expect(agentManager.get(child.agentId)?.state).toBe("running");
|
|
515
|
-
expect(agentManager.get(grandchild.agentId)?.state).toBe("running");
|
|
516
|
-
log("✓ All agents running");
|
|
517
|
-
|
|
518
|
-
// Terminate head manager (should cascade)
|
|
519
|
-
await agentManager.terminate(headId, "completed");
|
|
520
|
-
log("✓ Head manager terminated");
|
|
521
|
-
|
|
522
|
-
// Verify cascade termination
|
|
523
|
-
const headAgent = agentManager.get(headId);
|
|
524
|
-
const childAgent = agentManager.get(child.agentId);
|
|
525
|
-
const grandchildAgent = agentManager.get(grandchild.agentId);
|
|
526
|
-
|
|
527
|
-
expect(headAgent?.state).toBe("stopped");
|
|
528
|
-
expect(headAgent?.stop_reason).toBe("completed");
|
|
529
|
-
log(
|
|
530
|
-
`✓ Head state: ${headAgent?.state}, reason: ${headAgent?.stop_reason}`,
|
|
531
|
-
);
|
|
532
|
-
|
|
533
|
-
expect(childAgent?.state).toBe("stopped");
|
|
534
|
-
expect(childAgent?.stop_reason).toBe("parent_stopped");
|
|
535
|
-
log(
|
|
536
|
-
`✓ Child state: ${childAgent?.state}, reason: ${childAgent?.stop_reason}`,
|
|
537
|
-
);
|
|
538
|
-
|
|
539
|
-
expect(grandchildAgent?.state).toBe("stopped");
|
|
540
|
-
expect(grandchildAgent?.stop_reason).toBe("parent_stopped");
|
|
541
|
-
log(
|
|
542
|
-
`✓ Grandchild state: ${grandchildAgent?.state}, reason: ${grandchildAgent?.stop_reason}`,
|
|
543
|
-
);
|
|
544
|
-
|
|
545
|
-
// Verify stop events
|
|
546
|
-
const terminateEvents = eventStore.query({ type: "stop" });
|
|
547
|
-
expect(terminateEvents.length).toBeGreaterThanOrEqual(3);
|
|
548
|
-
log(`✓ Stop events: ${terminateEvents.length}`);
|
|
549
|
-
},
|
|
550
|
-
{ timeout: TIMEOUT.HIERARCHY },
|
|
551
|
-
);
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
describe("QUERY: Agent Querying", () => {
|
|
555
|
-
testFn(
|
|
556
|
-
"QUERY-08: should return correct hierarchy via getHierarchy extension",
|
|
557
|
-
async () => {
|
|
558
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
559
|
-
clients.push(client);
|
|
560
|
-
|
|
561
|
-
await client.connect();
|
|
562
|
-
await client.initialize();
|
|
563
|
-
|
|
564
|
-
// Create head manager
|
|
565
|
-
await client.newSession({ cwd: testRepo.path });
|
|
566
|
-
const headManagers = agentManager.listHeadManagers();
|
|
567
|
-
const headId = headManagers[0].id;
|
|
568
|
-
|
|
569
|
-
// Spawn some children
|
|
570
|
-
await client.extMethod("_macro/spawnAgent", {
|
|
571
|
-
task_description: "Worker A",
|
|
572
|
-
parentId: headId,
|
|
573
|
-
});
|
|
574
|
-
await client.extMethod("_macro/spawnAgent", {
|
|
575
|
-
task_description: "Worker B",
|
|
576
|
-
parentId: headId,
|
|
577
|
-
});
|
|
578
|
-
|
|
579
|
-
// Get hierarchy via extension
|
|
580
|
-
const hierarchyResult = await client.extMethod("_macro/getHierarchy", {
|
|
581
|
-
rootAgentId: headId,
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
expect(hierarchyResult.error).toBeUndefined();
|
|
585
|
-
const hierarchy = hierarchyResult.result as {
|
|
586
|
-
hierarchy: { agent: { id: string }; children: unknown[] };
|
|
587
|
-
totalAgents: number;
|
|
588
|
-
depth: number;
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
expect(hierarchy.totalAgents).toBe(3);
|
|
592
|
-
expect(hierarchy.depth).toBe(2);
|
|
593
|
-
expect(hierarchy.hierarchy.agent.id).toBe(headId);
|
|
594
|
-
expect(hierarchy.hierarchy.children.length).toBe(2);
|
|
595
|
-
log(
|
|
596
|
-
`✓ Hierarchy: ${hierarchy.totalAgents} agents, depth ${hierarchy.depth}`,
|
|
597
|
-
);
|
|
598
|
-
},
|
|
599
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
600
|
-
);
|
|
601
|
-
});
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
// ─────────────────────────────────────────────────────────────────
|
|
605
|
-
// Part 2: Multi-Client WebSocket ACP Tests
|
|
606
|
-
// ─────────────────────────────────────────────────────────────────
|
|
607
|
-
|
|
608
|
-
describe("Part 2: Multi-Client WebSocket ACP E2E", () => {
|
|
609
|
-
let eventStore: EventStore;
|
|
610
|
-
let agentManager: AgentManager;
|
|
611
|
-
let taskManager: TaskManager;
|
|
612
|
-
let messageRouter: MessageRouter;
|
|
613
|
-
let server: WebSocketACPServer;
|
|
614
|
-
let testPort: number;
|
|
615
|
-
let testRepo: { path: string; cleanup: () => void };
|
|
616
|
-
let testInstanceId: string;
|
|
617
|
-
const clients: ACPTestClient[] = [];
|
|
618
|
-
|
|
619
|
-
beforeEach(async () => {
|
|
620
|
-
if (!RUN_FULL_AGENT) return;
|
|
621
|
-
|
|
622
|
-
// Create isolated test repo to avoid polluting real repo
|
|
623
|
-
testRepo = createTestRepo("multiclient");
|
|
624
|
-
|
|
625
|
-
testInstanceId = `multiclient-e2e-${Date.now()}`;
|
|
626
|
-
eventStore = await createEventStore({
|
|
627
|
-
instanceId: testInstanceId,
|
|
628
|
-
baseDir: testRepo.path,
|
|
629
|
-
});
|
|
630
|
-
messageRouter = createMessageRouter(eventStore);
|
|
631
|
-
taskManager = createTaskManager(eventStore);
|
|
632
|
-
agentManager = createAgentManager(eventStore, messageRouter, {
|
|
633
|
-
defaultPermissionMode: "auto-approve",
|
|
634
|
-
defaultCwd: testRepo.path,
|
|
635
|
-
});
|
|
636
|
-
|
|
637
|
-
testPort = 10000 + Math.floor(Math.random() * 50000);
|
|
638
|
-
server = createWebSocketACPServer(
|
|
639
|
-
{ eventStore, agentManager, taskManager },
|
|
640
|
-
{ port: testPort, host: "localhost", path: "/acp" },
|
|
641
|
-
);
|
|
642
|
-
await server.start();
|
|
643
|
-
});
|
|
644
|
-
|
|
645
|
-
afterEach(async () => {
|
|
646
|
-
if (!RUN_FULL_AGENT) return;
|
|
647
|
-
|
|
648
|
-
for (const client of clients) {
|
|
649
|
-
client.close();
|
|
650
|
-
}
|
|
651
|
-
clients.length = 0;
|
|
652
|
-
|
|
653
|
-
try {
|
|
654
|
-
const heads = agentManager.listHeadManagers();
|
|
655
|
-
for (const head of heads) {
|
|
656
|
-
try {
|
|
657
|
-
await agentManager.terminate(head.id, "test_cleanup");
|
|
658
|
-
} catch {}
|
|
659
|
-
}
|
|
660
|
-
} catch {}
|
|
661
|
-
|
|
662
|
-
await server?.stop();
|
|
663
|
-
await agentManager?.close();
|
|
664
|
-
await eventStore?.close();
|
|
665
|
-
testRepo?.cleanup();
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
describe("MC: Multi-Client Scenarios", () => {
|
|
669
|
-
testFn(
|
|
670
|
-
"MC-01: should allow multiple clients to connect simultaneously",
|
|
671
|
-
async () => {
|
|
672
|
-
const clientA = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
673
|
-
const clientB = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
674
|
-
const clientC = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
675
|
-
clients.push(clientA, clientB, clientC);
|
|
676
|
-
|
|
677
|
-
await Promise.all([
|
|
678
|
-
clientA.connect(),
|
|
679
|
-
clientB.connect(),
|
|
680
|
-
clientC.connect(),
|
|
681
|
-
]);
|
|
682
|
-
|
|
683
|
-
expect(clientA.isConnected).toBe(true);
|
|
684
|
-
expect(clientB.isConnected).toBe(true);
|
|
685
|
-
expect(clientC.isConnected).toBe(true);
|
|
686
|
-
expect(server.getConnectionCount()).toBe(3);
|
|
687
|
-
log("✓ 3 clients connected simultaneously");
|
|
688
|
-
},
|
|
689
|
-
{ timeout: TIMEOUT.SPAWN },
|
|
690
|
-
);
|
|
691
|
-
|
|
692
|
-
testFn(
|
|
693
|
-
"MC-02: should give each client isolated session by default",
|
|
694
|
-
async () => {
|
|
695
|
-
const clientA = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
696
|
-
const clientB = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
697
|
-
clients.push(clientA, clientB);
|
|
698
|
-
|
|
699
|
-
await Promise.all([clientA.connect(), clientB.connect()]);
|
|
700
|
-
await Promise.all([clientA.initialize(), clientB.initialize()]);
|
|
701
|
-
|
|
702
|
-
// Create sessions
|
|
703
|
-
const sessionA = await clientA.newSession({ cwd: testRepo.path });
|
|
704
|
-
const sessionB = await clientB.newSession({ cwd: testRepo.path });
|
|
705
|
-
|
|
706
|
-
expect(sessionA.error).toBeUndefined();
|
|
707
|
-
expect(sessionB.error).toBeUndefined();
|
|
708
|
-
|
|
709
|
-
const sessionAId = (sessionA.result as { sessionId: string }).sessionId;
|
|
710
|
-
const sessionBId = (sessionB.result as { sessionId: string }).sessionId;
|
|
711
|
-
|
|
712
|
-
expect(sessionAId).not.toBe(sessionBId);
|
|
713
|
-
log(`✓ Sessions isolated: ${sessionAId} vs ${sessionBId}`);
|
|
714
|
-
|
|
715
|
-
// Verify both head managers exist
|
|
716
|
-
const heads = agentManager.listHeadManagers();
|
|
717
|
-
expect(heads.length).toBeGreaterThanOrEqual(2);
|
|
718
|
-
log(`✓ Head managers: ${heads.length}`);
|
|
719
|
-
},
|
|
720
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
721
|
-
);
|
|
722
|
-
|
|
723
|
-
testFn(
|
|
724
|
-
"MC-04: should continue working when one client disconnects",
|
|
725
|
-
async () => {
|
|
726
|
-
const clientA = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
727
|
-
const clientB = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
728
|
-
clients.push(clientA, clientB);
|
|
729
|
-
|
|
730
|
-
await Promise.all([clientA.connect(), clientB.connect()]);
|
|
731
|
-
await Promise.all([clientA.initialize(), clientB.initialize()]);
|
|
732
|
-
|
|
733
|
-
// Create sessions
|
|
734
|
-
const sessionA = await clientA.newSession({ cwd: testRepo.path });
|
|
735
|
-
const sessionB = await clientB.newSession({ cwd: testRepo.path });
|
|
736
|
-
log("✓ Both sessions created");
|
|
737
|
-
|
|
738
|
-
// Disconnect client A
|
|
739
|
-
clientA.close();
|
|
740
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
741
|
-
|
|
742
|
-
expect(server.getConnectionCount()).toBe(1);
|
|
743
|
-
log("✓ Client A disconnected, connection count: 1");
|
|
744
|
-
|
|
745
|
-
// Client B should still be able to use the hierarchy
|
|
746
|
-
const hierarchyResult = await clientB.extMethod(
|
|
747
|
-
"_macro/getHierarchy",
|
|
748
|
-
{},
|
|
749
|
-
);
|
|
750
|
-
expect(hierarchyResult.error).toBeUndefined();
|
|
751
|
-
log("✓ Client B can still query hierarchy");
|
|
752
|
-
|
|
753
|
-
// Verify both agents still exist in hierarchy
|
|
754
|
-
const agents = agentManager.list();
|
|
755
|
-
expect(agents.length).toBeGreaterThanOrEqual(2);
|
|
756
|
-
log(`✓ Total agents in shared hierarchy: ${agents.length}`);
|
|
757
|
-
},
|
|
758
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
759
|
-
);
|
|
760
|
-
|
|
761
|
-
testFn(
|
|
762
|
-
"MC-05: should handle 5+ concurrent clients",
|
|
763
|
-
async () => {
|
|
764
|
-
const clientCount = 5;
|
|
765
|
-
const newClients: ACPTestClient[] = [];
|
|
766
|
-
|
|
767
|
-
// Connect all clients
|
|
768
|
-
for (let i = 0; i < clientCount; i++) {
|
|
769
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
770
|
-
newClients.push(client);
|
|
771
|
-
clients.push(client);
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
await Promise.all(newClients.map((c) => c.connect()));
|
|
775
|
-
expect(server.getConnectionCount()).toBe(clientCount);
|
|
776
|
-
log(`✓ ${clientCount} clients connected`);
|
|
777
|
-
|
|
778
|
-
// Initialize all
|
|
779
|
-
await Promise.all(newClients.map((c) => c.initialize()));
|
|
780
|
-
log("✓ All clients initialized");
|
|
781
|
-
|
|
782
|
-
// Create sessions sequentially (to avoid race conditions)
|
|
783
|
-
const sessions: string[] = [];
|
|
784
|
-
for (const client of newClients) {
|
|
785
|
-
const result = await client.newSession({ cwd: testRepo.path });
|
|
786
|
-
expect(result.error).toBeUndefined();
|
|
787
|
-
sessions.push((result.result as { sessionId: string }).sessionId);
|
|
788
|
-
}
|
|
789
|
-
log(`✓ ${sessions.length} sessions created`);
|
|
790
|
-
|
|
791
|
-
// All sessions should be unique
|
|
792
|
-
const uniqueSessions = new Set(sessions);
|
|
793
|
-
expect(uniqueSessions.size).toBe(clientCount);
|
|
794
|
-
log("✓ All sessions are unique");
|
|
795
|
-
|
|
796
|
-
// Verify shared hierarchy
|
|
797
|
-
const heads = agentManager.listHeadManagers();
|
|
798
|
-
expect(heads.length).toBeGreaterThanOrEqual(clientCount);
|
|
799
|
-
log(`✓ Shared hierarchy has ${heads.length} head managers`);
|
|
800
|
-
},
|
|
801
|
-
{ timeout: TIMEOUT.MULTI_SPAWN * 2 },
|
|
802
|
-
);
|
|
803
|
-
|
|
804
|
-
testFn(
|
|
805
|
-
"MC-07: should allow agent hierarchy spanning multiple client sessions",
|
|
806
|
-
async () => {
|
|
807
|
-
const clientA = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
808
|
-
const clientB = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
809
|
-
clients.push(clientA, clientB);
|
|
810
|
-
|
|
811
|
-
await Promise.all([clientA.connect(), clientB.connect()]);
|
|
812
|
-
await Promise.all([clientA.initialize(), clientB.initialize()]);
|
|
813
|
-
|
|
814
|
-
// Client A creates head manager
|
|
815
|
-
const sessionA = await clientA.newSession({ cwd: testRepo.path });
|
|
816
|
-
const heads = agentManager.listHeadManagers();
|
|
817
|
-
const clientAHeadId = heads[0].id;
|
|
818
|
-
log(`✓ Client A head manager: ${clientAHeadId}`);
|
|
819
|
-
|
|
820
|
-
// Client A spawns a child
|
|
821
|
-
const spawnResult = await clientA.extMethod("_macro/spawnAgent", {
|
|
822
|
-
task_description: "Child from Client A",
|
|
823
|
-
parentId: clientAHeadId,
|
|
824
|
-
});
|
|
825
|
-
const childId = (spawnResult.result as { agentId: string }).agentId;
|
|
826
|
-
log(`✓ Client A spawned child: ${childId}`);
|
|
827
|
-
|
|
828
|
-
// Client B should see the entire hierarchy
|
|
829
|
-
const hierarchyResult = await clientB.extMethod("_macro/getHierarchy", {
|
|
830
|
-
rootAgentId: clientAHeadId,
|
|
831
|
-
});
|
|
832
|
-
|
|
833
|
-
expect(hierarchyResult.error).toBeUndefined();
|
|
834
|
-
const hierarchy = hierarchyResult.result as {
|
|
835
|
-
totalAgents: number;
|
|
836
|
-
depth: number;
|
|
837
|
-
};
|
|
838
|
-
|
|
839
|
-
expect(hierarchy.totalAgents).toBe(2);
|
|
840
|
-
expect(hierarchy.depth).toBe(2);
|
|
841
|
-
log(
|
|
842
|
-
`✓ Client B sees hierarchy: ${hierarchy.totalAgents} agents, depth ${hierarchy.depth}`,
|
|
843
|
-
);
|
|
844
|
-
|
|
845
|
-
// Client B can spawn a grandchild under Client A's child
|
|
846
|
-
const grandchildResult = await clientB.extMethod("_macro/spawnAgent", {
|
|
847
|
-
task_description: "Grandchild from Client B",
|
|
848
|
-
parentId: childId,
|
|
849
|
-
});
|
|
850
|
-
expect(grandchildResult.error).toBeUndefined();
|
|
851
|
-
const grandchildId = (grandchildResult.result as { agentId: string })
|
|
852
|
-
.agentId;
|
|
853
|
-
log(`✓ Client B spawned grandchild: ${grandchildId}`);
|
|
854
|
-
|
|
855
|
-
// Verify the cross-client hierarchy
|
|
856
|
-
const finalHierarchy = agentManager.getHierarchy(clientAHeadId);
|
|
857
|
-
expect(finalHierarchy!.totalAgents).toBe(3);
|
|
858
|
-
expect(finalHierarchy!.depth).toBe(3);
|
|
859
|
-
log("✓ Cross-client hierarchy verified: 3 agents, depth 3");
|
|
860
|
-
},
|
|
861
|
-
{ timeout: TIMEOUT.HIERARCHY },
|
|
862
|
-
);
|
|
863
|
-
});
|
|
864
|
-
});
|
|
865
|
-
|
|
866
|
-
// ─────────────────────────────────────────────────────────────────
|
|
867
|
-
// Part 3: Event Storage Verification
|
|
868
|
-
// ─────────────────────────────────────────────────────────────────
|
|
869
|
-
|
|
870
|
-
describe("Part 3: Event Storage E2E", () => {
|
|
871
|
-
let eventStore: EventStore;
|
|
872
|
-
let agentManager: AgentManager;
|
|
873
|
-
let taskManager: TaskManager;
|
|
874
|
-
let messageRouter: MessageRouter;
|
|
875
|
-
let server: WebSocketACPServer;
|
|
876
|
-
let testPort: number;
|
|
877
|
-
let testRepo: { path: string; cleanup: () => void };
|
|
878
|
-
let testInstanceId: string;
|
|
879
|
-
const clients: ACPTestClient[] = [];
|
|
880
|
-
|
|
881
|
-
beforeEach(async () => {
|
|
882
|
-
if (!RUN_FULL_AGENT) return;
|
|
883
|
-
|
|
884
|
-
// Create isolated test repo to avoid polluting real repo
|
|
885
|
-
testRepo = createTestRepo("events");
|
|
886
|
-
|
|
887
|
-
testInstanceId = `events-e2e-${Date.now()}`;
|
|
888
|
-
eventStore = await createEventStore({
|
|
889
|
-
instanceId: testInstanceId,
|
|
890
|
-
baseDir: testRepo.path,
|
|
891
|
-
});
|
|
892
|
-
messageRouter = createMessageRouter(eventStore);
|
|
893
|
-
taskManager = createTaskManager(eventStore);
|
|
894
|
-
agentManager = createAgentManager(eventStore, messageRouter, {
|
|
895
|
-
defaultPermissionMode: "auto-approve",
|
|
896
|
-
defaultCwd: testRepo.path,
|
|
897
|
-
});
|
|
898
|
-
|
|
899
|
-
testPort = 10000 + Math.floor(Math.random() * 50000);
|
|
900
|
-
server = createWebSocketACPServer(
|
|
901
|
-
{ eventStore, agentManager, taskManager },
|
|
902
|
-
{ port: testPort, host: "localhost", path: "/acp" },
|
|
903
|
-
);
|
|
904
|
-
await server.start();
|
|
905
|
-
});
|
|
906
|
-
|
|
907
|
-
afterEach(async () => {
|
|
908
|
-
if (!RUN_FULL_AGENT) return;
|
|
909
|
-
|
|
910
|
-
for (const client of clients) {
|
|
911
|
-
client.close();
|
|
912
|
-
}
|
|
913
|
-
clients.length = 0;
|
|
914
|
-
|
|
915
|
-
try {
|
|
916
|
-
const heads = agentManager.listHeadManagers();
|
|
917
|
-
for (const head of heads) {
|
|
918
|
-
try {
|
|
919
|
-
await agentManager.terminate(head.id, "test_cleanup");
|
|
920
|
-
} catch {}
|
|
921
|
-
}
|
|
922
|
-
} catch {}
|
|
923
|
-
|
|
924
|
-
await server?.stop();
|
|
925
|
-
await agentManager?.close();
|
|
926
|
-
await eventStore?.close();
|
|
927
|
-
testRepo?.cleanup();
|
|
928
|
-
});
|
|
929
|
-
|
|
930
|
-
describe("EVT: Event Verification", () => {
|
|
931
|
-
testFn(
|
|
932
|
-
"EVT-01: should store spawn, status, and terminate events",
|
|
933
|
-
async () => {
|
|
934
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
935
|
-
clients.push(client);
|
|
936
|
-
|
|
937
|
-
await client.connect();
|
|
938
|
-
await client.initialize();
|
|
939
|
-
|
|
940
|
-
// Create session (generates spawn + status events)
|
|
941
|
-
const sessionResult = await client.newSession({ cwd: testRepo.path });
|
|
942
|
-
const heads = agentManager.listHeadManagers();
|
|
943
|
-
const headId = heads[0].id;
|
|
944
|
-
log("✓ Head manager created");
|
|
945
|
-
|
|
946
|
-
// Verify spawn event
|
|
947
|
-
const spawnEvents = eventStore.query({ type: "spawn" });
|
|
948
|
-
expect(spawnEvents.length).toBeGreaterThanOrEqual(1);
|
|
949
|
-
const spawnEvent = spawnEvents.find(
|
|
950
|
-
(e) => e.payload.agent_id === headId,
|
|
951
|
-
);
|
|
952
|
-
expect(spawnEvent).toBeDefined();
|
|
953
|
-
expect(spawnEvent!.payload.agent_id).toBe(headId);
|
|
954
|
-
log(`✓ Spawn event verified for ${headId}`);
|
|
955
|
-
|
|
956
|
-
// Verify status events (started)
|
|
957
|
-
const statusEvents = eventStore.query({ type: "status" });
|
|
958
|
-
expect(statusEvents.length).toBeGreaterThanOrEqual(1);
|
|
959
|
-
log(`✓ Status events: ${statusEvents.length}`);
|
|
960
|
-
|
|
961
|
-
// Terminate agent
|
|
962
|
-
await agentManager.terminate(headId, "completed");
|
|
963
|
-
|
|
964
|
-
// Verify stop event
|
|
965
|
-
const terminateEvents = eventStore.query({ type: "stop" });
|
|
966
|
-
expect(terminateEvents.length).toBeGreaterThanOrEqual(1);
|
|
967
|
-
const termEvent = terminateEvents.find(
|
|
968
|
-
(e) => e.payload.agent_id === headId,
|
|
969
|
-
);
|
|
970
|
-
expect(termEvent).toBeDefined();
|
|
971
|
-
expect(termEvent!.payload.reason).toBe("completed");
|
|
972
|
-
log(`✓ Terminate event verified for ${headId}`);
|
|
973
|
-
},
|
|
974
|
-
{ timeout: TIMEOUT.SPAWN },
|
|
975
|
-
);
|
|
976
|
-
|
|
977
|
-
testFn(
|
|
978
|
-
"VIEW-01/02/03: should update agent materialized view correctly",
|
|
979
|
-
async () => {
|
|
980
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
981
|
-
clients.push(client);
|
|
982
|
-
|
|
983
|
-
await client.connect();
|
|
984
|
-
await client.initialize();
|
|
985
|
-
|
|
986
|
-
// Create session
|
|
987
|
-
await client.newSession({ cwd: testRepo.path });
|
|
988
|
-
const heads = agentManager.listHeadManagers();
|
|
989
|
-
const headId = heads[0].id;
|
|
990
|
-
|
|
991
|
-
// VIEW-01: Verify agent appears in view after spawn
|
|
992
|
-
let agent = eventStore.getAgent(headId);
|
|
993
|
-
expect(agent).toBeDefined();
|
|
994
|
-
expect(agent!.id).toBe(headId);
|
|
995
|
-
log("✓ VIEW-01: Agent in view after spawn");
|
|
996
|
-
|
|
997
|
-
// VIEW-02: Verify state is "running" after status:started
|
|
998
|
-
expect(agent!.state).toBe("running");
|
|
999
|
-
log(`✓ VIEW-02: Agent state is ${agent!.state}`);
|
|
1000
|
-
|
|
1001
|
-
// VIEW-03: Verify state changes to "stopped" after terminate
|
|
1002
|
-
await agentManager.terminate(headId, "completed");
|
|
1003
|
-
agent = eventStore.getAgent(headId);
|
|
1004
|
-
expect(agent!.state).toBe("stopped");
|
|
1005
|
-
log(`✓ VIEW-03: Agent state is ${agent!.state} after terminate`);
|
|
1006
|
-
},
|
|
1007
|
-
{ timeout: TIMEOUT.SPAWN },
|
|
1008
|
-
);
|
|
1009
|
-
});
|
|
1010
|
-
});
|
|
1011
|
-
|
|
1012
|
-
// ─────────────────────────────────────────────────────────────────
|
|
1013
|
-
// Part 4: Inter-Agent Messaging E2E Tests
|
|
1014
|
-
// ─────────────────────────────────────────────────────────────────
|
|
1015
|
-
|
|
1016
|
-
describe("Part 4: Inter-Agent Messaging E2E", () => {
|
|
1017
|
-
let eventStore: EventStore;
|
|
1018
|
-
let agentManager: AgentManager;
|
|
1019
|
-
let taskManager: TaskManager;
|
|
1020
|
-
let messageRouter: MessageRouter;
|
|
1021
|
-
let server: WebSocketACPServer;
|
|
1022
|
-
let testPort: number;
|
|
1023
|
-
let testRepo: { path: string; cleanup: () => void };
|
|
1024
|
-
let testInstanceId: string;
|
|
1025
|
-
const clients: ACPTestClient[] = [];
|
|
1026
|
-
|
|
1027
|
-
beforeEach(async () => {
|
|
1028
|
-
if (!RUN_FULL_AGENT) {
|
|
1029
|
-
log("⚠️ Skipping: RUN_FULL_AGENT_TESTS not set");
|
|
1030
|
-
return;
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
|
-
// Create isolated test repo to avoid polluting real repo
|
|
1034
|
-
testRepo = createTestRepo("messaging");
|
|
1035
|
-
|
|
1036
|
-
// Create services with file-based storage (required for MCP subprocess access)
|
|
1037
|
-
testInstanceId = `messaging-e2e-${Date.now()}`;
|
|
1038
|
-
eventStore = await createEventStore({
|
|
1039
|
-
instanceId: testInstanceId,
|
|
1040
|
-
baseDir: testRepo.path,
|
|
1041
|
-
});
|
|
1042
|
-
messageRouter = createMessageRouter(eventStore);
|
|
1043
|
-
taskManager = createTaskManager(eventStore);
|
|
1044
|
-
agentManager = createAgentManager(eventStore, messageRouter, {
|
|
1045
|
-
defaultPermissionMode: "auto-approve",
|
|
1046
|
-
defaultCwd: testRepo.path,
|
|
1047
|
-
});
|
|
1048
|
-
|
|
1049
|
-
// Start WebSocket server
|
|
1050
|
-
testPort = 10000 + Math.floor(Math.random() * 50000);
|
|
1051
|
-
server = createWebSocketACPServer(
|
|
1052
|
-
{ eventStore, agentManager, taskManager },
|
|
1053
|
-
{ port: testPort, host: "localhost", path: "/acp" },
|
|
1054
|
-
);
|
|
1055
|
-
await server.start();
|
|
1056
|
-
log(`Server started on port ${testPort}`);
|
|
1057
|
-
});
|
|
1058
|
-
|
|
1059
|
-
afterEach(async () => {
|
|
1060
|
-
if (!RUN_FULL_AGENT) return;
|
|
1061
|
-
|
|
1062
|
-
// Close all clients
|
|
1063
|
-
for (const client of clients) {
|
|
1064
|
-
client.close();
|
|
1065
|
-
}
|
|
1066
|
-
clients.length = 0;
|
|
1067
|
-
|
|
1068
|
-
// Terminate all agents
|
|
1069
|
-
try {
|
|
1070
|
-
const heads = agentManager.listHeadManagers();
|
|
1071
|
-
for (const head of heads) {
|
|
1072
|
-
try {
|
|
1073
|
-
await agentManager.terminate(head.id, "test_cleanup");
|
|
1074
|
-
} catch {
|
|
1075
|
-
// Ignore termination errors during cleanup
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
} catch {
|
|
1079
|
-
// Ignore errors during cleanup
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
// Stop server
|
|
1083
|
-
await server.stop();
|
|
1084
|
-
|
|
1085
|
-
// Close event store
|
|
1086
|
-
await eventStore.close();
|
|
1087
|
-
testRepo?.cleanup();
|
|
1088
|
-
|
|
1089
|
-
log("Cleanup complete");
|
|
1090
|
-
});
|
|
1091
|
-
|
|
1092
|
-
// ───────────────────────────────────────────────────────────────
|
|
1093
|
-
// MSG: Direct Agent Messaging
|
|
1094
|
-
// ───────────────────────────────────────────────────────────────
|
|
1095
|
-
|
|
1096
|
-
describe("MSG: Direct Agent Messaging", () => {
|
|
1097
|
-
testFn(
|
|
1098
|
-
"MSG-01: should send message between sibling agents via MessageRouter",
|
|
1099
|
-
async () => {
|
|
1100
|
-
// Create client and session
|
|
1101
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1102
|
-
clients.push(client);
|
|
1103
|
-
await client.connect();
|
|
1104
|
-
await client.initialize();
|
|
1105
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1106
|
-
|
|
1107
|
-
// Get head manager
|
|
1108
|
-
const heads = agentManager.listHeadManagers();
|
|
1109
|
-
const headId = heads[0].id;
|
|
1110
|
-
log(`✓ Head manager: ${headId}`);
|
|
1111
|
-
|
|
1112
|
-
// Spawn two child agents
|
|
1113
|
-
const child1Result = await client.extMethod("_macro/spawnAgent", {
|
|
1114
|
-
task_description: "Worker 1 - Send messages",
|
|
1115
|
-
parentId: headId,
|
|
1116
|
-
});
|
|
1117
|
-
const child1Id = (child1Result.result as { agentId: string }).agentId;
|
|
1118
|
-
log(`✓ Child 1 spawned: ${child1Id}`);
|
|
1119
|
-
|
|
1120
|
-
const child2Result = await client.extMethod("_macro/spawnAgent", {
|
|
1121
|
-
task_description: "Worker 2 - Receive messages",
|
|
1122
|
-
parentId: headId,
|
|
1123
|
-
});
|
|
1124
|
-
const child2Id = (child2Result.result as { agentId: string }).agentId;
|
|
1125
|
-
log(`✓ Child 2 spawned: ${child2Id}`);
|
|
1126
|
-
|
|
1127
|
-
// Send message from child1 to child2 via MessageRouter
|
|
1128
|
-
const sentMsg = await messageRouter.sendToAddress({
|
|
1129
|
-
from: child1Id,
|
|
1130
|
-
to: { agent: child2Id },
|
|
1131
|
-
content: "Hello from sibling!",
|
|
1132
|
-
});
|
|
1133
|
-
expect(sentMsg.id).toBeDefined();
|
|
1134
|
-
expect(sentMsg.from).toBe(child1Id);
|
|
1135
|
-
expect((sentMsg.to as { agent: string }).agent).toBe(child2Id);
|
|
1136
|
-
log(`✓ Message sent: ${sentMsg.id}`);
|
|
1137
|
-
|
|
1138
|
-
// Verify child2 has pending message
|
|
1139
|
-
const pendingMessages = messageRouter.getMessages(child2Id);
|
|
1140
|
-
expect(pendingMessages.length).toBe(1);
|
|
1141
|
-
expect(pendingMessages[0].content).toBe("Hello from sibling!");
|
|
1142
|
-
expect(pendingMessages[0].from.agent_id).toBe(child1Id);
|
|
1143
|
-
log(`✓ Child 2 received message: "${pendingMessages[0].content}"`);
|
|
1144
|
-
|
|
1145
|
-
// Verify message event in EventStore (event.id = message id)
|
|
1146
|
-
const msgEvents = eventStore.query({ type: "message" });
|
|
1147
|
-
const ourMsg = msgEvents.find((e) => e.id === sentMsg.id);
|
|
1148
|
-
expect(ourMsg).toBeDefined();
|
|
1149
|
-
log(`✓ Message event stored: ${ourMsg!.id}`);
|
|
1150
|
-
},
|
|
1151
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1152
|
-
);
|
|
1153
|
-
|
|
1154
|
-
testFn(
|
|
1155
|
-
"MSG-02: should acknowledge messages correctly",
|
|
1156
|
-
async () => {
|
|
1157
|
-
// Create client and session
|
|
1158
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1159
|
-
clients.push(client);
|
|
1160
|
-
await client.connect();
|
|
1161
|
-
await client.initialize();
|
|
1162
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1163
|
-
|
|
1164
|
-
// Get head manager
|
|
1165
|
-
const heads = agentManager.listHeadManagers();
|
|
1166
|
-
const headId = heads[0].id;
|
|
1167
|
-
|
|
1168
|
-
// Spawn sender and receiver
|
|
1169
|
-
const senderResult = await client.extMethod("_macro/spawnAgent", {
|
|
1170
|
-
task_description: "Sender agent",
|
|
1171
|
-
parentId: headId,
|
|
1172
|
-
});
|
|
1173
|
-
const senderId = (senderResult.result as { agentId: string }).agentId;
|
|
1174
|
-
|
|
1175
|
-
const receiverResult = await client.extMethod("_macro/spawnAgent", {
|
|
1176
|
-
task_description: "Receiver agent",
|
|
1177
|
-
parentId: headId,
|
|
1178
|
-
});
|
|
1179
|
-
const receiverId = (receiverResult.result as { agentId: string })
|
|
1180
|
-
.agentId;
|
|
1181
|
-
log(`✓ Agents spawned: sender=${senderId}, receiver=${receiverId}`);
|
|
1182
|
-
|
|
1183
|
-
// Send multiple messages
|
|
1184
|
-
const msg1 = await messageRouter.sendToAddress({
|
|
1185
|
-
from: senderId,
|
|
1186
|
-
to: { agent: receiverId },
|
|
1187
|
-
content: "Message 1",
|
|
1188
|
-
});
|
|
1189
|
-
const msg2 = await messageRouter.sendToAddress({
|
|
1190
|
-
from: senderId,
|
|
1191
|
-
to: { agent: receiverId },
|
|
1192
|
-
content: "Message 2",
|
|
1193
|
-
});
|
|
1194
|
-
log(`✓ Sent 2 messages`);
|
|
1195
|
-
|
|
1196
|
-
// Verify 2 pending messages
|
|
1197
|
-
let pending = messageRouter.getMessages(receiverId);
|
|
1198
|
-
expect(pending.length).toBe(2);
|
|
1199
|
-
log(`✓ Receiver has ${pending.length} pending messages`);
|
|
1200
|
-
|
|
1201
|
-
// Acknowledge first message
|
|
1202
|
-
messageRouter.acknowledgeMessage(receiverId, msg1.id);
|
|
1203
|
-
log(`✓ Acknowledged message 1`);
|
|
1204
|
-
|
|
1205
|
-
// Verify only 1 pending message now
|
|
1206
|
-
pending = messageRouter.getMessages(receiverId);
|
|
1207
|
-
expect(pending.length).toBe(1);
|
|
1208
|
-
expect(pending[0].id).toBe(msg2.id);
|
|
1209
|
-
log(`✓ After ack: ${pending.length} pending (message 2 only)`);
|
|
1210
|
-
|
|
1211
|
-
// Acknowledge all remaining
|
|
1212
|
-
messageRouter.acknowledgeMessages(receiverId, [msg2.id]);
|
|
1213
|
-
pending = messageRouter.getMessages(receiverId);
|
|
1214
|
-
expect(pending.length).toBe(0);
|
|
1215
|
-
log(`✓ All messages acknowledged: ${pending.length} pending`);
|
|
1216
|
-
},
|
|
1217
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1218
|
-
);
|
|
1219
|
-
|
|
1220
|
-
testFn(
|
|
1221
|
-
"MSG-03: should handle topic-based pub/sub messaging",
|
|
1222
|
-
async () => {
|
|
1223
|
-
// Create client and session
|
|
1224
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1225
|
-
clients.push(client);
|
|
1226
|
-
await client.connect();
|
|
1227
|
-
await client.initialize();
|
|
1228
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1229
|
-
|
|
1230
|
-
// Get head manager
|
|
1231
|
-
const heads = agentManager.listHeadManagers();
|
|
1232
|
-
const headId = heads[0].id;
|
|
1233
|
-
|
|
1234
|
-
// Spawn publisher and two subscribers
|
|
1235
|
-
const pubResult = await client.extMethod("_macro/spawnAgent", {
|
|
1236
|
-
task_description: "Publisher agent",
|
|
1237
|
-
parentId: headId,
|
|
1238
|
-
});
|
|
1239
|
-
const publisherId = (pubResult.result as { agentId: string }).agentId;
|
|
1240
|
-
|
|
1241
|
-
const sub1Result = await client.extMethod("_macro/spawnAgent", {
|
|
1242
|
-
task_description: "Subscriber 1",
|
|
1243
|
-
parentId: headId,
|
|
1244
|
-
});
|
|
1245
|
-
const sub1Id = (sub1Result.result as { agentId: string }).agentId;
|
|
1246
|
-
|
|
1247
|
-
const sub2Result = await client.extMethod("_macro/spawnAgent", {
|
|
1248
|
-
task_description: "Subscriber 2",
|
|
1249
|
-
parentId: headId,
|
|
1250
|
-
});
|
|
1251
|
-
const sub2Id = (sub2Result.result as { agentId: string }).agentId;
|
|
1252
|
-
log(
|
|
1253
|
-
`✓ Agents spawned: publisher=${publisherId}, sub1=${sub1Id}, sub2=${sub2Id}`,
|
|
1254
|
-
);
|
|
1255
|
-
|
|
1256
|
-
// Subscribe both subscribers to a topic
|
|
1257
|
-
const topic = "test-notifications";
|
|
1258
|
-
messageRouter.subscribe(sub1Id, { type: "topic", target: topic });
|
|
1259
|
-
messageRouter.subscribe(sub2Id, { type: "topic", target: topic });
|
|
1260
|
-
log(`✓ Both subscribers subscribed to topic: ${topic}`);
|
|
1261
|
-
|
|
1262
|
-
// Publish message to topic (scope)
|
|
1263
|
-
const sentMsg = await messageRouter.sendToAddress({
|
|
1264
|
-
from: publisherId,
|
|
1265
|
-
to: { scope: topic },
|
|
1266
|
-
content: "Broadcast announcement!",
|
|
1267
|
-
});
|
|
1268
|
-
log(`✓ Published message: ${sentMsg.id}`);
|
|
1269
|
-
|
|
1270
|
-
// Verify both subscribers received the message
|
|
1271
|
-
const sub1Messages = messageRouter.getMessages(sub1Id);
|
|
1272
|
-
const sub2Messages = messageRouter.getMessages(sub2Id);
|
|
1273
|
-
expect(sub1Messages.length).toBe(1);
|
|
1274
|
-
expect(sub2Messages.length).toBe(1);
|
|
1275
|
-
expect(sub1Messages[0].content).toBe("Broadcast announcement!");
|
|
1276
|
-
expect(sub2Messages[0].content).toBe("Broadcast announcement!");
|
|
1277
|
-
log(`✓ Sub1 received: "${sub1Messages[0].content}"`);
|
|
1278
|
-
log(`✓ Sub2 received: "${sub2Messages[0].content}"`);
|
|
1279
|
-
|
|
1280
|
-
// Publisher should not have the message (not subscribed)
|
|
1281
|
-
const pubMessages = messageRouter.getMessages(publisherId);
|
|
1282
|
-
expect(pubMessages.length).toBe(0);
|
|
1283
|
-
log(`✓ Publisher has no messages (not subscribed)`);
|
|
1284
|
-
},
|
|
1285
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1286
|
-
);
|
|
1287
|
-
|
|
1288
|
-
testFn(
|
|
1289
|
-
"MSG-04: should route messages through parent-child hierarchy",
|
|
1290
|
-
async () => {
|
|
1291
|
-
// Create client and session
|
|
1292
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1293
|
-
clients.push(client);
|
|
1294
|
-
await client.connect();
|
|
1295
|
-
await client.initialize();
|
|
1296
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1297
|
-
|
|
1298
|
-
// Get head manager
|
|
1299
|
-
const heads = agentManager.listHeadManagers();
|
|
1300
|
-
const headId = heads[0].id;
|
|
1301
|
-
log(`✓ Head manager: ${headId}`);
|
|
1302
|
-
|
|
1303
|
-
// Spawn child and grandchild
|
|
1304
|
-
const childResult = await client.extMethod("_macro/spawnAgent", {
|
|
1305
|
-
task_description: "Child - Middle manager",
|
|
1306
|
-
parentId: headId,
|
|
1307
|
-
});
|
|
1308
|
-
const childId = (childResult.result as { agentId: string }).agentId;
|
|
1309
|
-
log(`✓ Child spawned: ${childId}`);
|
|
1310
|
-
|
|
1311
|
-
const grandchildResult = await client.extMethod("_macro/spawnAgent", {
|
|
1312
|
-
task_description: "Grandchild - Worker",
|
|
1313
|
-
parentId: childId,
|
|
1314
|
-
});
|
|
1315
|
-
const grandchildId = (grandchildResult.result as { agentId: string })
|
|
1316
|
-
.agentId;
|
|
1317
|
-
log(`✓ Grandchild spawned: ${grandchildId}`);
|
|
1318
|
-
|
|
1319
|
-
// Send message from grandchild to head (ancestor)
|
|
1320
|
-
const msgToHead = await messageRouter.sendToAddress({
|
|
1321
|
-
from: grandchildId,
|
|
1322
|
-
to: { agent: headId },
|
|
1323
|
-
content: "Report from grandchild to head",
|
|
1324
|
-
});
|
|
1325
|
-
expect(msgToHead.id).toBeDefined();
|
|
1326
|
-
log(`✓ Grandchild sent message to head: ${msgToHead.id}`);
|
|
1327
|
-
|
|
1328
|
-
// Verify head received the message
|
|
1329
|
-
const headMessages = messageRouter.getMessages(headId);
|
|
1330
|
-
expect(headMessages.length).toBe(1);
|
|
1331
|
-
expect(headMessages[0].content).toBe("Report from grandchild to head");
|
|
1332
|
-
log(`✓ Head received: "${headMessages[0].content}"`);
|
|
1333
|
-
|
|
1334
|
-
// Send message from head to grandchild (descendant)
|
|
1335
|
-
const msgToGrandchild = await messageRouter.sendToAddress({
|
|
1336
|
-
from: headId,
|
|
1337
|
-
to: { agent: grandchildId },
|
|
1338
|
-
content: "Instructions from head to grandchild",
|
|
1339
|
-
});
|
|
1340
|
-
expect(msgToGrandchild.id).toBeDefined();
|
|
1341
|
-
log(`✓ Head sent message to grandchild: ${msgToGrandchild.id}`);
|
|
1342
|
-
|
|
1343
|
-
// Verify grandchild received the message
|
|
1344
|
-
// (may receive multiple copies due to lineage routing)
|
|
1345
|
-
const grandchildMessages = messageRouter.getMessages(grandchildId);
|
|
1346
|
-
expect(grandchildMessages.length).toBeGreaterThanOrEqual(1);
|
|
1347
|
-
const expectedMsg = grandchildMessages.find(
|
|
1348
|
-
(m) => m.content === "Instructions from head to grandchild",
|
|
1349
|
-
);
|
|
1350
|
-
expect(expectedMsg).toBeDefined();
|
|
1351
|
-
log(
|
|
1352
|
-
`✓ Grandchild received: "${expectedMsg!.content}" (total: ${grandchildMessages.length})`,
|
|
1353
|
-
);
|
|
1354
|
-
},
|
|
1355
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1356
|
-
);
|
|
1357
|
-
|
|
1358
|
-
testFn(
|
|
1359
|
-
"MSG-05: should emit and receive status notifications via subtree subscription",
|
|
1360
|
-
async () => {
|
|
1361
|
-
// Create client and session
|
|
1362
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1363
|
-
clients.push(client);
|
|
1364
|
-
await client.connect();
|
|
1365
|
-
await client.initialize();
|
|
1366
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1367
|
-
|
|
1368
|
-
// Get head manager
|
|
1369
|
-
const heads = agentManager.listHeadManagers();
|
|
1370
|
-
const headId = heads[0].id;
|
|
1371
|
-
|
|
1372
|
-
// Spawn a child
|
|
1373
|
-
const childResult = await client.extMethod("_macro/spawnAgent", {
|
|
1374
|
-
task_description: "Worker sending status updates",
|
|
1375
|
-
parentId: headId,
|
|
1376
|
-
});
|
|
1377
|
-
const childId = (childResult.result as { agentId: string }).agentId;
|
|
1378
|
-
log(`✓ Child spawned: ${childId}`);
|
|
1379
|
-
|
|
1380
|
-
// Subscribe head to child's subtree (status updates)
|
|
1381
|
-
messageRouter.subscribe(headId, { type: "subtree", target: childId });
|
|
1382
|
-
log(`✓ Head subscribed to child's subtree`);
|
|
1383
|
-
|
|
1384
|
-
// Child emits a status update (using "checkpoint" - a valid StatusType)
|
|
1385
|
-
messageRouter.emitStatus({
|
|
1386
|
-
from: { agent_id: childId },
|
|
1387
|
-
status_type: "checkpoint",
|
|
1388
|
-
summary: "50% complete",
|
|
1389
|
-
details: { percentage: 50 },
|
|
1390
|
-
});
|
|
1391
|
-
log(`✓ Child emitted status: 50% complete`);
|
|
1392
|
-
|
|
1393
|
-
// Verify the status event was stored
|
|
1394
|
-
const statusEvents = eventStore.query({ type: "status" });
|
|
1395
|
-
const checkpointEvent = statusEvents.find(
|
|
1396
|
-
(e) =>
|
|
1397
|
-
e.source.agent_id === childId &&
|
|
1398
|
-
e.payload.status_type === "checkpoint" &&
|
|
1399
|
-
e.payload.summary === "50% complete",
|
|
1400
|
-
);
|
|
1401
|
-
expect(checkpointEvent).toBeDefined();
|
|
1402
|
-
expect(checkpointEvent!.payload.summary).toBe("50% complete");
|
|
1403
|
-
log(`✓ Status event stored: ${checkpointEvent!.payload.summary}`);
|
|
1404
|
-
},
|
|
1405
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1406
|
-
);
|
|
1407
|
-
});
|
|
1408
|
-
|
|
1409
|
-
// ───────────────────────────────────────────────────────────────
|
|
1410
|
-
// TASK: Task-Based Routing
|
|
1411
|
-
// ───────────────────────────────────────────────────────────────
|
|
1412
|
-
|
|
1413
|
-
describe("TASK: Task-Based Message Routing", () => {
|
|
1414
|
-
testFn(
|
|
1415
|
-
"TASK-01: should route message to task's assigned agent",
|
|
1416
|
-
async () => {
|
|
1417
|
-
// Create client and session
|
|
1418
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1419
|
-
clients.push(client);
|
|
1420
|
-
await client.connect();
|
|
1421
|
-
await client.initialize();
|
|
1422
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1423
|
-
|
|
1424
|
-
// Get head manager
|
|
1425
|
-
const heads = agentManager.listHeadManagers();
|
|
1426
|
-
const headId = heads[0].id;
|
|
1427
|
-
|
|
1428
|
-
// Spawn worker agent
|
|
1429
|
-
const workerResult = await client.extMethod("_macro/spawnAgent", {
|
|
1430
|
-
task_description: "Process data files",
|
|
1431
|
-
parentId: headId,
|
|
1432
|
-
});
|
|
1433
|
-
const workerId = (workerResult.result as { agentId: string }).agentId;
|
|
1434
|
-
log(`✓ Worker spawned: ${workerId}`);
|
|
1435
|
-
|
|
1436
|
-
// Create a task via TaskManager and assign it to the worker
|
|
1437
|
-
const task = taskManager.create({
|
|
1438
|
-
description: "Process data files",
|
|
1439
|
-
created_by: headId,
|
|
1440
|
-
});
|
|
1441
|
-
taskManager.assign(task.id, workerId);
|
|
1442
|
-
log(`✓ Task created: ${task.id}, assigned to: ${workerId}`);
|
|
1443
|
-
|
|
1444
|
-
// Send message to the task
|
|
1445
|
-
const sentMsg = await messageRouter.sendToAddress({
|
|
1446
|
-
from: headId,
|
|
1447
|
-
to: { task: task.id },
|
|
1448
|
-
content: "Instructions for the task",
|
|
1449
|
-
});
|
|
1450
|
-
expect(sentMsg.id).toBeDefined();
|
|
1451
|
-
log(`✓ Message sent to task: ${sentMsg.id}`);
|
|
1452
|
-
|
|
1453
|
-
// Verify worker received the message (task routes to assigned agent)
|
|
1454
|
-
const workerMessages = messageRouter.getMessages(workerId);
|
|
1455
|
-
expect(workerMessages.length).toBeGreaterThanOrEqual(1);
|
|
1456
|
-
const taskMsg = workerMessages.find(
|
|
1457
|
-
(m) => m.content === "Instructions for the task",
|
|
1458
|
-
);
|
|
1459
|
-
expect(taskMsg).toBeDefined();
|
|
1460
|
-
log(`✓ Worker received task message: "${taskMsg!.content}"`);
|
|
1461
|
-
},
|
|
1462
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1463
|
-
);
|
|
1464
|
-
|
|
1465
|
-
testFn(
|
|
1466
|
-
"TASK-02: should verify message events are stored with correct structure",
|
|
1467
|
-
async () => {
|
|
1468
|
-
// Create client and session
|
|
1469
|
-
const client = new ACPTestClient(`ws://localhost:${testPort}/acp`);
|
|
1470
|
-
clients.push(client);
|
|
1471
|
-
await client.connect();
|
|
1472
|
-
await client.initialize();
|
|
1473
|
-
await client.newSession({ cwd: testRepo.path });
|
|
1474
|
-
|
|
1475
|
-
// Get head manager
|
|
1476
|
-
const heads = agentManager.listHeadManagers();
|
|
1477
|
-
const headId = heads[0].id;
|
|
1478
|
-
|
|
1479
|
-
// Spawn child
|
|
1480
|
-
const childResult = await client.extMethod("_macro/spawnAgent", {
|
|
1481
|
-
task_description: "Worker",
|
|
1482
|
-
parentId: headId,
|
|
1483
|
-
});
|
|
1484
|
-
const childId = (childResult.result as { agentId: string }).agentId;
|
|
1485
|
-
log(`✓ Child spawned: ${childId}`);
|
|
1486
|
-
|
|
1487
|
-
// Send message
|
|
1488
|
-
const sentMsg = await messageRouter.sendToAddress({
|
|
1489
|
-
from: headId,
|
|
1490
|
-
to: { agent: childId },
|
|
1491
|
-
content: "Message structure check",
|
|
1492
|
-
});
|
|
1493
|
-
log(`✓ Message sent: ${sentMsg.id}`);
|
|
1494
|
-
|
|
1495
|
-
// Query message events - the event id IS the message id
|
|
1496
|
-
const msgEvents = eventStore.query({ type: "message" });
|
|
1497
|
-
const ourEvent = msgEvents.find((e) => e.id === sentMsg.id);
|
|
1498
|
-
expect(ourEvent).toBeDefined();
|
|
1499
|
-
expect(ourEvent!.source.agent_id).toBe(headId);
|
|
1500
|
-
expect(ourEvent!.payload.content).toBe("Message structure check");
|
|
1501
|
-
log(
|
|
1502
|
-
`✓ Message event verified: id=${ourEvent!.id}, from=${ourEvent!.source.agent_id}`,
|
|
1503
|
-
);
|
|
1504
|
-
|
|
1505
|
-
// Verify target in event
|
|
1506
|
-
expect(ourEvent!.target).toBeDefined();
|
|
1507
|
-
expect(ourEvent!.target!.agent_id).toBe(childId);
|
|
1508
|
-
log(`✓ Message target verified: ${ourEvent!.target!.agent_id}`);
|
|
1509
|
-
},
|
|
1510
|
-
{ timeout: TIMEOUT.MULTI_SPAWN },
|
|
1511
|
-
);
|
|
1512
|
-
});
|
|
1513
|
-
});
|
|
1514
|
-
|
|
1515
|
-
// ─────────────────────────────────────────────────────────────────
|
|
1516
|
-
// Skip Message if E2E not enabled
|
|
1517
|
-
// ─────────────────────────────────────────────────────────────────
|
|
1518
|
-
|
|
1519
|
-
if (!RUN_FULL_AGENT) {
|
|
1520
|
-
console.log("\n" + "=".repeat(70));
|
|
1521
|
-
console.log("Multi-Agent E2E tests SKIPPED");
|
|
1522
|
-
console.log("To run with real agents:");
|
|
1523
|
-
console.log(
|
|
1524
|
-
" RUN_FULL_AGENT_TESTS=true npm run test:e2e -- src/__tests__/e2e/multi-agent.e2e.test.ts",
|
|
1525
|
-
);
|
|
1526
|
-
console.log("=".repeat(70) + "\n");
|
|
1527
|
-
}
|