macro-agent 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +3 -0
- package/.opentasks/config.json +9 -0
- package/.sudocode/issues.jsonl +28 -0
- package/.sudocode/specs.jsonl +4 -0
- package/CLAUDE.md +433 -201
- package/README.md +129 -371
- package/dist/acp/index.d.ts +9 -51
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js +5 -46
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/macro-agent.d.ts +28 -255
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +593 -1231
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/map-bridge.d.ts +62 -0
- package/dist/acp/map-bridge.d.ts.map +1 -0
- package/dist/acp/map-bridge.js +123 -0
- package/dist/acp/map-bridge.js.map +1 -0
- package/dist/acp/session-mapper.d.ts +29 -126
- package/dist/acp/session-mapper.d.ts.map +1 -1
- package/dist/acp/session-mapper.js +36 -234
- package/dist/acp/session-mapper.js.map +1 -1
- package/dist/acp/types.d.ts +24 -535
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js +7 -7
- package/dist/acp/types.js.map +1 -1
- package/dist/acp/websocket-server.d.ts +16 -136
- package/dist/acp/websocket-server.d.ts.map +1 -1
- package/dist/acp/websocket-server.js +131 -371
- package/dist/acp/websocket-server.js.map +1 -1
- package/dist/adapters/federation.d.ts +76 -0
- package/dist/adapters/federation.d.ts.map +1 -0
- package/dist/adapters/federation.js +120 -0
- package/dist/adapters/federation.js.map +1 -0
- package/dist/adapters/inbox-adapter.d.ts +72 -0
- package/dist/adapters/inbox-adapter.d.ts.map +1 -0
- package/dist/adapters/inbox-adapter.js +196 -0
- package/dist/adapters/inbox-adapter.js.map +1 -0
- package/dist/adapters/inbox-client-adapter.d.ts +40 -0
- package/dist/adapters/inbox-client-adapter.d.ts.map +1 -0
- package/dist/adapters/inbox-client-adapter.js +135 -0
- package/dist/adapters/inbox-client-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +10 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opentasks-daemon.d.ts +32 -0
- package/dist/adapters/opentasks-daemon.d.ts.map +1 -0
- package/dist/adapters/opentasks-daemon.js +190 -0
- package/dist/adapters/opentasks-daemon.js.map +1 -0
- package/dist/adapters/tasks-adapter.d.ts +49 -0
- package/dist/adapters/tasks-adapter.d.ts.map +1 -0
- package/dist/adapters/tasks-adapter.js +209 -0
- package/dist/adapters/tasks-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +198 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +13 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/agent/agent-manager-v2.d.ts +38 -0
- package/dist/agent/agent-manager-v2.d.ts.map +1 -0
- package/dist/agent/agent-manager-v2.js +1097 -0
- package/dist/agent/agent-manager-v2.js.map +1 -0
- package/dist/agent/agent-manager.d.ts +52 -42
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +11 -1255
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/agent-store.d.ts +89 -0
- package/dist/agent/agent-store.d.ts.map +1 -0
- package/dist/agent/agent-store.js +279 -0
- package/dist/agent/agent-store.js.map +1 -0
- package/dist/agent/types.d.ts +7 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/index.d.ts +5 -3
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -3
- package/dist/api/index.js.map +1 -1
- package/dist/api/server.d.ts +6 -123
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +247 -1489
- package/dist/api/server.js.map +1 -1
- package/dist/api/types.d.ts +20 -248
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +3 -1
- package/dist/api/types.js.map +1 -1
- package/dist/boot-v2.d.ts +165 -0
- package/dist/boot-v2.d.ts.map +1 -0
- package/dist/boot-v2.js +315 -0
- package/dist/boot-v2.js.map +1 -0
- package/dist/cli/acp.d.ts +6 -28
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +39 -373
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.d.ts +1 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +65 -449
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +18 -8
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +231 -282
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cognitive/analyst-role.d.ts +13 -0
- package/dist/cognitive/analyst-role.d.ts.map +1 -0
- package/dist/cognitive/analyst-role.js +48 -0
- package/dist/cognitive/analyst-role.js.map +1 -0
- package/dist/cognitive/index.d.ts +18 -0
- package/dist/cognitive/index.d.ts.map +1 -0
- package/dist/cognitive/index.js +21 -0
- package/dist/cognitive/index.js.map +1 -0
- package/dist/cognitive/macro-agent-backend.d.ts +40 -0
- package/dist/cognitive/macro-agent-backend.d.ts.map +1 -0
- package/dist/cognitive/macro-agent-backend.js +290 -0
- package/dist/cognitive/macro-agent-backend.js.map +1 -0
- package/dist/cognitive/session-converter.d.ts +30 -0
- package/dist/cognitive/session-converter.d.ts.map +1 -0
- package/dist/cognitive/session-converter.js +119 -0
- package/dist/cognitive/session-converter.js.map +1 -0
- package/dist/cognitive/types.d.ts +129 -0
- package/dist/cognitive/types.d.ts.map +1 -0
- package/dist/cognitive/types.js +12 -0
- package/dist/cognitive/types.js.map +1 -0
- package/dist/cognitive/workspace-handler.d.ts +46 -0
- package/dist/cognitive/workspace-handler.d.ts.map +1 -0
- package/dist/cognitive/workspace-handler.js +135 -0
- package/dist/cognitive/workspace-handler.js.map +1 -0
- package/dist/config/project-config.d.ts +13 -2
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +12 -2
- package/dist/config/project-config.js.map +1 -1
- package/dist/control/control-client.d.ts +63 -0
- package/dist/control/control-client.d.ts.map +1 -0
- package/dist/control/control-client.js +276 -0
- package/dist/control/control-client.js.map +1 -0
- package/dist/control/control-server.d.ts +46 -0
- package/dist/control/control-server.d.ts.map +1 -0
- package/dist/control/control-server.js +237 -0
- package/dist/control/control-server.js.map +1 -0
- package/dist/control/index.d.ts +9 -0
- package/dist/control/index.d.ts.map +1 -0
- package/dist/control/index.js +8 -0
- package/dist/control/index.js.map +1 -0
- package/dist/control/types.d.ts +64 -0
- package/dist/control/types.d.ts.map +1 -0
- package/dist/control/types.js +10 -0
- package/dist/control/types.js.map +1 -0
- package/dist/index.d.ts +15 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -34
- package/dist/index.js.map +1 -1
- package/dist/integrations/context-builder.d.ts +49 -0
- package/dist/integrations/context-builder.d.ts.map +1 -0
- package/dist/integrations/context-builder.js +160 -0
- package/dist/integrations/context-builder.js.map +1 -0
- package/dist/integrations/sessionlog.d.ts +58 -0
- package/dist/integrations/sessionlog.d.ts.map +1 -0
- package/dist/integrations/sessionlog.js +152 -0
- package/dist/integrations/sessionlog.js.map +1 -0
- package/dist/integrations/skilltree.d.ts +53 -0
- package/dist/integrations/skilltree.d.ts.map +1 -0
- package/dist/integrations/skilltree.js +140 -0
- package/dist/integrations/skilltree.js.map +1 -0
- package/dist/lifecycle/cleanup.d.ts +5 -14
- package/dist/lifecycle/cleanup.d.ts.map +1 -1
- package/dist/lifecycle/cleanup.js +4 -34
- package/dist/lifecycle/cleanup.js.map +1 -1
- package/dist/lifecycle/handlers-v2.d.ts +33 -0
- package/dist/lifecycle/handlers-v2.d.ts.map +1 -0
- package/dist/lifecycle/handlers-v2.js +319 -0
- package/dist/lifecycle/handlers-v2.js.map +1 -0
- package/dist/lifecycle/index.d.ts +3 -5
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +3 -12
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/dist/map/acp-bridge.d.ts +39 -0
- package/dist/map/acp-bridge.d.ts.map +1 -0
- package/dist/map/acp-bridge.js +180 -0
- package/dist/map/acp-bridge.js.map +1 -0
- package/dist/map/cc-swarm-hooks.d.ts +36 -0
- package/dist/map/cc-swarm-hooks.d.ts.map +1 -0
- package/dist/map/cc-swarm-hooks.js +218 -0
- package/dist/map/cc-swarm-hooks.js.map +1 -0
- package/dist/map/coordination-handler.d.ts +36 -0
- package/dist/map/coordination-handler.d.ts.map +1 -0
- package/dist/map/coordination-handler.js +166 -0
- package/dist/map/coordination-handler.js.map +1 -0
- package/dist/map/index.d.ts +5 -10
- package/dist/map/index.d.ts.map +1 -1
- package/dist/map/index.js +4 -13
- package/dist/map/index.js.map +1 -1
- package/dist/map/lifecycle-bridge.d.ts +34 -0
- package/dist/map/lifecycle-bridge.d.ts.map +1 -0
- package/dist/map/lifecycle-bridge.js +96 -0
- package/dist/map/lifecycle-bridge.js.map +1 -0
- package/dist/map/server.d.ts +38 -0
- package/dist/map/server.d.ts.map +1 -0
- package/dist/map/server.js +461 -0
- package/dist/map/server.js.map +1 -0
- package/dist/map/sidecar.d.ts +24 -0
- package/dist/map/sidecar.d.ts.map +1 -0
- package/dist/map/sidecar.js +263 -0
- package/dist/map/sidecar.js.map +1 -0
- package/dist/map/task-bridge.d.ts +22 -0
- package/dist/map/task-bridge.d.ts.map +1 -0
- package/dist/map/task-bridge.js +67 -0
- package/dist/map/task-bridge.js.map +1 -0
- package/dist/map/trajectory-reporter.d.ts +24 -0
- package/dist/map/trajectory-reporter.d.ts.map +1 -0
- package/dist/map/trajectory-reporter.js +86 -0
- package/dist/map/trajectory-reporter.js.map +1 -0
- package/dist/map/types.d.ts +162 -226
- package/dist/map/types.d.ts.map +1 -1
- package/dist/map/types.js +6 -165
- package/dist/map/types.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-server-v2.d.ts +44 -0
- package/dist/mcp/mcp-server-v2.d.ts.map +1 -0
- package/dist/mcp/mcp-server-v2.js +376 -0
- package/dist/mcp/mcp-server-v2.js.map +1 -0
- package/dist/mcp/tools/done-v2.d.ts +57 -0
- package/dist/mcp/tools/done-v2.d.ts.map +1 -0
- package/dist/mcp/tools/done-v2.js +129 -0
- package/dist/mcp/tools/done-v2.js.map +1 -0
- package/dist/metrics/index.d.ts +7 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +6 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/metrics.d.ts +9 -70
- package/dist/metrics/metrics.d.ts.map +1 -1
- package/dist/metrics/metrics.js +89 -145
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/metrics/types.d.ts +44 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +7 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/roles/builtin/coordinator.d.ts.map +1 -1
- package/dist/roles/builtin/coordinator.js +2 -1
- package/dist/roles/builtin/coordinator.js.map +1 -1
- package/dist/roles/builtin/integrator.d.ts.map +1 -1
- package/dist/roles/builtin/integrator.js +2 -1
- package/dist/roles/builtin/integrator.js.map +1 -1
- package/dist/roles/builtin/worker.d.ts.map +1 -1
- package/dist/roles/builtin/worker.js +3 -1
- package/dist/roles/builtin/worker.js.map +1 -1
- package/dist/roles/capabilities.d.ts +6 -0
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +10 -0
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +1 -1
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +3 -2
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/types.d.ts +3 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/store/index.d.ts +3 -6
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +3 -21
- package/dist/store/index.js.map +1 -1
- package/dist/store/types/agents.d.ts +5 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +3 -60
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/store/types/events.js +3 -46
- package/dist/store/types/events.js.map +1 -1
- package/dist/store/types/index.d.ts +0 -3
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/types/index.js +0 -3
- package/dist/store/types/index.js.map +1 -1
- package/dist/teams/index.d.ts +2 -2
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.js +1 -1
- package/dist/teams/index.js.map +1 -1
- package/dist/teams/seed-defaults.d.ts +20 -0
- package/dist/teams/seed-defaults.d.ts.map +1 -0
- package/dist/teams/seed-defaults.js +71 -0
- package/dist/teams/seed-defaults.js.map +1 -0
- package/dist/teams/team-loader.d.ts +6 -2
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +154 -162
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-manager-v2.d.ts +87 -0
- package/dist/teams/team-manager-v2.d.ts.map +1 -0
- package/dist/teams/team-manager-v2.js +203 -0
- package/dist/teams/team-manager-v2.js.map +1 -0
- package/dist/teams/team-runtime-v2.d.ts +149 -0
- package/dist/teams/team-runtime-v2.d.ts.map +1 -0
- package/dist/teams/team-runtime-v2.js +741 -0
- package/dist/teams/team-runtime-v2.js.map +1 -0
- package/dist/teams/types.d.ts +41 -151
- package/dist/teams/types.d.ts.map +1 -1
- package/dist/teams/types.js +2 -3
- package/dist/teams/types.js.map +1 -1
- package/dist/trigger/index.d.ts +2 -2
- package/dist/trigger/index.d.ts.map +1 -1
- package/dist/trigger/index.js +4 -4
- package/dist/trigger/index.js.map +1 -1
- package/dist/trigger/sources/cron/cron-service.d.ts +1 -1
- package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
- package/dist/trigger/sources/webhook/webhook-handler.d.ts +1 -1
- package/dist/trigger/sources/webhook/webhook-handler.d.ts.map +1 -1
- package/dist/trigger/strategies/ai-router.d.ts +31 -0
- package/dist/trigger/strategies/ai-router.d.ts.map +1 -0
- package/dist/trigger/strategies/ai-router.js +132 -0
- package/dist/trigger/strategies/ai-router.js.map +1 -0
- package/dist/trigger/trigger-system-v2.d.ts +106 -0
- package/dist/trigger/trigger-system-v2.d.ts.map +1 -0
- package/dist/trigger/trigger-system-v2.js +347 -0
- package/dist/trigger/trigger-system-v2.js.map +1 -0
- package/dist/trigger/types.d.ts +8 -0
- package/dist/trigger/types.d.ts.map +1 -1
- package/dist/trigger/types.js.map +1 -1
- package/dist/workspace/strategies/optimistic.d.ts +13 -3
- package/dist/workspace/strategies/optimistic.d.ts.map +1 -1
- package/dist/workspace/strategies/optimistic.js +4 -4
- package/dist/workspace/strategies/optimistic.js.map +1 -1
- package/docs/design-subsystem-extraction.md +627 -0
- package/docs/lifecycle-events-design.md +111 -0
- package/docs/openhive-capability-summary.md +415 -0
- package/docs/openhive-integration.md +415 -0
- package/docs/roadmap-v2-gaps.md +216 -0
- package/docs/teams.md +73 -0
- package/package.json +26 -6
- package/src/__tests__/boot-v2.test.ts +196 -0
- package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +496 -0
- package/src/__tests__/e2e/acp-over-map.e2e.test.ts +365 -0
- package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +770 -0
- package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +253 -0
- package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +282 -0
- package/src/__tests__/e2e/done-scenarios.e2e.test.ts +322 -0
- package/src/__tests__/e2e/live-agent.e2e.test.ts +1330 -0
- package/src/__tests__/e2e/map-server.e2e.test.ts +128 -0
- package/src/__tests__/e2e/map-sidecar.e2e.test.ts +139 -0
- package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +280 -0
- package/src/__tests__/e2e/pull-mode.e2e.test.ts +632 -0
- package/src/__tests__/e2e/resume-continue.e2e.test.ts +312 -0
- package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +562 -0
- package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +1049 -0
- package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +258 -0
- package/src/__tests__/e2e/trigger-wake.e2e.test.ts +257 -0
- package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +375 -0
- package/src/acp/__tests__/macro-agent.test.ts +234 -945
- package/src/acp/__tests__/session-mapper.test.ts +82 -155
- package/src/acp/__tests__/websocket-server.test.ts +121 -270
- package/src/acp/index.ts +18 -118
- package/src/acp/macro-agent.ts +692 -1752
- package/src/acp/map-bridge.ts +193 -0
- package/src/acp/session-mapper.ts +43 -276
- package/src/acp/types.ts +39 -767
- package/src/acp/websocket-server.ts +152 -588
- package/src/adapters/__tests__/federation.test.ts +256 -0
- package/src/adapters/__tests__/inbox-adapter.test.ts +316 -0
- package/src/adapters/__tests__/tasks-adapter.test.ts +269 -0
- package/src/adapters/federation.ts +185 -0
- package/src/adapters/inbox-adapter.ts +292 -0
- package/src/adapters/inbox-client-adapter.ts +173 -0
- package/src/adapters/index.ts +44 -0
- package/src/adapters/opentasks-daemon.ts +252 -0
- package/src/adapters/tasks-adapter.ts +327 -0
- package/src/adapters/types.ts +285 -0
- package/src/agent/__tests__/agent-manager-v2.test.ts +554 -0
- package/src/agent/__tests__/agent-store.test.ts +413 -0
- package/src/agent/agent-manager-v2.ts +1476 -0
- package/src/agent/agent-manager.ts +41 -1723
- package/src/agent/agent-store.ts +385 -0
- package/src/agent/types.ts +9 -0
- package/src/api/__tests__/server.test.ts +238 -961
- package/src/api/index.ts +5 -3
- package/src/api/server.ts +276 -1870
- package/src/api/types.ts +25 -337
- package/src/boot-v2.ts +527 -0
- package/src/cli/acp.ts +40 -435
- package/src/cli/index.ts +68 -466
- package/src/cli/mcp.ts +260 -326
- package/src/cognitive/__tests__/macro-agent-backend.test.ts +478 -0
- package/src/cognitive/__tests__/session-converter.test.ts +423 -0
- package/src/cognitive/__tests__/workspace-handler.test.ts +221 -0
- package/src/cognitive/analyst-role.ts +59 -0
- package/src/cognitive/index.ts +49 -0
- package/src/cognitive/macro-agent-backend.ts +354 -0
- package/src/cognitive/session-converter.ts +151 -0
- package/src/cognitive/types.ts +163 -0
- package/src/cognitive/workspace-handler.ts +163 -0
- package/src/config/project-config.ts +27 -3
- package/src/control/__tests__/control-resilience.test.ts +251 -0
- package/src/control/__tests__/control-socket.test.ts +240 -0
- package/src/control/control-client.ts +337 -0
- package/src/control/control-server.ts +298 -0
- package/src/control/index.ts +17 -0
- package/src/control/types.ts +95 -0
- package/src/index.ts +43 -222
- package/src/integrations/__tests__/context-builder.test.ts +218 -0
- package/src/integrations/__tests__/sessionlog.test.ts +498 -0
- package/src/integrations/__tests__/skilltree.test.ts +136 -0
- package/src/integrations/context-builder.ts +280 -0
- package/src/integrations/sessionlog.ts +194 -0
- package/src/integrations/skilltree.ts +183 -0
- package/src/lifecycle/__tests__/handlers-v2.test.ts +565 -0
- package/src/lifecycle/cleanup.ts +6 -46
- package/src/lifecycle/handlers-v2.ts +437 -0
- package/src/lifecycle/index.ts +2 -28
- package/src/lifecycle/types.ts +3 -0
- package/src/map/__tests__/lifecycle-bridge.test.ts +223 -0
- package/src/map/__tests__/permission-forwarding.test.ts +143 -0
- package/src/map/__tests__/sidecar-integration.test.ts +190 -0
- package/src/map/__tests__/task-bridge.test.ts +153 -0
- package/src/map/__tests__/trajectory-reporter.test.ts +173 -0
- package/src/map/acp-bridge.ts +270 -0
- package/src/map/cc-swarm-hooks.ts +242 -0
- package/src/map/coordination-handler.ts +220 -0
- package/src/map/index.ts +13 -14
- package/src/map/lifecycle-bridge.ts +140 -0
- package/src/map/server.ts +527 -0
- package/src/map/sidecar.ts +312 -0
- package/src/map/task-bridge.ts +89 -0
- package/src/map/trajectory-reporter.ts +124 -0
- package/src/map/types.ts +195 -367
- package/src/mcp/__tests__/mcp-server-v2.test.ts +236 -0
- package/src/mcp/index.ts +2 -2
- package/src/mcp/mcp-server-v2.ts +485 -0
- package/src/mcp/tools/done-v2.ts +203 -0
- package/src/metrics/__tests__/metrics.test.ts +205 -0
- package/src/metrics/index.ts +13 -9
- package/src/metrics/metrics.ts +110 -239
- package/src/metrics/types.ts +63 -0
- package/src/roles/builtin/coordinator.ts +2 -0
- package/src/roles/builtin/integrator.ts +2 -0
- package/src/roles/builtin/worker.ts +3 -0
- package/src/roles/capabilities.ts +11 -0
- package/src/roles/config-loader.ts +3 -2
- package/src/roles/types.ts +7 -0
- package/src/store/index.ts +3 -64
- package/src/store/types/agents.ts +5 -0
- package/src/store/types/events.ts +5 -100
- package/src/store/types/index.ts +0 -3
- package/src/teams/__tests__/team-manager-v2.test.ts +425 -0
- package/src/teams/__tests__/team-runtime-v2.test.ts +402 -0
- package/src/teams/index.ts +20 -4
- package/src/teams/seed-defaults.ts +79 -0
- package/src/teams/team-loader.ts +200 -234
- package/src/teams/team-manager-v2.ts +268 -0
- package/src/teams/team-runtime-v2.ts +898 -0
- package/src/teams/types.ts +99 -200
- package/src/trigger/__tests__/trigger-system-v2.test.ts +257 -0
- package/src/trigger/index.ts +16 -31
- package/src/trigger/sources/cron/cron-service.ts +1 -1
- package/src/trigger/sources/webhook/webhook-handler.ts +1 -1
- package/src/trigger/strategies/ai-router.ts +170 -0
- package/src/trigger/trigger-system-v2.ts +536 -0
- package/src/trigger/types.ts +13 -0
- package/src/workspace/strategies/optimistic.ts +9 -6
- package/.claude/settings.local.json +0 -61
- package/dist/acp/websocket-stream.d.ts +0 -30
- package/dist/acp/websocket-stream.d.ts.map +0 -1
- package/dist/acp/websocket-stream.js +0 -118
- package/dist/acp/websocket-stream.js.map +0 -1
- package/dist/activity/deduplication.d.ts +0 -85
- package/dist/activity/deduplication.d.ts.map +0 -1
- package/dist/activity/deduplication.js +0 -149
- package/dist/activity/deduplication.js.map +0 -1
- package/dist/activity/index.d.ts +0 -16
- package/dist/activity/index.d.ts.map +0 -1
- package/dist/activity/index.js +0 -17
- package/dist/activity/index.js.map +0 -1
- package/dist/activity/relevance.d.ts +0 -81
- package/dist/activity/relevance.d.ts.map +0 -1
- package/dist/activity/relevance.js +0 -161
- package/dist/activity/relevance.js.map +0 -1
- package/dist/activity/types.d.ts +0 -169
- package/dist/activity/types.d.ts.map +0 -1
- package/dist/activity/types.js +0 -33
- package/dist/activity/types.js.map +0 -1
- package/dist/activity/watcher.d.ts +0 -64
- package/dist/activity/watcher.d.ts.map +0 -1
- package/dist/activity/watcher.js +0 -212
- package/dist/activity/watcher.js.map +0 -1
- package/dist/agent/wake.d.ts +0 -85
- package/dist/agent/wake.d.ts.map +0 -1
- package/dist/agent/wake.js +0 -278
- package/dist/agent/wake.js.map +0 -1
- package/dist/lifecycle/handlers/generic.d.ts +0 -27
- package/dist/lifecycle/handlers/generic.d.ts.map +0 -1
- package/dist/lifecycle/handlers/generic.js +0 -56
- package/dist/lifecycle/handlers/generic.js.map +0 -1
- package/dist/lifecycle/handlers/index.d.ts +0 -47
- package/dist/lifecycle/handlers/index.d.ts.map +0 -1
- package/dist/lifecycle/handlers/index.js +0 -93
- package/dist/lifecycle/handlers/index.js.map +0 -1
- package/dist/lifecycle/handlers/integrator.d.ts +0 -81
- package/dist/lifecycle/handlers/integrator.d.ts.map +0 -1
- package/dist/lifecycle/handlers/integrator.js +0 -451
- package/dist/lifecycle/handlers/integrator.js.map +0 -1
- package/dist/lifecycle/handlers/monitor.d.ts +0 -29
- package/dist/lifecycle/handlers/monitor.d.ts.map +0 -1
- package/dist/lifecycle/handlers/monitor.js +0 -79
- package/dist/lifecycle/handlers/monitor.js.map +0 -1
- package/dist/lifecycle/handlers/worker.d.ts +0 -56
- package/dist/lifecycle/handlers/worker.d.ts.map +0 -1
- package/dist/lifecycle/handlers/worker.js +0 -381
- package/dist/lifecycle/handlers/worker.js.map +0 -1
- package/dist/mail/conversation-map.d.ts +0 -33
- package/dist/mail/conversation-map.d.ts.map +0 -1
- package/dist/mail/conversation-map.js +0 -61
- package/dist/mail/conversation-map.js.map +0 -1
- package/dist/mail/index.d.ts +0 -11
- package/dist/mail/index.d.ts.map +0 -1
- package/dist/mail/index.js +0 -11
- package/dist/mail/index.js.map +0 -1
- package/dist/mail/mail-service.d.ts +0 -85
- package/dist/mail/mail-service.d.ts.map +0 -1
- package/dist/mail/mail-service.js +0 -121
- package/dist/mail/mail-service.js.map +0 -1
- package/dist/mail/stores/eventstore-conversation-store.d.ts +0 -40
- package/dist/mail/stores/eventstore-conversation-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-conversation-store.js +0 -131
- package/dist/mail/stores/eventstore-conversation-store.js.map +0 -1
- package/dist/mail/stores/eventstore-participant-store.d.ts +0 -43
- package/dist/mail/stores/eventstore-participant-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-participant-store.js +0 -145
- package/dist/mail/stores/eventstore-participant-store.js.map +0 -1
- package/dist/mail/stores/eventstore-thread-store.d.ts +0 -46
- package/dist/mail/stores/eventstore-thread-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-thread-store.js +0 -118
- package/dist/mail/stores/eventstore-thread-store.js.map +0 -1
- package/dist/mail/stores/eventstore-turn-store.d.ts +0 -47
- package/dist/mail/stores/eventstore-turn-store.d.ts.map +0 -1
- package/dist/mail/stores/eventstore-turn-store.js +0 -153
- package/dist/mail/stores/eventstore-turn-store.js.map +0 -1
- package/dist/mail/stores/index.d.ts +0 -12
- package/dist/mail/stores/index.d.ts.map +0 -1
- package/dist/mail/stores/index.js +0 -12
- package/dist/mail/stores/index.js.map +0 -1
- package/dist/mail/stores/types.d.ts +0 -146
- package/dist/mail/stores/types.d.ts.map +0 -1
- package/dist/mail/stores/types.js +0 -13
- package/dist/mail/stores/types.js.map +0 -1
- package/dist/mail/turn-recorder.d.ts +0 -30
- package/dist/mail/turn-recorder.d.ts.map +0 -1
- package/dist/mail/turn-recorder.js +0 -98
- package/dist/mail/turn-recorder.js.map +0 -1
- package/dist/map/adapter/acp-over-map.d.ts +0 -115
- package/dist/map/adapter/acp-over-map.d.ts.map +0 -1
- package/dist/map/adapter/acp-over-map.js +0 -1024
- package/dist/map/adapter/acp-over-map.js.map +0 -1
- package/dist/map/adapter/connection-manager.d.ts +0 -150
- package/dist/map/adapter/connection-manager.d.ts.map +0 -1
- package/dist/map/adapter/connection-manager.js +0 -207
- package/dist/map/adapter/connection-manager.js.map +0 -1
- package/dist/map/adapter/event-log.d.ts +0 -87
- package/dist/map/adapter/event-log.d.ts.map +0 -1
- package/dist/map/adapter/event-log.js +0 -122
- package/dist/map/adapter/event-log.js.map +0 -1
- package/dist/map/adapter/event-translator.d.ts +0 -85
- package/dist/map/adapter/event-translator.d.ts.map +0 -1
- package/dist/map/adapter/event-translator.js +0 -295
- package/dist/map/adapter/event-translator.js.map +0 -1
- package/dist/map/adapter/extensions/agent-detection.d.ts +0 -49
- package/dist/map/adapter/extensions/agent-detection.d.ts.map +0 -1
- package/dist/map/adapter/extensions/agent-detection.js +0 -91
- package/dist/map/adapter/extensions/agent-detection.js.map +0 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +0 -82
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +0 -1
- package/dist/map/adapter/extensions/agent-lifecycle.js +0 -164
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +0 -1
- package/dist/map/adapter/extensions/index.d.ts +0 -89
- package/dist/map/adapter/extensions/index.d.ts.map +0 -1
- package/dist/map/adapter/extensions/index.js +0 -187
- package/dist/map/adapter/extensions/index.js.map +0 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +0 -57
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +0 -1
- package/dist/map/adapter/extensions/mcp-bridge.js +0 -745
- package/dist/map/adapter/extensions/mcp-bridge.js.map +0 -1
- package/dist/map/adapter/extensions/rename.d.ts +0 -29
- package/dist/map/adapter/extensions/rename.d.ts.map +0 -1
- package/dist/map/adapter/extensions/rename.js +0 -49
- package/dist/map/adapter/extensions/rename.js.map +0 -1
- package/dist/map/adapter/extensions/resume.d.ts +0 -47
- package/dist/map/adapter/extensions/resume.d.ts.map +0 -1
- package/dist/map/adapter/extensions/resume.js +0 -59
- package/dist/map/adapter/extensions/resume.js.map +0 -1
- package/dist/map/adapter/extensions/task.d.ts +0 -40
- package/dist/map/adapter/extensions/task.d.ts.map +0 -1
- package/dist/map/adapter/extensions/task.js +0 -197
- package/dist/map/adapter/extensions/task.js.map +0 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +0 -29
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +0 -1
- package/dist/map/adapter/extensions/update-metadata.js +0 -67
- package/dist/map/adapter/extensions/update-metadata.js.map +0 -1
- package/dist/map/adapter/extensions/wake.d.ts +0 -60
- package/dist/map/adapter/extensions/wake.d.ts.map +0 -1
- package/dist/map/adapter/extensions/wake.js +0 -144
- package/dist/map/adapter/extensions/wake.js.map +0 -1
- package/dist/map/adapter/extensions/workspace-files.d.ts +0 -42
- package/dist/map/adapter/extensions/workspace-files.d.ts.map +0 -1
- package/dist/map/adapter/extensions/workspace-files.js +0 -338
- package/dist/map/adapter/extensions/workspace-files.js.map +0 -1
- package/dist/map/adapter/extensions/workspace.d.ts +0 -57
- package/dist/map/adapter/extensions/workspace.d.ts.map +0 -1
- package/dist/map/adapter/extensions/workspace.js +0 -81
- package/dist/map/adapter/extensions/workspace.js.map +0 -1
- package/dist/map/adapter/index.d.ts +0 -20
- package/dist/map/adapter/index.d.ts.map +0 -1
- package/dist/map/adapter/index.js +0 -38
- package/dist/map/adapter/index.js.map +0 -1
- package/dist/map/adapter/interface.d.ts +0 -450
- package/dist/map/adapter/interface.d.ts.map +0 -1
- package/dist/map/adapter/interface.js +0 -24
- package/dist/map/adapter/interface.js.map +0 -1
- package/dist/map/adapter/mail-handler-adapter.d.ts +0 -27
- package/dist/map/adapter/mail-handler-adapter.d.ts.map +0 -1
- package/dist/map/adapter/mail-handler-adapter.js +0 -292
- package/dist/map/adapter/mail-handler-adapter.js.map +0 -1
- package/dist/map/adapter/map-adapter.d.ts +0 -200
- package/dist/map/adapter/map-adapter.d.ts.map +0 -1
- package/dist/map/adapter/map-adapter.js +0 -1199
- package/dist/map/adapter/map-adapter.js.map +0 -1
- package/dist/map/adapter/rpc-handler.d.ts +0 -263
- package/dist/map/adapter/rpc-handler.d.ts.map +0 -1
- package/dist/map/adapter/rpc-handler.js +0 -365
- package/dist/map/adapter/rpc-handler.js.map +0 -1
- package/dist/map/adapter/subscription-manager.d.ts +0 -174
- package/dist/map/adapter/subscription-manager.d.ts.map +0 -1
- package/dist/map/adapter/subscription-manager.js +0 -248
- package/dist/map/adapter/subscription-manager.js.map +0 -1
- package/dist/map/adapter/types.d.ts +0 -194
- package/dist/map/adapter/types.d.ts.map +0 -1
- package/dist/map/adapter/types.js +0 -27
- package/dist/map/adapter/types.js.map +0 -1
- package/dist/map/adapter/websocket-integration.d.ts +0 -113
- package/dist/map/adapter/websocket-integration.d.ts.map +0 -1
- package/dist/map/adapter/websocket-integration.js +0 -134
- package/dist/map/adapter/websocket-integration.js.map +0 -1
- package/dist/map/federation/envelope.d.ts +0 -98
- package/dist/map/federation/envelope.d.ts.map +0 -1
- package/dist/map/federation/envelope.js +0 -160
- package/dist/map/federation/envelope.js.map +0 -1
- package/dist/map/federation/federation-handler.d.ts +0 -50
- package/dist/map/federation/federation-handler.d.ts.map +0 -1
- package/dist/map/federation/federation-handler.js +0 -306
- package/dist/map/federation/federation-handler.js.map +0 -1
- package/dist/map/federation/index.d.ts +0 -14
- package/dist/map/federation/index.d.ts.map +0 -1
- package/dist/map/federation/index.js +0 -13
- package/dist/map/federation/index.js.map +0 -1
- package/dist/map/federation/types.d.ts +0 -239
- package/dist/map/federation/types.d.ts.map +0 -1
- package/dist/map/federation/types.js +0 -23
- package/dist/map/federation/types.js.map +0 -1
- package/dist/map/utils/address-translation.d.ts +0 -99
- package/dist/map/utils/address-translation.d.ts.map +0 -1
- package/dist/map/utils/address-translation.js +0 -285
- package/dist/map/utils/address-translation.js.map +0 -1
- package/dist/map/utils/index.d.ts +0 -7
- package/dist/map/utils/index.d.ts.map +0 -1
- package/dist/map/utils/index.js +0 -7
- package/dist/map/utils/index.js.map +0 -1
- package/dist/mcp/map-client.d.ts +0 -39
- package/dist/mcp/map-client.d.ts.map +0 -1
- package/dist/mcp/map-client.js +0 -129
- package/dist/mcp/map-client.js.map +0 -1
- package/dist/mcp/mcp-server.d.ts +0 -70
- package/dist/mcp/mcp-server.d.ts.map +0 -1
- package/dist/mcp/mcp-server.js +0 -1015
- package/dist/mcp/mcp-server.js.map +0 -1
- package/dist/mcp/tools/claim_task.d.ts +0 -35
- package/dist/mcp/tools/claim_task.d.ts.map +0 -1
- package/dist/mcp/tools/claim_task.js +0 -58
- package/dist/mcp/tools/claim_task.js.map +0 -1
- package/dist/mcp/tools/done.d.ts +0 -102
- package/dist/mcp/tools/done.d.ts.map +0 -1
- package/dist/mcp/tools/done.js +0 -234
- package/dist/mcp/tools/done.js.map +0 -1
- package/dist/mcp/tools/inject_context.d.ts +0 -61
- package/dist/mcp/tools/inject_context.d.ts.map +0 -1
- package/dist/mcp/tools/inject_context.js +0 -123
- package/dist/mcp/tools/inject_context.js.map +0 -1
- package/dist/mcp/tools/list_claimable_tasks.d.ts +0 -38
- package/dist/mcp/tools/list_claimable_tasks.d.ts.map +0 -1
- package/dist/mcp/tools/list_claimable_tasks.js +0 -63
- package/dist/mcp/tools/list_claimable_tasks.js.map +0 -1
- package/dist/mcp/tools/unclaim_task.d.ts +0 -31
- package/dist/mcp/tools/unclaim_task.d.ts.map +0 -1
- package/dist/mcp/tools/unclaim_task.js +0 -47
- package/dist/mcp/tools/unclaim_task.js.map +0 -1
- package/dist/mcp/tools/wait_for_activity.d.ts +0 -60
- package/dist/mcp/tools/wait_for_activity.d.ts.map +0 -1
- package/dist/mcp/tools/wait_for_activity.js +0 -135
- package/dist/mcp/tools/wait_for_activity.js.map +0 -1
- package/dist/monitor/health-check-service.d.ts +0 -143
- package/dist/monitor/health-check-service.d.ts.map +0 -1
- package/dist/monitor/health-check-service.js +0 -240
- package/dist/monitor/health-check-service.js.map +0 -1
- package/dist/monitor/index.d.ts +0 -14
- package/dist/monitor/index.d.ts.map +0 -1
- package/dist/monitor/index.js +0 -14
- package/dist/monitor/index.js.map +0 -1
- package/dist/monitor/stall-detector.d.ts +0 -109
- package/dist/monitor/stall-detector.d.ts.map +0 -1
- package/dist/monitor/stall-detector.js +0 -152
- package/dist/monitor/stall-detector.js.map +0 -1
- package/dist/peer/capability-manager.d.ts +0 -56
- package/dist/peer/capability-manager.d.ts.map +0 -1
- package/dist/peer/capability-manager.js +0 -186
- package/dist/peer/capability-manager.js.map +0 -1
- package/dist/peer/encapsulation-manager.d.ts +0 -190
- package/dist/peer/encapsulation-manager.d.ts.map +0 -1
- package/dist/peer/encapsulation-manager.js +0 -486
- package/dist/peer/encapsulation-manager.js.map +0 -1
- package/dist/peer/federation-manager.d.ts +0 -223
- package/dist/peer/federation-manager.d.ts.map +0 -1
- package/dist/peer/federation-manager.js +0 -528
- package/dist/peer/federation-manager.js.map +0 -1
- package/dist/peer/hierarchy-errors.d.ts +0 -208
- package/dist/peer/hierarchy-errors.d.ts.map +0 -1
- package/dist/peer/hierarchy-errors.js +0 -268
- package/dist/peer/hierarchy-errors.js.map +0 -1
- package/dist/peer/hierarchy-protocol.d.ts +0 -159
- package/dist/peer/hierarchy-protocol.d.ts.map +0 -1
- package/dist/peer/hierarchy-protocol.js +0 -142
- package/dist/peer/hierarchy-protocol.js.map +0 -1
- package/dist/peer/index.d.ts +0 -15
- package/dist/peer/index.d.ts.map +0 -1
- package/dist/peer/index.js +0 -15
- package/dist/peer/index.js.map +0 -1
- package/dist/peer/peer-manager.d.ts +0 -99
- package/dist/peer/peer-manager.d.ts.map +0 -1
- package/dist/peer/peer-manager.js +0 -333
- package/dist/peer/peer-manager.js.map +0 -1
- package/dist/peer/task-delegation.d.ts +0 -189
- package/dist/peer/task-delegation.d.ts.map +0 -1
- package/dist/peer/task-delegation.js +0 -303
- package/dist/peer/task-delegation.js.map +0 -1
- package/dist/peer/transports/index.d.ts +0 -8
- package/dist/peer/transports/index.d.ts.map +0 -1
- package/dist/peer/transports/index.js +0 -8
- package/dist/peer/transports/index.js.map +0 -1
- package/dist/peer/transports/local-transport.d.ts +0 -56
- package/dist/peer/transports/local-transport.d.ts.map +0 -1
- package/dist/peer/transports/local-transport.js +0 -263
- package/dist/peer/transports/local-transport.js.map +0 -1
- package/dist/peer/transports/websocket-transport.d.ts +0 -86
- package/dist/peer/transports/websocket-transport.d.ts.map +0 -1
- package/dist/peer/transports/websocket-transport.js +0 -338
- package/dist/peer/transports/websocket-transport.js.map +0 -1
- package/dist/peer/types.d.ts +0 -268
- package/dist/peer/types.d.ts.map +0 -1
- package/dist/peer/types.js +0 -36
- package/dist/peer/types.js.map +0 -1
- package/dist/router/address-resolver.d.ts +0 -102
- package/dist/router/address-resolver.d.ts.map +0 -1
- package/dist/router/address-resolver.js +0 -198
- package/dist/router/address-resolver.js.map +0 -1
- package/dist/router/broadcast.d.ts +0 -53
- package/dist/router/broadcast.d.ts.map +0 -1
- package/dist/router/broadcast.js +0 -75
- package/dist/router/broadcast.js.map +0 -1
- package/dist/router/channels.d.ts +0 -148
- package/dist/router/channels.d.ts.map +0 -1
- package/dist/router/channels.js +0 -126
- package/dist/router/channels.js.map +0 -1
- package/dist/router/index.d.ts +0 -21
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/index.js +0 -18
- package/dist/router/index.js.map +0 -1
- package/dist/router/message-router.d.ts +0 -197
- package/dist/router/message-router.d.ts.map +0 -1
- package/dist/router/message-router.js +0 -903
- package/dist/router/message-router.js.map +0 -1
- package/dist/router/message-types.d.ts +0 -183
- package/dist/router/message-types.d.ts.map +0 -1
- package/dist/router/message-types.js +0 -79
- package/dist/router/message-types.js.map +0 -1
- package/dist/router/role-resolver.d.ts +0 -67
- package/dist/router/role-resolver.d.ts.map +0 -1
- package/dist/router/role-resolver.js +0 -106
- package/dist/router/role-resolver.js.map +0 -1
- package/dist/router/signals.d.ts +0 -253
- package/dist/router/signals.d.ts.map +0 -1
- package/dist/router/signals.js +0 -53
- package/dist/router/signals.js.map +0 -1
- package/dist/router/types.d.ts +0 -191
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -34
- package/dist/router/types.js.map +0 -1
- package/dist/router/wake.d.ts +0 -111
- package/dist/router/wake.d.ts.map +0 -1
- package/dist/router/wake.js +0 -180
- package/dist/router/wake.js.map +0 -1
- package/dist/server/combined-server.d.ts +0 -88
- package/dist/server/combined-server.d.ts.map +0 -1
- package/dist/server/combined-server.js +0 -331
- package/dist/server/combined-server.js.map +0 -1
- package/dist/steering/index.d.ts +0 -11
- package/dist/steering/index.d.ts.map +0 -1
- package/dist/steering/index.js +0 -11
- package/dist/steering/index.js.map +0 -1
- package/dist/steering/inject.d.ts +0 -39
- package/dist/steering/inject.d.ts.map +0 -1
- package/dist/steering/inject.js +0 -197
- package/dist/steering/inject.js.map +0 -1
- package/dist/steering/types.d.ts +0 -100
- package/dist/steering/types.d.ts.map +0 -1
- package/dist/steering/types.js +0 -11
- package/dist/steering/types.js.map +0 -1
- package/dist/store/backends/index.d.ts +0 -11
- package/dist/store/backends/index.d.ts.map +0 -1
- package/dist/store/backends/index.js +0 -15
- package/dist/store/backends/index.js.map +0 -1
- package/dist/store/backends/json-backend.d.ts +0 -23
- package/dist/store/backends/json-backend.d.ts.map +0 -1
- package/dist/store/backends/json-backend.js +0 -220
- package/dist/store/backends/json-backend.js.map +0 -1
- package/dist/store/backends/memory-backend.d.ts +0 -12
- package/dist/store/backends/memory-backend.d.ts.map +0 -1
- package/dist/store/backends/memory-backend.js +0 -205
- package/dist/store/backends/memory-backend.js.map +0 -1
- package/dist/store/backends/sqlite-backend.d.ts +0 -27
- package/dist/store/backends/sqlite-backend.d.ts.map +0 -1
- package/dist/store/backends/sqlite-backend.js +0 -231
- package/dist/store/backends/sqlite-backend.js.map +0 -1
- package/dist/store/backends/tinybase-backend.d.ts +0 -22
- package/dist/store/backends/tinybase-backend.d.ts.map +0 -1
- package/dist/store/backends/tinybase-backend.js +0 -203
- package/dist/store/backends/tinybase-backend.js.map +0 -1
- package/dist/store/backends/types.d.ts +0 -175
- package/dist/store/backends/types.d.ts.map +0 -1
- package/dist/store/backends/types.js +0 -28
- package/dist/store/backends/types.js.map +0 -1
- package/dist/store/event-store.d.ts +0 -128
- package/dist/store/event-store.d.ts.map +0 -1
- package/dist/store/event-store.js +0 -1739
- package/dist/store/event-store.js.map +0 -1
- package/dist/store/instance.d.ts +0 -283
- package/dist/store/instance.d.ts.map +0 -1
- package/dist/store/instance.js +0 -363
- package/dist/store/instance.js.map +0 -1
- package/dist/store/migrations.d.ts +0 -41
- package/dist/store/migrations.d.ts.map +0 -1
- package/dist/store/migrations.js +0 -79
- package/dist/store/migrations.js.map +0 -1
- package/dist/store/types/config.d.ts +0 -16
- package/dist/store/types/config.d.ts.map +0 -1
- package/dist/store/types/config.js +0 -8
- package/dist/store/types/config.js.map +0 -1
- package/dist/store/types/conversations.d.ts +0 -91
- package/dist/store/types/conversations.d.ts.map +0 -1
- package/dist/store/types/conversations.js +0 -8
- package/dist/store/types/conversations.js.map +0 -1
- package/dist/store/types/sessions.d.ts +0 -44
- package/dist/store/types/sessions.d.ts.map +0 -1
- package/dist/store/types/sessions.js +0 -9
- package/dist/store/types/sessions.js.map +0 -1
- package/dist/task/backend/index.d.ts +0 -93
- package/dist/task/backend/index.d.ts.map +0 -1
- package/dist/task/backend/index.js +0 -178
- package/dist/task/backend/index.js.map +0 -1
- package/dist/task/backend/memory.d.ts +0 -70
- package/dist/task/backend/memory.d.ts.map +0 -1
- package/dist/task/backend/memory.js +0 -621
- package/dist/task/backend/memory.js.map +0 -1
- package/dist/task/backend/opentasks/backend.d.ts +0 -140
- package/dist/task/backend/opentasks/backend.d.ts.map +0 -1
- package/dist/task/backend/opentasks/backend.js +0 -1023
- package/dist/task/backend/opentasks/backend.js.map +0 -1
- package/dist/task/backend/opentasks/client.d.ts +0 -337
- package/dist/task/backend/opentasks/client.d.ts.map +0 -1
- package/dist/task/backend/opentasks/client.js +0 -225
- package/dist/task/backend/opentasks/client.js.map +0 -1
- package/dist/task/backend/opentasks/daemon-manager.d.ts +0 -89
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +0 -1
- package/dist/task/backend/opentasks/daemon-manager.js +0 -195
- package/dist/task/backend/opentasks/daemon-manager.js.map +0 -1
- package/dist/task/backend/opentasks/index.d.ts +0 -21
- package/dist/task/backend/opentasks/index.d.ts.map +0 -1
- package/dist/task/backend/opentasks/index.js +0 -21
- package/dist/task/backend/opentasks/index.js.map +0 -1
- package/dist/task/backend/opentasks/mapping.d.ts +0 -48
- package/dist/task/backend/opentasks/mapping.d.ts.map +0 -1
- package/dist/task/backend/opentasks/mapping.js +0 -77
- package/dist/task/backend/opentasks/mapping.js.map +0 -1
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +0 -54
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +0 -1
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +0 -88
- package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +0 -1
- package/dist/task/backend/sudocode/backend.d.ts +0 -155
- package/dist/task/backend/sudocode/backend.d.ts.map +0 -1
- package/dist/task/backend/sudocode/backend.js +0 -942
- package/dist/task/backend/sudocode/backend.js.map +0 -1
- package/dist/task/backend/sudocode/client.d.ts +0 -303
- package/dist/task/backend/sudocode/client.d.ts.map +0 -1
- package/dist/task/backend/sudocode/client.js +0 -101
- package/dist/task/backend/sudocode/client.js.map +0 -1
- package/dist/task/backend/sudocode/index.d.ts +0 -19
- package/dist/task/backend/sudocode/index.d.ts.map +0 -1
- package/dist/task/backend/sudocode/index.js +0 -17
- package/dist/task/backend/sudocode/index.js.map +0 -1
- package/dist/task/backend/sudocode/mapping.d.ts +0 -51
- package/dist/task/backend/sudocode/mapping.d.ts.map +0 -1
- package/dist/task/backend/sudocode/mapping.js +0 -86
- package/dist/task/backend/sudocode/mapping.js.map +0 -1
- package/dist/task/backend/sudocode/server-client.d.ts +0 -56
- package/dist/task/backend/sudocode/server-client.d.ts.map +0 -1
- package/dist/task/backend/sudocode/server-client.js +0 -367
- package/dist/task/backend/sudocode/server-client.js.map +0 -1
- package/dist/task/backend/sudocode/standalone-client.d.ts +0 -91
- package/dist/task/backend/sudocode/standalone-client.d.ts.map +0 -1
- package/dist/task/backend/sudocode/standalone-client.js +0 -476
- package/dist/task/backend/sudocode/standalone-client.js.map +0 -1
- package/dist/task/backend/sudocode/sync-policy.d.ts +0 -166
- package/dist/task/backend/sudocode/sync-policy.d.ts.map +0 -1
- package/dist/task/backend/sudocode/sync-policy.js +0 -221
- package/dist/task/backend/sudocode/sync-policy.js.map +0 -1
- package/dist/task/backend/sudocode/tools.d.ts +0 -87
- package/dist/task/backend/sudocode/tools.d.ts.map +0 -1
- package/dist/task/backend/sudocode/tools.js +0 -743
- package/dist/task/backend/sudocode/tools.js.map +0 -1
- package/dist/task/backend/tool-provider.d.ts +0 -56
- package/dist/task/backend/tool-provider.d.ts.map +0 -1
- package/dist/task/backend/tool-provider.js +0 -424
- package/dist/task/backend/tool-provider.js.map +0 -1
- package/dist/task/backend/types.d.ts +0 -297
- package/dist/task/backend/types.d.ts.map +0 -1
- package/dist/task/backend/types.js +0 -27
- package/dist/task/backend/types.js.map +0 -1
- package/dist/task/backend/unified-tool-provider.d.ts +0 -57
- package/dist/task/backend/unified-tool-provider.d.ts.map +0 -1
- package/dist/task/backend/unified-tool-provider.js +0 -623
- package/dist/task/backend/unified-tool-provider.js.map +0 -1
- package/dist/task/index.d.ts +0 -7
- package/dist/task/index.d.ts.map +0 -1
- package/dist/task/index.js +0 -7
- package/dist/task/index.js.map +0 -1
- package/dist/task/retry-policy.d.ts +0 -89
- package/dist/task/retry-policy.d.ts.map +0 -1
- package/dist/task/retry-policy.js +0 -160
- package/dist/task/retry-policy.js.map +0 -1
- package/dist/task/task-manager.d.ts +0 -70
- package/dist/task/task-manager.d.ts.map +0 -1
- package/dist/task/task-manager.js +0 -319
- package/dist/task/task-manager.js.map +0 -1
- package/dist/task/types.d.ts +0 -72
- package/dist/task/types.d.ts.map +0 -1
- package/dist/task/types.js +0 -33
- package/dist/task/types.js.map +0 -1
- package/dist/teams/team-runtime.d.ts +0 -139
- package/dist/teams/team-runtime.d.ts.map +0 -1
- package/dist/teams/team-runtime.js +0 -615
- package/dist/teams/team-runtime.js.map +0 -1
- package/dist/trigger/router/index.d.ts +0 -11
- package/dist/trigger/router/index.d.ts.map +0 -1
- package/dist/trigger/router/index.js +0 -10
- package/dist/trigger/router/index.js.map +0 -1
- package/dist/trigger/router/strategies/ai-router-strategy.d.ts +0 -34
- package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +0 -1
- package/dist/trigger/router/strategies/ai-router-strategy.js +0 -359
- package/dist/trigger/router/strategies/ai-router-strategy.js.map +0 -1
- package/dist/trigger/router/strategies/direct-strategy.d.ts +0 -32
- package/dist/trigger/router/strategies/direct-strategy.d.ts.map +0 -1
- package/dist/trigger/router/strategies/direct-strategy.js +0 -119
- package/dist/trigger/router/strategies/direct-strategy.js.map +0 -1
- package/dist/trigger/router/strategies/index.d.ts +0 -11
- package/dist/trigger/router/strategies/index.d.ts.map +0 -1
- package/dist/trigger/router/strategies/index.js +0 -11
- package/dist/trigger/router/strategies/index.js.map +0 -1
- package/dist/trigger/router/strategies/role-strategy.d.ts +0 -39
- package/dist/trigger/router/strategies/role-strategy.d.ts.map +0 -1
- package/dist/trigger/router/strategies/role-strategy.js +0 -207
- package/dist/trigger/router/strategies/role-strategy.js.map +0 -1
- package/dist/trigger/router/trigger-router.d.ts +0 -54
- package/dist/trigger/router/trigger-router.d.ts.map +0 -1
- package/dist/trigger/router/trigger-router.js +0 -362
- package/dist/trigger/router/trigger-router.js.map +0 -1
- package/dist/trigger/router/types.d.ts +0 -225
- package/dist/trigger/router/types.d.ts.map +0 -1
- package/dist/trigger/router/types.js +0 -10
- package/dist/trigger/router/types.js.map +0 -1
- package/dist/trigger/trigger-system.d.ts +0 -77
- package/dist/trigger/trigger-system.d.ts.map +0 -1
- package/dist/trigger/trigger-system.js +0 -84
- package/dist/trigger/trigger-system.js.map +0 -1
- package/references/acp-factory-ref/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/LICENSE +0 -21
- package/references/acp-factory-ref/README.md +0 -341
- package/references/acp-factory-ref/package-lock.json +0 -3102
- package/references/acp-factory-ref/package.json +0 -96
- package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/python/LICENSE +0 -21
- package/references/acp-factory-ref/python/Makefile +0 -57
- package/references/acp-factory-ref/python/README.md +0 -253
- package/references/acp-factory-ref/python/pyproject.toml +0 -73
- package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
- package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
- package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
- package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
- package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
- package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
- package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
- package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
- package/references/claude-code-acp/.prettierrc.json +0 -4
- package/references/claude-code-acp/CHANGELOG.md +0 -249
- package/references/claude-code-acp/LICENSE +0 -222
- package/references/claude-code-acp/README.md +0 -53
- package/references/claude-code-acp/docs/RELEASES.md +0 -24
- package/references/claude-code-acp/eslint.config.js +0 -48
- package/references/claude-code-acp/package-lock.json +0 -4570
- package/references/claude-code-acp/package.json +0 -88
- package/references/claude-code-acp/scripts/release.sh +0 -119
- package/references/claude-code-acp/src/acp-agent.ts +0 -2076
- package/references/claude-code-acp/src/index.ts +0 -26
- package/references/claude-code-acp/src/lib.ts +0 -38
- package/references/claude-code-acp/src/mcp-server.ts +0 -911
- package/references/claude-code-acp/src/settings.ts +0 -522
- package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
- package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
- package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
- package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
- package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
- package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
- package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
- package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
- package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
- package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
- package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
- package/references/claude-code-acp/src/tools.ts +0 -819
- package/references/claude-code-acp/src/utils.ts +0 -171
- package/references/claude-code-acp/tsconfig.json +0 -18
- package/references/claude-code-acp/vitest.config.ts +0 -19
- package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
- package/references/multi-agent-protocol/LICENSE +0 -21
- package/references/multi-agent-protocol/README.md +0 -113
- package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
- package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
- package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
- package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
- package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
- package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
- package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
- package/references/multi-agent-protocol/docs/07-federation.md +0 -259
- package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
- package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
- package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
- package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
- package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
- package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
- package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
- package/references/multi-agent-protocol/docs-site/README.md +0 -82
- package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
- package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
- package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
- package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
- package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
- package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
- package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
- package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
- package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
- package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
- package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
- package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
- package/references/multi-agent-protocol/docs-site/index.md +0 -136
- package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
- package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
- package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
- package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
- package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
- package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
- package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
- package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
- package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
- package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
- package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
- package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
- package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
- package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
- package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
- package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
- package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
- package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
- package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
- package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
- package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
- package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
- package/references/multi-agent-protocol/package-lock.json +0 -3886
- package/references/multi-agent-protocol/package.json +0 -56
- package/references/multi-agent-protocol/schema/meta.json +0 -467
- package/references/multi-agent-protocol/schema/schema.json +0 -2558
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +0 -761
- package/src/__tests__/e2e/cascade-termination.e2e.test.ts +0 -588
- package/src/__tests__/e2e/conflict-resolution-flow.e2e.test.ts +0 -790
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +0 -714
- package/src/__tests__/e2e/full-agent-orchestration.e2e.test.ts +0 -536
- package/src/__tests__/e2e/mcp-server-debug.e2e.test.ts +0 -372
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +0 -304
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +0 -324
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +0 -1527
- package/src/__tests__/e2e/multi-coordinator.e2e.test.ts +0 -602
- package/src/__tests__/e2e/orchestration-flow.e2e.test.ts +0 -686
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +0 -563
- package/src/__tests__/e2e/steering-task.e2e.test.ts +0 -840
- package/src/__tests__/integration.e2e.test.ts +0 -407
- package/src/acp/__tests__/combined-websocket-server.test.ts +0 -260
- package/src/acp/__tests__/history.test.ts +0 -530
- package/src/acp/__tests__/integration.test.ts +0 -1049
- package/src/acp/__tests__/multi-client-mounting.test.ts +0 -303
- package/src/acp/__tests__/session-persistence.test.ts +0 -276
- package/src/acp/__tests__/websocket-full.e2e.test.ts +0 -401
- package/src/acp/__tests__/websocket-integration.test.ts +0 -484
- package/src/acp/__tests__/websocket-stream.test.ts +0 -281
- package/src/acp/__tests__/websocket.e2e.test.ts +0 -390
- package/src/acp/websocket-stream.ts +0 -140
- package/src/activity/__tests__/deduplication.test.ts +0 -345
- package/src/activity/__tests__/relevance.test.ts +0 -347
- package/src/activity/__tests__/watcher.test.ts +0 -344
- package/src/activity/deduplication.ts +0 -219
- package/src/activity/index.ts +0 -51
- package/src/activity/relevance.ts +0 -258
- package/src/activity/types.ts +0 -263
- package/src/activity/watcher.ts +0 -345
- package/src/agent/__tests__/agent-manager.test.ts +0 -1382
- package/src/agent/__tests__/wake.test.ts +0 -768
- package/src/agent/wake.ts +0 -357
- package/src/api/__tests__/conversation-api.test.ts +0 -468
- package/src/cli/__tests__/acp.test.ts +0 -214
- package/src/lifecycle/__tests__/cascade-termination.test.ts +0 -919
- package/src/lifecycle/__tests__/cascade.test.ts +0 -595
- package/src/lifecycle/__tests__/cleanup.test.ts +0 -322
- package/src/lifecycle/__tests__/handlers.test.ts +0 -1826
- package/src/lifecycle/__tests__/lifecycle.e2e.test.ts +0 -354
- package/src/lifecycle/__tests__/merge-queue.e2e.test.ts +0 -602
- package/src/lifecycle/handlers/generic.ts +0 -87
- package/src/lifecycle/handlers/index.ts +0 -166
- package/src/lifecycle/handlers/integrator.ts +0 -672
- package/src/lifecycle/handlers/monitor.ts +0 -114
- package/src/lifecycle/handlers/worker.ts +0 -506
- package/src/mail/__tests__/conversation-lifecycle.test.ts +0 -409
- package/src/mail/__tests__/eventstore-stores.test.ts +0 -1073
- package/src/mail/__tests__/mail-full-agent.e2e.test.ts +0 -575
- package/src/mail/__tests__/mail-integration.test.ts +0 -759
- package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +0 -1068
- package/src/mail/__tests__/mail-service.test.ts +0 -506
- package/src/mail/__tests__/turn-recorder.test.ts +0 -328
- package/src/mail/conversation-map.ts +0 -107
- package/src/mail/index.ts +0 -25
- package/src/mail/mail-service.ts +0 -257
- package/src/mail/stores/eventstore-conversation-store.ts +0 -146
- package/src/mail/stores/eventstore-participant-store.ts +0 -172
- package/src/mail/stores/eventstore-thread-store.ts +0 -129
- package/src/mail/stores/eventstore-turn-store.ts +0 -173
- package/src/mail/stores/index.ts +0 -12
- package/src/mail/stores/types.ts +0 -160
- package/src/mail/turn-recorder.ts +0 -124
- package/src/map/README.md +0 -79
- package/src/map/__tests__/adapter-types.test.ts +0 -326
- package/src/map/__tests__/interface-types.test.ts +0 -342
- package/src/map/__tests__/types.test.ts +0 -411
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +0 -820
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +0 -355
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +0 -1386
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +0 -440
- package/src/map/adapter/__tests__/connection-manager.test.ts +0 -344
- package/src/map/adapter/__tests__/event-broadcast.test.ts +0 -420
- package/src/map/adapter/__tests__/event-log.test.ts +0 -527
- package/src/map/adapter/__tests__/event-translator.test.ts +0 -550
- package/src/map/adapter/__tests__/extensions.test.ts +0 -1387
- package/src/map/adapter/__tests__/map-adapter.test.ts +0 -926
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +0 -1187
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +0 -711
- package/src/map/adapter/__tests__/rpc-handler.test.ts +0 -644
- package/src/map/adapter/__tests__/subscription-manager.test.ts +0 -536
- package/src/map/adapter/__tests__/websocket-integration.test.ts +0 -487
- package/src/map/adapter/__tests__/workspace-files.test.ts +0 -673
- package/src/map/adapter/acp-over-map.ts +0 -1483
- package/src/map/adapter/connection-manager.ts +0 -400
- package/src/map/adapter/event-log.ts +0 -208
- package/src/map/adapter/event-translator.ts +0 -415
- package/src/map/adapter/extensions/agent-detection.ts +0 -201
- package/src/map/adapter/extensions/agent-lifecycle.ts +0 -267
- package/src/map/adapter/extensions/index.ts +0 -280
- package/src/map/adapter/extensions/mcp-bridge.ts +0 -995
- package/src/map/adapter/extensions/resume.ts +0 -114
- package/src/map/adapter/extensions/task.ts +0 -326
- package/src/map/adapter/extensions/update-metadata.ts +0 -126
- package/src/map/adapter/extensions/wake.ts +0 -239
- package/src/map/adapter/extensions/workspace-files.ts +0 -449
- package/src/map/adapter/extensions/workspace.ts +0 -176
- package/src/map/adapter/index.ts +0 -158
- package/src/map/adapter/interface.ts +0 -581
- package/src/map/adapter/mail-handler-adapter.ts +0 -429
- package/src/map/adapter/map-adapter.ts +0 -1749
- package/src/map/adapter/rpc-handler.ts +0 -604
- package/src/map/adapter/subscription-manager.ts +0 -474
- package/src/map/adapter/types.ts +0 -259
- package/src/map/adapter/websocket-integration.ts +0 -229
- package/src/map/federation/__tests__/envelope.test.ts +0 -362
- package/src/map/federation/__tests__/federation-handler.test.ts +0 -461
- package/src/map/federation/envelope.ts +0 -243
- package/src/map/federation/federation-handler.ts +0 -442
- package/src/map/federation/index.ts +0 -65
- package/src/map/federation/types.ts +0 -344
- package/src/mcp/__tests__/map-client.test.ts +0 -386
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +0 -368
- package/src/mcp/__tests__/mcp-server.test.ts +0 -1002
- package/src/mcp/map-client.ts +0 -177
- package/src/mcp/mcp-server.ts +0 -1395
- package/src/mcp/tools/__tests__/done.test.ts +0 -484
- package/src/mcp/tools/claim_task.ts +0 -86
- package/src/mcp/tools/done.ts +0 -338
- package/src/mcp/tools/inject_context.ts +0 -173
- package/src/mcp/tools/list_claimable_tasks.ts +0 -93
- package/src/mcp/tools/unclaim_task.ts +0 -71
- package/src/mcp/tools/wait_for_activity.ts +0 -185
- package/src/monitor/__tests__/health-check-service.test.ts +0 -425
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +0 -393
- package/src/monitor/__tests__/stall-detector.test.ts +0 -395
- package/src/monitor/health-check-service.ts +0 -359
- package/src/monitor/index.ts +0 -28
- package/src/monitor/stall-detector.ts +0 -238
- package/src/peer/__tests__/capability-manager.test.ts +0 -454
- package/src/peer/__tests__/encapsulation-manager.test.ts +0 -787
- package/src/peer/__tests__/federation-manager.test.ts +0 -828
- package/src/peer/__tests__/hierarchy-errors.test.ts +0 -307
- package/src/peer/__tests__/peer-manager.test.ts +0 -535
- package/src/peer/__tests__/task-delegation.test.ts +0 -741
- package/src/peer/capability-manager.ts +0 -289
- package/src/peer/encapsulation-manager.ts +0 -831
- package/src/peer/federation-manager.ts +0 -897
- package/src/peer/hierarchy-errors.ts +0 -382
- package/src/peer/hierarchy-protocol.ts +0 -328
- package/src/peer/index.ts +0 -15
- package/src/peer/peer-manager.ts +0 -540
- package/src/peer/task-delegation.ts +0 -594
- package/src/peer/transports/__tests__/local-transport.test.ts +0 -355
- package/src/peer/transports/__tests__/websocket-transport.test.ts +0 -270
- package/src/peer/transports/index.ts +0 -18
- package/src/peer/transports/local-transport.ts +0 -348
- package/src/peer/transports/websocket-transport.ts +0 -452
- package/src/peer/types.ts +0 -331
- package/src/roles/__tests__/capability-enforcement.test.ts +0 -989
- package/src/roles/__tests__/message-routing.e2e.test.ts +0 -464
- package/src/roles/__tests__/role-resolution.test.ts +0 -576
- package/src/router/README.md +0 -120
- package/src/router/__tests__/address-resolver.test.ts +0 -340
- package/src/router/__tests__/broadcast.test.ts +0 -185
- package/src/router/__tests__/message-router.test.ts +0 -1070
- package/src/router/__tests__/role-channel.test.ts +0 -213
- package/src/router/__tests__/send-to-address.test.ts +0 -731
- package/src/router/__tests__/wake.test.ts +0 -459
- package/src/router/address-resolver.ts +0 -303
- package/src/router/broadcast.ts +0 -117
- package/src/router/channels.ts +0 -283
- package/src/router/index.ts +0 -148
- package/src/router/message-router.ts +0 -1392
- package/src/router/message-types.ts +0 -294
- package/src/router/role-resolver.ts +0 -164
- package/src/router/signals.ts +0 -335
- package/src/router/types.ts +0 -306
- package/src/router/wake.ts +0 -270
- package/src/server/__tests__/combined-server.test.ts +0 -360
- package/src/server/combined-server.ts +0 -530
- package/src/steering/__tests__/inject.test.ts +0 -405
- package/src/steering/__tests__/injection.e2e.test.ts +0 -932
- package/src/steering/__tests__/steering-integration.test.ts +0 -747
- package/src/steering/index.ts +0 -25
- package/src/steering/inject.ts +0 -262
- package/src/steering/types.ts +0 -143
- package/src/store/README.md +0 -134
- package/src/store/__tests__/event-store.test.ts +0 -1446
- package/src/store/__tests__/instance.test.ts +0 -556
- package/src/store/__tests__/migrations.test.ts +0 -109
- package/src/store/backends/__tests__/memory-backend.test.ts +0 -383
- package/src/store/backends/__tests__/sqlite-backend.test.ts +0 -427
- package/src/store/backends/index.ts +0 -42
- package/src/store/backends/json-backend.ts +0 -295
- package/src/store/backends/memory-backend.ts +0 -256
- package/src/store/backends/sqlite-backend.ts +0 -337
- package/src/store/backends/tinybase-backend.ts +0 -276
- package/src/store/backends/types.ts +0 -252
- package/src/store/event-store.ts +0 -2204
- package/src/store/instance.ts +0 -681
- package/src/store/migrations.ts +0 -96
- package/src/store/types/config.ts +0 -19
- package/src/store/types/conversations.ts +0 -129
- package/src/store/types/sessions.ts +0 -53
- package/src/task/__tests__/retry-policy.test.ts +0 -409
- package/src/task/__tests__/task-integration.test.ts +0 -457
- package/src/task/__tests__/task-manager.test.ts +0 -815
- package/src/task/backend/__tests__/create-task-backend.test.ts +0 -225
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +0 -524
- package/src/task/backend/__tests__/memory.test.ts +0 -1274
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +0 -579
- package/src/task/backend/index.ts +0 -310
- package/src/task/backend/memory.ts +0 -828
- package/src/task/backend/opentasks/__tests__/backend.test.ts +0 -968
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +0 -406
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +0 -84
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +0 -1338
- package/src/task/backend/opentasks/backend.ts +0 -1323
- package/src/task/backend/opentasks/client.ts +0 -652
- package/src/task/backend/opentasks/daemon-manager.ts +0 -253
- package/src/task/backend/opentasks/index.ts +0 -69
- package/src/task/backend/opentasks/mapping.ts +0 -94
- package/src/task/backend/types.ts +0 -458
- package/src/task/backend/unified-tool-provider.ts +0 -779
- package/src/task/index.ts +0 -7
- package/src/task/retry-policy.ts +0 -204
- package/src/task/task-manager.ts +0 -515
- package/src/task/types.ts +0 -136
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +0 -983
- package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +0 -553
- package/src/teams/__tests__/team-system.test.ts +0 -1280
- package/src/teams/team-runtime.ts +0 -729
- package/src/trigger/CLAUDE.md +0 -308
- package/src/trigger/README.md +0 -429
- package/src/trigger/__tests__/macro-agent-regression.test.ts +0 -946
- package/src/trigger/__tests__/routing-strategies.test.ts +0 -329
- package/src/trigger/__tests__/trigger-router.test.ts +0 -433
- package/src/trigger/__tests__/trigger-system-integration.test.ts +0 -581
- package/src/trigger/router/index.ts +0 -36
- package/src/trigger/router/strategies/ai-router-strategy.ts +0 -481
- package/src/trigger/router/strategies/direct-strategy.ts +0 -162
- package/src/trigger/router/strategies/index.ts +0 -26
- package/src/trigger/router/strategies/role-strategy.ts +0 -274
- package/src/trigger/router/trigger-router.ts +0 -463
- package/src/trigger/router/types.ts +0 -273
- package/src/trigger/trigger-system.ts +0 -206
- package/src/workspace/__tests__/multi-coordinator.test.ts +0 -1005
- package/src/workspace/__tests__/workspace-manager.test.ts +0 -391
- package/src/workspace/__tests__/workspace.e2e.test.ts +0 -1155
- package/src/workspace/merge-queue/__tests__/hierarchical-consolidation.e2e.test.ts +0 -414
- package/test_fixtures/harness/__tests__/behavior-executor-and-stepper.test.ts +0 -714
- package/test_fixtures/harness/__tests__/fixtures.test.ts +0 -347
- package/test_fixtures/harness/__tests__/merge-queue-and-worktrees.test.ts +0 -452
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -422
- package/test_fixtures/harness/__tests__/test-harness-and-assertions.test.ts +0 -568
- /package/{references/acp-factory-ref/python/tests/__init__.py → .opentasks/graph.jsonl} +0 -0
|
@@ -1,1338 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E Tests for OpenTasksTaskBackend
|
|
3
|
-
*
|
|
4
|
-
* Exercises the OpenTasksTaskBackend directly against a real OpenTasks daemon.
|
|
5
|
-
* Validates bidirectional ID mapping, status sync, graph-based blocking,
|
|
6
|
-
* pull model (claim/unclaim), import, subtask hierarchy, and event subscriptions.
|
|
7
|
-
*
|
|
8
|
-
* Requires: opentasks package installed
|
|
9
|
-
*
|
|
10
|
-
* @module task/backend/opentasks/__tests__/opentasks-backend.e2e.test
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
|
|
14
|
-
import * as fs from "fs";
|
|
15
|
-
import * as path from "path";
|
|
16
|
-
import * as os from "os";
|
|
17
|
-
import {
|
|
18
|
-
createEventStore,
|
|
19
|
-
type EventStore,
|
|
20
|
-
} from "../../../../store/event-store.js";
|
|
21
|
-
import {
|
|
22
|
-
OpenTasksTaskBackend,
|
|
23
|
-
createOpenTasksTaskBackend,
|
|
24
|
-
OpenTasksBackendError,
|
|
25
|
-
} from "../backend.js";
|
|
26
|
-
import { IPCOpenTasksClient } from "../client.js";
|
|
27
|
-
import type { OpenTasksClient } from "../client.js";
|
|
28
|
-
import type { TaskChangeEvent } from "../../types.js";
|
|
29
|
-
|
|
30
|
-
// =============================================================================
|
|
31
|
-
// Helpers
|
|
32
|
-
// =============================================================================
|
|
33
|
-
|
|
34
|
-
const TEST_AGENT = "agent_e2e_test";
|
|
35
|
-
const WORKER_1 = "agent_worker_1";
|
|
36
|
-
const WORKER_2 = "agent_worker_2";
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Wait for a condition to become true with timeout.
|
|
40
|
-
*/
|
|
41
|
-
async function waitFor(
|
|
42
|
-
condition: () => boolean | Promise<boolean>,
|
|
43
|
-
timeoutMs = 5000,
|
|
44
|
-
intervalMs = 50
|
|
45
|
-
): Promise<void> {
|
|
46
|
-
const start = Date.now();
|
|
47
|
-
while (Date.now() - start < timeoutMs) {
|
|
48
|
-
if (await condition()) return;
|
|
49
|
-
await new Promise((r) => setTimeout(r, intervalMs));
|
|
50
|
-
}
|
|
51
|
-
throw new Error(`waitFor timed out after ${timeoutMs}ms`);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// =============================================================================
|
|
55
|
-
// Test Suite
|
|
56
|
-
// =============================================================================
|
|
57
|
-
|
|
58
|
-
describe("OpenTasksTaskBackend E2E", () => {
|
|
59
|
-
let tempDir: string;
|
|
60
|
-
let daemon: any;
|
|
61
|
-
let socketPath: string;
|
|
62
|
-
let eventStore: EventStore;
|
|
63
|
-
let client: IPCOpenTasksClient;
|
|
64
|
-
let backend: OpenTasksTaskBackend;
|
|
65
|
-
|
|
66
|
-
beforeAll(async () => {
|
|
67
|
-
// Create temp directory for opentasks data
|
|
68
|
-
tempDir = fs.mkdtempSync(
|
|
69
|
-
path.join(os.tmpdir(), "macro-e2e-opentasks-backend-")
|
|
70
|
-
);
|
|
71
|
-
const locationPath = path.join(tempDir, ".opentasks");
|
|
72
|
-
fs.mkdirSync(locationPath, { recursive: true });
|
|
73
|
-
|
|
74
|
-
const registryPath = path.join(tempDir, "registry.json");
|
|
75
|
-
|
|
76
|
-
// Start a real opentasks daemon
|
|
77
|
-
const opentasks = await import("opentasks");
|
|
78
|
-
daemon = await opentasks.createDaemonWithStore({
|
|
79
|
-
locationPath,
|
|
80
|
-
version: "0.0.3",
|
|
81
|
-
registryPath,
|
|
82
|
-
shutdownTimeoutMs: 2000,
|
|
83
|
-
});
|
|
84
|
-
await daemon.start();
|
|
85
|
-
socketPath = daemon.socketPath;
|
|
86
|
-
|
|
87
|
-
// Create client
|
|
88
|
-
client = new IPCOpenTasksClient({
|
|
89
|
-
socketPath,
|
|
90
|
-
autoConnect: true,
|
|
91
|
-
timeout: 10000,
|
|
92
|
-
});
|
|
93
|
-
await client.connect();
|
|
94
|
-
}, 30000);
|
|
95
|
-
|
|
96
|
-
afterAll(async () => {
|
|
97
|
-
try {
|
|
98
|
-
client?.disconnect();
|
|
99
|
-
} catch {
|
|
100
|
-
/* ignore */
|
|
101
|
-
}
|
|
102
|
-
try {
|
|
103
|
-
await daemon?.stop();
|
|
104
|
-
} catch {
|
|
105
|
-
/* ignore */
|
|
106
|
-
}
|
|
107
|
-
try {
|
|
108
|
-
if (tempDir) fs.rmSync(tempDir, { recursive: true, force: true });
|
|
109
|
-
} catch {
|
|
110
|
-
/* ignore */
|
|
111
|
-
}
|
|
112
|
-
}, 15000);
|
|
113
|
-
|
|
114
|
-
// Fresh EventStore + backend per test to avoid cross-test pollution
|
|
115
|
-
beforeEach(async () => {
|
|
116
|
-
if (eventStore) {
|
|
117
|
-
try {
|
|
118
|
-
await eventStore.close();
|
|
119
|
-
} catch {
|
|
120
|
-
/* ignore */
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
eventStore = await createEventStore({ inMemory: true });
|
|
124
|
-
backend = createOpenTasksTaskBackend(eventStore, client, {
|
|
125
|
-
syncStatus: true,
|
|
126
|
-
sourceLabel: "e2e-test",
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
131
|
-
// 1. Lifecycle: Create / Get / Update / Delete
|
|
132
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
133
|
-
|
|
134
|
-
describe("lifecycle", () => {
|
|
135
|
-
it("should create a task backed by a real OpenTasks issue", async () => {
|
|
136
|
-
const task = await backend.create({
|
|
137
|
-
description: "E2E create test",
|
|
138
|
-
created_by: TEST_AGENT,
|
|
139
|
-
tags: ["e2e", "lifecycle"],
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
expect(task.id).toMatch(/^task_/);
|
|
143
|
-
expect(task.description).toBe("E2E create test");
|
|
144
|
-
expect(task.status).toBe("pending");
|
|
145
|
-
expect(task.created_by).toBe(TEST_AGENT);
|
|
146
|
-
expect(task.external_id).toBeDefined();
|
|
147
|
-
|
|
148
|
-
// Verify the issue exists in the real daemon
|
|
149
|
-
const issue = await client.getIssue(task.external_id!);
|
|
150
|
-
expect(issue).not.toBeNull();
|
|
151
|
-
expect(issue!.title).toBe("E2E create test");
|
|
152
|
-
expect(issue!.status).toBe("open");
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it("should retrieve a task by ID", async () => {
|
|
156
|
-
const task = await backend.create({
|
|
157
|
-
description: "E2E get test",
|
|
158
|
-
created_by: TEST_AGENT,
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
const retrieved = await backend.get(task.id);
|
|
162
|
-
expect(retrieved).not.toBeNull();
|
|
163
|
-
expect(retrieved!.id).toBe(task.id);
|
|
164
|
-
expect(retrieved!.description).toBe("E2E get test");
|
|
165
|
-
expect(retrieved!.external_id).toBe(task.external_id);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("should return null for non-existent task", async () => {
|
|
169
|
-
const result = await backend.get("task_nonexistent_xyz");
|
|
170
|
-
expect(result).toBeNull();
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it("should update task outputs", async () => {
|
|
174
|
-
const task = await backend.create({
|
|
175
|
-
description: "E2E update test",
|
|
176
|
-
created_by: TEST_AGENT,
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
const updated = await backend.update(task.id, {
|
|
180
|
-
outputs: { result: "success", files_changed: 5 },
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
expect(updated.outputs).toEqual(
|
|
184
|
-
expect.objectContaining({ result: "success" })
|
|
185
|
-
);
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it("should update task description and sync to daemon", async () => {
|
|
189
|
-
const task = await backend.create({
|
|
190
|
-
description: "Original description",
|
|
191
|
-
created_by: TEST_AGENT,
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
await backend.update(task.id, {
|
|
195
|
-
description: "Updated description",
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// Verify the daemon issue was updated
|
|
199
|
-
const issue = await client.getIssue(task.external_id!);
|
|
200
|
-
expect(issue!.title).toBe("Updated description");
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it("should delete a task and its backing issue", async () => {
|
|
204
|
-
const task = await backend.create({
|
|
205
|
-
description: "E2E delete test",
|
|
206
|
-
created_by: TEST_AGENT,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
const issueId = task.external_id!;
|
|
210
|
-
await backend.delete(task.id);
|
|
211
|
-
|
|
212
|
-
// Mapping should be cleared
|
|
213
|
-
expect(backend.getIssueForTask(task.id)).toBeUndefined();
|
|
214
|
-
expect(backend.getTaskForIssue(issueId)).toBeUndefined();
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
219
|
-
// 2. Status Transitions with Daemon Sync
|
|
220
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
221
|
-
|
|
222
|
-
describe("status transitions", () => {
|
|
223
|
-
it("should assign a task and sync assignee to daemon", async () => {
|
|
224
|
-
const task = await backend.create({
|
|
225
|
-
description: "E2E assign test",
|
|
226
|
-
created_by: TEST_AGENT,
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
await backend.assign(task.id, WORKER_1);
|
|
230
|
-
|
|
231
|
-
const updated = await backend.get(task.id);
|
|
232
|
-
expect(updated!.status).toBe("assigned");
|
|
233
|
-
expect(updated!.assigned_agent).toBe(WORKER_1);
|
|
234
|
-
|
|
235
|
-
// Verify daemon issue was updated (assignee synced)
|
|
236
|
-
const issue = await client.getIssue(task.external_id!);
|
|
237
|
-
expect(issue).not.toBeNull();
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
it("should unassign a task and clear assignee in daemon", async () => {
|
|
241
|
-
const task = await backend.create({
|
|
242
|
-
description: "E2E unassign test",
|
|
243
|
-
created_by: TEST_AGENT,
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
await backend.assign(task.id, WORKER_1);
|
|
247
|
-
await backend.unassign(task.id);
|
|
248
|
-
|
|
249
|
-
const updated = await backend.get(task.id);
|
|
250
|
-
expect(updated!.assigned_agent).toBeUndefined();
|
|
251
|
-
|
|
252
|
-
// Daemon issue should still exist
|
|
253
|
-
const issue = await client.getIssue(task.external_id!);
|
|
254
|
-
expect(issue).not.toBeNull();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
it("should throw when unassigning a non-assigned task", async () => {
|
|
258
|
-
const task = await backend.create({
|
|
259
|
-
description: "Not assigned",
|
|
260
|
-
created_by: TEST_AGENT,
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
await expect(backend.unassign(task.id)).rejects.toThrow(
|
|
264
|
-
OpenTasksBackendError
|
|
265
|
-
);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it("should start a task and sync in_progress to daemon", async () => {
|
|
269
|
-
const task = await backend.create({
|
|
270
|
-
description: "E2E start test",
|
|
271
|
-
created_by: TEST_AGENT,
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
await backend.start(task.id);
|
|
275
|
-
|
|
276
|
-
const updated = await backend.get(task.id);
|
|
277
|
-
expect(updated!.status).toBe("in_progress");
|
|
278
|
-
|
|
279
|
-
// Daemon should reflect in_progress
|
|
280
|
-
const issue = await client.getIssue(task.external_id!);
|
|
281
|
-
expect(issue!.status).toBe("in_progress");
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it("should complete a task with outputs and close in daemon", async () => {
|
|
285
|
-
const task = await backend.create({
|
|
286
|
-
description: "E2E complete test",
|
|
287
|
-
created_by: TEST_AGENT,
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
await backend.start(task.id);
|
|
291
|
-
await backend.complete(task.id, {
|
|
292
|
-
summary: "All done",
|
|
293
|
-
data: { lines_changed: 42 },
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
const updated = await backend.get(task.id);
|
|
297
|
-
expect(updated!.status).toBe("completed");
|
|
298
|
-
expect(updated!.outputs).toEqual(
|
|
299
|
-
expect.objectContaining({ summary: "All done", lines_changed: 42 })
|
|
300
|
-
);
|
|
301
|
-
|
|
302
|
-
// Daemon issue should be closed
|
|
303
|
-
const issue = await client.getIssue(task.external_id!);
|
|
304
|
-
expect(issue!.status).toBe("closed");
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it("should fail a task and close in daemon with error metadata", async () => {
|
|
308
|
-
const task = await backend.create({
|
|
309
|
-
description: "E2E fail test",
|
|
310
|
-
created_by: TEST_AGENT,
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
await backend.start(task.id);
|
|
314
|
-
await backend.fail(task.id, {
|
|
315
|
-
message: "Compilation failed",
|
|
316
|
-
code: "COMPILE_ERROR",
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
const updated = await backend.get(task.id);
|
|
320
|
-
expect(updated!.status).toBe("failed");
|
|
321
|
-
|
|
322
|
-
// Daemon issue should be closed
|
|
323
|
-
const issue = await client.getIssue(task.external_id!);
|
|
324
|
-
expect(issue!.status).toBe("closed");
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
it("should reject invalid status transitions", async () => {
|
|
328
|
-
const task = await backend.create({
|
|
329
|
-
description: "E2E invalid transition test",
|
|
330
|
-
created_by: TEST_AGENT,
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
await backend.start(task.id);
|
|
334
|
-
await backend.complete(task.id);
|
|
335
|
-
|
|
336
|
-
// completed → in_progress is invalid
|
|
337
|
-
await expect(backend.start(task.id)).rejects.toThrow(
|
|
338
|
-
OpenTasksBackendError
|
|
339
|
-
);
|
|
340
|
-
|
|
341
|
-
// completed → completed is invalid
|
|
342
|
-
await expect(backend.complete(task.id)).rejects.toThrow(
|
|
343
|
-
OpenTasksBackendError
|
|
344
|
-
);
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
it("should allow failed → pending recovery", async () => {
|
|
348
|
-
const task = await backend.create({
|
|
349
|
-
description: "E2E recovery test",
|
|
350
|
-
created_by: TEST_AGENT,
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
await backend.start(task.id);
|
|
354
|
-
await backend.fail(task.id, { message: "first attempt failed" });
|
|
355
|
-
|
|
356
|
-
// Retry: failed → pending is valid
|
|
357
|
-
await backend.update(task.id, { status: "pending" });
|
|
358
|
-
|
|
359
|
-
const updated = await backend.get(task.id);
|
|
360
|
-
expect(updated!.status).toBe("pending");
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
it("should track full lifecycle: pending → assigned → in_progress → completed", async () => {
|
|
364
|
-
const task = await backend.create({
|
|
365
|
-
description: "E2E full lifecycle test",
|
|
366
|
-
created_by: TEST_AGENT,
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
expect((await backend.get(task.id))!.status).toBe("pending");
|
|
370
|
-
|
|
371
|
-
await backend.assign(task.id, WORKER_1);
|
|
372
|
-
expect((await backend.get(task.id))!.status).toBe("assigned");
|
|
373
|
-
|
|
374
|
-
await backend.start(task.id);
|
|
375
|
-
expect((await backend.get(task.id))!.status).toBe("in_progress");
|
|
376
|
-
|
|
377
|
-
await backend.complete(task.id, { summary: "Done!" });
|
|
378
|
-
expect((await backend.get(task.id))!.status).toBe("completed");
|
|
379
|
-
});
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
383
|
-
// 3. Bidirectional ID Mapping
|
|
384
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
385
|
-
|
|
386
|
-
describe("bidirectional ID mapping", () => {
|
|
387
|
-
it("should maintain consistent task ↔ issue mapping", async () => {
|
|
388
|
-
const task = await backend.create({
|
|
389
|
-
description: "ID mapping test",
|
|
390
|
-
created_by: TEST_AGENT,
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
const issueId = backend.getIssueForTask(task.id);
|
|
394
|
-
expect(issueId).toBeDefined();
|
|
395
|
-
|
|
396
|
-
const taskId = backend.getTaskForIssue(issueId!);
|
|
397
|
-
expect(taskId).toBe(task.id);
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
it("should clear mapping on delete", async () => {
|
|
401
|
-
const task = await backend.create({
|
|
402
|
-
description: "Mapping delete test",
|
|
403
|
-
created_by: TEST_AGENT,
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
const issueId = task.external_id!;
|
|
407
|
-
await backend.delete(task.id);
|
|
408
|
-
|
|
409
|
-
expect(backend.getIssueForTask(task.id)).toBeUndefined();
|
|
410
|
-
expect(backend.getTaskForIssue(issueId)).toBeUndefined();
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
it("should include external_id on created tasks", async () => {
|
|
414
|
-
const task = await backend.create({
|
|
415
|
-
description: "External ID test",
|
|
416
|
-
created_by: TEST_AGENT,
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
// external_id should be set on the task
|
|
420
|
-
expect(task.external_id).toBeDefined();
|
|
421
|
-
expect(task.external_id).toMatch(/^[a-z0-9-]+$/i);
|
|
422
|
-
|
|
423
|
-
// The issue should be retrievable from the daemon
|
|
424
|
-
const issue = await client.getIssue(task.external_id!);
|
|
425
|
-
expect(issue).not.toBeNull();
|
|
426
|
-
expect(issue!.title).toBe("External ID test");
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
431
|
-
// 4. Dependencies (Graph-based Blocking)
|
|
432
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
433
|
-
|
|
434
|
-
describe("dependencies via graph edges", () => {
|
|
435
|
-
it("should create blocking relationships in daemon graph", async () => {
|
|
436
|
-
const blocker = await backend.create({
|
|
437
|
-
description: "E2E blocker task",
|
|
438
|
-
created_by: TEST_AGENT,
|
|
439
|
-
});
|
|
440
|
-
const blocked = await backend.create({
|
|
441
|
-
description: "E2E blocked task",
|
|
442
|
-
created_by: TEST_AGENT,
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
446
|
-
|
|
447
|
-
// Verify via backend API
|
|
448
|
-
const blockedTask = await backend.get(blocked.id);
|
|
449
|
-
expect(blockedTask!.isBlocked).toBe(true);
|
|
450
|
-
|
|
451
|
-
// Verify blocker is returned
|
|
452
|
-
const blockers = await backend.getBlockers(blocked.id);
|
|
453
|
-
expect(blockers).toHaveLength(1);
|
|
454
|
-
expect(blockers[0].id).toBe(blocker.id);
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
it("should return tasks blocked by a given task", async () => {
|
|
458
|
-
const blocker = await backend.create({
|
|
459
|
-
description: "Blocker",
|
|
460
|
-
created_by: TEST_AGENT,
|
|
461
|
-
});
|
|
462
|
-
const blocked1 = await backend.create({
|
|
463
|
-
description: "Blocked 1",
|
|
464
|
-
created_by: TEST_AGENT,
|
|
465
|
-
});
|
|
466
|
-
const blocked2 = await backend.create({
|
|
467
|
-
description: "Blocked 2",
|
|
468
|
-
created_by: TEST_AGENT,
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
await backend.addBlocker(blocked1.id, blocker.id);
|
|
472
|
-
await backend.addBlocker(blocked2.id, blocker.id);
|
|
473
|
-
|
|
474
|
-
const blocking = await backend.getBlocking(blocker.id);
|
|
475
|
-
expect(blocking).toHaveLength(2);
|
|
476
|
-
const blockingIds = blocking.map((t) => t.id);
|
|
477
|
-
expect(blockingIds).toContain(blocked1.id);
|
|
478
|
-
expect(blockingIds).toContain(blocked2.id);
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
it("should remove blocking relationships", async () => {
|
|
482
|
-
const blocker = await backend.create({
|
|
483
|
-
description: "Removable blocker",
|
|
484
|
-
created_by: TEST_AGENT,
|
|
485
|
-
});
|
|
486
|
-
const blocked = await backend.create({
|
|
487
|
-
description: "Will be unblocked",
|
|
488
|
-
created_by: TEST_AGENT,
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
492
|
-
expect((await backend.get(blocked.id))!.isBlocked).toBe(true);
|
|
493
|
-
|
|
494
|
-
await backend.removeBlocker(blocked.id, blocker.id);
|
|
495
|
-
|
|
496
|
-
// isBlocked should update via async graph query
|
|
497
|
-
const updatedBlocked = await backend.list({
|
|
498
|
-
includeBlocked: true,
|
|
499
|
-
});
|
|
500
|
-
const task = updatedBlocked.find((t) => t.id === blocked.id);
|
|
501
|
-
expect(task!.isBlocked).toBe(false);
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
it("should unblock when blocker is completed", async () => {
|
|
505
|
-
const blocker = await backend.create({
|
|
506
|
-
description: "Completes to unblock",
|
|
507
|
-
created_by: TEST_AGENT,
|
|
508
|
-
});
|
|
509
|
-
const blocked = await backend.create({
|
|
510
|
-
description: "Waiting for blocker",
|
|
511
|
-
created_by: TEST_AGENT,
|
|
512
|
-
});
|
|
513
|
-
|
|
514
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
515
|
-
|
|
516
|
-
// Blocked task should be blocked
|
|
517
|
-
const blockedBefore = await backend.list({ includeBlocked: true });
|
|
518
|
-
expect(blockedBefore.find((t) => t.id === blocked.id)!.isBlocked).toBe(
|
|
519
|
-
true
|
|
520
|
-
);
|
|
521
|
-
|
|
522
|
-
// Complete the blocker
|
|
523
|
-
await backend.start(blocker.id);
|
|
524
|
-
await backend.complete(blocker.id);
|
|
525
|
-
|
|
526
|
-
// After completing blocker, blocked task should be unblocked
|
|
527
|
-
// (the daemon graph edge still exists, but the blocker is closed)
|
|
528
|
-
const all = await backend.list({ includeBlocked: true });
|
|
529
|
-
const blockedAfter = all.find((t) => t.id === blocked.id);
|
|
530
|
-
expect(blockedAfter!.isBlocked).toBe(false);
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
it("should handle chain dependencies: A blocks B blocks C", async () => {
|
|
534
|
-
const a = await backend.create({
|
|
535
|
-
description: "Chain A",
|
|
536
|
-
created_by: TEST_AGENT,
|
|
537
|
-
});
|
|
538
|
-
const b = await backend.create({
|
|
539
|
-
description: "Chain B",
|
|
540
|
-
created_by: TEST_AGENT,
|
|
541
|
-
});
|
|
542
|
-
const c = await backend.create({
|
|
543
|
-
description: "Chain C",
|
|
544
|
-
created_by: TEST_AGENT,
|
|
545
|
-
});
|
|
546
|
-
|
|
547
|
-
await backend.addBlocker(b.id, a.id);
|
|
548
|
-
await backend.addBlocker(c.id, b.id);
|
|
549
|
-
|
|
550
|
-
// B is blocked by A, C is blocked by B
|
|
551
|
-
const allTasks = await backend.list({ includeBlocked: true });
|
|
552
|
-
expect(allTasks.find((t) => t.id === a.id)!.isBlocked).toBe(false);
|
|
553
|
-
expect(allTasks.find((t) => t.id === b.id)!.isBlocked).toBe(true);
|
|
554
|
-
expect(allTasks.find((t) => t.id === c.id)!.isBlocked).toBe(true);
|
|
555
|
-
|
|
556
|
-
// Complete A → B unblocks but C stays blocked by B
|
|
557
|
-
await backend.start(a.id);
|
|
558
|
-
await backend.complete(a.id);
|
|
559
|
-
|
|
560
|
-
const afterA = await backend.list({ includeBlocked: true });
|
|
561
|
-
expect(afterA.find((t) => t.id === b.id)!.isBlocked).toBe(false);
|
|
562
|
-
expect(afterA.find((t) => t.id === c.id)!.isBlocked).toBe(true);
|
|
563
|
-
|
|
564
|
-
// Complete B → C unblocks
|
|
565
|
-
await backend.start(b.id);
|
|
566
|
-
await backend.complete(b.id);
|
|
567
|
-
|
|
568
|
-
const afterB = await backend.list({ includeBlocked: true });
|
|
569
|
-
expect(afterB.find((t) => t.id === c.id)!.isBlocked).toBe(false);
|
|
570
|
-
});
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
574
|
-
// 5. Queries
|
|
575
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
576
|
-
|
|
577
|
-
describe("queries", () => {
|
|
578
|
-
it("should list all tasks excluding blocked by default", async () => {
|
|
579
|
-
const blocker = await backend.create({
|
|
580
|
-
description: "Query blocker",
|
|
581
|
-
created_by: TEST_AGENT,
|
|
582
|
-
});
|
|
583
|
-
const blocked = await backend.create({
|
|
584
|
-
description: "Query blocked",
|
|
585
|
-
created_by: TEST_AGENT,
|
|
586
|
-
});
|
|
587
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
588
|
-
|
|
589
|
-
const tasks = await backend.list();
|
|
590
|
-
expect(tasks).toHaveLength(1);
|
|
591
|
-
expect(tasks[0].id).toBe(blocker.id);
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
it("should include blocked tasks when requested", async () => {
|
|
595
|
-
const blocker = await backend.create({
|
|
596
|
-
description: "Query blocker 2",
|
|
597
|
-
created_by: TEST_AGENT,
|
|
598
|
-
});
|
|
599
|
-
const blocked = await backend.create({
|
|
600
|
-
description: "Query blocked 2",
|
|
601
|
-
created_by: TEST_AGENT,
|
|
602
|
-
});
|
|
603
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
604
|
-
|
|
605
|
-
const tasks = await backend.list({ includeBlocked: true });
|
|
606
|
-
expect(tasks).toHaveLength(2);
|
|
607
|
-
});
|
|
608
|
-
|
|
609
|
-
it("should filter by status", async () => {
|
|
610
|
-
const t1 = await backend.create({
|
|
611
|
-
description: "Pending task",
|
|
612
|
-
created_by: TEST_AGENT,
|
|
613
|
-
});
|
|
614
|
-
const t2 = await backend.create({
|
|
615
|
-
description: "Started task",
|
|
616
|
-
created_by: TEST_AGENT,
|
|
617
|
-
});
|
|
618
|
-
await backend.start(t2.id);
|
|
619
|
-
|
|
620
|
-
const inProgress = await backend.list({ status: "in_progress" });
|
|
621
|
-
expect(inProgress).toHaveLength(1);
|
|
622
|
-
expect(inProgress[0].id).toBe(t2.id);
|
|
623
|
-
});
|
|
624
|
-
|
|
625
|
-
it("should filter by assigned agent", async () => {
|
|
626
|
-
const t1 = await backend.create({
|
|
627
|
-
description: "Worker 1 task",
|
|
628
|
-
created_by: TEST_AGENT,
|
|
629
|
-
});
|
|
630
|
-
await backend.create({
|
|
631
|
-
description: "Unassigned",
|
|
632
|
-
created_by: TEST_AGENT,
|
|
633
|
-
});
|
|
634
|
-
await backend.assign(t1.id, WORKER_1);
|
|
635
|
-
|
|
636
|
-
const assigned = await backend.list({ assigned_agent: WORKER_1 });
|
|
637
|
-
expect(assigned).toHaveLength(1);
|
|
638
|
-
expect(assigned[0].assigned_agent).toBe(WORKER_1);
|
|
639
|
-
});
|
|
640
|
-
|
|
641
|
-
it("should filter by tags", async () => {
|
|
642
|
-
await backend.create({
|
|
643
|
-
description: "Frontend task",
|
|
644
|
-
created_by: TEST_AGENT,
|
|
645
|
-
tags: ["frontend"],
|
|
646
|
-
});
|
|
647
|
-
await backend.create({
|
|
648
|
-
description: "Backend task",
|
|
649
|
-
created_by: TEST_AGENT,
|
|
650
|
-
tags: ["backend"],
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
const frontendTasks = await backend.list({ tags: ["frontend"] });
|
|
654
|
-
expect(frontendTasks).toHaveLength(1);
|
|
655
|
-
expect(frontendTasks[0].description).toBe("Frontend task");
|
|
656
|
-
});
|
|
657
|
-
|
|
658
|
-
it("should filter by created_by", async () => {
|
|
659
|
-
await backend.create({
|
|
660
|
-
description: "Creator 1 task",
|
|
661
|
-
created_by: WORKER_1,
|
|
662
|
-
});
|
|
663
|
-
await backend.create({
|
|
664
|
-
description: "Creator 2 task",
|
|
665
|
-
created_by: WORKER_2,
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
const worker1Tasks = await backend.list({ created_by: WORKER_1 });
|
|
669
|
-
expect(worker1Tasks).toHaveLength(1);
|
|
670
|
-
expect(worker1Tasks[0].description).toBe("Creator 1 task");
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
it("should filter root tasks only", async () => {
|
|
674
|
-
const parent = await backend.create({
|
|
675
|
-
description: "Root task",
|
|
676
|
-
created_by: TEST_AGENT,
|
|
677
|
-
});
|
|
678
|
-
await backend.create({
|
|
679
|
-
description: "Child task",
|
|
680
|
-
created_by: TEST_AGENT,
|
|
681
|
-
parent_task: parent.id,
|
|
682
|
-
});
|
|
683
|
-
|
|
684
|
-
const rootOnly = await backend.list({ rootTasksOnly: true });
|
|
685
|
-
expect(rootOnly).toHaveLength(1);
|
|
686
|
-
expect(rootOnly[0].id).toBe(parent.id);
|
|
687
|
-
});
|
|
688
|
-
|
|
689
|
-
it("should listReady: only pending/assigned, unblocked tasks", async () => {
|
|
690
|
-
const blocker = await backend.create({
|
|
691
|
-
description: "Ready blocker",
|
|
692
|
-
created_by: TEST_AGENT,
|
|
693
|
-
});
|
|
694
|
-
const blocked = await backend.create({
|
|
695
|
-
description: "Ready blocked",
|
|
696
|
-
created_by: TEST_AGENT,
|
|
697
|
-
});
|
|
698
|
-
const started = await backend.create({
|
|
699
|
-
description: "Already started",
|
|
700
|
-
created_by: TEST_AGENT,
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
704
|
-
await backend.start(started.id);
|
|
705
|
-
|
|
706
|
-
const ready = await backend.listReady();
|
|
707
|
-
expect(ready).toHaveLength(1);
|
|
708
|
-
expect(ready[0].id).toBe(blocker.id);
|
|
709
|
-
});
|
|
710
|
-
});
|
|
711
|
-
|
|
712
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
713
|
-
// 6. Subtask Hierarchy
|
|
714
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
715
|
-
|
|
716
|
-
describe("subtask hierarchy", () => {
|
|
717
|
-
it("should create subtasks linked to parent", async () => {
|
|
718
|
-
const parent = await backend.create({
|
|
719
|
-
description: "Parent task",
|
|
720
|
-
created_by: TEST_AGENT,
|
|
721
|
-
});
|
|
722
|
-
|
|
723
|
-
const child1 = await backend.createSubtask(parent.id, {
|
|
724
|
-
description: "Child 1",
|
|
725
|
-
created_by: TEST_AGENT,
|
|
726
|
-
});
|
|
727
|
-
const child2 = await backend.createSubtask(parent.id, {
|
|
728
|
-
description: "Child 2",
|
|
729
|
-
created_by: TEST_AGENT,
|
|
730
|
-
});
|
|
731
|
-
|
|
732
|
-
expect(child1.parent_task).toBe(parent.id);
|
|
733
|
-
expect(child2.parent_task).toBe(parent.id);
|
|
734
|
-
|
|
735
|
-
// Verify parent has subtask references
|
|
736
|
-
const updatedParent = await backend.get(parent.id);
|
|
737
|
-
expect(updatedParent!.subtasks).toContain(child1.id);
|
|
738
|
-
expect(updatedParent!.subtasks).toContain(child2.id);
|
|
739
|
-
});
|
|
740
|
-
|
|
741
|
-
it("should getChildren for a parent", async () => {
|
|
742
|
-
const parent = await backend.create({
|
|
743
|
-
description: "Children parent",
|
|
744
|
-
created_by: TEST_AGENT,
|
|
745
|
-
});
|
|
746
|
-
|
|
747
|
-
await backend.createSubtask(parent.id, {
|
|
748
|
-
description: "Sub A",
|
|
749
|
-
created_by: TEST_AGENT,
|
|
750
|
-
});
|
|
751
|
-
await backend.createSubtask(parent.id, {
|
|
752
|
-
description: "Sub B",
|
|
753
|
-
created_by: TEST_AGENT,
|
|
754
|
-
});
|
|
755
|
-
await backend.createSubtask(parent.id, {
|
|
756
|
-
description: "Sub C",
|
|
757
|
-
created_by: TEST_AGENT,
|
|
758
|
-
});
|
|
759
|
-
|
|
760
|
-
const children = await backend.getChildren(parent.id);
|
|
761
|
-
expect(children).toHaveLength(3);
|
|
762
|
-
});
|
|
763
|
-
|
|
764
|
-
it("should compute subtask status aggregates", async () => {
|
|
765
|
-
const parent = await backend.create({
|
|
766
|
-
description: "Status parent",
|
|
767
|
-
created_by: TEST_AGENT,
|
|
768
|
-
});
|
|
769
|
-
|
|
770
|
-
const c1 = await backend.createSubtask(parent.id, {
|
|
771
|
-
description: "Sub done",
|
|
772
|
-
created_by: TEST_AGENT,
|
|
773
|
-
});
|
|
774
|
-
const c2 = await backend.createSubtask(parent.id, {
|
|
775
|
-
description: "Sub in progress",
|
|
776
|
-
created_by: TEST_AGENT,
|
|
777
|
-
});
|
|
778
|
-
await backend.createSubtask(parent.id, {
|
|
779
|
-
description: "Sub pending",
|
|
780
|
-
created_by: TEST_AGENT,
|
|
781
|
-
});
|
|
782
|
-
|
|
783
|
-
await backend.start(c1.id);
|
|
784
|
-
await backend.complete(c1.id);
|
|
785
|
-
await backend.start(c2.id);
|
|
786
|
-
|
|
787
|
-
const status = await backend.getSubtaskStatus(parent.id);
|
|
788
|
-
expect(status.total).toBe(3);
|
|
789
|
-
expect(status.completed).toBe(1);
|
|
790
|
-
expect(status.in_progress).toBe(1);
|
|
791
|
-
expect(status.pending).toBe(1);
|
|
792
|
-
expect(status.allCompleted).toBe(false);
|
|
793
|
-
expect(status.anyFailed).toBe(false);
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
it("should report allCompleted when all subtasks done", async () => {
|
|
797
|
-
const parent = await backend.create({
|
|
798
|
-
description: "All done parent",
|
|
799
|
-
created_by: TEST_AGENT,
|
|
800
|
-
});
|
|
801
|
-
|
|
802
|
-
const c1 = await backend.createSubtask(parent.id, {
|
|
803
|
-
description: "Done 1",
|
|
804
|
-
created_by: TEST_AGENT,
|
|
805
|
-
});
|
|
806
|
-
const c2 = await backend.createSubtask(parent.id, {
|
|
807
|
-
description: "Done 2",
|
|
808
|
-
created_by: TEST_AGENT,
|
|
809
|
-
});
|
|
810
|
-
|
|
811
|
-
await backend.start(c1.id);
|
|
812
|
-
await backend.complete(c1.id);
|
|
813
|
-
await backend.start(c2.id);
|
|
814
|
-
await backend.complete(c2.id);
|
|
815
|
-
|
|
816
|
-
const status = await backend.getSubtaskStatus(parent.id);
|
|
817
|
-
expect(status.allCompleted).toBe(true);
|
|
818
|
-
});
|
|
819
|
-
|
|
820
|
-
it("should throw when creating subtask with non-existent parent", async () => {
|
|
821
|
-
await expect(
|
|
822
|
-
backend.createSubtask("task_nonexistent", {
|
|
823
|
-
description: "Orphan",
|
|
824
|
-
created_by: TEST_AGENT,
|
|
825
|
-
})
|
|
826
|
-
).rejects.toThrow(OpenTasksBackendError);
|
|
827
|
-
});
|
|
828
|
-
});
|
|
829
|
-
|
|
830
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
831
|
-
// 7. Pull Model (Claim / Unclaim / ListClaimable)
|
|
832
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
833
|
-
|
|
834
|
-
describe("pull model", () => {
|
|
835
|
-
it("should claim a pending unblocked task", async () => {
|
|
836
|
-
await backend.create({
|
|
837
|
-
description: "Claimable task",
|
|
838
|
-
created_by: TEST_AGENT,
|
|
839
|
-
});
|
|
840
|
-
|
|
841
|
-
const claimed = await backend.claim(WORKER_1);
|
|
842
|
-
expect(claimed).not.toBeNull();
|
|
843
|
-
expect(claimed!.assigned_agent).toBe(WORKER_1);
|
|
844
|
-
expect(claimed!.status).toBe("assigned");
|
|
845
|
-
|
|
846
|
-
// Verify daemon issue still exists
|
|
847
|
-
const issue = await client.getIssue(claimed!.external_id!);
|
|
848
|
-
expect(issue).not.toBeNull();
|
|
849
|
-
});
|
|
850
|
-
|
|
851
|
-
it("should return null when no tasks available to claim", async () => {
|
|
852
|
-
const claimed = await backend.claim(WORKER_1);
|
|
853
|
-
expect(claimed).toBeNull();
|
|
854
|
-
});
|
|
855
|
-
|
|
856
|
-
it("should not claim blocked tasks", async () => {
|
|
857
|
-
const blocker = await backend.create({
|
|
858
|
-
description: "Claim blocker",
|
|
859
|
-
created_by: TEST_AGENT,
|
|
860
|
-
});
|
|
861
|
-
const blocked = await backend.create({
|
|
862
|
-
description: "Claim blocked",
|
|
863
|
-
created_by: TEST_AGENT,
|
|
864
|
-
});
|
|
865
|
-
|
|
866
|
-
await backend.addBlocker(blocked.id, blocker.id);
|
|
867
|
-
|
|
868
|
-
// Only the blocker should be claimable
|
|
869
|
-
const claimed = await backend.claim(WORKER_1);
|
|
870
|
-
expect(claimed).not.toBeNull();
|
|
871
|
-
expect(claimed!.id).toBe(blocker.id);
|
|
872
|
-
|
|
873
|
-
// No more claimable tasks (blocked is still blocked)
|
|
874
|
-
const second = await backend.claim(WORKER_2);
|
|
875
|
-
expect(second).toBeNull();
|
|
876
|
-
});
|
|
877
|
-
|
|
878
|
-
it("should not claim already-assigned tasks", async () => {
|
|
879
|
-
await backend.create({
|
|
880
|
-
description: "Single claim test",
|
|
881
|
-
created_by: TEST_AGENT,
|
|
882
|
-
});
|
|
883
|
-
|
|
884
|
-
const first = await backend.claim(WORKER_1);
|
|
885
|
-
expect(first).not.toBeNull();
|
|
886
|
-
|
|
887
|
-
// Second claim should get null
|
|
888
|
-
const second = await backend.claim(WORKER_2);
|
|
889
|
-
expect(second).toBeNull();
|
|
890
|
-
});
|
|
891
|
-
|
|
892
|
-
it("should unclaim a task and make it available again", async () => {
|
|
893
|
-
await backend.create({
|
|
894
|
-
description: "Unclaim test",
|
|
895
|
-
created_by: TEST_AGENT,
|
|
896
|
-
});
|
|
897
|
-
|
|
898
|
-
const claimed = await backend.claim(WORKER_1);
|
|
899
|
-
await backend.unclaim(claimed!.id);
|
|
900
|
-
|
|
901
|
-
const updated = await backend.get(claimed!.id);
|
|
902
|
-
expect(updated!.assigned_agent).toBeUndefined();
|
|
903
|
-
expect(updated!.status).toBe("pending");
|
|
904
|
-
|
|
905
|
-
// Should be claimable again after unclaim resets to pending
|
|
906
|
-
const reClaimed = await backend.claim(WORKER_2);
|
|
907
|
-
expect(reClaimed).not.toBeNull();
|
|
908
|
-
expect(reClaimed!.assigned_agent).toBe(WORKER_2);
|
|
909
|
-
});
|
|
910
|
-
|
|
911
|
-
it("should throw when unclaiming a non-assigned task", async () => {
|
|
912
|
-
const task = await backend.create({
|
|
913
|
-
description: "Not claimed",
|
|
914
|
-
created_by: TEST_AGENT,
|
|
915
|
-
});
|
|
916
|
-
|
|
917
|
-
await expect(backend.unclaim(task.id)).rejects.toThrow(
|
|
918
|
-
OpenTasksBackendError
|
|
919
|
-
);
|
|
920
|
-
});
|
|
921
|
-
|
|
922
|
-
it("should list claimable tasks with tag filter", async () => {
|
|
923
|
-
await backend.create({
|
|
924
|
-
description: "Frontend work",
|
|
925
|
-
created_by: TEST_AGENT,
|
|
926
|
-
tags: ["frontend"],
|
|
927
|
-
});
|
|
928
|
-
await backend.create({
|
|
929
|
-
description: "Backend work",
|
|
930
|
-
created_by: TEST_AGENT,
|
|
931
|
-
tags: ["backend"],
|
|
932
|
-
});
|
|
933
|
-
|
|
934
|
-
const frontendClaimable = await backend.listClaimable({
|
|
935
|
-
tags: ["frontend"],
|
|
936
|
-
});
|
|
937
|
-
expect(frontendClaimable).toHaveLength(1);
|
|
938
|
-
expect(frontendClaimable[0].description).toBe("Frontend work");
|
|
939
|
-
});
|
|
940
|
-
|
|
941
|
-
it("should list claimable tasks with rootTasksOnly filter", async () => {
|
|
942
|
-
const parent = await backend.create({
|
|
943
|
-
description: "Root claimable",
|
|
944
|
-
created_by: TEST_AGENT,
|
|
945
|
-
});
|
|
946
|
-
await backend.createSubtask(parent.id, {
|
|
947
|
-
description: "Child not root",
|
|
948
|
-
created_by: TEST_AGENT,
|
|
949
|
-
});
|
|
950
|
-
|
|
951
|
-
const rootClaimable = await backend.listClaimable({
|
|
952
|
-
rootTasksOnly: true,
|
|
953
|
-
});
|
|
954
|
-
expect(rootClaimable).toHaveLength(1);
|
|
955
|
-
expect(rootClaimable[0].id).toBe(parent.id);
|
|
956
|
-
});
|
|
957
|
-
});
|
|
958
|
-
|
|
959
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
960
|
-
// 8. Import from OpenTasks
|
|
961
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
962
|
-
|
|
963
|
-
describe("import", () => {
|
|
964
|
-
it("should import an existing OpenTasks issue as a task", async () => {
|
|
965
|
-
// Create an issue directly in the daemon (not via backend)
|
|
966
|
-
const issue = await client.createIssue({
|
|
967
|
-
title: "Externally created issue",
|
|
968
|
-
status: "open",
|
|
969
|
-
tags: ["imported"],
|
|
970
|
-
metadata: { source: "external" },
|
|
971
|
-
});
|
|
972
|
-
|
|
973
|
-
const task = await backend.importIssue(issue.id, TEST_AGENT);
|
|
974
|
-
|
|
975
|
-
expect(task.id).toMatch(/^task_/);
|
|
976
|
-
expect(task.description).toBe("Externally created issue");
|
|
977
|
-
expect(task.status).toBe("pending");
|
|
978
|
-
expect(task.external_id).toBe(issue.id);
|
|
979
|
-
|
|
980
|
-
// Mapping should be established
|
|
981
|
-
expect(backend.getIssueForTask(task.id)).toBe(issue.id);
|
|
982
|
-
expect(backend.getTaskForIssue(issue.id)).toBe(task.id);
|
|
983
|
-
});
|
|
984
|
-
|
|
985
|
-
it("should import an in_progress issue with correct status", async () => {
|
|
986
|
-
const issue = await client.createIssue({
|
|
987
|
-
title: "Active issue",
|
|
988
|
-
status: "in_progress",
|
|
989
|
-
});
|
|
990
|
-
|
|
991
|
-
const task = await backend.importIssue(issue.id, TEST_AGENT);
|
|
992
|
-
expect(task.status).toBe("in_progress");
|
|
993
|
-
});
|
|
994
|
-
|
|
995
|
-
it("should import a closed issue as completed", async () => {
|
|
996
|
-
const issue = await client.createIssue({
|
|
997
|
-
title: "Closed issue",
|
|
998
|
-
status: "closed",
|
|
999
|
-
});
|
|
1000
|
-
|
|
1001
|
-
const task = await backend.importIssue(issue.id, TEST_AGENT);
|
|
1002
|
-
expect(task.status).toBe("completed");
|
|
1003
|
-
});
|
|
1004
|
-
|
|
1005
|
-
it("should not re-import an already imported issue", async () => {
|
|
1006
|
-
const issue = await client.createIssue({
|
|
1007
|
-
title: "Import once",
|
|
1008
|
-
status: "open",
|
|
1009
|
-
});
|
|
1010
|
-
|
|
1011
|
-
const task1 = await backend.importIssue(issue.id, TEST_AGENT);
|
|
1012
|
-
const task2 = await backend.importIssue(issue.id, TEST_AGENT);
|
|
1013
|
-
|
|
1014
|
-
expect(task1.id).toBe(task2.id);
|
|
1015
|
-
});
|
|
1016
|
-
|
|
1017
|
-
it("should import an issue with assignee", async () => {
|
|
1018
|
-
const issue = await client.createIssue({
|
|
1019
|
-
title: "Assigned import",
|
|
1020
|
-
status: "open",
|
|
1021
|
-
assignee: WORKER_1,
|
|
1022
|
-
});
|
|
1023
|
-
|
|
1024
|
-
const task = await backend.importIssue(issue.id, TEST_AGENT);
|
|
1025
|
-
|
|
1026
|
-
// The import should set the assignee locally
|
|
1027
|
-
const retrieved = await backend.get(task.id);
|
|
1028
|
-
expect(retrieved!.assigned_agent).toBe(WORKER_1);
|
|
1029
|
-
});
|
|
1030
|
-
|
|
1031
|
-
it("should bulk import open issues via importOpenIssues", async () => {
|
|
1032
|
-
// Create several issues directly in daemon
|
|
1033
|
-
await client.createIssue({
|
|
1034
|
-
title: "Bulk import 1",
|
|
1035
|
-
status: "open",
|
|
1036
|
-
});
|
|
1037
|
-
await client.createIssue({
|
|
1038
|
-
title: "Bulk import 2",
|
|
1039
|
-
status: "in_progress",
|
|
1040
|
-
});
|
|
1041
|
-
// This one is closed - should still be imported since listIssues filter
|
|
1042
|
-
// only gets open/in_progress
|
|
1043
|
-
await client.createIssue({
|
|
1044
|
-
title: "Bulk import closed",
|
|
1045
|
-
status: "closed",
|
|
1046
|
-
});
|
|
1047
|
-
|
|
1048
|
-
const imported = await backend.importOpenIssues(TEST_AGENT);
|
|
1049
|
-
|
|
1050
|
-
// Should import at least the open and in_progress ones
|
|
1051
|
-
expect(imported.length).toBeGreaterThanOrEqual(2);
|
|
1052
|
-
expect(imported.some((t) => t.description === "Bulk import 1")).toBe(true);
|
|
1053
|
-
expect(imported.some((t) => t.description === "Bulk import 2")).toBe(true);
|
|
1054
|
-
});
|
|
1055
|
-
|
|
1056
|
-
it("should throw when importing non-existent issue", async () => {
|
|
1057
|
-
await expect(
|
|
1058
|
-
backend.importIssue("nonexistent-issue-id", TEST_AGENT)
|
|
1059
|
-
).rejects.toThrow(OpenTasksBackendError);
|
|
1060
|
-
});
|
|
1061
|
-
});
|
|
1062
|
-
|
|
1063
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1064
|
-
// 9. Agent History
|
|
1065
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1066
|
-
|
|
1067
|
-
describe("agent history", () => {
|
|
1068
|
-
it("should track assignment history", async () => {
|
|
1069
|
-
const task = await backend.create({
|
|
1070
|
-
description: "History tracking test",
|
|
1071
|
-
created_by: TEST_AGENT,
|
|
1072
|
-
});
|
|
1073
|
-
|
|
1074
|
-
await backend.assign(task.id, WORKER_1);
|
|
1075
|
-
await backend.unassign(task.id);
|
|
1076
|
-
await backend.assign(task.id, WORKER_2);
|
|
1077
|
-
|
|
1078
|
-
const history = await backend.getAgentHistory(task.id);
|
|
1079
|
-
expect(history.length).toBeGreaterThanOrEqual(2);
|
|
1080
|
-
|
|
1081
|
-
// The history should contain both workers
|
|
1082
|
-
const agents = history.map((h) => h.agent_id);
|
|
1083
|
-
expect(agents).toContain(WORKER_1);
|
|
1084
|
-
expect(agents).toContain(WORKER_2);
|
|
1085
|
-
});
|
|
1086
|
-
|
|
1087
|
-
it("should throw for non-existent task", async () => {
|
|
1088
|
-
await expect(
|
|
1089
|
-
backend.getAgentHistory("task_nonexistent")
|
|
1090
|
-
).rejects.toThrow(OpenTasksBackendError);
|
|
1091
|
-
});
|
|
1092
|
-
});
|
|
1093
|
-
|
|
1094
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1095
|
-
// 10. Event Subscriptions
|
|
1096
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1097
|
-
|
|
1098
|
-
describe("event subscriptions", () => {
|
|
1099
|
-
it("should fire callback on task creation", async () => {
|
|
1100
|
-
const events: TaskChangeEvent[] = [];
|
|
1101
|
-
const unsub = backend.onTaskChange((event) => events.push(event));
|
|
1102
|
-
|
|
1103
|
-
await backend.create({
|
|
1104
|
-
description: "Event creation test",
|
|
1105
|
-
created_by: TEST_AGENT,
|
|
1106
|
-
});
|
|
1107
|
-
|
|
1108
|
-
expect(events.length).toBeGreaterThan(0);
|
|
1109
|
-
expect(events[0].type).toBe("created");
|
|
1110
|
-
|
|
1111
|
-
unsub();
|
|
1112
|
-
});
|
|
1113
|
-
|
|
1114
|
-
it("should fire callback on status changes", async () => {
|
|
1115
|
-
const task = await backend.create({
|
|
1116
|
-
description: "Event status test",
|
|
1117
|
-
created_by: TEST_AGENT,
|
|
1118
|
-
});
|
|
1119
|
-
|
|
1120
|
-
const events: TaskChangeEvent[] = [];
|
|
1121
|
-
const unsub = backend.onTaskChange(task.id, (event) =>
|
|
1122
|
-
events.push(event)
|
|
1123
|
-
);
|
|
1124
|
-
|
|
1125
|
-
await backend.start(task.id);
|
|
1126
|
-
await backend.complete(task.id);
|
|
1127
|
-
|
|
1128
|
-
expect(events.length).toBeGreaterThanOrEqual(2);
|
|
1129
|
-
|
|
1130
|
-
unsub();
|
|
1131
|
-
});
|
|
1132
|
-
|
|
1133
|
-
it("should filter events by taskId", async () => {
|
|
1134
|
-
const t1 = await backend.create({
|
|
1135
|
-
description: "Filtered task 1",
|
|
1136
|
-
created_by: TEST_AGENT,
|
|
1137
|
-
});
|
|
1138
|
-
|
|
1139
|
-
const events: TaskChangeEvent[] = [];
|
|
1140
|
-
const unsub = backend.onTaskChange(t1.id, (event) =>
|
|
1141
|
-
events.push(event)
|
|
1142
|
-
);
|
|
1143
|
-
|
|
1144
|
-
await backend.create({
|
|
1145
|
-
description: "Filtered task 2",
|
|
1146
|
-
created_by: TEST_AGENT,
|
|
1147
|
-
});
|
|
1148
|
-
|
|
1149
|
-
await backend.start(t1.id);
|
|
1150
|
-
|
|
1151
|
-
// All events should be for t1 only
|
|
1152
|
-
expect(events.every((e) => e.taskId === t1.id)).toBe(true);
|
|
1153
|
-
|
|
1154
|
-
unsub();
|
|
1155
|
-
});
|
|
1156
|
-
|
|
1157
|
-
it("should stop receiving events after unsubscribe", async () => {
|
|
1158
|
-
const events: TaskChangeEvent[] = [];
|
|
1159
|
-
const unsub = backend.onTaskChange((event) => events.push(event));
|
|
1160
|
-
|
|
1161
|
-
await backend.create({
|
|
1162
|
-
description: "Before unsub",
|
|
1163
|
-
created_by: TEST_AGENT,
|
|
1164
|
-
});
|
|
1165
|
-
|
|
1166
|
-
const countBefore = events.length;
|
|
1167
|
-
unsub();
|
|
1168
|
-
|
|
1169
|
-
await backend.create({
|
|
1170
|
-
description: "After unsub",
|
|
1171
|
-
created_by: TEST_AGENT,
|
|
1172
|
-
});
|
|
1173
|
-
|
|
1174
|
-
expect(events.length).toBe(countBefore);
|
|
1175
|
-
});
|
|
1176
|
-
});
|
|
1177
|
-
|
|
1178
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1179
|
-
// 11. Sync Configuration
|
|
1180
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1181
|
-
|
|
1182
|
-
describe("sync configuration", () => {
|
|
1183
|
-
it("should not sync status when syncStatus is false", async () => {
|
|
1184
|
-
const noSyncBackend = createOpenTasksTaskBackend(eventStore, client, {
|
|
1185
|
-
syncStatus: false,
|
|
1186
|
-
sourceLabel: "no-sync-test",
|
|
1187
|
-
});
|
|
1188
|
-
|
|
1189
|
-
const task = await noSyncBackend.create({
|
|
1190
|
-
description: "No sync test",
|
|
1191
|
-
created_by: TEST_AGENT,
|
|
1192
|
-
});
|
|
1193
|
-
|
|
1194
|
-
await noSyncBackend.start(task.id);
|
|
1195
|
-
|
|
1196
|
-
// Local status should be in_progress
|
|
1197
|
-
const updated = await noSyncBackend.get(task.id);
|
|
1198
|
-
expect(updated!.status).toBe("in_progress");
|
|
1199
|
-
|
|
1200
|
-
// Daemon issue should still be "open" since sync is disabled
|
|
1201
|
-
const issue = await client.getIssue(task.external_id!);
|
|
1202
|
-
expect(issue!.status).toBe("open");
|
|
1203
|
-
});
|
|
1204
|
-
});
|
|
1205
|
-
|
|
1206
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1207
|
-
// 12. Error Handling
|
|
1208
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1209
|
-
|
|
1210
|
-
describe("error handling", () => {
|
|
1211
|
-
it("should throw TASK_NOT_FOUND for operations on non-existent tasks", async () => {
|
|
1212
|
-
const fakeId = "task_doesnotexist";
|
|
1213
|
-
|
|
1214
|
-
await expect(
|
|
1215
|
-
backend.assign(fakeId, WORKER_1)
|
|
1216
|
-
).rejects.toThrow("Task not found");
|
|
1217
|
-
|
|
1218
|
-
await expect(
|
|
1219
|
-
backend.start(fakeId)
|
|
1220
|
-
).rejects.toThrow("Task not found");
|
|
1221
|
-
|
|
1222
|
-
await expect(
|
|
1223
|
-
backend.complete(fakeId)
|
|
1224
|
-
).rejects.toThrow("Task not found");
|
|
1225
|
-
|
|
1226
|
-
await expect(
|
|
1227
|
-
backend.fail(fakeId, { message: "error" })
|
|
1228
|
-
).rejects.toThrow("Task not found");
|
|
1229
|
-
|
|
1230
|
-
await expect(
|
|
1231
|
-
backend.addBlocker(fakeId, "task_other")
|
|
1232
|
-
).rejects.toThrow("Task not found");
|
|
1233
|
-
});
|
|
1234
|
-
|
|
1235
|
-
it("should throw when blocker task does not exist", async () => {
|
|
1236
|
-
const task = await backend.create({
|
|
1237
|
-
description: "Has no blocker",
|
|
1238
|
-
created_by: TEST_AGENT,
|
|
1239
|
-
});
|
|
1240
|
-
|
|
1241
|
-
await expect(
|
|
1242
|
-
backend.addBlocker(task.id, "task_nonexistent_blocker")
|
|
1243
|
-
).rejects.toThrow("Blocker task not found");
|
|
1244
|
-
});
|
|
1245
|
-
|
|
1246
|
-
it("should throw for update on non-existent task", async () => {
|
|
1247
|
-
await expect(
|
|
1248
|
-
backend.update("task_fake", { description: "new" })
|
|
1249
|
-
).rejects.toThrow(OpenTasksBackendError);
|
|
1250
|
-
});
|
|
1251
|
-
});
|
|
1252
|
-
|
|
1253
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1254
|
-
// 13. Integration: Full Workflow
|
|
1255
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1256
|
-
|
|
1257
|
-
describe("full workflow integration", () => {
|
|
1258
|
-
it("should handle a complete multi-task workflow with dependencies", async () => {
|
|
1259
|
-
// 1. Create a parent with two children
|
|
1260
|
-
const parent = await backend.create({
|
|
1261
|
-
description: "Refactor authentication module",
|
|
1262
|
-
created_by: TEST_AGENT,
|
|
1263
|
-
tags: ["refactor"],
|
|
1264
|
-
});
|
|
1265
|
-
|
|
1266
|
-
const child1 = await backend.createSubtask(parent.id, {
|
|
1267
|
-
description: "Extract auth middleware",
|
|
1268
|
-
created_by: TEST_AGENT,
|
|
1269
|
-
tags: ["backend"],
|
|
1270
|
-
});
|
|
1271
|
-
|
|
1272
|
-
const child2 = await backend.createSubtask(parent.id, {
|
|
1273
|
-
description: "Update auth tests",
|
|
1274
|
-
created_by: TEST_AGENT,
|
|
1275
|
-
tags: ["testing"],
|
|
1276
|
-
});
|
|
1277
|
-
|
|
1278
|
-
// 2. child2 depends on child1
|
|
1279
|
-
await backend.addBlocker(child2.id, child1.id);
|
|
1280
|
-
|
|
1281
|
-
// 3. Verify initial state
|
|
1282
|
-
let status = await backend.getSubtaskStatus(parent.id);
|
|
1283
|
-
expect(status.total).toBe(2);
|
|
1284
|
-
expect(status.pending).toBe(2);
|
|
1285
|
-
|
|
1286
|
-
// 4. Work on child1 directly (child2 is blocked by it)
|
|
1287
|
-
await backend.assign(child1.id, WORKER_1);
|
|
1288
|
-
await backend.start(child1.id);
|
|
1289
|
-
await backend.complete(child1.id, {
|
|
1290
|
-
summary: "Extracted middleware to separate module",
|
|
1291
|
-
data: { files_changed: 3 },
|
|
1292
|
-
});
|
|
1293
|
-
|
|
1294
|
-
// 5. child2 should now be unblocked
|
|
1295
|
-
const readyTasks = await backend.listReady();
|
|
1296
|
-
const child2Ready = readyTasks.find((t) => t.id === child2.id);
|
|
1297
|
-
expect(child2Ready).toBeDefined();
|
|
1298
|
-
|
|
1299
|
-
// 6. Work on child2
|
|
1300
|
-
await backend.assign(child2.id, WORKER_2);
|
|
1301
|
-
await backend.start(child2.id);
|
|
1302
|
-
await backend.complete(child2.id, {
|
|
1303
|
-
summary: "Updated all test files",
|
|
1304
|
-
});
|
|
1305
|
-
|
|
1306
|
-
// 7. All subtasks completed
|
|
1307
|
-
status = await backend.getSubtaskStatus(parent.id);
|
|
1308
|
-
expect(status.allCompleted).toBe(true);
|
|
1309
|
-
expect(status.anyFailed).toBe(false);
|
|
1310
|
-
|
|
1311
|
-
// 8. Complete parent
|
|
1312
|
-
await backend.start(parent.id);
|
|
1313
|
-
await backend.complete(parent.id, {
|
|
1314
|
-
summary: "Auth module refactored",
|
|
1315
|
-
});
|
|
1316
|
-
|
|
1317
|
-
// 9. Verify everything is completed
|
|
1318
|
-
const finalParent = await backend.get(parent.id);
|
|
1319
|
-
expect(finalParent!.status).toBe("completed");
|
|
1320
|
-
|
|
1321
|
-
const finalChild1 = await backend.get(child1.id);
|
|
1322
|
-
expect(finalChild1!.status).toBe("completed");
|
|
1323
|
-
|
|
1324
|
-
const finalChild2 = await backend.get(child2.id);
|
|
1325
|
-
expect(finalChild2!.status).toBe("completed");
|
|
1326
|
-
|
|
1327
|
-
// 10. Verify all issues are closed in daemon
|
|
1328
|
-
const parentIssue = await client.getIssue(parent.external_id!);
|
|
1329
|
-
expect(parentIssue!.status).toBe("closed");
|
|
1330
|
-
|
|
1331
|
-
const child1Issue = await client.getIssue(child1.external_id!);
|
|
1332
|
-
expect(child1Issue!.status).toBe("closed");
|
|
1333
|
-
|
|
1334
|
-
const child2Issue = await client.getIssue(child2.external_id!);
|
|
1335
|
-
expect(child2Issue!.status).toBe("closed");
|
|
1336
|
-
});
|
|
1337
|
-
});
|
|
1338
|
-
});
|