macro-agent 0.0.17 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +3 -1
- package/.sudocode/specs.jsonl +4 -0
- package/CLAUDE.md +16 -14
- package/README.md +11 -29
- package/dist/acp/macro-agent.d.ts +17 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +183 -55
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +32 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager.d.ts +65 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +464 -183
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +37 -6
- package/dist/api/server.js.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token.d.ts +41 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +73 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/cli/acp.d.ts +2 -23
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +127 -61
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +147 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +268 -181
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/parse-args.d.ts +20 -0
- package/dist/cli/parse-args.d.ts.map +1 -0
- package/dist/cli/parse-args.js +43 -0
- package/dist/cli/parse-args.js.map +1 -0
- package/dist/cli/stable-instance-id.d.ts +8 -0
- package/dist/cli/stable-instance-id.d.ts.map +1 -0
- package/dist/cli/stable-instance-id.js +14 -0
- package/dist/cli/stable-instance-id.js.map +1 -0
- package/dist/config/project-config.d.ts +74 -7
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +123 -20
- package/dist/config/project-config.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts +23 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +482 -55
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/connection-manager.d.ts.map +1 -1
- package/dist/map/adapter/connection-manager.js +3 -0
- package/dist/map/adapter/connection-manager.js.map +1 -1
- package/dist/map/adapter/event-log.d.ts +87 -0
- package/dist/map/adapter/event-log.d.ts.map +1 -0
- package/dist/map/adapter/event-log.js +122 -0
- package/dist/map/adapter/event-log.js.map +1 -0
- package/dist/map/adapter/event-translator.js +6 -6
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +10 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +34 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
- package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
- package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
- package/dist/map/adapter/extensions/rename.d.ts +29 -0
- package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
- package/dist/map/adapter/extensions/rename.js +49 -0
- package/dist/map/adapter/extensions/rename.js.map +1 -0
- package/dist/map/adapter/extensions/task.d.ts.map +1 -1
- package/dist/map/adapter/extensions/task.js +10 -0
- package/dist/map/adapter/extensions/task.js.map +1 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
- package/dist/map/adapter/extensions/update-metadata.js +67 -0
- package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
- package/dist/map/adapter/index.d.ts +2 -1
- package/dist/map/adapter/index.d.ts.map +1 -1
- package/dist/map/adapter/index.js +8 -2
- package/dist/map/adapter/index.js.map +1 -1
- package/dist/map/adapter/interface.d.ts +2 -0
- package/dist/map/adapter/interface.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.d.ts +4 -0
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +302 -30
- package/dist/map/adapter/map-adapter.js.map +1 -1
- package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
- package/dist/map/adapter/subscription-manager.js +5 -1
- package/dist/map/adapter/subscription-manager.js.map +1 -1
- package/dist/map/adapter/types.d.ts +2 -0
- package/dist/map/adapter/types.d.ts.map +1 -1
- package/dist/mcp/map-client.d.ts +39 -0
- package/dist/mcp/map-client.d.ts.map +1 -0
- package/dist/mcp/map-client.js +129 -0
- package/dist/mcp/map-client.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +14 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +113 -85
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/types.d.ts +9 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/metrics/metrics.js +1 -1
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/roles/capabilities.d.ts +3 -1
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +17 -7
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +6 -6
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +6 -6
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/registry.d.ts +2 -2
- package/dist/roles/registry.js +2 -2
- package/dist/server/combined-server.d.ts +20 -0
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +107 -8
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts +7 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +91 -8
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +23 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +1 -1
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/task/backend/index.d.ts +47 -29
- package/dist/task/backend/index.d.ts.map +1 -1
- package/dist/task/backend/index.js +109 -71
- package/dist/task/backend/index.js.map +1 -1
- package/dist/task/backend/memory.d.ts +1 -0
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +3 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/opentasks/backend.d.ts +140 -0
- package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
- package/dist/task/backend/opentasks/backend.js +1023 -0
- package/dist/task/backend/opentasks/backend.js.map +1 -0
- package/dist/task/backend/opentasks/client.d.ts +337 -0
- package/dist/task/backend/opentasks/client.d.ts.map +1 -0
- package/dist/task/backend/opentasks/client.js +225 -0
- package/dist/task/backend/opentasks/client.js.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.js +195 -0
- package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
- package/dist/task/backend/opentasks/index.d.ts +21 -0
- package/dist/task/backend/opentasks/index.d.ts.map +1 -0
- package/dist/task/backend/opentasks/index.js +21 -0
- package/dist/task/backend/opentasks/index.js.map +1 -0
- package/dist/task/backend/opentasks/mapping.d.ts +48 -0
- package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
- package/dist/task/backend/opentasks/mapping.js +77 -0
- package/dist/task/backend/opentasks/mapping.js.map +1 -0
- package/dist/task/backend/types.d.ts +33 -53
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js +7 -11
- package/dist/task/backend/types.js.map +1 -1
- package/dist/task/backend/unified-tool-provider.d.ts +57 -0
- package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
- package/dist/task/backend/unified-tool-provider.js +623 -0
- package/dist/task/backend/unified-tool-provider.js.map +1 -0
- package/dist/teams/team-loader.d.ts +2 -2
- package/dist/teams/team-loader.js +3 -3
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-runtime.d.ts.map +1 -1
- package/dist/teams/team-runtime.js +2 -0
- package/dist/teams/team-runtime.js.map +1 -1
- package/docs/architecture.md +7 -6
- package/docs/configuration.md +26 -62
- package/docs/implementation-details.md +5 -5
- package/docs/implementation-summary.md +17 -17
- package/docs/plan-self-driving-support.md +4 -4
- package/docs/spec-self-driving-support.md +10 -10
- package/docs/team-templates.md +2 -2
- package/docs/teams.md +3 -3
- package/docs/troubleshooting.md +10 -11
- package/package.json +6 -4
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
- package/src/acp/__tests__/history.test.ts +8 -4
- package/src/acp/__tests__/integration.test.ts +56 -31
- package/src/acp/__tests__/macro-agent.test.ts +16 -7
- package/src/acp/macro-agent.ts +230 -62
- package/src/acp/types.ts +46 -1
- package/src/agent/__tests__/agent-manager.test.ts +228 -2
- package/src/agent/agent-manager.ts +714 -261
- package/src/agent/types.ts +3 -1
- package/src/api/server.ts +41 -7
- package/src/auth/__tests__/token.test.ts +100 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/token.ts +82 -0
- package/src/cli/__tests__/acp.test.ts +1 -1
- package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
- package/src/cli/acp.ts +130 -72
- package/src/cli/index.ts +120 -14
- package/src/cli/mcp.ts +311 -207
- package/src/cli/parse-args.ts +54 -0
- package/src/cli/stable-instance-id.ts +14 -0
- package/src/config/project-config.ts +190 -27
- package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +820 -0
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +724 -2
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
- package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
- package/src/map/adapter/__tests__/event-log.test.ts +527 -0
- package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
- package/src/map/adapter/__tests__/extensions.test.ts +408 -0
- package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
- package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
- package/src/map/adapter/acp-over-map.ts +777 -92
- package/src/map/adapter/connection-manager.ts +3 -0
- package/src/map/adapter/event-log.ts +208 -0
- package/src/map/adapter/event-translator.ts +6 -6
- package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
- package/src/map/adapter/extensions/index.ts +60 -0
- package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
- package/src/map/adapter/extensions/task.ts +11 -0
- package/src/map/adapter/extensions/update-metadata.ts +126 -0
- package/src/map/adapter/index.ts +28 -0
- package/src/map/adapter/interface.ts +2 -0
- package/src/map/adapter/map-adapter.ts +373 -38
- package/src/map/adapter/subscription-manager.ts +5 -1
- package/src/map/adapter/types.ts +2 -0
- package/src/mcp/__tests__/map-client.test.ts +386 -0
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
- package/src/mcp/__tests__/mcp-server.test.ts +100 -1
- package/src/mcp/map-client.ts +177 -0
- package/src/mcp/mcp-server.ts +191 -100
- package/src/mcp/types.ts +6 -1
- package/src/metrics/metrics.ts +1 -1
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
- package/src/roles/__tests__/config-loader.test.ts +7 -7
- package/src/roles/capabilities.ts +17 -7
- package/src/roles/config-loader.ts +6 -6
- package/src/roles/registry.ts +2 -2
- package/src/server/__tests__/combined-server.test.ts +94 -21
- package/src/server/combined-server.ts +189 -33
- package/src/steering/__tests__/steering-integration.test.ts +1 -1
- package/src/store/__tests__/event-store.test.ts +236 -1
- package/src/store/__tests__/instance.test.ts +3 -3
- package/src/store/event-store.ts +109 -8
- package/src/store/types/agents.ts +16 -0
- package/src/store/types/events.ts +1 -1
- package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
- package/src/task/backend/index.ts +156 -106
- package/src/task/backend/memory.ts +4 -0
- package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
- package/src/task/backend/opentasks/backend.ts +1323 -0
- package/src/task/backend/opentasks/client.ts +652 -0
- package/src/task/backend/opentasks/daemon-manager.ts +253 -0
- package/src/task/backend/opentasks/index.ts +69 -0
- package/src/task/backend/opentasks/mapping.ts +94 -0
- package/src/task/backend/types.ts +42 -66
- package/src/task/backend/unified-tool-provider.ts +779 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
- package/src/teams/team-loader.ts +3 -3
- package/src/teams/team-runtime.ts +2 -0
- package/test_fixtures/README.md +2 -3
- package/test_fixtures/fixtures/index.ts +0 -3
- package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
- package/test_fixtures/fixtures/repos/index.ts +1 -3
- package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
- package/test_fixtures/fixtures/repos/types.ts +0 -11
- package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
- package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
- package/vitest.config.ts +1 -1
- package/vitest.e2e.config.ts +1 -1
- package/vitest.setup.ts +1 -30
- package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
- package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
- package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
- package/.macro-agent/teams/self-driving/team.yaml +0 -103
- package/.macro-agent/teams/structured/prompts/developer.md +0 -26
- package/.macro-agent/teams/structured/prompts/lead.md +0 -25
- package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
- package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
- package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
- package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
- package/.macro-agent/teams/structured/team.yaml +0 -89
- package/docs/sudocode-integration.md +0 -383
- package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
- package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
- package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
- package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
- package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
- package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
- package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
- package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
- package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
- package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
- package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
- package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
- package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
- package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
- package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
- package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
- package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
- package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
- package/src/task/backend/sudocode/backend.ts +0 -1237
- package/src/task/backend/sudocode/client.ts +0 -515
- package/src/task/backend/sudocode/index.ts +0 -120
- package/src/task/backend/sudocode/mapping.ts +0 -93
- package/src/task/backend/sudocode/server-client.ts +0 -522
- package/src/task/backend/sudocode/standalone-client.ts +0 -623
- package/src/task/backend/sudocode/sync-policy.ts +0 -387
- package/src/task/backend/sudocode/tools.ts +0 -896
- package/src/task/backend/tool-provider.ts +0 -506
- package/test_fixtures/fixtures/sudocode/index.ts +0 -29
- package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
- package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Exports task backend interface types and implementations.
|
|
5
5
|
*
|
|
6
6
|
* @module task/backend
|
|
7
|
-
* @see s-8472 Pluggable Task Backend Integration with Sudocode
|
|
8
7
|
*/
|
|
9
8
|
|
|
10
9
|
// =============================================================================
|
|
@@ -35,19 +34,15 @@ export type {
|
|
|
35
34
|
|
|
36
35
|
// Tool provider
|
|
37
36
|
MCPToolDefinition,
|
|
38
|
-
TaskToolMode,
|
|
39
37
|
TaskToolProvider,
|
|
40
38
|
|
|
41
39
|
// Configuration
|
|
42
40
|
InMemoryBackendConfig,
|
|
43
|
-
|
|
44
|
-
ExecutionFilter,
|
|
45
|
-
SudocodeBackendConfig,
|
|
41
|
+
OpenTasksBackendConfig,
|
|
46
42
|
TaskBackendConfig,
|
|
47
43
|
TaskConfig,
|
|
48
44
|
} from "./types.js";
|
|
49
45
|
|
|
50
|
-
|
|
51
46
|
// Re-export base types for convenience
|
|
52
47
|
export type {
|
|
53
48
|
Task,
|
|
@@ -67,55 +62,67 @@ export {
|
|
|
67
62
|
} from "./memory.js";
|
|
68
63
|
|
|
69
64
|
export {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
} from "./tool-provider.js";
|
|
65
|
+
UnifiedTaskToolProvider,
|
|
66
|
+
createUnifiedToolProvider,
|
|
67
|
+
} from "./unified-tool-provider.js";
|
|
73
68
|
|
|
74
|
-
export type {
|
|
69
|
+
export type { ToolContext, GetToolContext } from "./unified-tool-provider.js";
|
|
75
70
|
|
|
76
71
|
// =============================================================================
|
|
77
|
-
//
|
|
72
|
+
// OpenTasks Backend (re-export)
|
|
78
73
|
// =============================================================================
|
|
79
74
|
|
|
80
75
|
export {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
} from "./
|
|
76
|
+
OpenTasksTaskBackend,
|
|
77
|
+
OpenTasksBackendError,
|
|
78
|
+
createOpenTasksTaskBackend,
|
|
79
|
+
IPCOpenTasksClient,
|
|
80
|
+
OpenTasksClientError,
|
|
81
|
+
createOpenTasksClient,
|
|
82
|
+
} from "./opentasks/index.js";
|
|
88
83
|
|
|
89
84
|
export type {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
} from "./
|
|
85
|
+
OpenTasksClient,
|
|
86
|
+
OpenTasksClientConfig,
|
|
87
|
+
OpenTasksIssue,
|
|
88
|
+
OpenTasksEdge,
|
|
89
|
+
OpenTasksNodeSummary,
|
|
90
|
+
} from "./opentasks/index.js";
|
|
96
91
|
|
|
97
92
|
// =============================================================================
|
|
98
93
|
// Backend Factory
|
|
99
94
|
// =============================================================================
|
|
100
95
|
|
|
101
96
|
import type { EventStore } from "../../store/event-store.js";
|
|
102
|
-
import type { TaskBackend, TaskConfig, TaskBackendConfig
|
|
103
|
-
import {
|
|
97
|
+
import type { TaskBackend, TaskConfig, TaskBackendConfig } from "./types.js";
|
|
98
|
+
import type { OpenTasksClient } from "./opentasks/client.js";
|
|
99
|
+
import { DEFAULT_TASK_CONFIG, DEFAULT_OPENTASKS_CONFIG } from "./types.js";
|
|
104
100
|
import { InMemoryTaskBackend } from "./memory.js";
|
|
105
|
-
import {
|
|
101
|
+
import { OpenTasksTaskBackend } from "./opentasks/backend.js";
|
|
102
|
+
import { createOpenTasksClient } from "./opentasks/client.js";
|
|
103
|
+
import { DaemonManager } from "./opentasks/daemon-manager.js";
|
|
106
104
|
|
|
107
105
|
/**
|
|
108
|
-
* Result of creating a task backend
|
|
106
|
+
* Result of creating a task backend
|
|
109
107
|
*/
|
|
110
108
|
export interface TaskBackendResult {
|
|
111
109
|
/** The task backend instance */
|
|
112
110
|
backend: TaskBackend;
|
|
113
111
|
|
|
114
|
-
/**
|
|
115
|
-
|
|
112
|
+
/** OpenTasks client (if opentasks backend is used) */
|
|
113
|
+
openTasksClient?: OpenTasksClient;
|
|
114
|
+
|
|
115
|
+
/** Runtime socket path of the daemon (for propagating to child agents) */
|
|
116
|
+
socketPath?: string;
|
|
117
|
+
|
|
118
|
+
/** Shutdown function — stops daemon if we started it, disconnects client */
|
|
119
|
+
shutdown?: () => Promise<void>;
|
|
116
120
|
|
|
117
|
-
/**
|
|
118
|
-
|
|
121
|
+
/** Connect a project's .opentasks/ directory to the central daemon (Phase 2) */
|
|
122
|
+
connectProject?: (projectPath: string) => Promise<void>;
|
|
123
|
+
|
|
124
|
+
/** Get list of connected project .opentasks/ paths */
|
|
125
|
+
getConnectedProjects?: () => string[];
|
|
119
126
|
}
|
|
120
127
|
|
|
121
128
|
/**
|
|
@@ -123,25 +130,19 @@ export interface TaskBackendResult {
|
|
|
123
130
|
*
|
|
124
131
|
* @param config - Task configuration
|
|
125
132
|
* @param eventStore - Event store for state management
|
|
126
|
-
* @returns Backend result with backend instance and
|
|
133
|
+
* @returns Backend result with backend instance and optional OpenTasks client
|
|
127
134
|
*
|
|
128
135
|
* @example
|
|
129
136
|
* ```typescript
|
|
130
137
|
* // Create in-memory backend (default)
|
|
131
|
-
* const { backend
|
|
138
|
+
* const { backend } = await createTaskBackend(
|
|
132
139
|
* { backend: { type: 'memory' } },
|
|
133
140
|
* eventStore
|
|
134
141
|
* );
|
|
135
142
|
*
|
|
136
|
-
* // Create
|
|
137
|
-
* const { backend,
|
|
138
|
-
* {
|
|
139
|
-
* backend: {
|
|
140
|
-
* type: 'sudocode',
|
|
141
|
-
* projectPath: '/path/to/project',
|
|
142
|
-
* },
|
|
143
|
-
* toolMode: 'native',
|
|
144
|
-
* },
|
|
143
|
+
* // Create opentasks backend
|
|
144
|
+
* const { backend, openTasksClient } = await createTaskBackend(
|
|
145
|
+
* { backend: { type: 'opentasks' } },
|
|
145
146
|
* eventStore
|
|
146
147
|
* );
|
|
147
148
|
* ```
|
|
@@ -150,111 +151,160 @@ export async function createTaskBackend(
|
|
|
150
151
|
config: TaskConfig,
|
|
151
152
|
eventStore: EventStore
|
|
152
153
|
): Promise<TaskBackendResult> {
|
|
153
|
-
const { backend: backendConfig
|
|
154
|
+
const { backend: backendConfig } = config;
|
|
154
155
|
|
|
155
156
|
if (backendConfig.type === "memory") {
|
|
156
157
|
const backend = new InMemoryTaskBackend(eventStore);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
// For in-memory backend, we use the abstract tool provider
|
|
160
|
-
// Note: Tool provider is created separately in MCP server with context
|
|
161
|
-
return {
|
|
162
|
-
backend,
|
|
163
|
-
toolMode: effectiveMode,
|
|
164
|
-
};
|
|
158
|
+
return { backend };
|
|
165
159
|
}
|
|
166
160
|
|
|
167
|
-
if (backendConfig.type === "
|
|
168
|
-
// Dynamic import to avoid loading sudocode dependencies if not needed
|
|
169
|
-
const { createSudocodeClient } = await import("./sudocode/client.js");
|
|
170
|
-
const { SudocodeTaskBackend } = await import("./sudocode/backend.js");
|
|
171
|
-
const { SudocodeTaskToolProvider } = await import("./sudocode/tools.js");
|
|
172
|
-
|
|
161
|
+
if (backendConfig.type === "opentasks") {
|
|
173
162
|
// Merge with defaults
|
|
174
|
-
const
|
|
175
|
-
...
|
|
163
|
+
const openTasksConfig = {
|
|
164
|
+
...DEFAULT_OPENTASKS_CONFIG,
|
|
176
165
|
...backendConfig,
|
|
177
166
|
};
|
|
178
167
|
|
|
179
|
-
//
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
168
|
+
// Determine how to get the OpenTasks client:
|
|
169
|
+
// 1. If socketPath is explicitly provided, connect directly (legacy / child agent mode)
|
|
170
|
+
// 2. If autoStart is enabled (default), use DaemonManager to auto-start central daemon
|
|
171
|
+
// 3. Otherwise, try to connect without auto-start
|
|
172
|
+
|
|
173
|
+
let openTasksClient: OpenTasksClient;
|
|
174
|
+
let resolvedSocketPath: string | undefined;
|
|
175
|
+
let shutdownFn: (() => Promise<void>) | undefined;
|
|
176
|
+
let daemonManager: DaemonManager | undefined;
|
|
177
|
+
|
|
178
|
+
if (openTasksConfig.socketPath) {
|
|
179
|
+
// Direct connection to a known socket (e.g., child agent with inherited socket path)
|
|
180
|
+
openTasksClient = await createOpenTasksClient({
|
|
181
|
+
socketPath: openTasksConfig.socketPath,
|
|
182
|
+
});
|
|
183
|
+
resolvedSocketPath = openTasksConfig.socketPath;
|
|
184
|
+
shutdownFn = async () => {
|
|
185
|
+
openTasksClient.disconnect();
|
|
186
|
+
};
|
|
187
|
+
} else if (openTasksConfig.autoStart !== false) {
|
|
188
|
+
// Auto-start daemon via DaemonManager (default behavior)
|
|
189
|
+
daemonManager = new DaemonManager({
|
|
190
|
+
centralPath: openTasksConfig.centralPath,
|
|
191
|
+
connectOnSpawn: openTasksConfig.connectOnSpawn,
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
const result = await daemonManager.ensureDaemon();
|
|
195
|
+
openTasksClient = result.client;
|
|
196
|
+
resolvedSocketPath = result.socketPath;
|
|
197
|
+
shutdownFn = () => daemonManager!.shutdown();
|
|
198
|
+
} else {
|
|
199
|
+
// Auto-start disabled, no socket path — try default socket discovery
|
|
200
|
+
openTasksClient = await createOpenTasksClient();
|
|
201
|
+
shutdownFn = async () => {
|
|
202
|
+
openTasksClient.disconnect();
|
|
203
|
+
};
|
|
204
|
+
}
|
|
184
205
|
|
|
185
206
|
// Create backend
|
|
186
|
-
const backend = new
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
207
|
+
const backend = new OpenTasksTaskBackend(eventStore, openTasksClient, {
|
|
208
|
+
socketPath: openTasksConfig.socketPath,
|
|
209
|
+
syncStatus: openTasksConfig.syncStatus,
|
|
210
|
+
sourceLabel: openTasksConfig.sourceLabel,
|
|
211
|
+
});
|
|
191
212
|
|
|
192
|
-
//
|
|
193
|
-
const
|
|
194
|
-
if (
|
|
195
|
-
|
|
213
|
+
// Wrap shutdown to close the backend before disconnecting the client/daemon
|
|
214
|
+
const finalShutdown = async () => {
|
|
215
|
+
if (backend.close) {
|
|
216
|
+
try { await backend.close(); } catch { /* ignore */ }
|
|
217
|
+
}
|
|
218
|
+
if (shutdownFn) await shutdownFn();
|
|
196
219
|
};
|
|
197
220
|
|
|
198
|
-
// Determine the effective TaskToolMode
|
|
199
|
-
let effectiveMode: TaskToolMode;
|
|
200
|
-
if (toolMode === "auto") {
|
|
201
|
-
effectiveMode = mapSudocodeMode(backendToolMode);
|
|
202
|
-
} else if (toolMode === "abstract" || toolMode === "native" || toolMode === "both") {
|
|
203
|
-
effectiveMode = toolMode;
|
|
204
|
-
} else {
|
|
205
|
-
// 'auto' falls back to backend default
|
|
206
|
-
effectiveMode = mapSudocodeMode(backendToolMode);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
221
|
return {
|
|
210
222
|
backend,
|
|
211
|
-
|
|
223
|
+
openTasksClient,
|
|
224
|
+
socketPath: resolvedSocketPath,
|
|
225
|
+
shutdown: finalShutdown,
|
|
226
|
+
connectProject: daemonManager
|
|
227
|
+
? (projectPath: string) => daemonManager.connectProject(projectPath)
|
|
228
|
+
: undefined,
|
|
229
|
+
getConnectedProjects: daemonManager
|
|
230
|
+
? () => daemonManager.getConnectedProjects()
|
|
231
|
+
: undefined,
|
|
212
232
|
};
|
|
213
233
|
}
|
|
214
234
|
|
|
215
|
-
throw new Error(
|
|
235
|
+
throw new Error(
|
|
236
|
+
`Unknown backend type: ${(backendConfig as TaskBackendConfig).type}`
|
|
237
|
+
);
|
|
216
238
|
}
|
|
217
239
|
|
|
218
240
|
/**
|
|
219
241
|
* Load task configuration from environment variables
|
|
220
242
|
*
|
|
221
243
|
* Environment variables:
|
|
222
|
-
* - MACRO_TASK_BACKEND: 'memory' | '
|
|
223
|
-
* -
|
|
224
|
-
* - SUDOCODE_PROJECT_PATH: Path to sudocode project (default: cwd)
|
|
225
|
-
* - SUDOCODE_TOOL_MODE: 'native' | 'mapped' | 'both' (default: 'mapped')
|
|
244
|
+
* - MACRO_TASK_BACKEND: 'memory' | 'opentasks' (default: 'opentasks')
|
|
245
|
+
* - OPENTASKS_SOCKET_PATH: Path to OpenTasks daemon socket (auto-discovered if not set)
|
|
226
246
|
*
|
|
227
247
|
* @returns Task configuration
|
|
228
248
|
*/
|
|
229
249
|
export function loadTaskConfigFromEnv(): TaskConfig {
|
|
230
|
-
const backendType = process.env.MACRO_TASK_BACKEND ?? "
|
|
231
|
-
|
|
250
|
+
const backendType = process.env.MACRO_TASK_BACKEND ?? "opentasks";
|
|
251
|
+
|
|
252
|
+
if (backendType === "opentasks") {
|
|
253
|
+
const socketPath = process.env.OPENTASKS_SOCKET_PATH;
|
|
232
254
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
255
|
+
return {
|
|
256
|
+
backend: {
|
|
257
|
+
type: "opentasks",
|
|
258
|
+
socketPath,
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
backend: { type: "memory" },
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Load task configuration from a merged MultiagentConfig.
|
|
270
|
+
*
|
|
271
|
+
* Use this instead of loadTaskConfigFromEnv() when you have
|
|
272
|
+
* a merged config from the layered config system.
|
|
273
|
+
*
|
|
274
|
+
* @param config - Merged config with task settings already resolved
|
|
275
|
+
* @returns Task configuration
|
|
276
|
+
*/
|
|
277
|
+
export function loadTaskConfigFromMerged(config: {
|
|
278
|
+
task?: {
|
|
279
|
+
backend?: string;
|
|
280
|
+
opentasks?: {
|
|
281
|
+
socket_path?: string;
|
|
282
|
+
auto_start?: boolean;
|
|
283
|
+
central_path?: string;
|
|
284
|
+
connect_on_spawn?: boolean;
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
}): TaskConfig {
|
|
288
|
+
const backendType = config.task?.backend ?? "opentasks";
|
|
240
289
|
|
|
290
|
+
if (backendType === "opentasks") {
|
|
241
291
|
return {
|
|
242
292
|
backend: {
|
|
243
|
-
type: "
|
|
244
|
-
|
|
245
|
-
|
|
293
|
+
type: "opentasks",
|
|
294
|
+
socketPath: config.task?.opentasks?.socket_path,
|
|
295
|
+
autoStart: config.task?.opentasks?.auto_start,
|
|
296
|
+
centralPath: config.task?.opentasks?.central_path,
|
|
297
|
+
connectOnSpawn: config.task?.opentasks?.connect_on_spawn,
|
|
246
298
|
},
|
|
247
|
-
toolMode,
|
|
248
299
|
};
|
|
249
300
|
}
|
|
250
301
|
|
|
251
302
|
return {
|
|
252
303
|
backend: { type: "memory" },
|
|
253
|
-
toolMode,
|
|
254
304
|
};
|
|
255
305
|
}
|
|
256
306
|
|
|
257
307
|
/**
|
|
258
308
|
* Default task configuration (in-memory backend)
|
|
259
309
|
*/
|
|
260
|
-
export { DEFAULT_TASK_CONFIG,
|
|
310
|
+
export { DEFAULT_TASK_CONFIG, DEFAULT_OPENTASKS_CONFIG };
|
|
@@ -72,6 +72,10 @@ export class InMemoryTaskBackend implements TaskBackend {
|
|
|
72
72
|
// Lifecycle
|
|
73
73
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
74
74
|
|
|
75
|
+
async close(): Promise<void> {
|
|
76
|
+
// No-op for in-memory backend
|
|
77
|
+
}
|
|
78
|
+
|
|
75
79
|
async create(options: CreateTaskOptions): Promise<ExtendedTask> {
|
|
76
80
|
const taskId = `task_${nanoid(12)}`;
|
|
77
81
|
|