claude-code-swarm 0.3.3 → 0.3.5
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-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +22 -1
- package/.claude-plugin/run-agent-inbox-mcp.sh +76 -0
- package/.claude-plugin/run-minimem-mcp.sh +98 -0
- package/.claude-plugin/run-opentasks-mcp.sh +65 -0
- package/CLAUDE.md +200 -36
- package/README.md +65 -0
- package/e2e/helpers/cleanup.mjs +17 -3
- package/e2e/helpers/map-mock-server.mjs +201 -25
- package/e2e/helpers/sidecar.mjs +222 -0
- package/e2e/helpers/workspace.mjs +2 -1
- package/e2e/tier5-sidecar-inbox.test.mjs +900 -0
- package/e2e/tier6-inbox-mcp.test.mjs +173 -0
- package/e2e/tier6-live-agent.test.mjs +759 -0
- package/e2e/vitest.config.e2e.mjs +1 -1
- package/hooks/hooks.json +15 -8
- package/package.json +13 -1
- package/references/agent-inbox/CLAUDE.md +151 -0
- package/references/agent-inbox/README.md +238 -0
- package/references/agent-inbox/docs/CLAUDE-CODE-SWARM-PROPOSAL.md +137 -0
- package/references/agent-inbox/docs/DESIGN.md +1156 -0
- package/references/agent-inbox/hooks/inbox-hook.mjs +119 -0
- package/references/agent-inbox/hooks/register-hook.mjs +69 -0
- package/references/agent-inbox/package-lock.json +3347 -0
- package/references/agent-inbox/package.json +58 -0
- package/references/agent-inbox/rules/agent-inbox.md +78 -0
- package/references/agent-inbox/src/federation/address.ts +61 -0
- package/references/agent-inbox/src/federation/connection-manager.ts +573 -0
- package/references/agent-inbox/src/federation/delivery-queue.ts +222 -0
- package/references/agent-inbox/src/federation/index.ts +6 -0
- package/references/agent-inbox/src/federation/routing-engine.ts +188 -0
- package/references/agent-inbox/src/federation/trust.ts +71 -0
- package/references/agent-inbox/src/index.ts +390 -0
- package/references/agent-inbox/src/ipc/ipc-server.ts +207 -0
- package/references/agent-inbox/src/jsonrpc/mail-server.ts +382 -0
- package/references/agent-inbox/src/map/map-client.ts +414 -0
- package/references/agent-inbox/src/mcp/mcp-server.ts +272 -0
- package/references/agent-inbox/src/mesh/delivery-bridge.ts +110 -0
- package/references/agent-inbox/src/mesh/mesh-connector.ts +41 -0
- package/references/agent-inbox/src/mesh/mesh-transport.ts +157 -0
- package/references/agent-inbox/src/mesh/type-mapper.ts +239 -0
- package/references/agent-inbox/src/push/notifier.ts +233 -0
- package/references/agent-inbox/src/registry/warm-registry.ts +255 -0
- package/references/agent-inbox/src/router/message-router.ts +175 -0
- package/references/agent-inbox/src/storage/interface.ts +48 -0
- package/references/agent-inbox/src/storage/memory.ts +145 -0
- package/references/agent-inbox/src/storage/sqlite.ts +671 -0
- package/references/agent-inbox/src/traceability/traceability.ts +183 -0
- package/references/agent-inbox/src/types.ts +303 -0
- package/references/agent-inbox/test/federation/address.test.ts +101 -0
- package/references/agent-inbox/test/federation/connection-manager.test.ts +546 -0
- package/references/agent-inbox/test/federation/delivery-queue.test.ts +159 -0
- package/references/agent-inbox/test/federation/integration.test.ts +857 -0
- package/references/agent-inbox/test/federation/routing-engine.test.ts +117 -0
- package/references/agent-inbox/test/federation/sdk-integration.test.ts +744 -0
- package/references/agent-inbox/test/federation/trust.test.ts +89 -0
- package/references/agent-inbox/test/ipc-jsonrpc.test.ts +113 -0
- package/references/agent-inbox/test/ipc-server.test.ts +197 -0
- package/references/agent-inbox/test/mail-server.test.ts +285 -0
- package/references/agent-inbox/test/map-client.test.ts +408 -0
- package/references/agent-inbox/test/mesh/delivery-bridge.test.ts +178 -0
- package/references/agent-inbox/test/mesh/e2e-mesh.test.ts +527 -0
- package/references/agent-inbox/test/mesh/e2e-real-meshpeer.test.ts +629 -0
- package/references/agent-inbox/test/mesh/federation-mesh.test.ts +269 -0
- package/references/agent-inbox/test/mesh/mesh-connector.test.ts +66 -0
- package/references/agent-inbox/test/mesh/mesh-transport.test.ts +191 -0
- package/references/agent-inbox/test/mesh/meshpeer-integration.test.ts +442 -0
- package/references/agent-inbox/test/mesh/mock-mesh.ts +125 -0
- package/references/agent-inbox/test/mesh/mock-meshpeer.ts +266 -0
- package/references/agent-inbox/test/mesh/type-mapper.test.ts +226 -0
- package/references/agent-inbox/test/message-router.test.ts +184 -0
- package/references/agent-inbox/test/push-notifier.test.ts +139 -0
- package/references/agent-inbox/test/registry/warm-registry.test.ts +171 -0
- package/references/agent-inbox/test/sqlite-prefix.test.ts +192 -0
- package/references/agent-inbox/test/sqlite-storage.test.ts +243 -0
- package/references/agent-inbox/test/storage.test.ts +196 -0
- package/references/agent-inbox/test/traceability.test.ts +123 -0
- package/references/agent-inbox/test/wake.test.ts +330 -0
- package/references/agent-inbox/tsconfig.json +20 -0
- package/references/agent-inbox/tsup.config.ts +10 -0
- package/references/agent-inbox/vitest.config.ts +8 -0
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +329 -0
- package/references/minimem/README.md +565 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/media/banner.png +0 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +76 -0
- package/references/minimem/scripts/postbuild.js +49 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge-frontmatter.test.ts +148 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +148 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +760 -0
- package/references/minimem/src/cli/__tests__/contained-layout.test.ts +286 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +415 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +166 -0
- package/references/minimem/src/cli/commands/mcp.ts +221 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +223 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/store.ts +189 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +611 -0
- package/references/minimem/src/cli/index.ts +299 -0
- package/references/minimem/src/cli/shared.ts +189 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +205 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +358 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +237 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +132 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1291 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +347 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/src/store/__tests__/manifest.test.ts +177 -0
- package/references/minimem/src/store/__tests__/materialize.test.ts +52 -0
- package/references/minimem/src/store/__tests__/store-graph.test.ts +228 -0
- package/references/minimem/src/store/index.ts +27 -0
- package/references/minimem/src/store/manifest.ts +203 -0
- package/references/minimem/src/store/materialize.ts +185 -0
- package/references/minimem/src/store/store-graph.ts +252 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +29 -0
- package/references/openteams/src/cli/generate.ts +23 -1
- package/references/openteams/src/generators/agent-prompt-generator.test.ts +94 -0
- package/references/openteams/src/generators/agent-prompt-generator.ts +42 -13
- package/references/openteams/src/generators/package-generator.ts +9 -1
- package/references/openteams/src/generators/skill-generator.test.ts +28 -0
- package/references/openteams/src/generators/skill-generator.ts +10 -4
- package/references/skill-tree/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +19 -0
- package/references/skill-tree/.sudocode/specs.jsonl +3 -0
- package/references/skill-tree/CLAUDE.md +132 -0
- package/references/skill-tree/README.md +396 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +157 -0
- package/references/skill-tree/package-lock.json +1852 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/plan.md +78 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/references/swarmkit/src/commands/init/phases/configure.ts +0 -22
- package/references/swarmkit/src/commands/init/phases/global-setup.ts +5 -3
- package/references/swarmkit/src/commands/init/wizard.ts +2 -2
- package/references/swarmkit/src/packages/setup.test.ts +53 -7
- package/references/swarmkit/src/packages/setup.ts +37 -1
- package/scripts/bootstrap.mjs +26 -1
- package/scripts/generate-agents.mjs +5 -1
- package/scripts/map-hook.mjs +97 -64
- package/scripts/map-sidecar.mjs +179 -25
- package/scripts/team-loader.mjs +12 -41
- package/skills/swarm/SKILL.md +89 -25
- package/src/__tests__/agent-generator.test.mjs +6 -13
- package/src/__tests__/bootstrap.test.mjs +124 -1
- package/src/__tests__/config.test.mjs +200 -27
- package/src/__tests__/e2e-live-map.test.mjs +536 -0
- package/src/__tests__/e2e-mesh-sidecar.test.mjs +570 -0
- package/src/__tests__/e2e-native-task-hooks.test.mjs +376 -0
- package/src/__tests__/e2e-sidecar-bridge.test.mjs +477 -0
- package/src/__tests__/helpers.mjs +13 -0
- package/src/__tests__/inbox.test.mjs +22 -89
- package/src/__tests__/index.test.mjs +35 -9
- package/src/__tests__/integration.test.mjs +513 -0
- package/src/__tests__/map-events.test.mjs +514 -150
- package/src/__tests__/mesh-connection.test.mjs +308 -0
- package/src/__tests__/opentasks-client.test.mjs +517 -0
- package/src/__tests__/paths.test.mjs +185 -41
- package/src/__tests__/sidecar-client.test.mjs +35 -0
- package/src/__tests__/sidecar-server.test.mjs +124 -0
- package/src/__tests__/skilltree-client.test.mjs +80 -0
- package/src/agent-generator.mjs +104 -33
- package/src/bootstrap.mjs +150 -10
- package/src/config.mjs +81 -17
- package/src/context-output.mjs +58 -8
- package/src/inbox.mjs +9 -54
- package/src/index.mjs +39 -8
- package/src/map-connection.mjs +4 -3
- package/src/map-events.mjs +350 -80
- package/src/mesh-connection.mjs +148 -0
- package/src/opentasks-client.mjs +269 -0
- package/src/paths.mjs +182 -27
- package/src/sessionlog.mjs +14 -9
- package/src/sidecar-client.mjs +81 -27
- package/src/sidecar-server.mjs +175 -16
- package/src/skilltree-client.mjs +173 -0
- package/src/template.mjs +68 -4
- package/vitest.config.mjs +1 -0
package/hooks/hooks.json
CHANGED
|
@@ -22,24 +22,31 @@
|
|
|
22
22
|
]
|
|
23
23
|
}
|
|
24
24
|
],
|
|
25
|
-
"
|
|
25
|
+
"PostToolUse": [
|
|
26
26
|
{
|
|
27
|
-
"matcher": "
|
|
27
|
+
"matcher": "opentasks",
|
|
28
28
|
"hooks": [
|
|
29
29
|
{
|
|
30
30
|
"type": "command",
|
|
31
|
-
"command": "if [ -f .swarm/claude-swarm/config.json ] && node -e \"const c=JSON.parse(require('fs').readFileSync('.swarm/claude-swarm/config.json','utf-8'))
|
|
31
|
+
"command": "if [ -f .swarm/claude-swarm/config.json ] && node -e \"const c=JSON.parse(require('fs').readFileSync('.swarm/claude-swarm/config.json','utf-8'));process.exit((c.opentasks?.enabled||process.env.SWARM_OPENTASKS_ENABLED)&&(c.map?.enabled||c.map?.server||process.env.SWARM_MAP_SERVER||process.env.SWARM_MAP_ENABLED)?0:1)\" 2>/dev/null; then node \"${CLAUDE_PLUGIN_ROOT}/scripts/map-hook.mjs\" opentasks-mcp-used; fi"
|
|
32
32
|
}
|
|
33
33
|
]
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"matcher": "TaskCreate",
|
|
37
|
+
"hooks": [
|
|
38
|
+
{
|
|
39
|
+
"type": "command",
|
|
40
|
+
"command": "if [ -f .swarm/claude-swarm/config.json ] && node -e \"const c=JSON.parse(require('fs').readFileSync('.swarm/claude-swarm/config.json','utf-8')).map||{};process.exit(c.enabled||c.server||process.env.SWARM_MAP_SERVER||process.env.SWARM_MAP_ENABLED?0:1)\" 2>/dev/null; then node \"${CLAUDE_PLUGIN_ROOT}/scripts/map-hook.mjs\" native-task-created; fi"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
37
44
|
{
|
|
38
|
-
"matcher": "
|
|
45
|
+
"matcher": "TaskUpdate",
|
|
39
46
|
"hooks": [
|
|
40
47
|
{
|
|
41
48
|
"type": "command",
|
|
42
|
-
"command": "if [ -f .swarm/claude-swarm/config.json ] && node -e \"const c=JSON.parse(require('fs').readFileSync('.swarm/claude-swarm/config.json','utf-8')).map||{};process.exit(c.enabled||c.server||process.env.SWARM_MAP_SERVER||process.env.SWARM_MAP_ENABLED?0:1)\" 2>/dev/null; then node \"${CLAUDE_PLUGIN_ROOT}/scripts/map-hook.mjs\"
|
|
49
|
+
"command": "if [ -f .swarm/claude-swarm/config.json ] && node -e \"const c=JSON.parse(require('fs').readFileSync('.swarm/claude-swarm/config.json','utf-8')).map||{};process.exit(c.enabled||c.server||process.env.SWARM_MAP_SERVER||process.env.SWARM_MAP_ENABLED?0:1)\" 2>/dev/null; then node \"${CLAUDE_PLUGIN_ROOT}/scripts/map-hook.mjs\" native-task-updated; fi"
|
|
43
50
|
}
|
|
44
51
|
]
|
|
45
52
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-swarm",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Claude Code plugin for launching agent teams from openteams topologies with MAP observability",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -18,15 +18,24 @@
|
|
|
18
18
|
"swarm-generate-agents": "./scripts/generate-agents.mjs"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
+
"agentic-mesh": "^0.2.0",
|
|
21
22
|
"js-yaml": "^4.1.0"
|
|
22
23
|
},
|
|
23
24
|
"peerDependencies": {
|
|
24
25
|
"@multi-agent-protocol/sdk": "*",
|
|
26
|
+
"agent-inbox": "*",
|
|
27
|
+
"opentasks": "*",
|
|
25
28
|
"swarmkit": "*"
|
|
26
29
|
},
|
|
27
30
|
"peerDependenciesMeta": {
|
|
28
31
|
"@multi-agent-protocol/sdk": {
|
|
29
32
|
"optional": true
|
|
33
|
+
},
|
|
34
|
+
"agent-inbox": {
|
|
35
|
+
"optional": true
|
|
36
|
+
},
|
|
37
|
+
"opentasks": {
|
|
38
|
+
"optional": true
|
|
30
39
|
}
|
|
31
40
|
},
|
|
32
41
|
"scripts": {
|
|
@@ -37,6 +46,7 @@
|
|
|
37
46
|
"test:e2e:tier2": "vitest run --config e2e/vitest.config.e2e.mjs -t tier2",
|
|
38
47
|
"test:e2e:tier3": "vitest run --config e2e/vitest.config.e2e.mjs -t tier3",
|
|
39
48
|
"test:e2e:tier4": "vitest run --config e2e/vitest.config.e2e.mjs -t tier4",
|
|
49
|
+
"test:e2e:tier5": "vitest run --config e2e/vitest.config.e2e.mjs -t tier5",
|
|
40
50
|
"version:patch": "npm version patch --no-git-tag-version && node scripts/sync-version.mjs",
|
|
41
51
|
"version:minor": "npm version minor --no-git-tag-version && node scripts/sync-version.mjs",
|
|
42
52
|
"version:major": "npm version major --no-git-tag-version && node scripts/sync-version.mjs"
|
|
@@ -45,6 +55,8 @@
|
|
|
45
55
|
"node": ">=18.0.0"
|
|
46
56
|
},
|
|
47
57
|
"devDependencies": {
|
|
58
|
+
"@multi-agent-protocol/sdk": "^0.1.4",
|
|
59
|
+
"agent-inbox": "^0.1.7",
|
|
48
60
|
"vitest": "^4.0.18",
|
|
49
61
|
"ws": "^8.0.0"
|
|
50
62
|
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# CLAUDE.md — Agent Guide for agent-inbox
|
|
2
|
+
|
|
3
|
+
## What this repo is
|
|
4
|
+
|
|
5
|
+
Agent Inbox is a MAP-native message router for multi-agent systems. It provides structured inbox/outbox semantics, threading, delivery tracking, and cross-system federation on top of MAP (Multi-Agent Protocol) transport.
|
|
6
|
+
|
|
7
|
+
## Build and test
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install # Install dependencies
|
|
11
|
+
npm run build # TypeScript compile (tsc)
|
|
12
|
+
npm test # Run all tests (vitest)
|
|
13
|
+
npm run test:watch # Watch mode
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
All tests use vitest. Run the full suite before committing — there are 356 tests across 27 files. Tests run fast (<6s total).
|
|
17
|
+
|
|
18
|
+
## Project layout
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
src/
|
|
22
|
+
index.ts Entry point — wires storage, router, federation, IPC, MCP, MAP
|
|
23
|
+
types.ts All type definitions (Message, Agent, Federation types, etc.)
|
|
24
|
+
storage/interface.ts Storage interface (getAgent, putMessage, getInbox, etc.)
|
|
25
|
+
storage/memory.ts InMemoryStorage — Map-based, used in all tests
|
|
26
|
+
storage/sqlite.ts SQLiteStorage — persistent with FTS5 search
|
|
27
|
+
router/message-router.ts Core routing: resolveRecipients, normalizeContent, routeMessage
|
|
28
|
+
federation/
|
|
29
|
+
connection-manager.ts Manages MAP connections + federation peer links + queue flush
|
|
30
|
+
routing-engine.ts Table/broadcast/hierarchical routing strategies
|
|
31
|
+
delivery-queue.ts Offline message queue with TTL, retry, overflow policies
|
|
32
|
+
address.ts Parse "agent@system" addresses (parseAddress, isRemoteAddress)
|
|
33
|
+
trust.ts Allow-list federation trust (canConnect, canRoute stubs)
|
|
34
|
+
registry/warm-registry.ts Agent lifecycle: active → away → expired with TTL timers
|
|
35
|
+
traceability/traceability.ts Auto-create conversations/turns/threads from message events
|
|
36
|
+
ipc/ipc-server.ts UNIX socket server (NDJSON protocol)
|
|
37
|
+
map/map-client.ts MAP SDK wrapper (dynamic import, optional peer dependency)
|
|
38
|
+
mcp/mcp-server.ts MCP tool server (send_message, check_inbox, read_thread, list_agents)
|
|
39
|
+
jsonrpc/mail-server.ts MAP JSON-RPC mail methods
|
|
40
|
+
push/notifier.ts Inbox file writes + inbox.message event emission
|
|
41
|
+
mesh/
|
|
42
|
+
mesh-transport.ts MapConnection impl over agentic-mesh MessageChannel
|
|
43
|
+
mesh-connector.ts Factory for creating MeshTransport connections (MapAgentConnectionClass)
|
|
44
|
+
delivery-bridge.ts DeliveryHandler bridge — intercepts MAP delivery → inbox storage
|
|
45
|
+
type-mapper.ts MAP Message ↔ Inbox Message bidirectional translation
|
|
46
|
+
|
|
47
|
+
test/
|
|
48
|
+
federation/ Federation tests (connection-manager, routing, queue, address, trust, integration, sdk-integration)
|
|
49
|
+
mesh/ Mesh transport tests (mesh-transport, mesh-connector, federation-mesh, delivery-bridge, type-mapper, meshpeer-integration, e2e)
|
|
50
|
+
registry/ Warm registry tests
|
|
51
|
+
*.test.ts Core tests (storage, router, traceability, IPC, mail-server, push)
|
|
52
|
+
|
|
53
|
+
docs/
|
|
54
|
+
CLAUDE-CODE-SWARM-PROPOSAL.md Proposal: replace claude-code-swarm's sidecar with embedded MeshPeer + agent-inbox
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Key architecture concepts
|
|
58
|
+
|
|
59
|
+
### Message flow
|
|
60
|
+
|
|
61
|
+
1. Message comes in via IPC socket, MCP tool, MAP connection, or MeshPeer delivery
|
|
62
|
+
2. `MessageRouter.routeMessage()` resolves recipients, normalizes content, stores the message
|
|
63
|
+
3. Local recipients: message stored in their inbox via storage
|
|
64
|
+
4. Remote recipients (`agent@system`): delegated to `ConnectionManager.route()`
|
|
65
|
+
5. Federation sends via FederationGateway (mesh), MAP SDK (WebSocket), or queues if peer is offline
|
|
66
|
+
6. Traceability layer auto-creates conversations/threads from events
|
|
67
|
+
|
|
68
|
+
### Federation addressing
|
|
69
|
+
|
|
70
|
+
- `"bob"` — local agent
|
|
71
|
+
- `"bob@system-2"` — agent on a federated system
|
|
72
|
+
- `"@system-2"` — broadcast to system
|
|
73
|
+
|
|
74
|
+
Parsed by `parseAddress()` in `src/federation/address.ts`.
|
|
75
|
+
|
|
76
|
+
### Federation transports
|
|
77
|
+
|
|
78
|
+
Two federation transport options, configurable per-peer:
|
|
79
|
+
|
|
80
|
+
**WebSocket (MAP SDK):** Traditional MAP federation over WebSocket. Configure with `FederationPeerConfig.url`.
|
|
81
|
+
|
|
82
|
+
**Mesh (agentic-mesh):** Encrypted P2P federation over agentic-mesh. Two integration levels:
|
|
83
|
+
|
|
84
|
+
- **Phase 1 (raw channel):** `MeshTransport` wraps a `MessageChannel` behind `MapConnection`. Configure with `CreateOptions.mesh` + `FederationPeerConfig.meshPeerId`. Uses channel name `"proto:agent-inbox"`.
|
|
85
|
+
|
|
86
|
+
- **Phase 2 (full MeshPeer):** Agent-inbox registers as an agent on the MeshPeer's MapServer. Uses `FederationGateway` for cross-mesh routing with envelope wrapping, hop counting, and loop detection. `DeliveryBridge` intercepts MAP message delivery → inbox storage. Configure with `CreateOptions.meshPeer`.
|
|
87
|
+
|
|
88
|
+
Both transports can coexist — configure per-peer via `url` vs `meshPeerId`.
|
|
89
|
+
|
|
90
|
+
### Storage interface
|
|
91
|
+
|
|
92
|
+
All storage operations go through `Storage` interface (`src/storage/interface.ts`). Two implementations: `InMemoryStorage` (tests + ephemeral) and `SQLiteStorage` (persistent). Tests always use `InMemoryStorage`.
|
|
93
|
+
|
|
94
|
+
### MAP SDK is optional
|
|
95
|
+
|
|
96
|
+
The `@multi-agent-protocol/sdk` is a peer dependency loaded dynamically in `src/map/map-client.ts`. Agent Inbox works without it (IPC + MCP only, no MAP transport). The SDK class is injected into `ConnectionManager` when available.
|
|
97
|
+
|
|
98
|
+
### Mesh transport (agentic-mesh) is optional
|
|
99
|
+
|
|
100
|
+
[agentic-mesh](https://github.com/alexngai/agentic-mesh) is an optional peer dependency for encrypted P2P federation. When a `MeshPeer` is provided via `CreateOptions.meshPeer`, agent-inbox gets:
|
|
101
|
+
|
|
102
|
+
- Direct P2P federation (no central MAP server required)
|
|
103
|
+
- Encrypted tunnels (Nebula/Tailscale handle PKI and NAT traversal)
|
|
104
|
+
- Federation with hop/loop detection via `FederationGateway`
|
|
105
|
+
- Automatic agent discovery via MapServer registry
|
|
106
|
+
- `_meta` field passthrough for inbox semantics (threading, importance, subjects)
|
|
107
|
+
|
|
108
|
+
Key mesh components:
|
|
109
|
+
- `MeshTransport` (`src/mesh/mesh-transport.ts`) — `MapConnection` over `MessageChannel`
|
|
110
|
+
- `MeshConnector` (`src/mesh/mesh-connector.ts`) — factory implementing `MapAgentConnectionClass`
|
|
111
|
+
- `DeliveryBridge` (`src/mesh/delivery-bridge.ts`) — intercepts MAP delivery for inbox storage
|
|
112
|
+
- `TypeMapper` (`src/mesh/type-mapper.ts`) — bidirectional MAP ↔ Inbox message translation
|
|
113
|
+
|
|
114
|
+
### Event-driven internals
|
|
115
|
+
|
|
116
|
+
Components communicate via `EventEmitter`. Key events:
|
|
117
|
+
- `message.created` — emitted by router, consumed by traceability and notifier
|
|
118
|
+
- `inbox.message` — emitted per-recipient by notifier `{ agentId, recipientKind, message }`. Clients subscribe to implement delivery strategy.
|
|
119
|
+
- `federation.route` — emitted when no transport, for testing
|
|
120
|
+
- `federation.message.received` — incoming federation message
|
|
121
|
+
- `federation.broadcast` — broadcast strategy fired
|
|
122
|
+
- `routing.updated` — routing table changed
|
|
123
|
+
|
|
124
|
+
## Conventions
|
|
125
|
+
|
|
126
|
+
- **TypeScript strict mode**, ESM output
|
|
127
|
+
- **vitest** for all tests — no jest
|
|
128
|
+
- **No mocking frameworks** — tests use hand-rolled mocks and the `InMemoryStorage` directly
|
|
129
|
+
- IDs generated with `ulid` or `crypto.randomUUID()`
|
|
130
|
+
- Content normalization: string payloads auto-wrapped to `{ type: "text", text: "..." }`
|
|
131
|
+
- Federation tests use `MockMapServer` (in-process broker) in `test/federation/sdk-integration.test.ts`
|
|
132
|
+
- Mesh tests use `MockMeshContext` (linked pair) in `test/mesh/mock-mesh.ts`
|
|
133
|
+
- Mesh channel name convention: protocol channels use `"proto:"` prefix (e.g., `"proto:agent-inbox"`)
|
|
134
|
+
|
|
135
|
+
## Common tasks
|
|
136
|
+
|
|
137
|
+
### Adding a new MCP tool
|
|
138
|
+
1. Add tool definition in `src/mcp/mcp-server.ts`
|
|
139
|
+
2. Implement handler that delegates to router/storage
|
|
140
|
+
3. Add test in `test/` (currently no dedicated mcp test file — tools tested through integration)
|
|
141
|
+
|
|
142
|
+
### Adding a new federation feature
|
|
143
|
+
1. Types go in `src/types.ts`
|
|
144
|
+
2. Logic in `src/federation/` (connection-manager, routing-engine, etc.)
|
|
145
|
+
3. Unit test in `test/federation/`
|
|
146
|
+
4. Integration test in `test/federation/integration.test.ts` or `test/federation/sdk-integration.test.ts`
|
|
147
|
+
|
|
148
|
+
### Adding a new storage method
|
|
149
|
+
1. Add to interface in `src/storage/interface.ts`
|
|
150
|
+
2. Implement in both `memory.ts` and `sqlite.ts`
|
|
151
|
+
3. Test in `test/storage.test.ts` and `test/sqlite-storage.test.ts`
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Agent Inbox
|
|
2
|
+
|
|
3
|
+
A MAP-native message router for multi-agent systems. Provides structured inbox/outbox semantics, message threading, delivery tracking, and cross-system federation on top of the [Multi-Agent Protocol](https://github.com/anthropics/multi-agent-protocol) transport layer.
|
|
4
|
+
|
|
5
|
+
Built to work with [claude-code-swarm](https://github.com/alexngai/claude-code-swarm) and any MAP-compatible agent framework. Optionally integrates with [agentic-mesh](https://github.com/alexngai/agentic-mesh) for encrypted P2P federation.
|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
- **Message routing** — Send messages between agents with `to`, `cc`, `bcc` semantics. Messages are stored in per-agent inboxes with delivery and read tracking.
|
|
10
|
+
- **Threading** — Messages can be grouped by `thread_tag` and linked via `in_reply_to` for conversation threading.
|
|
11
|
+
- **Traceability** — Auto-creates conversations, turns, and threads from messaging events following MAP's mail conventions.
|
|
12
|
+
- **Federation** — Route messages across independent systems. Supports WebSocket (MAP SDK) and encrypted P2P mesh (agentic-mesh) transports, configurable per-peer. Routing strategies: table, broadcast, hierarchical.
|
|
13
|
+
- **Multiple interfaces** — IPC (UNIX socket), MCP tools (stdio), MAP JSON-RPC, and event-based push via `inbox.message` events.
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Agent Runtime (Claude Code, OpenAI, etc.)
|
|
19
|
+
│
|
|
20
|
+
Adapter (~200 lines)
|
|
21
|
+
│
|
|
22
|
+
└── agent-inbox (routing, threading, storage, MCP tools)
|
|
23
|
+
│
|
|
24
|
+
├── Local delivery (same system)
|
|
25
|
+
├── Federation via MAP SDK (WebSocket)
|
|
26
|
+
└── Federation via agentic-mesh (encrypted P2P)
|
|
27
|
+
│
|
|
28
|
+
MeshPeer (MAP server, FederationGateway,
|
|
29
|
+
agent discovery, hop/loop detection)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Agent Inbox can run standalone (IPC + MCP only), with a MAP server (WebSocket federation), or with an embedded agentic-mesh `MeshPeer` (encrypted P2P federation with full MAP protocol support).
|
|
33
|
+
|
|
34
|
+
## Quick start
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install
|
|
38
|
+
npm run build
|
|
39
|
+
npm start
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Environment variables
|
|
43
|
+
|
|
44
|
+
| Variable | Default | Description |
|
|
45
|
+
|----------|---------|-------------|
|
|
46
|
+
| `INBOX_SOCKET_PATH` | `~/.claude/agent-inbox/inbox.sock` | IPC socket path |
|
|
47
|
+
| `INBOX_SCOPE` | `default` | Default message scope |
|
|
48
|
+
| `INBOX_SYSTEM_ID` | auto-generated | System identity for federation |
|
|
49
|
+
| `INBOX_MAP_ENABLED` | `false` | Enable MAP server connection |
|
|
50
|
+
| `INBOX_MAP_SERVER` | — | MAP server URL |
|
|
51
|
+
| `INBOX_SQLITE_PATH` | — | SQLite database path (enables persistent storage) |
|
|
52
|
+
| `INBOX_HTTP_PORT` | `0` | HTTP port for JSON-RPC endpoint |
|
|
53
|
+
|
|
54
|
+
### As an MCP tool server
|
|
55
|
+
|
|
56
|
+
Agent Inbox exposes 4 MCP tools that agents can call directly:
|
|
57
|
+
|
|
58
|
+
| Tool | Description |
|
|
59
|
+
|------|-------------|
|
|
60
|
+
| `send_message` | Send a message to one or more agents (supports replies via `inReplyTo`) |
|
|
61
|
+
| `check_inbox` | Check an agent's inbox for unread messages (auto-registers the agent) |
|
|
62
|
+
| `read_thread` | Read all messages in a thread by `threadTag` |
|
|
63
|
+
| `list_agents` | List registered agents (local and optionally federated) |
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Run in MCP mode (stdio transport for Claude Code integration)
|
|
67
|
+
npm start -- mcp
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### IPC protocol
|
|
71
|
+
|
|
72
|
+
NDJSON over UNIX socket. Commands:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{"action": "send", "from": "alice", "to": "bob", "payload": "Hello"}
|
|
76
|
+
{"action": "notify", "event": {"type": "agent.spawn", "agent": {...}}}
|
|
77
|
+
{"action": "ping"}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### MAP JSON-RPC
|
|
81
|
+
|
|
82
|
+
When connected to a MAP server, Agent Inbox registers JSON-RPC methods:
|
|
83
|
+
|
|
84
|
+
- `mail/send` — Send a message
|
|
85
|
+
- `mail/inbox` — Check inbox
|
|
86
|
+
- `mail/thread` — Read a thread
|
|
87
|
+
- `mail/ack` — Acknowledge a message
|
|
88
|
+
- `mail/search` — Full-text search (requires SQLite storage)
|
|
89
|
+
|
|
90
|
+
## Federation
|
|
91
|
+
|
|
92
|
+
Agents on different systems can message each other using `agent@system` addressing:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
alice@system-1 --> bob@system-2
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Transports
|
|
99
|
+
|
|
100
|
+
Two federation transport options, configurable per-peer:
|
|
101
|
+
|
|
102
|
+
**WebSocket (MAP SDK)** — Traditional MAP federation. Requires a reachable MAP server endpoint.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
await createAgentInbox({
|
|
106
|
+
enableFederation: true,
|
|
107
|
+
config: {
|
|
108
|
+
federation: {
|
|
109
|
+
peers: [{ systemId: "partner", url: "ws://partner:3001" }]
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Mesh (agentic-mesh)** — Encrypted P2P federation via Nebula/Tailscale tunnels. No central server required. Provides hop/loop detection, message buffering, and automatic agent discovery.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { MeshPeer } from "agentic-mesh";
|
|
119
|
+
|
|
120
|
+
const peer = MeshPeer.createEmbedded({ peerId: "my-system" });
|
|
121
|
+
await peer.start();
|
|
122
|
+
|
|
123
|
+
await createAgentInbox({
|
|
124
|
+
meshPeer: peer,
|
|
125
|
+
enableFederation: true,
|
|
126
|
+
config: {
|
|
127
|
+
federation: {
|
|
128
|
+
peers: [{ systemId: "partner", meshPeerId: "partner-peer" }]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Both transports can coexist — some peers use WebSocket, others use mesh.
|
|
135
|
+
|
|
136
|
+
### Routing strategies
|
|
137
|
+
|
|
138
|
+
| Strategy | Behavior |
|
|
139
|
+
|----------|----------|
|
|
140
|
+
| `table` (default) | In-memory routing table populated from peer exposure data. TTL-based expiry. |
|
|
141
|
+
| `broadcast` | Forward to all connected peers. First responder wins. |
|
|
142
|
+
| `hierarchical` | Local table first, then delegate to upstream hubs. Works with system-qualified addresses for indirect relay. |
|
|
143
|
+
|
|
144
|
+
### Trust
|
|
145
|
+
|
|
146
|
+
Federation connections are gated by an allow-list. Only systems in `allowedServers` can establish federation links.
|
|
147
|
+
|
|
148
|
+
### Delivery queue
|
|
149
|
+
|
|
150
|
+
Messages to offline peers are queued with configurable TTL, overflow policy, and retry strategy. Queues flush automatically on reconnect.
|
|
151
|
+
|
|
152
|
+
## Storage
|
|
153
|
+
|
|
154
|
+
Two storage backends:
|
|
155
|
+
|
|
156
|
+
- **InMemoryStorage** — Default. Fast, no dependencies. Data lost on restart.
|
|
157
|
+
- **SQLiteStorage** — Persistent storage with FTS5 full-text search. Requires `better-sqlite3`.
|
|
158
|
+
|
|
159
|
+
## Project structure
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
src/
|
|
163
|
+
index.ts Entry point — wires all components
|
|
164
|
+
types.ts Core type definitions
|
|
165
|
+
storage/
|
|
166
|
+
interface.ts Storage interface
|
|
167
|
+
memory.ts In-memory implementation
|
|
168
|
+
sqlite.ts SQLite implementation (persistent + FTS5)
|
|
169
|
+
router/
|
|
170
|
+
message-router.ts Message routing: resolve recipients, local vs remote
|
|
171
|
+
federation/
|
|
172
|
+
connection-manager.ts MAP connections + federation peer management
|
|
173
|
+
routing-engine.ts Configurable routing (table/broadcast/hierarchical)
|
|
174
|
+
delivery-queue.ts Offline message queue with TTL + retry
|
|
175
|
+
address.ts Parse/resolve agent@system addresses
|
|
176
|
+
trust.ts Federation trust policies (allow-list)
|
|
177
|
+
registry/
|
|
178
|
+
warm-registry.ts Agent lifecycle: active/away/expired + TTL
|
|
179
|
+
traceability/
|
|
180
|
+
traceability.ts Auto-create conversations/turns/threads
|
|
181
|
+
ipc/
|
|
182
|
+
ipc-server.ts UNIX socket server (NDJSON protocol)
|
|
183
|
+
map/
|
|
184
|
+
map-client.ts MAP SDK connection wrapper
|
|
185
|
+
mcp/
|
|
186
|
+
mcp-server.ts MCP tool server (stdio transport)
|
|
187
|
+
jsonrpc/
|
|
188
|
+
mail-server.ts MAP JSON-RPC mail methods
|
|
189
|
+
push/
|
|
190
|
+
notifier.ts Inbox file writes + inbox.message event emission
|
|
191
|
+
mesh/
|
|
192
|
+
mesh-transport.ts MapConnection impl over agentic-mesh MessageChannel
|
|
193
|
+
mesh-connector.ts Factory for MeshTransport connections
|
|
194
|
+
delivery-bridge.ts DeliveryHandler bridge (MAP delivery → inbox storage)
|
|
195
|
+
type-mapper.ts Bidirectional MAP ↔ Inbox message translation
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Testing
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
npm test # Run all tests
|
|
202
|
+
npm run test:watch # Watch mode
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
357 tests across 27 test files covering:
|
|
206
|
+
|
|
207
|
+
- Storage (in-memory + SQLite)
|
|
208
|
+
- Message routing and content normalization
|
|
209
|
+
- Traceability (auto-conversation/thread creation)
|
|
210
|
+
- IPC server (NDJSON protocol, concurrent clients)
|
|
211
|
+
- Federation (connection manager, routing engine, delivery queue, address parsing, trust)
|
|
212
|
+
- Federation integration (end-to-end multi-system scenarios)
|
|
213
|
+
- SDK integration (two-system tests with in-process mock MAP server)
|
|
214
|
+
- MAP JSON-RPC mail methods
|
|
215
|
+
- Warm agent registry lifecycle
|
|
216
|
+
- Push model (inbox.message events + inbox file writes)
|
|
217
|
+
- Mesh transport (MeshTransport, MeshConnector, federation-mesh integration)
|
|
218
|
+
- Mesh Phase 2 (DeliveryBridge, TypeMapper, MeshPeer integration)
|
|
219
|
+
- E2E with real agentic-mesh MeshPeer instances (bidirectional messaging, reply chains, concurrent load)
|
|
220
|
+
|
|
221
|
+
## Development
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
npm run dev # TypeScript watch mode
|
|
225
|
+
npm test # Run tests
|
|
226
|
+
npm run build # Production build
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Requires Node.js >= 18.
|
|
230
|
+
|
|
231
|
+
## Further reading
|
|
232
|
+
|
|
233
|
+
- [docs/DESIGN.md](docs/DESIGN.md) — Detailed architecture and design decisions
|
|
234
|
+
- [docs/CLAUDE-CODE-SWARM-PROPOSAL.md](docs/CLAUDE-CODE-SWARM-PROPOSAL.md) — Proposal: replace claude-code-swarm's sidecar with embedded MeshPeer + agent-inbox
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
MIT
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# claude-code-swarm Migration Proposal: Embedded MeshPeer + agent-inbox
|
|
2
|
+
|
|
3
|
+
**Author:** agent-inbox team
|
|
4
|
+
**Date:** 2026-03-16
|
|
5
|
+
**Status:** Proposal
|
|
6
|
+
**Context:** agent-inbox has completed full agentic-mesh integration (Phase 1 + Phase 2). This document proposes migrating claude-code-swarm from its custom WebSocket sidecar to the shared agent-inbox + agentic-mesh stack.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## The Problem: Per-Agent-Runtime Reimplementation
|
|
11
|
+
|
|
12
|
+
claude-code-swarm currently uses a custom WebSocket sidecar (~1500 lines) tightly coupled to Claude Code's hook system. It handles MAP connections, agent registration, and message routing. If we want to support a different agent runtime (e.g., OpenAI-based agents, AutoGen, standalone scripts), we'd have to reimplement the sidecar each time.
|
|
13
|
+
|
|
14
|
+
## The Solution: Three-Layer Architecture
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌────────────────────────────────────────────────┐
|
|
18
|
+
│ Agent-Specific Adapter (~200 lines) │
|
|
19
|
+
│ (Claude Code hooks, or OpenAI plugin, etc.) │
|
|
20
|
+
├────────────────────────────────────────────────┤
|
|
21
|
+
│ agent-inbox │
|
|
22
|
+
│ (inbox/outbox, threading, traceability, MCP) │
|
|
23
|
+
├────────────────────────────────────────────────┤
|
|
24
|
+
│ agentic-mesh (MeshPeer) │
|
|
25
|
+
│ (transport, encryption, MAP protocol, │
|
|
26
|
+
│ federation, discovery, CRDT sync) │
|
|
27
|
+
└────────────────────────────────────────────────┘
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**agentic-mesh is the layer every agent shares.** It handles networking, encryption, peer discovery, and MAP protocol once. agent-inbox adds structured messaging on top. The per-agent adapter is just lifecycle translation (~200 lines).
|
|
31
|
+
|
|
32
|
+
## What's Ready Today
|
|
33
|
+
|
|
34
|
+
### agent-inbox + agentic-mesh integration (complete)
|
|
35
|
+
|
|
36
|
+
| Capability | Status |
|
|
37
|
+
|-----------|--------|
|
|
38
|
+
| P2P message delivery over encrypted mesh | Working |
|
|
39
|
+
| Offline queuing (both layers) | Working |
|
|
40
|
+
| Agent discovery via MapServer registry | Working |
|
|
41
|
+
| Full MAP scoped addressing | Working |
|
|
42
|
+
| Federation with hop/loop detection | Working (FederationGateway) |
|
|
43
|
+
| `_meta` field passthrough (threading, importance, subjects) | Verified end-to-end |
|
|
44
|
+
| DeliveryHandler bridge (MAP → inbox storage) | Working |
|
|
45
|
+
| MAP ↔ Inbox type translation | Working (18 tests) |
|
|
46
|
+
| E2E with real MeshPeer instances | 13 tests passing |
|
|
47
|
+
| Total mesh-related tests | 85 tests, all passing |
|
|
48
|
+
|
|
49
|
+
### How agent-inbox consumes MeshPeer
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
const inbox = await createAgentInbox({
|
|
53
|
+
meshPeer: myMeshPeer, // Embedded MeshPeer, full MAP protocol
|
|
54
|
+
enableFederation: true,
|
|
55
|
+
config: {
|
|
56
|
+
federation: {
|
|
57
|
+
peers: [
|
|
58
|
+
{ systemId: "system-b", meshPeerId: "system-b" }
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
This single call:
|
|
66
|
+
1. Registers `agent-inbox` as an agent on the MeshPeer's MapServer
|
|
67
|
+
2. Installs a `DeliveryBridge` to intercept MAP message delivery → inbox storage
|
|
68
|
+
3. Wires `FederationGateway` for cross-mesh routing with envelope wrapping and loop detection
|
|
69
|
+
4. Sets up all inbox semantics (threading, read tracking, traceability)
|
|
70
|
+
|
|
71
|
+
## Proposed Migration Path for claude-code-swarm
|
|
72
|
+
|
|
73
|
+
### Step 1: Replace the sidecar with embedded MeshPeer + agent-inbox
|
|
74
|
+
|
|
75
|
+
The current sidecar handles:
|
|
76
|
+
- MAP WebSocket connection management
|
|
77
|
+
- Agent registration on connect/disconnect
|
|
78
|
+
- Message routing between agents
|
|
79
|
+
- Hook-based lifecycle (agent spawn/done events)
|
|
80
|
+
|
|
81
|
+
All of these are now handled by MeshPeer + agent-inbox. The sidecar reduces to a thin adapter that:
|
|
82
|
+
- Creates an embedded `MeshPeer` on startup
|
|
83
|
+
- Passes it to `createAgentInbox({ meshPeer })`
|
|
84
|
+
- Translates Claude Code hook events (agent spawn/done) into agent-inbox registry calls
|
|
85
|
+
- Exposes MCP tools for agents to send/receive messages
|
|
86
|
+
|
|
87
|
+
### Step 2: Claude Code hook adapter (~200 lines)
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// Pseudocode for the thin adapter
|
|
91
|
+
import { MeshPeer } from "agentic-mesh";
|
|
92
|
+
import { createAgentInbox } from "agent-inbox";
|
|
93
|
+
|
|
94
|
+
// 1. Start embedded MeshPeer
|
|
95
|
+
const peer = MeshPeer.createEmbedded({ peerId: "swarm-leader" });
|
|
96
|
+
await peer.start();
|
|
97
|
+
|
|
98
|
+
// 2. Create agent-inbox with MeshPeer
|
|
99
|
+
const inbox = await createAgentInbox({ meshPeer: peer, enableFederation: true });
|
|
100
|
+
|
|
101
|
+
// 3. Hook adapter: translate Claude Code events → inbox
|
|
102
|
+
onAgentSpawn(({ agentId, name }) => {
|
|
103
|
+
inbox.registry.register(agentId, { name });
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
onAgentDone(({ agentId }) => {
|
|
107
|
+
inbox.registry.disconnect(agentId);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// 4. MCP tools are automatically available via inbox
|
|
111
|
+
// Agents use send_message, check_inbox, read_thread, list_agents
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Step 3: Multi-runtime support
|
|
115
|
+
|
|
116
|
+
With the sidecar replaced, supporting new agent runtimes is just writing a new ~200-line adapter:
|
|
117
|
+
- OpenAI agent adapter: translates OpenAI function calls → inbox MCP tools
|
|
118
|
+
- AutoGen adapter: maps AutoGen conversation patterns → inbox threading
|
|
119
|
+
- Standalone script adapter: CLI wrapper around inbox IPC
|
|
120
|
+
|
|
121
|
+
Each adapter only handles lifecycle translation. Messaging, routing, federation, and storage are all shared.
|
|
122
|
+
|
|
123
|
+
## Benefits
|
|
124
|
+
|
|
125
|
+
1. **~1300 fewer lines** in claude-code-swarm (1500 LOC sidecar → 200 LOC adapter)
|
|
126
|
+
2. **No more MAP WebSocket management** — MeshPeer handles transport
|
|
127
|
+
3. **Encrypted P2P** — Nebula/Tailscale tunnels instead of plain WebSocket
|
|
128
|
+
4. **Federation with safety** — hop counting, loop detection, message buffering
|
|
129
|
+
5. **Multi-runtime** — any agent runtime can join the mesh with a thin adapter
|
|
130
|
+
6. **Structured messaging** — threading, read tracking, importance levels, traceability
|
|
131
|
+
|
|
132
|
+
## Open Questions
|
|
133
|
+
|
|
134
|
+
1. **Migration timeline** — Can this be done incrementally (sidecar + inbox side-by-side) or does it need a clean cutover?
|
|
135
|
+
2. **Hook compatibility** — Are there Claude Code hook behaviors the adapter can't replicate?
|
|
136
|
+
3. **Performance** — Does the extra indirection (hook → adapter → inbox → MeshPeer) add unacceptable latency for real-time agent coordination?
|
|
137
|
+
4. **State migration** — Any persistent state in the current sidecar that needs migrating?
|