network-ai 4.14.0 → 4.15.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.
@@ -0,0 +1,553 @@
1
+ "use strict";
2
+ /**
3
+ * Goal Decomposer — LLM-powered goal → task DAG → parallel execution
4
+ *
5
+ * Provides the `runTeam()` one-liner: describe a goal in plain English,
6
+ * specify which agents to use, and let an LLM plan the task graph.
7
+ * Execution respects all Network-AI guardrails (budgets, permissions, audit).
8
+ *
9
+ * Zero external dependencies — LLM calls go through the adapter system.
10
+ *
11
+ * @module GoalDecomposer
12
+ * @version 1.0.0
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TeamRunner = exports.GoalDecomposer = void 0;
16
+ exports.validateDAG = validateDAG;
17
+ exports.topologicalLayers = topologicalLayers;
18
+ exports.createLLMPlanner = createLLMPlanner;
19
+ exports.parsePlanJSON = parsePlanJSON;
20
+ exports.runTeam = runTeam;
21
+ const events_1 = require("events");
22
+ // ============================================================================
23
+ // DAG UTILITIES
24
+ // ============================================================================
25
+ /**
26
+ * Validate that a set of planned tasks forms a valid DAG (no cycles, valid refs).
27
+ * @throws Error if the graph contains cycles or invalid dependency references
28
+ */
29
+ function validateDAG(tasks) {
30
+ const ids = new Set(tasks.map((t) => t.id));
31
+ // Check for duplicate IDs
32
+ if (ids.size !== tasks.length) {
33
+ throw new Error('Duplicate task IDs in plan');
34
+ }
35
+ // Check all dependency references are valid
36
+ for (const task of tasks) {
37
+ for (const dep of task.dependencies) {
38
+ if (!ids.has(dep)) {
39
+ throw new Error(`Task "${task.id}" depends on unknown task "${dep}"`);
40
+ }
41
+ if (dep === task.id) {
42
+ throw new Error(`Task "${task.id}" depends on itself`);
43
+ }
44
+ }
45
+ }
46
+ // Cycle detection via topological sort (Kahn's algorithm)
47
+ const inDegree = new Map();
48
+ const adj = new Map();
49
+ for (const task of tasks) {
50
+ inDegree.set(task.id, 0);
51
+ adj.set(task.id, []);
52
+ }
53
+ for (const task of tasks) {
54
+ for (const dep of task.dependencies) {
55
+ adj.get(dep).push(task.id);
56
+ inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
57
+ }
58
+ }
59
+ const queue = [];
60
+ for (const [id, deg] of inDegree) {
61
+ if (deg === 0)
62
+ queue.push(id);
63
+ }
64
+ let visited = 0;
65
+ while (queue.length > 0) {
66
+ const node = queue.shift();
67
+ visited++;
68
+ for (const neighbor of adj.get(node) ?? []) {
69
+ const newDeg = (inDegree.get(neighbor) ?? 1) - 1;
70
+ inDegree.set(neighbor, newDeg);
71
+ if (newDeg === 0)
72
+ queue.push(neighbor);
73
+ }
74
+ }
75
+ if (visited !== tasks.length) {
76
+ throw new Error('Task graph contains a cycle');
77
+ }
78
+ }
79
+ /**
80
+ * Compute topological layers — tasks in the same layer can execute in parallel.
81
+ * Returns arrays of task IDs grouped by execution layer.
82
+ */
83
+ function topologicalLayers(tasks) {
84
+ const inDegree = new Map();
85
+ const adj = new Map();
86
+ for (const task of tasks) {
87
+ inDegree.set(task.id, 0);
88
+ adj.set(task.id, []);
89
+ }
90
+ for (const task of tasks) {
91
+ for (const dep of task.dependencies) {
92
+ adj.get(dep).push(task.id);
93
+ inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
94
+ }
95
+ }
96
+ const layers = [];
97
+ let remaining = new Set(tasks.map((t) => t.id));
98
+ while (remaining.size > 0) {
99
+ const layer = [];
100
+ for (const id of remaining) {
101
+ if ((inDegree.get(id) ?? 0) === 0) {
102
+ layer.push(id);
103
+ }
104
+ }
105
+ if (layer.length === 0) {
106
+ throw new Error('Cycle detected during layer computation');
107
+ }
108
+ layers.push(layer);
109
+ for (const id of layer) {
110
+ remaining.delete(id);
111
+ for (const neighbor of adj.get(id) ?? []) {
112
+ inDegree.set(neighbor, (inDegree.get(neighbor) ?? 1) - 1);
113
+ }
114
+ }
115
+ }
116
+ return layers;
117
+ }
118
+ // ============================================================================
119
+ // BUILT-IN PLANNER — Structured prompt → LLM → JSON parse
120
+ // ============================================================================
121
+ /**
122
+ * Create a planner function that uses an LLM (via executor) to decompose goals.
123
+ *
124
+ * The planner sends a structured prompt to the specified agent and parses
125
+ * the JSON response into PlannedTask[]. Falls back gracefully on parse errors.
126
+ *
127
+ * @param executor - Function to call the LLM agent
128
+ * @param plannerAgent - Agent ID for the LLM that does planning
129
+ * @param plannerAdapter - Adapter name (optional, defaults to agent's adapter)
130
+ */
131
+ function createLLMPlanner(executor, plannerAgent) {
132
+ return async (goal, agents, context) => {
133
+ const agentDescriptions = agents
134
+ .map((a) => `- ${a.id}: ${a.role}${a.defaultAction ? ` (action: ${a.defaultAction})` : ''}`)
135
+ .join('\n');
136
+ const prompt = [
137
+ 'You are a task planning agent. Decompose the following goal into a set of tasks.',
138
+ 'Each task must be assigned to one of the available agents.',
139
+ 'Tasks can depend on other tasks (they will wait for dependencies to complete).',
140
+ 'Tasks without dependencies will run in parallel.',
141
+ '',
142
+ `GOAL: ${goal}`,
143
+ '',
144
+ 'AVAILABLE AGENTS:',
145
+ agentDescriptions,
146
+ '',
147
+ context ? `CONTEXT: ${JSON.stringify(context)}` : '',
148
+ '',
149
+ 'Respond with ONLY a JSON array of task objects. Each object must have:',
150
+ '- "id": unique string identifier (e.g. "task-1")',
151
+ '- "description": what this task does',
152
+ '- "agent": agent ID from the list above',
153
+ '- "action": the action to perform',
154
+ '- "params": object with parameters',
155
+ '- "dependencies": array of task IDs this depends on (empty array if none)',
156
+ '- "priority": number (higher = more urgent, default 1)',
157
+ '',
158
+ 'Example:',
159
+ '[{"id":"task-1","description":"Research the topic","agent":"researcher","action":"research","params":{"query":"..."},"dependencies":[],"priority":2},',
160
+ ' {"id":"task-2","description":"Write summary","agent":"writer","action":"write","params":{"input":"from task-1"},"dependencies":["task-1"],"priority":1}]',
161
+ ].filter(Boolean).join('\n');
162
+ const payload = {
163
+ action: 'plan',
164
+ params: { prompt, goal, agents: agents.map((a) => ({ id: a.id, role: a.role })) },
165
+ };
166
+ const result = await executor(plannerAgent, payload, {
167
+ agentId: plannerAgent,
168
+ taskId: `plan-${Date.now()}`,
169
+ metadata: { type: 'goal-decomposition', ...(context ?? {}) },
170
+ });
171
+ if (!result.success || !result.data) {
172
+ throw new Error(`Planner agent failed: ${result.error?.message ?? 'no data returned'}`);
173
+ }
174
+ // Parse the LLM response — handle both string and pre-parsed responses
175
+ let tasks;
176
+ if (Array.isArray(result.data)) {
177
+ tasks = result.data;
178
+ }
179
+ else if (typeof result.data === 'string') {
180
+ tasks = parsePlanJSON(result.data);
181
+ }
182
+ else if (typeof result.data === 'object' && result.data !== null) {
183
+ const dataObj = result.data;
184
+ if (Array.isArray(dataObj.tasks)) {
185
+ tasks = dataObj.tasks;
186
+ }
187
+ else if (typeof dataObj.text === 'string') {
188
+ tasks = parsePlanJSON(dataObj.text);
189
+ }
190
+ else if (typeof dataObj.content === 'string') {
191
+ tasks = parsePlanJSON(dataObj.content);
192
+ }
193
+ else {
194
+ throw new Error('Planner returned unrecognized data shape');
195
+ }
196
+ }
197
+ else {
198
+ throw new Error('Planner returned unrecognized data type');
199
+ }
200
+ // Validate required fields
201
+ for (const task of tasks) {
202
+ if (!task.id || typeof task.id !== 'string')
203
+ throw new Error('Task missing "id"');
204
+ if (!task.description || typeof task.description !== 'string')
205
+ throw new Error(`Task "${task.id}" missing "description"`);
206
+ if (!task.agent || typeof task.agent !== 'string')
207
+ throw new Error(`Task "${task.id}" missing "agent"`);
208
+ if (!task.action || typeof task.action !== 'string')
209
+ throw new Error(`Task "${task.id}" missing "action"`);
210
+ if (!task.params || typeof task.params !== 'object')
211
+ task.params = {};
212
+ if (!Array.isArray(task.dependencies))
213
+ task.dependencies = [];
214
+ if (typeof task.priority !== 'number')
215
+ task.priority = 1;
216
+ }
217
+ return tasks;
218
+ };
219
+ }
220
+ /**
221
+ * Parse JSON from an LLM response string, handling markdown fences and preamble.
222
+ */
223
+ function parsePlanJSON(text) {
224
+ // Strip markdown code fences (indexOf-based to avoid ReDoS — CodeQL #105)
225
+ let cleaned = text.trim();
226
+ const fenceOpen = cleaned.indexOf('```');
227
+ if (fenceOpen !== -1) {
228
+ const afterOpen = cleaned.indexOf('\n', fenceOpen);
229
+ const fenceClose = cleaned.indexOf('```', afterOpen !== -1 ? afterOpen : fenceOpen + 3);
230
+ if (afterOpen !== -1 && fenceClose > afterOpen) {
231
+ cleaned = cleaned.substring(afterOpen + 1, fenceClose).trim();
232
+ }
233
+ }
234
+ // Find the JSON array in the text
235
+ const arrayStart = cleaned.indexOf('[');
236
+ const arrayEnd = cleaned.lastIndexOf(']');
237
+ if (arrayStart !== -1 && arrayEnd > arrayStart) {
238
+ cleaned = cleaned.substring(arrayStart, arrayEnd + 1);
239
+ }
240
+ try {
241
+ const parsed = JSON.parse(cleaned);
242
+ if (!Array.isArray(parsed)) {
243
+ throw new Error('Expected JSON array of tasks');
244
+ }
245
+ return parsed;
246
+ }
247
+ catch (err) {
248
+ throw new Error(`Failed to parse planner response as JSON: ${err.message}`);
249
+ }
250
+ }
251
+ // ============================================================================
252
+ // GOAL DECOMPOSER
253
+ // ============================================================================
254
+ /**
255
+ * LLM-powered goal decomposition engine.
256
+ *
257
+ * Takes a natural language goal, creates a task DAG via an LLM planner,
258
+ * validates the graph, and returns a ready-to-execute TaskDAG.
259
+ */
260
+ class GoalDecomposer {
261
+ planner;
262
+ constructor(planner) {
263
+ this.planner = planner;
264
+ }
265
+ /**
266
+ * Decompose a goal into a validated TaskDAG.
267
+ * @param goal - Natural language description of the goal
268
+ * @param agents - Available team agents
269
+ * @param context - Optional context to feed to the planner
270
+ * @param retries - Number of retries on planning failure (default: 1)
271
+ */
272
+ async decompose(goal, agents, context, retries = 1) {
273
+ if (!goal || typeof goal !== 'string' || goal.trim().length === 0) {
274
+ throw new Error('Goal must be a non-empty string');
275
+ }
276
+ if (!agents || agents.length === 0) {
277
+ throw new Error('At least one agent is required');
278
+ }
279
+ // Validate agent IDs are unique
280
+ const agentIds = new Set(agents.map((a) => a.id));
281
+ if (agentIds.size !== agents.length) {
282
+ throw new Error('Duplicate agent IDs');
283
+ }
284
+ let lastError;
285
+ for (let attempt = 0; attempt <= retries; attempt++) {
286
+ try {
287
+ const planned = await this.planner(goal, agents, context);
288
+ validateDAG(planned);
289
+ // Validate that all assigned agents exist in the team
290
+ for (const task of planned) {
291
+ if (!agentIds.has(task.agent)) {
292
+ throw new Error(`Task "${task.id}" assigned to unknown agent "${task.agent}"`);
293
+ }
294
+ }
295
+ // Build the TaskDAG
296
+ const nodes = planned.map((t) => ({
297
+ id: t.id,
298
+ description: t.description,
299
+ agent: t.agent,
300
+ action: t.action,
301
+ params: t.params,
302
+ dependencies: t.dependencies,
303
+ priority: t.priority ?? 1,
304
+ status: 'pending',
305
+ }));
306
+ const edges = new Map();
307
+ for (const task of planned) {
308
+ edges.set(task.id, []);
309
+ }
310
+ for (const task of planned) {
311
+ for (const dep of task.dependencies) {
312
+ edges.get(dep).push(task.id);
313
+ }
314
+ }
315
+ return { goal, nodes, edges, createdAt: Date.now() };
316
+ }
317
+ catch (err) {
318
+ lastError = err;
319
+ if (attempt < retries)
320
+ continue;
321
+ }
322
+ }
323
+ throw lastError ?? new Error('Planning failed');
324
+ }
325
+ }
326
+ exports.GoalDecomposer = GoalDecomposer;
327
+ // ============================================================================
328
+ // TEAM RUNNER — The one-liner execution engine
329
+ // ============================================================================
330
+ /**
331
+ * Executes a TaskDAG by running tasks in parallel layers, respecting
332
+ * dependencies, concurrency limits, and timeouts.
333
+ *
334
+ * @example
335
+ * ```typescript
336
+ * const runner = new TeamRunner(executor);
337
+ * const result = await runner.run(dag, { concurrency: 3 });
338
+ * console.log(result.summary);
339
+ * ```
340
+ */
341
+ class TeamRunner extends events_1.EventEmitter {
342
+ executor;
343
+ constructor(executor) {
344
+ super();
345
+ this.executor = executor;
346
+ }
347
+ /**
348
+ * Execute a TaskDAG with parallel scheduling.
349
+ */
350
+ async run(dag, options = {}) {
351
+ const { concurrency = 5, taskTimeout = 30_000, totalTimeout = 300_000, continueOnFailure = false, sessionId, metadata, } = options;
352
+ const start = Date.now();
353
+ const deadline = start + totalTimeout;
354
+ const results = new Map();
355
+ const nodeMap = new Map();
356
+ for (const node of dag.nodes) {
357
+ nodeMap.set(node.id, node);
358
+ }
359
+ this.emit('dag:created', dag);
360
+ // Compute layers for parallel execution
361
+ const planned = dag.nodes.map((n) => ({
362
+ id: n.id,
363
+ description: n.description,
364
+ agent: n.agent,
365
+ action: n.action,
366
+ params: n.params,
367
+ dependencies: n.dependencies,
368
+ priority: n.priority,
369
+ }));
370
+ const layers = topologicalLayers(planned);
371
+ let aborted = false;
372
+ for (const layer of layers) {
373
+ if (aborted)
374
+ break;
375
+ // Check total timeout
376
+ if (Date.now() >= deadline) {
377
+ for (const taskId of layer) {
378
+ const node = nodeMap.get(taskId);
379
+ node.status = 'skipped';
380
+ node.error = 'Total timeout exceeded';
381
+ this.emit('task:skip', node, 'Total timeout exceeded');
382
+ }
383
+ aborted = true;
384
+ break;
385
+ }
386
+ // Sort by priority within the layer (higher first)
387
+ const sorted = [...layer].sort((a, b) => {
388
+ const na = nodeMap.get(a);
389
+ const nb = nodeMap.get(b);
390
+ return nb.priority - na.priority;
391
+ });
392
+ // Execute in batches respecting concurrency
393
+ for (let i = 0; i < sorted.length; i += concurrency) {
394
+ if (aborted)
395
+ break;
396
+ const batch = sorted.slice(i, i + concurrency);
397
+ const batchPromises = batch.map(async (taskId) => {
398
+ const node = nodeMap.get(taskId);
399
+ // Skip if a dependency failed and we're not continuing on failure
400
+ if (!continueOnFailure) {
401
+ for (const depId of node.dependencies) {
402
+ const dep = nodeMap.get(depId);
403
+ if (dep && dep.status === 'failed') {
404
+ node.status = 'skipped';
405
+ node.error = `Dependency "${depId}" failed`;
406
+ this.emit('task:skip', node, node.error);
407
+ return;
408
+ }
409
+ }
410
+ }
411
+ node.status = 'running';
412
+ node.startedAt = Date.now();
413
+ this.emit('task:start', node);
414
+ // Build payload with dependency results injected
415
+ const depResults = {};
416
+ for (const depId of node.dependencies) {
417
+ const depResult = results.get(depId);
418
+ if (depResult)
419
+ depResults[depId] = depResult.data;
420
+ }
421
+ const payload = {
422
+ action: node.action,
423
+ params: { ...node.params, _dependencyResults: depResults },
424
+ };
425
+ const context = {
426
+ agentId: node.agent,
427
+ taskId: node.id,
428
+ sessionId,
429
+ metadata: { ...metadata, goal: dag.goal, layer: layers.indexOf(layer) },
430
+ };
431
+ try {
432
+ const result = await withTimeout(this.executor(node.agent, payload, context), taskTimeout, `Task "${taskId}" timed out after ${taskTimeout}ms`);
433
+ results.set(taskId, result);
434
+ if (result.success) {
435
+ node.status = 'completed';
436
+ node.result = result;
437
+ node.completedAt = Date.now();
438
+ this.emit('task:complete', node, result);
439
+ }
440
+ else {
441
+ node.status = 'failed';
442
+ node.error = result.error?.message ?? 'Agent returned failure';
443
+ node.result = result;
444
+ node.completedAt = Date.now();
445
+ this.emit('task:fail', node, node.error);
446
+ if (!continueOnFailure)
447
+ aborted = true;
448
+ }
449
+ }
450
+ catch (err) {
451
+ const errMsg = err.message ?? String(err);
452
+ node.status = 'failed';
453
+ node.error = errMsg;
454
+ node.completedAt = Date.now();
455
+ this.emit('task:fail', node, errMsg);
456
+ results.set(taskId, {
457
+ success: false,
458
+ error: { code: 'EXECUTION_ERROR', message: errMsg, recoverable: false },
459
+ });
460
+ if (!continueOnFailure)
461
+ aborted = true;
462
+ }
463
+ });
464
+ await Promise.all(batchPromises);
465
+ }
466
+ }
467
+ // Skip remaining unexecuted nodes
468
+ for (const node of dag.nodes) {
469
+ if (node.status === 'pending') {
470
+ node.status = 'skipped';
471
+ node.error = aborted ? 'Aborted due to prior failure' : 'Not reached';
472
+ this.emit('task:skip', node, node.error);
473
+ }
474
+ }
475
+ const stats = {
476
+ total: dag.nodes.length,
477
+ completed: dag.nodes.filter((n) => n.status === 'completed').length,
478
+ failed: dag.nodes.filter((n) => n.status === 'failed').length,
479
+ skipped: dag.nodes.filter((n) => n.status === 'skipped').length,
480
+ };
481
+ const success = stats.failed === 0 && stats.skipped === 0;
482
+ const durationMs = Date.now() - start;
483
+ const summary = `Goal: "${dag.goal}" — ${stats.completed}/${stats.total} tasks completed${stats.failed ? `, ${stats.failed} failed` : ''}${stats.skipped ? `, ${stats.skipped} skipped` : ''} in ${durationMs}ms`;
484
+ const teamResult = { success, dag, results, summary, durationMs, stats };
485
+ this.emit('run:complete', teamResult);
486
+ return teamResult;
487
+ }
488
+ }
489
+ exports.TeamRunner = TeamRunner;
490
+ // ============================================================================
491
+ // runTeam() — THE ONE-LINER
492
+ // ============================================================================
493
+ /**
494
+ * Decompose a goal into tasks and execute them with a team of agents.
495
+ *
496
+ * This is the main entry point — one line to go from goal to results:
497
+ *
498
+ * ```typescript
499
+ * const result = await runTeam(
500
+ * "Build a REST API for user management",
501
+ * [
502
+ * { id: "architect", role: "System design and API specification" },
503
+ * { id: "coder", role: "Write TypeScript code" },
504
+ * { id: "reviewer", role: "Code review and quality checks" },
505
+ * ],
506
+ * { planner, executor }
507
+ * );
508
+ * ```
509
+ *
510
+ * @param goal - Natural language description of what to achieve
511
+ * @param agents - Team of agents available for task execution
512
+ * @param config - Planner (LLM decomposition) and executor (agent invocation) functions
513
+ * @param options - Optional concurrency, timeout, and failure handling settings
514
+ * @returns Full result with DAG, individual results, and stats
515
+ */
516
+ async function runTeam(goal, agents, config, options = {}) {
517
+ const decomposer = new GoalDecomposer(config.planner);
518
+ const runner = new TeamRunner(config.executor);
519
+ const dag = await decomposer.decompose(goal, agents, options.metadata, options.plannerRetries ?? 1);
520
+ // Optional approval gate
521
+ if (options.approvalCallback) {
522
+ const approved = await options.approvalCallback(dag);
523
+ if (!approved) {
524
+ // Mark all tasks as skipped
525
+ for (const node of dag.nodes) {
526
+ node.status = 'skipped';
527
+ node.error = 'Execution not approved';
528
+ }
529
+ return {
530
+ success: false,
531
+ dag,
532
+ results: new Map(),
533
+ summary: `Goal: "${goal}" — execution not approved`,
534
+ durationMs: 0,
535
+ stats: { total: dag.nodes.length, completed: 0, failed: 0, skipped: dag.nodes.length },
536
+ };
537
+ }
538
+ }
539
+ return runner.run(dag, options);
540
+ }
541
+ // ============================================================================
542
+ // HELPERS
543
+ // ============================================================================
544
+ /** Promise wrapper that rejects after a timeout */
545
+ function withTimeout(promise, ms, message) {
546
+ if (ms <= 0 || ms === Infinity)
547
+ return promise;
548
+ return new Promise((resolve, reject) => {
549
+ const timer = setTimeout(() => reject(new Error(message)), ms);
550
+ promise.then((val) => { clearTimeout(timer); resolve(val); }, (err) => { clearTimeout(timer); reject(err); });
551
+ });
552
+ }
553
+ //# sourceMappingURL=goal-decomposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-decomposer.js","sourceRoot":"","sources":["../../lib/goal-decomposer.ts"],"names":[],"mappings":"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"}
package/dist/security.js CHANGED
@@ -143,7 +143,7 @@ class InputSanitizer {
143
143
  // Dangerous patterns that could indicate injection attempts
144
144
  static DANGEROUS_PATTERNS = [
145
145
  /\$\{.*\}/g, // Template injection
146
- /<script[\s\S]*?>[\s\S]*?<\/script>/gi, // XSS
146
+ /<script\b[^>]*>[\s\S]*?<\/script>/gi, // XSS (non-backtracking open-tag)
147
147
  /javascript:/gi, // JavaScript protocol
148
148
  /on\w+\s*=/gi, // Event handlers
149
149
  /\.\.\//g, // Path traversal