network-ai 4.15.3 → 5.1.0

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.
Files changed (282) hide show
  1. package/INTEGRATION_GUIDE.md +12 -5
  2. package/QUICKSTART.md +32 -5
  3. package/README.md +42 -17
  4. package/bin/dashboard.ts +146 -0
  5. package/bin/mcp-server.ts +3 -2
  6. package/dist/adapters/adapter-registry.d.ts +33 -1
  7. package/dist/adapters/adapter-registry.d.ts.map +1 -1
  8. package/dist/adapters/adapter-registry.js +49 -0
  9. package/dist/adapters/adapter-registry.js.map +1 -1
  10. package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
  11. package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
  12. package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
  13. package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
  14. package/dist/adapters/browser-agent-adapter.d.ts +121 -0
  15. package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
  16. package/dist/adapters/browser-agent-adapter.js +219 -0
  17. package/dist/adapters/browser-agent-adapter.js.map +1 -0
  18. package/dist/adapters/copilot-adapter.d.ts +59 -0
  19. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  20. package/dist/adapters/copilot-adapter.js +132 -0
  21. package/dist/adapters/copilot-adapter.js.map +1 -0
  22. package/dist/adapters/custom-adapter.d.ts +1 -1
  23. package/dist/adapters/custom-adapter.js +1 -1
  24. package/dist/adapters/index.d.ts +17 -1
  25. package/dist/adapters/index.d.ts.map +1 -1
  26. package/dist/adapters/index.js +25 -1
  27. package/dist/adapters/index.js.map +1 -1
  28. package/dist/adapters/langchain-adapter.js +1 -1
  29. package/dist/adapters/langchain-adapter.js.map +1 -1
  30. package/dist/adapters/langgraph-adapter.d.ts +70 -0
  31. package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
  32. package/dist/adapters/langgraph-adapter.js +119 -0
  33. package/dist/adapters/langgraph-adapter.js.map +1 -0
  34. package/dist/adapters/mcp-adapter.d.ts +1 -1
  35. package/dist/adapters/mcp-adapter.js +3 -3
  36. package/dist/adapters/mcp-adapter.js.map +1 -1
  37. package/dist/adapters/openai-agents-adapter.d.ts +100 -0
  38. package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
  39. package/dist/adapters/openai-agents-adapter.js +118 -0
  40. package/dist/adapters/openai-agents-adapter.js.map +1 -0
  41. package/dist/adapters/openclaw-adapter.d.ts +1 -1
  42. package/dist/adapters/openclaw-adapter.js +3 -3
  43. package/dist/adapters/openclaw-adapter.js.map +1 -1
  44. package/dist/adapters/orchestrator-adapter.d.ts +118 -0
  45. package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
  46. package/dist/adapters/orchestrator-adapter.js +219 -0
  47. package/dist/adapters/orchestrator-adapter.js.map +1 -0
  48. package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
  49. package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
  50. package/dist/adapters/pydantic-ai-adapter.js +163 -0
  51. package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
  52. package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
  53. package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
  54. package/dist/adapters/vertex-ai-adapter.js +166 -0
  55. package/dist/adapters/vertex-ai-adapter.js.map +1 -0
  56. package/dist/bin/dashboard.d.ts +11 -0
  57. package/dist/bin/dashboard.d.ts.map +1 -0
  58. package/dist/bin/dashboard.js +135 -0
  59. package/dist/bin/dashboard.js.map +1 -0
  60. package/dist/bin/mcp-server.js +3 -2
  61. package/dist/bin/mcp-server.js.map +1 -1
  62. package/dist/demo-control-plane.d.ts +12 -0
  63. package/dist/demo-control-plane.d.ts.map +1 -0
  64. package/dist/demo-control-plane.js +147 -0
  65. package/dist/demo-control-plane.js.map +1 -0
  66. package/dist/demo-worktree-dashboard.d.ts +2 -0
  67. package/dist/demo-worktree-dashboard.d.ts.map +1 -0
  68. package/dist/demo-worktree-dashboard.js +131 -0
  69. package/dist/demo-worktree-dashboard.js.map +1 -0
  70. package/dist/examples/01-hello-swarm.d.ts +13 -0
  71. package/dist/examples/01-hello-swarm.d.ts.map +1 -0
  72. package/dist/examples/01-hello-swarm.js +165 -0
  73. package/dist/examples/01-hello-swarm.js.map +1 -0
  74. package/dist/examples/02-fsm-pipeline.d.ts +20 -0
  75. package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
  76. package/dist/examples/02-fsm-pipeline.js +189 -0
  77. package/dist/examples/02-fsm-pipeline.js.map +1 -0
  78. package/dist/examples/03-parallel-agents.d.ts +21 -0
  79. package/dist/examples/03-parallel-agents.d.ts.map +1 -0
  80. package/dist/examples/03-parallel-agents.js +192 -0
  81. package/dist/examples/03-parallel-agents.js.map +1 -0
  82. package/dist/examples/05-code-review-swarm.d.ts +21 -0
  83. package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
  84. package/dist/examples/05-code-review-swarm.js +1177 -0
  85. package/dist/examples/05-code-review-swarm.js.map +1 -0
  86. package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
  87. package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
  88. package/dist/examples/06-ai-pipeline-demo.js +263 -0
  89. package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
  90. package/dist/examples/07-full-showcase.d.ts +27 -0
  91. package/dist/examples/07-full-showcase.d.ts.map +1 -0
  92. package/dist/examples/07-full-showcase.js +946 -0
  93. package/dist/examples/07-full-showcase.js.map +1 -0
  94. package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
  95. package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
  96. package/dist/examples/08-control-plane-stress-demo.js +186 -0
  97. package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
  98. package/dist/examples/09-real-langchain.d.ts +19 -0
  99. package/dist/examples/09-real-langchain.d.ts.map +1 -0
  100. package/dist/examples/09-real-langchain.js +231 -0
  101. package/dist/examples/09-real-langchain.js.map +1 -0
  102. package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
  103. package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
  104. package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
  105. package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
  106. package/dist/examples/demo-runner.d.ts +2 -0
  107. package/dist/examples/demo-runner.d.ts.map +1 -0
  108. package/dist/examples/demo-runner.js +119 -0
  109. package/dist/examples/demo-runner.js.map +1 -0
  110. package/dist/index.d.ts +113 -559
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +310 -1074
  113. package/dist/index.js.map +1 -1
  114. package/dist/lib/adapter-test-harness.d.ts +88 -0
  115. package/dist/lib/adapter-test-harness.d.ts.map +1 -0
  116. package/dist/lib/adapter-test-harness.js +118 -0
  117. package/dist/lib/adapter-test-harness.js.map +1 -0
  118. package/dist/lib/agent-conversation.d.ts +115 -0
  119. package/dist/lib/agent-conversation.d.ts.map +1 -0
  120. package/dist/lib/agent-conversation.js +155 -0
  121. package/dist/lib/agent-conversation.js.map +1 -0
  122. package/dist/lib/agent-debate.d.ts +115 -0
  123. package/dist/lib/agent-debate.d.ts.map +1 -0
  124. package/dist/lib/agent-debate.js +146 -0
  125. package/dist/lib/agent-debate.js.map +1 -0
  126. package/dist/lib/agent-memory.d.ts +157 -0
  127. package/dist/lib/agent-memory.d.ts.map +1 -0
  128. package/dist/lib/agent-memory.js +336 -0
  129. package/dist/lib/agent-memory.js.map +1 -0
  130. package/dist/lib/agent-vcr.d.ts +133 -0
  131. package/dist/lib/agent-vcr.d.ts.map +1 -0
  132. package/dist/lib/agent-vcr.js +218 -0
  133. package/dist/lib/agent-vcr.js.map +1 -0
  134. package/dist/lib/anomaly-detector.d.ts +112 -0
  135. package/dist/lib/anomaly-detector.d.ts.map +1 -0
  136. package/dist/lib/anomaly-detector.js +178 -0
  137. package/dist/lib/anomaly-detector.js.map +1 -0
  138. package/dist/lib/approval-inbox.d.ts +147 -0
  139. package/dist/lib/approval-inbox.d.ts.map +1 -0
  140. package/dist/lib/approval-inbox.js +385 -0
  141. package/dist/lib/approval-inbox.js.map +1 -0
  142. package/dist/lib/auth-guardian.d.ts +170 -0
  143. package/dist/lib/auth-guardian.d.ts.map +1 -0
  144. package/dist/lib/auth-guardian.js +604 -0
  145. package/dist/lib/auth-guardian.js.map +1 -0
  146. package/dist/lib/auth-validator.d.ts +70 -0
  147. package/dist/lib/auth-validator.d.ts.map +1 -0
  148. package/dist/lib/auth-validator.js +32 -0
  149. package/dist/lib/auth-validator.js.map +1 -0
  150. package/dist/lib/blackboard-validator.d.ts +56 -0
  151. package/dist/lib/blackboard-validator.d.ts.map +1 -1
  152. package/dist/lib/blackboard-validator.js +181 -4
  153. package/dist/lib/blackboard-validator.js.map +1 -1
  154. package/dist/lib/comparison-runner.d.ts +99 -0
  155. package/dist/lib/comparison-runner.d.ts.map +1 -0
  156. package/dist/lib/comparison-runner.js +138 -0
  157. package/dist/lib/comparison-runner.js.map +1 -0
  158. package/dist/lib/config-watcher.d.ts +109 -0
  159. package/dist/lib/config-watcher.d.ts.map +1 -0
  160. package/dist/lib/config-watcher.js +215 -0
  161. package/dist/lib/config-watcher.js.map +1 -0
  162. package/dist/lib/control-plane.d.ts +128 -0
  163. package/dist/lib/control-plane.d.ts.map +1 -0
  164. package/dist/lib/control-plane.js +527 -0
  165. package/dist/lib/control-plane.js.map +1 -0
  166. package/dist/lib/cost-governor.d.ts +105 -0
  167. package/dist/lib/cost-governor.d.ts.map +1 -0
  168. package/dist/lib/cost-governor.js +128 -0
  169. package/dist/lib/cost-governor.js.map +1 -0
  170. package/dist/lib/cost-heatmap.d.ts +104 -0
  171. package/dist/lib/cost-heatmap.d.ts.map +1 -0
  172. package/dist/lib/cost-heatmap.js +161 -0
  173. package/dist/lib/cost-heatmap.js.map +1 -0
  174. package/dist/lib/coverage-reporter.d.ts +92 -0
  175. package/dist/lib/coverage-reporter.d.ts.map +1 -0
  176. package/dist/lib/coverage-reporter.js +177 -0
  177. package/dist/lib/coverage-reporter.js.map +1 -0
  178. package/dist/lib/dashboard-server.d.ts +71 -0
  179. package/dist/lib/dashboard-server.d.ts.map +1 -0
  180. package/dist/lib/dashboard-server.js +403 -0
  181. package/dist/lib/dashboard-server.js.map +1 -0
  182. package/dist/lib/dry-run.d.ts +73 -0
  183. package/dist/lib/dry-run.d.ts.map +1 -0
  184. package/dist/lib/dry-run.js +130 -0
  185. package/dist/lib/dry-run.js.map +1 -0
  186. package/dist/lib/errors.d.ts +15 -0
  187. package/dist/lib/errors.d.ts.map +1 -1
  188. package/dist/lib/errors.js +38 -0
  189. package/dist/lib/errors.js.map +1 -1
  190. package/dist/lib/event-bus.d.ts +167 -0
  191. package/dist/lib/event-bus.d.ts.map +1 -0
  192. package/dist/lib/event-bus.js +229 -0
  193. package/dist/lib/event-bus.js.map +1 -0
  194. package/dist/lib/explainability.d.ts +85 -0
  195. package/dist/lib/explainability.d.ts.map +1 -0
  196. package/dist/lib/explainability.js +102 -0
  197. package/dist/lib/explainability.js.map +1 -0
  198. package/dist/lib/goal-dsl.d.ts +157 -0
  199. package/dist/lib/goal-dsl.d.ts.map +1 -0
  200. package/dist/lib/goal-dsl.js +391 -0
  201. package/dist/lib/goal-dsl.js.map +1 -0
  202. package/dist/lib/job-queue.d.ts +183 -0
  203. package/dist/lib/job-queue.d.ts.map +1 -0
  204. package/dist/lib/job-queue.js +310 -0
  205. package/dist/lib/job-queue.js.map +1 -0
  206. package/dist/lib/learning-loop.d.ts +113 -0
  207. package/dist/lib/learning-loop.d.ts.map +1 -0
  208. package/dist/lib/learning-loop.js +181 -0
  209. package/dist/lib/learning-loop.js.map +1 -0
  210. package/dist/lib/lifecycle-hooks.d.ts +116 -0
  211. package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
  212. package/dist/lib/lifecycle-hooks.js +148 -0
  213. package/dist/lib/lifecycle-hooks.js.map +1 -0
  214. package/dist/lib/locked-blackboard.d.ts.map +1 -1
  215. package/dist/lib/locked-blackboard.js +9 -5
  216. package/dist/lib/locked-blackboard.js.map +1 -1
  217. package/dist/lib/mcp-tool-consumer.d.ts +153 -0
  218. package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
  219. package/dist/lib/mcp-tool-consumer.js +320 -0
  220. package/dist/lib/mcp-tool-consumer.js.map +1 -0
  221. package/dist/lib/metrics.d.ts +119 -0
  222. package/dist/lib/metrics.d.ts.map +1 -0
  223. package/dist/lib/metrics.js +284 -0
  224. package/dist/lib/metrics.js.map +1 -0
  225. package/dist/lib/orchestrator-types.d.ts +309 -0
  226. package/dist/lib/orchestrator-types.d.ts.map +1 -0
  227. package/dist/lib/orchestrator-types.js +61 -0
  228. package/dist/lib/orchestrator-types.js.map +1 -0
  229. package/dist/lib/otel-bridge.d.ts +74 -0
  230. package/dist/lib/otel-bridge.d.ts.map +1 -0
  231. package/dist/lib/otel-bridge.js +167 -0
  232. package/dist/lib/otel-bridge.js.map +1 -0
  233. package/dist/lib/playground.d.ts +76 -0
  234. package/dist/lib/playground.d.ts.map +1 -0
  235. package/dist/lib/playground.js +224 -0
  236. package/dist/lib/playground.js.map +1 -0
  237. package/dist/lib/quadtree.d.ts +114 -0
  238. package/dist/lib/quadtree.d.ts.map +1 -0
  239. package/dist/lib/quadtree.js +259 -0
  240. package/dist/lib/quadtree.js.map +1 -0
  241. package/dist/lib/shared-blackboard.d.ts +101 -0
  242. package/dist/lib/shared-blackboard.d.ts.map +1 -0
  243. package/dist/lib/shared-blackboard.js +249 -0
  244. package/dist/lib/shared-blackboard.js.map +1 -0
  245. package/dist/lib/speculative-executor.d.ts +89 -0
  246. package/dist/lib/speculative-executor.d.ts.map +1 -0
  247. package/dist/lib/speculative-executor.js +107 -0
  248. package/dist/lib/speculative-executor.js.map +1 -0
  249. package/dist/lib/swarm-transport.d.ts +150 -0
  250. package/dist/lib/swarm-transport.d.ts.map +1 -0
  251. package/dist/lib/swarm-transport.js +307 -0
  252. package/dist/lib/swarm-transport.js.map +1 -0
  253. package/dist/lib/task-decomposer.d.ts +41 -0
  254. package/dist/lib/task-decomposer.d.ts.map +1 -0
  255. package/dist/lib/task-decomposer.js +272 -0
  256. package/dist/lib/task-decomposer.js.map +1 -0
  257. package/dist/lib/timeline-scrubber.d.ts +84 -0
  258. package/dist/lib/timeline-scrubber.d.ts.map +1 -0
  259. package/dist/lib/timeline-scrubber.js +173 -0
  260. package/dist/lib/timeline-scrubber.js.map +1 -0
  261. package/dist/lib/topology.d.ts +361 -0
  262. package/dist/lib/topology.d.ts.map +1 -0
  263. package/dist/lib/topology.js +591 -0
  264. package/dist/lib/topology.js.map +1 -0
  265. package/dist/lib/work-tree-dashboard.d.ts +130 -0
  266. package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
  267. package/dist/lib/work-tree-dashboard.js +583 -0
  268. package/dist/lib/work-tree-dashboard.js.map +1 -0
  269. package/dist/lib/work-tree-ui.d.ts +107 -0
  270. package/dist/lib/work-tree-ui.d.ts.map +1 -0
  271. package/dist/lib/work-tree-ui.js +333 -0
  272. package/dist/lib/work-tree-ui.js.map +1 -0
  273. package/dist/lib/work-tree.d.ts +184 -0
  274. package/dist/lib/work-tree.d.ts.map +1 -0
  275. package/dist/lib/work-tree.js +480 -0
  276. package/dist/lib/work-tree.js.map +1 -0
  277. package/dist/security.d.ts +95 -0
  278. package/dist/security.d.ts.map +1 -1
  279. package/dist/security.js +267 -4
  280. package/dist/security.js.map +1 -1
  281. package/package.json +8 -6
  282. package/types/agent-adapter.d.ts +5 -0
