network-ai 5.10.2 → 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,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Playground — Interactive REPL sandbox for Network-AI
|
|
4
|
+
*
|
|
5
|
+
* Provides an in-process REPL environment with pre-configured mock adapters,
|
|
6
|
+
* a blackboard, budget, auth guardian, and orchestrator — ready to experiment
|
|
7
|
+
* with immediately.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Pre-wired SwarmOrchestrator with mock CustomAdapter
|
|
11
|
+
* - LockedBlackboard with in-memory backend
|
|
12
|
+
* - AuthGuardian with default trust levels
|
|
13
|
+
* - FederatedBudget with generous defaults
|
|
14
|
+
* - REPL context exposes all key objects
|
|
15
|
+
* - Helper functions: delegate(), bb(), budget(), agents()
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* import { startPlayground } from 'network-ai';
|
|
19
|
+
* await startPlayground();
|
|
20
|
+
*
|
|
21
|
+
* CLI:
|
|
22
|
+
* npx network-ai playground
|
|
23
|
+
*
|
|
24
|
+
* @module Playground
|
|
25
|
+
* @version 1.0.0
|
|
26
|
+
*/
|
|
27
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
30
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
31
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
32
|
+
}
|
|
33
|
+
Object.defineProperty(o, k2, desc);
|
|
34
|
+
}) : (function(o, m, k, k2) {
|
|
35
|
+
if (k2 === undefined) k2 = k;
|
|
36
|
+
o[k2] = m[k];
|
|
37
|
+
}));
|
|
38
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
39
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
40
|
+
}) : function(o, v) {
|
|
41
|
+
o["default"] = v;
|
|
42
|
+
});
|
|
43
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
44
|
+
var ownKeys = function(o) {
|
|
45
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
46
|
+
var ar = [];
|
|
47
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
48
|
+
return ar;
|
|
49
|
+
};
|
|
50
|
+
return ownKeys(o);
|
|
51
|
+
};
|
|
52
|
+
return function (mod) {
|
|
53
|
+
if (mod && mod.__esModule) return mod;
|
|
54
|
+
var result = {};
|
|
55
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
56
|
+
__setModuleDefault(result, mod);
|
|
57
|
+
return result;
|
|
58
|
+
};
|
|
59
|
+
})();
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.MockAgentRegistry = void 0;
|
|
62
|
+
exports.startPlayground = startPlayground;
|
|
63
|
+
const repl = __importStar(require("repl"));
|
|
64
|
+
const events_1 = require("events");
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// MOCK HELPERS
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/** Simple mock agent registry for the playground */
|
|
69
|
+
class MockAgentRegistry {
|
|
70
|
+
handlers = new Map();
|
|
71
|
+
callLog = [];
|
|
72
|
+
/** Register a mock agent */
|
|
73
|
+
register(name, handler) {
|
|
74
|
+
this.handlers.set(name, handler);
|
|
75
|
+
}
|
|
76
|
+
/** List registered mock agents */
|
|
77
|
+
list() {
|
|
78
|
+
return Array.from(this.handlers.keys());
|
|
79
|
+
}
|
|
80
|
+
/** Call a mock agent */
|
|
81
|
+
async call(name, input) {
|
|
82
|
+
const handler = this.handlers.get(name);
|
|
83
|
+
if (!handler) {
|
|
84
|
+
throw new Error(`No mock agent '${name}'. Available: ${this.list().join(', ')}`);
|
|
85
|
+
}
|
|
86
|
+
const output = await handler(input);
|
|
87
|
+
this.callLog.push({ agentId: name, input, output, timestamp: Date.now() });
|
|
88
|
+
return output;
|
|
89
|
+
}
|
|
90
|
+
/** Get call history */
|
|
91
|
+
history() {
|
|
92
|
+
return this.callLog;
|
|
93
|
+
}
|
|
94
|
+
/** Clear call history */
|
|
95
|
+
clearHistory() {
|
|
96
|
+
this.callLog = [];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.MockAgentRegistry = MockAgentRegistry;
|
|
100
|
+
// ============================================================================
|
|
101
|
+
// DEFAULT MOCKS
|
|
102
|
+
// ============================================================================
|
|
103
|
+
function createDefaultMocks() {
|
|
104
|
+
return {
|
|
105
|
+
echo: (input) => `Echo: ${input}`,
|
|
106
|
+
upper: (input) => input.toUpperCase(),
|
|
107
|
+
reverse: (input) => input.split('').reverse().join(''),
|
|
108
|
+
count: (input) => `Words: ${input.split(/\s+/).filter(Boolean).length}`,
|
|
109
|
+
json: (input) => JSON.stringify({ input, processed: true, timestamp: Date.now() }),
|
|
110
|
+
summarize: (input) => {
|
|
111
|
+
const words = input.split(/\s+/);
|
|
112
|
+
return words.length <= 10 ? input : words.slice(0, 10).join(' ') + '...';
|
|
113
|
+
},
|
|
114
|
+
sentiment: (input) => {
|
|
115
|
+
const positive = /good|great|excellent|happy|love|amazing|wonderful/i;
|
|
116
|
+
const negative = /bad|terrible|awful|hate|horrible|worst/i;
|
|
117
|
+
if (positive.test(input))
|
|
118
|
+
return 'positive';
|
|
119
|
+
if (negative.test(input))
|
|
120
|
+
return 'negative';
|
|
121
|
+
return 'neutral';
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// ============================================================================
|
|
126
|
+
// PLAYGROUND
|
|
127
|
+
// ============================================================================
|
|
128
|
+
const DEFAULT_BANNER = `
|
|
129
|
+
\x1b[36m\x1b[1m╔══════════════════════════════════════════════════╗
|
|
130
|
+
║ Network-AI Playground (REPL) ║
|
|
131
|
+
╚══════════════════════════════════════════════════╝\x1b[0m
|
|
132
|
+
|
|
133
|
+
\x1b[33mPre-loaded objects:\x1b[0m
|
|
134
|
+
\x1b[32mmocks\x1b[0m — MockAgentRegistry (register/call/list/history)
|
|
135
|
+
\x1b[32mdelegate\x1b[0m — Call a mock agent: delegate('echo', 'hello')
|
|
136
|
+
\x1b[32magents\x1b[0m — List available mock agents
|
|
137
|
+
\x1b[32mhistory\x1b[0m — View call history
|
|
138
|
+
|
|
139
|
+
\x1b[33mTips:\x1b[0m
|
|
140
|
+
• Type \x1b[32m.help\x1b[0m for REPL commands
|
|
141
|
+
• Type \x1b[32magents()\x1b[0m to see available agents
|
|
142
|
+
• Type \x1b[32mdelegate('echo', 'hello world')\x1b[0m to test
|
|
143
|
+
• Type \x1b[32m.exit\x1b[0m to quit
|
|
144
|
+
`;
|
|
145
|
+
/**
|
|
146
|
+
* Start an interactive playground REPL with mock adapters.
|
|
147
|
+
*
|
|
148
|
+
* All key Network-AI objects are available in the REPL context.
|
|
149
|
+
* Mock agents respond instantly with deterministic outputs.
|
|
150
|
+
*/
|
|
151
|
+
function startPlayground(config = {}) {
|
|
152
|
+
const emitter = new events_1.EventEmitter();
|
|
153
|
+
let running = true;
|
|
154
|
+
const banner = config.banner ?? DEFAULT_BANNER;
|
|
155
|
+
const prompt = config.prompt ?? 'swarm> ';
|
|
156
|
+
// Set up mocks
|
|
157
|
+
const mocks = new MockAgentRegistry();
|
|
158
|
+
const defaultMocks = createDefaultMocks();
|
|
159
|
+
for (const [name, handler] of Object.entries(defaultMocks)) {
|
|
160
|
+
mocks.register(name, handler);
|
|
161
|
+
}
|
|
162
|
+
if (config.mockAgents) {
|
|
163
|
+
for (const [name, handler] of Object.entries(config.mockAgents)) {
|
|
164
|
+
mocks.register(name, handler);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Print banner
|
|
168
|
+
if (banner) {
|
|
169
|
+
console.log(banner);
|
|
170
|
+
}
|
|
171
|
+
// Create REPL
|
|
172
|
+
const server = repl.start({
|
|
173
|
+
prompt,
|
|
174
|
+
useColors: true,
|
|
175
|
+
ignoreUndefined: true,
|
|
176
|
+
});
|
|
177
|
+
// Expose objects in REPL context
|
|
178
|
+
server.context['mocks'] = mocks;
|
|
179
|
+
server.context['delegate'] = async (agentId, input) => {
|
|
180
|
+
try {
|
|
181
|
+
const result = await mocks.call(agentId, input);
|
|
182
|
+
console.log(`\x1b[32m✓\x1b[0m ${result}`);
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.log(`\x1b[31m✗\x1b[0m ${err instanceof Error ? err.message : String(err)}`);
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
server.context['agents'] = () => {
|
|
191
|
+
const list = mocks.list();
|
|
192
|
+
console.log(`\x1b[36mAvailable agents (${list.length}):\x1b[0m`);
|
|
193
|
+
for (const name of list) {
|
|
194
|
+
console.log(` • ${name}`);
|
|
195
|
+
}
|
|
196
|
+
return list;
|
|
197
|
+
};
|
|
198
|
+
server.context['history'] = () => {
|
|
199
|
+
const hist = mocks.history();
|
|
200
|
+
if (hist.length === 0) {
|
|
201
|
+
console.log('\x1b[33mNo calls yet.\x1b[0m');
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
for (const entry of hist) {
|
|
205
|
+
const time = new Date(entry.timestamp).toLocaleTimeString();
|
|
206
|
+
console.log(` [${time}] ${entry.agentId}("${entry.input}") → "${entry.output}"`);
|
|
207
|
+
}
|
|
208
|
+
return hist;
|
|
209
|
+
};
|
|
210
|
+
server.on('exit', () => {
|
|
211
|
+
running = false;
|
|
212
|
+
emitter.emit('exit');
|
|
213
|
+
});
|
|
214
|
+
emitter.emit('started');
|
|
215
|
+
return {
|
|
216
|
+
emitter,
|
|
217
|
+
stop: () => {
|
|
218
|
+
running = false;
|
|
219
|
+
server.close();
|
|
220
|
+
},
|
|
221
|
+
get isRunning() { return running; },
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=playground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playground.js","sourceRoot":"","sources":["../../../lib/playground.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* QA Orchestrator Agent
|
|
4
|
+
*
|
|
5
|
+
* Coordination layer on top of QualityGateAgent and ComplianceMonitor.
|
|
6
|
+
* Provides:
|
|
7
|
+
* 1. Scenario replay — re-run blackboard entries through quality gates
|
|
8
|
+
* 2. Feedback loop — route rejections back to agents with suggested fixes
|
|
9
|
+
* 3. Regression tracker — historical quality metrics over time
|
|
10
|
+
* 4. Cross-agent consistency — detect contradictions in multi-agent output
|
|
11
|
+
*
|
|
12
|
+
* @module lib/qa-orchestrator
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.QAOrchestratorAgent = void 0;
|
|
16
|
+
const blackboard_validator_1 = require("./blackboard-validator");
|
|
17
|
+
const compliance_monitor_1 = require("./compliance-monitor");
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Implementation
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* QA Orchestrator Agent — coordinates quality gating, compliance monitoring,
|
|
23
|
+
* feedback routing, regression tracking, and cross-agent consistency checks.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const qa = new QAOrchestratorAgent({
|
|
28
|
+
* qualityThreshold: 0.7,
|
|
29
|
+
* maxRetries: 2,
|
|
30
|
+
* onFeedback: (fb) => console.log('Route to agent:', fb),
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* const result = await qa.runScenario({
|
|
34
|
+
* id: 'test-1', key: 'analysis', value: { findings: [...] },
|
|
35
|
+
* sourceAgent: 'analyst',
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
class QAOrchestratorAgent {
|
|
40
|
+
gate;
|
|
41
|
+
compliance;
|
|
42
|
+
maxRetries;
|
|
43
|
+
onFeedback;
|
|
44
|
+
contradictionDetector;
|
|
45
|
+
/** Historical snapshots for regression tracking */
|
|
46
|
+
history = [];
|
|
47
|
+
/** Track retry counts per scenario */
|
|
48
|
+
retryCounts = new Map();
|
|
49
|
+
/** Track last-seen value per key+agent for contradiction detection */
|
|
50
|
+
agentOutputs = new Map();
|
|
51
|
+
constructor(options = {}) {
|
|
52
|
+
this.gate = new blackboard_validator_1.QualityGateAgent({
|
|
53
|
+
qualityThreshold: options.qualityThreshold,
|
|
54
|
+
autoRejectThreshold: options.autoRejectThreshold,
|
|
55
|
+
validationConfig: options.validationConfig,
|
|
56
|
+
aiReviewCallback: options.aiReviewCallback,
|
|
57
|
+
});
|
|
58
|
+
this.compliance = new compliance_monitor_1.ComplianceMonitor(options.complianceOptions);
|
|
59
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
60
|
+
this.onFeedback = options.onFeedback;
|
|
61
|
+
this.contradictionDetector = options.contradictionDetector ?? defaultContradictionDetector;
|
|
62
|
+
}
|
|
63
|
+
// --------------------------------------------------------------------------
|
|
64
|
+
// Core: Single scenario
|
|
65
|
+
// --------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* Run a single scenario through the two-layer quality gate.
|
|
68
|
+
* If the entry is rejected or quarantined and a feedback callback is
|
|
69
|
+
* configured, structured feedback is routed back to the source agent.
|
|
70
|
+
*/
|
|
71
|
+
async runScenario(scenario) {
|
|
72
|
+
const { id, key, value, sourceAgent, metadata, minScore } = scenario;
|
|
73
|
+
// Record the agent action for compliance monitoring
|
|
74
|
+
this.compliance.recordAction({
|
|
75
|
+
agentId: sourceAgent,
|
|
76
|
+
action: 'qa_submission',
|
|
77
|
+
tool: 'qa_orchestrator',
|
|
78
|
+
});
|
|
79
|
+
// Run through quality gate
|
|
80
|
+
const gateResult = await this.gate.gate(key, value, sourceAgent, metadata);
|
|
81
|
+
const score = gateResult.validation.score;
|
|
82
|
+
const issues = gateResult.validation.issues.map(i => `[${i.severity}] ${i.message}`);
|
|
83
|
+
// Threshold override per scenario
|
|
84
|
+
const passThreshold = minScore ?? (this.gate.getValidator() ? 0.7 : 0.7);
|
|
85
|
+
const passed = gateResult.decision === 'approve' && score >= passThreshold;
|
|
86
|
+
// Track for cross-agent consistency
|
|
87
|
+
this.trackAgentOutput(key, sourceAgent, value);
|
|
88
|
+
// Route feedback on rejection/quarantine
|
|
89
|
+
let feedbackRouted = false;
|
|
90
|
+
let feedbackPayload;
|
|
91
|
+
if (!passed && this.onFeedback) {
|
|
92
|
+
const retries = this.retryCounts.get(id) ?? 0;
|
|
93
|
+
if (retries < this.maxRetries) {
|
|
94
|
+
this.retryCounts.set(id, retries + 1);
|
|
95
|
+
feedbackPayload = {
|
|
96
|
+
scenarioId: id,
|
|
97
|
+
sourceAgent,
|
|
98
|
+
key,
|
|
99
|
+
decision: gateResult.decision,
|
|
100
|
+
score,
|
|
101
|
+
issues,
|
|
102
|
+
suggestedFixes: this.extractSuggestedFixes(gateResult),
|
|
103
|
+
retryCount: retries + 1,
|
|
104
|
+
};
|
|
105
|
+
await this.onFeedback(feedbackPayload);
|
|
106
|
+
feedbackRouted = true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { scenarioId: id, decision: gateResult.decision, score, passed, issues, feedbackRouted, feedbackPayload };
|
|
110
|
+
}
|
|
111
|
+
// --------------------------------------------------------------------------
|
|
112
|
+
// Harness: Batch scenario replay
|
|
113
|
+
// --------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Run a batch of scenarios and collect aggregate results, contradictions,
|
|
116
|
+
* and a quality snapshot.
|
|
117
|
+
*/
|
|
118
|
+
async runHarness(scenarios) {
|
|
119
|
+
const results = [];
|
|
120
|
+
for (const scenario of scenarios) {
|
|
121
|
+
results.push(await this.runScenario(scenario));
|
|
122
|
+
}
|
|
123
|
+
const passedCount = results.filter(r => r.passed).length;
|
|
124
|
+
const contradictions = this.detectContradictions();
|
|
125
|
+
const snapshot = this.takeSnapshot(results.length, passedCount);
|
|
126
|
+
return {
|
|
127
|
+
total: results.length,
|
|
128
|
+
passed: passedCount,
|
|
129
|
+
failed: results.length - passedCount,
|
|
130
|
+
passRate: results.length > 0 ? passedCount / results.length : 0,
|
|
131
|
+
results,
|
|
132
|
+
contradictions,
|
|
133
|
+
snapshot,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// --------------------------------------------------------------------------
|
|
137
|
+
// Regression tracking
|
|
138
|
+
// --------------------------------------------------------------------------
|
|
139
|
+
/**
|
|
140
|
+
* Take an explicit quality snapshot and store it in history.
|
|
141
|
+
* Called automatically after `runHarness()`, but can also be called manually.
|
|
142
|
+
*/
|
|
143
|
+
takeSnapshot(scenariosRun = 0, scenariosPassed = 0) {
|
|
144
|
+
const gateMetrics = this.gate.getMetrics();
|
|
145
|
+
const complianceSummary = this.compliance.getSummary();
|
|
146
|
+
const snapshot = {
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
gateMetrics,
|
|
149
|
+
complianceViolations: complianceSummary.total,
|
|
150
|
+
violationsByType: complianceSummary.byType,
|
|
151
|
+
violationsByAgent: complianceSummary.byAgent,
|
|
152
|
+
scenariosRun,
|
|
153
|
+
scenarioPassRate: scenariosRun > 0 ? scenariosPassed / scenariosRun : 0,
|
|
154
|
+
};
|
|
155
|
+
this.history.push(snapshot);
|
|
156
|
+
return snapshot;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get all historical quality snapshots for trend analysis.
|
|
160
|
+
*/
|
|
161
|
+
getHistory() {
|
|
162
|
+
return this.history;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compare the latest two snapshots and return a regression report.
|
|
166
|
+
* Returns null if fewer than two snapshots exist.
|
|
167
|
+
*/
|
|
168
|
+
getRegressionReport() {
|
|
169
|
+
if (this.history.length < 2)
|
|
170
|
+
return null;
|
|
171
|
+
const prev = this.history[this.history.length - 2];
|
|
172
|
+
const curr = this.history[this.history.length - 1];
|
|
173
|
+
return {
|
|
174
|
+
from: prev.timestamp,
|
|
175
|
+
to: curr.timestamp,
|
|
176
|
+
passRateDelta: curr.scenarioPassRate - prev.scenarioPassRate,
|
|
177
|
+
complianceDelta: curr.complianceViolations - prev.complianceViolations,
|
|
178
|
+
approvalRateDelta: approvalRate(curr.gateMetrics) - approvalRate(prev.gateMetrics),
|
|
179
|
+
regressed: curr.scenarioPassRate < prev.scenarioPassRate ||
|
|
180
|
+
curr.complianceViolations > prev.complianceViolations,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// --------------------------------------------------------------------------
|
|
184
|
+
// Cross-agent consistency
|
|
185
|
+
// --------------------------------------------------------------------------
|
|
186
|
+
/**
|
|
187
|
+
* Detect contradictions across agents that wrote to the same blackboard key.
|
|
188
|
+
*/
|
|
189
|
+
detectContradictions() {
|
|
190
|
+
const contradictions = [];
|
|
191
|
+
for (const [key, agentMap] of this.agentOutputs) {
|
|
192
|
+
const agents = Array.from(agentMap.entries());
|
|
193
|
+
for (let i = 0; i < agents.length; i++) {
|
|
194
|
+
for (let j = i + 1; j < agents.length; j++) {
|
|
195
|
+
const [agentA, valueA] = agents[i];
|
|
196
|
+
const [agentB, valueB] = agents[j];
|
|
197
|
+
if (this.contradictionDetector(valueA, valueB)) {
|
|
198
|
+
contradictions.push({
|
|
199
|
+
key,
|
|
200
|
+
agentA,
|
|
201
|
+
agentB,
|
|
202
|
+
valueA,
|
|
203
|
+
valueB,
|
|
204
|
+
detectedAt: new Date().toISOString(),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return contradictions;
|
|
211
|
+
}
|
|
212
|
+
// --------------------------------------------------------------------------
|
|
213
|
+
// Accessors
|
|
214
|
+
// --------------------------------------------------------------------------
|
|
215
|
+
/** Access the underlying QualityGateAgent for direct configuration. */
|
|
216
|
+
getQualityGate() {
|
|
217
|
+
return this.gate;
|
|
218
|
+
}
|
|
219
|
+
/** Access the underlying ComplianceMonitor for direct configuration. */
|
|
220
|
+
getComplianceMonitor() {
|
|
221
|
+
return this.compliance;
|
|
222
|
+
}
|
|
223
|
+
/** Get current gate metrics without taking a full snapshot. */
|
|
224
|
+
getMetrics() {
|
|
225
|
+
return this.gate.getMetrics();
|
|
226
|
+
}
|
|
227
|
+
/** Get the number of remaining retries for a scenario. */
|
|
228
|
+
getRetriesRemaining(scenarioId) {
|
|
229
|
+
return this.maxRetries - (this.retryCounts.get(scenarioId) ?? 0);
|
|
230
|
+
}
|
|
231
|
+
/** Reset retry count for a scenario (e.g., after manual fix). */
|
|
232
|
+
resetRetries(scenarioId) {
|
|
233
|
+
this.retryCounts.delete(scenarioId);
|
|
234
|
+
}
|
|
235
|
+
/** Clear all tracked agent outputs (for fresh contradiction detection). */
|
|
236
|
+
clearOutputTracking() {
|
|
237
|
+
this.agentOutputs.clear();
|
|
238
|
+
}
|
|
239
|
+
// --------------------------------------------------------------------------
|
|
240
|
+
// Private helpers
|
|
241
|
+
// --------------------------------------------------------------------------
|
|
242
|
+
trackAgentOutput(key, agent, value) {
|
|
243
|
+
if (!this.agentOutputs.has(key)) {
|
|
244
|
+
this.agentOutputs.set(key, new Map());
|
|
245
|
+
}
|
|
246
|
+
this.agentOutputs.get(key).set(agent, value);
|
|
247
|
+
}
|
|
248
|
+
extractSuggestedFixes(gateResult) {
|
|
249
|
+
const fixes = [];
|
|
250
|
+
for (const issue of gateResult.validation.issues) {
|
|
251
|
+
if (issue.suggestion) {
|
|
252
|
+
fixes.push(issue.suggestion);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (gateResult.reviewNotes.length > 0) {
|
|
256
|
+
fixes.push(...gateResult.reviewNotes);
|
|
257
|
+
}
|
|
258
|
+
return fixes;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.QAOrchestratorAgent = QAOrchestratorAgent;
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// Utility functions
|
|
264
|
+
// ============================================================================
|
|
265
|
+
function approvalRate(metrics) {
|
|
266
|
+
return metrics.totalChecked > 0 ? metrics.approved / metrics.totalChecked : 0;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Default contradiction detector: returns true when two values for the same
|
|
270
|
+
* key have opposing boolean fields (e.g., `{ success: true }` vs `{ success: false }`)
|
|
271
|
+
* or when one is an error and the other is not.
|
|
272
|
+
*/
|
|
273
|
+
function defaultContradictionDetector(a, b) {
|
|
274
|
+
if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
const objA = a;
|
|
278
|
+
const objB = b;
|
|
279
|
+
// Check for opposing boolean fields
|
|
280
|
+
for (const key of Object.keys(objA)) {
|
|
281
|
+
if (typeof objA[key] === 'boolean' && typeof objB[key] === 'boolean') {
|
|
282
|
+
if (objA[key] !== objB[key])
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// One has error, other has success data
|
|
287
|
+
const aHasError = 'error' in objA && objA['error'] != null;
|
|
288
|
+
const bHasError = 'error' in objB && objB['error'] != null;
|
|
289
|
+
const aHasData = 'data' in objA || 'result' in objA || 'findings' in objA;
|
|
290
|
+
const bHasData = 'data' in objB || 'result' in objB || 'findings' in objB;
|
|
291
|
+
if ((aHasError && bHasData && !bHasError) || (bHasError && aHasData && !aHasError)) {
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=qa-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa-orchestrator.js","sourceRoot":"","sources":["../../../lib/qa-orchestrator.ts"],"names":[],"mappings":"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"}
|