network-ai 5.10.1 → 5.11.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 +2 -2
- package/README.md +5 -3
- package/SKILL.md +3 -3
- package/dist/esm/adapters/a2a-adapter.js +235 -0
- package/dist/esm/adapters/a2a-adapter.js.map +1 -0
- package/dist/esm/adapters/adapter-registry.js +613 -0
- package/dist/esm/adapters/adapter-registry.js.map +1 -0
- package/dist/esm/adapters/agno-adapter.js +140 -0
- package/dist/esm/adapters/agno-adapter.js.map +1 -0
- package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/esm/adapters/aps-adapter.js +289 -0
- package/dist/esm/adapters/aps-adapter.js.map +1 -0
- package/dist/esm/adapters/autogen-adapter.js +141 -0
- package/dist/esm/adapters/autogen-adapter.js.map +1 -0
- package/dist/esm/adapters/base-adapter.js +104 -0
- package/dist/esm/adapters/base-adapter.js.map +1 -0
- package/dist/esm/adapters/browser-agent-adapter.js +219 -0
- package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/esm/adapters/codex-adapter.js +318 -0
- package/dist/esm/adapters/codex-adapter.js.map +1 -0
- package/dist/esm/adapters/copilot-adapter.js +132 -0
- package/dist/esm/adapters/copilot-adapter.js.map +1 -0
- package/dist/esm/adapters/crewai-adapter.js +148 -0
- package/dist/esm/adapters/crewai-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-adapter.js +142 -0
- package/dist/esm/adapters/custom-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
- package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
- package/dist/esm/adapters/dspy-adapter.js +127 -0
- package/dist/esm/adapters/dspy-adapter.js.map +1 -0
- package/dist/esm/adapters/haystack-adapter.js +149 -0
- package/dist/esm/adapters/haystack-adapter.js.map +1 -0
- package/dist/esm/adapters/hermes-adapter.js +217 -0
- package/dist/esm/adapters/hermes-adapter.js.map +1 -0
- package/dist/esm/adapters/index.js +109 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/langchain-adapter.js +134 -0
- package/dist/esm/adapters/langchain-adapter.js.map +1 -0
- package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
- package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
- package/dist/esm/adapters/langgraph-adapter.js +119 -0
- package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
- package/dist/esm/adapters/llamaindex-adapter.js +135 -0
- package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
- package/dist/esm/adapters/mcp-adapter.js +200 -0
- package/dist/esm/adapters/mcp-adapter.js.map +1 -0
- package/dist/esm/adapters/minimax-adapter.js +233 -0
- package/dist/esm/adapters/minimax-adapter.js.map +1 -0
- package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
- package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
- package/dist/esm/adapters/openai-agents-adapter.js +118 -0
- package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
- package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
- package/dist/esm/adapters/openclaw-adapter.js +107 -0
- package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
- package/dist/esm/adapters/orchestrator-adapter.js +218 -0
- package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/esm/adapters/rlm-adapter.js +167 -0
- package/dist/esm/adapters/rlm-adapter.js.map +1 -0
- package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
- package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
- package/dist/esm/adapters/streaming-base-adapter.js +74 -0
- package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
- package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
- package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/esm/demo-control-plane.js +147 -0
- package/dist/esm/demo-control-plane.js.map +1 -0
- package/dist/esm/demo-worktree-dashboard.js +131 -0
- package/dist/esm/demo-worktree-dashboard.js.map +1 -0
- package/dist/esm/examples/01-hello-swarm.js +165 -0
- package/dist/esm/examples/01-hello-swarm.js.map +1 -0
- package/dist/esm/examples/02-fsm-pipeline.js +189 -0
- package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/esm/examples/03-parallel-agents.js +192 -0
- package/dist/esm/examples/03-parallel-agents.js.map +1 -0
- package/dist/esm/examples/05-code-review-swarm.js +1177 -0
- package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
- package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/esm/examples/07-full-showcase.js +946 -0
- package/dist/esm/examples/07-full-showcase.js.map +1 -0
- package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/esm/examples/09-real-langchain.js +231 -0
- package/dist/esm/examples/09-real-langchain.js.map +1 -0
- package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/esm/examples/demo-runner.js +119 -0
- package/dist/esm/examples/demo-runner.js.map +1 -0
- package/dist/esm/index.js +1352 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/adapter-hooks.js +216 -0
- package/dist/esm/lib/adapter-hooks.js.map +1 -0
- package/dist/esm/lib/adapter-test-harness.js +118 -0
- package/dist/esm/lib/adapter-test-harness.js.map +1 -0
- package/dist/esm/lib/agent-conversation.js +155 -0
- package/dist/esm/lib/agent-conversation.js.map +1 -0
- package/dist/esm/lib/agent-debate.js +146 -0
- package/dist/esm/lib/agent-debate.js.map +1 -0
- package/dist/esm/lib/agent-memory.js +336 -0
- package/dist/esm/lib/agent-memory.js.map +1 -0
- package/dist/esm/lib/agent-runtime.js +818 -0
- package/dist/esm/lib/agent-runtime.js.map +1 -0
- package/dist/esm/lib/agent-vcr.js +218 -0
- package/dist/esm/lib/agent-vcr.js.map +1 -0
- package/dist/esm/lib/anomaly-detector.js +178 -0
- package/dist/esm/lib/anomaly-detector.js.map +1 -0
- package/dist/esm/lib/approval-inbox.js +385 -0
- package/dist/esm/lib/approval-inbox.js.map +1 -0
- package/dist/esm/lib/auth-guardian.js +692 -0
- package/dist/esm/lib/auth-guardian.js.map +1 -0
- package/dist/esm/lib/auth-validator.js +32 -0
- package/dist/esm/lib/auth-validator.js.map +1 -0
- package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
- package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
- package/dist/esm/lib/blackboard-backend-redis.js +244 -0
- package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
- package/dist/esm/lib/blackboard-backend.js +141 -0
- package/dist/esm/lib/blackboard-backend.js.map +1 -0
- package/dist/esm/lib/blackboard-validator.js +985 -0
- package/dist/esm/lib/blackboard-validator.js.map +1 -0
- package/dist/esm/lib/circuit-breaker.js +164 -0
- package/dist/esm/lib/circuit-breaker.js.map +1 -0
- package/dist/esm/lib/claim-verifier.js +173 -0
- package/dist/esm/lib/claim-verifier.js.map +1 -0
- package/dist/esm/lib/comparison-runner.js +138 -0
- package/dist/esm/lib/comparison-runner.js.map +1 -0
- package/dist/esm/lib/compliance-monitor.js +261 -0
- package/dist/esm/lib/compliance-monitor.js.map +1 -0
- package/dist/esm/lib/confidence-filter.js +210 -0
- package/dist/esm/lib/confidence-filter.js.map +1 -0
- package/dist/esm/lib/config-watcher.js +215 -0
- package/dist/esm/lib/config-watcher.js.map +1 -0
- package/dist/esm/lib/consistency.js +274 -0
- package/dist/esm/lib/consistency.js.map +1 -0
- package/dist/esm/lib/console-ui.js +276 -0
- package/dist/esm/lib/console-ui.js.map +1 -0
- package/dist/esm/lib/context-throttler.js +171 -0
- package/dist/esm/lib/context-throttler.js.map +1 -0
- package/dist/esm/lib/control-plane.js +527 -0
- package/dist/esm/lib/control-plane.js.map +1 -0
- package/dist/esm/lib/cost-governor.js +128 -0
- package/dist/esm/lib/cost-governor.js.map +1 -0
- package/dist/esm/lib/cost-heatmap.js +161 -0
- package/dist/esm/lib/cost-heatmap.js.map +1 -0
- package/dist/esm/lib/coverage-gate.js +213 -0
- package/dist/esm/lib/coverage-gate.js.map +1 -0
- package/dist/esm/lib/coverage-reporter.js +177 -0
- package/dist/esm/lib/coverage-reporter.js.map +1 -0
- package/dist/esm/lib/crdt.js +141 -0
- package/dist/esm/lib/crdt.js.map +1 -0
- package/dist/esm/lib/dashboard-server.js +403 -0
- package/dist/esm/lib/dashboard-server.js.map +1 -0
- package/dist/esm/lib/dry-run.js +130 -0
- package/dist/esm/lib/dry-run.js.map +1 -0
- package/dist/esm/lib/env-manager.js +518 -0
- package/dist/esm/lib/env-manager.js.map +1 -0
- package/dist/esm/lib/errors.js +201 -0
- package/dist/esm/lib/errors.js.map +1 -0
- package/dist/esm/lib/event-bus.js +229 -0
- package/dist/esm/lib/event-bus.js.map +1 -0
- package/dist/esm/lib/explainability.js +102 -0
- package/dist/esm/lib/explainability.js.map +1 -0
- package/dist/esm/lib/fan-out.js +237 -0
- package/dist/esm/lib/fan-out.js.map +1 -0
- package/dist/esm/lib/federated-budget.js +322 -0
- package/dist/esm/lib/federated-budget.js.map +1 -0
- package/dist/esm/lib/fsm-journey.js +478 -0
- package/dist/esm/lib/fsm-journey.js.map +1 -0
- package/dist/esm/lib/goal-decomposer.js +698 -0
- package/dist/esm/lib/goal-decomposer.js.map +1 -0
- package/dist/esm/lib/goal-dsl.js +391 -0
- package/dist/esm/lib/goal-dsl.js.map +1 -0
- package/dist/esm/lib/job-queue.js +310 -0
- package/dist/esm/lib/job-queue.js.map +1 -0
- package/dist/esm/lib/landscape-agent.js +134 -0
- package/dist/esm/lib/landscape-agent.js.map +1 -0
- package/dist/esm/lib/learning-loop.js +181 -0
- package/dist/esm/lib/learning-loop.js.map +1 -0
- package/dist/esm/lib/lifecycle-hooks.js +148 -0
- package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
- package/dist/esm/lib/locked-blackboard.js +1295 -0
- package/dist/esm/lib/locked-blackboard.js.map +1 -0
- package/dist/esm/lib/logger.js +150 -0
- package/dist/esm/lib/logger.js.map +1 -0
- package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
- package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
- package/dist/esm/lib/mcp-bridge.js +357 -0
- package/dist/esm/lib/mcp-bridge.js.map +1 -0
- package/dist/esm/lib/mcp-tool-consumer.js +287 -0
- package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/esm/lib/mcp-tools-control.js +392 -0
- package/dist/esm/lib/mcp-tools-control.js.map +1 -0
- package/dist/esm/lib/mcp-tools-extended.js +371 -0
- package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
- package/dist/esm/lib/mcp-transport-http.js +528 -0
- package/dist/esm/lib/mcp-transport-http.js.map +1 -0
- package/dist/esm/lib/mcp-transport-sse.js +503 -0
- package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
- package/dist/esm/lib/metrics.js +284 -0
- package/dist/esm/lib/metrics.js.map +1 -0
- package/dist/esm/lib/orchestrator-types.js +66 -0
- package/dist/esm/lib/orchestrator-types.js.map +1 -0
- package/dist/esm/lib/otel-bridge.js +167 -0
- package/dist/esm/lib/otel-bridge.js.map +1 -0
- package/dist/esm/lib/partition-planner.js +246 -0
- package/dist/esm/lib/partition-planner.js.map +1 -0
- package/dist/esm/lib/phase-pipeline.js +367 -0
- package/dist/esm/lib/phase-pipeline.js.map +1 -0
- package/dist/esm/lib/playground.js +224 -0
- package/dist/esm/lib/playground.js.map +1 -0
- package/dist/esm/lib/qa-orchestrator.js +296 -0
- package/dist/esm/lib/qa-orchestrator.js.map +1 -0
- package/dist/esm/lib/quadtree.js +259 -0
- package/dist/esm/lib/quadtree.js.map +1 -0
- package/dist/esm/lib/route-classifier.js +217 -0
- package/dist/esm/lib/route-classifier.js.map +1 -0
- package/dist/esm/lib/semantic-search.js +235 -0
- package/dist/esm/lib/semantic-search.js.map +1 -0
- package/dist/esm/lib/shared-blackboard.js +249 -0
- package/dist/esm/lib/shared-blackboard.js.map +1 -0
- package/dist/esm/lib/skill-composer.js +190 -0
- package/dist/esm/lib/skill-composer.js.map +1 -0
- package/dist/esm/lib/speculative-executor.js +107 -0
- package/dist/esm/lib/speculative-executor.js.map +1 -0
- package/dist/esm/lib/strategy-agent.js +626 -0
- package/dist/esm/lib/strategy-agent.js.map +1 -0
- package/dist/esm/lib/swarm-transport.js +307 -0
- package/dist/esm/lib/swarm-transport.js.map +1 -0
- package/dist/esm/lib/swarm-utils.js +510 -0
- package/dist/esm/lib/swarm-utils.js.map +1 -0
- package/dist/esm/lib/task-decomposer.js +272 -0
- package/dist/esm/lib/task-decomposer.js.map +1 -0
- package/dist/esm/lib/telemetry-provider.js +207 -0
- package/dist/esm/lib/telemetry-provider.js.map +1 -0
- package/dist/esm/lib/timeline-scrubber.js +173 -0
- package/dist/esm/lib/timeline-scrubber.js.map +1 -0
- package/dist/esm/lib/topology.js +591 -0
- package/dist/esm/lib/topology.js.map +1 -0
- package/dist/esm/lib/transport-agent.js +366 -0
- package/dist/esm/lib/transport-agent.js.map +1 -0
- package/dist/esm/lib/work-tree-dashboard.js +583 -0
- package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
- package/dist/esm/lib/work-tree-ui.js +333 -0
- package/dist/esm/lib/work-tree-ui.js.map +1 -0
- package/dist/esm/lib/work-tree.js +480 -0
- package/dist/esm/lib/work-tree.js.map +1 -0
- package/dist/esm/run.js +144 -0
- package/dist/esm/run.js.map +1 -0
- package/dist/esm/security.js +1122 -0
- package/dist/esm/security.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/mcp-transport-http.d.ts +203 -0
- package/dist/lib/mcp-transport-http.d.ts.map +1 -0
- package/dist/lib/mcp-transport-http.js +528 -0
- package/dist/lib/mcp-transport-http.js.map +1 -0
- package/dist/lib/phase-pipeline.d.ts +31 -0
- package/dist/lib/phase-pipeline.d.ts.map +1 -1
- package/dist/lib/phase-pipeline.js +93 -1
- package/dist/lib/phase-pipeline.js.map +1 -1
- package/dist/lib/semantic-search.d.ts +42 -6
- package/dist/lib/semantic-search.d.ts.map +1 -1
- package/dist/lib/semantic-search.js +87 -6
- package/dist/lib/semantic-search.js.map +1 -1
- package/package.json +24 -4
package/INTEGRATION_GUIDE.md
CHANGED
|
@@ -496,7 +496,7 @@ Run these before declaring the integration production-ready:
|
|
|
496
496
|
- [ ] `npx ts-node test-phase4.ts` — 147 behavioral tests pass
|
|
497
497
|
- [ ] `npx ts-node test-qa.ts` — 67 QA orchestrator tests pass
|
|
498
498
|
- [ ] `npx ts-node test-phase7.ts` — 94 Phase 7 tests pass (hooks, flow control, composer, semantic search)
|
|
499
|
-
- [ ] `npm run test:all` — all 3,
|
|
499
|
+
- [ ] `npm run test:all` — all 3,269 tests pass across 33 suites
|
|
500
500
|
- [ ] `npm run demo -- --08` runs to completion in < 10 seconds
|
|
501
501
|
|
|
502
502
|
### Race Condition Safety
|
|
@@ -564,4 +564,4 @@ Run these before declaring the integration production-ready:
|
|
|
564
564
|
|
|
565
565
|
---
|
|
566
566
|
|
|
567
|
-
*Network-AI v5.
|
|
567
|
+
*Network-AI v5.11.0 · MIT License · https://github.com/Jovancoding/Network-AI*
|
package/README.md
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
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
11
|
[](#adapter-system)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
[](https://socket.dev/npm/package/network-ai/overview)
|
|
@@ -440,7 +440,7 @@ npm run test:phase9 # Agent runtime, console, strategy agent
|
|
|
440
440
|
npm run test:phase12 # Context Throttler, Partition Planner, Coverage Gate, Route Classifier
|
|
441
441
|
```
|
|
442
442
|
|
|
443
|
-
**3,
|
|
443
|
+
**3,269 passing assertions across 33 test suites** (`npm run test:all`):
|
|
444
444
|
|
|
445
445
|
| Suite | Assertions | Covers |
|
|
446
446
|
|---|---|---|
|
|
@@ -474,6 +474,8 @@ npm run test:phase12 # Context Throttler, Partition Planner, Coverage Gate,
|
|
|
474
474
|
| `test-phase12.ts` | 65 | Context Throttler, Partition Planner, Coverage Gate, Route Classifier, EVALUATING FSM state, runTeam integration |
|
|
475
475
|
| `test-env-manager.ts` | 77 | Multi-environment isolation, promotion chain, backup/restore, source protection, NETWORK_AI_ENV, blackboard env routing |
|
|
476
476
|
| `test-transport.ts` | 117 | Basis transport tier: `TransportAgent` state machine, `LandscapeAgent` health tracking, `AgentPool` drain/pause, fleet coordination, canary, rollback |
|
|
477
|
+
| `test-claim-verifier.ts` | 50 | ClaimVerifier: receipt generation/tamper/expiry, corroborated/unsupported/undisclosed, trust decay/reset/DoS protection |
|
|
478
|
+
| `test-phase13.ts` | 58 | ESM dual-build config, McpStreamableServer dispatch + resources + prompts, PhasePipeline checkpoint/resume/clear, SemanticMemory save/load/autoSave/clearPersisted |
|
|
477
479
|
| `test.ts` | 39 | Core orchestrator smoke tests |
|
|
478
480
|
|
|
479
481
|
---
|
package/SKILL.md
CHANGED
|
@@ -755,7 +755,7 @@ The following findings are drawn from the **MAESTRO Agent Security Threat** fram
|
|
|
755
755
|
|
|
756
756
|
| Control | How Network-AI addresses it |
|
|
757
757
|
|---|---|
|
|
758
|
-
| **Exact version pinning** | npm `package.json` uses exact `"version": "5.
|
|
758
|
+
| **Exact version pinning** | npm `package.json` uses exact `"version": "5.11.0"` — no semver range specifiers; `clawhub install network-ai` pins to a specific published version |
|
|
759
759
|
| **Zero transitive dependency drift** | All bundled Python scripts use Python stdlib only — `pip install` is never required; there are no third-party packages to drift, be compromised upstream, or introduce CVEs |
|
|
760
760
|
| **Signed, tagged releases** | Every release is committed with a signed Git tag (`v5.7.x`); commit hash is verifiable against CHANGELOG.md; GitHub releases link tag → diff → changelog entry |
|
|
761
761
|
| **Supply chain monitoring** | npm package continuously scored by Socket.dev (score A); any new dependency or permission change triggers an alert |
|
|
@@ -777,8 +777,8 @@ This skill is scanned on every publish. The following Notes are flagged by desig
|
|
|
777
777
|
| **ASI06** Memory and Context Poisoning (audit log free text) | Low | `justification` field in permission requests and `data/audit_log.jsonl` store agent-provided free-text strings locally — PII or secrets placed there will persist on disk | Do not include PII, secrets, or credentials in justification text; restrict access to `data/` on shared machines; rotate/delete `audit_log.jsonl` when no longer needed |
|
|
778
778
|
| **ASI07** Insecure Inter-Agent Communication | High | Blackboard is local file-based; origin/identity depends on local file access, not authenticated messaging | Run in a trusted workspace; restrict file permissions on `data/`; review blackboard changes before relying on them for important decisions |
|
|
779
779
|
| **ASI08** Cascading Failures | ~~High~~ Resolved | `os` was referenced before import in `swarm_guard.py` — fixed in v5.4.4; `import os` now present | Fixed — `swarm_guard.py` now imports `os` at module level; budget/health guard starts correctly |
|
|
780
|
-
| **SkillSpector** Intent-Code Divergence (`FILE_EXPORT` missing from `HIGH_RISK_RESOURCES`) | ~~Low~~ Resolved | Comment stated `FILE_EXPORT` requires `--confirm-high-risk` but `HIGH_RISK_RESOURCES` only contained `PAYMENTS` and `DATABASE`; file export requests could receive advisory grants without the extra acknowledgment | Fixed in v5.
|
|
781
|
-
| **SkillSpector** Description-Behavior Mismatch (`ensure_data_dir()` ignoring env scope) | ~~Medium~~ Resolved | `ensure_data_dir()` always created the fixed top-level `data/` directory instead of the active env-specific path, breaking environment isolation when `NETWORK_AI_ENV` is set | Fixed in v5.
|
|
780
|
+
| **SkillSpector** Intent-Code Divergence (`FILE_EXPORT` missing from `HIGH_RISK_RESOURCES`) | ~~Low~~ Resolved | Comment stated `FILE_EXPORT` requires `--confirm-high-risk` but `HIGH_RISK_RESOURCES` only contained `PAYMENTS` and `DATABASE`; file export requests could receive advisory grants without the extra acknowledgment | Fixed in v5.11.0 — `FILE_EXPORT` added to `HIGH_RISK_RESOURCES` in `check_permission.py`; now requires `--confirm-high-risk` consistent with the documented policy |
|
|
781
|
+
| **SkillSpector** Description-Behavior Mismatch (`ensure_data_dir()` ignoring env scope) | ~~Medium~~ Resolved | `ensure_data_dir()` always created the fixed top-level `data/` directory instead of the active env-specific path, breaking environment isolation when `NETWORK_AI_ENV` is set | Fixed in v5.11.0 — `ensure_data_dir()` now delegates to `_resolve_data_dir()` so audit log and grant files are always written to the correct env-scoped directory |
|
|
782
782
|
|
|
783
783
|
## References
|
|
784
784
|
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A2AAdapter — Agent-to-Agent (A2A) protocol adapter.
|
|
4
|
+
*
|
|
5
|
+
* Implements the Google A2A (Agent-to-Agent) open protocol that lets
|
|
6
|
+
* independently hosted agents discover each other through a standard
|
|
7
|
+
* Agent Card (/.well-known/agent.json) and exchange tasks via a
|
|
8
|
+
* JSON-RPC envelope posted to the agent's task endpoint.
|
|
9
|
+
*
|
|
10
|
+
* References:
|
|
11
|
+
* https://google.github.io/A2A/
|
|
12
|
+
* https://github.com/google/A2A
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
*
|
|
16
|
+
* const adapter = new A2AAdapter();
|
|
17
|
+
* await adapter.initialize({});
|
|
18
|
+
*
|
|
19
|
+
* // Register a remote agent by its Agent Card URL
|
|
20
|
+
* await adapter.registerRemoteAgent('remote-analyst', 'https://agent.example.com');
|
|
21
|
+
*
|
|
22
|
+
* // Or register a local agent that serves an A2A-compliant card
|
|
23
|
+
* adapter.registerLocalA2AAgent('local-writer', {
|
|
24
|
+
* name: 'Writing Agent',
|
|
25
|
+
* description: 'Draft documents given a topic',
|
|
26
|
+
* version: '1.0',
|
|
27
|
+
* capabilities: { streaming: false },
|
|
28
|
+
* taskEndpoint: 'https://writer.internal/tasks',
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* await registry.addAdapter(adapter);
|
|
32
|
+
*
|
|
33
|
+
* // In the orchestrator:
|
|
34
|
+
* delegateTask({ targetAgent: 'a2a:remote-analyst', ... })
|
|
35
|
+
*
|
|
36
|
+
* @module A2AAdapter
|
|
37
|
+
* @version 1.0.0
|
|
38
|
+
*/
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.A2AAdapter = void 0;
|
|
41
|
+
const base_adapter_1 = require("./base-adapter");
|
|
42
|
+
class A2AAdapter extends base_adapter_1.BaseAdapter {
|
|
43
|
+
name = 'a2a';
|
|
44
|
+
version = '1.0.0';
|
|
45
|
+
a2aAgents = new Map();
|
|
46
|
+
defaultBearerToken;
|
|
47
|
+
defaultTimeoutMs = 30_000;
|
|
48
|
+
fetchImpl = globalThis.fetch;
|
|
49
|
+
get capabilities() {
|
|
50
|
+
return {
|
|
51
|
+
streaming: false,
|
|
52
|
+
parallel: true,
|
|
53
|
+
bidirectional: false,
|
|
54
|
+
discovery: true,
|
|
55
|
+
authentication: true,
|
|
56
|
+
statefulSessions: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async initialize(config) {
|
|
60
|
+
await super.initialize(config);
|
|
61
|
+
if (config.defaultBearerToken)
|
|
62
|
+
this.defaultBearerToken = config.defaultBearerToken;
|
|
63
|
+
if (config.defaultTimeoutMs)
|
|
64
|
+
this.defaultTimeoutMs = config.defaultTimeoutMs;
|
|
65
|
+
if (config.fetchImpl)
|
|
66
|
+
this.fetchImpl = config.fetchImpl;
|
|
67
|
+
}
|
|
68
|
+
// ── Registration ────────────────────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Fetch the Agent Card from `<baseUrl>/.well-known/agent.json` and register
|
|
71
|
+
* the remote agent for use in the orchestrator.
|
|
72
|
+
*
|
|
73
|
+
* @param agentId - Local identifier (used in `delegate_task` calls)
|
|
74
|
+
* @param baseUrl - Root URL of the remote A2A-compliant agent server
|
|
75
|
+
* @param options - Optional bearer token / timeout override
|
|
76
|
+
*/
|
|
77
|
+
async registerRemoteAgent(agentId, baseUrl, options) {
|
|
78
|
+
const url = baseUrl.replace(/\/$/, '');
|
|
79
|
+
const card = await this.fetchAgentCard(url, options?.bearerToken ?? this.defaultBearerToken);
|
|
80
|
+
const taskEndpoint = card.taskEndpoint ??
|
|
81
|
+
(card.url ? `${card.url.replace(/\/$/, '')}/tasks` : `${url}/tasks`);
|
|
82
|
+
this.a2aAgents.set(agentId, {
|
|
83
|
+
baseUrl: url,
|
|
84
|
+
card,
|
|
85
|
+
taskEndpoint,
|
|
86
|
+
bearerToken: options?.bearerToken ?? this.defaultBearerToken,
|
|
87
|
+
timeoutMs: options?.timeoutMs ?? this.defaultTimeoutMs,
|
|
88
|
+
});
|
|
89
|
+
this.registerLocalAgent({
|
|
90
|
+
id: agentId,
|
|
91
|
+
name: card.name,
|
|
92
|
+
description: card.description ?? `Remote A2A agent at ${url}`,
|
|
93
|
+
capabilities: card.capabilities
|
|
94
|
+
? Object.keys(card.capabilities).filter(k => card.capabilities[k] === true)
|
|
95
|
+
: undefined,
|
|
96
|
+
status: 'available',
|
|
97
|
+
metadata: { a2aBaseUrl: url, taskEndpoint },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Register a local A2A agent whose card you already have (no network fetch).
|
|
102
|
+
* Useful when the card is embedded in config or returned from another service.
|
|
103
|
+
*/
|
|
104
|
+
registerLocalA2AAgent(agentId, card, options) {
|
|
105
|
+
this.a2aAgents.set(agentId, {
|
|
106
|
+
baseUrl: card.url ?? '',
|
|
107
|
+
card,
|
|
108
|
+
taskEndpoint: card.taskEndpoint,
|
|
109
|
+
bearerToken: options?.bearerToken ?? this.defaultBearerToken,
|
|
110
|
+
timeoutMs: options?.timeoutMs ?? this.defaultTimeoutMs,
|
|
111
|
+
});
|
|
112
|
+
this.registerLocalAgent({
|
|
113
|
+
id: agentId,
|
|
114
|
+
name: card.name,
|
|
115
|
+
description: card.description ?? `Local A2A agent: ${agentId}`,
|
|
116
|
+
capabilities: card.capabilities
|
|
117
|
+
? Object.keys(card.capabilities).filter(k => card.capabilities[k] === true)
|
|
118
|
+
: undefined,
|
|
119
|
+
status: 'available',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// ── Execution ───────────────────────────────────────────────────────────────
|
|
123
|
+
async executeAgent(agentId, payload, context) {
|
|
124
|
+
this.ensureReady();
|
|
125
|
+
const config = this.a2aAgents.get(agentId);
|
|
126
|
+
if (!config) {
|
|
127
|
+
return this.errorResult('AGENT_NOT_FOUND', `A2A agent "${agentId}" is not registered. Call registerRemoteAgent() or registerLocalA2AAgent() first.`, false);
|
|
128
|
+
}
|
|
129
|
+
const startTime = Date.now();
|
|
130
|
+
// Build the task instruction from the handoff payload
|
|
131
|
+
const instruction = payload.handoff?.instruction ??
|
|
132
|
+
(payload.params ? JSON.stringify(payload.params) : 'No instruction provided');
|
|
133
|
+
const taskId = `${context.taskId ?? 'task'}-${Date.now()}`;
|
|
134
|
+
const taskEnvelope = {
|
|
135
|
+
jsonrpc: '2.0',
|
|
136
|
+
id: taskId,
|
|
137
|
+
method: 'tasks/send',
|
|
138
|
+
params: {
|
|
139
|
+
id: taskId,
|
|
140
|
+
message: {
|
|
141
|
+
role: 'user',
|
|
142
|
+
parts: [{ type: 'text', text: instruction }],
|
|
143
|
+
},
|
|
144
|
+
metadata: {
|
|
145
|
+
sourceAgent: context.agentId,
|
|
146
|
+
sessionId: context.sessionId,
|
|
147
|
+
...(payload.handoff?.context ?? {}),
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
const response = await this.sendTask(config, taskEnvelope);
|
|
153
|
+
if (response.error) {
|
|
154
|
+
return this.errorResult(`A2A_ERROR_${response.error.code}`, response.error.message, response.error.code >= 500, response.error);
|
|
155
|
+
}
|
|
156
|
+
if (!response.result) {
|
|
157
|
+
return this.errorResult('A2A_EMPTY_RESPONSE', 'A2A response had no result field', true);
|
|
158
|
+
}
|
|
159
|
+
const state = response.result.status.state;
|
|
160
|
+
if (state === 'failed' || state === 'canceled') {
|
|
161
|
+
return this.errorResult(`A2A_TASK_${state.toUpperCase()}`, response.result.status.message ?? `Task ended with state: ${state}`, state === 'failed');
|
|
162
|
+
}
|
|
163
|
+
// Extract text from artifacts
|
|
164
|
+
const output = this.extractOutput(response.result.artifacts);
|
|
165
|
+
return this.successResult({ output, state, artifacts: response.result.artifacts, metadata: response.result.metadata }, Date.now() - startTime);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
169
|
+
return this.errorResult('A2A_TIMEOUT', `A2A request timed out after ${config.timeoutMs}ms`, true);
|
|
170
|
+
}
|
|
171
|
+
return this.errorResult('A2A_REQUEST_FAILED', err instanceof Error ? err.message : 'A2A request failed', true, err);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ── Internals ───────────────────────────────────────────────────────────────
|
|
175
|
+
async fetchAgentCard(baseUrl, bearerToken) {
|
|
176
|
+
const cardUrl = `${baseUrl}/.well-known/agent.json`;
|
|
177
|
+
const headers = { Accept: 'application/json' };
|
|
178
|
+
if (bearerToken)
|
|
179
|
+
headers.Authorization = `Bearer ${bearerToken}`;
|
|
180
|
+
const controller = new AbortController();
|
|
181
|
+
const id = setTimeout(() => controller.abort(), this.defaultTimeoutMs);
|
|
182
|
+
let response;
|
|
183
|
+
try {
|
|
184
|
+
response = await this.fetchImpl(cardUrl, { headers, signal: controller.signal });
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
clearTimeout(id);
|
|
188
|
+
}
|
|
189
|
+
if (!response.ok) {
|
|
190
|
+
throw new Error(`Failed to fetch agent card from ${cardUrl}: HTTP ${response.status}`);
|
|
191
|
+
}
|
|
192
|
+
const card = await response.json();
|
|
193
|
+
if (!card.name) {
|
|
194
|
+
throw new Error(`Agent card at ${cardUrl} is missing required "name" field`);
|
|
195
|
+
}
|
|
196
|
+
return card;
|
|
197
|
+
}
|
|
198
|
+
async sendTask(config, task) {
|
|
199
|
+
const headers = {
|
|
200
|
+
'Content-Type': 'application/json',
|
|
201
|
+
Accept: 'application/json',
|
|
202
|
+
};
|
|
203
|
+
if (config.bearerToken)
|
|
204
|
+
headers.Authorization = `Bearer ${config.bearerToken}`;
|
|
205
|
+
const controller = new AbortController();
|
|
206
|
+
const id = setTimeout(() => controller.abort(), config.timeoutMs);
|
|
207
|
+
let response;
|
|
208
|
+
try {
|
|
209
|
+
response = await this.fetchImpl(config.taskEndpoint, {
|
|
210
|
+
method: 'POST',
|
|
211
|
+
headers,
|
|
212
|
+
body: JSON.stringify(task),
|
|
213
|
+
signal: controller.signal,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
clearTimeout(id);
|
|
218
|
+
}
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
throw new Error(`A2A task endpoint returned HTTP ${response.status}: ${response.statusText}`);
|
|
221
|
+
}
|
|
222
|
+
return response.json();
|
|
223
|
+
}
|
|
224
|
+
extractOutput(artifacts) {
|
|
225
|
+
if (!artifacts?.length)
|
|
226
|
+
return '';
|
|
227
|
+
return artifacts
|
|
228
|
+
.flatMap(a => a.parts)
|
|
229
|
+
.filter(p => p.type === 'text' && typeof p.text === 'string')
|
|
230
|
+
.map(p => p.text)
|
|
231
|
+
.join('\n');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.A2AAdapter = A2AAdapter;
|
|
235
|
+
//# sourceMappingURL=a2a-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-adapter.js","sourceRoot":"","sources":["../../../adapters/a2a-adapter.ts"],"names":[],"mappings":"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"}
|