macro-agent 0.0.11 → 0.0.12
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/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
- package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
- package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
- package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
- package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
- package/.macro-agent/teams/self-driving/team.yaml +103 -0
- package/.macro-agent/teams/structured/prompts/developer.md +26 -0
- package/.macro-agent/teams/structured/prompts/lead.md +25 -0
- package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
- package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
- package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
- package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
- package/.macro-agent/teams/structured/team.yaml +89 -0
- package/.sudocode/issues.jsonl +6 -0
- package/.sudocode/specs.jsonl +7 -0
- package/CLAUDE.md +110 -30
- package/README.md +60 -3
- package/dist/acp/macro-agent.d.ts +4 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +50 -4
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/session-mapper.d.ts +20 -1
- package/dist/acp/session-mapper.d.ts.map +1 -1
- package/dist/acp/session-mapper.js +90 -1
- package/dist/acp/session-mapper.js.map +1 -1
- package/dist/acp/types.d.ts +24 -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 +25 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +93 -7
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +22 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agent-detection/command-builder.d.ts +30 -0
- package/dist/agent-detection/command-builder.d.ts.map +1 -0
- package/dist/agent-detection/command-builder.js +71 -0
- package/dist/agent-detection/command-builder.js.map +1 -0
- package/dist/agent-detection/detector.d.ts +84 -0
- package/dist/agent-detection/detector.d.ts.map +1 -0
- package/dist/agent-detection/detector.js +240 -0
- package/dist/agent-detection/detector.js.map +1 -0
- package/dist/agent-detection/index.d.ts +12 -0
- package/dist/agent-detection/index.d.ts.map +1 -0
- package/dist/agent-detection/index.js +14 -0
- package/dist/agent-detection/index.js.map +1 -0
- package/dist/agent-detection/registry.d.ts +53 -0
- package/dist/agent-detection/registry.d.ts.map +1 -0
- package/dist/agent-detection/registry.js +177 -0
- package/dist/agent-detection/registry.js.map +1 -0
- package/dist/agent-detection/types.d.ts +121 -0
- package/dist/agent-detection/types.d.ts.map +1 -0
- package/dist/agent-detection/types.js +20 -0
- package/dist/agent-detection/types.js.map +1 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +95 -0
- package/dist/api/server.js.map +1 -1
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.js +38 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/project-config.d.ts +46 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +68 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/lifecycle/cascade.d.ts +1 -1
- package/dist/lifecycle/cascade.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.d.ts +4 -0
- package/dist/lifecycle/handlers/index.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.js +2 -0
- package/dist/lifecycle/handlers/index.js.map +1 -1
- package/dist/lifecycle/handlers/worker.d.ts +4 -0
- package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
- package/dist/lifecycle/handlers/worker.js +35 -3
- package/dist/lifecycle/handlers/worker.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +32 -2
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/event-translator.d.ts.map +1 -1
- package/dist/map/adapter/event-translator.js +1 -0
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
- package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-detection.js +91 -0
- package/dist/map/adapter/extensions/agent-detection.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 +39 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/resume.d.ts +47 -0
- package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
- package/dist/map/adapter/extensions/resume.js +59 -0
- package/dist/map/adapter/extensions/resume.js.map +1 -0
- package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
- package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
- package/dist/map/adapter/extensions/workspace-files.js +338 -0
- package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +6 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +45 -0
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/claim_task.d.ts +35 -0
- package/dist/mcp/tools/claim_task.d.ts.map +1 -0
- package/dist/mcp/tools/claim_task.js +58 -0
- package/dist/mcp/tools/claim_task.js.map +1 -0
- package/dist/mcp/tools/done.d.ts +11 -2
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +15 -10
- package/dist/mcp/tools/done.js.map +1 -1
- package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
- package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
- package/dist/mcp/tools/list_claimable_tasks.js +63 -0
- package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
- package/dist/mcp/tools/unclaim_task.d.ts +31 -0
- package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
- package/dist/mcp/tools/unclaim_task.js +47 -0
- package/dist/mcp/tools/unclaim_task.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +79 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +166 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/roles/capabilities.d.ts +1 -0
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +3 -0
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/types.d.ts +1 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/router/message-router.d.ts +41 -0
- package/dist/router/message-router.d.ts.map +1 -1
- package/dist/router/message-router.js +136 -5
- package/dist/router/message-router.js.map +1 -1
- package/dist/store/event-store.d.ts +8 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +120 -4
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +1 -1
- 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/store/types/events.js.map +1 -1
- package/dist/store/types/index.d.ts +1 -0
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/types/index.js +1 -0
- package/dist/store/types/index.js.map +1 -1
- package/dist/store/types/sessions.d.ts +44 -0
- package/dist/store/types/sessions.d.ts.map +1 -0
- package/dist/store/types/sessions.js +9 -0
- package/dist/store/types/sessions.js.map +1 -0
- package/dist/store/types/tasks.d.ts +2 -0
- package/dist/store/types/tasks.d.ts.map +1 -1
- package/dist/task/backend/memory.d.ts +4 -1
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +81 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/types.d.ts +30 -0
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js.map +1 -1
- package/dist/teams/index.d.ts +4 -0
- package/dist/teams/index.d.ts.map +1 -0
- package/dist/teams/index.js +4 -0
- package/dist/teams/index.js.map +1 -0
- package/dist/teams/team-loader.d.ts +20 -0
- package/dist/teams/team-loader.d.ts.map +1 -0
- package/dist/teams/team-loader.js +293 -0
- package/dist/teams/team-loader.js.map +1 -0
- package/dist/teams/team-runtime.d.ts +139 -0
- package/dist/teams/team-runtime.d.ts.map +1 -0
- package/dist/teams/team-runtime.js +613 -0
- package/dist/teams/team-runtime.js.map +1 -0
- package/dist/teams/types.d.ts +266 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +20 -0
- package/dist/teams/types.js.map +1 -0
- package/dist/workspace/dataplane-adapter.d.ts +1 -1
- package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
- package/dist/workspace/dataplane-adapter.js +1 -1
- package/dist/workspace/dataplane-adapter.js.map +1 -1
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/strategies/index.d.ts +6 -0
- package/dist/workspace/strategies/index.d.ts.map +1 -0
- package/dist/workspace/strategies/index.js +5 -0
- package/dist/workspace/strategies/index.js.map +1 -0
- package/dist/workspace/strategies/optimistic.d.ts +26 -0
- package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
- package/dist/workspace/strategies/optimistic.js +121 -0
- package/dist/workspace/strategies/optimistic.js.map +1 -0
- package/dist/workspace/strategies/queue.d.ts +26 -0
- package/dist/workspace/strategies/queue.d.ts.map +1 -0
- package/dist/workspace/strategies/queue.js +67 -0
- package/dist/workspace/strategies/queue.js.map +1 -0
- package/dist/workspace/strategies/registry.d.ts +37 -0
- package/dist/workspace/strategies/registry.d.ts.map +1 -0
- package/dist/workspace/strategies/registry.js +63 -0
- package/dist/workspace/strategies/registry.js.map +1 -0
- package/dist/workspace/strategies/trunk.d.ts +20 -0
- package/dist/workspace/strategies/trunk.d.ts.map +1 -0
- package/dist/workspace/strategies/trunk.js +108 -0
- package/dist/workspace/strategies/trunk.js.map +1 -0
- package/dist/workspace/strategies/types.d.ts +104 -0
- package/dist/workspace/strategies/types.d.ts.map +1 -0
- package/dist/workspace/strategies/types.js +11 -0
- package/dist/workspace/strategies/types.js.map +1 -0
- package/dist/workspace/types.d.ts +1 -1
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.d.ts +1 -1
- package/dist/workspace/workspace-manager.d.ts.map +1 -1
- package/docs/implementation-details.md +1127 -0
- package/docs/implementation-summary.md +448 -0
- package/docs/plan-self-driving-support.md +433 -0
- package/docs/spec-self-driving-support.md +462 -0
- package/docs/team-templates.md +860 -0
- package/docs/teams.md +233 -0
- package/package.json +4 -2
- package/src/acp/__tests__/integration.test.ts +161 -1
- package/src/acp/__tests__/macro-agent.test.ts +95 -0
- package/src/acp/__tests__/session-persistence.test.ts +276 -0
- package/src/acp/macro-agent.ts +79 -7
- package/src/acp/session-mapper.ts +108 -1
- package/src/acp/types.ts +33 -1
- package/src/agent/agent-manager.ts +158 -6
- package/src/agent/types.ts +27 -0
- package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
- package/src/agent-detection/__tests__/detector.test.ts +768 -0
- package/src/agent-detection/__tests__/registry.test.ts +254 -0
- package/src/agent-detection/command-builder.ts +90 -0
- package/src/agent-detection/detector.ts +307 -0
- package/src/agent-detection/index.ts +36 -0
- package/src/agent-detection/registry.ts +200 -0
- package/src/agent-detection/types.ts +184 -0
- package/src/api/server.ts +110 -0
- package/src/cli/index.ts +44 -0
- package/src/cli/mcp.ts +47 -0
- package/src/config/index.ts +9 -0
- package/src/config/project-config.ts +107 -0
- package/src/lifecycle/cascade.ts +1 -1
- package/src/lifecycle/handlers/index.ts +8 -0
- package/src/lifecycle/handlers/worker.ts +48 -3
- package/src/map/adapter/__tests__/extensions.test.ts +359 -0
- package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
- package/src/map/adapter/acp-over-map.ts +45 -2
- package/src/map/adapter/event-translator.ts +1 -0
- package/src/map/adapter/extensions/agent-detection.ts +201 -0
- package/src/map/adapter/extensions/index.ts +63 -0
- package/src/map/adapter/extensions/resume.ts +114 -0
- package/src/map/adapter/extensions/workspace-files.ts +449 -0
- package/src/mcp/mcp-server.ts +67 -0
- package/src/mcp/tools/claim_task.ts +86 -0
- package/src/mcp/tools/done.ts +24 -10
- package/src/mcp/tools/list_claimable_tasks.ts +93 -0
- package/src/mcp/tools/unclaim_task.ts +71 -0
- package/src/metrics/index.ts +9 -0
- package/src/metrics/metrics.ts +280 -0
- package/src/roles/capabilities.ts +3 -0
- package/src/roles/types.ts +2 -1
- package/src/router/__tests__/message-router.test.ts +561 -0
- package/src/router/message-router.ts +223 -6
- package/src/store/event-store.ts +151 -3
- package/src/store/types/agents.ts +1 -1
- package/src/store/types/events.ts +2 -1
- package/src/store/types/index.ts +1 -0
- package/src/store/types/sessions.ts +53 -0
- package/src/store/types/tasks.ts +3 -0
- package/src/task/backend/memory.ts +116 -0
- package/src/task/backend/types.ts +43 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
- package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
- package/src/teams/__tests__/team-system.test.ts +1280 -0
- package/src/teams/index.ts +13 -0
- package/src/teams/team-loader.ts +434 -0
- package/src/teams/team-runtime.ts +727 -0
- package/src/teams/types.ts +377 -0
- package/src/workspace/dataplane-adapter.ts +1 -1
- package/src/workspace/index.ts +1 -1
- package/src/workspace/strategies/index.ts +18 -0
- package/src/workspace/strategies/optimistic.ts +136 -0
- package/src/workspace/strategies/queue.ts +81 -0
- package/src/workspace/strategies/registry.ts +89 -0
- package/src/workspace/strategies/trunk.ts +123 -0
- package/src/workspace/strategies/types.ts +145 -0
- package/src/workspace/types.ts +1 -1
- package/src/workspace/workspace-manager.ts +1 -1
- package/.claude/settings.local.json +0 -59
- 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/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/__init__.py +0 -0
- 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 -2065
- 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
|
@@ -204,8 +204,61 @@ export interface MessageRouter {
|
|
|
204
204
|
* Supports late binding since mail services may be created after router.
|
|
205
205
|
*/
|
|
206
206
|
setTurnRecorder(recorder: TurnRecorderCallback): void;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Set signal filter for status notification delivery.
|
|
210
|
+
* Called before delivering each status notification — return false to suppress.
|
|
211
|
+
* Supports late binding since TeamRuntime is created after router.
|
|
212
|
+
*/
|
|
213
|
+
setSignalFilter(filter: SignalFilter): void;
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Set emission validator for outbound status events.
|
|
217
|
+
* Called before emitting a status event — can reject, warn, or audit.
|
|
218
|
+
* Supports late binding since TeamRuntime is created after router.
|
|
219
|
+
*/
|
|
220
|
+
setEmissionValidator(validator: EmissionValidator): void;
|
|
207
221
|
}
|
|
208
222
|
|
|
223
|
+
/**
|
|
224
|
+
* Signal filter callback for status notification delivery.
|
|
225
|
+
* Return true to deliver, false to suppress.
|
|
226
|
+
*
|
|
227
|
+
* @param from - Agent emitting the status
|
|
228
|
+
* @param to - Agent that would receive the notification
|
|
229
|
+
* @param signal - Signal name from details.signal (undefined if not tagged)
|
|
230
|
+
*/
|
|
231
|
+
export type SignalFilter = (
|
|
232
|
+
from: AgentId,
|
|
233
|
+
to: AgentId,
|
|
234
|
+
signal: string | undefined
|
|
235
|
+
) => boolean;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Emission validator result.
|
|
239
|
+
* - "allow": emit normally
|
|
240
|
+
* - "reject": block the emission (strict mode)
|
|
241
|
+
* - "warn": log warning but allow (permissive mode)
|
|
242
|
+
* - "audit": record audit event but allow (audit mode)
|
|
243
|
+
*/
|
|
244
|
+
export type EmissionValidatorResult = {
|
|
245
|
+
action: "allow" | "reject" | "warn" | "audit";
|
|
246
|
+
message?: string;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Emission validator callback for outbound status events.
|
|
251
|
+
* Called with the emitting agent's ID and the signal name.
|
|
252
|
+
* Returns an action to take (allow, reject, warn, audit).
|
|
253
|
+
*
|
|
254
|
+
* @param agentId - Agent emitting the status
|
|
255
|
+
* @param signal - Signal name from details.signal (undefined if not tagged)
|
|
256
|
+
*/
|
|
257
|
+
export type EmissionValidator = (
|
|
258
|
+
agentId: AgentId,
|
|
259
|
+
signal: string | undefined
|
|
260
|
+
) => EmissionValidatorResult;
|
|
261
|
+
|
|
209
262
|
/**
|
|
210
263
|
* Callback invoked when a message determines a wake action
|
|
211
264
|
*/
|
|
@@ -264,6 +317,12 @@ export function createMessageRouter(
|
|
|
264
317
|
// Turn recorder for conversation tracking (late-bound)
|
|
265
318
|
let turnRecorder: TurnRecorderCallback | undefined;
|
|
266
319
|
|
|
320
|
+
// Signal filter for status notification delivery (late-bound)
|
|
321
|
+
let signalFilter: SignalFilter | undefined;
|
|
322
|
+
|
|
323
|
+
// Emission validator for outbound status events (late-bound)
|
|
324
|
+
let emissionValidator: EmissionValidator | undefined;
|
|
325
|
+
|
|
267
326
|
// Track acknowledged messages: Map<agentId, Set<messageId>>
|
|
268
327
|
const acknowledgedMessages = new Map<AgentId, Set<EventId>>();
|
|
269
328
|
|
|
@@ -929,6 +988,36 @@ export function createMessageRouter(
|
|
|
929
988
|
function emitStatus(request: EmitStatusRequest): void {
|
|
930
989
|
const { from, status_type, summary, details } = request;
|
|
931
990
|
|
|
991
|
+
// Check emission restrictions if validator installed
|
|
992
|
+
if (emissionValidator) {
|
|
993
|
+
const signal = (details as Record<string, unknown> | undefined)?.signal as string | undefined;
|
|
994
|
+
const result = emissionValidator(from.agent_id, signal);
|
|
995
|
+
|
|
996
|
+
if (result.action === "reject") {
|
|
997
|
+
// Strict mode: block the emission entirely
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
if (result.action === "audit") {
|
|
1002
|
+
// Audit mode: record audit event, then continue with emission
|
|
1003
|
+
eventStore.emit({
|
|
1004
|
+
type: "status",
|
|
1005
|
+
source: { agent_id: "system" },
|
|
1006
|
+
payload: {
|
|
1007
|
+
status_type: "discovery",
|
|
1008
|
+
summary: result.message ?? `Emission audit: agent ${from.agent_id} emitted signal '${signal}'`,
|
|
1009
|
+
audit: {
|
|
1010
|
+
type: "emission_violation",
|
|
1011
|
+
agent_id: from.agent_id,
|
|
1012
|
+
signal,
|
|
1013
|
+
status_type,
|
|
1014
|
+
},
|
|
1015
|
+
},
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
// "warn" and "allow" proceed normally (warning is logged by the validator installer)
|
|
1019
|
+
}
|
|
1020
|
+
|
|
932
1021
|
// Emit status event to event store
|
|
933
1022
|
const event = eventStore.emit({
|
|
934
1023
|
type: "status",
|
|
@@ -943,15 +1032,20 @@ export function createMessageRouter(
|
|
|
943
1032
|
},
|
|
944
1033
|
});
|
|
945
1034
|
|
|
946
|
-
|
|
947
|
-
routeStatusToSubtreeSubscribers(from.agent_id, {
|
|
1035
|
+
const statusNotification: StatusNotification = {
|
|
948
1036
|
agent_id: from.agent_id,
|
|
949
1037
|
task_id: from.task_id,
|
|
950
1038
|
status_type,
|
|
951
1039
|
summary,
|
|
952
1040
|
details,
|
|
953
1041
|
timestamp: event.timestamp,
|
|
954
|
-
}
|
|
1042
|
+
};
|
|
1043
|
+
|
|
1044
|
+
// Route to subtree subscribers (hierarchical: parents/ancestors)
|
|
1045
|
+
const subtreeRecipients = routeStatusToSubtreeSubscribers(from.agent_id, statusNotification);
|
|
1046
|
+
|
|
1047
|
+
// Route to topic co-subscribers (non-hierarchical: peers sharing topics)
|
|
1048
|
+
routeStatusToTopicSubscribers(from.agent_id, statusNotification, subtreeRecipients);
|
|
955
1049
|
}
|
|
956
1050
|
|
|
957
1051
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -1088,13 +1182,15 @@ export function createMessageRouter(
|
|
|
1088
1182
|
/**
|
|
1089
1183
|
* Route status event to subtree subscribers.
|
|
1090
1184
|
* Parents who have subscribed to an agent's subtree receive status notifications.
|
|
1185
|
+
* Returns the set of agents that were notified (for dedup with topic routing).
|
|
1091
1186
|
*/
|
|
1092
1187
|
function routeStatusToSubtreeSubscribers(
|
|
1093
1188
|
agentId: AgentId,
|
|
1094
1189
|
status: StatusNotification
|
|
1095
|
-
):
|
|
1190
|
+
): Set<AgentId> {
|
|
1191
|
+
const notified = new Set<AgentId>();
|
|
1096
1192
|
const agent = eventStore.getAgent(agentId);
|
|
1097
|
-
if (!agent) return;
|
|
1193
|
+
if (!agent) return notified;
|
|
1098
1194
|
|
|
1099
1195
|
// Find all agents with subtree subscription that includes this agent
|
|
1100
1196
|
// This includes:
|
|
@@ -1128,17 +1224,25 @@ export function createMessageRouter(
|
|
|
1128
1224
|
}
|
|
1129
1225
|
}
|
|
1130
1226
|
|
|
1227
|
+
// Extract signal name from details (if tagged)
|
|
1228
|
+
const statusSignal = (status.details as Record<string, unknown> | undefined)?.signal as string | undefined;
|
|
1229
|
+
|
|
1131
1230
|
// Send status notification to each subscriber
|
|
1132
1231
|
for (const subscriberId of agentsToNotify) {
|
|
1133
1232
|
// Skip self-notification
|
|
1134
1233
|
if (subscriberId === agentId) continue;
|
|
1135
1234
|
|
|
1235
|
+
// Apply signal filter if installed
|
|
1236
|
+
if (signalFilter && !signalFilter(agentId, subscriberId, statusSignal)) {
|
|
1237
|
+
continue;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1136
1240
|
const statusContent = JSON.stringify({
|
|
1137
1241
|
type: "status_notification",
|
|
1138
1242
|
...status,
|
|
1139
1243
|
});
|
|
1140
1244
|
|
|
1141
|
-
eventStore.emit({
|
|
1245
|
+
const event = eventStore.emit({
|
|
1142
1246
|
type: "message",
|
|
1143
1247
|
source: {
|
|
1144
1248
|
agent_id: agentId,
|
|
@@ -1151,6 +1255,109 @@ export function createMessageRouter(
|
|
|
1151
1255
|
via: "subtree",
|
|
1152
1256
|
},
|
|
1153
1257
|
});
|
|
1258
|
+
|
|
1259
|
+
// Wake sleeping agents on status notifications
|
|
1260
|
+
if (sessionChecker && wakeHandler) {
|
|
1261
|
+
try {
|
|
1262
|
+
const decision = getWakeDecisionWithHint(
|
|
1263
|
+
subscriberId,
|
|
1264
|
+
{ priority: "normal" as MessagePriority },
|
|
1265
|
+
sessionChecker
|
|
1266
|
+
);
|
|
1267
|
+
if (decision.shouldWake || decision.shouldInterrupt) {
|
|
1268
|
+
wakeHandler(subscriberId, decision, event.id);
|
|
1269
|
+
}
|
|
1270
|
+
} catch {
|
|
1271
|
+
// Never fail status delivery due to wake errors
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
notified.add(subscriberId);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
return notified;
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
/**
|
|
1282
|
+
* Route status event to topic co-subscribers.
|
|
1283
|
+
* Agents sharing topic subscriptions with the emitting agent receive status notifications.
|
|
1284
|
+
* This enables non-hierarchical visibility: peers on the same topic see each other's status.
|
|
1285
|
+
* Skips agents already notified via subtree routing to avoid duplicates.
|
|
1286
|
+
*/
|
|
1287
|
+
function routeStatusToTopicSubscribers(
|
|
1288
|
+
agentId: AgentId,
|
|
1289
|
+
status: StatusNotification,
|
|
1290
|
+
alreadyNotified: Set<AgentId>
|
|
1291
|
+
): void {
|
|
1292
|
+
// Find all topics the emitting agent is subscribed to
|
|
1293
|
+
const subscriptions = eventStore.getSubscriptions(agentId);
|
|
1294
|
+
const topicSubscriptions = subscriptions.filter(
|
|
1295
|
+
(s) => s.type === "topic"
|
|
1296
|
+
);
|
|
1297
|
+
|
|
1298
|
+
if (topicSubscriptions.length === 0) return;
|
|
1299
|
+
|
|
1300
|
+
// Collect unique recipients across all shared topics
|
|
1301
|
+
const topicRecipients = new Set<AgentId>();
|
|
1302
|
+
for (const sub of topicSubscriptions) {
|
|
1303
|
+
const subscribers = eventStore.getSubscribers({
|
|
1304
|
+
type: "topic",
|
|
1305
|
+
target: sub.target,
|
|
1306
|
+
});
|
|
1307
|
+
for (const subscriberId of subscribers) {
|
|
1308
|
+
// Skip self and already-notified (from subtree routing)
|
|
1309
|
+
if (subscriberId !== agentId && !alreadyNotified.has(subscriberId)) {
|
|
1310
|
+
topicRecipients.add(subscriberId);
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
if (topicRecipients.size === 0) return;
|
|
1316
|
+
|
|
1317
|
+
// Extract signal name from details (if tagged)
|
|
1318
|
+
const statusSignal = (status.details as Record<string, unknown> | undefined)?.signal as string | undefined;
|
|
1319
|
+
|
|
1320
|
+
const statusContent = JSON.stringify({
|
|
1321
|
+
type: "status_notification",
|
|
1322
|
+
...status,
|
|
1323
|
+
});
|
|
1324
|
+
|
|
1325
|
+
// Deliver to each topic co-subscriber
|
|
1326
|
+
for (const recipientId of topicRecipients) {
|
|
1327
|
+
// Apply signal filter if installed
|
|
1328
|
+
if (signalFilter && !signalFilter(agentId, recipientId, statusSignal)) {
|
|
1329
|
+
continue;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
const event = eventStore.emit({
|
|
1333
|
+
type: "message",
|
|
1334
|
+
source: {
|
|
1335
|
+
agent_id: agentId,
|
|
1336
|
+
},
|
|
1337
|
+
target: {
|
|
1338
|
+
agent_id: recipientId,
|
|
1339
|
+
},
|
|
1340
|
+
payload: {
|
|
1341
|
+
content: statusContent,
|
|
1342
|
+
via: "topic",
|
|
1343
|
+
},
|
|
1344
|
+
});
|
|
1345
|
+
|
|
1346
|
+
// Wake sleeping agents on status notifications
|
|
1347
|
+
if (sessionChecker && wakeHandler) {
|
|
1348
|
+
try {
|
|
1349
|
+
const decision = getWakeDecisionWithHint(
|
|
1350
|
+
recipientId,
|
|
1351
|
+
{ priority: "normal" as MessagePriority },
|
|
1352
|
+
sessionChecker
|
|
1353
|
+
);
|
|
1354
|
+
if (decision.shouldWake || decision.shouldInterrupt) {
|
|
1355
|
+
wakeHandler(recipientId, decision, event.id);
|
|
1356
|
+
}
|
|
1357
|
+
} catch {
|
|
1358
|
+
// Never fail status delivery due to wake errors
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1154
1361
|
}
|
|
1155
1362
|
}
|
|
1156
1363
|
|
|
@@ -1158,6 +1365,14 @@ export function createMessageRouter(
|
|
|
1158
1365
|
turnRecorder = recorder;
|
|
1159
1366
|
}
|
|
1160
1367
|
|
|
1368
|
+
function setSignalFilter(filter: SignalFilter): void {
|
|
1369
|
+
signalFilter = filter;
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
function setEmissionValidator(validator: EmissionValidator): void {
|
|
1373
|
+
emissionValidator = validator;
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1161
1376
|
return {
|
|
1162
1377
|
sendToAddress,
|
|
1163
1378
|
emitStatus,
|
|
@@ -1171,5 +1386,7 @@ export function createMessageRouter(
|
|
|
1171
1386
|
getSubscribers,
|
|
1172
1387
|
setupDefaultSubscriptions,
|
|
1173
1388
|
setTurnRecorder,
|
|
1389
|
+
setSignalFilter,
|
|
1390
|
+
setEmissionValidator,
|
|
1174
1391
|
};
|
|
1175
1392
|
}
|
package/src/store/event-store.ts
CHANGED
|
@@ -42,6 +42,8 @@ import type {
|
|
|
42
42
|
TurnChangeCallback,
|
|
43
43
|
ConversationType,
|
|
44
44
|
ConversationStatus,
|
|
45
|
+
Session,
|
|
46
|
+
SessionState,
|
|
45
47
|
} from './types/index.js';
|
|
46
48
|
import { CURRENT_EVENT_VERSION } from './types/events.js';
|
|
47
49
|
import { migrateEvent } from './migrations.js';
|
|
@@ -102,6 +104,7 @@ function createBetterSqlite3Persister(
|
|
|
102
104
|
export type AgentChangeCallback = (agentId: AgentId, agent: Agent | null) => void;
|
|
103
105
|
export type TaskChangeCallback = (taskId: TaskId, task: Task | null) => void;
|
|
104
106
|
export type MessageCallback = (agentId: AgentId, messages: QueuedMessage[]) => void;
|
|
107
|
+
export type SessionChangeCallback = (sessionId: string, session: Session | null) => void;
|
|
105
108
|
|
|
106
109
|
// Unsubscribe function type
|
|
107
110
|
export type Unsubscribe = () => void;
|
|
@@ -173,6 +176,10 @@ export interface EventStore {
|
|
|
173
176
|
getSubscriptions(agentId: AgentId): Subscription[];
|
|
174
177
|
getSubscribers(subscription: Subscription): AgentId[];
|
|
175
178
|
|
|
179
|
+
// Session views
|
|
180
|
+
getSession(sessionId: string): Session | null;
|
|
181
|
+
listSessions(filter?: { state?: SessionState; agent_id?: AgentId }): Session[];
|
|
182
|
+
|
|
176
183
|
// Conversation views
|
|
177
184
|
getConversation(conversationId: string): Conversation | null;
|
|
178
185
|
listConversations(filter?: ConversationFilter): Conversation[];
|
|
@@ -184,6 +191,7 @@ export interface EventStore {
|
|
|
184
191
|
onAgentChange(agentId: AgentId, callback: AgentChangeCallback): Unsubscribe;
|
|
185
192
|
onTaskChange(callback: TaskChangeCallback): Unsubscribe;
|
|
186
193
|
onMessageChange(agentId: AgentId, callback: MessageCallback): Unsubscribe;
|
|
194
|
+
onSessionChange(callback: SessionChangeCallback): Unsubscribe;
|
|
187
195
|
onConversationChange(callback: ConversationChangeCallback): Unsubscribe;
|
|
188
196
|
onTurnChange(callback: TurnChangeCallback): Unsubscribe;
|
|
189
197
|
|
|
@@ -325,6 +333,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
|
|
|
325
333
|
const agentListeners = new Set<AgentChangeCallback>();
|
|
326
334
|
const agentIdListeners = new Map<AgentId, Set<AgentChangeCallback>>();
|
|
327
335
|
const taskListeners = new Set<TaskChangeCallback>();
|
|
336
|
+
const sessionListeners = new Set<SessionChangeCallback>();
|
|
328
337
|
const messageListeners = new Map<AgentId, Set<MessageCallback>>();
|
|
329
338
|
const conversationListeners = new Set<ConversationChangeCallback>();
|
|
330
339
|
const turnListeners = new Set<TurnChangeCallback>();
|
|
@@ -354,7 +363,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
|
|
|
354
363
|
});
|
|
355
364
|
|
|
356
365
|
// Update materialized views
|
|
357
|
-
applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifyConversationChange, notifyTurnChange);
|
|
366
|
+
applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange);
|
|
358
367
|
|
|
359
368
|
return event;
|
|
360
369
|
}
|
|
@@ -694,6 +703,52 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
|
|
|
694
703
|
return () => turnListeners.delete(callback);
|
|
695
704
|
}
|
|
696
705
|
|
|
706
|
+
// ─── Session View Queries ───
|
|
707
|
+
|
|
708
|
+
function getSession(sessionId: string): Session | null {
|
|
709
|
+
const row = store.getRow('sessions', sessionId);
|
|
710
|
+
if (!row.id) return null;
|
|
711
|
+
return rowToSession(row);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
function listSessions(filter?: { state?: SessionState; agent_id?: AgentId }): Session[] {
|
|
715
|
+
const sessions: Session[] = [];
|
|
716
|
+
const rowIds = store.getRowIds('sessions');
|
|
717
|
+
|
|
718
|
+
for (const rowId of rowIds) {
|
|
719
|
+
const row = store.getRow('sessions', rowId);
|
|
720
|
+
if (!row.id) continue;
|
|
721
|
+
|
|
722
|
+
const session = rowToSession(row);
|
|
723
|
+
|
|
724
|
+
if (filter) {
|
|
725
|
+
if (filter.state && session.state !== filter.state) continue;
|
|
726
|
+
if (filter.agent_id && session.current_agent_id !== filter.agent_id && session.head_manager_id !== filter.agent_id) continue;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
sessions.push(session);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
return sessions;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Notify session change listeners
|
|
737
|
+
*/
|
|
738
|
+
function notifySessionChange(sessionId: string, session: Session | null): void {
|
|
739
|
+
for (const callback of sessionListeners) {
|
|
740
|
+
callback(sessionId, session);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* Subscribe to session changes
|
|
746
|
+
*/
|
|
747
|
+
function onSessionChange(callback: SessionChangeCallback): Unsubscribe {
|
|
748
|
+
sessionListeners.add(callback);
|
|
749
|
+
return () => sessionListeners.delete(callback);
|
|
750
|
+
}
|
|
751
|
+
|
|
697
752
|
// ─── Conversation View Queries ───
|
|
698
753
|
|
|
699
754
|
function getConversation(conversationId: string): Conversation | null {
|
|
@@ -1048,7 +1103,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
|
|
|
1048
1103
|
});
|
|
1049
1104
|
|
|
1050
1105
|
// Update materialized views
|
|
1051
|
-
applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifyConversationChange, notifyTurnChange);
|
|
1106
|
+
applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange);
|
|
1052
1107
|
}
|
|
1053
1108
|
}
|
|
1054
1109
|
|
|
@@ -1094,6 +1149,8 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
|
|
|
1094
1149
|
listTasks,
|
|
1095
1150
|
getMessages,
|
|
1096
1151
|
getFullMessage,
|
|
1152
|
+
getSession,
|
|
1153
|
+
listSessions,
|
|
1097
1154
|
getConversation,
|
|
1098
1155
|
listConversations,
|
|
1099
1156
|
listTurns,
|
|
@@ -1109,6 +1166,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
|
|
|
1109
1166
|
onAgentChange,
|
|
1110
1167
|
onTaskChange,
|
|
1111
1168
|
onMessageChange,
|
|
1169
|
+
onSessionChange,
|
|
1112
1170
|
onConversationChange,
|
|
1113
1171
|
onTurnChange,
|
|
1114
1172
|
|
|
@@ -1142,6 +1200,7 @@ function initializeTables(store: Store): void {
|
|
|
1142
1200
|
store.getRowIds('tasks');
|
|
1143
1201
|
store.getRowIds('messages');
|
|
1144
1202
|
store.getRowIds('subscriptions');
|
|
1203
|
+
store.getRowIds('sessions');
|
|
1145
1204
|
store.getRowIds('conversations');
|
|
1146
1205
|
store.getRowIds('turns');
|
|
1147
1206
|
store.getRowIds('threads');
|
|
@@ -1162,6 +1221,9 @@ function rebuildViews(store: Store): void {
|
|
|
1162
1221
|
for (const rowId of store.getRowIds('messages')) {
|
|
1163
1222
|
store.delRow('messages', rowId);
|
|
1164
1223
|
}
|
|
1224
|
+
for (const rowId of store.getRowIds('sessions')) {
|
|
1225
|
+
store.delRow('sessions', rowId);
|
|
1226
|
+
}
|
|
1165
1227
|
for (const rowId of store.getRowIds('conversations')) {
|
|
1166
1228
|
store.delRow('conversations', rowId);
|
|
1167
1229
|
}
|
|
@@ -1202,7 +1264,7 @@ function rebuildViews(store: Store): void {
|
|
|
1202
1264
|
// Apply each event (no-op callbacks since we're rebuilding)
|
|
1203
1265
|
const noop = () => {};
|
|
1204
1266
|
for (const event of events) {
|
|
1205
|
-
applyEventToViews(store, event, noop, noop, noop, noop, noop);
|
|
1267
|
+
applyEventToViews(store, event, noop, noop, noop, noop, noop, noop);
|
|
1206
1268
|
}
|
|
1207
1269
|
}
|
|
1208
1270
|
|
|
@@ -1215,6 +1277,7 @@ function applyEventToViews(
|
|
|
1215
1277
|
notifyAgentChange: (agentId: AgentId, agent: Agent | null) => void,
|
|
1216
1278
|
notifyTaskChange: (taskId: TaskId, task: Task | null) => void,
|
|
1217
1279
|
notifyMessageChange: (agentId: AgentId) => void,
|
|
1280
|
+
notifySessionChange: (sessionId: string, session: Session | null) => void,
|
|
1218
1281
|
notifyConversationChange: (conversationId: string, conversation: Conversation | null) => void,
|
|
1219
1282
|
notifyTurnChange: (conversationId: string, turn: ConversationTurn) => void,
|
|
1220
1283
|
): void {
|
|
@@ -1234,6 +1297,9 @@ function applyEventToViews(
|
|
|
1234
1297
|
case 'task':
|
|
1235
1298
|
applyTaskEvent(store, event, notifyTaskChange);
|
|
1236
1299
|
break;
|
|
1300
|
+
case 'session':
|
|
1301
|
+
applySessionEvent(store, event, notifySessionChange);
|
|
1302
|
+
break;
|
|
1237
1303
|
case 'conversation':
|
|
1238
1304
|
applyConversationEvent(store, event, notifyConversationChange);
|
|
1239
1305
|
break;
|
|
@@ -1671,6 +1737,88 @@ function rowToTask(row: Record<string, unknown>): Task {
|
|
|
1671
1737
|
};
|
|
1672
1738
|
}
|
|
1673
1739
|
|
|
1740
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1741
|
+
// Session Event Handlers
|
|
1742
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1743
|
+
|
|
1744
|
+
/**
|
|
1745
|
+
* Apply session event to sessions view
|
|
1746
|
+
*/
|
|
1747
|
+
function applySessionEvent(
|
|
1748
|
+
store: Store,
|
|
1749
|
+
event: Event,
|
|
1750
|
+
notify: (sessionId: string, session: Session | null) => void,
|
|
1751
|
+
): void {
|
|
1752
|
+
const payload = event.payload as {
|
|
1753
|
+
action: string;
|
|
1754
|
+
session_id: string;
|
|
1755
|
+
head_manager_id?: AgentId;
|
|
1756
|
+
agent_id?: AgentId;
|
|
1757
|
+
target_agent_id?: AgentId;
|
|
1758
|
+
previous_agent_id?: AgentId;
|
|
1759
|
+
};
|
|
1760
|
+
|
|
1761
|
+
const sessionId = payload.session_id;
|
|
1762
|
+
|
|
1763
|
+
switch (payload.action) {
|
|
1764
|
+
case 'created': {
|
|
1765
|
+
store.setRow('sessions', sessionId, {
|
|
1766
|
+
id: sessionId,
|
|
1767
|
+
head_manager_id: payload.head_manager_id ?? '',
|
|
1768
|
+
current_agent_id: payload.head_manager_id ?? '',
|
|
1769
|
+
state: 'active',
|
|
1770
|
+
created_at: event.timestamp,
|
|
1771
|
+
updated_at: event.timestamp,
|
|
1772
|
+
closed_at: 0,
|
|
1773
|
+
});
|
|
1774
|
+
break;
|
|
1775
|
+
}
|
|
1776
|
+
case 'mounted': {
|
|
1777
|
+
store.setPartialRow('sessions', sessionId, {
|
|
1778
|
+
current_agent_id: payload.target_agent_id ?? '',
|
|
1779
|
+
state: 'mounted',
|
|
1780
|
+
updated_at: event.timestamp,
|
|
1781
|
+
});
|
|
1782
|
+
break;
|
|
1783
|
+
}
|
|
1784
|
+
case 'unmounted': {
|
|
1785
|
+
const existing = store.getRow('sessions', sessionId);
|
|
1786
|
+
store.setPartialRow('sessions', sessionId, {
|
|
1787
|
+
current_agent_id: existing.head_manager_id as string,
|
|
1788
|
+
state: 'active',
|
|
1789
|
+
updated_at: event.timestamp,
|
|
1790
|
+
});
|
|
1791
|
+
break;
|
|
1792
|
+
}
|
|
1793
|
+
case 'closed': {
|
|
1794
|
+
store.setPartialRow('sessions', sessionId, {
|
|
1795
|
+
state: 'closed',
|
|
1796
|
+
updated_at: event.timestamp,
|
|
1797
|
+
closed_at: event.timestamp,
|
|
1798
|
+
});
|
|
1799
|
+
break;
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
|
|
1803
|
+
const session = rowToSession(store.getRow('sessions', sessionId));
|
|
1804
|
+
notify(sessionId, session);
|
|
1805
|
+
}
|
|
1806
|
+
|
|
1807
|
+
/**
|
|
1808
|
+
* Convert a TinyBase row to a Session object
|
|
1809
|
+
*/
|
|
1810
|
+
function rowToSession(row: Record<string, unknown>): Session {
|
|
1811
|
+
return {
|
|
1812
|
+
id: row.id as string,
|
|
1813
|
+
head_manager_id: row.head_manager_id as AgentId,
|
|
1814
|
+
current_agent_id: row.current_agent_id as AgentId,
|
|
1815
|
+
state: row.state as SessionState,
|
|
1816
|
+
created_at: row.created_at as Timestamp,
|
|
1817
|
+
updated_at: row.updated_at as Timestamp,
|
|
1818
|
+
closed_at: (row.closed_at as number) || undefined,
|
|
1819
|
+
};
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1674
1822
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
1675
1823
|
// Conversation Event Handlers
|
|
1676
1824
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import type { AgentId, SessionId, TaskId, Timestamp } from "./primitives.js";
|
|
6
6
|
|
|
7
7
|
// Agent states
|
|
8
|
-
export type AgentState = "spawning" | "running" | "stopped";
|
|
8
|
+
export type AgentState = "spawning" | "running" | "stopped" | "failed";
|
|
9
9
|
|
|
10
10
|
export type StopReason =
|
|
11
11
|
| "completed"
|
package/src/store/types/index.ts
CHANGED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-related type definitions
|
|
3
|
+
*
|
|
4
|
+
* Sessions track the mapping between ACP protocol sessions and
|
|
5
|
+
* macro-agent agents. Unlike the in-memory SessionMapper, these
|
|
6
|
+
* records are persisted in the EventStore for recovery after restart.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { AgentId, Timestamp } from "./primitives.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Session state enum — tracks the lifecycle of an ACP session.
|
|
13
|
+
*
|
|
14
|
+
* State transitions:
|
|
15
|
+
* active → mounted → active (via unmount)
|
|
16
|
+
* active → closed
|
|
17
|
+
* mounted → closed
|
|
18
|
+
*/
|
|
19
|
+
export type SessionState = "active" | "mounted" | "closed";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Persistent session record in the EventStore materialized view.
|
|
23
|
+
*
|
|
24
|
+
* Maps an ACP session ID to its head manager agent, current agent
|
|
25
|
+
* target (which may differ when mounted), and lifecycle state.
|
|
26
|
+
*/
|
|
27
|
+
export interface Session {
|
|
28
|
+
/** ACP session ID (primary key) */
|
|
29
|
+
id: string;
|
|
30
|
+
|
|
31
|
+
/** Head manager agent ID — the original agent for this session */
|
|
32
|
+
head_manager_id: AgentId;
|
|
33
|
+
|
|
34
|
+
/** Currently targeted agent ID (may differ from head_manager_id when mounted) */
|
|
35
|
+
current_agent_id: AgentId;
|
|
36
|
+
|
|
37
|
+
/** Current session state */
|
|
38
|
+
state: SessionState;
|
|
39
|
+
|
|
40
|
+
/** When the session was created */
|
|
41
|
+
created_at: Timestamp;
|
|
42
|
+
|
|
43
|
+
/** When the session state last changed */
|
|
44
|
+
updated_at: Timestamp;
|
|
45
|
+
|
|
46
|
+
/** When the session was closed (if applicable) */
|
|
47
|
+
closed_at?: Timestamp;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Session event actions used in the event payload.
|
|
52
|
+
*/
|
|
53
|
+
export type SessionAction = "created" | "mounted" | "unmounted" | "closed";
|