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
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Provider Edge Case Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for edge cases in the InMemoryTaskToolProvider.
|
|
5
|
-
*
|
|
6
|
-
* @module task/backend/__tests__/tool-provider-edge-cases.test
|
|
7
|
-
* @see s-8472 Pluggable Task Backend Integration
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
11
|
-
import { createEventStore, type EventStore } from "../../../store/event-store.js";
|
|
12
|
-
import { createInMemoryTaskBackend, InMemoryTaskBackend } from "../memory.js";
|
|
13
|
-
import {
|
|
14
|
-
InMemoryTaskToolProvider,
|
|
15
|
-
createTaskToolProvider,
|
|
16
|
-
type TaskToolContext,
|
|
17
|
-
} from "../tool-provider.js";
|
|
18
|
-
|
|
19
|
-
describe("InMemoryTaskToolProvider Edge Cases", () => {
|
|
20
|
-
let eventStore: EventStore;
|
|
21
|
-
let backend: InMemoryTaskBackend;
|
|
22
|
-
let toolProvider: InMemoryTaskToolProvider;
|
|
23
|
-
const testAgentId = "agent_test";
|
|
24
|
-
|
|
25
|
-
beforeEach(async () => {
|
|
26
|
-
eventStore = await createEventStore({ inMemory: true });
|
|
27
|
-
backend = createInMemoryTaskBackend(eventStore);
|
|
28
|
-
toolProvider = createTaskToolProvider(backend, () => ({
|
|
29
|
-
agent_id: testAgentId,
|
|
30
|
-
}));
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
afterEach(async () => {
|
|
34
|
-
await eventStore.close();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
function getToolByName(name: string) {
|
|
38
|
-
const tools = toolProvider.getTools();
|
|
39
|
-
return tools.find((t) => t.name === name);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
describe("list_tasks include_blocked default behavior", () => {
|
|
43
|
-
it("should have consistent include_blocked behavior", async () => {
|
|
44
|
-
// Create blocker and blocked tasks
|
|
45
|
-
const createTool = getToolByName("create_task")!;
|
|
46
|
-
const listTool = getToolByName("list_tasks")!;
|
|
47
|
-
const addBlockerTool = getToolByName("add_blocker")!;
|
|
48
|
-
|
|
49
|
-
const blocker = (await createTool.handler({
|
|
50
|
-
description: "Blocker",
|
|
51
|
-
})) as { task_id: string };
|
|
52
|
-
const blocked = (await createTool.handler({
|
|
53
|
-
description: "Blocked",
|
|
54
|
-
})) as { task_id: string };
|
|
55
|
-
|
|
56
|
-
await addBlockerTool.handler({
|
|
57
|
-
task_id: blocked.task_id,
|
|
58
|
-
blocker_id: blocker.task_id,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Default list_tasks (include_blocked not specified)
|
|
62
|
-
const defaultResult = (await listTool.handler({})) as {
|
|
63
|
-
tasks: { id: string }[];
|
|
64
|
-
total: number;
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
// The tool description says "Include blocked tasks (default: true)"
|
|
68
|
-
// but the backend defaults to excluding blocked tasks
|
|
69
|
-
// This creates confusion about expected behavior
|
|
70
|
-
|
|
71
|
-
// Current behavior: blocked tasks are excluded by default
|
|
72
|
-
// because includeBlocked is undefined, which backend treats as false
|
|
73
|
-
expect(defaultResult.tasks.find((t) => t.id === blocked.task_id)).toBeUndefined();
|
|
74
|
-
|
|
75
|
-
// Explicit include_blocked: true
|
|
76
|
-
const includedResult = (await listTool.handler({
|
|
77
|
-
include_blocked: true,
|
|
78
|
-
})) as { tasks: { id: string }[]; total: number };
|
|
79
|
-
expect(includedResult.tasks.find((t) => t.id === blocked.task_id)).toBeDefined();
|
|
80
|
-
|
|
81
|
-
// Explicit include_blocked: false
|
|
82
|
-
const excludedResult = (await listTool.handler({
|
|
83
|
-
include_blocked: false,
|
|
84
|
-
})) as { tasks: { id: string }[]; total: number };
|
|
85
|
-
expect(excludedResult.tasks.find((t) => t.id === blocked.task_id)).toBeUndefined();
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
describe("complete_task without start", () => {
|
|
90
|
-
it("should fail if task not started first", async () => {
|
|
91
|
-
const createTool = getToolByName("create_task")!;
|
|
92
|
-
const completeTool = getToolByName("complete_task")!;
|
|
93
|
-
|
|
94
|
-
const task = (await createTool.handler({
|
|
95
|
-
description: "Test",
|
|
96
|
-
})) as { task_id: string };
|
|
97
|
-
|
|
98
|
-
// Try to complete without starting
|
|
99
|
-
await expect(
|
|
100
|
-
completeTool.handler({ task_id: task.task_id })
|
|
101
|
-
).rejects.toThrow("Invalid status transition");
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe("complete_task from assigned state", () => {
|
|
106
|
-
it("should fail if only assigned (not in_progress)", async () => {
|
|
107
|
-
const createTool = getToolByName("create_task")!;
|
|
108
|
-
const assignTool = getToolByName("assign_task")!;
|
|
109
|
-
const completeTool = getToolByName("complete_task")!;
|
|
110
|
-
|
|
111
|
-
const task = (await createTool.handler({
|
|
112
|
-
description: "Test",
|
|
113
|
-
})) as { task_id: string };
|
|
114
|
-
|
|
115
|
-
await assignTool.handler({ task_id: task.task_id });
|
|
116
|
-
|
|
117
|
-
// Try to complete from assigned state
|
|
118
|
-
await expect(
|
|
119
|
-
completeTool.handler({ task_id: task.task_id })
|
|
120
|
-
).rejects.toThrow("Invalid status transition");
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
describe("missing tools", () => {
|
|
125
|
-
it("should NOT have a start_task tool", () => {
|
|
126
|
-
// Note: There's no start_task tool, you have to use update_task_status
|
|
127
|
-
const startTool = getToolByName("start_task");
|
|
128
|
-
expect(startTool).toBeUndefined();
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it("should NOT have an unassign_task tool", () => {
|
|
132
|
-
// Note: There's no unassign_task tool, even though backend supports it
|
|
133
|
-
const unassignTool = getToolByName("unassign_task");
|
|
134
|
-
expect(unassignTool).toBeUndefined();
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("should NOT have a fail_task tool", () => {
|
|
138
|
-
// Note: There's no fail_task tool
|
|
139
|
-
const failTool = getToolByName("fail_task");
|
|
140
|
-
expect(failTool).toBeUndefined();
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it("should NOT have a delete_task tool", () => {
|
|
144
|
-
// Note: There's no delete_task tool
|
|
145
|
-
const deleteTool = getToolByName("delete_task");
|
|
146
|
-
expect(deleteTool).toBeUndefined();
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it("should NOT have a get_subtask_status tool", () => {
|
|
150
|
-
// Note: There's no get_subtask_status tool
|
|
151
|
-
const subtaskTool = getToolByName("get_subtask_status");
|
|
152
|
-
expect(subtaskTool).toBeUndefined();
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe("update_task_status validation", () => {
|
|
157
|
-
it("should reject invalid status transitions", async () => {
|
|
158
|
-
const createTool = getToolByName("create_task")!;
|
|
159
|
-
const updateTool = getToolByName("update_task_status")!;
|
|
160
|
-
|
|
161
|
-
const task = (await createTool.handler({
|
|
162
|
-
description: "Test",
|
|
163
|
-
})) as { task_id: string };
|
|
164
|
-
|
|
165
|
-
// pending -> completed is invalid (must go through in_progress)
|
|
166
|
-
await expect(
|
|
167
|
-
updateTool.handler({ task_id: task.task_id, status: "completed" })
|
|
168
|
-
).rejects.toThrow("Invalid status transition");
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it("should allow pending -> in_progress", async () => {
|
|
172
|
-
const createTool = getToolByName("create_task")!;
|
|
173
|
-
const updateTool = getToolByName("update_task_status")!;
|
|
174
|
-
const getTool = getToolByName("get_task")!;
|
|
175
|
-
|
|
176
|
-
const task = (await createTool.handler({
|
|
177
|
-
description: "Test",
|
|
178
|
-
})) as { task_id: string };
|
|
179
|
-
|
|
180
|
-
await updateTool.handler({
|
|
181
|
-
task_id: task.task_id,
|
|
182
|
-
status: "in_progress",
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
const result = (await getTool.handler({
|
|
186
|
-
task_id: task.task_id,
|
|
187
|
-
})) as { status: string };
|
|
188
|
-
expect(result.status).toBe("in_progress");
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it("should allow pending -> assigned via assign_task", async () => {
|
|
192
|
-
const createTool = getToolByName("create_task")!;
|
|
193
|
-
const assignTool = getToolByName("assign_task")!;
|
|
194
|
-
const getTool = getToolByName("get_task")!;
|
|
195
|
-
|
|
196
|
-
const task = (await createTool.handler({
|
|
197
|
-
description: "Test",
|
|
198
|
-
})) as { task_id: string };
|
|
199
|
-
|
|
200
|
-
await assignTool.handler({ task_id: task.task_id });
|
|
201
|
-
|
|
202
|
-
const result = (await getTool.handler({
|
|
203
|
-
task_id: task.task_id,
|
|
204
|
-
})) as { status: string; assigned_agent: string };
|
|
205
|
-
expect(result.status).toBe("assigned");
|
|
206
|
-
expect(result.assigned_agent).toBe(testAgentId);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
describe("add_blocker error handling", () => {
|
|
211
|
-
it("should fail for non-existent task", async () => {
|
|
212
|
-
const createTool = getToolByName("create_task")!;
|
|
213
|
-
const addBlockerTool = getToolByName("add_blocker")!;
|
|
214
|
-
|
|
215
|
-
const blocker = (await createTool.handler({
|
|
216
|
-
description: "Blocker",
|
|
217
|
-
})) as { task_id: string };
|
|
218
|
-
|
|
219
|
-
await expect(
|
|
220
|
-
addBlockerTool.handler({
|
|
221
|
-
task_id: "task_nonexistent",
|
|
222
|
-
blocker_id: blocker.task_id,
|
|
223
|
-
})
|
|
224
|
-
).rejects.toThrow();
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
it("should fail for non-existent blocker", async () => {
|
|
228
|
-
const createTool = getToolByName("create_task")!;
|
|
229
|
-
const addBlockerTool = getToolByName("add_blocker")!;
|
|
230
|
-
|
|
231
|
-
const task = (await createTool.handler({
|
|
232
|
-
description: "Task",
|
|
233
|
-
})) as { task_id: string };
|
|
234
|
-
|
|
235
|
-
await expect(
|
|
236
|
-
addBlockerTool.handler({
|
|
237
|
-
task_id: task.task_id,
|
|
238
|
-
blocker_id: "task_nonexistent",
|
|
239
|
-
})
|
|
240
|
-
).rejects.toThrow();
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
describe("get_task_blockers response format", () => {
|
|
245
|
-
it("should return isBlocked based on blocker statuses", async () => {
|
|
246
|
-
const createTool = getToolByName("create_task")!;
|
|
247
|
-
const addBlockerTool = getToolByName("add_blocker")!;
|
|
248
|
-
const getBlockersTool = getToolByName("get_task_blockers")!;
|
|
249
|
-
const updateTool = getToolByName("update_task_status")!;
|
|
250
|
-
|
|
251
|
-
const blocker = (await createTool.handler({
|
|
252
|
-
description: "Blocker",
|
|
253
|
-
})) as { task_id: string };
|
|
254
|
-
const task = (await createTool.handler({
|
|
255
|
-
description: "Task",
|
|
256
|
-
})) as { task_id: string };
|
|
257
|
-
|
|
258
|
-
await addBlockerTool.handler({
|
|
259
|
-
task_id: task.task_id,
|
|
260
|
-
blocker_id: blocker.task_id,
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
// Check blockers while blocker is pending
|
|
264
|
-
const beforeComplete = (await getBlockersTool.handler({
|
|
265
|
-
task_id: task.task_id,
|
|
266
|
-
})) as { isBlocked: boolean; blockers: { isCompleted: boolean }[] };
|
|
267
|
-
|
|
268
|
-
expect(beforeComplete.isBlocked).toBe(true);
|
|
269
|
-
expect(beforeComplete.blockers[0].isCompleted).toBe(false);
|
|
270
|
-
|
|
271
|
-
// Complete the blocker
|
|
272
|
-
await updateTool.handler({
|
|
273
|
-
task_id: blocker.task_id,
|
|
274
|
-
status: "in_progress",
|
|
275
|
-
});
|
|
276
|
-
await backend.complete(blocker.task_id);
|
|
277
|
-
|
|
278
|
-
// Check blockers after completion
|
|
279
|
-
const afterComplete = (await getBlockersTool.handler({
|
|
280
|
-
task_id: task.task_id,
|
|
281
|
-
})) as { isBlocked: boolean; blockers: { isCompleted: boolean }[] };
|
|
282
|
-
|
|
283
|
-
expect(afterComplete.isBlocked).toBe(false);
|
|
284
|
-
expect(afterComplete.blockers[0].isCompleted).toBe(true);
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
describe("list_ready_tasks filtering", () => {
|
|
289
|
-
it("should only return pending/assigned tasks", async () => {
|
|
290
|
-
const createTool = getToolByName("create_task")!;
|
|
291
|
-
const listReadyTool = getToolByName("list_ready_tasks")!;
|
|
292
|
-
const updateTool = getToolByName("update_task_status")!;
|
|
293
|
-
|
|
294
|
-
// Create tasks in various states
|
|
295
|
-
const pending = (await createTool.handler({
|
|
296
|
-
description: "Pending",
|
|
297
|
-
})) as { task_id: string };
|
|
298
|
-
|
|
299
|
-
const inProgress = (await createTool.handler({
|
|
300
|
-
description: "In Progress",
|
|
301
|
-
})) as { task_id: string };
|
|
302
|
-
await updateTool.handler({
|
|
303
|
-
task_id: inProgress.task_id,
|
|
304
|
-
status: "in_progress",
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
const completed = (await createTool.handler({
|
|
308
|
-
description: "Completed",
|
|
309
|
-
})) as { task_id: string };
|
|
310
|
-
await updateTool.handler({
|
|
311
|
-
task_id: completed.task_id,
|
|
312
|
-
status: "in_progress",
|
|
313
|
-
});
|
|
314
|
-
await backend.complete(completed.task_id);
|
|
315
|
-
|
|
316
|
-
const ready = (await listReadyTool.handler({})) as {
|
|
317
|
-
tasks: { id: string; description: string }[];
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
// Should only have pending task
|
|
321
|
-
expect(ready.tasks.length).toBe(1);
|
|
322
|
-
expect(ready.tasks[0].id).toBe(pending.task_id);
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
describe("create_task with external_id", () => {
|
|
327
|
-
it("should pass external_id to backend", async () => {
|
|
328
|
-
const createTool = getToolByName("create_task")!;
|
|
329
|
-
const getTool = getToolByName("get_task")!;
|
|
330
|
-
|
|
331
|
-
const task = (await createTool.handler({
|
|
332
|
-
description: "External task",
|
|
333
|
-
external_id: "i-test123",
|
|
334
|
-
})) as { task_id: string };
|
|
335
|
-
|
|
336
|
-
// Note: The response doesn't include external_id
|
|
337
|
-
// But get_task also doesn't include external_id in response
|
|
338
|
-
// This could be a gap - how do users know what external_id is bound?
|
|
339
|
-
const fetched = (await getTool.handler({
|
|
340
|
-
task_id: task.task_id,
|
|
341
|
-
})) as Record<string, unknown>;
|
|
342
|
-
|
|
343
|
-
// external_id is not in the get_task response
|
|
344
|
-
expect(fetched.external_id).toBeUndefined();
|
|
345
|
-
// It's stored in outputs if you check there
|
|
346
|
-
expect((fetched.outputs as Record<string, unknown>)?.external_id).toBeUndefined();
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
describe("assign_task with agent_id parameter", () => {
|
|
351
|
-
it("should use provided agent_id", async () => {
|
|
352
|
-
const createTool = getToolByName("create_task")!;
|
|
353
|
-
const assignTool = getToolByName("assign_task")!;
|
|
354
|
-
const getTool = getToolByName("get_task")!;
|
|
355
|
-
|
|
356
|
-
const task = (await createTool.handler({
|
|
357
|
-
description: "Test",
|
|
358
|
-
})) as { task_id: string };
|
|
359
|
-
|
|
360
|
-
await assignTool.handler({
|
|
361
|
-
task_id: task.task_id,
|
|
362
|
-
agent_id: "other_agent",
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
const fetched = (await getTool.handler({
|
|
366
|
-
task_id: task.task_id,
|
|
367
|
-
})) as { assigned_agent: string };
|
|
368
|
-
|
|
369
|
-
expect(fetched.assigned_agent).toBe("other_agent");
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
it("should default to context agent_id if not provided", async () => {
|
|
373
|
-
const createTool = getToolByName("create_task")!;
|
|
374
|
-
const assignTool = getToolByName("assign_task")!;
|
|
375
|
-
const getTool = getToolByName("get_task")!;
|
|
376
|
-
|
|
377
|
-
const task = (await createTool.handler({
|
|
378
|
-
description: "Test",
|
|
379
|
-
})) as { task_id: string };
|
|
380
|
-
|
|
381
|
-
await assignTool.handler({ task_id: task.task_id });
|
|
382
|
-
|
|
383
|
-
const fetched = (await getTool.handler({
|
|
384
|
-
task_id: task.task_id,
|
|
385
|
-
})) as { assigned_agent: string };
|
|
386
|
-
|
|
387
|
-
expect(fetched.assigned_agent).toBe(testAgentId);
|
|
388
|
-
});
|
|
389
|
-
});
|
|
390
|
-
|
|
391
|
-
describe("complete_task with outputs", () => {
|
|
392
|
-
it("should store summary and outputs", async () => {
|
|
393
|
-
const createTool = getToolByName("create_task")!;
|
|
394
|
-
const updateTool = getToolByName("update_task_status")!;
|
|
395
|
-
const completeTool = getToolByName("complete_task")!;
|
|
396
|
-
const getTool = getToolByName("get_task")!;
|
|
397
|
-
|
|
398
|
-
const task = (await createTool.handler({
|
|
399
|
-
description: "Test",
|
|
400
|
-
})) as { task_id: string };
|
|
401
|
-
|
|
402
|
-
await updateTool.handler({
|
|
403
|
-
task_id: task.task_id,
|
|
404
|
-
status: "in_progress",
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
await completeTool.handler({
|
|
408
|
-
task_id: task.task_id,
|
|
409
|
-
summary: "Work completed",
|
|
410
|
-
outputs: { result: "success", count: 42 },
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
const fetched = (await getTool.handler({
|
|
414
|
-
task_id: task.task_id,
|
|
415
|
-
})) as { status: string; outputs: Record<string, unknown> };
|
|
416
|
-
|
|
417
|
-
expect(fetched.status).toBe("completed");
|
|
418
|
-
expect(fetched.outputs?.result).toBe("success");
|
|
419
|
-
expect(fetched.outputs?.count).toBe(42);
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
describe("getExcludedTools", () => {
|
|
424
|
-
it("should return correct excluded tools", () => {
|
|
425
|
-
const excluded = toolProvider.getExcludedTools();
|
|
426
|
-
expect(excluded).toContain("create_task");
|
|
427
|
-
expect(excluded).toContain("get_task");
|
|
428
|
-
});
|
|
429
|
-
});
|
|
430
|
-
});
|