@@ -64,14 +64,16 @@ Answers drive `AuthGuardian` configuration and audit log retention policy.
64
64
 
65
65
  ## 2. Framework Mapping
66
66
 
67
- Network-AI ships 17 adapters. Map your existing agents to the right one:
67
+ Network-AI ships 27 adapters. Map your existing agents to the right one:
68
68
 
69
69
  | Your Stack | Network-AI Adapter | Notes |
70
70
  |-----------|-------------------|-------|
71
71
  | LangChain (JS/TS) | `LangChainAdapter` | Supports Runnables, chains, agents |
72
+ | LangGraph | `LangGraphAdapter` | Compiled StateGraph execution |
72
73
  | AutoGen / AG2 | `AutoGenAdapter` | Supports `.run()` and `.generateReply()` |
73
74
  | CrewAI | `CrewAIAdapter` | Individual agents and full crew objects |
74
75
  | OpenAI Assistants | `OpenAIAssistantsAdapter` | Thread management included |
76
+ | OpenAI Agents SDK | `OpenAIAgentsAdapter` | Tool use, handoffs, guardrails |
75
77
  | LlamaIndex | `LlamaIndexAdapter` | Query engines, chat engines, agent runners |
76
78
  | Semantic Kernel | `SemanticKernelAdapter` | Microsoft SK kernels, functions, planners |
