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.
- package/INTEGRATION_GUIDE.md +12 -5
- package/QUICKSTART.md +32 -5
- package/README.md +42 -17
- package/bin/dashboard.ts +146 -0
- package/bin/mcp-server.ts +3 -2
- package/dist/adapters/adapter-registry.d.ts +33 -1
- package/dist/adapters/adapter-registry.d.ts.map +1 -1
- package/dist/adapters/adapter-registry.js +49 -0
- package/dist/adapters/adapter-registry.js.map +1 -1
- package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
- package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/adapters/browser-agent-adapter.d.ts +121 -0
- package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-agent-adapter.js +219 -0
- package/dist/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/adapters/copilot-adapter.d.ts +59 -0
- package/dist/adapters/copilot-adapter.d.ts.map +1 -0
- package/dist/adapters/copilot-adapter.js +132 -0
- package/dist/adapters/copilot-adapter.js.map +1 -0
- package/dist/adapters/custom-adapter.d.ts +1 -1
- package/dist/adapters/custom-adapter.js +1 -1
- package/dist/adapters/index.d.ts +17 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +25 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langchain-adapter.js +1 -1
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langgraph-adapter.d.ts +70 -0
- package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
- package/dist/adapters/langgraph-adapter.js +119 -0
- package/dist/adapters/langgraph-adapter.js.map +1 -0
- package/dist/adapters/mcp-adapter.d.ts +1 -1
- package/dist/adapters/mcp-adapter.js +3 -3
- package/dist/adapters/mcp-adapter.js.map +1 -1
- package/dist/adapters/openai-agents-adapter.d.ts +100 -0
- package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-agents-adapter.js +118 -0
- package/dist/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/adapters/openclaw-adapter.d.ts +1 -1
- package/dist/adapters/openclaw-adapter.js +3 -3
- package/dist/adapters/openclaw-adapter.js.map +1 -1
- package/dist/adapters/orchestrator-adapter.d.ts +118 -0
- package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
- package/dist/adapters/orchestrator-adapter.js +219 -0
- package/dist/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
- package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/vertex-ai-adapter.js +166 -0
- package/dist/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/bin/dashboard.d.ts +11 -0
- package/dist/bin/dashboard.d.ts.map +1 -0
- package/dist/bin/dashboard.js +135 -0
- package/dist/bin/dashboard.js.map +1 -0
- package/dist/bin/mcp-server.js +3 -2
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/demo-control-plane.d.ts +12 -0
- package/dist/demo-control-plane.d.ts.map +1 -0
- package/dist/demo-control-plane.js +147 -0
- package/dist/demo-control-plane.js.map +1 -0
- package/dist/demo-worktree-dashboard.d.ts +2 -0
- package/dist/demo-worktree-dashboard.d.ts.map +1 -0
- package/dist/demo-worktree-dashboard.js +131 -0
- package/dist/demo-worktree-dashboard.js.map +1 -0
- package/dist/examples/01-hello-swarm.d.ts +13 -0
- package/dist/examples/01-hello-swarm.d.ts.map +1 -0
- package/dist/examples/01-hello-swarm.js +165 -0
- package/dist/examples/01-hello-swarm.js.map +1 -0
- package/dist/examples/02-fsm-pipeline.d.ts +20 -0
- package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
- package/dist/examples/02-fsm-pipeline.js +189 -0
- package/dist/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/examples/03-parallel-agents.d.ts +21 -0
- package/dist/examples/03-parallel-agents.d.ts.map +1 -0
- package/dist/examples/03-parallel-agents.js +192 -0
- package/dist/examples/03-parallel-agents.js.map +1 -0
- package/dist/examples/05-code-review-swarm.d.ts +21 -0
- package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
- package/dist/examples/05-code-review-swarm.js +1177 -0
- package/dist/examples/05-code-review-swarm.js.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/examples/07-full-showcase.d.ts +27 -0
- package/dist/examples/07-full-showcase.d.ts.map +1 -0
- package/dist/examples/07-full-showcase.js +946 -0
- package/dist/examples/07-full-showcase.js.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/examples/09-real-langchain.d.ts +19 -0
- package/dist/examples/09-real-langchain.d.ts.map +1 -0
- package/dist/examples/09-real-langchain.js +231 -0
- package/dist/examples/09-real-langchain.js.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/examples/demo-runner.d.ts +2 -0
- package/dist/examples/demo-runner.d.ts.map +1 -0
- package/dist/examples/demo-runner.js +119 -0
- package/dist/examples/demo-runner.js.map +1 -0
- package/dist/index.d.ts +113 -559
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +310 -1074
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter-test-harness.d.ts +88 -0
- package/dist/lib/adapter-test-harness.d.ts.map +1 -0
- package/dist/lib/adapter-test-harness.js +118 -0
- package/dist/lib/adapter-test-harness.js.map +1 -0
- package/dist/lib/agent-conversation.d.ts +115 -0
- package/dist/lib/agent-conversation.d.ts.map +1 -0
- package/dist/lib/agent-conversation.js +155 -0
- package/dist/lib/agent-conversation.js.map +1 -0
- package/dist/lib/agent-debate.d.ts +115 -0
- package/dist/lib/agent-debate.d.ts.map +1 -0
- package/dist/lib/agent-debate.js +146 -0
- package/dist/lib/agent-debate.js.map +1 -0
- package/dist/lib/agent-memory.d.ts +157 -0
- package/dist/lib/agent-memory.d.ts.map +1 -0
- package/dist/lib/agent-memory.js +336 -0
- package/dist/lib/agent-memory.js.map +1 -0
- package/dist/lib/agent-vcr.d.ts +133 -0
- package/dist/lib/agent-vcr.d.ts.map +1 -0
- package/dist/lib/agent-vcr.js +218 -0
- package/dist/lib/agent-vcr.js.map +1 -0
- package/dist/lib/anomaly-detector.d.ts +112 -0
- package/dist/lib/anomaly-detector.d.ts.map +1 -0
- package/dist/lib/anomaly-detector.js +178 -0
- package/dist/lib/anomaly-detector.js.map +1 -0
- package/dist/lib/approval-inbox.d.ts +147 -0
- package/dist/lib/approval-inbox.d.ts.map +1 -0
- package/dist/lib/approval-inbox.js +385 -0
- package/dist/lib/approval-inbox.js.map +1 -0
- package/dist/lib/auth-guardian.d.ts +170 -0
- package/dist/lib/auth-guardian.d.ts.map +1 -0
- package/dist/lib/auth-guardian.js +604 -0
- package/dist/lib/auth-guardian.js.map +1 -0
- package/dist/lib/auth-validator.d.ts +70 -0
- package/dist/lib/auth-validator.d.ts.map +1 -0
- package/dist/lib/auth-validator.js +32 -0
- package/dist/lib/auth-validator.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +56 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -1
- package/dist/lib/blackboard-validator.js +181 -4
- package/dist/lib/blackboard-validator.js.map +1 -1
- package/dist/lib/comparison-runner.d.ts +99 -0
- package/dist/lib/comparison-runner.d.ts.map +1 -0
- package/dist/lib/comparison-runner.js +138 -0
- package/dist/lib/comparison-runner.js.map +1 -0
- package/dist/lib/config-watcher.d.ts +109 -0
- package/dist/lib/config-watcher.d.ts.map +1 -0
- package/dist/lib/config-watcher.js +215 -0
- package/dist/lib/config-watcher.js.map +1 -0
- package/dist/lib/control-plane.d.ts +128 -0
- package/dist/lib/control-plane.d.ts.map +1 -0
- package/dist/lib/control-plane.js +527 -0
- package/dist/lib/control-plane.js.map +1 -0
- package/dist/lib/cost-governor.d.ts +105 -0
- package/dist/lib/cost-governor.d.ts.map +1 -0
- package/dist/lib/cost-governor.js +128 -0
- package/dist/lib/cost-governor.js.map +1 -0
- package/dist/lib/cost-heatmap.d.ts +104 -0
- package/dist/lib/cost-heatmap.d.ts.map +1 -0
- package/dist/lib/cost-heatmap.js +161 -0
- package/dist/lib/cost-heatmap.js.map +1 -0
- package/dist/lib/coverage-reporter.d.ts +92 -0
- package/dist/lib/coverage-reporter.d.ts.map +1 -0
- package/dist/lib/coverage-reporter.js +177 -0
- package/dist/lib/coverage-reporter.js.map +1 -0
- package/dist/lib/dashboard-server.d.ts +71 -0
- package/dist/lib/dashboard-server.d.ts.map +1 -0
- package/dist/lib/dashboard-server.js +403 -0
- package/dist/lib/dashboard-server.js.map +1 -0
- package/dist/lib/dry-run.d.ts +73 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +130 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +38 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/event-bus.d.ts +167 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +229 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/explainability.d.ts +85 -0
- package/dist/lib/explainability.d.ts.map +1 -0
- package/dist/lib/explainability.js +102 -0
- package/dist/lib/explainability.js.map +1 -0
- package/dist/lib/goal-dsl.d.ts +157 -0
- package/dist/lib/goal-dsl.d.ts.map +1 -0
- package/dist/lib/goal-dsl.js +391 -0
- package/dist/lib/goal-dsl.js.map +1 -0
- package/dist/lib/job-queue.d.ts +183 -0
- package/dist/lib/job-queue.d.ts.map +1 -0
- package/dist/lib/job-queue.js +310 -0
- package/dist/lib/job-queue.js.map +1 -0
- package/dist/lib/learning-loop.d.ts +113 -0
- package/dist/lib/learning-loop.d.ts.map +1 -0
- package/dist/lib/learning-loop.js +181 -0
- package/dist/lib/learning-loop.js.map +1 -0
- package/dist/lib/lifecycle-hooks.d.ts +116 -0
- package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lib/lifecycle-hooks.js +148 -0
- package/dist/lib/lifecycle-hooks.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -1
- package/dist/lib/locked-blackboard.js +9 -5
- package/dist/lib/locked-blackboard.js.map +1 -1
- package/dist/lib/mcp-tool-consumer.d.ts +153 -0
- package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
- package/dist/lib/mcp-tool-consumer.js +320 -0
- package/dist/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/lib/metrics.d.ts +119 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +284 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/orchestrator-types.d.ts +309 -0
- package/dist/lib/orchestrator-types.d.ts.map +1 -0
- package/dist/lib/orchestrator-types.js +61 -0
- package/dist/lib/orchestrator-types.js.map +1 -0
- package/dist/lib/otel-bridge.d.ts +74 -0
- package/dist/lib/otel-bridge.d.ts.map +1 -0
- package/dist/lib/otel-bridge.js +167 -0
- package/dist/lib/otel-bridge.js.map +1 -0
- package/dist/lib/playground.d.ts +76 -0
- package/dist/lib/playground.d.ts.map +1 -0
- package/dist/lib/playground.js +224 -0
- package/dist/lib/playground.js.map +1 -0
- package/dist/lib/quadtree.d.ts +114 -0
- package/dist/lib/quadtree.d.ts.map +1 -0
- package/dist/lib/quadtree.js +259 -0
- package/dist/lib/quadtree.js.map +1 -0
- package/dist/lib/shared-blackboard.d.ts +101 -0
- package/dist/lib/shared-blackboard.d.ts.map +1 -0
- package/dist/lib/shared-blackboard.js +249 -0
- package/dist/lib/shared-blackboard.js.map +1 -0
- package/dist/lib/speculative-executor.d.ts +89 -0
- package/dist/lib/speculative-executor.d.ts.map +1 -0
- package/dist/lib/speculative-executor.js +107 -0
- package/dist/lib/speculative-executor.js.map +1 -0
- package/dist/lib/swarm-transport.d.ts +150 -0
- package/dist/lib/swarm-transport.d.ts.map +1 -0
- package/dist/lib/swarm-transport.js +307 -0
- package/dist/lib/swarm-transport.js.map +1 -0
- package/dist/lib/task-decomposer.d.ts +41 -0
- package/dist/lib/task-decomposer.d.ts.map +1 -0
- package/dist/lib/task-decomposer.js +272 -0
- package/dist/lib/task-decomposer.js.map +1 -0
- package/dist/lib/timeline-scrubber.d.ts +84 -0
- package/dist/lib/timeline-scrubber.d.ts.map +1 -0
- package/dist/lib/timeline-scrubber.js +173 -0
- package/dist/lib/timeline-scrubber.js.map +1 -0
- package/dist/lib/topology.d.ts +361 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +591 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/lib/work-tree-dashboard.d.ts +130 -0
- package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
- package/dist/lib/work-tree-dashboard.js +583 -0
- package/dist/lib/work-tree-dashboard.js.map +1 -0
- package/dist/lib/work-tree-ui.d.ts +107 -0
- package/dist/lib/work-tree-ui.d.ts.map +1 -0
- package/dist/lib/work-tree-ui.js +333 -0
- package/dist/lib/work-tree-ui.js.map +1 -0
- package/dist/lib/work-tree.d.ts +184 -0
- package/dist/lib/work-tree.d.ts.map +1 -0
- package/dist/lib/work-tree.js +480 -0
- package/dist/lib/work-tree.js.map +1 -0
- package/dist/security.d.ts +95 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +267 -4
- package/dist/security.js.map +1 -1
- package/package.json +8 -6
- package/types/agent-adapter.d.ts +5 -0
package/INTEGRATION_GUIDE.md
CHANGED
|
@@ -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
|
|
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` —
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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 #
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
[](https://network-ai.org/)
|
|
6
6
|
[](https://github.com/Jovancoding/Network-AI/actions/workflows/ci.yml)
|
|
7
7
|
[](https://github.com/Jovancoding/Network-AI/actions/workflows/codeql.yml)
|
|
8
|
-
[](https://github.com/Jovancoding/Network-AI/releases)
|
|
9
9
|
[](https://www.npmjs.com/package/network-ai)
|
|
10
|
-
[](#testing)
|
|
11
|
+
[](#adapter-system)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
[](https://socket.dev/npm/package/network-ai/overview)
|
|
14
14
|
[](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
|
-
- **
|
|
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
|
-
| ✅
|
|
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 |
|
|
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
|
-
|
|
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 | ✅
|
|
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
|
|
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,
|
|
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` |
|
|
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
|
|
package/bin/dashboard.ts
ADDED
|
@@ -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:
|
|
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
|
-
|
|
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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAS,EAET,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAGhC;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,aAAa,CAA2D;IAChF,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,iBAAiB,CAA8E;
|
|
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 {
|