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
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Typed Error Classes for Network-AI
|
|
4
|
+
*
|
|
5
|
+
* Provides specific error types so consumers can catch and handle
|
|
6
|
+
* different failure modes independently (e.g., retry on rate limit,
|
|
7
|
+
* re-authenticate on token expiry, alert on namespace violation).
|
|
8
|
+
*
|
|
9
|
+
* All errors extend NetworkAIError, which extends Error.
|
|
10
|
+
*
|
|
11
|
+
* @module Errors
|
|
12
|
+
* @version 1.0.0
|
|
13
|
+
* @license MIT
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TimeoutError = exports.ParallelLimitError = exports.AdapterNotInitializedError = exports.AdapterNotFoundError = exports.AdapterAlreadyRegisteredError = exports.ConflictError = exports.LockAcquisitionError = exports.ValidationError = exports.NamespaceViolationError = exports.IdentityVerificationError = exports.NetworkAIError = void 0;
|
|
17
|
+
exports.mapErrorToSkillResult = mapErrorToSkillResult;
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// BASE ERROR
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Base error class for all Network-AI errors.
|
|
23
|
+
* Every error includes a machine-readable `code` and optional `details`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* try {
|
|
28
|
+
* blackboard.write('key', value, 'agent');
|
|
29
|
+
* } catch (err) {
|
|
30
|
+
* if (err instanceof NetworkAIError) {
|
|
31
|
+
* console.log(err.code); // e.g., 'IDENTITY_VERIFICATION_FAILED'
|
|
32
|
+
* console.log(err.details); // { agentId: 'agent' }
|
|
33
|
+
* }
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class NetworkAIError extends Error {
|
|
38
|
+
/** Machine-readable error code */
|
|
39
|
+
code;
|
|
40
|
+
/** Additional structured context */
|
|
41
|
+
details;
|
|
42
|
+
constructor(message, code, details) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = 'NetworkAIError';
|
|
45
|
+
this.code = code;
|
|
46
|
+
this.details = details;
|
|
47
|
+
// Fix prototype chain for instanceof checks
|
|
48
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.NetworkAIError = NetworkAIError;
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// BLACKBOARD ERRORS
|
|
54
|
+
// ============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Thrown when an agent fails identity verification on blackboard write.
|
|
57
|
+
*/
|
|
58
|
+
class IdentityVerificationError extends NetworkAIError {
|
|
59
|
+
constructor(agentId) {
|
|
60
|
+
super(`Identity verification failed for agent '${agentId}'`, 'IDENTITY_VERIFICATION_FAILED', { agentId });
|
|
61
|
+
this.name = 'IdentityVerificationError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.IdentityVerificationError = IdentityVerificationError;
|
|
65
|
+
/**
|
|
66
|
+
* Thrown when an agent tries to write to a namespace it doesn't have access to.
|
|
67
|
+
*/
|
|
68
|
+
class NamespaceViolationError extends NetworkAIError {
|
|
69
|
+
constructor(agentId, key) {
|
|
70
|
+
super(`Agent '${agentId}' not allowed to write to key '${key}'`, 'NAMESPACE_VIOLATION', { agentId, key });
|
|
71
|
+
this.name = 'NamespaceViolationError';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.NamespaceViolationError = NamespaceViolationError;
|
|
75
|
+
/**
|
|
76
|
+
* Thrown when a value fails size or structure validation before write.
|
|
77
|
+
*/
|
|
78
|
+
class ValidationError extends NetworkAIError {
|
|
79
|
+
constructor(reason) {
|
|
80
|
+
super(`Value validation failed: ${reason}`, 'VALIDATION_FAILED', { reason });
|
|
81
|
+
this.name = 'ValidationError';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.ValidationError = ValidationError;
|
|
85
|
+
// ============================================================================
|
|
86
|
+
// LOCK ERRORS
|
|
87
|
+
// ============================================================================
|
|
88
|
+
/**
|
|
89
|
+
* Thrown when a file-system lock cannot be acquired within the timeout.
|
|
90
|
+
*/
|
|
91
|
+
class LockAcquisitionError extends NetworkAIError {
|
|
92
|
+
constructor(operation) {
|
|
93
|
+
super(`Failed to acquire lock for ${operation}`, 'LOCK_ACQUISITION_FAILED', { operation });
|
|
94
|
+
this.name = 'LockAcquisitionError';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.LockAcquisitionError = LockAcquisitionError;
|
|
98
|
+
/**
|
|
99
|
+
* Thrown when a conflict is detected during the atomic commit workflow.
|
|
100
|
+
*/
|
|
101
|
+
class ConflictError extends NetworkAIError {
|
|
102
|
+
constructor(key, expectedHash, actualHash) {
|
|
103
|
+
super(`Conflict detected for key '${key}': data changed since proposal`, 'CONFLICT_DETECTED', { key, expectedHash, actualHash });
|
|
104
|
+
this.name = 'ConflictError';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ConflictError = ConflictError;
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// ADAPTER ERRORS
|
|
110
|
+
// ============================================================================
|
|
111
|
+
/**
|
|
112
|
+
* Thrown when an adapter is already registered under the same name.
|
|
113
|
+
*/
|
|
114
|
+
class AdapterAlreadyRegisteredError extends NetworkAIError {
|
|
115
|
+
constructor(adapterName) {
|
|
116
|
+
super(`Adapter "${adapterName}" is already registered`, 'ADAPTER_ALREADY_REGISTERED', { adapterName });
|
|
117
|
+
this.name = 'AdapterAlreadyRegisteredError';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.AdapterAlreadyRegisteredError = AdapterAlreadyRegisteredError;
|
|
121
|
+
/**
|
|
122
|
+
* Thrown when referencing an adapter name that isn't in the registry.
|
|
123
|
+
*/
|
|
124
|
+
class AdapterNotFoundError extends NetworkAIError {
|
|
125
|
+
constructor(adapterName) {
|
|
126
|
+
super(`Adapter "${adapterName}" is not registered`, 'ADAPTER_NOT_FOUND', { adapterName });
|
|
127
|
+
this.name = 'AdapterNotFoundError';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.AdapterNotFoundError = AdapterNotFoundError;
|
|
131
|
+
/**
|
|
132
|
+
* Thrown when calling executeAgent on an adapter before it has been initialized.
|
|
133
|
+
*/
|
|
134
|
+
class AdapterNotInitializedError extends NetworkAIError {
|
|
135
|
+
constructor(adapterName) {
|
|
136
|
+
super(`Adapter "${adapterName}" is not initialized. Call initialize() first.`, 'ADAPTER_NOT_INITIALIZED', { adapterName });
|
|
137
|
+
this.name = 'AdapterNotInitializedError';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.AdapterNotInitializedError = AdapterNotInitializedError;
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// ORCHESTRATOR ERRORS
|
|
143
|
+
// ============================================================================
|
|
144
|
+
/**
|
|
145
|
+
* Thrown when too many parallel agents are requested.
|
|
146
|
+
*/
|
|
147
|
+
class ParallelLimitError extends NetworkAIError {
|
|
148
|
+
constructor(requested, maximum) {
|
|
149
|
+
super(`Cannot spawn ${requested} agents. Maximum is ${maximum}. Decompose further or use 'chain' strategy.`, 'PARALLEL_LIMIT_EXCEEDED', { requested, maximum });
|
|
150
|
+
this.name = 'ParallelLimitError';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.ParallelLimitError = ParallelLimitError;
|
|
154
|
+
/**
|
|
155
|
+
* Thrown when an operation exceeds its timeout.
|
|
156
|
+
*/
|
|
157
|
+
class TimeoutError extends NetworkAIError {
|
|
158
|
+
constructor(timeoutMs) {
|
|
159
|
+
super(`Operation timed out after ${timeoutMs}ms`, 'TIMEOUT', { timeoutMs });
|
|
160
|
+
this.name = 'TimeoutError';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.TimeoutError = TimeoutError;
|
|
164
|
+
// ============================================================================
|
|
165
|
+
// ERROR MAPPING UTILITY
|
|
166
|
+
// ============================================================================
|
|
167
|
+
/** Error codes that are considered recoverable (caller can retry). */
|
|
168
|
+
const RECOVERABLE_CODES = new Set([
|
|
169
|
+
'LOCK_ACQUISITION_FAILED',
|
|
170
|
+
'TIMEOUT',
|
|
171
|
+
'CONFLICT_DETECTED',
|
|
172
|
+
]);
|
|
173
|
+
/**
|
|
174
|
+
* Convert any error to a standardised SkillResult with `success: false`.
|
|
175
|
+
*
|
|
176
|
+
* For {@link NetworkAIError} subclasses the machine-readable `code` and
|
|
177
|
+
* `details` are preserved. Unknown errors are wrapped as `INTERNAL_ERROR`.
|
|
178
|
+
*/
|
|
179
|
+
function mapErrorToSkillResult(error) {
|
|
180
|
+
if (error instanceof NetworkAIError) {
|
|
181
|
+
return {
|
|
182
|
+
success: false,
|
|
183
|
+
error: {
|
|
184
|
+
code: error.code,
|
|
185
|
+
message: error.message,
|
|
186
|
+
recoverable: RECOVERABLE_CODES.has(error.code),
|
|
187
|
+
trace: error.details,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
192
|
+
return {
|
|
193
|
+
success: false,
|
|
194
|
+
error: {
|
|
195
|
+
code: 'INTERNAL_ERROR',
|
|
196
|
+
message: msg,
|
|
197
|
+
recoverable: false,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../lib/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OrchestratorEventBus — Central event stream for replay & time-travel debugging.
|
|
4
|
+
*
|
|
5
|
+
* Collects events from all orchestrator subsystems (blackboard, auth, adapters,
|
|
6
|
+
* topology, decisions) into a single monotonically-sequenced stream with periodic
|
|
7
|
+
* state snapshots for efficient point-in-time reconstruction.
|
|
8
|
+
*
|
|
9
|
+
* @module EventBus
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.OrchestratorEventBus = void 0;
|
|
13
|
+
const events_1 = require("events");
|
|
14
|
+
// Severity ordering for filtering
|
|
15
|
+
const SEVERITY_ORDER = {
|
|
16
|
+
trace: 0,
|
|
17
|
+
info: 1,
|
|
18
|
+
warn: 2,
|
|
19
|
+
error: 3,
|
|
20
|
+
};
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// EVENT BUS
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Central event bus for the orchestrator.
|
|
26
|
+
*
|
|
27
|
+
* Provides:
|
|
28
|
+
* - Unified monotonic event stream from all subsystems
|
|
29
|
+
* - Periodic state snapshots for O(1) point-in-time reconstruction
|
|
30
|
+
* - Replay with filtering (source, agent, severity, correlation)
|
|
31
|
+
* - Configurable retention (max events, max snapshots)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const bus = new OrchestratorEventBus();
|
|
36
|
+
* bus.publish('blackboard', 'write', 'info', { key: 'x', value: 42 }, 'agent-1');
|
|
37
|
+
* bus.snapshot({ blackboard: bb.getSnapshot(), agents: {} });
|
|
38
|
+
* const replay = bus.replay({ fromSeq: 0, toSeq: 100 });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
class OrchestratorEventBus extends events_1.EventEmitter {
|
|
42
|
+
events = [];
|
|
43
|
+
snapshots = [];
|
|
44
|
+
seq = 0;
|
|
45
|
+
maxEvents;
|
|
46
|
+
maxSnapshots;
|
|
47
|
+
snapshotInterval;
|
|
48
|
+
eventsSinceSnapshot = 0;
|
|
49
|
+
constructor(options) {
|
|
50
|
+
super();
|
|
51
|
+
this.maxEvents = options?.maxEvents ?? 50_000;
|
|
52
|
+
this.maxSnapshots = options?.maxSnapshots ?? 100;
|
|
53
|
+
this.snapshotInterval = options?.snapshotInterval ?? 0;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Publish an event to the bus.
|
|
57
|
+
* Returns the assigned sequence number.
|
|
58
|
+
*/
|
|
59
|
+
publish(source, type, severity, data, agentId, correlationId) {
|
|
60
|
+
const event = {
|
|
61
|
+
seq: this.seq++,
|
|
62
|
+
timestamp: new Date().toISOString(),
|
|
63
|
+
source,
|
|
64
|
+
type,
|
|
65
|
+
severity,
|
|
66
|
+
agentId,
|
|
67
|
+
correlationId,
|
|
68
|
+
data,
|
|
69
|
+
};
|
|
70
|
+
this.events.push(event);
|
|
71
|
+
this.eventsSinceSnapshot++;
|
|
72
|
+
// Evict oldest
|
|
73
|
+
if (this.events.length > this.maxEvents) {
|
|
74
|
+
this.events.splice(0, this.events.length - this.maxEvents);
|
|
75
|
+
}
|
|
76
|
+
this.emit('event', event);
|
|
77
|
+
return event.seq;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Take a state snapshot at the current sequence position.
|
|
81
|
+
*/
|
|
82
|
+
snapshot(state) {
|
|
83
|
+
const snap = {
|
|
84
|
+
atSeq: this.seq - 1,
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
blackboard: state.blackboard,
|
|
87
|
+
agents: state.agents,
|
|
88
|
+
budget: state.budget,
|
|
89
|
+
metadata: state.metadata,
|
|
90
|
+
};
|
|
91
|
+
this.snapshots.push(snap);
|
|
92
|
+
this.eventsSinceSnapshot = 0;
|
|
93
|
+
// Evict oldest snapshots
|
|
94
|
+
if (this.snapshots.length > this.maxSnapshots) {
|
|
95
|
+
this.snapshots.splice(0, this.snapshots.length - this.maxSnapshots);
|
|
96
|
+
}
|
|
97
|
+
this.emit('snapshot', snap);
|
|
98
|
+
return snap;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if an automatic snapshot should be taken (called internally after publish).
|
|
102
|
+
* Returns true if a snapshot is due. Callers must provide state via `snapshot()`.
|
|
103
|
+
*/
|
|
104
|
+
isSnapshotDue() {
|
|
105
|
+
return this.snapshotInterval > 0 && this.eventsSinceSnapshot >= this.snapshotInterval;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Replay events with optional filtering.
|
|
109
|
+
* Returns the nearest base snapshot + matching events.
|
|
110
|
+
*/
|
|
111
|
+
replay(options) {
|
|
112
|
+
const fromSeq = options?.fromSeq ?? 0;
|
|
113
|
+
const toSeq = options?.toSeq ?? this.seq;
|
|
114
|
+
const minSev = options?.minSeverity ? SEVERITY_ORDER[options.minSeverity] : 0;
|
|
115
|
+
// Find nearest snapshot at or before fromSeq
|
|
116
|
+
let baseSnapshot = null;
|
|
117
|
+
for (let i = this.snapshots.length - 1; i >= 0; i--) {
|
|
118
|
+
if (this.snapshots[i].atSeq <= fromSeq) {
|
|
119
|
+
baseSnapshot = this.snapshots[i];
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Filter events
|
|
124
|
+
const filtered = this.events.filter((e) => {
|
|
125
|
+
if (e.seq < fromSeq || e.seq > toSeq)
|
|
126
|
+
return false;
|
|
127
|
+
if (options?.sources && !options.sources.includes(e.source))
|
|
128
|
+
return false;
|
|
129
|
+
if (options?.agentId && e.agentId !== options.agentId)
|
|
130
|
+
return false;
|
|
131
|
+
if (options?.correlationId && e.correlationId !== options.correlationId)
|
|
132
|
+
return false;
|
|
133
|
+
if (SEVERITY_ORDER[e.severity] < minSev)
|
|
134
|
+
return false;
|
|
135
|
+
return true;
|
|
136
|
+
});
|
|
137
|
+
return {
|
|
138
|
+
baseSnapshot,
|
|
139
|
+
events: filtered,
|
|
140
|
+
totalEvents: this.events.length,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get the event at a specific sequence number.
|
|
145
|
+
*/
|
|
146
|
+
getEvent(seq) {
|
|
147
|
+
return this.events.find((e) => e.seq === seq);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get the most recent N events.
|
|
151
|
+
*/
|
|
152
|
+
recent(count) {
|
|
153
|
+
return this.events.slice(-count);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get all snapshots.
|
|
157
|
+
*/
|
|
158
|
+
getSnapshots() {
|
|
159
|
+
return [...this.snapshots];
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Find the nearest snapshot at or before a given sequence.
|
|
163
|
+
*/
|
|
164
|
+
snapshotAt(seq) {
|
|
165
|
+
for (let i = this.snapshots.length - 1; i >= 0; i--) {
|
|
166
|
+
if (this.snapshots[i].atSeq <= seq) {
|
|
167
|
+
return this.snapshots[i];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
/** Current sequence counter value (next event will get this seq). */
|
|
173
|
+
get currentSeq() {
|
|
174
|
+
return this.seq;
|
|
175
|
+
}
|
|
176
|
+
/** Total stored events. */
|
|
177
|
+
get size() {
|
|
178
|
+
return this.events.length;
|
|
179
|
+
}
|
|
180
|
+
/** Total stored snapshots. */
|
|
181
|
+
get snapshotCount() {
|
|
182
|
+
return this.snapshots.length;
|
|
183
|
+
}
|
|
184
|
+
/** Clear all events and snapshots, reset sequence. */
|
|
185
|
+
clear() {
|
|
186
|
+
this.events.length = 0;
|
|
187
|
+
this.snapshots.length = 0;
|
|
188
|
+
this.seq = 0;
|
|
189
|
+
this.eventsSinceSnapshot = 0;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Export the full stream (events + snapshots) as a serializable object.
|
|
193
|
+
*/
|
|
194
|
+
export() {
|
|
195
|
+
return {
|
|
196
|
+
events: [...this.events],
|
|
197
|
+
snapshots: [...this.snapshots],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Import a previously exported stream, merging into current state.
|
|
202
|
+
*/
|
|
203
|
+
import(data) {
|
|
204
|
+
if (!Array.isArray(data.events) || !Array.isArray(data.snapshots)) {
|
|
205
|
+
throw new Error('Invalid import data: expected { events: [], snapshots: [] }');
|
|
206
|
+
}
|
|
207
|
+
for (const e of data.events) {
|
|
208
|
+
this.events.push(e);
|
|
209
|
+
if (e.seq >= this.seq) {
|
|
210
|
+
this.seq = e.seq + 1;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
for (const s of data.snapshots) {
|
|
214
|
+
this.snapshots.push(s);
|
|
215
|
+
}
|
|
216
|
+
// Sort by sequence
|
|
217
|
+
this.events.sort((a, b) => a.seq - b.seq);
|
|
218
|
+
this.snapshots.sort((a, b) => a.atSeq - b.atSeq);
|
|
219
|
+
// Enforce limits
|
|
220
|
+
if (this.events.length > this.maxEvents) {
|
|
221
|
+
this.events.splice(0, this.events.length - this.maxEvents);
|
|
222
|
+
}
|
|
223
|
+
if (this.snapshots.length > this.maxSnapshots) {
|
|
224
|
+
this.snapshots.splice(0, this.snapshots.length - this.maxSnapshots);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
exports.OrchestratorEventBus = OrchestratorEventBus;
|
|
229
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../lib/event-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ExplainabilityTracer — structured decision cards for agent actions.
|
|
4
|
+
*
|
|
5
|
+
* Records every significant decision made during task orchestration so that
|
|
6
|
+
* operators can audit *why* a particular outcome was produced.
|
|
7
|
+
*
|
|
8
|
+
* @module explainability
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ExplainabilityTracer = void 0;
|
|
12
|
+
/**
|
|
13
|
+
* Collects decision cards during a session.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```ts
|
|
17
|
+
* const tracer = new ExplainabilityTracer();
|
|
18
|
+
* tracer.record({
|
|
19
|
+
* source: 'AuthGuardian',
|
|
20
|
+
* decision: 'permission_check',
|
|
21
|
+
* outcome: 'granted',
|
|
22
|
+
* factors: [{ name: 'trust_level', value: 0.8 }],
|
|
23
|
+
* });
|
|
24
|
+
* const cards = tracer.getTrace(traceId);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
class ExplainabilityTracer {
|
|
28
|
+
cards = [];
|
|
29
|
+
maxCards;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.maxCards = options?.maxCards ?? 10_000;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Record a decision card. Returns the generated traceId.
|
|
35
|
+
*/
|
|
36
|
+
record(card) {
|
|
37
|
+
const traceId = card.traceId ?? this.generateId();
|
|
38
|
+
const full = {
|
|
39
|
+
traceId,
|
|
40
|
+
timestamp: card.timestamp ?? new Date().toISOString(),
|
|
41
|
+
source: card.source,
|
|
42
|
+
decision: card.decision,
|
|
43
|
+
outcome: card.outcome,
|
|
44
|
+
factors: card.factors,
|
|
45
|
+
parentTraceId: card.parentTraceId,
|
|
46
|
+
agentId: card.agentId,
|
|
47
|
+
metadata: card.metadata,
|
|
48
|
+
};
|
|
49
|
+
this.cards.push(full);
|
|
50
|
+
// Evict oldest when over limit
|
|
51
|
+
if (this.cards.length > this.maxCards) {
|
|
52
|
+
this.cards.splice(0, this.cards.length - this.maxCards);
|
|
53
|
+
}
|
|
54
|
+
return traceId;
|
|
55
|
+
}
|
|
56
|
+
/** Get a single card by traceId. */
|
|
57
|
+
getCard(traceId) {
|
|
58
|
+
return this.cards.find((c) => c.traceId === traceId);
|
|
59
|
+
}
|
|
60
|
+
/** Get all cards sharing a parentTraceId — i.e. the full trace tree for a delegation. */
|
|
61
|
+
getTrace(parentTraceId) {
|
|
62
|
+
return this.cards.filter((c) => c.traceId === parentTraceId || c.parentTraceId === parentTraceId);
|
|
63
|
+
}
|
|
64
|
+
/** Get cards filtered by source, decision type, agent, or time range. */
|
|
65
|
+
query(filter) {
|
|
66
|
+
return this.cards.filter((c) => {
|
|
67
|
+
if (filter.source && c.source !== filter.source)
|
|
68
|
+
return false;
|
|
69
|
+
if (filter.decision && c.decision !== filter.decision)
|
|
70
|
+
return false;
|
|
71
|
+
if (filter.agentId && c.agentId !== filter.agentId)
|
|
72
|
+
return false;
|
|
73
|
+
if (filter.since && c.timestamp < filter.since)
|
|
74
|
+
return false;
|
|
75
|
+
if (filter.until && c.timestamp > filter.until)
|
|
76
|
+
return false;
|
|
77
|
+
return true;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Total number of recorded cards. */
|
|
81
|
+
get size() {
|
|
82
|
+
return this.cards.length;
|
|
83
|
+
}
|
|
84
|
+
/** Clear all recorded cards. */
|
|
85
|
+
clear() {
|
|
86
|
+
this.cards.length = 0;
|
|
87
|
+
}
|
|
88
|
+
/** Export all cards as a JSON-serializable array. */
|
|
89
|
+
export() {
|
|
90
|
+
return [...this.cards];
|
|
91
|
+
}
|
|
92
|
+
generateId() {
|
|
93
|
+
// Simple random hex id (no crypto dependency needed for trace ids)
|
|
94
|
+
const bytes = new Uint8Array(12);
|
|
95
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
96
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
97
|
+
}
|
|
98
|
+
return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.ExplainabilityTracer = ExplainabilityTracer;
|
|
102
|
+
//# sourceMappingURL=explainability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainability.js","sourceRoot":"","sources":["../../../lib/explainability.ts"],"names":[],"mappings":"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"}
|