macro-agent 0.1.2 → 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/CLAUDE.md +432 -206
- 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 -1318
- 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/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 -127
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +235 -1574
- 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 +38 -442
- 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 -453
- 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 -301
- 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/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 +14 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -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/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/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/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 +0 -2
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.js +0 -2
- package/dist/teams/index.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/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/package.json +26 -7
- 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 -1794
- package/src/agent/agent-store.ts +385 -0
- package/src/api/__tests__/server.test.ts +235 -1157
- package/src/api/index.ts +5 -3
- package/src/api/server.ts +270 -1989
- package/src/api/types.ts +25 -339
- package/src/boot-v2.ts +527 -0
- package/src/cli/acp.ts +38 -500
- package/src/cli/index.ts +68 -470
- package/src/cli/mcp.ts +260 -340
- 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/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 +42 -224
- 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/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/store/index.ts +3 -64
- 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 +0 -2
- package/src/teams/team-manager-v2.ts +268 -0
- package/src/teams/team-runtime-v2.ts +898 -0
- 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 -51
- package/dist/lifecycle/handlers/index.d.ts.map +0 -1
- package/dist/lifecycle/handlers/index.js +0 -110
- 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 -92
- package/dist/map/adapter/extensions/index.d.ts.map +0 -1
- package/dist/map/adapter/extensions/index.js +0 -214
- 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/streams.d.ts +0 -95
- package/dist/map/adapter/extensions/streams.d.ts.map +0 -1
- package/dist/map/adapter/extensions/streams.js +0 -515
- package/dist/map/adapter/extensions/streams.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 -40
- 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 -72
- package/dist/mcp/mcp-server.d.ts.map +0 -1
- package/dist/mcp/mcp-server.js +0 -1024
- 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 -252
- 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 -95
- package/dist/server/combined-server.d.ts.map +0 -1
- package/dist/server/combined-server.js +0 -335
- 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 -1746
- 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-manager.d.ts +0 -112
- package/dist/teams/team-manager.d.ts.map +0 -1
- package/dist/teams/team-manager.js +0 -305
- package/dist/teams/team-manager.js.map +0 -1
- package/dist/teams/team-runtime.d.ts +0 -245
- package/dist/teams/team-runtime.d.ts.map +0 -1
- package/dist/teams/team-runtime.js +0 -1023
- 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/minimem/.claude/settings.json +0 -7
- package/references/minimem/.sudocode/issues.jsonl +0 -18
- package/references/minimem/.sudocode/specs.jsonl +0 -1
- package/references/minimem/CLAUDE.md +0 -310
- package/references/minimem/README.md +0 -562
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
- package/references/minimem/claude-plugin/.mcp.json +0 -7
- package/references/minimem/claude-plugin/README.md +0 -158
- package/references/minimem/claude-plugin/commands/recall.md +0 -47
- package/references/minimem/claude-plugin/commands/remember.md +0 -41
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
- package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
- package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
- package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
- package/references/minimem/media/banner.png +0 -0
- package/references/minimem/package-lock.json +0 -5373
- package/references/minimem/package.json +0 -72
- package/references/minimem/scripts/postbuild.js +0 -35
- package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
- package/references/minimem/src/__tests__/errors.test.ts +0 -265
- package/references/minimem/src/__tests__/helpers.ts +0 -199
- package/references/minimem/src/__tests__/internal.test.ts +0 -407
- package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
- package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
- package/references/minimem/src/__tests__/session.test.ts +0 -190
- package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
- package/references/minimem/src/cli/commands/append.ts +0 -76
- package/references/minimem/src/cli/commands/config.ts +0 -262
- package/references/minimem/src/cli/commands/conflicts.ts +0 -413
- package/references/minimem/src/cli/commands/daemon.ts +0 -169
- package/references/minimem/src/cli/commands/index.ts +0 -12
- package/references/minimem/src/cli/commands/init.ts +0 -88
- package/references/minimem/src/cli/commands/mcp.ts +0 -177
- package/references/minimem/src/cli/commands/push-pull.ts +0 -213
- package/references/minimem/src/cli/commands/search.ts +0 -158
- package/references/minimem/src/cli/commands/status.ts +0 -84
- package/references/minimem/src/cli/commands/sync-init.ts +0 -290
- package/references/minimem/src/cli/commands/sync.ts +0 -70
- package/references/minimem/src/cli/commands/upsert.ts +0 -197
- package/references/minimem/src/cli/config.ts +0 -584
- package/references/minimem/src/cli/index.ts +0 -264
- package/references/minimem/src/cli/shared.ts +0 -161
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
- package/references/minimem/src/cli/sync/central.ts +0 -292
- package/references/minimem/src/cli/sync/conflicts.ts +0 -204
- package/references/minimem/src/cli/sync/daemon.ts +0 -407
- package/references/minimem/src/cli/sync/detection.ts +0 -138
- package/references/minimem/src/cli/sync/index.ts +0 -107
- package/references/minimem/src/cli/sync/operations.ts +0 -373
- package/references/minimem/src/cli/sync/registry.ts +0 -279
- package/references/minimem/src/cli/sync/state.ts +0 -355
- package/references/minimem/src/cli/sync/validation.ts +0 -206
- package/references/minimem/src/cli/sync/watcher.ts +0 -234
- package/references/minimem/src/cli/version.ts +0 -34
- package/references/minimem/src/core/index.ts +0 -9
- package/references/minimem/src/core/indexer.ts +0 -628
- package/references/minimem/src/core/searcher.ts +0 -221
- package/references/minimem/src/db/schema.ts +0 -183
- package/references/minimem/src/db/sqlite-vec.ts +0 -24
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
- package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
- package/references/minimem/src/embeddings/batch-openai.ts +0 -409
- package/references/minimem/src/embeddings/embeddings.ts +0 -434
- package/references/minimem/src/index.ts +0 -109
- package/references/minimem/src/internal.ts +0 -299
- package/references/minimem/src/minimem.ts +0 -1276
- package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
- package/references/minimem/src/search/graph.ts +0 -234
- package/references/minimem/src/search/hybrid.ts +0 -151
- package/references/minimem/src/search/search.ts +0 -256
- package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
- package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
- package/references/minimem/src/server/mcp.ts +0 -326
- package/references/minimem/src/server/tools.ts +0 -720
- package/references/minimem/src/session.ts +0 -460
- package/references/minimem/tsconfig.json +0 -19
- package/references/minimem/tsup.config.ts +0 -26
- package/references/minimem/vitest.config.ts +0 -24
- 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/references/openteams/.claude/settings.json +0 -6
- package/references/openteams/README.md +0 -1
- package/references/openteams/SKILL.md +0 -341
- package/references/openteams/design.md +0 -411
- package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +0 -16
- package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +0 -24
- package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +0 -25
- package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +0 -21
- package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +0 -20
- package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +0 -17
- package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +0 -23
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +0 -27
- package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +0 -21
- package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +0 -16
- package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +0 -5
- package/references/openteams/examples/bmad-method/roles/analyst.yaml +0 -9
- package/references/openteams/examples/bmad-method/roles/architect.yaml +0 -9
- package/references/openteams/examples/bmad-method/roles/developer.yaml +0 -8
- package/references/openteams/examples/bmad-method/roles/master.yaml +0 -8
- package/references/openteams/examples/bmad-method/roles/pm.yaml +0 -9
- package/references/openteams/examples/bmad-method/roles/qa.yaml +0 -8
- package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +0 -8
- package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +0 -9
- package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +0 -8
- package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +0 -8
- package/references/openteams/examples/bmad-method/team.yaml +0 -161
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +0 -17
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +0 -5
- package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +0 -25
- package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +0 -5
- package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +0 -34
- package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +0 -5
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +0 -18
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +0 -3
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +0 -42
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +0 -5
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +0 -15
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +0 -3
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +0 -17
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +0 -3
- package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +0 -28
- package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +0 -5
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +0 -16
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +0 -3
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +0 -13
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +0 -3
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +0 -14
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +0 -3
- package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +0 -19
- package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +0 -5
- package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/debugger.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/executor.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +0 -9
- package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +0 -7
- package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/planner.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +0 -8
- package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +0 -7
- package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +0 -7
- package/references/openteams/examples/get-shit-done/roles/verifier.yaml +0 -8
- package/references/openteams/examples/get-shit-done/team.yaml +0 -154
- package/references/openteams/package-lock.json +0 -2181
- package/references/openteams/package.json +0 -48
- package/references/openteams/schema/role.schema.json +0 -125
- package/references/openteams/schema/team.schema.json +0 -284
- package/references/openteams/src/cli/agent.ts +0 -104
- package/references/openteams/src/cli/cli.test.ts +0 -381
- package/references/openteams/src/cli/generate.ts +0 -220
- package/references/openteams/src/cli/message.ts +0 -241
- package/references/openteams/src/cli/task.ts +0 -154
- package/references/openteams/src/cli/team.ts +0 -104
- package/references/openteams/src/cli/template.ts +0 -207
- package/references/openteams/src/cli.ts +0 -45
- package/references/openteams/src/db/database.test.ts +0 -185
- package/references/openteams/src/db/database.ts +0 -240
- package/references/openteams/src/generators/agent-prompt-generator.test.ts +0 -332
- package/references/openteams/src/generators/agent-prompt-generator.ts +0 -521
- package/references/openteams/src/generators/package-generator.test.ts +0 -129
- package/references/openteams/src/generators/package-generator.ts +0 -102
- package/references/openteams/src/generators/skill-generator.test.ts +0 -246
- package/references/openteams/src/generators/skill-generator.ts +0 -374
- package/references/openteams/src/index.ts +0 -104
- package/references/openteams/src/services/agent-service.test.ts +0 -158
- package/references/openteams/src/services/agent-service.ts +0 -84
- package/references/openteams/src/services/communication-service.test.ts +0 -455
- package/references/openteams/src/services/communication-service.ts +0 -371
- package/references/openteams/src/services/message-service.test.ts +0 -342
- package/references/openteams/src/services/message-service.ts +0 -203
- package/references/openteams/src/services/task-service.test.ts +0 -434
- package/references/openteams/src/services/task-service.ts +0 -239
- package/references/openteams/src/services/team-service.test.ts +0 -181
- package/references/openteams/src/services/team-service.ts +0 -139
- package/references/openteams/src/services/template-service.test.ts +0 -306
- package/references/openteams/src/services/template-service.ts +0 -182
- package/references/openteams/src/spawner/acp-factory.ts +0 -96
- package/references/openteams/src/spawner/interface.ts +0 -31
- package/references/openteams/src/spawner/mock.test.ts +0 -93
- package/references/openteams/src/spawner/mock.ts +0 -59
- package/references/openteams/src/template/loader.test.ts +0 -1319
- package/references/openteams/src/template/loader.ts +0 -698
- package/references/openteams/src/template/types.ts +0 -200
- package/references/openteams/src/types.ts +0 -205
- package/references/openteams/tsconfig.json +0 -18
- package/references/openteams/vitest.config.ts +0 -9
- package/references/skill-tree/.claude/settings.json +0 -6
- package/references/skill-tree/.sudocode/issues.jsonl +0 -11
- package/references/skill-tree/.sudocode/specs.jsonl +0 -1
- package/references/skill-tree/CLAUDE.md +0 -150
- package/references/skill-tree/README.md +0 -324
- package/references/skill-tree/docs/GAPS_v1.md +0 -221
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
- package/references/skill-tree/docs/TODOS.md +0 -91
- package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
- package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
- package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
- package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
- package/references/skill-tree/docs/scraper/README.md +0 -170
- package/references/skill-tree/examples/basic-usage.ts +0 -190
- package/references/skill-tree/package-lock.json +0 -1509
- package/references/skill-tree/package.json +0 -66
- package/references/skill-tree/scraper/README.md +0 -123
- package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
- package/references/skill-tree/scraper/docs/PLAN.md +0 -336
- package/references/skill-tree/scraper/drizzle.config.ts +0 -10
- package/references/skill-tree/scraper/package-lock.json +0 -6329
- package/references/skill-tree/scraper/package.json +0 -68
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
- package/references/skill-tree/scraper/tsup.config.ts +0 -14
- package/references/skill-tree/scraper/vitest.config.ts +0 -17
- package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
- package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
- package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
- package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
- package/references/skill-tree/test/run-all.ts +0 -106
- package/references/skill-tree/test/utils.ts +0 -128
- package/references/skill-tree/vitest.config.ts +0 -16
- 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 -1879
- 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 -183
- 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__/stream-extensions.test.ts +0 -494
- 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 -316
- package/src/map/adapter/extensions/mcp-bridge.ts +0 -995
- package/src/map/adapter/extensions/resume.ts +0 -114
- package/src/map/adapter/extensions/streams.ts +0 -839
- 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 -163
- 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 -266
- 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 -1406
- 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 -357
- 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 -544
- 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-oob.test.ts +0 -109
- 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 -2214
- 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-pull-mode.test.ts +0 -153
- 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 -256
- 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/CLAUDE.md +0 -180
- 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__/e2e/workspace-isolation.e2e.test.ts +0 -1263
- package/src/teams/__tests__/team-manager.test.ts +0 -814
- package/src/teams/__tests__/team-system.test.ts +0 -2563
- package/src/teams/team-manager.ts +0 -387
- package/src/teams/team-runtime.ts +0 -1198
- 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,2563 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Team System Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests loading team templates, runtime initialization, bootstrap,
|
|
5
|
-
* and integration between team subsystems (roles, communication,
|
|
6
|
-
* strategies, task modes).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
10
|
-
import * as path from "path";
|
|
11
|
-
import { loadTeam } from "../team-loader.js";
|
|
12
|
-
import { TeamRuntime, type TeamServices } from "../team-runtime.js";
|
|
13
|
-
import { DefaultRoleRegistry } from "../../roles/registry.js";
|
|
14
|
-
import type { RoleDefinition } from "../../roles/types.js";
|
|
15
|
-
import type { AgentManager, SpawnInterceptor } from "../../agent/agent-manager.js";
|
|
16
|
-
import type { MessageRouter } from "../../router/message-router.js";
|
|
17
|
-
import type { EventStore } from "../../store/event-store.js";
|
|
18
|
-
import type { SpawnAgentOptions } from "../../agent/types.js";
|
|
19
|
-
import type { AgentId, Event } from "../../store/types/index.js";
|
|
20
|
-
import { TeamLoadError } from "../types.js";
|
|
21
|
-
import type { MacroResolvedTemplate, ResolvedTeamRole, McpServerEntry } from "../types.js";
|
|
22
|
-
|
|
23
|
-
// =============================================================================
|
|
24
|
-
// Helpers
|
|
25
|
-
// =============================================================================
|
|
26
|
-
|
|
27
|
-
const PROJECT_ROOT = path.resolve(import.meta.dirname, "../../..");
|
|
28
|
-
|
|
29
|
-
function createMockEventStore(): EventStore {
|
|
30
|
-
const events: Event[] = [];
|
|
31
|
-
return {
|
|
32
|
-
emit: vi.fn((input: Record<string, unknown>) => {
|
|
33
|
-
const event = {
|
|
34
|
-
id: `evt_${events.length}`,
|
|
35
|
-
type: input.type,
|
|
36
|
-
timestamp: Date.now(),
|
|
37
|
-
source: input.source,
|
|
38
|
-
target: input.target,
|
|
39
|
-
payload: input.payload,
|
|
40
|
-
} as unknown as Event;
|
|
41
|
-
events.push(event);
|
|
42
|
-
return event;
|
|
43
|
-
}),
|
|
44
|
-
persist: vi.fn().mockResolvedValue(undefined),
|
|
45
|
-
close: vi.fn().mockResolvedValue(undefined),
|
|
46
|
-
query: vi.fn().mockReturnValue([]),
|
|
47
|
-
getAgent: vi.fn().mockReturnValue(null),
|
|
48
|
-
getTask: vi.fn().mockReturnValue(null),
|
|
49
|
-
listAgents: vi.fn().mockReturnValue([]),
|
|
50
|
-
onAgentChange: vi.fn(),
|
|
51
|
-
onTaskChange: vi.fn(),
|
|
52
|
-
instanceId: "test-instance",
|
|
53
|
-
_events: events,
|
|
54
|
-
} as unknown as EventStore & { _events: Event[] };
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function createMockMessageRouter(): MessageRouter {
|
|
58
|
-
return {
|
|
59
|
-
sendToAddress: vi.fn().mockResolvedValue({ delivered: true }),
|
|
60
|
-
emitStatus: vi.fn(),
|
|
61
|
-
getMessages: vi.fn().mockReturnValue([]),
|
|
62
|
-
subscribe: vi.fn(),
|
|
63
|
-
unsubscribe: vi.fn(),
|
|
64
|
-
getSubscriptions: vi.fn().mockReturnValue([]),
|
|
65
|
-
setupDefaultSubscriptions: vi.fn(),
|
|
66
|
-
setSignalFilter: vi.fn(),
|
|
67
|
-
setEmissionValidator: vi.fn(),
|
|
68
|
-
} as unknown as MessageRouter;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
let spawnCounter = 0;
|
|
72
|
-
let capturedInterceptor: SpawnInterceptor | null = null;
|
|
73
|
-
let interceptedSpawnOptions: SpawnAgentOptions[] = [];
|
|
74
|
-
|
|
75
|
-
function createMockAgentManager(roleRegistry: DefaultRoleRegistry): AgentManager {
|
|
76
|
-
capturedInterceptor = null;
|
|
77
|
-
spawnCounter = 0;
|
|
78
|
-
interceptedSpawnOptions = [];
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
spawn: vi.fn(async (options: SpawnAgentOptions) => {
|
|
82
|
-
// Apply interceptor if set and record the intercepted options
|
|
83
|
-
const opts = capturedInterceptor ? capturedInterceptor(options) : options;
|
|
84
|
-
interceptedSpawnOptions.push(opts);
|
|
85
|
-
const id = `agent_${spawnCounter++}`;
|
|
86
|
-
return {
|
|
87
|
-
id,
|
|
88
|
-
session_id: `session_${id}`,
|
|
89
|
-
task: opts.task ?? "test",
|
|
90
|
-
state: "running" as const,
|
|
91
|
-
created_at: Date.now(),
|
|
92
|
-
parent: opts.parent ?? null,
|
|
93
|
-
role: opts.role,
|
|
94
|
-
config: opts.config,
|
|
95
|
-
_spawnOptions: opts,
|
|
96
|
-
};
|
|
97
|
-
}),
|
|
98
|
-
terminate: vi.fn().mockResolvedValue(undefined),
|
|
99
|
-
get: vi.fn().mockReturnValue(null),
|
|
100
|
-
list: vi.fn().mockReturnValue([]),
|
|
101
|
-
getChildren: vi.fn().mockReturnValue([]),
|
|
102
|
-
getHierarchy: vi.fn().mockReturnValue(null),
|
|
103
|
-
getSession: vi.fn().mockReturnValue(null),
|
|
104
|
-
hasActiveSession: vi.fn().mockReturnValue(false),
|
|
105
|
-
setSpawnInterceptor: vi.fn((interceptor: SpawnInterceptor | null) => {
|
|
106
|
-
capturedInterceptor = interceptor;
|
|
107
|
-
}),
|
|
108
|
-
getRoleRegistry: vi.fn(() => roleRegistry),
|
|
109
|
-
onLifecycleEvent: vi.fn(() => vi.fn()),
|
|
110
|
-
continueAgent: vi.fn().mockResolvedValue({ id: "continued_0" }),
|
|
111
|
-
close: vi.fn().mockResolvedValue(undefined),
|
|
112
|
-
getOrCreateHeadManager: vi.fn(),
|
|
113
|
-
prompt: vi.fn(),
|
|
114
|
-
isPrompting: vi.fn().mockReturnValue(false),
|
|
115
|
-
} as unknown as AgentManager;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// =============================================================================
|
|
119
|
-
// Tests: Team Loading
|
|
120
|
-
// =============================================================================
|
|
121
|
-
|
|
122
|
-
describe("Team Template Loading", () => {
|
|
123
|
-
let roleRegistry: DefaultRoleRegistry;
|
|
124
|
-
|
|
125
|
-
beforeEach(() => {
|
|
126
|
-
roleRegistry = new DefaultRoleRegistry();
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("loads self-driving team template", async () => {
|
|
130
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
131
|
-
|
|
132
|
-
expect(manifest.name).toBe("self-driving");
|
|
133
|
-
expect(manifest.version).toBe(1);
|
|
134
|
-
expect(manifest.roles).toEqual(["planner", "grinder", "judge"]);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("resolves self-driving roles with correct base roles", async () => {
|
|
138
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
139
|
-
|
|
140
|
-
const planner = manifest._resolvedRoles.get("planner");
|
|
141
|
-
expect(planner).toBeDefined();
|
|
142
|
-
expect(planner!.baseRole).toBe("coordinator");
|
|
143
|
-
|
|
144
|
-
const grinder = manifest._resolvedRoles.get("grinder");
|
|
145
|
-
expect(grinder).toBeDefined();
|
|
146
|
-
expect(grinder!.baseRole).toBe("worker");
|
|
147
|
-
|
|
148
|
-
const judge = manifest._resolvedRoles.get("judge");
|
|
149
|
-
expect(judge).toBeDefined();
|
|
150
|
-
expect(judge!.baseRole).toBe("monitor");
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it("resolves capability additions and removals", async () => {
|
|
154
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
155
|
-
|
|
156
|
-
const planner = manifest._resolvedRoles.get("planner");
|
|
157
|
-
expect(planner!.capabilities).toContain("task.claim");
|
|
158
|
-
expect(planner!.capabilities).not.toContain("agent.spawn.integrator");
|
|
159
|
-
expect(planner!.capabilities).not.toContain("agent.spawn.monitor");
|
|
160
|
-
|
|
161
|
-
const grinder = manifest._resolvedRoles.get("grinder");
|
|
162
|
-
expect(grinder!.capabilities).toContain("task.claim");
|
|
163
|
-
expect(grinder!.capabilities).toContain("git.push");
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("translates spawn_rules into capabilities", async () => {
|
|
167
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
168
|
-
|
|
169
|
-
const planner = manifest._resolvedRoles.get("planner");
|
|
170
|
-
expect(planner!.capabilities).toContain("agent.spawn.grinder");
|
|
171
|
-
expect(planner!.capabilities).toContain("agent.spawn.planner");
|
|
172
|
-
|
|
173
|
-
// Judge and grinder have no spawn rules → no spawn capabilities
|
|
174
|
-
const judge = manifest._resolvedRoles.get("judge");
|
|
175
|
-
expect(judge!.capabilities.filter((c) => c.startsWith("agent.spawn."))).toEqual([]);
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it("loads prompt files", async () => {
|
|
179
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
180
|
-
|
|
181
|
-
expect(manifest._loadedPrompts.has("prompts/planner.md")).toBe(true);
|
|
182
|
-
expect(manifest._loadedPrompts.has("prompts/grinder.md")).toBe(true);
|
|
183
|
-
expect(manifest._loadedPrompts.has("prompts/judge.md")).toBe(true);
|
|
184
|
-
|
|
185
|
-
const plannerPrompt = manifest._loadedPrompts.get("prompts/planner.md")!;
|
|
186
|
-
expect(plannerPrompt).toContain("Planner");
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it("parses macro_agent extensions", async () => {
|
|
190
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
191
|
-
|
|
192
|
-
expect(manifest.macro_agent.task_assignment?.mode).toBe("pull");
|
|
193
|
-
expect(manifest.macro_agent.integration?.strategy).toBe("trunk");
|
|
194
|
-
expect(manifest.macro_agent.lifecycle?.continuations?.enabled).toBe(true);
|
|
195
|
-
expect(manifest.macro_agent.lifecycle?.scaling?.max_workers).toBe(20);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it("validates communication topology", async () => {
|
|
199
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
200
|
-
|
|
201
|
-
expect(manifest.communication.channels).toBeDefined();
|
|
202
|
-
expect(Object.keys(manifest.communication.channels!)).toContain("task_updates");
|
|
203
|
-
expect(Object.keys(manifest.communication.channels!)).toContain("work_coordination");
|
|
204
|
-
expect(Object.keys(manifest.communication.channels!)).toContain("health");
|
|
205
|
-
|
|
206
|
-
expect(manifest.communication.subscriptions?.planner).toBeDefined();
|
|
207
|
-
expect(manifest.communication.emissions?.planner).toContain("TASK_CREATED");
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it("loads structured team template", async () => {
|
|
211
|
-
const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
|
|
212
|
-
|
|
213
|
-
expect(manifest.name).toBe("structured");
|
|
214
|
-
expect(manifest.roles).toEqual(["lead", "developer", "reviewer", "merger"]);
|
|
215
|
-
expect(manifest.macro_agent.task_assignment?.mode).toBe("push");
|
|
216
|
-
expect(manifest.macro_agent.integration?.strategy).toBe("queue");
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it("resolves structured roles", async () => {
|
|
220
|
-
const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
|
|
221
|
-
|
|
222
|
-
const lead = manifest._resolvedRoles.get("lead");
|
|
223
|
-
expect(lead!.baseRole).toBe("coordinator");
|
|
224
|
-
|
|
225
|
-
const developer = manifest._resolvedRoles.get("developer");
|
|
226
|
-
expect(developer!.baseRole).toBe("worker");
|
|
227
|
-
|
|
228
|
-
const reviewer = manifest._resolvedRoles.get("reviewer");
|
|
229
|
-
expect(reviewer!.baseRole).toBe("monitor");
|
|
230
|
-
expect(reviewer!.capabilities).toContain("exec.build");
|
|
231
|
-
expect(reviewer!.capabilities).toContain("exec.test");
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
// =============================================================================
|
|
236
|
-
// Tests: TeamRuntime
|
|
237
|
-
// =============================================================================
|
|
238
|
-
|
|
239
|
-
describe("TeamRuntime", () => {
|
|
240
|
-
let roleRegistry: DefaultRoleRegistry;
|
|
241
|
-
let agentManager: AgentManager;
|
|
242
|
-
let messageRouter: MessageRouter;
|
|
243
|
-
let eventStore: EventStore & { _events: Event[] };
|
|
244
|
-
let services: TeamServices;
|
|
245
|
-
|
|
246
|
-
beforeEach(() => {
|
|
247
|
-
roleRegistry = new DefaultRoleRegistry();
|
|
248
|
-
eventStore = createMockEventStore() as EventStore & { _events: Event[] };
|
|
249
|
-
messageRouter = createMockMessageRouter();
|
|
250
|
-
agentManager = createMockAgentManager(roleRegistry);
|
|
251
|
-
services = { agentManager, messageRouter, eventStore };
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
describe("initialize()", () => {
|
|
255
|
-
it("registers team roles in the role registry", async () => {
|
|
256
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
257
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
258
|
-
|
|
259
|
-
await runtime.initialize();
|
|
260
|
-
|
|
261
|
-
// Roles should be registered in the registry
|
|
262
|
-
expect(roleRegistry.getRole("planner")).toBeDefined();
|
|
263
|
-
expect(roleRegistry.getRole("grinder")).toBeDefined();
|
|
264
|
-
expect(roleRegistry.getRole("judge")).toBeDefined();
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it("emits team_config event to EventStore", async () => {
|
|
268
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
269
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
270
|
-
|
|
271
|
-
await runtime.initialize();
|
|
272
|
-
|
|
273
|
-
expect(eventStore.emit).toHaveBeenCalledWith(
|
|
274
|
-
expect.objectContaining({
|
|
275
|
-
type: "status",
|
|
276
|
-
payload: expect.objectContaining({
|
|
277
|
-
status_type: "discovery",
|
|
278
|
-
team_config: expect.objectContaining({
|
|
279
|
-
teamName: "self-driving",
|
|
280
|
-
strategy: "trunk",
|
|
281
|
-
taskMode: "pull",
|
|
282
|
-
}),
|
|
283
|
-
}),
|
|
284
|
-
})
|
|
285
|
-
);
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it("does not install spawn interceptor directly (TeamManager responsibility)", async () => {
|
|
289
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
290
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
291
|
-
|
|
292
|
-
await runtime.initialize();
|
|
293
|
-
|
|
294
|
-
// initialize() no longer installs interceptor — that's TeamManager's job
|
|
295
|
-
expect(agentManager.setSpawnInterceptor).not.toHaveBeenCalled();
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
it("installOnServices() sets spawn interceptor on agent manager", async () => {
|
|
299
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
300
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
301
|
-
|
|
302
|
-
await runtime.initialize();
|
|
303
|
-
runtime.installOnServices();
|
|
304
|
-
|
|
305
|
-
expect(agentManager.setSpawnInterceptor).toHaveBeenCalledWith(
|
|
306
|
-
expect.any(Function)
|
|
307
|
-
);
|
|
308
|
-
});
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
describe("bootstrap()", () => {
|
|
312
|
-
it("spawns root and companion agents", async () => {
|
|
313
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
314
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
315
|
-
|
|
316
|
-
await runtime.initialize();
|
|
317
|
-
const result = await runtime.bootstrap();
|
|
318
|
-
|
|
319
|
-
expect(result.rootId).toBeDefined();
|
|
320
|
-
expect(result.companionIds).toHaveLength(1); // judge is the companion
|
|
321
|
-
|
|
322
|
-
// Two spawn calls: planner (root) + judge (companion)
|
|
323
|
-
expect(agentManager.spawn).toHaveBeenCalledTimes(2);
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
it("spawns root with correct role and model", async () => {
|
|
327
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
328
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
329
|
-
|
|
330
|
-
await runtime.initialize();
|
|
331
|
-
await runtime.bootstrap();
|
|
332
|
-
|
|
333
|
-
const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
|
|
334
|
-
const rootCall = spawnCalls[0][0];
|
|
335
|
-
|
|
336
|
-
expect(rootCall.role).toBe("planner");
|
|
337
|
-
expect(rootCall.config?.model).toBe("sonnet");
|
|
338
|
-
expect(rootCall.parent).toBeNull();
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
it("spawns companion as peer (not child)", async () => {
|
|
342
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
343
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
344
|
-
|
|
345
|
-
await runtime.initialize();
|
|
346
|
-
await runtime.bootstrap();
|
|
347
|
-
|
|
348
|
-
const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
|
|
349
|
-
const companionCall = spawnCalls[1][0];
|
|
350
|
-
|
|
351
|
-
expect(companionCall.role).toBe("judge");
|
|
352
|
-
expect(companionCall.config?.model).toBe("haiku");
|
|
353
|
-
expect(companionCall.parent).toBeNull();
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
it("wires config-driven peer subscriptions from routing.peers", async () => {
|
|
357
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
358
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
359
|
-
|
|
360
|
-
await runtime.initialize();
|
|
361
|
-
const result = await runtime.bootstrap();
|
|
362
|
-
|
|
363
|
-
// self-driving has 2 peer entries: judge→planner + planner→judge, both via: "direct"
|
|
364
|
-
// Each creates one directional subtree subscription
|
|
365
|
-
expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
|
|
366
|
-
|
|
367
|
-
// judge (agent_1) subscribes to planner's (agent_0) subtree
|
|
368
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
369
|
-
result.companionIds[0], // judge = agent_1
|
|
370
|
-
{ type: "subtree", target: result.rootId } // planner = agent_0
|
|
371
|
-
);
|
|
372
|
-
|
|
373
|
-
// planner (agent_0) subscribes to judge's (agent_1) subtree
|
|
374
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
375
|
-
result.rootId, // planner = agent_0
|
|
376
|
-
{ type: "subtree", target: result.companionIds[0] } // judge = agent_1
|
|
377
|
-
);
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
it("injects interaction patterns for pull mode", async () => {
|
|
381
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
382
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
383
|
-
|
|
384
|
-
await runtime.initialize();
|
|
385
|
-
await runtime.bootstrap();
|
|
386
|
-
|
|
387
|
-
const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
|
|
388
|
-
const rootCall = spawnCalls[0][0];
|
|
389
|
-
|
|
390
|
-
expect(rootCall.interactionPatterns).toBeDefined();
|
|
391
|
-
expect(rootCall.interactionPatterns!.length).toBeGreaterThan(0);
|
|
392
|
-
expect(rootCall.interactionPatterns!.some((p) => p.includes("PULL mode"))).toBe(true);
|
|
393
|
-
expect(rootCall.interactionPatterns!.some((p) => p.includes("trunk"))).toBe(true);
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it("provides team prompts to spawned agents", async () => {
|
|
397
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
398
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
399
|
-
|
|
400
|
-
await runtime.initialize();
|
|
401
|
-
await runtime.bootstrap();
|
|
402
|
-
|
|
403
|
-
const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
|
|
404
|
-
const rootCall = spawnCalls[0][0];
|
|
405
|
-
|
|
406
|
-
expect(rootCall.customPrompt).toBeDefined();
|
|
407
|
-
expect(rootCall.customPrompt).toContain("Planner");
|
|
408
|
-
});
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
describe("spawn interceptor", () => {
|
|
412
|
-
it("injects team topics into spawned agent options", async () => {
|
|
413
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
414
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
415
|
-
|
|
416
|
-
await runtime.initialize();
|
|
417
|
-
runtime.installOnServices();
|
|
418
|
-
await runtime.bootstrap();
|
|
419
|
-
|
|
420
|
-
// Now spawn a grinder through the interceptor
|
|
421
|
-
await agentManager.spawn({
|
|
422
|
-
task: "test grinder task",
|
|
423
|
-
role: "grinder",
|
|
424
|
-
parent: "agent_0",
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
// Check the intercepted options (not the original args)
|
|
428
|
-
const lastOpts = interceptedSpawnOptions.at(-1)!;
|
|
429
|
-
// Interceptor should have added topics for grinder subscriptions
|
|
430
|
-
expect(lastOpts.topics).toBeDefined();
|
|
431
|
-
expect(lastOpts.topics).toContain("work_coordination");
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
it("injects team environment variables", async () => {
|
|
435
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
436
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
437
|
-
|
|
438
|
-
await runtime.initialize();
|
|
439
|
-
runtime.installOnServices();
|
|
440
|
-
await runtime.bootstrap();
|
|
441
|
-
|
|
442
|
-
// Spawn a grinder
|
|
443
|
-
await agentManager.spawn({
|
|
444
|
-
task: "test task",
|
|
445
|
-
role: "grinder",
|
|
446
|
-
parent: "agent_0",
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
const lastOpts = interceptedSpawnOptions.at(-1)!;
|
|
450
|
-
expect(lastOpts.config?.env?.MACRO_TEAM_NAME).toBe("self-driving");
|
|
451
|
-
expect(lastOpts.config?.env?.MACRO_TASK_MODE).toBe("pull");
|
|
452
|
-
expect(lastOpts.config?.env?.MACRO_INTEGRATION_STRATEGY).toBe("trunk");
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
it("does not override caller-provided options", async () => {
|
|
456
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
457
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
458
|
-
|
|
459
|
-
await runtime.initialize();
|
|
460
|
-
runtime.installOnServices();
|
|
461
|
-
await runtime.bootstrap();
|
|
462
|
-
|
|
463
|
-
const customPrompt = "My custom prompt";
|
|
464
|
-
await agentManager.spawn({
|
|
465
|
-
task: "test task",
|
|
466
|
-
role: "grinder",
|
|
467
|
-
parent: "agent_0",
|
|
468
|
-
customPrompt,
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
const lastOpts = interceptedSpawnOptions.at(-1)!;
|
|
472
|
-
expect(lastOpts.customPrompt).toBe(customPrompt);
|
|
473
|
-
});
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
describe("getters", () => {
|
|
477
|
-
it("returns task mode and strategy", async () => {
|
|
478
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
479
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
480
|
-
|
|
481
|
-
expect(runtime.getTaskMode()).toBe("pull");
|
|
482
|
-
expect(runtime.getStrategyName()).toBe("trunk");
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
it("returns agent IDs after bootstrap", async () => {
|
|
486
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
487
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
488
|
-
|
|
489
|
-
await runtime.initialize();
|
|
490
|
-
const result = await runtime.bootstrap();
|
|
491
|
-
|
|
492
|
-
expect(runtime.getRootAgentId()).toBe(result.rootId);
|
|
493
|
-
expect(runtime.getCompanionAgentIds()).toEqual(result.companionIds);
|
|
494
|
-
});
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
describe("teardown()", () => {
|
|
498
|
-
it("does not clear interceptor directly (caller responsibility)", async () => {
|
|
499
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
500
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
501
|
-
|
|
502
|
-
await runtime.initialize();
|
|
503
|
-
runtime.installOnServices();
|
|
504
|
-
await runtime.bootstrap();
|
|
505
|
-
|
|
506
|
-
// Reset mock to track only teardown-related calls
|
|
507
|
-
vi.mocked(agentManager.setSpawnInterceptor).mockClear();
|
|
508
|
-
|
|
509
|
-
await runtime.teardown();
|
|
510
|
-
|
|
511
|
-
// teardown() no longer clears interceptor — that's the caller's responsibility
|
|
512
|
-
expect(agentManager.setSpawnInterceptor).not.toHaveBeenCalled();
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
it("uninstallFromServices() clears spawn interceptor", async () => {
|
|
516
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
517
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
518
|
-
|
|
519
|
-
await runtime.initialize();
|
|
520
|
-
runtime.installOnServices();
|
|
521
|
-
await runtime.bootstrap();
|
|
522
|
-
await runtime.teardown();
|
|
523
|
-
runtime.uninstallFromServices();
|
|
524
|
-
|
|
525
|
-
expect(agentManager.setSpawnInterceptor).toHaveBeenLastCalledWith(null);
|
|
526
|
-
});
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
describe("peer routing", () => {
|
|
530
|
-
it("stores signal filters from peer connections", async () => {
|
|
531
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
532
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
533
|
-
|
|
534
|
-
await runtime.initialize();
|
|
535
|
-
const result = await runtime.bootstrap();
|
|
536
|
-
|
|
537
|
-
const filters = runtime.getPeerSignalFilters();
|
|
538
|
-
|
|
539
|
-
// judge→planner has signals: [FIXUP_CREATED, GREEN_SNAPSHOT]
|
|
540
|
-
const judgeToPlanner = filters.get(`${result.companionIds[0]}→${result.rootId}`);
|
|
541
|
-
expect(judgeToPlanner).toEqual(["FIXUP_CREATED", "GREEN_SNAPSHOT"]);
|
|
542
|
-
|
|
543
|
-
// planner→judge has signals: [CONVERGENCE_CHECK]
|
|
544
|
-
const plannerToJudge = filters.get(`${result.rootId}→${result.companionIds[0]}`);
|
|
545
|
-
expect(plannerToJudge).toEqual(["CONVERGENCE_CHECK"]);
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
it("falls back to legacy subtree subscriptions when no peers config", async () => {
|
|
549
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
550
|
-
|
|
551
|
-
// Remove routing.peers to test fallback
|
|
552
|
-
manifest.communication.routing = { status: "upstream" };
|
|
553
|
-
|
|
554
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
555
|
-
|
|
556
|
-
await runtime.initialize();
|
|
557
|
-
const result = await runtime.bootstrap();
|
|
558
|
-
|
|
559
|
-
// Legacy: 2 bidirectional subtree subs (root→companion + companion→root)
|
|
560
|
-
expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
|
|
561
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
562
|
-
result.rootId,
|
|
563
|
-
{ type: "subtree", target: result.companionIds[0] }
|
|
564
|
-
);
|
|
565
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
566
|
-
result.companionIds[0],
|
|
567
|
-
{ type: "subtree", target: result.rootId }
|
|
568
|
-
);
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
it("defers wiring for roles not spawned at bootstrap", async () => {
|
|
572
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
573
|
-
|
|
574
|
-
// Add a peer connection involving grinder (not spawned at bootstrap)
|
|
575
|
-
manifest.communication.routing!.peers!.push({
|
|
576
|
-
from: "grinder",
|
|
577
|
-
to: "planner",
|
|
578
|
-
via: "direct",
|
|
579
|
-
signals: ["WORKER_DONE"],
|
|
580
|
-
});
|
|
581
|
-
|
|
582
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
583
|
-
|
|
584
|
-
await runtime.initialize();
|
|
585
|
-
const result = await runtime.bootstrap();
|
|
586
|
-
|
|
587
|
-
// 2 wired at bootstrap (judge↔planner) + 1 deferred (grinder→planner)
|
|
588
|
-
expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
|
|
589
|
-
|
|
590
|
-
// onLifecycleEvent should have been called twice: once for deferred wiring, once for continuations
|
|
591
|
-
expect(agentManager.onLifecycleEvent).toHaveBeenCalledTimes(2);
|
|
592
|
-
|
|
593
|
-
// Simulate grinder spawn via lifecycle event
|
|
594
|
-
const lifecycleCallbacks = vi.mocked(agentManager.onLifecycleEvent).mock.calls;
|
|
595
|
-
// The deferred wiring callback is the first one registered (wirePeerRoutes before monitorContinuations)
|
|
596
|
-
const deferredCallback = lifecycleCallbacks[0][0];
|
|
597
|
-
|
|
598
|
-
deferredCallback({
|
|
599
|
-
type: "spawned",
|
|
600
|
-
agent: { id: "grinder_agent", role: "grinder", state: "running" },
|
|
601
|
-
} as any);
|
|
602
|
-
|
|
603
|
-
// Now the deferred route should be wired
|
|
604
|
-
expect(messageRouter.subscribe).toHaveBeenCalledTimes(3);
|
|
605
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
606
|
-
"grinder_agent",
|
|
607
|
-
{ type: "subtree", target: result.rootId }
|
|
608
|
-
);
|
|
609
|
-
|
|
610
|
-
// Signal filter should be stored
|
|
611
|
-
const filters = runtime.getPeerSignalFilters();
|
|
612
|
-
expect(filters.get(`grinder_agent→${result.rootId}`)).toEqual(["WORKER_DONE"]);
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
it("serializes peerRoutes in team_config event", async () => {
|
|
616
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
617
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
618
|
-
|
|
619
|
-
await runtime.initialize();
|
|
620
|
-
|
|
621
|
-
expect(eventStore.emit).toHaveBeenCalledWith(
|
|
622
|
-
expect.objectContaining({
|
|
623
|
-
type: "status",
|
|
624
|
-
payload: expect.objectContaining({
|
|
625
|
-
team_config: expect.objectContaining({
|
|
626
|
-
peerRoutes: expect.arrayContaining([
|
|
627
|
-
expect.objectContaining({
|
|
628
|
-
from: "judge",
|
|
629
|
-
to: "planner",
|
|
630
|
-
via: "direct",
|
|
631
|
-
signals: ["FIXUP_CREATED", "GREEN_SNAPSHOT"],
|
|
632
|
-
}),
|
|
633
|
-
]),
|
|
634
|
-
}),
|
|
635
|
-
}),
|
|
636
|
-
})
|
|
637
|
-
);
|
|
638
|
-
});
|
|
639
|
-
|
|
640
|
-
it("teardown cleans up deferred wiring listener", async () => {
|
|
641
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
642
|
-
|
|
643
|
-
// Add a deferred route to ensure the wiring listener is set up
|
|
644
|
-
manifest.communication.routing!.peers!.push({
|
|
645
|
-
from: "grinder",
|
|
646
|
-
to: "judge",
|
|
647
|
-
via: "direct",
|
|
648
|
-
});
|
|
649
|
-
|
|
650
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
651
|
-
|
|
652
|
-
await runtime.initialize();
|
|
653
|
-
await runtime.bootstrap();
|
|
654
|
-
|
|
655
|
-
// onLifecycleEvent called twice: deferred wiring + continuations
|
|
656
|
-
expect(agentManager.onLifecycleEvent).toHaveBeenCalledTimes(2);
|
|
657
|
-
|
|
658
|
-
// Both return unsubscribe fns (index 0 = deferred wiring, index 1 = continuations)
|
|
659
|
-
const peerWiringUnsub = vi.mocked(agentManager.onLifecycleEvent).mock.results[0].value;
|
|
660
|
-
const continuationsUnsub = vi.mocked(agentManager.onLifecycleEvent).mock.results[1].value;
|
|
661
|
-
|
|
662
|
-
await runtime.teardown();
|
|
663
|
-
|
|
664
|
-
// Both unsubscribe fns should be called
|
|
665
|
-
expect(peerWiringUnsub).toHaveBeenCalled();
|
|
666
|
-
expect(continuationsUnsub).toHaveBeenCalled();
|
|
667
|
-
});
|
|
668
|
-
|
|
669
|
-
it("via topic creates shared topic subscription", async () => {
|
|
670
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
671
|
-
|
|
672
|
-
// Replace peers with a topic-based connection
|
|
673
|
-
manifest.communication.routing!.peers = [
|
|
674
|
-
{ from: "planner", to: "judge", via: "topic" },
|
|
675
|
-
];
|
|
676
|
-
|
|
677
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
678
|
-
|
|
679
|
-
await runtime.initialize();
|
|
680
|
-
const result = await runtime.bootstrap();
|
|
681
|
-
|
|
682
|
-
// Topic creates 2 subscriptions: both agents to the same topic
|
|
683
|
-
expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
|
|
684
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
685
|
-
result.rootId, // planner
|
|
686
|
-
{ type: "topic", target: "peer:planner:judge" }
|
|
687
|
-
);
|
|
688
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
689
|
-
result.companionIds[0], // judge
|
|
690
|
-
{ type: "topic", target: "peer:planner:judge" }
|
|
691
|
-
);
|
|
692
|
-
});
|
|
693
|
-
|
|
694
|
-
it("via scope creates role subscription", async () => {
|
|
695
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
696
|
-
|
|
697
|
-
// Replace peers with a scope-based connection
|
|
698
|
-
manifest.communication.routing!.peers = [
|
|
699
|
-
{ from: "planner", to: "judge", via: "scope" },
|
|
700
|
-
];
|
|
701
|
-
|
|
702
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
703
|
-
|
|
704
|
-
await runtime.initialize();
|
|
705
|
-
const result = await runtime.bootstrap();
|
|
706
|
-
|
|
707
|
-
// Scope creates 1 subscription: from subscribes to to's role channel
|
|
708
|
-
expect(messageRouter.subscribe).toHaveBeenCalledTimes(1);
|
|
709
|
-
expect(messageRouter.subscribe).toHaveBeenCalledWith(
|
|
710
|
-
result.rootId, // planner
|
|
711
|
-
{ type: "role", target: "judge" }
|
|
712
|
-
);
|
|
713
|
-
});
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
describe("signal filtering", () => {
|
|
717
|
-
it("installOnServices() installs signal filter on message router", async () => {
|
|
718
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
719
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
720
|
-
|
|
721
|
-
await runtime.initialize();
|
|
722
|
-
// bootstrap/initialize alone should NOT install filter
|
|
723
|
-
await runtime.bootstrap();
|
|
724
|
-
expect(messageRouter.setSignalFilter).not.toHaveBeenCalled();
|
|
725
|
-
|
|
726
|
-
// installOnServices() installs the filter
|
|
727
|
-
runtime.installOnServices();
|
|
728
|
-
expect(messageRouter.setSignalFilter).toHaveBeenCalledTimes(1);
|
|
729
|
-
expect(messageRouter.setSignalFilter).toHaveBeenCalledWith(expect.any(Function));
|
|
730
|
-
});
|
|
731
|
-
|
|
732
|
-
it("peer connection filter allows matching signals", async () => {
|
|
733
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
734
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
735
|
-
|
|
736
|
-
await runtime.initialize();
|
|
737
|
-
const result = await runtime.bootstrap();
|
|
738
|
-
runtime.installOnServices();
|
|
739
|
-
|
|
740
|
-
// Extract the installed filter
|
|
741
|
-
const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
|
|
742
|
-
from: string, to: string, signal: string | undefined
|
|
743
|
-
) => boolean;
|
|
744
|
-
|
|
745
|
-
const judgeId = result.companionIds[0]; // judge
|
|
746
|
-
const plannerId = result.rootId; // planner
|
|
747
|
-
|
|
748
|
-
// judge→planner peer has signals: [FIXUP_CREATED, GREEN_SNAPSHOT]
|
|
749
|
-
expect(filterFn(judgeId, plannerId, "FIXUP_CREATED")).toBe(true);
|
|
750
|
-
expect(filterFn(judgeId, plannerId, "GREEN_SNAPSHOT")).toBe(true);
|
|
751
|
-
});
|
|
752
|
-
|
|
753
|
-
it("peer connection filter blocks non-matching signals", async () => {
|
|
754
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
755
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
756
|
-
|
|
757
|
-
await runtime.initialize();
|
|
758
|
-
const result = await runtime.bootstrap();
|
|
759
|
-
runtime.installOnServices();
|
|
760
|
-
|
|
761
|
-
const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
|
|
762
|
-
from: string, to: string, signal: string | undefined
|
|
763
|
-
) => boolean;
|
|
764
|
-
|
|
765
|
-
const judgeId = result.companionIds[0];
|
|
766
|
-
const plannerId = result.rootId;
|
|
767
|
-
|
|
768
|
-
// judge→planner peer does NOT include WORKER_DONE
|
|
769
|
-
expect(filterFn(judgeId, plannerId, "WORKER_DONE")).toBe(false);
|
|
770
|
-
});
|
|
771
|
-
|
|
772
|
-
it("untagged status events always pass through", async () => {
|
|
773
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
774
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
775
|
-
|
|
776
|
-
await runtime.initialize();
|
|
777
|
-
const result = await runtime.bootstrap();
|
|
778
|
-
runtime.installOnServices();
|
|
779
|
-
|
|
780
|
-
const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
|
|
781
|
-
from: string, to: string, signal: string | undefined
|
|
782
|
-
) => boolean;
|
|
783
|
-
|
|
784
|
-
const judgeId = result.companionIds[0];
|
|
785
|
-
const plannerId = result.rootId;
|
|
786
|
-
|
|
787
|
-
// No signal (undefined) should always pass
|
|
788
|
-
expect(filterFn(judgeId, plannerId, undefined)).toBe(true);
|
|
789
|
-
});
|
|
790
|
-
|
|
791
|
-
it("channel subscription filter allows role's configured signals", async () => {
|
|
792
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
793
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
794
|
-
|
|
795
|
-
await runtime.initialize();
|
|
796
|
-
const result = await runtime.bootstrap();
|
|
797
|
-
runtime.installOnServices();
|
|
798
|
-
|
|
799
|
-
const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
|
|
800
|
-
from: string, to: string, signal: string | undefined
|
|
801
|
-
) => boolean;
|
|
802
|
-
|
|
803
|
-
// Use a "grinder" agent as recipient - grinder only allows WORK_ASSIGNED
|
|
804
|
-
// Simulate spawning a grinder by triggering deferred wiring
|
|
805
|
-
// But grinder has no peer connection, so we test channel sub filter directly
|
|
806
|
-
// by spawning through the lifecycle event to populate agentRoleMap
|
|
807
|
-
|
|
808
|
-
// Add a grinder peer route so deferred wiring populates agentRoleMap
|
|
809
|
-
manifest.communication.routing!.peers!.push({
|
|
810
|
-
from: "grinder",
|
|
811
|
-
to: "planner",
|
|
812
|
-
via: "direct",
|
|
813
|
-
});
|
|
814
|
-
|
|
815
|
-
// Re-bootstrap with updated manifest
|
|
816
|
-
const runtime2 = new TeamRuntime(manifest, services);
|
|
817
|
-
await runtime2.initialize();
|
|
818
|
-
const result2 = await runtime2.bootstrap();
|
|
819
|
-
runtime2.installOnServices();
|
|
820
|
-
|
|
821
|
-
// Simulate grinder spawn via lifecycle event
|
|
822
|
-
const deferredCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls.at(-2)![0];
|
|
823
|
-
deferredCallback({
|
|
824
|
-
type: "spawned",
|
|
825
|
-
agent: { id: "grinder_1", role: "grinder", state: "running" },
|
|
826
|
-
} as any);
|
|
827
|
-
|
|
828
|
-
// Get the latest filter (from runtime2's installSignalFilter)
|
|
829
|
-
const filterFn2 = vi.mocked(messageRouter.setSignalFilter).mock.calls.at(-1)![0] as (
|
|
830
|
-
from: string, to: string, signal: string | undefined
|
|
831
|
-
) => boolean;
|
|
832
|
-
|
|
833
|
-
// grinder allows WORK_ASSIGNED from channel subs
|
|
834
|
-
// But grinder→planner is a peer route (no signal filter), so test from a non-peer source
|
|
835
|
-
// From planner to grinder_1 (no peer filter exists for this direction)
|
|
836
|
-
expect(filterFn2(result2.rootId, "grinder_1", "WORK_ASSIGNED")).toBe(true);
|
|
837
|
-
expect(filterFn2(result2.rootId, "grinder_1", "WORKER_DONE")).toBe(false);
|
|
838
|
-
});
|
|
839
|
-
|
|
840
|
-
it("roles with any unfiltered subscription receive all signals", async () => {
|
|
841
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
842
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
843
|
-
|
|
844
|
-
await runtime.initialize();
|
|
845
|
-
const result = await runtime.bootstrap();
|
|
846
|
-
runtime.installOnServices();
|
|
847
|
-
|
|
848
|
-
const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
|
|
849
|
-
from: string, to: string, signal: string | undefined
|
|
850
|
-
) => boolean;
|
|
851
|
-
|
|
852
|
-
// planner has task_updates subscription with no signals filter → receives all
|
|
853
|
-
// But planner's peer connections have explicit filters, so test from a non-peer agent
|
|
854
|
-
// From an unknown agent to planner — falls through to channel sub filter
|
|
855
|
-
expect(filterFn("unknown_agent", result.rootId, "ANY_SIGNAL")).toBe(true);
|
|
856
|
-
expect(filterFn("unknown_agent", result.rootId, "RANDOM")).toBe(true);
|
|
857
|
-
});
|
|
858
|
-
|
|
859
|
-
it("peer filter takes precedence over channel subscription filter", async () => {
|
|
860
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
861
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
862
|
-
|
|
863
|
-
await runtime.initialize();
|
|
864
|
-
const result = await runtime.bootstrap();
|
|
865
|
-
runtime.installOnServices();
|
|
866
|
-
|
|
867
|
-
const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
|
|
868
|
-
from: string, to: string, signal: string | undefined
|
|
869
|
-
) => boolean;
|
|
870
|
-
|
|
871
|
-
const judgeId = result.companionIds[0];
|
|
872
|
-
const plannerId = result.rootId;
|
|
873
|
-
|
|
874
|
-
// judge→planner peer only allows FIXUP_CREATED, GREEN_SNAPSHOT
|
|
875
|
-
// Even though planner's channel subs allow "all" (via unfiltered task_updates),
|
|
876
|
-
// the peer filter takes precedence
|
|
877
|
-
expect(filterFn(judgeId, plannerId, "TASK_CREATED")).toBe(false);
|
|
878
|
-
});
|
|
879
|
-
});
|
|
880
|
-
|
|
881
|
-
describe("emission validation", () => {
|
|
882
|
-
it("installOnServices() installs emission validator on message router", async () => {
|
|
883
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
884
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
885
|
-
|
|
886
|
-
await runtime.initialize();
|
|
887
|
-
await runtime.bootstrap();
|
|
888
|
-
// bootstrap alone should NOT install validator
|
|
889
|
-
expect(messageRouter.setEmissionValidator).not.toHaveBeenCalled();
|
|
890
|
-
|
|
891
|
-
// installOnServices() installs the validator
|
|
892
|
-
runtime.installOnServices();
|
|
893
|
-
expect(messageRouter.setEmissionValidator).toHaveBeenCalledTimes(1);
|
|
894
|
-
expect(messageRouter.setEmissionValidator).toHaveBeenCalledWith(expect.any(Function));
|
|
895
|
-
});
|
|
896
|
-
|
|
897
|
-
it("allows emissions in role's allowed list", async () => {
|
|
898
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
899
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
900
|
-
|
|
901
|
-
await runtime.initialize();
|
|
902
|
-
const result = await runtime.bootstrap();
|
|
903
|
-
runtime.installOnServices();
|
|
904
|
-
|
|
905
|
-
const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
|
|
906
|
-
agentId: string, signal: string | undefined
|
|
907
|
-
) => { action: string; message?: string };
|
|
908
|
-
|
|
909
|
-
const plannerId = result.rootId;
|
|
910
|
-
|
|
911
|
-
// planner's emissions: [TASK_CREATED, WORK_ASSIGNED]
|
|
912
|
-
expect(validatorFn(plannerId, "TASK_CREATED").action).toBe("allow");
|
|
913
|
-
expect(validatorFn(plannerId, "WORK_ASSIGNED").action).toBe("allow");
|
|
914
|
-
});
|
|
915
|
-
|
|
916
|
-
it("rejects disallowed emissions in strict mode", async () => {
|
|
917
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
918
|
-
manifest.communication.enforcement = "strict";
|
|
919
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
920
|
-
|
|
921
|
-
await runtime.initialize();
|
|
922
|
-
const result = await runtime.bootstrap();
|
|
923
|
-
runtime.installOnServices();
|
|
924
|
-
|
|
925
|
-
const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
|
|
926
|
-
agentId: string, signal: string | undefined
|
|
927
|
-
) => { action: string; message?: string };
|
|
928
|
-
|
|
929
|
-
const plannerId = result.rootId;
|
|
930
|
-
|
|
931
|
-
// WORKER_DONE is not in planner's allowed emissions
|
|
932
|
-
const res = validatorFn(plannerId, "WORKER_DONE");
|
|
933
|
-
expect(res.action).toBe("reject");
|
|
934
|
-
expect(res.message).toContain("WORKER_DONE");
|
|
935
|
-
expect(res.message).toContain("planner");
|
|
936
|
-
});
|
|
937
|
-
|
|
938
|
-
it("warns on disallowed emissions in permissive mode", async () => {
|
|
939
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
940
|
-
manifest.communication.enforcement = "permissive";
|
|
941
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
942
|
-
|
|
943
|
-
await runtime.initialize();
|
|
944
|
-
const result = await runtime.bootstrap();
|
|
945
|
-
runtime.installOnServices();
|
|
946
|
-
|
|
947
|
-
const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
|
|
948
|
-
agentId: string, signal: string | undefined
|
|
949
|
-
) => { action: string; message?: string };
|
|
950
|
-
|
|
951
|
-
const plannerId = result.rootId;
|
|
952
|
-
|
|
953
|
-
const res = validatorFn(plannerId, "HEALTH_CHECK");
|
|
954
|
-
expect(res.action).toBe("warn");
|
|
955
|
-
expect(res.message).toContain("HEALTH_CHECK");
|
|
956
|
-
});
|
|
957
|
-
|
|
958
|
-
it("audits disallowed emissions in audit mode", async () => {
|
|
959
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
960
|
-
manifest.communication.enforcement = "audit";
|
|
961
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
962
|
-
|
|
963
|
-
await runtime.initialize();
|
|
964
|
-
const result = await runtime.bootstrap();
|
|
965
|
-
runtime.installOnServices();
|
|
966
|
-
|
|
967
|
-
const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
|
|
968
|
-
agentId: string, signal: string | undefined
|
|
969
|
-
) => { action: string; message?: string };
|
|
970
|
-
|
|
971
|
-
const plannerId = result.rootId;
|
|
972
|
-
|
|
973
|
-
const res = validatorFn(plannerId, "FORBIDDEN");
|
|
974
|
-
expect(res.action).toBe("audit");
|
|
975
|
-
expect(res.message).toContain("FORBIDDEN");
|
|
976
|
-
});
|
|
977
|
-
|
|
978
|
-
it("allows untagged emissions for any role", async () => {
|
|
979
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
980
|
-
manifest.communication.enforcement = "strict";
|
|
981
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
982
|
-
|
|
983
|
-
await runtime.initialize();
|
|
984
|
-
const result = await runtime.bootstrap();
|
|
985
|
-
runtime.installOnServices();
|
|
986
|
-
|
|
987
|
-
const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
|
|
988
|
-
agentId: string, signal: string | undefined
|
|
989
|
-
) => { action: string; message?: string };
|
|
990
|
-
|
|
991
|
-
// Undefined signal always passes even in strict mode
|
|
992
|
-
expect(validatorFn(result.rootId, undefined).action).toBe("allow");
|
|
993
|
-
expect(validatorFn(result.companionIds[0], undefined).action).toBe("allow");
|
|
994
|
-
});
|
|
995
|
-
|
|
996
|
-
it("allows emissions from agents with no role mapping", async () => {
|
|
997
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
998
|
-
manifest.communication.enforcement = "strict";
|
|
999
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1000
|
-
|
|
1001
|
-
await runtime.initialize();
|
|
1002
|
-
await runtime.bootstrap();
|
|
1003
|
-
runtime.installOnServices();
|
|
1004
|
-
|
|
1005
|
-
const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
|
|
1006
|
-
agentId: string, signal: string | undefined
|
|
1007
|
-
) => { action: string; message?: string };
|
|
1008
|
-
|
|
1009
|
-
// Unknown agent — no role mapping, so allowed
|
|
1010
|
-
expect(validatorFn("unknown_agent", "ANYTHING").action).toBe("allow");
|
|
1011
|
-
});
|
|
1012
|
-
|
|
1013
|
-
it("does not install validator when no emissions config", async () => {
|
|
1014
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1015
|
-
manifest.communication.emissions = undefined;
|
|
1016
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1017
|
-
|
|
1018
|
-
await runtime.initialize();
|
|
1019
|
-
await runtime.bootstrap();
|
|
1020
|
-
runtime.installOnServices();
|
|
1021
|
-
|
|
1022
|
-
// createEmissionValidator() returns null when no emissions → setEmissionValidator not called
|
|
1023
|
-
expect(messageRouter.setEmissionValidator).not.toHaveBeenCalled();
|
|
1024
|
-
});
|
|
1025
|
-
|
|
1026
|
-
it("serializes emissions in team_config event", async () => {
|
|
1027
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1028
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1029
|
-
|
|
1030
|
-
await runtime.initialize();
|
|
1031
|
-
|
|
1032
|
-
expect(eventStore.emit).toHaveBeenCalledWith(
|
|
1033
|
-
expect.objectContaining({
|
|
1034
|
-
type: "status",
|
|
1035
|
-
payload: expect.objectContaining({
|
|
1036
|
-
team_config: expect.objectContaining({
|
|
1037
|
-
emissions: expect.objectContaining({
|
|
1038
|
-
planner: ["TASK_CREATED", "WORK_ASSIGNED"],
|
|
1039
|
-
judge: ["HEALTH_CHECK", "GREEN_SNAPSHOT", "FIXUP_CREATED"],
|
|
1040
|
-
grinder: ["WORKER_DONE"],
|
|
1041
|
-
}),
|
|
1042
|
-
}),
|
|
1043
|
-
}),
|
|
1044
|
-
})
|
|
1045
|
-
);
|
|
1046
|
-
});
|
|
1047
|
-
});
|
|
1048
|
-
|
|
1049
|
-
describe("exposed factory methods (for TeamManager)", () => {
|
|
1050
|
-
it("createSpawnInterceptor() returns a function", async () => {
|
|
1051
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1052
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1053
|
-
|
|
1054
|
-
await runtime.initialize();
|
|
1055
|
-
|
|
1056
|
-
const interceptor = runtime.createSpawnInterceptor();
|
|
1057
|
-
expect(interceptor).toBeInstanceOf(Function);
|
|
1058
|
-
});
|
|
1059
|
-
|
|
1060
|
-
it("createSpawnInterceptor() injects team context", async () => {
|
|
1061
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1062
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1063
|
-
|
|
1064
|
-
await runtime.initialize();
|
|
1065
|
-
|
|
1066
|
-
const interceptor = runtime.createSpawnInterceptor();
|
|
1067
|
-
const result = interceptor({
|
|
1068
|
-
task: "test",
|
|
1069
|
-
role: "grinder",
|
|
1070
|
-
parent: "agent_0",
|
|
1071
|
-
});
|
|
1072
|
-
|
|
1073
|
-
expect(result.config?.env?.MACRO_TEAM_NAME).toBe("self-driving");
|
|
1074
|
-
expect(result.config?.env?.MACRO_TASK_MODE).toBe("pull");
|
|
1075
|
-
expect(result.topics).toContain("work_coordination");
|
|
1076
|
-
});
|
|
1077
|
-
|
|
1078
|
-
it("createSignalFilter() returns a function", async () => {
|
|
1079
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1080
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1081
|
-
|
|
1082
|
-
await runtime.initialize();
|
|
1083
|
-
await runtime.bootstrap();
|
|
1084
|
-
|
|
1085
|
-
const filter = runtime.createSignalFilter();
|
|
1086
|
-
expect(filter).toBeInstanceOf(Function);
|
|
1087
|
-
});
|
|
1088
|
-
|
|
1089
|
-
it("createEmissionValidator() returns a function when emissions exist", async () => {
|
|
1090
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1091
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1092
|
-
|
|
1093
|
-
await runtime.initialize();
|
|
1094
|
-
await runtime.bootstrap();
|
|
1095
|
-
|
|
1096
|
-
const validator = runtime.createEmissionValidator();
|
|
1097
|
-
expect(validator).toBeInstanceOf(Function);
|
|
1098
|
-
});
|
|
1099
|
-
|
|
1100
|
-
it("createEmissionValidator() returns null when no emissions", async () => {
|
|
1101
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1102
|
-
manifest.communication.emissions = undefined;
|
|
1103
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1104
|
-
|
|
1105
|
-
await runtime.initialize();
|
|
1106
|
-
await runtime.bootstrap();
|
|
1107
|
-
|
|
1108
|
-
const validator = runtime.createEmissionValidator();
|
|
1109
|
-
expect(validator).toBeNull();
|
|
1110
|
-
});
|
|
1111
|
-
|
|
1112
|
-
it("getAgentRoleMap() returns role mappings after bootstrap", async () => {
|
|
1113
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1114
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1115
|
-
|
|
1116
|
-
await runtime.initialize();
|
|
1117
|
-
const result = await runtime.bootstrap();
|
|
1118
|
-
|
|
1119
|
-
const roleMap = runtime.getAgentRoleMap();
|
|
1120
|
-
expect(roleMap.get(result.rootId as AgentId)).toBe("planner");
|
|
1121
|
-
expect(roleMap.get(result.companionIds[0] as AgentId)).toBe("judge");
|
|
1122
|
-
});
|
|
1123
|
-
|
|
1124
|
-
it("registerAgent() adds agent to role map", async () => {
|
|
1125
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1126
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1127
|
-
|
|
1128
|
-
await runtime.initialize();
|
|
1129
|
-
await runtime.bootstrap();
|
|
1130
|
-
|
|
1131
|
-
runtime.registerAgent("new_agent" as AgentId, "grinder");
|
|
1132
|
-
|
|
1133
|
-
const roleMap = runtime.getAgentRoleMap();
|
|
1134
|
-
expect(roleMap.get("new_agent" as AgentId)).toBe("grinder");
|
|
1135
|
-
});
|
|
1136
|
-
|
|
1137
|
-
it("hasAgent() returns true for known agents", async () => {
|
|
1138
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1139
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1140
|
-
|
|
1141
|
-
await runtime.initialize();
|
|
1142
|
-
const result = await runtime.bootstrap();
|
|
1143
|
-
|
|
1144
|
-
expect(runtime.hasAgent(result.rootId)).toBe(true);
|
|
1145
|
-
expect(runtime.hasAgent(result.companionIds[0])).toBe(true);
|
|
1146
|
-
expect(runtime.hasAgent("unknown_agent")).toBe(false);
|
|
1147
|
-
});
|
|
1148
|
-
|
|
1149
|
-
it("hasAgent() includes dynamically registered agents", async () => {
|
|
1150
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1151
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1152
|
-
|
|
1153
|
-
await runtime.initialize();
|
|
1154
|
-
await runtime.bootstrap();
|
|
1155
|
-
|
|
1156
|
-
expect(runtime.hasAgent("dynamic_agent")).toBe(false);
|
|
1157
|
-
runtime.registerAgent("dynamic_agent" as AgentId, "grinder");
|
|
1158
|
-
expect(runtime.hasAgent("dynamic_agent")).toBe(true);
|
|
1159
|
-
});
|
|
1160
|
-
});
|
|
1161
|
-
|
|
1162
|
-
describe("monitorContinuations()", () => {
|
|
1163
|
-
it("auto-continues root agent on unexpected stop", async () => {
|
|
1164
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1165
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1166
|
-
|
|
1167
|
-
await runtime.initialize();
|
|
1168
|
-
const result = await runtime.bootstrap();
|
|
1169
|
-
|
|
1170
|
-
// Capture the lifecycle callback registered during bootstrap
|
|
1171
|
-
const onLifecycleEventMock = vi.mocked(agentManager.onLifecycleEvent);
|
|
1172
|
-
expect(onLifecycleEventMock).toHaveBeenCalled();
|
|
1173
|
-
const lifecycleCallback = onLifecycleEventMock.mock.calls[0][0];
|
|
1174
|
-
|
|
1175
|
-
// Simulate unexpected stop of root agent (no reason = unexpected)
|
|
1176
|
-
lifecycleCallback({
|
|
1177
|
-
type: "stopped",
|
|
1178
|
-
agent: { id: result.rootId, role: "planner", state: "stopped" },
|
|
1179
|
-
} as any);
|
|
1180
|
-
|
|
1181
|
-
// Wait for the setTimeout (1s) + async continuation
|
|
1182
|
-
await vi.waitFor(
|
|
1183
|
-
() => {
|
|
1184
|
-
expect(agentManager.continueAgent).toHaveBeenCalledWith(result.rootId);
|
|
1185
|
-
},
|
|
1186
|
-
{ timeout: 3000 }
|
|
1187
|
-
);
|
|
1188
|
-
|
|
1189
|
-
// Root agent ID should be updated to the continued agent
|
|
1190
|
-
expect(runtime.getRootAgentId()).toBe("continued_0");
|
|
1191
|
-
});
|
|
1192
|
-
|
|
1193
|
-
it("auto-continues companion agent on unexpected stop", async () => {
|
|
1194
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1195
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1196
|
-
|
|
1197
|
-
await runtime.initialize();
|
|
1198
|
-
const result = await runtime.bootstrap();
|
|
1199
|
-
const companionId = result.companionIds[0];
|
|
1200
|
-
|
|
1201
|
-
const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
|
|
1202
|
-
|
|
1203
|
-
// Simulate unexpected stop of companion
|
|
1204
|
-
lifecycleCallback({
|
|
1205
|
-
type: "stopped",
|
|
1206
|
-
agent: { id: companionId, role: "judge", state: "stopped" },
|
|
1207
|
-
} as any);
|
|
1208
|
-
|
|
1209
|
-
await vi.waitFor(
|
|
1210
|
-
() => {
|
|
1211
|
-
expect(agentManager.continueAgent).toHaveBeenCalledWith(companionId);
|
|
1212
|
-
},
|
|
1213
|
-
{ timeout: 3000 }
|
|
1214
|
-
);
|
|
1215
|
-
|
|
1216
|
-
// Companion ID should be updated
|
|
1217
|
-
expect(runtime.getCompanionAgentIds()).toContain("continued_0");
|
|
1218
|
-
});
|
|
1219
|
-
|
|
1220
|
-
it("does NOT auto-continue on completed stop", async () => {
|
|
1221
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1222
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1223
|
-
|
|
1224
|
-
await runtime.initialize();
|
|
1225
|
-
const result = await runtime.bootstrap();
|
|
1226
|
-
|
|
1227
|
-
const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
|
|
1228
|
-
|
|
1229
|
-
// Simulate completed stop (should NOT trigger continuation)
|
|
1230
|
-
lifecycleCallback({
|
|
1231
|
-
type: "stopped",
|
|
1232
|
-
agent: { id: result.rootId, role: "planner", state: "stopped" },
|
|
1233
|
-
reason: "completed",
|
|
1234
|
-
} as any);
|
|
1235
|
-
|
|
1236
|
-
// Wait a bit to ensure no continuation is triggered
|
|
1237
|
-
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
1238
|
-
expect(agentManager.continueAgent).not.toHaveBeenCalled();
|
|
1239
|
-
});
|
|
1240
|
-
|
|
1241
|
-
it("does NOT auto-continue on cancelled stop", async () => {
|
|
1242
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1243
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1244
|
-
|
|
1245
|
-
await runtime.initialize();
|
|
1246
|
-
const result = await runtime.bootstrap();
|
|
1247
|
-
|
|
1248
|
-
const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
|
|
1249
|
-
|
|
1250
|
-
lifecycleCallback({
|
|
1251
|
-
type: "stopped",
|
|
1252
|
-
agent: { id: result.rootId, role: "planner", state: "stopped" },
|
|
1253
|
-
reason: "cancelled",
|
|
1254
|
-
} as any);
|
|
1255
|
-
|
|
1256
|
-
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
1257
|
-
expect(agentManager.continueAgent).not.toHaveBeenCalled();
|
|
1258
|
-
});
|
|
1259
|
-
|
|
1260
|
-
it("does NOT trigger for non-monitored agents", async () => {
|
|
1261
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1262
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1263
|
-
|
|
1264
|
-
await runtime.initialize();
|
|
1265
|
-
await runtime.bootstrap();
|
|
1266
|
-
|
|
1267
|
-
const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
|
|
1268
|
-
|
|
1269
|
-
// Simulate stop of an unrelated agent
|
|
1270
|
-
lifecycleCallback({
|
|
1271
|
-
type: "stopped",
|
|
1272
|
-
agent: { id: "unrelated_agent", role: "worker", state: "stopped" },
|
|
1273
|
-
} as any);
|
|
1274
|
-
|
|
1275
|
-
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
1276
|
-
expect(agentManager.continueAgent).not.toHaveBeenCalled();
|
|
1277
|
-
});
|
|
1278
|
-
|
|
1279
|
-
it("unsubscribes lifecycle listener on teardown", async () => {
|
|
1280
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1281
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1282
|
-
|
|
1283
|
-
await runtime.initialize();
|
|
1284
|
-
await runtime.bootstrap();
|
|
1285
|
-
|
|
1286
|
-
// onLifecycleEvent returns an unsubscribe function
|
|
1287
|
-
const unsubscribeFn = vi.mocked(agentManager.onLifecycleEvent).mock.results[0].value;
|
|
1288
|
-
|
|
1289
|
-
await runtime.teardown();
|
|
1290
|
-
|
|
1291
|
-
// The unsubscribe function should have been called
|
|
1292
|
-
expect(unsubscribeFn).toHaveBeenCalled();
|
|
1293
|
-
});
|
|
1294
|
-
});
|
|
1295
|
-
|
|
1296
|
-
describe("structured team", () => {
|
|
1297
|
-
it("bootstraps with push mode and queue strategy", async () => {
|
|
1298
|
-
const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
|
|
1299
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1300
|
-
|
|
1301
|
-
expect(runtime.getTaskMode()).toBe("push");
|
|
1302
|
-
expect(runtime.getStrategyName()).toBe("queue");
|
|
1303
|
-
|
|
1304
|
-
await runtime.initialize();
|
|
1305
|
-
const result = await runtime.bootstrap();
|
|
1306
|
-
|
|
1307
|
-
// Root (lead) + 2 companions (reviewer, merger)
|
|
1308
|
-
expect(agentManager.spawn).toHaveBeenCalledTimes(3);
|
|
1309
|
-
expect(result.companionIds).toHaveLength(2);
|
|
1310
|
-
|
|
1311
|
-
// Verify no pull-mode interaction patterns injected
|
|
1312
|
-
const rootCall = vi.mocked(agentManager.spawn).mock.calls[0][0];
|
|
1313
|
-
const pullPatterns = rootCall.interactionPatterns?.filter((p) =>
|
|
1314
|
-
p.includes("PULL mode")
|
|
1315
|
-
) ?? [];
|
|
1316
|
-
expect(pullPatterns).toHaveLength(0);
|
|
1317
|
-
});
|
|
1318
|
-
});
|
|
1319
|
-
});
|
|
1320
|
-
|
|
1321
|
-
// =============================================================================
|
|
1322
|
-
// Tests: Integration Strategies
|
|
1323
|
-
// =============================================================================
|
|
1324
|
-
|
|
1325
|
-
describe("Integration Strategies", () => {
|
|
1326
|
-
it("imports trunk strategy module", async () => {
|
|
1327
|
-
const { TrunkIntegrationStrategy } = await import(
|
|
1328
|
-
"../../workspace/strategies/trunk.js"
|
|
1329
|
-
);
|
|
1330
|
-
const strategy = new TrunkIntegrationStrategy();
|
|
1331
|
-
expect(strategy.name).toBe("trunk");
|
|
1332
|
-
});
|
|
1333
|
-
|
|
1334
|
-
it("imports optimistic strategy module", async () => {
|
|
1335
|
-
const { OptimisticIntegrationStrategy } = await import(
|
|
1336
|
-
"../../workspace/strategies/optimistic.js"
|
|
1337
|
-
);
|
|
1338
|
-
const strategy = new OptimisticIntegrationStrategy();
|
|
1339
|
-
expect(strategy.name).toBe("optimistic");
|
|
1340
|
-
});
|
|
1341
|
-
|
|
1342
|
-
it("imports queue strategy module", async () => {
|
|
1343
|
-
const { QueueIntegrationStrategy } = await import(
|
|
1344
|
-
"../../workspace/strategies/queue.js"
|
|
1345
|
-
);
|
|
1346
|
-
const strategy = new QueueIntegrationStrategy();
|
|
1347
|
-
expect(strategy.name).toBe("queue");
|
|
1348
|
-
});
|
|
1349
|
-
|
|
1350
|
-
it("registry provides all built-in strategies", async () => {
|
|
1351
|
-
const { defaultStrategyRegistry } = await import(
|
|
1352
|
-
"../../workspace/strategies/registry.js"
|
|
1353
|
-
);
|
|
1354
|
-
expect(defaultStrategyRegistry.has("queue")).toBe(true);
|
|
1355
|
-
expect(defaultStrategyRegistry.has("trunk")).toBe(true);
|
|
1356
|
-
expect(defaultStrategyRegistry.has("optimistic")).toBe(true);
|
|
1357
|
-
});
|
|
1358
|
-
});
|
|
1359
|
-
|
|
1360
|
-
// =============================================================================
|
|
1361
|
-
// Tests: Task Pull Model
|
|
1362
|
-
// =============================================================================
|
|
1363
|
-
|
|
1364
|
-
describe("Task Pull Model", () => {
|
|
1365
|
-
it("claim_task tool module exports correctly", async () => {
|
|
1366
|
-
const { CLAIM_TASK_TOOL_INFO, ClaimTaskSchema, createClaimTaskHandler } =
|
|
1367
|
-
await import("../../mcp/tools/claim_task.js");
|
|
1368
|
-
|
|
1369
|
-
expect(CLAIM_TASK_TOOL_INFO.name).toBe("claim_task");
|
|
1370
|
-
expect(createClaimTaskHandler).toBeInstanceOf(Function);
|
|
1371
|
-
expect(ClaimTaskSchema).toBeDefined();
|
|
1372
|
-
});
|
|
1373
|
-
|
|
1374
|
-
it("unclaim_task tool module exports correctly", async () => {
|
|
1375
|
-
const { UNCLAIM_TASK_TOOL_INFO, createUnclaimTaskHandler } = await import(
|
|
1376
|
-
"../../mcp/tools/unclaim_task.js"
|
|
1377
|
-
);
|
|
1378
|
-
|
|
1379
|
-
expect(UNCLAIM_TASK_TOOL_INFO.name).toBe("unclaim_task");
|
|
1380
|
-
expect(createUnclaimTaskHandler).toBeInstanceOf(Function);
|
|
1381
|
-
});
|
|
1382
|
-
|
|
1383
|
-
it("list_claimable_tasks tool module exports correctly", async () => {
|
|
1384
|
-
const { LIST_CLAIMABLE_TASKS_TOOL_INFO, createListClaimableTasksHandler } =
|
|
1385
|
-
await import("../../mcp/tools/list_claimable_tasks.js");
|
|
1386
|
-
|
|
1387
|
-
expect(LIST_CLAIMABLE_TASKS_TOOL_INFO.name).toBe("list_claimable_tasks");
|
|
1388
|
-
expect(createListClaimableTasksHandler).toBeInstanceOf(Function);
|
|
1389
|
-
});
|
|
1390
|
-
|
|
1391
|
-
it("task.claim capability is registered", async () => {
|
|
1392
|
-
const { TASK_CAPABILITIES, ALL_CAPABILITIES } = await import(
|
|
1393
|
-
"../../roles/capabilities.js"
|
|
1394
|
-
);
|
|
1395
|
-
|
|
1396
|
-
expect(TASK_CAPABILITIES.CLAIM).toBe("task.claim");
|
|
1397
|
-
expect(ALL_CAPABILITIES.has("task.claim")).toBe(true);
|
|
1398
|
-
});
|
|
1399
|
-
});
|
|
1400
|
-
|
|
1401
|
-
// =============================================================================
|
|
1402
|
-
// Tests: Metrics Module
|
|
1403
|
-
// =============================================================================
|
|
1404
|
-
|
|
1405
|
-
describe("Metrics Module", () => {
|
|
1406
|
-
it("exports all metric functions", async () => {
|
|
1407
|
-
const {
|
|
1408
|
-
getThroughputMetrics,
|
|
1409
|
-
getUtilizationMetrics,
|
|
1410
|
-
getErrorMetrics,
|
|
1411
|
-
} = await import("../../metrics/index.js");
|
|
1412
|
-
|
|
1413
|
-
expect(getThroughputMetrics).toBeInstanceOf(Function);
|
|
1414
|
-
expect(getUtilizationMetrics).toBeInstanceOf(Function);
|
|
1415
|
-
expect(getErrorMetrics).toBeInstanceOf(Function);
|
|
1416
|
-
});
|
|
1417
|
-
|
|
1418
|
-
it("computes throughput metrics from empty store", async () => {
|
|
1419
|
-
const { getThroughputMetrics } = await import("../../metrics/index.js");
|
|
1420
|
-
const store = createMockEventStore();
|
|
1421
|
-
|
|
1422
|
-
const metrics = getThroughputMetrics(store, 60000);
|
|
1423
|
-
|
|
1424
|
-
expect(metrics.tasksCompleted).toBe(0);
|
|
1425
|
-
expect(metrics.tasksFailed).toBe(0);
|
|
1426
|
-
expect(metrics.tasksCreated).toBe(0);
|
|
1427
|
-
expect(metrics.completedPerMinute).toBe(0);
|
|
1428
|
-
expect(metrics.avgCompletionTimeMs).toBeNull();
|
|
1429
|
-
});
|
|
1430
|
-
|
|
1431
|
-
it("computes utilization metrics from empty store", async () => {
|
|
1432
|
-
const { getUtilizationMetrics } = await import("../../metrics/index.js");
|
|
1433
|
-
const store = createMockEventStore();
|
|
1434
|
-
|
|
1435
|
-
const metrics = getUtilizationMetrics(store);
|
|
1436
|
-
|
|
1437
|
-
expect(metrics.activeAgents).toBe(0);
|
|
1438
|
-
expect(metrics.totalSpawned).toBe(0);
|
|
1439
|
-
expect(metrics.totalStopped).toBe(0);
|
|
1440
|
-
});
|
|
1441
|
-
|
|
1442
|
-
it("computes error metrics from empty store", async () => {
|
|
1443
|
-
const { getErrorMetrics } = await import("../../metrics/index.js");
|
|
1444
|
-
const store = createMockEventStore();
|
|
1445
|
-
|
|
1446
|
-
const metrics = getErrorMetrics(store);
|
|
1447
|
-
|
|
1448
|
-
expect(metrics.totalErrors).toBe(0);
|
|
1449
|
-
expect(metrics.recentErrors).toEqual([]);
|
|
1450
|
-
});
|
|
1451
|
-
});
|
|
1452
|
-
|
|
1453
|
-
// =============================================================================
|
|
1454
|
-
// Tests: openteams Migration — Loader Hooks & Error Mapping
|
|
1455
|
-
// =============================================================================
|
|
1456
|
-
|
|
1457
|
-
describe("openteams Migration: Team Loader", () => {
|
|
1458
|
-
let roleRegistry: DefaultRoleRegistry;
|
|
1459
|
-
|
|
1460
|
-
beforeEach(() => {
|
|
1461
|
-
roleRegistry = new DefaultRoleRegistry();
|
|
1462
|
-
});
|
|
1463
|
-
|
|
1464
|
-
describe("buildResolvedTeamRole — enforcement fields", () => {
|
|
1465
|
-
it("maps macro_agent.workspace from role YAML to RoleDefinition", async () => {
|
|
1466
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1467
|
-
|
|
1468
|
-
// judge.yaml has workspace config
|
|
1469
|
-
const judge = manifest._resolvedRoles.get("judge")!;
|
|
1470
|
-
expect(judge.roleDefinition.workspace).toEqual({
|
|
1471
|
-
type: "own",
|
|
1472
|
-
branchPattern: "judge/{agent-id}",
|
|
1473
|
-
cleanupOnTerminate: true,
|
|
1474
|
-
});
|
|
1475
|
-
});
|
|
1476
|
-
|
|
1477
|
-
it("maps macro_agent.lifecycle from role YAML to RoleDefinition", async () => {
|
|
1478
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1479
|
-
|
|
1480
|
-
// planner.yaml has lifecycle: type: daemon, cascade_terminate: true
|
|
1481
|
-
const planner = manifest._resolvedRoles.get("planner")!;
|
|
1482
|
-
expect(planner.roleDefinition.lifecycle).toEqual({
|
|
1483
|
-
type: "daemon",
|
|
1484
|
-
cascadeTerminate: true,
|
|
1485
|
-
});
|
|
1486
|
-
|
|
1487
|
-
// grinder.yaml has lifecycle: type: ephemeral, task_bound: false, max_duration_ms, self_cleanup
|
|
1488
|
-
const grinder = manifest._resolvedRoles.get("grinder")!;
|
|
1489
|
-
expect(grinder.roleDefinition.lifecycle).toEqual({
|
|
1490
|
-
type: "ephemeral",
|
|
1491
|
-
taskBound: false,
|
|
1492
|
-
maxDurationMs: 3600000,
|
|
1493
|
-
selfCleanup: true,
|
|
1494
|
-
});
|
|
1495
|
-
});
|
|
1496
|
-
|
|
1497
|
-
it("falls back to parent role workspace/lifecycle when no macro_agent override", async () => {
|
|
1498
|
-
const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
|
|
1499
|
-
|
|
1500
|
-
// structured roles don't have macro_agent workspace/lifecycle in their YAML
|
|
1501
|
-
// so they inherit from parent role definitions
|
|
1502
|
-
const developer = manifest._resolvedRoles.get("developer")!;
|
|
1503
|
-
// Worker parent has workspace config
|
|
1504
|
-
const parentWorker = roleRegistry.resolveRole("worker");
|
|
1505
|
-
expect(developer.roleDefinition.workspace).toEqual(parentWorker.workspace);
|
|
1506
|
-
});
|
|
1507
|
-
|
|
1508
|
-
it("preserves parent role tools and protocol", async () => {
|
|
1509
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1510
|
-
|
|
1511
|
-
const grinder = manifest._resolvedRoles.get("grinder")!;
|
|
1512
|
-
const parentWorker = roleRegistry.resolveRole("worker");
|
|
1513
|
-
expect(grinder.roleDefinition.tools).toEqual(parentWorker.tools);
|
|
1514
|
-
expect(grinder.roleDefinition.protocol).toEqual(parentWorker.protocol);
|
|
1515
|
-
});
|
|
1516
|
-
|
|
1517
|
-
it("sets correct baseRole from extends chain", async () => {
|
|
1518
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1519
|
-
|
|
1520
|
-
// All roles should reference their base role
|
|
1521
|
-
expect(manifest._resolvedRoles.get("planner")!.baseRole).toBe("coordinator");
|
|
1522
|
-
expect(manifest._resolvedRoles.get("grinder")!.baseRole).toBe("worker");
|
|
1523
|
-
expect(manifest._resolvedRoles.get("judge")!.baseRole).toBe("monitor");
|
|
1524
|
-
});
|
|
1525
|
-
|
|
1526
|
-
it("stores prompt file path in resolved role", async () => {
|
|
1527
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1528
|
-
|
|
1529
|
-
const planner = manifest._resolvedRoles.get("planner")!;
|
|
1530
|
-
expect(planner.prompt).toBe("prompts/planner.md");
|
|
1531
|
-
|
|
1532
|
-
const grinder = manifest._resolvedRoles.get("grinder")!;
|
|
1533
|
-
expect(grinder.prompt).toBe("prompts/grinder.md");
|
|
1534
|
-
});
|
|
1535
|
-
});
|
|
1536
|
-
|
|
1537
|
-
describe("enrichRoleWithSpawnRules hook", () => {
|
|
1538
|
-
it("adds agent.spawn.* capabilities from spawn_rules", async () => {
|
|
1539
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1540
|
-
|
|
1541
|
-
// planner: [grinder, planner]
|
|
1542
|
-
const planner = manifest._resolvedRoles.get("planner")!;
|
|
1543
|
-
expect(planner.capabilities).toContain("agent.spawn.grinder");
|
|
1544
|
-
expect(planner.capabilities).toContain("agent.spawn.planner");
|
|
1545
|
-
});
|
|
1546
|
-
|
|
1547
|
-
it("does not duplicate existing spawn capabilities", async () => {
|
|
1548
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1549
|
-
|
|
1550
|
-
const planner = manifest._resolvedRoles.get("planner")!;
|
|
1551
|
-
const spawnGrinderCount = planner.capabilities.filter(
|
|
1552
|
-
(c) => c === "agent.spawn.grinder"
|
|
1553
|
-
).length;
|
|
1554
|
-
expect(spawnGrinderCount).toBe(1);
|
|
1555
|
-
});
|
|
1556
|
-
|
|
1557
|
-
it("does not add spawn capabilities for roles with empty spawn_rules", async () => {
|
|
1558
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1559
|
-
|
|
1560
|
-
// judge: [] in spawn_rules — should not have spawn caps added by enrichRoleWithSpawnRules
|
|
1561
|
-
// (judge extends monitor which has no spawn caps)
|
|
1562
|
-
const judge = manifest._resolvedRoles.get("judge")!;
|
|
1563
|
-
const spawnCaps = judge.capabilities.filter((c) => c.startsWith("agent.spawn."));
|
|
1564
|
-
expect(spawnCaps).toEqual([]);
|
|
1565
|
-
|
|
1566
|
-
// grinder: [] in spawn_rules — grinder extends worker which has agent.spawn.worker
|
|
1567
|
-
// from parent, but enrichRoleWithSpawnRules should NOT add any additional spawn caps
|
|
1568
|
-
const grinder = manifest._resolvedRoles.get("grinder")!;
|
|
1569
|
-
const grinderSpawnCaps = grinder.capabilities.filter((c) => c.startsWith("agent.spawn."));
|
|
1570
|
-
// Only has parent-inherited spawn caps, not new ones from spawn_rules
|
|
1571
|
-
expect(grinderSpawnCaps).not.toContain("agent.spawn.grinder");
|
|
1572
|
-
expect(grinderSpawnCaps).not.toContain("agent.spawn.planner");
|
|
1573
|
-
});
|
|
1574
|
-
});
|
|
1575
|
-
|
|
1576
|
-
describe("mapRegistryRole hook", () => {
|
|
1577
|
-
it("resolves known registry roles for extends chains", async () => {
|
|
1578
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1579
|
-
|
|
1580
|
-
// planner extends coordinator — coordinator should be resolvable
|
|
1581
|
-
const planner = manifest._resolvedRoles.get("planner")!;
|
|
1582
|
-
expect(planner.baseRole).toBe("coordinator");
|
|
1583
|
-
|
|
1584
|
-
// Coordinator capabilities should be in the planner's set (minus removals, plus additions)
|
|
1585
|
-
const coordinatorRole = roleRegistry.resolveRole("coordinator");
|
|
1586
|
-
// planner should have coordinator capabilities minus removed ones
|
|
1587
|
-
for (const cap of coordinatorRole.capabilities) {
|
|
1588
|
-
if (cap !== "agent.spawn.integrator" && cap !== "agent.spawn.monitor") {
|
|
1589
|
-
expect(planner.capabilities).toContain(cap);
|
|
1590
|
-
}
|
|
1591
|
-
}
|
|
1592
|
-
});
|
|
1593
|
-
});
|
|
1594
|
-
|
|
1595
|
-
describe("prompt loading and assembly", () => {
|
|
1596
|
-
it("loads prompts keyed by role promptFile path", async () => {
|
|
1597
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1598
|
-
|
|
1599
|
-
// Prompts should be stored under the role's promptFile key
|
|
1600
|
-
expect(manifest._loadedPrompts.has("prompts/planner.md")).toBe(true);
|
|
1601
|
-
expect(manifest._loadedPrompts.has("prompts/grinder.md")).toBe(true);
|
|
1602
|
-
expect(manifest._loadedPrompts.has("prompts/judge.md")).toBe(true);
|
|
1603
|
-
});
|
|
1604
|
-
|
|
1605
|
-
it("loads prompts keyed by topology node prompt path", async () => {
|
|
1606
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1607
|
-
|
|
1608
|
-
// Root topology node has prompt: prompts/planner.md
|
|
1609
|
-
// It should also be stored under that topology key
|
|
1610
|
-
expect(manifest._loadedPrompts.get("prompts/planner.md")).toBeDefined();
|
|
1611
|
-
expect(manifest._loadedPrompts.get("prompts/planner.md")!.length).toBeGreaterThan(0);
|
|
1612
|
-
});
|
|
1613
|
-
|
|
1614
|
-
it("prompt content matches actual file content", async () => {
|
|
1615
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1616
|
-
|
|
1617
|
-
const plannerPrompt = manifest._loadedPrompts.get("prompts/planner.md")!;
|
|
1618
|
-
// Should contain the role name from the actual prompt file
|
|
1619
|
-
expect(plannerPrompt).toContain("Planner");
|
|
1620
|
-
});
|
|
1621
|
-
});
|
|
1622
|
-
|
|
1623
|
-
describe("MCP server loading", () => {
|
|
1624
|
-
it("provides _mcpServers map (even if empty)", async () => {
|
|
1625
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1626
|
-
|
|
1627
|
-
expect(manifest._mcpServers).toBeDefined();
|
|
1628
|
-
expect(manifest._mcpServers).toBeInstanceOf(Map);
|
|
1629
|
-
});
|
|
1630
|
-
});
|
|
1631
|
-
|
|
1632
|
-
describe("error mapping", () => {
|
|
1633
|
-
it("throws MANIFEST_NOT_FOUND for non-existent team", async () => {
|
|
1634
|
-
await expect(
|
|
1635
|
-
loadTeam("nonexistent-team", roleRegistry, PROJECT_ROOT)
|
|
1636
|
-
).rejects.toThrow(TeamLoadError);
|
|
1637
|
-
|
|
1638
|
-
try {
|
|
1639
|
-
await loadTeam("nonexistent-team", roleRegistry, PROJECT_ROOT);
|
|
1640
|
-
} catch (e) {
|
|
1641
|
-
const err = e as TeamLoadError;
|
|
1642
|
-
expect(err.code).toBe("MANIFEST_NOT_FOUND");
|
|
1643
|
-
expect(err.teamName).toBe("nonexistent-team");
|
|
1644
|
-
}
|
|
1645
|
-
});
|
|
1646
|
-
|
|
1647
|
-
it("includes team name in error", async () => {
|
|
1648
|
-
try {
|
|
1649
|
-
await loadTeam("does-not-exist", roleRegistry, PROJECT_ROOT);
|
|
1650
|
-
} catch (e) {
|
|
1651
|
-
expect(e).toBeInstanceOf(TeamLoadError);
|
|
1652
|
-
expect((e as TeamLoadError).teamName).toBe("does-not-exist");
|
|
1653
|
-
}
|
|
1654
|
-
});
|
|
1655
|
-
});
|
|
1656
|
-
|
|
1657
|
-
describe("communication validation", () => {
|
|
1658
|
-
it("validates self-driving team communication topology", async () => {
|
|
1659
|
-
// Should not throw — well-formed communication config
|
|
1660
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1661
|
-
expect(manifest.communication).toBeDefined();
|
|
1662
|
-
expect(manifest.communication.channels).toBeDefined();
|
|
1663
|
-
expect(manifest.communication.subscriptions).toBeDefined();
|
|
1664
|
-
expect(manifest.communication.emissions).toBeDefined();
|
|
1665
|
-
expect(manifest.communication.routing).toBeDefined();
|
|
1666
|
-
});
|
|
1667
|
-
|
|
1668
|
-
it("validates structured team communication topology", async () => {
|
|
1669
|
-
const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
|
|
1670
|
-
expect(manifest.communication.channels).toBeDefined();
|
|
1671
|
-
expect(Object.keys(manifest.communication.channels!)).toContain("task_updates");
|
|
1672
|
-
expect(Object.keys(manifest.communication.channels!)).toContain("merge_flow");
|
|
1673
|
-
expect(Object.keys(manifest.communication.channels!)).toContain("review_flow");
|
|
1674
|
-
});
|
|
1675
|
-
});
|
|
1676
|
-
});
|
|
1677
|
-
|
|
1678
|
-
// =============================================================================
|
|
1679
|
-
// Tests: openteams Migration — TeamRuntime Type Detection
|
|
1680
|
-
// =============================================================================
|
|
1681
|
-
|
|
1682
|
-
describe("openteams Migration: TeamRuntime", () => {
|
|
1683
|
-
let roleRegistry: DefaultRoleRegistry;
|
|
1684
|
-
let agentManager: AgentManager;
|
|
1685
|
-
let messageRouter: MessageRouter;
|
|
1686
|
-
let eventStore: EventStore & { _events: Event[] };
|
|
1687
|
-
let services: TeamServices;
|
|
1688
|
-
|
|
1689
|
-
beforeEach(() => {
|
|
1690
|
-
roleRegistry = new DefaultRoleRegistry();
|
|
1691
|
-
eventStore = createMockEventStore() as EventStore & { _events: Event[] };
|
|
1692
|
-
messageRouter = createMockMessageRouter();
|
|
1693
|
-
agentManager = createMockAgentManager(roleRegistry);
|
|
1694
|
-
services = { agentManager, messageRouter, eventStore };
|
|
1695
|
-
});
|
|
1696
|
-
|
|
1697
|
-
describe("MacroResolvedTemplate input", () => {
|
|
1698
|
-
it("accepts MacroResolvedTemplate directly", async () => {
|
|
1699
|
-
// Build a MacroResolvedTemplate from a loaded manifest
|
|
1700
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1701
|
-
|
|
1702
|
-
const resolved: MacroResolvedTemplate = {
|
|
1703
|
-
template: {
|
|
1704
|
-
manifest: {
|
|
1705
|
-
name: manifest.name,
|
|
1706
|
-
description: manifest.description,
|
|
1707
|
-
version: manifest.version,
|
|
1708
|
-
roles: manifest.roles,
|
|
1709
|
-
topology: manifest.topology,
|
|
1710
|
-
communication: manifest.communication,
|
|
1711
|
-
},
|
|
1712
|
-
roles: new Map(),
|
|
1713
|
-
prompts: new Map(),
|
|
1714
|
-
mcpServers: manifest._mcpServers,
|
|
1715
|
-
sourcePath: "",
|
|
1716
|
-
},
|
|
1717
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1718
|
-
macroAgent: manifest.macro_agent,
|
|
1719
|
-
};
|
|
1720
|
-
|
|
1721
|
-
// Should not throw
|
|
1722
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1723
|
-
expect(runtime.getTaskMode()).toBe("pull");
|
|
1724
|
-
expect(runtime.getStrategyName()).toBe("trunk");
|
|
1725
|
-
});
|
|
1726
|
-
|
|
1727
|
-
it("getResolvedTemplate() returns the resolved template", async () => {
|
|
1728
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1729
|
-
|
|
1730
|
-
const resolved: MacroResolvedTemplate = {
|
|
1731
|
-
template: {
|
|
1732
|
-
manifest: {
|
|
1733
|
-
name: manifest.name,
|
|
1734
|
-
description: manifest.description,
|
|
1735
|
-
version: manifest.version,
|
|
1736
|
-
roles: manifest.roles,
|
|
1737
|
-
topology: manifest.topology,
|
|
1738
|
-
communication: manifest.communication,
|
|
1739
|
-
},
|
|
1740
|
-
roles: new Map(),
|
|
1741
|
-
prompts: new Map(),
|
|
1742
|
-
mcpServers: manifest._mcpServers,
|
|
1743
|
-
sourcePath: "",
|
|
1744
|
-
},
|
|
1745
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1746
|
-
macroAgent: manifest.macro_agent,
|
|
1747
|
-
};
|
|
1748
|
-
|
|
1749
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1750
|
-
const result = runtime.getResolvedTemplate();
|
|
1751
|
-
|
|
1752
|
-
expect(result).toBe(resolved);
|
|
1753
|
-
expect(result.resolvedRoles).toBe(manifest._resolvedRoles);
|
|
1754
|
-
expect(result.macroAgent).toBe(manifest.macro_agent);
|
|
1755
|
-
});
|
|
1756
|
-
|
|
1757
|
-
it("initializes and bootstraps with MacroResolvedTemplate", async () => {
|
|
1758
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1759
|
-
|
|
1760
|
-
const resolved: MacroResolvedTemplate = {
|
|
1761
|
-
template: {
|
|
1762
|
-
manifest: {
|
|
1763
|
-
name: manifest.name,
|
|
1764
|
-
description: manifest.description,
|
|
1765
|
-
version: manifest.version,
|
|
1766
|
-
roles: manifest.roles,
|
|
1767
|
-
topology: manifest.topology,
|
|
1768
|
-
communication: manifest.communication,
|
|
1769
|
-
},
|
|
1770
|
-
roles: new Map(),
|
|
1771
|
-
prompts: new Map(),
|
|
1772
|
-
mcpServers: manifest._mcpServers,
|
|
1773
|
-
sourcePath: "",
|
|
1774
|
-
},
|
|
1775
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1776
|
-
macroAgent: manifest.macro_agent,
|
|
1777
|
-
};
|
|
1778
|
-
|
|
1779
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1780
|
-
await runtime.initialize();
|
|
1781
|
-
const result = await runtime.bootstrap();
|
|
1782
|
-
|
|
1783
|
-
expect(result.rootId).toBeDefined();
|
|
1784
|
-
expect(result.companionIds).toHaveLength(1);
|
|
1785
|
-
expect(agentManager.spawn).toHaveBeenCalledTimes(2);
|
|
1786
|
-
});
|
|
1787
|
-
|
|
1788
|
-
it("emits team_config event with MacroResolvedTemplate", async () => {
|
|
1789
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1790
|
-
|
|
1791
|
-
const resolved: MacroResolvedTemplate = {
|
|
1792
|
-
template: {
|
|
1793
|
-
manifest: {
|
|
1794
|
-
name: manifest.name,
|
|
1795
|
-
description: manifest.description,
|
|
1796
|
-
version: manifest.version,
|
|
1797
|
-
roles: manifest.roles,
|
|
1798
|
-
topology: manifest.topology,
|
|
1799
|
-
communication: manifest.communication,
|
|
1800
|
-
},
|
|
1801
|
-
roles: new Map(),
|
|
1802
|
-
prompts: new Map(),
|
|
1803
|
-
mcpServers: manifest._mcpServers,
|
|
1804
|
-
sourcePath: "",
|
|
1805
|
-
},
|
|
1806
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1807
|
-
macroAgent: manifest.macro_agent,
|
|
1808
|
-
};
|
|
1809
|
-
|
|
1810
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1811
|
-
await runtime.initialize();
|
|
1812
|
-
|
|
1813
|
-
expect(eventStore.emit).toHaveBeenCalledWith(
|
|
1814
|
-
expect.objectContaining({
|
|
1815
|
-
type: "status",
|
|
1816
|
-
payload: expect.objectContaining({
|
|
1817
|
-
team_config: expect.objectContaining({
|
|
1818
|
-
teamName: "self-driving",
|
|
1819
|
-
strategy: "trunk",
|
|
1820
|
-
taskMode: "pull",
|
|
1821
|
-
}),
|
|
1822
|
-
}),
|
|
1823
|
-
})
|
|
1824
|
-
);
|
|
1825
|
-
});
|
|
1826
|
-
});
|
|
1827
|
-
|
|
1828
|
-
describe("manifestToResolved conversion", () => {
|
|
1829
|
-
it("converts legacy TeamManifest to MacroResolvedTemplate internally", async () => {
|
|
1830
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1831
|
-
|
|
1832
|
-
// Pass TeamManifest (legacy path)
|
|
1833
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1834
|
-
const resolved = runtime.getResolvedTemplate();
|
|
1835
|
-
|
|
1836
|
-
// Should have been converted internally
|
|
1837
|
-
expect(resolved.template.manifest.name).toBe("self-driving");
|
|
1838
|
-
expect(resolved.resolvedRoles).toBe(manifest._resolvedRoles);
|
|
1839
|
-
expect(resolved.macroAgent).toBe(manifest.macro_agent);
|
|
1840
|
-
expect(resolved.template.mcpServers).toBe(manifest._mcpServers);
|
|
1841
|
-
});
|
|
1842
|
-
|
|
1843
|
-
it("preserves topology and communication in conversion", async () => {
|
|
1844
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1845
|
-
|
|
1846
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1847
|
-
const resolved = runtime.getResolvedTemplate();
|
|
1848
|
-
|
|
1849
|
-
expect(resolved.template.manifest.topology).toBe(manifest.topology);
|
|
1850
|
-
expect(resolved.template.manifest.communication).toBe(manifest.communication);
|
|
1851
|
-
});
|
|
1852
|
-
});
|
|
1853
|
-
|
|
1854
|
-
describe("getManifest() backward compatibility", () => {
|
|
1855
|
-
it("reconstructs TeamManifest from MacroResolvedTemplate", async () => {
|
|
1856
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1857
|
-
|
|
1858
|
-
const resolved: MacroResolvedTemplate = {
|
|
1859
|
-
template: {
|
|
1860
|
-
manifest: {
|
|
1861
|
-
name: manifest.name,
|
|
1862
|
-
description: manifest.description,
|
|
1863
|
-
version: manifest.version,
|
|
1864
|
-
roles: manifest.roles,
|
|
1865
|
-
topology: manifest.topology,
|
|
1866
|
-
communication: manifest.communication,
|
|
1867
|
-
},
|
|
1868
|
-
roles: new Map(),
|
|
1869
|
-
prompts: new Map(),
|
|
1870
|
-
mcpServers: manifest._mcpServers,
|
|
1871
|
-
sourcePath: "",
|
|
1872
|
-
},
|
|
1873
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1874
|
-
macroAgent: manifest.macro_agent,
|
|
1875
|
-
};
|
|
1876
|
-
|
|
1877
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1878
|
-
const backCompat = runtime.getManifest();
|
|
1879
|
-
|
|
1880
|
-
expect(backCompat.name).toBe("self-driving");
|
|
1881
|
-
expect(backCompat._resolvedRoles).toBe(manifest._resolvedRoles);
|
|
1882
|
-
expect(backCompat._mcpServers).toBe(manifest._mcpServers);
|
|
1883
|
-
expect(backCompat.macro_agent).toBe(manifest.macro_agent);
|
|
1884
|
-
});
|
|
1885
|
-
|
|
1886
|
-
it("reconstructs TeamManifest from legacy TeamManifest input", async () => {
|
|
1887
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1888
|
-
|
|
1889
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1890
|
-
const backCompat = runtime.getManifest();
|
|
1891
|
-
|
|
1892
|
-
expect(backCompat.name).toBe("self-driving");
|
|
1893
|
-
expect(backCompat._resolvedRoles).toBe(manifest._resolvedRoles);
|
|
1894
|
-
expect(backCompat._loadedPrompts).toBe(manifest._loadedPrompts);
|
|
1895
|
-
});
|
|
1896
|
-
});
|
|
1897
|
-
|
|
1898
|
-
describe("spawn interceptor with MacroResolvedTemplate", () => {
|
|
1899
|
-
it("injects team context when using MacroResolvedTemplate", async () => {
|
|
1900
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1901
|
-
|
|
1902
|
-
const resolved: MacroResolvedTemplate = {
|
|
1903
|
-
template: {
|
|
1904
|
-
manifest: {
|
|
1905
|
-
name: manifest.name,
|
|
1906
|
-
description: manifest.description,
|
|
1907
|
-
version: manifest.version,
|
|
1908
|
-
roles: manifest.roles,
|
|
1909
|
-
topology: manifest.topology,
|
|
1910
|
-
communication: manifest.communication,
|
|
1911
|
-
},
|
|
1912
|
-
roles: new Map(),
|
|
1913
|
-
prompts: new Map(),
|
|
1914
|
-
mcpServers: manifest._mcpServers,
|
|
1915
|
-
sourcePath: "",
|
|
1916
|
-
},
|
|
1917
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1918
|
-
macroAgent: manifest.macro_agent,
|
|
1919
|
-
};
|
|
1920
|
-
|
|
1921
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1922
|
-
await runtime.initialize();
|
|
1923
|
-
runtime.installOnServices();
|
|
1924
|
-
await runtime.bootstrap();
|
|
1925
|
-
|
|
1926
|
-
// Spawn a grinder through the interceptor
|
|
1927
|
-
await agentManager.spawn({
|
|
1928
|
-
task: "test grinder task",
|
|
1929
|
-
role: "grinder",
|
|
1930
|
-
parent: "agent_0",
|
|
1931
|
-
});
|
|
1932
|
-
|
|
1933
|
-
const lastOpts = interceptedSpawnOptions.at(-1)!;
|
|
1934
|
-
expect(lastOpts.config?.env?.MACRO_TEAM_NAME).toBe("self-driving");
|
|
1935
|
-
expect(lastOpts.config?.env?.MACRO_TASK_MODE).toBe("pull");
|
|
1936
|
-
expect(lastOpts.topics).toContain("work_coordination");
|
|
1937
|
-
});
|
|
1938
|
-
|
|
1939
|
-
it("resolves MCP servers from MacroResolvedTemplate", async () => {
|
|
1940
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1941
|
-
|
|
1942
|
-
// Add a mock MCP server for grinder
|
|
1943
|
-
const mcpServers = new Map<string, McpServerEntry[]>();
|
|
1944
|
-
mcpServers.set("grinder", [{
|
|
1945
|
-
name: "test-server",
|
|
1946
|
-
command: "node",
|
|
1947
|
-
args: ["test.js"],
|
|
1948
|
-
}]);
|
|
1949
|
-
|
|
1950
|
-
const resolved: MacroResolvedTemplate = {
|
|
1951
|
-
template: {
|
|
1952
|
-
manifest: {
|
|
1953
|
-
name: manifest.name,
|
|
1954
|
-
description: manifest.description,
|
|
1955
|
-
version: manifest.version,
|
|
1956
|
-
roles: manifest.roles,
|
|
1957
|
-
topology: manifest.topology,
|
|
1958
|
-
communication: manifest.communication,
|
|
1959
|
-
},
|
|
1960
|
-
roles: new Map(),
|
|
1961
|
-
prompts: new Map(),
|
|
1962
|
-
mcpServers,
|
|
1963
|
-
sourcePath: "",
|
|
1964
|
-
},
|
|
1965
|
-
resolvedRoles: manifest._resolvedRoles,
|
|
1966
|
-
macroAgent: manifest.macro_agent,
|
|
1967
|
-
};
|
|
1968
|
-
|
|
1969
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
1970
|
-
await runtime.initialize();
|
|
1971
|
-
runtime.installOnServices();
|
|
1972
|
-
await runtime.bootstrap();
|
|
1973
|
-
|
|
1974
|
-
// Spawn a grinder
|
|
1975
|
-
await agentManager.spawn({
|
|
1976
|
-
task: "test task",
|
|
1977
|
-
role: "grinder",
|
|
1978
|
-
parent: "agent_0",
|
|
1979
|
-
});
|
|
1980
|
-
|
|
1981
|
-
const lastOpts = interceptedSpawnOptions.at(-1)!;
|
|
1982
|
-
expect(lastOpts.config?.mcpServers).toBeDefined();
|
|
1983
|
-
expect(lastOpts.config?.mcpServers!.length).toBeGreaterThanOrEqual(1);
|
|
1984
|
-
expect(lastOpts.config?.mcpServers!.some((s: any) => s.name === "test-server")).toBe(true);
|
|
1985
|
-
});
|
|
1986
|
-
});
|
|
1987
|
-
|
|
1988
|
-
describe("serialized roles in team_config", () => {
|
|
1989
|
-
it("serializes resolved roles with capabilities", async () => {
|
|
1990
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
1991
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
1992
|
-
|
|
1993
|
-
await runtime.initialize();
|
|
1994
|
-
|
|
1995
|
-
const emitCall = vi.mocked(eventStore.emit).mock.calls[0][0] as any;
|
|
1996
|
-
const serializedRoles = emitCall.payload.team_config.roles;
|
|
1997
|
-
|
|
1998
|
-
expect(serializedRoles.planner).toBeDefined();
|
|
1999
|
-
expect(serializedRoles.planner.name).toBe("planner");
|
|
2000
|
-
expect(serializedRoles.planner.capabilities).toContain("task.claim");
|
|
2001
|
-
expect(serializedRoles.planner.capabilities).toContain("agent.spawn.grinder");
|
|
2002
|
-
|
|
2003
|
-
expect(serializedRoles.grinder).toBeDefined();
|
|
2004
|
-
expect(serializedRoles.grinder.name).toBe("grinder");
|
|
2005
|
-
expect(serializedRoles.grinder.capabilities).toContain("task.claim");
|
|
2006
|
-
expect(serializedRoles.grinder.capabilities).toContain("git.push");
|
|
2007
|
-
|
|
2008
|
-
expect(serializedRoles.judge).toBeDefined();
|
|
2009
|
-
expect(serializedRoles.judge.name).toBe("judge");
|
|
2010
|
-
});
|
|
2011
|
-
|
|
2012
|
-
it("includes lifecycle and description in serialized roles", async () => {
|
|
2013
|
-
const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
|
|
2014
|
-
const runtime = new TeamRuntime(manifest, services);
|
|
2015
|
-
|
|
2016
|
-
await runtime.initialize();
|
|
2017
|
-
|
|
2018
|
-
const emitCall = vi.mocked(eventStore.emit).mock.calls[0][0] as any;
|
|
2019
|
-
const serializedRoles = emitCall.payload.team_config.roles;
|
|
2020
|
-
|
|
2021
|
-
// planner has lifecycle config
|
|
2022
|
-
expect(serializedRoles.planner.lifecycle).toBeDefined();
|
|
2023
|
-
|
|
2024
|
-
// All roles have descriptions
|
|
2025
|
-
expect(serializedRoles.planner.description).toBeDefined();
|
|
2026
|
-
expect(serializedRoles.grinder.description).toBeDefined();
|
|
2027
|
-
expect(serializedRoles.judge.description).toBeDefined();
|
|
2028
|
-
});
|
|
2029
|
-
});
|
|
2030
|
-
});
|
|
2031
|
-
|
|
2032
|
-
// =============================================================================
|
|
2033
|
-
// Tests: Auto-Scaling
|
|
2034
|
-
// =============================================================================
|
|
2035
|
-
|
|
2036
|
-
describe("TeamRuntime auto-scaling", () => {
|
|
2037
|
-
let roleRegistry: DefaultRoleRegistry;
|
|
2038
|
-
let agentManager: AgentManager;
|
|
2039
|
-
let messageRouter: MessageRouter;
|
|
2040
|
-
let eventStore: EventStore;
|
|
2041
|
-
|
|
2042
|
-
beforeEach(() => {
|
|
2043
|
-
roleRegistry = new DefaultRoleRegistry();
|
|
2044
|
-
eventStore = createMockEventStore();
|
|
2045
|
-
messageRouter = createMockMessageRouter();
|
|
2046
|
-
agentManager = createMockAgentManager(roleRegistry);
|
|
2047
|
-
vi.useFakeTimers();
|
|
2048
|
-
});
|
|
2049
|
-
|
|
2050
|
-
afterEach(() => {
|
|
2051
|
-
vi.useRealTimers();
|
|
2052
|
-
});
|
|
2053
|
-
|
|
2054
|
-
function createScalingTemplate(scalingConfig: {
|
|
2055
|
-
min_workers?: number;
|
|
2056
|
-
max_workers?: number;
|
|
2057
|
-
scale_on?: "task_queue_depth" | "manual";
|
|
2058
|
-
idle_drain?: boolean;
|
|
2059
|
-
}): MacroResolvedTemplate {
|
|
2060
|
-
const workerRole: ResolvedTeamRole = {
|
|
2061
|
-
name: "grinder",
|
|
2062
|
-
baseRole: "worker",
|
|
2063
|
-
capabilities: ["file.read", "file.write", "task.claim", "lifecycle.done"],
|
|
2064
|
-
roleDefinition: {
|
|
2065
|
-
name: "grinder",
|
|
2066
|
-
capabilities: ["file.read", "file.write", "task.claim", "lifecycle.done"],
|
|
2067
|
-
},
|
|
2068
|
-
};
|
|
2069
|
-
|
|
2070
|
-
const plannerRole: ResolvedTeamRole = {
|
|
2071
|
-
name: "planner",
|
|
2072
|
-
baseRole: "coordinator",
|
|
2073
|
-
capabilities: ["*"],
|
|
2074
|
-
roleDefinition: {
|
|
2075
|
-
name: "planner",
|
|
2076
|
-
capabilities: ["*"],
|
|
2077
|
-
},
|
|
2078
|
-
};
|
|
2079
|
-
|
|
2080
|
-
return {
|
|
2081
|
-
template: {
|
|
2082
|
-
manifest: {
|
|
2083
|
-
name: "test-scaling",
|
|
2084
|
-
version: 1,
|
|
2085
|
-
roles: ["planner", "grinder"],
|
|
2086
|
-
topology: {
|
|
2087
|
-
root: { role: "planner", prompt: "prompts/planner.md" },
|
|
2088
|
-
spawn_rules: { planner: ["grinder"], grinder: [] },
|
|
2089
|
-
},
|
|
2090
|
-
},
|
|
2091
|
-
roles: new Map(),
|
|
2092
|
-
prompts: new Map(),
|
|
2093
|
-
mcpServers: new Map<string, McpServerEntry[]>(),
|
|
2094
|
-
sourcePath: "",
|
|
2095
|
-
},
|
|
2096
|
-
resolvedRoles: new Map<string, ResolvedTeamRole>([
|
|
2097
|
-
["planner", plannerRole],
|
|
2098
|
-
["grinder", workerRole],
|
|
2099
|
-
]),
|
|
2100
|
-
macroAgent: {
|
|
2101
|
-
task_assignment: { mode: "pull" as const },
|
|
2102
|
-
lifecycle: { scaling: scalingConfig },
|
|
2103
|
-
},
|
|
2104
|
-
};
|
|
2105
|
-
}
|
|
2106
|
-
|
|
2107
|
-
it("spawns worker when task queue depth exceeds active workers", async () => {
|
|
2108
|
-
const mockTaskBackend = {
|
|
2109
|
-
listClaimable: vi.fn().mockResolvedValue([
|
|
2110
|
-
{ id: "t1", title: "Task 1" },
|
|
2111
|
-
{ id: "t2", title: "Task 2" },
|
|
2112
|
-
]),
|
|
2113
|
-
};
|
|
2114
|
-
|
|
2115
|
-
// No active workers initially
|
|
2116
|
-
vi.mocked(agentManager.list).mockReturnValue([]);
|
|
2117
|
-
|
|
2118
|
-
const services: TeamServices = {
|
|
2119
|
-
agentManager, messageRouter, eventStore,
|
|
2120
|
-
taskBackend: mockTaskBackend as any,
|
|
2121
|
-
};
|
|
2122
|
-
|
|
2123
|
-
const resolved = createScalingTemplate({
|
|
2124
|
-
max_workers: 5,
|
|
2125
|
-
scale_on: "task_queue_depth",
|
|
2126
|
-
});
|
|
2127
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
2128
|
-
await runtime.initialize();
|
|
2129
|
-
await runtime.bootstrap();
|
|
2130
|
-
|
|
2131
|
-
// Advance timer to trigger scaling check (5s interval)
|
|
2132
|
-
await vi.advanceTimersByTimeAsync(5_100);
|
|
2133
|
-
|
|
2134
|
-
// Should have spawned a grinder as child of root
|
|
2135
|
-
const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
|
|
2136
|
-
const scalingSpawn = spawnCalls.find(
|
|
2137
|
-
call => call[0].role === "grinder" && call[0].parent !== null && call[0].task?.includes("auto-scaled")
|
|
2138
|
-
);
|
|
2139
|
-
expect(scalingSpawn).toBeDefined();
|
|
2140
|
-
|
|
2141
|
-
await runtime.teardown();
|
|
2142
|
-
});
|
|
2143
|
-
|
|
2144
|
-
it("respects max_workers cap", async () => {
|
|
2145
|
-
const mockTaskBackend = {
|
|
2146
|
-
listClaimable: vi.fn().mockResolvedValue([
|
|
2147
|
-
{ id: "t1", title: "Task 1" },
|
|
2148
|
-
{ id: "t2", title: "Task 2" },
|
|
2149
|
-
]),
|
|
2150
|
-
};
|
|
2151
|
-
|
|
2152
|
-
// Already at max workers
|
|
2153
|
-
vi.mocked(agentManager.list).mockReturnValue([
|
|
2154
|
-
{ id: "w1", role: "grinder", state: "running" } as any,
|
|
2155
|
-
{ id: "w2", role: "grinder", state: "running" } as any,
|
|
2156
|
-
]);
|
|
2157
|
-
|
|
2158
|
-
const services: TeamServices = {
|
|
2159
|
-
agentManager, messageRouter, eventStore,
|
|
2160
|
-
taskBackend: mockTaskBackend as any,
|
|
2161
|
-
};
|
|
2162
|
-
|
|
2163
|
-
const resolved = createScalingTemplate({
|
|
2164
|
-
max_workers: 2,
|
|
2165
|
-
scale_on: "task_queue_depth",
|
|
2166
|
-
});
|
|
2167
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
2168
|
-
await runtime.initialize();
|
|
2169
|
-
await runtime.bootstrap();
|
|
2170
|
-
|
|
2171
|
-
// Register the workers in the runtime's agentRoleMap
|
|
2172
|
-
runtime.registerAgent("w1" as AgentId, "grinder");
|
|
2173
|
-
runtime.registerAgent("w2" as AgentId, "grinder");
|
|
2174
|
-
|
|
2175
|
-
const spawnCountBefore = vi.mocked(agentManager.spawn).mock.calls.length;
|
|
2176
|
-
|
|
2177
|
-
await vi.advanceTimersByTimeAsync(5_100);
|
|
2178
|
-
|
|
2179
|
-
// No additional spawns — already at max
|
|
2180
|
-
const scalingSpawns = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
|
|
2181
|
-
call => call[0].task?.includes("auto-scaled")
|
|
2182
|
-
);
|
|
2183
|
-
expect(scalingSpawns).toHaveLength(0);
|
|
2184
|
-
|
|
2185
|
-
await runtime.teardown();
|
|
2186
|
-
});
|
|
2187
|
-
|
|
2188
|
-
it("does not spawn when scale_on is not task_queue_depth", async () => {
|
|
2189
|
-
const mockTaskBackend = {
|
|
2190
|
-
listClaimable: vi.fn().mockResolvedValue([
|
|
2191
|
-
{ id: "t1", title: "Task 1" },
|
|
2192
|
-
]),
|
|
2193
|
-
};
|
|
2194
|
-
|
|
2195
|
-
const services: TeamServices = {
|
|
2196
|
-
agentManager, messageRouter, eventStore,
|
|
2197
|
-
taskBackend: mockTaskBackend as any,
|
|
2198
|
-
};
|
|
2199
|
-
|
|
2200
|
-
const resolved = createScalingTemplate({
|
|
2201
|
-
max_workers: 5,
|
|
2202
|
-
scale_on: "manual",
|
|
2203
|
-
});
|
|
2204
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
2205
|
-
await runtime.initialize();
|
|
2206
|
-
await runtime.bootstrap();
|
|
2207
|
-
|
|
2208
|
-
const spawnCountBefore = vi.mocked(agentManager.spawn).mock.calls.length;
|
|
2209
|
-
|
|
2210
|
-
await vi.advanceTimersByTimeAsync(10_000);
|
|
2211
|
-
|
|
2212
|
-
// No scaling spawns
|
|
2213
|
-
const scalingSpawns = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
|
|
2214
|
-
call => call[0].task?.includes("auto-scaled")
|
|
2215
|
-
);
|
|
2216
|
-
expect(scalingSpawns).toHaveLength(0);
|
|
2217
|
-
|
|
2218
|
-
// listClaimable should not have been called
|
|
2219
|
-
expect(mockTaskBackend.listClaimable).not.toHaveBeenCalled();
|
|
2220
|
-
|
|
2221
|
-
await runtime.teardown();
|
|
2222
|
-
});
|
|
2223
|
-
|
|
2224
|
-
it("respects cooldown between scale-up actions", async () => {
|
|
2225
|
-
const mockTaskBackend = {
|
|
2226
|
-
listClaimable: vi.fn().mockResolvedValue([
|
|
2227
|
-
{ id: "t1" }, { id: "t2" }, { id: "t3" },
|
|
2228
|
-
]),
|
|
2229
|
-
};
|
|
2230
|
-
|
|
2231
|
-
vi.mocked(agentManager.list).mockReturnValue([]);
|
|
2232
|
-
|
|
2233
|
-
const services: TeamServices = {
|
|
2234
|
-
agentManager, messageRouter, eventStore,
|
|
2235
|
-
taskBackend: mockTaskBackend as any,
|
|
2236
|
-
};
|
|
2237
|
-
|
|
2238
|
-
const resolved = createScalingTemplate({
|
|
2239
|
-
max_workers: 10,
|
|
2240
|
-
scale_on: "task_queue_depth",
|
|
2241
|
-
});
|
|
2242
|
-
const runtime = new TeamRuntime(resolved, services);
|
|
2243
|
-
await runtime.initialize();
|
|
2244
|
-
await runtime.bootstrap();
|
|
2245
|
-
|
|
2246
|
-
const spawnCountBefore = vi.mocked(agentManager.spawn).mock.calls.length;
|
|
2247
|
-
|
|
2248
|
-
// First tick at 5s — should spawn
|
|
2249
|
-
await vi.advanceTimersByTimeAsync(5_100);
|
|
2250
|
-
const afterFirst = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
|
|
2251
|
-
call => call[0].task?.includes("auto-scaled")
|
|
2252
|
-
);
|
|
2253
|
-
expect(afterFirst).toHaveLength(1);
|
|
2254
|
-
|
|
2255
|
-
// Second tick at 10s — cooldown (10s from first spawn) not elapsed
|
|
2256
|
-
await vi.advanceTimersByTimeAsync(5_000);
|
|
2257
|
-
const afterSecond = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
|
|
2258
|
-
call => call[0].task?.includes("auto-scaled")
|
|
2259
|
-
);
|
|
2260
|
-
expect(afterSecond).toHaveLength(1); // Still just 1
|
|
2261
|
-
|
|
2262
|
-
// Third tick at 15s — cooldown elapsed, should spawn again
|
|
2263
|
-
await vi.advanceTimersByTimeAsync(5_100);
|
|
2264
|
-
const afterThird = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
|
|
2265
|
-
call => call[0].task?.includes("auto-scaled")
|
|
2266
|
-
);
|
|
2267
|
-
expect(afterThird).toHaveLength(2);
|
|
2268
|
-
|
|
2269
|
-
await runtime.teardown();
|
|
2270
|
-
});
|
|
2271
|
-
});
|
|
2272
|
-
|
|
2273
|
-
// =============================================================================
|
|
2274
|
-
// Tests: Workspace Isolation (Capability-Based)
|
|
2275
|
-
// =============================================================================
|
|
2276
|
-
|
|
2277
|
-
describe("Workspace Isolation", () => {
|
|
2278
|
-
let roleRegistry: DefaultRoleRegistry;
|
|
2279
|
-
let agentManager: AgentManager;
|
|
2280
|
-
let messageRouter: MessageRouter;
|
|
2281
|
-
let eventStore: EventStore;
|
|
2282
|
-
|
|
2283
|
-
beforeEach(() => {
|
|
2284
|
-
roleRegistry = new DefaultRoleRegistry();
|
|
2285
|
-
agentManager = createMockAgentManager(roleRegistry);
|
|
2286
|
-
messageRouter = createMockMessageRouter();
|
|
2287
|
-
eventStore = createMockEventStore();
|
|
2288
|
-
});
|
|
2289
|
-
|
|
2290
|
-
function createWorkspaceTemplate(): MacroResolvedTemplate {
|
|
2291
|
-
const resolvedRoles = new Map<string, ResolvedTeamRole>();
|
|
2292
|
-
resolvedRoles.set("lead", {
|
|
2293
|
-
name: "lead",
|
|
2294
|
-
baseRole: "coordinator",
|
|
2295
|
-
capabilities: [
|
|
2296
|
-
"file.read", "file.write", "task.create", "task.assign",
|
|
2297
|
-
"agent.spawn.worker", "agent.terminate", "workspace.stream",
|
|
2298
|
-
],
|
|
2299
|
-
roleDefinition: roleRegistry.resolveRole("coordinator"),
|
|
2300
|
-
});
|
|
2301
|
-
resolvedRoles.set("developer", {
|
|
2302
|
-
name: "developer",
|
|
2303
|
-
baseRole: "worker",
|
|
2304
|
-
capabilities: [
|
|
2305
|
-
"file.read", "file.write", "git.commit", "lifecycle.done",
|
|
2306
|
-
"workspace.worktree",
|
|
2307
|
-
],
|
|
2308
|
-
roleDefinition: roleRegistry.resolveRole("worker"),
|
|
2309
|
-
});
|
|
2310
|
-
resolvedRoles.set("merger", {
|
|
2311
|
-
name: "merger",
|
|
2312
|
-
baseRole: "integrator",
|
|
2313
|
-
capabilities: [
|
|
2314
|
-
"file.read", "file.write", "git.merge", "lifecycle.done",
|
|
2315
|
-
"workspace.integrate",
|
|
2316
|
-
],
|
|
2317
|
-
roleDefinition: roleRegistry.resolveRole("integrator"),
|
|
2318
|
-
});
|
|
2319
|
-
resolvedRoles.set("watcher", {
|
|
2320
|
-
name: "watcher",
|
|
2321
|
-
baseRole: "monitor",
|
|
2322
|
-
capabilities: ["file.read", "msg.send"],
|
|
2323
|
-
roleDefinition: roleRegistry.resolveRole("monitor"),
|
|
2324
|
-
});
|
|
2325
|
-
|
|
2326
|
-
return {
|
|
2327
|
-
template: {
|
|
2328
|
-
manifest: {
|
|
2329
|
-
name: "workspace-test",
|
|
2330
|
-
version: 1,
|
|
2331
|
-
roles: ["lead", "developer", "merger", "watcher"],
|
|
2332
|
-
topology: {
|
|
2333
|
-
root: { role: "lead" },
|
|
2334
|
-
companions: [{ role: "merger" }],
|
|
2335
|
-
},
|
|
2336
|
-
communication: {},
|
|
2337
|
-
},
|
|
2338
|
-
roles: new Map(),
|
|
2339
|
-
prompts: new Map(),
|
|
2340
|
-
mcpServers: new Map<string, McpServerEntry[]>(),
|
|
2341
|
-
sourcePath: "",
|
|
2342
|
-
},
|
|
2343
|
-
resolvedRoles,
|
|
2344
|
-
macroAgent: {
|
|
2345
|
-
integration: { strategy: "queue" },
|
|
2346
|
-
task_assignment: { mode: "push" as const },
|
|
2347
|
-
},
|
|
2348
|
-
};
|
|
2349
|
-
}
|
|
2350
|
-
|
|
2351
|
-
it("spawn interceptor injects streamId for role with workspace.worktree", async () => {
|
|
2352
|
-
const template = createWorkspaceTemplate();
|
|
2353
|
-
const mockWorkspaceManager = {
|
|
2354
|
-
createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
|
|
2355
|
-
getMergeQueue: vi.fn().mockReturnValue(null),
|
|
2356
|
-
getWorkspace: vi.fn(),
|
|
2357
|
-
};
|
|
2358
|
-
|
|
2359
|
-
const services: TeamServices = {
|
|
2360
|
-
agentManager,
|
|
2361
|
-
messageRouter,
|
|
2362
|
-
eventStore,
|
|
2363
|
-
workspaceManager: mockWorkspaceManager as any,
|
|
2364
|
-
};
|
|
2365
|
-
|
|
2366
|
-
const runtime = new TeamRuntime(template, services);
|
|
2367
|
-
await runtime.initialize();
|
|
2368
|
-
await runtime.bootstrap();
|
|
2369
|
-
|
|
2370
|
-
// Now spawn a developer (extends worker) through the interceptor
|
|
2371
|
-
const interceptor = runtime.createSpawnInterceptor();
|
|
2372
|
-
const result = interceptor({
|
|
2373
|
-
task: "implement feature",
|
|
2374
|
-
role: "developer",
|
|
2375
|
-
parent: "agent_0",
|
|
2376
|
-
});
|
|
2377
|
-
|
|
2378
|
-
expect(result.streamId).toBe("stream-1");
|
|
2379
|
-
expect(result.dataplaneTaskId).toBeDefined();
|
|
2380
|
-
expect(result.capabilities).toContain("workspace.worktree");
|
|
2381
|
-
|
|
2382
|
-
await runtime.teardown();
|
|
2383
|
-
});
|
|
2384
|
-
|
|
2385
|
-
it("spawn interceptor injects streamId for role with workspace.integrate", async () => {
|
|
2386
|
-
const template = createWorkspaceTemplate();
|
|
2387
|
-
const mockWorkspaceManager = {
|
|
2388
|
-
createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
|
|
2389
|
-
getMergeQueue: vi.fn().mockReturnValue(null),
|
|
2390
|
-
getWorkspace: vi.fn(),
|
|
2391
|
-
};
|
|
2392
|
-
|
|
2393
|
-
const services: TeamServices = {
|
|
2394
|
-
agentManager,
|
|
2395
|
-
messageRouter,
|
|
2396
|
-
eventStore,
|
|
2397
|
-
workspaceManager: mockWorkspaceManager as any,
|
|
2398
|
-
};
|
|
2399
|
-
|
|
2400
|
-
const runtime = new TeamRuntime(template, services);
|
|
2401
|
-
await runtime.initialize();
|
|
2402
|
-
await runtime.bootstrap();
|
|
2403
|
-
|
|
2404
|
-
const interceptor = runtime.createSpawnInterceptor();
|
|
2405
|
-
const result = interceptor({
|
|
2406
|
-
task: "merge changes",
|
|
2407
|
-
role: "merger",
|
|
2408
|
-
parent: "agent_0",
|
|
2409
|
-
});
|
|
2410
|
-
|
|
2411
|
-
expect(result.streamId).toBe("stream-1");
|
|
2412
|
-
expect(result.dataplaneTaskId).toBeUndefined(); // Integrators don't get dataplaneTaskId
|
|
2413
|
-
expect(result.capabilities).toContain("workspace.integrate");
|
|
2414
|
-
|
|
2415
|
-
await runtime.teardown();
|
|
2416
|
-
});
|
|
2417
|
-
|
|
2418
|
-
it("spawn interceptor does NOT inject workspace fields for role without workspace capability", async () => {
|
|
2419
|
-
const template = createWorkspaceTemplate();
|
|
2420
|
-
const mockWorkspaceManager = {
|
|
2421
|
-
createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
|
|
2422
|
-
getMergeQueue: vi.fn().mockReturnValue(null),
|
|
2423
|
-
getWorkspace: vi.fn(),
|
|
2424
|
-
};
|
|
2425
|
-
|
|
2426
|
-
const services: TeamServices = {
|
|
2427
|
-
agentManager,
|
|
2428
|
-
messageRouter,
|
|
2429
|
-
eventStore,
|
|
2430
|
-
workspaceManager: mockWorkspaceManager as any,
|
|
2431
|
-
};
|
|
2432
|
-
|
|
2433
|
-
const runtime = new TeamRuntime(template, services);
|
|
2434
|
-
await runtime.initialize();
|
|
2435
|
-
await runtime.bootstrap();
|
|
2436
|
-
|
|
2437
|
-
const interceptor = runtime.createSpawnInterceptor();
|
|
2438
|
-
const result = interceptor({
|
|
2439
|
-
task: "monitor health",
|
|
2440
|
-
role: "watcher",
|
|
2441
|
-
parent: "agent_0",
|
|
2442
|
-
});
|
|
2443
|
-
|
|
2444
|
-
// Monitor role has no workspace capabilities
|
|
2445
|
-
expect(result.streamId).toBeUndefined();
|
|
2446
|
-
expect(result.streamConfig).toBeUndefined();
|
|
2447
|
-
expect(result.dataplaneTaskId).toBeUndefined();
|
|
2448
|
-
|
|
2449
|
-
await runtime.teardown();
|
|
2450
|
-
});
|
|
2451
|
-
|
|
2452
|
-
it("spawn interceptor does not overwrite explicit workspace values", async () => {
|
|
2453
|
-
const template = createWorkspaceTemplate();
|
|
2454
|
-
const mockWorkspaceManager = {
|
|
2455
|
-
createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
|
|
2456
|
-
getMergeQueue: vi.fn().mockReturnValue(null),
|
|
2457
|
-
getWorkspace: vi.fn(),
|
|
2458
|
-
};
|
|
2459
|
-
|
|
2460
|
-
const services: TeamServices = {
|
|
2461
|
-
agentManager,
|
|
2462
|
-
messageRouter,
|
|
2463
|
-
eventStore,
|
|
2464
|
-
workspaceManager: mockWorkspaceManager as any,
|
|
2465
|
-
};
|
|
2466
|
-
|
|
2467
|
-
const runtime = new TeamRuntime(template, services);
|
|
2468
|
-
await runtime.initialize();
|
|
2469
|
-
await runtime.bootstrap();
|
|
2470
|
-
|
|
2471
|
-
const interceptor = runtime.createSpawnInterceptor();
|
|
2472
|
-
const result = interceptor({
|
|
2473
|
-
task: "implement feature",
|
|
2474
|
-
role: "developer",
|
|
2475
|
-
parent: "agent_0",
|
|
2476
|
-
streamId: "custom-stream",
|
|
2477
|
-
dataplaneTaskId: "custom-task",
|
|
2478
|
-
});
|
|
2479
|
-
|
|
2480
|
-
// Explicit values should NOT be overwritten
|
|
2481
|
-
expect(result.streamId).toBe("custom-stream");
|
|
2482
|
-
expect(result.dataplaneTaskId).toBe("custom-task");
|
|
2483
|
-
|
|
2484
|
-
await runtime.teardown();
|
|
2485
|
-
});
|
|
2486
|
-
|
|
2487
|
-
it("merge queue mr:submitted event wakes integrator agent", async () => {
|
|
2488
|
-
const template = createWorkspaceTemplate();
|
|
2489
|
-
let mergeQueueCallback: ((event: any) => void) | null = null;
|
|
2490
|
-
const mockMergeQueue = {
|
|
2491
|
-
onEvent: vi.fn((cb: (event: any) => void) => {
|
|
2492
|
-
mergeQueueCallback = cb;
|
|
2493
|
-
return () => { mergeQueueCallback = null; };
|
|
2494
|
-
}),
|
|
2495
|
-
};
|
|
2496
|
-
const mockWorkspaceManager = {
|
|
2497
|
-
createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
|
|
2498
|
-
getMergeQueue: vi.fn().mockReturnValue(mockMergeQueue),
|
|
2499
|
-
getWorkspace: vi.fn(),
|
|
2500
|
-
};
|
|
2501
|
-
|
|
2502
|
-
const services: TeamServices = {
|
|
2503
|
-
agentManager,
|
|
2504
|
-
messageRouter,
|
|
2505
|
-
eventStore,
|
|
2506
|
-
workspaceManager: mockWorkspaceManager as any,
|
|
2507
|
-
};
|
|
2508
|
-
|
|
2509
|
-
const runtime = new TeamRuntime(template, services);
|
|
2510
|
-
await runtime.initialize();
|
|
2511
|
-
await runtime.bootstrap();
|
|
2512
|
-
|
|
2513
|
-
// Verify merge queue subscription was set up
|
|
2514
|
-
expect(mockMergeQueue.onEvent).toHaveBeenCalled();
|
|
2515
|
-
expect(mergeQueueCallback).not.toBeNull();
|
|
2516
|
-
|
|
2517
|
-
// Simulate a merge request submission
|
|
2518
|
-
mergeQueueCallback!({
|
|
2519
|
-
type: "mr:submitted",
|
|
2520
|
-
data: {
|
|
2521
|
-
mrId: "mr-123",
|
|
2522
|
-
workerAgentId: "worker-1",
|
|
2523
|
-
workerBranch: "worker/dev-1/task-1@123",
|
|
2524
|
-
},
|
|
2525
|
-
});
|
|
2526
|
-
|
|
2527
|
-
// Should have prompted the merger agent (companion, agent_1)
|
|
2528
|
-
expect(agentManager.prompt).toHaveBeenCalledWith(
|
|
2529
|
-
"agent_1", // merger is the companion agent
|
|
2530
|
-
expect.stringContaining("mr-123"),
|
|
2531
|
-
);
|
|
2532
|
-
|
|
2533
|
-
await runtime.teardown();
|
|
2534
|
-
});
|
|
2535
|
-
|
|
2536
|
-
it("creates integration stream during bootstrap when workspaceManager is available", async () => {
|
|
2537
|
-
const template = createWorkspaceTemplate();
|
|
2538
|
-
const mockWorkspaceManager = {
|
|
2539
|
-
createIntegrationStream: vi.fn().mockReturnValue("stream-42"),
|
|
2540
|
-
getMergeQueue: vi.fn().mockReturnValue(null),
|
|
2541
|
-
getWorkspace: vi.fn(),
|
|
2542
|
-
};
|
|
2543
|
-
|
|
2544
|
-
const services: TeamServices = {
|
|
2545
|
-
agentManager,
|
|
2546
|
-
messageRouter,
|
|
2547
|
-
eventStore,
|
|
2548
|
-
workspaceManager: mockWorkspaceManager as any,
|
|
2549
|
-
};
|
|
2550
|
-
|
|
2551
|
-
const runtime = new TeamRuntime(template, services);
|
|
2552
|
-
await runtime.initialize();
|
|
2553
|
-
await runtime.bootstrap();
|
|
2554
|
-
|
|
2555
|
-
expect(mockWorkspaceManager.createIntegrationStream).toHaveBeenCalledWith(
|
|
2556
|
-
"agent_0", // root agent ID
|
|
2557
|
-
{ name: "workspace-test", forkFrom: "main" },
|
|
2558
|
-
);
|
|
2559
|
-
expect(runtime.getTeamStreamId()).toBe("stream-42");
|
|
2560
|
-
|
|
2561
|
-
await runtime.teardown();
|
|
2562
|
-
});
|
|
2563
|
-
});
|