77
79
  | Haystack | `HaystackAdapter` | Pipelines, agents, components |
@@ -84,6 +86,11 @@ Network-AI ships 17 adapters. Map your existing agents to the right one:
84
86
  | MiniMax | `MiniMaxAdapter` | MiniMax chat completions (M2.5) |
85
87
  | NVIDIA NemoClaw | `NemoClawAdapter` | Sandboxed agent execution via OpenShell |
86
88
  | APS delegation chains | `APSAdapter` | Delegation-chain trust mapping for AuthGuardian |
89
+ | GitHub Copilot | `CopilotAdapter` | Code generate/review/explain/fix/test/refactor/chat |
90
+ | Anthropic Computer Use | `AnthropicComputerUseAdapter` | Screenshot/click/type/scroll browser automation |
91
+ | Google Vertex AI / Gemini | `VertexAIAdapter` | Function calling, multi-modal (text+image) |
92
+ | Pydantic AI | `PydanticAIAdapter` | Structured output with validation, deps injection |
93
+ | Browser automation | `BrowserAgentAdapter` | Playwright/Puppeteer/CDP browser control |
87
94
  | **Anything else** | `CustomAdapter` | Wrap any async function or HTTP endpoint |
88
95
 
89
96
  ### No matching framework?
@@ -405,11 +412,11 @@ Run these before declaring the integration production-ready:
405
412
  - [ ] All agents execute via the adapter registry without errors
406
413
  - [ ] `npx ts-node test-standalone.ts` — 88 core tests pass
407
414
  - [ ] `npx ts-node test-security.ts` — 34 security tests pass
408
- - [ ] `npx ts-node test-adapters.ts` — 176 adapter tests pass
415
+ - [ ] `npx ts-node test-adapters.ts` — 206 adapter tests pass
409
416
  - [ ] `npx ts-node test-phase4.ts` — 147 behavioral tests pass
410
417
  - [ ] `npx ts-node test-qa.ts` — 67 QA orchestrator tests pass
411
418
  - [ ] `npx ts-node test-phase7.ts` — 94 Phase 7 tests pass (hooks, flow control, composer, semantic search)
412
- - [ ] `npm run test:all` — all 2,357 tests pass across 25 suites
419
+ - [ ] `npm run test:all` — all 2,691 tests pass across 26 suites
413
420
  - [ ] `npm run demo -- --08` runs to completion in < 10 seconds
414
421
 
415
422
  ### Race Condition Safety
@@ -467,7 +474,7 @@ Run these before declaring the integration production-ready:
467
474
  |----------|---------------|
468
475
  | [QUICKSTART.md](QUICKSTART.md) | Get running in 5 minutes |
469
476
  | [QUICKSTART.md § CLI](QUICKSTART.md) | CLI reference — bb, auth, budget, audit commands |
470
- | [references/adapter-system.md](references/adapter-system.md) | All 17 adapters with code examples |
477
+ | [references/adapter-system.md](references/adapter-system.md) | All 27 adapters with code examples |
471
478
  | [references/trust-levels.md](references/trust-levels.md) | Trust scoring formula and agent roles |
472
479
  | [references/auth-guardian.md](references/auth-guardian.md) | Permission system, justification scoring, token lifecycle |
473
480
  | [references/blackboard-schema.md](references/blackboard-schema.md) | Blackboard key conventions and namespacing |
