network-ai 5.0.0 → 5.1.1
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 +4 -4
- package/QUICKSTART.md +4 -4
- package/README.md +15 -12
- package/dist/adapters/custom-adapter.d.ts +1 -1
- package/dist/adapters/custom-adapter.js +1 -1
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +4 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langchain-adapter.js +1 -1
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/mcp-adapter.d.ts +1 -1
- package/dist/adapters/mcp-adapter.js +3 -3
- package/dist/adapters/mcp-adapter.js.map +1 -1
- package/dist/adapters/openclaw-adapter.d.ts +1 -1
- package/dist/adapters/openclaw-adapter.js +3 -3
- package/dist/adapters/openclaw-adapter.js.map +1 -1
- package/dist/adapters/orchestrator-adapter.d.ts +118 -0
- package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
- package/dist/adapters/orchestrator-adapter.js +218 -0
- package/dist/adapters/orchestrator-adapter.js.map +1 -0
- package/dist/demo-control-plane.d.ts +12 -0
- package/dist/demo-control-plane.d.ts.map +1 -0
- package/dist/demo-control-plane.js +147 -0
- package/dist/demo-control-plane.js.map +1 -0
- package/dist/demo-worktree-dashboard.d.ts +2 -0
- package/dist/demo-worktree-dashboard.d.ts.map +1 -0
- package/dist/demo-worktree-dashboard.js +131 -0
- package/dist/demo-worktree-dashboard.js.map +1 -0
- package/dist/examples/01-hello-swarm.d.ts +13 -0
- package/dist/examples/01-hello-swarm.d.ts.map +1 -0
- package/dist/examples/01-hello-swarm.js +165 -0
- package/dist/examples/01-hello-swarm.js.map +1 -0
- package/dist/examples/02-fsm-pipeline.d.ts +20 -0
- package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
- package/dist/examples/02-fsm-pipeline.js +189 -0
- package/dist/examples/02-fsm-pipeline.js.map +1 -0
- package/dist/examples/03-parallel-agents.d.ts +21 -0
- package/dist/examples/03-parallel-agents.d.ts.map +1 -0
- package/dist/examples/03-parallel-agents.js +192 -0
- package/dist/examples/03-parallel-agents.js.map +1 -0
- package/dist/examples/05-code-review-swarm.d.ts +21 -0
- package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
- package/dist/examples/05-code-review-swarm.js +1177 -0
- package/dist/examples/05-code-review-swarm.js.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
- package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
- package/dist/examples/06-ai-pipeline-demo.js +263 -0
- package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
- package/dist/examples/07-full-showcase.d.ts +27 -0
- package/dist/examples/07-full-showcase.d.ts.map +1 -0
- package/dist/examples/07-full-showcase.js +946 -0
- package/dist/examples/07-full-showcase.js.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
- package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
- package/dist/examples/08-control-plane-stress-demo.js +186 -0
- package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
- package/dist/examples/09-real-langchain.d.ts +19 -0
- package/dist/examples/09-real-langchain.d.ts.map +1 -0
- package/dist/examples/09-real-langchain.js +231 -0
- package/dist/examples/09-real-langchain.js.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
- package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
- package/dist/examples/demo-runner.d.ts +2 -0
- package/dist/examples/demo-runner.d.ts.map +1 -0
- package/dist/examples/demo-runner.js +119 -0
- package/dist/examples/demo-runner.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/auth-guardian.js.map +1 -1
- package/dist/lib/control-plane.d.ts +128 -0
- package/dist/lib/control-plane.d.ts.map +1 -0
- package/dist/lib/control-plane.js +527 -0
- package/dist/lib/control-plane.js.map +1 -0
- package/dist/lib/coverage-reporter.js.map +1 -1
- package/dist/lib/goal-dsl.d.ts.map +1 -1
- package/dist/lib/goal-dsl.js +0 -1
- package/dist/lib/goal-dsl.js.map +1 -1
- package/dist/lib/work-tree-dashboard.d.ts +130 -0
- package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
- package/dist/lib/work-tree-dashboard.js +583 -0
- package/dist/lib/work-tree-dashboard.js.map +1 -0
- package/dist/lib/work-tree-ui.d.ts +107 -0
- package/dist/lib/work-tree-ui.d.ts.map +1 -0
- package/dist/lib/work-tree-ui.js +333 -0
- package/dist/lib/work-tree-ui.js.map +1 -0
- package/dist/lib/work-tree.d.ts +184 -0
- package/dist/lib/work-tree.d.ts.map +1 -0
- package/dist/lib/work-tree.js +480 -0
- package/dist/lib/work-tree.js.map +1 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -2
- package/dist/security.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 01-hello-swarm.ts
|
|
4
|
+
* ─────────────────
|
|
5
|
+
* The simplest possible network-ai demo: three agents (Researcher, Analyst,
|
|
6
|
+
* Reporter) passing work through a shared blackboard.
|
|
7
|
+
*
|
|
8
|
+
* No API key needed — all agents are plain async functions.
|
|
9
|
+
*
|
|
10
|
+
* Run:
|
|
11
|
+
* npx ts-node examples/01-hello-swarm.ts
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const __1 = require("..");
|
|
15
|
+
// ─── ANSI helpers for readable terminal output ────────────────────────────────
|
|
16
|
+
const c = {
|
|
17
|
+
reset: '\x1b[0m',
|
|
18
|
+
bold: '\x1b[1m',
|
|
19
|
+
cyan: '\x1b[36m',
|
|
20
|
+
green: '\x1b[32m',
|
|
21
|
+
yellow: '\x1b[33m',
|
|
22
|
+
blue: '\x1b[34m',
|
|
23
|
+
magenta: '\x1b[35m',
|
|
24
|
+
dim: '\x1b[2m',
|
|
25
|
+
};
|
|
26
|
+
const banner = (msg) => console.log(`\n${c.bold}${c.cyan}--- ${msg} ---${c.reset}`);
|
|
27
|
+
const step = (agent, msg) => console.log(` ${c.green}[${agent}]${c.reset} ${msg}`);
|
|
28
|
+
const info = (msg) => console.log(` ${c.dim}${msg}${c.reset}`);
|
|
29
|
+
// ─── MAIN ─────────────────────────────────────────────────────────────────────
|
|
30
|
+
async function main() {
|
|
31
|
+
banner('network-ai - Hello Swarm');
|
|
32
|
+
// 1. Shared blackboard — the agents' shared memory
|
|
33
|
+
// (writes to swarm-blackboard.md in the workspace root)
|
|
34
|
+
const blackboard = new __1.SharedBlackboard(process.cwd());
|
|
35
|
+
// Register each agent identity on the blackboard.
|
|
36
|
+
// Token + namespace scoping means agents can only see keys they're allowed to.
|
|
37
|
+
blackboard.registerAgent('researcher', 'tok-researcher', ['task:', 'research:']);
|
|
38
|
+
blackboard.registerAgent('analyst', 'tok-analyst', ['task:', 'research:', 'analysis:']);
|
|
39
|
+
blackboard.registerAgent('reporter', 'tok-reporter', ['task:', 'analysis:', 'report:']);
|
|
40
|
+
// 2. CustomAdapter — wire plain async functions as named agents
|
|
41
|
+
const adapter = new __1.CustomAdapter();
|
|
42
|
+
adapter.registerHandler('researcher', async (payload) => {
|
|
43
|
+
const topic = payload.handoff?.instruction ?? 'unknown topic';
|
|
44
|
+
step('Researcher', `Investigating: "${topic}"`);
|
|
45
|
+
// Simulate research work
|
|
46
|
+
await sleep(300);
|
|
47
|
+
const findings = {
|
|
48
|
+
topic,
|
|
49
|
+
sources: 3,
|
|
50
|
+
keyFacts: [
|
|
51
|
+
'Multi-agent systems reduce task latency by ~40 %.',
|
|
52
|
+
'Shared blackboard architecture avoids tight coupling.',
|
|
53
|
+
'Permission walls prevent unauthorized resource access.',
|
|
54
|
+
],
|
|
55
|
+
confidence: 0.87,
|
|
56
|
+
};
|
|
57
|
+
// Write findings to the shared blackboard
|
|
58
|
+
blackboard.write('research:findings', findings, 'researcher', 3600, 'tok-researcher');
|
|
59
|
+
step('Researcher', `Wrote findings to blackboard ${c.dim}(research:findings)${c.reset}`);
|
|
60
|
+
return findings;
|
|
61
|
+
});
|
|
62
|
+
adapter.registerHandler('analyst', async () => {
|
|
63
|
+
step('Analyst', 'Reading researcher findings from blackboard...');
|
|
64
|
+
const entry = blackboard.read('research:findings');
|
|
65
|
+
if (!entry)
|
|
66
|
+
throw new Error('No findings on blackboard - did Researcher run first?');
|
|
67
|
+
const findings = entry.value;
|
|
68
|
+
await sleep(200);
|
|
69
|
+
const analysis = {
|
|
70
|
+
inputTopic: findings.topic,
|
|
71
|
+
factCount: findings.keyFacts.length,
|
|
72
|
+
confidence: findings.confidence,
|
|
73
|
+
recommendation: findings.confidence >= 0.8
|
|
74
|
+
? 'High confidence - proceed to report.'
|
|
75
|
+
: 'Low confidence - request additional research.',
|
|
76
|
+
summary: `Reviewed ${findings.keyFacts.length} facts about [${findings.topic}]. ` +
|
|
77
|
+
`Confidence score: ${(findings.confidence * 100).toFixed(0)} %.`,
|
|
78
|
+
};
|
|
79
|
+
blackboard.write('analysis:result', analysis, 'analyst', 3600, 'tok-analyst');
|
|
80
|
+
step('Analyst', `Wrote analysis to blackboard ${c.dim}(analysis:result)${c.reset}`);
|
|
81
|
+
return analysis;
|
|
82
|
+
});
|
|
83
|
+
adapter.registerHandler('reporter', async () => {
|
|
84
|
+
step('Reporter', 'Reading analysis from blackboard...');
|
|
85
|
+
const entry = blackboard.read('analysis:result');
|
|
86
|
+
if (!entry)
|
|
87
|
+
throw new Error('No analysis on blackboard - did Analyst run first?');
|
|
88
|
+
const analysis = entry.value;
|
|
89
|
+
await sleep(150);
|
|
90
|
+
const report = {
|
|
91
|
+
title: `Swarm Research Report: ${analysis.inputTopic}`,
|
|
92
|
+
generatedAt: new Date().toISOString(),
|
|
93
|
+
summary: analysis.summary,
|
|
94
|
+
recommendation: analysis.recommendation,
|
|
95
|
+
status: 'FINAL',
|
|
96
|
+
};
|
|
97
|
+
blackboard.write('report:final', report, 'reporter', 7200, 'tok-reporter');
|
|
98
|
+
step('Reporter', `Published final report ${c.dim}(report:final)${c.reset}`);
|
|
99
|
+
return report;
|
|
100
|
+
});
|
|
101
|
+
// 3. Build the orchestrator and register the adapter
|
|
102
|
+
const orchestrator = (0, __1.createSwarmOrchestrator)({
|
|
103
|
+
qualityThreshold: 0, // demos don't need quality-gate filtering
|
|
104
|
+
trustLevels: [
|
|
105
|
+
{ agentId: 'orchestrator', trustLevel: 0.9, allowedNamespaces: ['*'], allowedResources: ['*'] },
|
|
106
|
+
{ agentId: 'researcher', trustLevel: 0.8, allowedNamespaces: ['task:', 'research:'] },
|
|
107
|
+
{ agentId: 'analyst', trustLevel: 0.8, allowedNamespaces: ['task:', 'research:', 'analysis:'] },
|
|
108
|
+
{ agentId: 'reporter', trustLevel: 0.8, allowedNamespaces: ['task:', 'analysis:', 'report:'] },
|
|
109
|
+
],
|
|
110
|
+
});
|
|
111
|
+
await orchestrator.addAdapter(adapter);
|
|
112
|
+
const ctx = { agentId: 'orchestrator', taskId: 'demo-001', sessionId: 'session-demo' };
|
|
113
|
+
// ─── STEP 1: Delegate to Researcher ────────────────────────────────────────
|
|
114
|
+
banner('Step 1 - Researcher');
|
|
115
|
+
await orchestrator.execute('delegate_task', {
|
|
116
|
+
targetAgent: 'custom:researcher',
|
|
117
|
+
taskPayload: {
|
|
118
|
+
instruction: 'multi-agent coordination patterns',
|
|
119
|
+
expectedOutput: 'key facts with confidence score',
|
|
120
|
+
},
|
|
121
|
+
}, ctx);
|
|
122
|
+
// ─── STEP 2: Delegate to Analyst ───────────────────────────────────────────
|
|
123
|
+
banner('Step 2 - Analyst');
|
|
124
|
+
await orchestrator.execute('delegate_task', {
|
|
125
|
+
targetAgent: 'custom:analyst',
|
|
126
|
+
taskPayload: {
|
|
127
|
+
instruction: 'analyze researcher findings',
|
|
128
|
+
expectedOutput: 'summary + recommendation',
|
|
129
|
+
},
|
|
130
|
+
}, ctx);
|
|
131
|
+
// ─── STEP 3: Delegate to Reporter ──────────────────────────────────────────
|
|
132
|
+
banner('Step 3 - Reporter');
|
|
133
|
+
await orchestrator.execute('delegate_task', {
|
|
134
|
+
targetAgent: 'custom:reporter',
|
|
135
|
+
taskPayload: {
|
|
136
|
+
instruction: 'produce final report from analysis',
|
|
137
|
+
expectedOutput: 'formatted report object',
|
|
138
|
+
},
|
|
139
|
+
}, ctx);
|
|
140
|
+
// ─── FINAL REPORT ──────────────────────────────────────────────────────────
|
|
141
|
+
banner('Final Report');
|
|
142
|
+
const finalEntry = blackboard.read('report:final');
|
|
143
|
+
if (finalEntry) {
|
|
144
|
+
const report = finalEntry.value;
|
|
145
|
+
console.log(`\n ${c.bold}${c.magenta}${report.title}${c.reset}`);
|
|
146
|
+
console.log(` ${c.dim}Generated: ${report.generatedAt}${c.reset}`);
|
|
147
|
+
console.log(`\n ${c.bold}Summary:${c.reset} ${report.summary}`);
|
|
148
|
+
console.log(` ${c.bold}Recommendation:${c.reset} ${report.recommendation}`);
|
|
149
|
+
console.log(` ${c.bold}Status:${c.reset} ${c.green}${report.status}${c.reset}\n`);
|
|
150
|
+
}
|
|
151
|
+
// ─── BLACKBOARD SNAPSHOT ───────────────────────────────────────────────────
|
|
152
|
+
info('Blackboard keys written this session:');
|
|
153
|
+
const snap = blackboard.getSnapshot();
|
|
154
|
+
for (const [key, entry] of Object.entries(snap)) {
|
|
155
|
+
info(` ${c.blue}${key}${c.reset} <- ${entry.sourceAgent} @ ${entry.timestamp.slice(11, 19)}`);
|
|
156
|
+
}
|
|
157
|
+
console.log(`\n${c.dim}Done.${c.reset}\n`);
|
|
158
|
+
}
|
|
159
|
+
// ─── Utility ─────────────────────────────────────────────────────────────────
|
|
160
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
|
161
|
+
main().catch(err => {
|
|
162
|
+
console.error('\n[ERROR]', err.message);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=01-hello-swarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"01-hello-swarm.js","sourceRoot":"","sources":["../../examples/01-hello-swarm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 02-fsm-pipeline.ts
|
|
3
|
+
* ──────────────────
|
|
4
|
+
* Demonstrates `JourneyFSM` — network-ai's Finite State Machine governance
|
|
5
|
+
* layer that controls which agents can act (and which tools they can use)
|
|
6
|
+
* depending on the current workflow state.
|
|
7
|
+
*
|
|
8
|
+
* You'll see:
|
|
9
|
+
* ✅ Successful state transitions
|
|
10
|
+
* 🚫 A blocked action (wrong agent for current state)
|
|
11
|
+
* 🔒 A blocked tool (agent not authorized for that tool in this state)
|
|
12
|
+
* 📋 Full transition history at the end
|
|
13
|
+
*
|
|
14
|
+
* No API key needed.
|
|
15
|
+
*
|
|
16
|
+
* Run:
|
|
17
|
+
* npx ts-node examples/02-fsm-pipeline.ts
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=02-fsm-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"02-fsm-pipeline.d.ts","sourceRoot":"","sources":["../../examples/02-fsm-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 02-fsm-pipeline.ts
|
|
4
|
+
* ──────────────────
|
|
5
|
+
* Demonstrates `JourneyFSM` — network-ai's Finite State Machine governance
|
|
6
|
+
* layer that controls which agents can act (and which tools they can use)
|
|
7
|
+
* depending on the current workflow state.
|
|
8
|
+
*
|
|
9
|
+
* You'll see:
|
|
10
|
+
* ✅ Successful state transitions
|
|
11
|
+
* 🚫 A blocked action (wrong agent for current state)
|
|
12
|
+
* 🔒 A blocked tool (agent not authorized for that tool in this state)
|
|
13
|
+
* 📋 Full transition history at the end
|
|
14
|
+
*
|
|
15
|
+
* No API key needed.
|
|
16
|
+
*
|
|
17
|
+
* Run:
|
|
18
|
+
* npx ts-node examples/02-fsm-pipeline.ts
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
const __1 = require("..");
|
|
22
|
+
// ─── ANSI helpers ─────────────────────────────────────────────────────────────
|
|
23
|
+
const c = {
|
|
24
|
+
reset: '\x1b[0m',
|
|
25
|
+
bold: '\x1b[1m',
|
|
26
|
+
cyan: '\x1b[36m',
|
|
27
|
+
green: '\x1b[32m',
|
|
28
|
+
red: '\x1b[31m',
|
|
29
|
+
yellow: '\x1b[33m',
|
|
30
|
+
blue: '\x1b[34m',
|
|
31
|
+
dim: '\x1b[2m',
|
|
32
|
+
};
|
|
33
|
+
const banner = (msg) => console.log(`\n${c.bold}${c.cyan}--- ${msg} ---${c.reset}`);
|
|
34
|
+
const ok = (msg) => console.log(` ${c.green}[OK]${c.reset} ${msg}`);
|
|
35
|
+
const fail = (msg) => console.log(` ${c.red}[NO]${c.reset} ${msg}`);
|
|
36
|
+
const info = (msg) => console.log(` ${c.dim}${msg}${c.reset}`);
|
|
37
|
+
// ─── Helper: pretty-print a compliance result ─────────────────────────────────
|
|
38
|
+
function showCompliance(label, result) {
|
|
39
|
+
if (result.allowed) {
|
|
40
|
+
ok(` ${label}: ${c.green}ALLOWED${c.reset} in state [${result.currentState}]`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
fail(` ${label}: ${c.red}BLOCKED${c.reset} - ${result.reason}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ─── Helper: pretty-print a transition result ─────────────────────────────────
|
|
47
|
+
function showTransition(event, result) {
|
|
48
|
+
if (result.success) {
|
|
49
|
+
ok(` "${event}": ${c.blue}${result.previousState}${c.reset} -> ${c.bold}${c.blue}${result.currentState}${c.reset}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
fail(` "${event}" blocked - ${result.reason}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ─── MAIN ─────────────────────────────────────────────────────────────────────
|
|
56
|
+
async function main() {
|
|
57
|
+
banner('network-ai - FSM Governance Pipeline');
|
|
58
|
+
// ─── Build the FSM ──────────────────────────────────────────────────────────
|
|
59
|
+
//
|
|
60
|
+
// Pipeline stages:
|
|
61
|
+
// INTAKE → VALIDATE → RESEARCH → EXECUTE → DELIVER → COMPLETE
|
|
62
|
+
//
|
|
63
|
+
// Each state declares:
|
|
64
|
+
// • which agents are authorized to act
|
|
65
|
+
// • which tools those agents may use
|
|
66
|
+
//
|
|
67
|
+
const fsm = new __1.JourneyFSM({
|
|
68
|
+
states: [
|
|
69
|
+
{
|
|
70
|
+
name: __1.WORKFLOW_STATES.INTAKE,
|
|
71
|
+
description: 'Initial intake and triage',
|
|
72
|
+
authorizedAgents: ['orchestrator'],
|
|
73
|
+
authorizedTools: {
|
|
74
|
+
orchestrator: ['read_intake', 'triage_task'],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: __1.WORKFLOW_STATES.VALIDATE,
|
|
79
|
+
description: 'Validate inputs and permissions',
|
|
80
|
+
authorizedAgents: ['orchestrator', 'validator'],
|
|
81
|
+
authorizedTools: {
|
|
82
|
+
orchestrator: ['check_schema'],
|
|
83
|
+
validator: ['run_validation', 'check_schema'],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: __1.WORKFLOW_STATES.RESEARCH,
|
|
88
|
+
description: 'Gather information',
|
|
89
|
+
authorizedAgents: ['data_analyst', 'researcher'],
|
|
90
|
+
authorizedTools: {
|
|
91
|
+
data_analyst: ['query_db', 'search_web', 'read_blackboard'],
|
|
92
|
+
researcher: ['search_web', 'read_blackboard'],
|
|
93
|
+
},
|
|
94
|
+
timeoutMs: 60_000, // 60 second timeout
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: __1.WORKFLOW_STATES.EXECUTE,
|
|
98
|
+
description: 'Execute the main task',
|
|
99
|
+
authorizedAgents: ['executor', 'code_writer'],
|
|
100
|
+
authorizedTools: {
|
|
101
|
+
executor: ['write_file', 'run_build'],
|
|
102
|
+
code_writer: ['write_file', 'read_file'],
|
|
103
|
+
'*': ['read_blackboard'],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: __1.WORKFLOW_STATES.DELIVER,
|
|
108
|
+
description: 'Produce and write final output',
|
|
109
|
+
authorizedAgents: ['reporter', 'orchestrator'],
|
|
110
|
+
authorizedTools: {
|
|
111
|
+
reporter: ['write_report', 'write_blackboard'],
|
|
112
|
+
orchestrator: ['write_blackboard', 'notify'],
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: __1.WORKFLOW_STATES.COMPLETE,
|
|
117
|
+
description: 'Workflow complete',
|
|
118
|
+
authorizedAgents: ['*'],
|
|
119
|
+
authorizedTools: { '*': ['read_blackboard'] },
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
transitions: [
|
|
123
|
+
{ from: __1.WORKFLOW_STATES.INTAKE, event: 'intake_done', to: __1.WORKFLOW_STATES.VALIDATE, allowedBy: 'orchestrator' },
|
|
124
|
+
{ from: __1.WORKFLOW_STATES.VALIDATE, event: 'valid', to: __1.WORKFLOW_STATES.RESEARCH, allowedBy: 'orchestrator' },
|
|
125
|
+
{ from: __1.WORKFLOW_STATES.VALIDATE, event: 'invalid', to: __1.WORKFLOW_STATES.ERROR, allowedBy: '*' },
|
|
126
|
+
{ from: __1.WORKFLOW_STATES.RESEARCH, event: 'research_done', to: __1.WORKFLOW_STATES.EXECUTE, allowedBy: 'data_analyst' },
|
|
127
|
+
{ from: __1.WORKFLOW_STATES.EXECUTE, event: 'exec_done', to: __1.WORKFLOW_STATES.DELIVER, allowedBy: 'executor' },
|
|
128
|
+
{ from: __1.WORKFLOW_STATES.DELIVER, event: 'delivered', to: __1.WORKFLOW_STATES.COMPLETE, allowedBy: '*' },
|
|
129
|
+
],
|
|
130
|
+
initialState: __1.WORKFLOW_STATES.INTAKE,
|
|
131
|
+
// Called on every successful transition
|
|
132
|
+
onTransition: (result) => {
|
|
133
|
+
info(` [FSM] ${result.previousState} -> ${result.currentState}`);
|
|
134
|
+
},
|
|
135
|
+
// Called when a compliance check fails
|
|
136
|
+
onViolation: (result) => {
|
|
137
|
+
info(` [FSM] Violation: ${result.reason}`);
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
// ─── PHASE 1: Compliance checks in INTAKE state ──────────────────────────────
|
|
141
|
+
banner(`Current state: ${fsm.state}`);
|
|
142
|
+
info(`Authorized agents: [${fsm.stateDefinition.authorizedAgents.join(', ')}]`);
|
|
143
|
+
console.log();
|
|
144
|
+
showCompliance('orchestrator can act ', fsm.checkCompliance('orchestrator'));
|
|
145
|
+
showCompliance('orchestrator uses read_intake ', fsm.checkCompliance('orchestrator', 'read_intake'));
|
|
146
|
+
showCompliance('data_analyst (wrong state) can act', fsm.checkCompliance('data_analyst'));
|
|
147
|
+
showCompliance('orchestrator uses query_db (wrong)', fsm.checkCompliance('orchestrator', 'query_db'));
|
|
148
|
+
// ─── PHASE 2: Transition INTAKE → VALIDATE ────────────────────────────────┐
|
|
149
|
+
banner('Transitions');
|
|
150
|
+
showTransition('intake_done', fsm.transition('intake_done', 'orchestrator'));
|
|
151
|
+
info(` Now in: ${c.bold}${fsm.state}${c.reset}`);
|
|
152
|
+
showTransition('valid', fsm.transition('valid', 'orchestrator'));
|
|
153
|
+
info(` Now in: ${c.bold}${fsm.state}${c.reset}`); // RESEARCH
|
|
154
|
+
// Wrong agent trying to move out of RESEARCH (should fail)
|
|
155
|
+
showTransition('research_done by orchestrator (blocked)', fsm.transition('research_done', 'orchestrator'));
|
|
156
|
+
// Correct agent
|
|
157
|
+
showTransition('research_done', fsm.transition('research_done', 'data_analyst'));
|
|
158
|
+
info(` Now in: ${c.bold}${fsm.state}${c.reset}`); // EXECUTE
|
|
159
|
+
// ─── PHASE 3: Tool checks in EXECUTE state ───────────────────────────────────
|
|
160
|
+
banner(`Tool Checks in state: ${fsm.state}`);
|
|
161
|
+
showCompliance('executor uses write_file ', fsm.checkCompliance('executor', 'write_file'));
|
|
162
|
+
showCompliance('executor uses run_build ', fsm.checkCompliance('executor', 'run_build'));
|
|
163
|
+
showCompliance('code_writer uses read_file ', fsm.checkCompliance('code_writer', 'read_file'));
|
|
164
|
+
showCompliance('anyone reads blackboard (*) ', fsm.checkCompliance('random_agent', 'read_blackboard'));
|
|
165
|
+
showCompliance('reporter (wrong state) ', fsm.checkCompliance('reporter', 'write_report'));
|
|
166
|
+
// ─── PHASE 4: Finish the pipeline ────────────────────────────────────────────
|
|
167
|
+
banner('Finish Pipeline');
|
|
168
|
+
showTransition('exec_done', fsm.transition('exec_done', 'executor'));
|
|
169
|
+
showTransition('delivered', fsm.transition('delivered', 'reporter'));
|
|
170
|
+
info(` Final state: ${c.bold}${c.green}${fsm.state}${c.reset}`);
|
|
171
|
+
// ─── PHASE 5: Transition history ─────────────────────────────────────────────
|
|
172
|
+
banner('Transition History');
|
|
173
|
+
const history = fsm.transitionHistory;
|
|
174
|
+
for (let i = 0; i < history.length; i++) {
|
|
175
|
+
const h = history[i];
|
|
176
|
+
const duration = h.exitedAt
|
|
177
|
+
? `${h.exitedAt - h.enteredAt} ms`
|
|
178
|
+
: '(current)';
|
|
179
|
+
info(` ${String(i + 1).padStart(2)}. ${c.blue}${h.state.padEnd(10)}${c.reset} ` +
|
|
180
|
+
`entered ${new Date(h.enteredAt).toISOString().slice(11, 23)} ` +
|
|
181
|
+
`${duration}`);
|
|
182
|
+
}
|
|
183
|
+
console.log(`\n${c.dim}Done.${c.reset}\n`);
|
|
184
|
+
}
|
|
185
|
+
main().catch(err => {
|
|
186
|
+
console.error('\n[ERROR]', err.message);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=02-fsm-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"02-fsm-pipeline.js","sourceRoot":"","sources":["../../examples/02-fsm-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 03-parallel-agents.ts
|
|
3
|
+
* ─────────────────────
|
|
4
|
+
* Demonstrates `spawn_parallel_agents` — running multiple specialist agents
|
|
5
|
+
* concurrently and synthesizing their results with different strategies.
|
|
6
|
+
*
|
|
7
|
+
* Three agents work in parallel on the same topic:
|
|
8
|
+
* • sentiment_agent — tone & sentiment analysis
|
|
9
|
+
* • keyword_agent — key-phrase extraction
|
|
10
|
+
* • summary_agent — executive summary
|
|
11
|
+
*
|
|
12
|
+
* The demo runs through all four synthesis strategies so you can see how
|
|
13
|
+
* each one combines (or selects) the parallel outputs.
|
|
14
|
+
*
|
|
15
|
+
* No API key needed.
|
|
16
|
+
*
|
|
17
|
+
* Run:
|
|
18
|
+
* npx ts-node examples/03-parallel-agents.ts
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=03-parallel-agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"03-parallel-agents.d.ts","sourceRoot":"","sources":["../../examples/03-parallel-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 03-parallel-agents.ts
|
|
4
|
+
* ─────────────────────
|
|
5
|
+
* Demonstrates `spawn_parallel_agents` — running multiple specialist agents
|
|
6
|
+
* concurrently and synthesizing their results with different strategies.
|
|
7
|
+
*
|
|
8
|
+
* Three agents work in parallel on the same topic:
|
|
9
|
+
* • sentiment_agent — tone & sentiment analysis
|
|
10
|
+
* • keyword_agent — key-phrase extraction
|
|
11
|
+
* • summary_agent — executive summary
|
|
12
|
+
*
|
|
13
|
+
* The demo runs through all four synthesis strategies so you can see how
|
|
14
|
+
* each one combines (or selects) the parallel outputs.
|
|
15
|
+
*
|
|
16
|
+
* No API key needed.
|
|
17
|
+
*
|
|
18
|
+
* Run:
|
|
19
|
+
* npx ts-node examples/03-parallel-agents.ts
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
const __1 = require("..");
|
|
23
|
+
// ─── ANSI helpers ─────────────────────────────────────────────────────────────
|
|
24
|
+
const c = {
|
|
25
|
+
reset: '\x1b[0m',
|
|
26
|
+
bold: '\x1b[1m',
|
|
27
|
+
cyan: '\x1b[36m',
|
|
28
|
+
green: '\x1b[32m',
|
|
29
|
+
yellow: '\x1b[33m',
|
|
30
|
+
blue: '\x1b[34m',
|
|
31
|
+
magenta: '\x1b[35m',
|
|
32
|
+
dim: '\x1b[2m',
|
|
33
|
+
};
|
|
34
|
+
const banner = (msg) => console.log(`\n${c.bold}${c.cyan}--- ${msg} ---${c.reset}`);
|
|
35
|
+
const row = (label, val) => console.log(` ${c.bold}${label.padEnd(20)}${c.reset}${val}`);
|
|
36
|
+
const info = (msg) => console.log(` ${c.dim}${msg}${c.reset}`);
|
|
37
|
+
// ─── Sample text the agents will analyze ─────────────────────────────────────
|
|
38
|
+
const SAMPLE_TEXT = `
|
|
39
|
+
network-ai makes multi-agent coordination easy and secure. The shared
|
|
40
|
+
blackboard lets agents collaborate without tight coupling, and the permission
|
|
41
|
+
wall ensures every resource access is justified and audited. Real-world swarms
|
|
42
|
+
can now be built in minutes rather than months.
|
|
43
|
+
`.trim();
|
|
44
|
+
// ─── MAIN ─────────────────────────────────────────────────────────────────────
|
|
45
|
+
async function main() {
|
|
46
|
+
banner('network-ai - Parallel Agents');
|
|
47
|
+
// ─── Register three specialist agents ──────────────────────────────────────
|
|
48
|
+
const adapter = new __1.CustomAdapter();
|
|
49
|
+
// Agent 1 — Sentiment analysis
|
|
50
|
+
adapter.registerHandler('sentiment_agent', async (payload) => {
|
|
51
|
+
const text = payload.handoff?.context?.text ?? '';
|
|
52
|
+
await sleep(250);
|
|
53
|
+
const positiveWords = (text.match(/easy|secure|simple|fast|safe|great|better|improve/gi) ?? []).length;
|
|
54
|
+
const negativeWords = (text.match(/hard|slow|insecure|bad|broken|fail|complex/gi) ?? []).length;
|
|
55
|
+
const total = positiveWords + negativeWords;
|
|
56
|
+
const score = total === 0 ? 0.5 : positiveWords / total;
|
|
57
|
+
return {
|
|
58
|
+
agent: 'sentiment_agent',
|
|
59
|
+
sentiment: score >= 0.7 ? 'positive' : score >= 0.4 ? 'neutral' : 'negative',
|
|
60
|
+
score: parseFloat(score.toFixed(2)),
|
|
61
|
+
positiveHits: positiveWords,
|
|
62
|
+
negativeHits: negativeWords,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
// Agent 2 — Keyword extraction
|
|
66
|
+
adapter.registerHandler('keyword_agent', async (payload) => {
|
|
67
|
+
const text = payload.handoff?.context?.text ?? '';
|
|
68
|
+
await sleep(180);
|
|
69
|
+
// Very simple: pull out capitalized proper nouns and domain terms
|
|
70
|
+
const domainTerms = [
|
|
71
|
+
'network-ai', 'blackboard', 'agent', 'permission',
|
|
72
|
+
'orchestrator', 'swarm', 'coordination', 'security',
|
|
73
|
+
];
|
|
74
|
+
const found = domainTerms.filter(t => text.toLowerCase().includes(t));
|
|
75
|
+
return {
|
|
76
|
+
agent: 'keyword_agent',
|
|
77
|
+
keywords: found,
|
|
78
|
+
count: found.length,
|
|
79
|
+
density: parseFloat((found.length / text.split(/\s+/).length).toFixed(3)),
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
// Agent 3 — Executive summary
|
|
83
|
+
adapter.registerHandler('summary_agent', async (payload) => {
|
|
84
|
+
const text = payload.handoff?.context?.text ?? '';
|
|
85
|
+
await sleep(320);
|
|
86
|
+
const sentences = text.split(/[.!?]+/).map(s => s.trim()).filter(Boolean);
|
|
87
|
+
const wordCount = text.split(/\s+/).length;
|
|
88
|
+
return {
|
|
89
|
+
agent: 'summary_agent',
|
|
90
|
+
wordCount,
|
|
91
|
+
sentenceCount: sentences.length,
|
|
92
|
+
firstSentence: sentences[0] ?? '',
|
|
93
|
+
readingTimeSeconds: Math.ceil(wordCount / 3), // ~180 wpm
|
|
94
|
+
oneLiner: 'A secure, blackboard-based multi-agent coordination library.',
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
// ─── Build orchestrator ─────────────────────────────────────────────────────
|
|
98
|
+
const orchestrator = (0, __1.createSwarmOrchestrator)({
|
|
99
|
+
qualityThreshold: 0, // demos don't need quality-gate filtering
|
|
100
|
+
trustLevels: [
|
|
101
|
+
{ agentId: 'orchestrator', trustLevel: 0.9, allowedNamespaces: ['*'], allowedResources: ['*'] },
|
|
102
|
+
{ agentId: 'sentiment_agent', trustLevel: 0.8, allowedNamespaces: ['task:'] },
|
|
103
|
+
{ agentId: 'keyword_agent', trustLevel: 0.8, allowedNamespaces: ['task:'] },
|
|
104
|
+
{ agentId: 'summary_agent', trustLevel: 0.8, allowedNamespaces: ['task:'] },
|
|
105
|
+
],
|
|
106
|
+
});
|
|
107
|
+
await orchestrator.addAdapter(adapter);
|
|
108
|
+
const ctx = { agentId: 'orchestrator', taskId: 'demo-parallel', sessionId: 'session-p1' };
|
|
109
|
+
// Shared task params (3 agents, same input text)
|
|
110
|
+
const parallelTasks = [
|
|
111
|
+
{
|
|
112
|
+
agentType: 'custom:sentiment_agent',
|
|
113
|
+
taskPayload: {
|
|
114
|
+
instruction: 'Analyze sentiment of the provided text',
|
|
115
|
+
context: { text: SAMPLE_TEXT },
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
agentType: 'custom:keyword_agent',
|
|
120
|
+
taskPayload: {
|
|
121
|
+
instruction: 'Extract keywords from the provided text',
|
|
122
|
+
context: { text: SAMPLE_TEXT },
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
agentType: 'custom:summary_agent',
|
|
127
|
+
taskPayload: {
|
|
128
|
+
instruction: 'Summarize the provided text',
|
|
129
|
+
context: { text: SAMPLE_TEXT },
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
// ─── Run with every synthesis strategy ──────────────────────────────────────
|
|
134
|
+
const strategies = ['merge', 'vote', 'chain', 'first-success'];
|
|
135
|
+
for (const strategy of strategies) {
|
|
136
|
+
banner(`Strategy: ${strategy.toUpperCase()}`);
|
|
137
|
+
const start = Date.now();
|
|
138
|
+
const result = await orchestrator.execute('spawn_parallel_agents', { tasks: parallelTasks, synthesisStrategy: strategy }, ctx);
|
|
139
|
+
const elapsed = Date.now() - start;
|
|
140
|
+
if (!result.success) {
|
|
141
|
+
console.log(` ${c.yellow}Failed:${c.reset}`, result.error?.message);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const data = result.data;
|
|
145
|
+
// Per-agent stats
|
|
146
|
+
info('Individual results:');
|
|
147
|
+
for (const r of data.individualResults) {
|
|
148
|
+
const name = r.agentType.replace('custom:', '');
|
|
149
|
+
const icon = r.success ? c.green + '+' : c.yellow + 'x';
|
|
150
|
+
console.log(` ${icon}${c.reset} ${name.padEnd(18)} ${r.executionTime} ms`);
|
|
151
|
+
}
|
|
152
|
+
// Synthesis output (strategy-specific top-level fields)
|
|
153
|
+
info('\nSynthesized output (top-level fields):');
|
|
154
|
+
const synth = data.synthesizedResult;
|
|
155
|
+
for (const [k, v] of Object.entries(synth)) {
|
|
156
|
+
if (typeof v !== 'object') {
|
|
157
|
+
row(` ${k}`, String(v));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
row(` ${k}`, c.dim + JSON.stringify(v).slice(0, 80) + c.reset);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Metrics
|
|
164
|
+
info('');
|
|
165
|
+
row(' Wall-clock time', `${elapsed} ms`);
|
|
166
|
+
row(' Success rate', `${(data.executionMetrics.successRate * 100).toFixed(0)} %`);
|
|
167
|
+
row(' Strategy used', data.executionMetrics.synthesisStrategy);
|
|
168
|
+
}
|
|
169
|
+
// ─── Demonstrate: result caching on second run ─────────────────────────────
|
|
170
|
+
banner('Second Run (cache hit demo)');
|
|
171
|
+
info('network-ai caches successful results on the blackboard.');
|
|
172
|
+
info('A second spawn_parallel_agents call with the same tasks should be instant.');
|
|
173
|
+
const t0 = Date.now();
|
|
174
|
+
const r2 = await orchestrator.execute('spawn_parallel_agents', { tasks: parallelTasks, synthesisStrategy: 'merge' }, ctx);
|
|
175
|
+
const t1 = Date.now();
|
|
176
|
+
if (r2.success) {
|
|
177
|
+
const d2 = r2.data;
|
|
178
|
+
const anyFromCache = d2.individualResults.some(r => r.executionTime === 0);
|
|
179
|
+
console.log(` ${c.bold}Elapsed:${c.reset} ${t1 - t0} ms ` +
|
|
180
|
+
(anyFromCache
|
|
181
|
+
? `${c.green}<- cache hits detected (executionTime = 0)${c.reset}`
|
|
182
|
+
: `${c.yellow}(no cache hits)${c.reset}`));
|
|
183
|
+
}
|
|
184
|
+
console.log(`\n${c.dim}Done.${c.reset}\n`);
|
|
185
|
+
}
|
|
186
|
+
// ─── Utility ─────────────────────────────────────────────────────────────────
|
|
187
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
|
188
|
+
main().catch(err => {
|
|
189
|
+
console.error('\n[ERROR]', err.message);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=03-parallel-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"03-parallel-agents.js","sourceRoot":"","sources":["../../examples/03-parallel-agents.ts"],"names":[],"mappings":"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"}
|