@@ -477,4 +484,4 @@ Run these before declaring the integration production-ready:
477
484
 
478
485
  ---
479
486
 
480
- *Network-AI v4.15.3 · MIT License · https://github.com/Jovancoding/Network-AI*
487
+ *Network-AI v5.0.0 · MIT License · https://github.com/Jovancoding/Network-AI*
package/QUICKSTART.md CHANGED
@@ -18,7 +18,7 @@ npm install
18
18
  npx ts-node setup.ts --check
19
19
  ```
20
20
 
21
- **Zero external AI dependencies.** All 17 adapters are self-contained — add framework SDKs only when you need them.
21
+ **Zero external AI dependencies.** All 27 adapters are self-contained — add framework SDKs only when you need them.
22
22
 
23
23
  ---
24
24
 
@@ -43,6 +43,13 @@ npx ts-node setup.ts --check
43
43
  | `codex` | Codex | `openai` | OpenAI Codex CLI |
44
44
  | `minimax` | MiniMax | none | MiniMax chat completions |
45
45
  | `nemoclaw` | NemoClaw | none | NVIDIA sandboxed agent execution |\n| `aps` | APS | none | Delegation-chain trust mapping |
46
+ | `copilot` | GitHub Copilot | none | Code generate/review/explain/fix/test/refactor |
47
+ | `langgraph` | LangGraph | `@langchain/langgraph` | Compiled StateGraph execution |
48
+ | `anthropic-computer-use` | Anthropic Computer Use | `@anthropic-ai/sdk` | Screenshot/click/type/scroll automation |
49
+ | `openai-agents` | OpenAI Agents SDK | `openai` | Tool use, handoffs, guardrails |
50
+ | `vertex-ai` | Vertex AI / Gemini | `@google-cloud/vertexai` | Function calling, multi-modal |
51
+ | `pydantic-ai` | Pydantic AI | none | Structured output with validation |
52
+ | `browser-agent` | Browser Automation | none | Playwright/Puppeteer/CDP browser control |
46
53
 
47
54
  ---
48
55
 
@@ -244,7 +251,7 @@ export class MyFrameworkAdapter extends BaseAdapter {
244
251
  ```bash
245
252
  npx ts-node test-standalone.ts # 88 core tests
246
253
  npx ts-node test-security.ts # 34 security tests
247
- npx ts-node test-adapters.ts # 176 adapter tests (all 17 frameworks)
254
+ npx ts-node test-adapters.ts # 206 adapter tests (all 27 frameworks)
248
255
  npx ts-node test-cli.ts # 65 CLI tests
249
256
  npx ts-node test-qa.ts # 67 QA orchestrator tests
250
257
  ```
@@ -255,7 +262,7 @@ npx ts-node test-qa.ts # 67 QA orchestrator tests
255
262
 
256
263
  ```bash
257
264
  npx ts-node setup.ts --check # Verify installation
258
- npx ts-node setup.ts --list # List all 17 adapters
265
+ npx ts-node setup.ts --list # List all 27 adapters
259
266
  npx ts-node setup.ts --example # Generate example.ts
260
267
  ```
261
268
 
@@ -374,7 +381,15 @@ Your App
374
381
  ├── HaystackAdapter ─── Haystack pipelines
375
382
  ├── DSPyAdapter ─── DSPy modules
376
383
  ├── AgnoAdapter ─── Agno agents/teams
377
- └── APSAdapter ─── APS delegation-chain trust
384
+ ├── AgnoAdapter ─── Agno agents/teams
385
+ ├── APSAdapter ─── APS delegation-chain trust
386
+ ├── CopilotAdapter ─── GitHub Copilot
387
+ ├── LangGraphAdapter ─── LangGraph state graphs
388
+ ├── VertexAIAdapter ─── Vertex AI / Gemini
389
+ ├── PydanticAIAdapter ─── Pydantic AI structured output
390
+ ├── OpenAIAgentsAdapter ─── OpenAI Agents SDK
391
+ ├── AnthropicComputerUseAdapter ─── Computer Use
392
+ └── BrowserAgentAdapter ─── Browser automation
378
393
  ```
379
394
 
380
395
  ---
@@ -604,13 +619,25 @@ import SwarmOrchestrator, {
604
619
  // Factory
605
620
  import { createSwarmOrchestrator } from 'network-ai';
606
621
 
607
- // All 17 adapters
622
+ // All 27 adapters
608
623
  import {
609
624
  AdapterRegistry, BaseAdapter,
610
625
  OpenClawAdapter, LangChainAdapter, AutoGenAdapter,
611
626
  CrewAIAdapter, MCPAdapter, CustomAdapter,
612
627
  LlamaIndexAdapter, SemanticKernelAdapter, OpenAIAssistantsAdapter,
613
628
  HaystackAdapter, DSPyAdapter, AgnoAdapter,
629
+ CopilotAdapter, LangGraphAdapter, AnthropicComputerUseAdapter,
630
+ OpenAIAgentsAdapter, VertexAIAdapter, PydanticAIAdapter, BrowserAgentAdapter,
631
+ } from 'network-ai';
632
+
633
+ // v5.0 modules
634
+ import {
635
+ AgentVCR, ComparisonRunner, CoverageReporter,
636
+ JobQueue, FileJobStore, ApprovalInbox,
637
+ SwarmTransportServer, SwarmTransportClient,
638
+ startPlayground, createAdapterTestSuite,
639
+ parseGoal, validateGoal, compileGoal,
640
+ NoOpAuthValidator,
614
641
  } from 'network-ai';
615
642
 
616
643
  // Types
package/README.md CHANGED
@@ -5,10 +5,10 @@
5
5
  [![Website](https://img.shields.io/badge/website-network--ai.org-4b9df2?style=flat&logo=web&logoColor=white)](https://network-ai.org/)
6
6
  [![CI](https://github.com/Jovancoding/Network-AI/actions/workflows/ci.yml/badge.svg)](https://github.com/Jovancoding/Network-AI/actions/workflows/ci.yml)
7
7
  [![CodeQL](https://github.com/Jovancoding/Network-AI/actions/workflows/codeql.yml/badge.svg)](https://github.com/Jovancoding/Network-AI/actions/workflows/codeql.yml)
8
- [![Release](https://img.shields.io/badge/release-v4.15.3-blue.svg)](https://github.com/Jovancoding/Network-AI/releases)
8
+ [![Release](https://img.shields.io/badge/release-v5.1.0-blue.svg)](https://github.com/Jovancoding/Network-AI/releases)
9
9
  [![npm](https://img.shields.io/npm/dw/network-ai.svg?label=npm%20downloads)](https://www.npmjs.com/package/network-ai)
10
- [![Tests](https://img.shields.io/badge/tests-2357%20passing-brightgreen.svg)](#testing)
11
- [![Adapters](https://img.shields.io/badge/frameworks-17%20supported-blueviolet.svg)](#adapter-system)
10
+ [![Tests](https://img.shields.io/badge/tests-2691%20passing-brightgreen.svg)](#testing)
11
+ [![Adapters](https://img.shields.io/badge/frameworks-27%20supported-blueviolet.svg)](#adapter-system)
12
12
  [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE)
13
13
  [![Socket](https://socket.dev/api/badge/npm/package/network-ai)](https://socket.dev/npm/package/network-ai/overview)
14
14
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org)
@@ -23,12 +23,17 @@
23
23
  <img src="assets/demo.svg" alt="Network-AI control-plane demo — atomic blackboard, priority preemption, AuthGuardian, FSM governance" width="720">
24
24
  </p>
25
25
 
26
+ <p align="center">
27
+ <b>If Network-AI is useful to you, consider <a href="https://github.com/Jovancoding/Network-AI">giving it a star ⭐</a> — it helps others find the project.</b>
28
+ </p>
29
+
26
30
  Network-AI is a TypeScript/Node.js multi-agent orchestrator that adds coordination, guardrails, and governance to any AI agent stack.
27
31
 
28
32
  - **Shared blackboard with locking** — atomic `propose → validate → commit` prevents race conditions and split-brain failures across parallel agents
29
33
  - **Guardrails and budgets** — FSM governance, per-agent token ceilings, HMAC / Ed25519 audit trails, and permission gating
30
- - **17 adapters** — LangChain (+ streaming), AutoGen, CrewAI, OpenAI Assistants, LlamaIndex, Semantic Kernel, Haystack, DSPy, Agno, MCP, Custom (+ streaming), OpenClaw, A2A, Codex, MiniMax, NemoClaw, and APS — no glue code, no lock-in
34
+ - **27 adapters** — LangChain (+ streaming), AutoGen, CrewAI, OpenAI Assistants, LlamaIndex, Semantic Kernel, Haystack, DSPy, Agno, MCP, Custom (+ streaming), OpenClaw, A2A, Codex, MiniMax, NemoClaw, APS, Copilot, LangGraph, Anthropic Computer Use, OpenAI Agents SDK, Vertex AI, Pydantic AI, Browser Agent, and Orchestrator (hierarchical multi-orchestrator) — no glue code, no lock-in
31
35
  - **Persistent project memory (Layer 3)** — `context_manager.py` injects decisions, goals, stack, milestones, and banned patterns into every system prompt so agents always have full project context
36
+ - **v5.0 modules** — Agent VCR (record/replay), comparison runner, coverage reporter, goal DSL, approval inbox, job queue, gRPC/HTTP transport, playground REPL, adapter test harness, and more
32
37
 
33
38
  > **The silent failure mode in multi-agent systems:** parallel agents writing to the same key
34
39
  > use last-write-wins by default — one agent's result silently overwrites another's mid-flight.
@@ -85,7 +90,7 @@ Runs priority preemption, AuthGuardian permission gating, FSM governance, and co
85
90
  | ✅ Token budgets | Hard per-agent ceilings with live spend tracking |
86
91
  | ✅ Permission gating | HMAC / Ed25519-signed tokens, scoped per agent and resource |
87
92
  | ✅ Append-only audit log | Every write, grant, and transition signed and logged |
88
- | ✅ 17 framework adapters | LangChain, CrewAI, AutoGen, MCP, Codex, APS, and 11 more — zero lock-in |
93
+ | ✅ 27 framework adapters | LangChain, CrewAI, AutoGen, MCP, Codex, APS, and 21 more — zero lock-in |
89
94
  | ✅ FSM governance | Hard-stop agents at state boundaries, timeout enforcement |
90
95
  | ✅ Compliance monitoring | Real-time violation detection (tool abuse, turn-taking, timeouts) |
91
96
  | ✅ QA orchestration | Scenario replay, feedback loops, regression tracking, contradiction detection |
@@ -103,6 +108,16 @@ Runs priority preemption, AuthGuardian permission gating, FSM governance, and co
103
108
  | ✅ Pipe mode | JSON stdin/stdout protocol for programmatic AI-to-orchestrator control |
104
109
  | ✅ Strategy agent | Meta-orchestrator with elastic agent pools, workload partitioning, and adaptive scaling |
105
110
  | ✅ Goal decomposer | LLM-powered goal → task DAG → parallel execution with `runTeam()` one-liner |
111
+ | ✅ Goal DSL | YAML/JSON goal definitions with cycle detection and topological compilation |
112
+ | ✅ Agent VCR | Record and replay LLM/agent interactions for deterministic tests |
113
+ | ✅ Comparison runner | Side-by-side adapter comparison with scoring, timing, cost analysis |
114
+ | ✅ Coverage reporter | V8 coverage collection with threshold enforcement |
115
+ | ✅ Job queue | Persistent priority FIFO with retries, crash recovery, pluggable backends |
116
+ | ✅ Approval inbox | Web-accessible approval queue with REST API and SSE streaming |
117
+ | ✅ Transport layer | JSON-RPC 2.0 over HTTP with HMAC auth, TTL, node allowlisting |
118
+ | ✅ Playground REPL | Interactive sandbox with mock agents for rapid prototyping |
119
+ | ✅ Adapter test harness | Parameterized test battery for any adapter implementation |
120
+ | ✅ IAuthValidator | Interface to decouple authorization from concrete AuthGuardian |
106
121
  | ✅ TypeScript native | ES2022 strict mode, zero native dependencies |
107
122
 
108
123
  ---
@@ -114,7 +129,7 @@ Runs priority preemption, AuthGuardian permission gating, FSM governance, and co
114
129
  | Race conditions in parallel agents | Atomic blackboard: `propose → validate → commit` with file-system mutex |
115
130
  | Agent overspend / runaway costs | `FederatedBudget` — hard per-agent token ceilings with live spend tracking |
116
131
  | No visibility into what agents did | HMAC / Ed25519-signed audit log on every write, permission grant, and FSM transition |
117
- | Locked into one AI framework | 17 adapters — mix LangChain + AutoGen + CrewAI + Codex + MiniMax + NemoClaw + APS + custom in one swarm |
132
+ | Locked into one AI framework | 27 adapters — mix LangChain + AutoGen + CrewAI + Codex + MiniMax + NemoClaw + APS + LangGraph + Vertex AI + custom in one swarm |
118
133
  | Agents escalating beyond their scope | `AuthGuardian` — scoped permission tokens required before sensitive operations |
119
134
  | Agents lack project context between runs | `ProjectContextManager` (Layer 3) — inject decisions, goals, stack, and milestones into every system prompt |
120
135
  | No regression tracking on agent output quality | `QAOrchestratorAgent` — scenario replay, feedback loops, cross-agent contradiction detection, historical trend tracking |
@@ -335,7 +350,7 @@ npx ts-node examples/10-nemoclaw-sandbox-swarm.ts
335
350
 
336
351
  ## Adapter System
337
352
 
338
- 17 adapters, zero adapter dependencies. You bring your own SDK objects.
353
+ 27 adapters, zero adapter dependencies. You bring your own SDK objects.
339
354
 
340
355
  | Adapter | Framework / Protocol | Register method |
341
356
  |---|---|---|
@@ -356,6 +371,14 @@ npx ts-node examples/10-nemoclaw-sandbox-swarm.ts
356
371
  | `MiniMaxAdapter` | MiniMax LLM API (M2.5 / M2.5-highspeed) | `registerAgent(name, config)` |
357
372
  | `NemoClawAdapter` | NVIDIA NemoClaw (sandboxed agents via OpenShell) | `registerSandboxAgent(name, config)` |
358
373
  | `APSAdapter` | Agent Permission Service (delegation-chain trust) | `apsDelegationToTrust(delegation)` |
374
+ | `CopilotAdapter` | GitHub Copilot (generate/review/explain/fix/test/refactor/chat) | `registerAgent(name, config)` |
375
+ | `LangGraphAdapter` | LangGraph (compiled StateGraph) | `registerGraph(name, graph)` |
376
+ | `AnthropicComputerUseAdapter` | Anthropic Computer Use (screenshot/click/type/scroll) | `registerAgent(name, config)` |
377
+ | `OpenAIAgentsAdapter` | OpenAI Agents SDK (tool use, handoffs, guardrails) | `registerAgent(name, runner)` |
378
+ | `VertexAIAdapter` | Google Vertex AI / Gemini (function calling, multi-modal) | `registerAgent(name, config)` |
379
+ | `PydanticAIAdapter` | Pydantic AI (structured output, validation, deps injection) | `registerAgent(name, config)` |
380
+ | `BrowserAgentAdapter` | Browser automation (Playwright/Puppeteer/CDP) | `registerAgent(name, driver)` |
381
+ | `OrchestratorAdapter` | Hierarchical multi-orchestrator coordination | `registerOrchestrator(id, orchestrator)` |
359
382
 
360
383
  **Streaming variants** (drop-in replacements with `.stream()` support):
361
384
 
@@ -374,7 +397,7 @@ Extend `BaseAdapter` (or `StreamingBaseAdapter` for streaming) to add your own i
374
397
 
375
398
  | Capability | Network-AI | LangGraph | CrewAI | AutoGen |
376
399
  |---|---|---|---|---|
377
- | Cross-framework agents in one swarm | ✅ 17 built-in adapters | ⚠️ Nodes can call any code; no adapter abstraction | ⚠️ Extensible via tools; CrewAI-native agents only | ⚠️ Extensible via plugins; AutoGen-native agents only |
400
+ | Cross-framework agents in one swarm | ✅ 27 built-in adapters | ⚠️ Nodes can call any code; no adapter abstraction | ⚠️ Extensible via tools; CrewAI-native agents only | ⚠️ Extensible via plugins; AutoGen-native agents only |
378
401
  | Atomic shared state (conflict-safe) | ✅ `propose → validate → commit` mutex | ⚠️ State passed between nodes; last-write-wins | ⚠️ Shared memory available; no conflict resolution | ⚠️ Shared context available; no conflict resolution |
379
402
  | Hard token ceiling per agent | ✅ `FederatedBudget` (first-class API) | ⚠️ Via callbacks / custom middleware | ⚠️ Via callbacks / custom middleware | ⚠️ Built-in token tracking in v0.4+; no swarm-level ceiling |
380
403
  | Permission gating before sensitive ops | ✅ `AuthGuardian` (built-in) | ⚠️ Possible via custom node logic | ⚠️ Possible via custom tools | ⚠️ Possible via custom middleware |
@@ -390,7 +413,7 @@ Extend `BaseAdapter` (or `StreamingBaseAdapter` for streaming) to add your own i
390
413
  npm run test:all # All suites in sequence
391
414
  npm test # Core orchestrator
392
415
  npm run test:security # Security module
393
- npm run test:adapters # All 17 adapters
416
+ npm run test:adapters # All 27 adapters
394
417
  npm run test:streaming # Streaming adapters
395
418
  npm run test:a2a # A2A protocol adapter
396
419
  npm run test:codex # Codex adapter
@@ -400,7 +423,7 @@ npm run test:phase9 # Agent runtime, console, strategy agent
400
423
  npm run test:phase10 # Goal decomposer, task DAG, runTeam
401
424
  ```
402
425
 
403
- **2,357 passing assertions across 25 test suites** (`npm run test:all`):
426
+ **2,691 passing assertions across 26 test suites** (`npm run test:all`):
404
427
 
405
428
  | Suite | Assertions | Covers |
406
429
  |---|---|---|
@@ -408,7 +431,7 @@ npm run test:phase10 # Goal decomposer, task DAG, runTeam
408
431
  | `test-phase5f.ts` | 127 | SSE transport, `McpCombinedBridge`, extended MCP tools |
409
432
  | `test-phase5g.ts` | 121 | CRDT backend, vector clocks, bidirectional sync |
410
433
  | `test-phase6.ts` | 121 | MCP server, control-plane tools, audit tools |
411
- | `test-adapters.ts` | 176 | All 17 adapters, registry routing, integration, edge cases |
434
+ | `test-adapters.ts` | 206 | All 27 adapters, registry routing, integration, edge cases |
412
435
  | `test-phase5d.ts` | 117 | Pluggable backend (Redis, CRDT, Memory) |
413
436
  | `test-standalone.ts` | 88 | Blackboard, auth, integration, persistence, parallelisation, quality gate |
414
437
  | `test-phase5e.ts` | 87 | Federated budget tracking |
@@ -428,6 +451,8 @@ npm run test:phase10 # Goal decomposer, task DAG, runTeam
428
451
  | `test-phase8.ts` | 146 | Phase pipeline, confidence filter, matcher-based hooks, fan-out/fan-in |
429
452
  | `test-phase9.ts` | 280 | Agent runtime, sandbox policy, shell executor, file accessor, approval gate, console UI, orchestrator wiring, pipe mode, strategy agent |
430
453
  | `test-phase10.ts` | 153 | Goal decomposer, task DAG validation, topological layers, JSON parsing, team runner, concurrency, timeouts, events, runTeam one-liner, dependency injection, LLM planner |
454
+ | `test-topology.ts` | 304 | WorkTree, ControlPlane, dashboard server, topology visualization, WebSocket protocol |
455
+ | `test.ts` | 39 | Core orchestrator smoke tests |
431
456
 
432
457
  ---
433
458
 
@@ -436,16 +461,16 @@ npm run test:phase10 # Goal decomposer, task DAG, runTeam
436
461
  | Doc | Contents |
437
462
  |---|---|
438
463
  | [QUICKSTART.md](QUICKSTART.md) | Installation, first run, CLI reference, PowerShell guide, Python scripts CLI |
439
- | [ARCHITECTURE.md](ARCHITECTURE.md) | Race condition problem, FSM design, handoff protocol, project structure |
464
+ | [ARCHITECTURE.md](ARCHITECTURE.md) | Race condition problem, FSM design, handoff protocol, module inventory, project structure |
440
465
  | [BENCHMARKS.md](BENCHMARKS.md) | Provider performance, rate limits, local GPU, `max_completion_tokens` guide |
441
- | [SECURITY.md](SECURITY.md) | Security module, permission system, trust levels, audit trail |
466
+ | [SECURITY.md](SECURITY.md) | Security module, permission system, trust levels, audit trail, v5.0 security additions |
442
467
  | [ENTERPRISE.md](ENTERPRISE.md) | Evaluation checklist, stability policy, security summary, integration entry points |
443
468
  | [AUDIT_LOG_SCHEMA.md](AUDIT_LOG_SCHEMA.md) | Audit log field reference, all event types, scoring formula |
444
469
  | [ADOPTERS.md](ADOPTERS.md) | Known adopters — open a PR to add yourself |
445
- | [INTEGRATION_GUIDE.md](INTEGRATION_GUIDE.md) | End-to-end integration walkthrough |
446
- | [references/adapter-system.md](references/adapter-system.md) | Adapter architecture, writing custom adapters |
447
- | [references/auth-guardian.md](references/auth-guardian.md) | Permission scoring, resource types |
448
- | [references/trust-levels.md](references/trust-levels.md) | Trust level configuration |
470
+ | [INTEGRATION_GUIDE.md](INTEGRATION_GUIDE.md) | End-to-end integration walkthrough with v5.0 modules |
471
+ | [references/adapter-system.md](references/adapter-system.md) | Adapter architecture, all 27 adapters, writing custom adapters |
472
+ | [references/auth-guardian.md](references/auth-guardian.md) | Permission scoring, resource types, IAuthValidator interface |
473
+ | [references/trust-levels.md](references/trust-levels.md) | Trust level configuration, APS delegation-chain mapping |
449
474
 
450
475
  ---
451
476
 
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Dashboard CLI entry point
4
+ *
5
+ * Launches the live agent topology dashboard on localhost.
6
+ * Usage: npx network-ai-dashboard [--port 4820]
7
+ *
8
+ * @module DashboardCLI
9
+ */
10
+
11
+ import { TopologyTracker } from '../lib/topology';
12
+ import { DashboardServer } from '../lib/dashboard-server';
13
+
14
+ const args = process.argv.slice(2);
15
+ let port = 4820;
16
+
17
+ for (let i = 0; i < args.length; i++) {
18
+ if (args[i] === '--port' && args[i + 1]) {
19
+ const p = parseInt(args[i + 1], 10);
20
+ if (!isNaN(p) && p > 0 && p < 65536) {
21
+ port = p;
22
+ }
23
+ i++;
24
+ }
25
+ }
26
+
27
+ const tracker = new TopologyTracker();
28
+ const dashboard = new DashboardServer(tracker, { port });
29
+
30
+ async function main(): Promise<void> {
31
+ await dashboard.start();
32
+
33
+ console.log(`
34
+ ╔══════════════════════════════════════════════════════╗
35
+ ║ Network-AI Live Agent Topology Dashboard ║
36
+ ║ ║
37
+ ║ Dashboard: http://127.0.0.1:${String(port).padEnd(5)} ║
38
+ ║ WebSocket: ws://127.0.0.1:${String(port).padEnd(5)} ║
39
+ ║ ║
40
+ ║ Press Ctrl+C to stop ║
41
+ ╚══════════════════════════════════════════════════════╝
42
+ `);
43
+
44
+ // Demo: spawn some agents to show the dashboard working
45
+ // In real usage, the orchestrator feeds real events
46
+ if (args.includes('--demo')) {
47
+ runDemo(tracker);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Runs a demo simulation with fake agents for demonstration purposes.
53
+ */
54
+ function runDemo(topo: TopologyTracker): void {
55
+ console.log(' Running demo simulation...\n');
56
+
57
+ topo.addAgent({ id: 'orchestrator', label: 'Orchestrator', role: 'orchestrator' });
58
+ topo.addAgent({ id: 'planner', label: 'Planner', role: 'planner', adapter: 'custom' });
59
+ topo.addAgent({ id: 'lc:researcher', label: 'Researcher', role: 'worker', adapter: 'langchain', tokenBudget: 5000 });
60
+ topo.addAgent({ id: 'lc:writer', label: 'Writer', role: 'worker', adapter: 'langchain', tokenBudget: 8000 });
61
+ topo.addAgent({ id: 'crew:reviewer', label: 'Reviewer', role: 'validator', adapter: 'crewai', tokenBudget: 3000 });
62
+ topo.addAgent({ id: 'aggregator', label: 'Aggregator', role: 'aggregator', adapter: 'custom' });
63
+
64
+ topo.setStatus('orchestrator', 'running');
65
+
66
+ let step = 0;
67
+ const interval = setInterval(() => {
68
+ step++;
69
+
70
+ switch (step) {
71
+ case 1:
72
+ topo.setStatus('planner', 'running');
73
+ topo.setTask('planner', 'Decomposing goal into tasks');
74
+ topo.addEdge('orchestrator', 'planner', 'delegation', 'plan');
75
+ break;
76
+ case 3:
77
+ topo.setStatus('planner', 'completed');
78
+ topo.addEdge('planner', 'orchestrator', 'result', 'task DAG');
79
+ topo.setStatus('lc:researcher', 'running');
80
+ topo.setStatus('lc:writer', 'running');
81
+ topo.setTask('lc:researcher', 'Analyzing codebase');
82
+ topo.setTask('lc:writer', 'Drafting documentation');
83
+ topo.addEdge('orchestrator', 'lc:researcher', 'delegation', 'research');
84
+ topo.addEdge('orchestrator', 'lc:writer', 'delegation', 'write');
85
+ break;
86
+ case 5:
87
+ topo.addTokens('lc:researcher', 1200);
88
+ topo.addTokens('lc:writer', 800);
89
+ topo.addEdge('lc:researcher', '_blackboard', 'blackboard_write', 'analysis:result');
90
+ break;
91
+ case 7:
92
+ topo.addTokens('lc:researcher', 2100);
93
+ topo.addTokens('lc:writer', 2500);
94
+ topo.addEdge('lc:writer', '_blackboard', 'blackboard_write', 'draft:v1');
95
+ topo.setStatus('lc:researcher', 'completed');
96
+ topo.setTask('lc:researcher', undefined);
97
+ break;
98
+ case 9:
99
+ topo.addTokens('lc:writer', 4200);
100
+ topo.setStatus('lc:writer', 'completed');
101
+ topo.setTask('lc:writer', undefined);
102
+ topo.setStatus('crew:reviewer', 'running');
103
+ topo.setTask('crew:reviewer', 'Reviewing draft');
104
+ topo.addEdge('crew:reviewer', '_blackboard', 'blackboard_read', 'draft:v1');
105
+ topo.addEdge('orchestrator', 'crew:reviewer', 'delegation', 'review');
106
+ break;
107
+ case 11:
108
+ topo.addTokens('crew:reviewer', 1500);
109
+ topo.setStatus('crew:reviewer', 'completed');
110
+ topo.addEdge('crew:reviewer', '_blackboard', 'blackboard_write', 'review:feedback');
111
+ topo.setStatus('aggregator', 'running');
112
+ topo.setTask('aggregator', 'Merging results');
113
+ topo.addEdge('aggregator', '_blackboard', 'blackboard_read', 'analysis:result');
114
+ topo.addEdge('orchestrator', 'aggregator', 'delegation', 'aggregate');
115
+ break;
116
+ case 13:
117
+ topo.setStatus('aggregator', 'completed');
118
+ topo.addEdge('aggregator', 'orchestrator', 'result', 'final output');
119
+ topo.setStatus('orchestrator', 'completed');
120
+ topo.setTask('orchestrator', 'Done');
121
+ break;
122
+ case 16:
123
+ // Reset for loop
124
+ step = 0;
125
+ topo.clear();
126
+ topo.addAgent({ id: 'orchestrator', label: 'Orchestrator', role: 'orchestrator' });
127
+ topo.addAgent({ id: 'planner', label: 'Planner', role: 'planner', adapter: 'custom' });
128
+ topo.addAgent({ id: 'lc:researcher', label: 'Researcher', role: 'worker', adapter: 'langchain', tokenBudget: 5000 });
129
+ topo.addAgent({ id: 'lc:writer', label: 'Writer', role: 'worker', adapter: 'langchain', tokenBudget: 8000 });
130
+ topo.addAgent({ id: 'crew:reviewer', label: 'Reviewer', role: 'validator', adapter: 'crewai', tokenBudget: 3000 });
131
+ topo.addAgent({ id: 'aggregator', label: 'Aggregator', role: 'aggregator', adapter: 'custom' });
132
+ topo.setStatus('orchestrator', 'running');
133
+ break;
134
+ }
135
+ }, 1500);
136
+
137
+ process.on('SIGINT', () => {
138
+ clearInterval(interval);
139
+ dashboard.stop().then(() => process.exit(0));
140
+ });
141
+ }
142
+
143
+ main().catch((err) => {
144
+ console.error('Failed to start dashboard:', err);
145
+ process.exit(1);
146
+ });
package/bin/mcp-server.ts CHANGED
@@ -162,11 +162,12 @@ async function runStdio(combined: McpCombinedBridge): Promise<void> {
162
162
  let request: McpJsonRpcRequest;
163
163
  try {
164
164
  request = JSON.parse(trimmed);
165
- } catch {
165
+ } catch (parseErr) {
166
+ const detail = parseErr instanceof Error ? parseErr.message : String(parseErr);
166
167
  const err = {
167
168
  jsonrpc: '2.0' as const,
168
169
  id: null,
169
- error: { code: -32700, message: 'Parse error' },
170
+ error: { code: -32700, message: `Parse error: ${detail}` },
170
171
  };
171
172
  process.stdout.write(JSON.stringify(err) + '\n');
172
173
  return;
@@ -14,6 +14,22 @@ import type { IAgentAdapter, AdapterConfig, AdapterRoute, RegistryConfig, AgentP
14
14
  * Used with registerDeferred() for lazy initialization.
15
15
  */
16
16
  export type AdapterFactory = () => IAgentAdapter;
17
+ /**
18
+ * Configurable retry behaviour for adapter execution.
19
+ *
20
+ * The policy uses exponential backoff with optional jitter.
21
+ * Only errors marked `recoverable` in the {@link AgentResult} trigger a retry.
22
+ */
23
+ export interface RetryPolicy {
24
+ /** Maximum number of retry attempts (0 = no retries, default). */
25
+ maxRetries: number;
26
+ /** Base delay in ms before the first retry (doubled each attempt). */
27
+ baseDelayMs: number;
28
+ /** Maximum delay cap in ms. */
29
+ maxDelayMs: number;
30
+ /** Optional fallback adapter name to try when all retries are exhausted. */
31
+ fallbackAdapter?: string;
32
+ }
17
33
  /**
18
34
  * Central registry that manages multiple agent framework adapters and
19
35
  * routes execution requests to the correct one.
@@ -42,7 +58,15 @@ export declare class AdapterRegistry {
42
58
  private eventHandlers;
43
59
  private agentCache;
44
60
  private deferredFactories;
45
- constructor(config?: RegistryConfig);
61
+ /** Opt-in retry policy for adapter execution. */
62
+ private retryPolicy;
63
+ constructor(config?: RegistryConfig & {
64
+ retryPolicy?: Partial<RetryPolicy>;
65
+ });
66
+ /**
67
+ * Update the retry policy at runtime.
68
+ */
69
+ setRetryPolicy(policy: Partial<RetryPolicy>): void;
46
70
  /**
47
71
  * Register an adapter with the registry.
48
72
  * Call this for each agent framework you want to support.
@@ -120,6 +144,14 @@ export declare class AdapterRegistry {
120
144
  * This is the primary method the SwarmOrchestrator calls.
121
145
  */
122
146
  executeAgent(agentId: string, payload: AgentPayload, context: AgentContext): Promise<AgentResult>;
147
+ /**
148
+ * Execute with exponential-backoff retries for recoverable errors.
149
+ */
150
+ private executeWithRetry;
151
+ /**
152
+ * Single adapter execution attempt with event emission.
153
+ */
154
+ private executeOnce;
123
155
  /**
124
156
  * Discover all agents across all registered adapters
125
157
  */
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-registry.d.ts","sourceRoot":"","sources":["../../adapters/adapter-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter-registry.d.ts","sourceRoot":"","sources":["../../adapters/adapter-registry.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.AdapterRegistry = void 0;
14
14
  exports.getRegistry = getRegistry;
15
15
  const errors_1 = require("../lib/errors");
16
+ const DEFAULT_RETRY_POLICY = {
17
+ maxRetries: 0,
18
+ baseDelayMs: 200,
19
+ maxDelayMs: 5000,
20
+ };
16
21
  /**
17
22
  * Central registry that manages multiple agent framework adapters and
18
23
  * routes execution requests to the correct one.
@@ -41,11 +46,20 @@ class AdapterRegistry {
41
46
  eventHandlers = new Map();
42
47
  agentCache = new Map(); // agentId -> adapterName
43
48
  deferredFactories = new Map();
49
+ /** Opt-in retry policy for adapter execution. */
50
+ retryPolicy;
44
51
  constructor(config) {
45
52
  if (config) {
46
53
  this.defaultAdapterName = config.defaultAdapter ?? null;
47
54
  this.routes = config.routes ?? [];
48
55
  }
56
+ this.retryPolicy = { ...DEFAULT_RETRY_POLICY, ...config?.retryPolicy };
57
+ }
58
+ /**
59
+ * Update the retry policy at runtime.
60
+ */
61
+ setRetryPolicy(policy) {
62
+ this.retryPolicy = { ...this.retryPolicy, ...policy };
49
63
  }
50
64
  // =========================================================================
51
65
  // ADAPTER MANAGEMENT
@@ -325,6 +339,41 @@ class AdapterRegistry {
325
339
  },
326
340
  };
327
341
  }
342
+ const result = await this.executeWithRetry(adapter, agentId, payload, context);
343
+ // If all retries exhausted and a fallback adapter is configured, try it
344
+ if (!result.success && result.error?.recoverable && this.retryPolicy.fallbackAdapter) {
345
+ const fallback = this.adapters.get(this.retryPolicy.fallbackAdapter);
346
+ if (fallback && fallback !== adapter) {
347
+ this.emit('agent:execution:fallback', this.retryPolicy.fallbackAdapter, { agentId, originalAdapter: adapter.name });
348
+ return this.executeOnce(fallback, agentId, payload, context);
349
+ }
350
+ }
351
+ return result;
352
+ }
353
+ /**
354
+ * Execute with exponential-backoff retries for recoverable errors.
355
+ */
356
+ async executeWithRetry(adapter, agentId, payload, context) {
357
+ let lastResult = await this.executeOnce(adapter, agentId, payload, context);
358
+ let attempt = 0;
359
+ while (attempt < this.retryPolicy.maxRetries &&
360
+ !lastResult.success &&
361
+ lastResult.error?.recoverable) {
362
+ attempt++;
363
+ const delay = Math.min(this.retryPolicy.baseDelayMs * Math.pow(2, attempt - 1), this.retryPolicy.maxDelayMs);
364
+ await new Promise(r => setTimeout(r, delay));
365
+ this.emit('agent:execution:retry', adapter.name, { agentId, attempt, delayMs: delay });
366
+ lastResult = await this.executeOnce(adapter, agentId, payload, context);
367
+ }
368
+ if (lastResult.metadata) {
369
+ lastResult.metadata.retryAttempts = attempt;
370
+ }
371
+ return lastResult;
372
+ }
373
+ /**
374
+ * Single adapter execution attempt with event emission.
375
+ */
376
+ async executeOnce(adapter, agentId, payload, context) {
328
377
  this.emit('agent:execution:start', adapter.name, { agentId, payload });
329
378
  const startTime = Date.now();
330
379
  try {