network-ai 4.15.2 → 5.0.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.
Files changed (204) hide show
  1. package/INTEGRATION_GUIDE.md +11 -4
  2. package/QUICKSTART.md +31 -4
  3. package/README.md +37 -15
  4. package/bin/dashboard.ts +146 -0
  5. package/bin/mcp-server.ts +3 -2
  6. package/dist/adapters/adapter-registry.d.ts +33 -1
  7. package/dist/adapters/adapter-registry.d.ts.map +1 -1
  8. package/dist/adapters/adapter-registry.js +49 -0
  9. package/dist/adapters/adapter-registry.js.map +1 -1
  10. package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
  11. package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
  12. package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
  13. package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
  14. package/dist/adapters/browser-agent-adapter.d.ts +121 -0
  15. package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
  16. package/dist/adapters/browser-agent-adapter.js +219 -0
  17. package/dist/adapters/browser-agent-adapter.js.map +1 -0
  18. package/dist/adapters/copilot-adapter.d.ts +59 -0
  19. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  20. package/dist/adapters/copilot-adapter.js +132 -0
  21. package/dist/adapters/copilot-adapter.js.map +1 -0
  22. package/dist/adapters/index.d.ts +15 -1
  23. package/dist/adapters/index.d.ts.map +1 -1
  24. package/dist/adapters/index.js +22 -1
  25. package/dist/adapters/index.js.map +1 -1
  26. package/dist/adapters/langgraph-adapter.d.ts +70 -0
  27. package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
  28. package/dist/adapters/langgraph-adapter.js +119 -0
  29. package/dist/adapters/langgraph-adapter.js.map +1 -0
  30. package/dist/adapters/openai-agents-adapter.d.ts +100 -0
  31. package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
  32. package/dist/adapters/openai-agents-adapter.js +118 -0
  33. package/dist/adapters/openai-agents-adapter.js.map +1 -0
  34. package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
  35. package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
  36. package/dist/adapters/pydantic-ai-adapter.js +163 -0
  37. package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
  38. package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
  39. package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
  40. package/dist/adapters/vertex-ai-adapter.js +166 -0
  41. package/dist/adapters/vertex-ai-adapter.js.map +1 -0
  42. package/dist/bin/dashboard.d.ts +11 -0
  43. package/dist/bin/dashboard.d.ts.map +1 -0
  44. package/dist/bin/dashboard.js +135 -0
  45. package/dist/bin/dashboard.js.map +1 -0
  46. package/dist/bin/mcp-server.js +3 -2
  47. package/dist/bin/mcp-server.js.map +1 -1
  48. package/dist/index.d.ts +103 -559
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +295 -1074
  51. package/dist/index.js.map +1 -1
  52. package/dist/lib/adapter-test-harness.d.ts +88 -0
  53. package/dist/lib/adapter-test-harness.d.ts.map +1 -0
  54. package/dist/lib/adapter-test-harness.js +118 -0
  55. package/dist/lib/adapter-test-harness.js.map +1 -0
  56. package/dist/lib/agent-conversation.d.ts +115 -0
  57. package/dist/lib/agent-conversation.d.ts.map +1 -0
  58. package/dist/lib/agent-conversation.js +155 -0
  59. package/dist/lib/agent-conversation.js.map +1 -0
  60. package/dist/lib/agent-debate.d.ts +115 -0
  61. package/dist/lib/agent-debate.d.ts.map +1 -0
  62. package/dist/lib/agent-debate.js +146 -0
  63. package/dist/lib/agent-debate.js.map +1 -0
  64. package/dist/lib/agent-memory.d.ts +157 -0
  65. package/dist/lib/agent-memory.d.ts.map +1 -0
  66. package/dist/lib/agent-memory.js +336 -0
  67. package/dist/lib/agent-memory.js.map +1 -0
  68. package/dist/lib/agent-vcr.d.ts +133 -0
  69. package/dist/lib/agent-vcr.d.ts.map +1 -0
  70. package/dist/lib/agent-vcr.js +218 -0
  71. package/dist/lib/agent-vcr.js.map +1 -0
  72. package/dist/lib/anomaly-detector.d.ts +112 -0
  73. package/dist/lib/anomaly-detector.d.ts.map +1 -0
  74. package/dist/lib/anomaly-detector.js +178 -0
  75. package/dist/lib/anomaly-detector.js.map +1 -0
  76. package/dist/lib/approval-inbox.d.ts +147 -0
  77. package/dist/lib/approval-inbox.d.ts.map +1 -0
  78. package/dist/lib/approval-inbox.js +385 -0
  79. package/dist/lib/approval-inbox.js.map +1 -0
  80. package/dist/lib/auth-guardian.d.ts +170 -0
  81. package/dist/lib/auth-guardian.d.ts.map +1 -0
  82. package/dist/lib/auth-guardian.js +604 -0
  83. package/dist/lib/auth-guardian.js.map +1 -0
  84. package/dist/lib/auth-validator.d.ts +70 -0
  85. package/dist/lib/auth-validator.d.ts.map +1 -0
  86. package/dist/lib/auth-validator.js +32 -0
  87. package/dist/lib/auth-validator.js.map +1 -0
  88. package/dist/lib/blackboard-validator.d.ts +56 -0
  89. package/dist/lib/blackboard-validator.d.ts.map +1 -1
  90. package/dist/lib/blackboard-validator.js +181 -4
  91. package/dist/lib/blackboard-validator.js.map +1 -1
  92. package/dist/lib/comparison-runner.d.ts +99 -0
  93. package/dist/lib/comparison-runner.d.ts.map +1 -0
  94. package/dist/lib/comparison-runner.js +138 -0
  95. package/dist/lib/comparison-runner.js.map +1 -0
  96. package/dist/lib/config-watcher.d.ts +109 -0
  97. package/dist/lib/config-watcher.d.ts.map +1 -0
  98. package/dist/lib/config-watcher.js +215 -0
  99. package/dist/lib/config-watcher.js.map +1 -0
  100. package/dist/lib/cost-governor.d.ts +105 -0
  101. package/dist/lib/cost-governor.d.ts.map +1 -0
  102. package/dist/lib/cost-governor.js +128 -0
  103. package/dist/lib/cost-governor.js.map +1 -0
  104. package/dist/lib/cost-heatmap.d.ts +104 -0
  105. package/dist/lib/cost-heatmap.d.ts.map +1 -0
  106. package/dist/lib/cost-heatmap.js +161 -0
  107. package/dist/lib/cost-heatmap.js.map +1 -0
  108. package/dist/lib/coverage-reporter.d.ts +92 -0
  109. package/dist/lib/coverage-reporter.d.ts.map +1 -0
  110. package/dist/lib/coverage-reporter.js +177 -0
  111. package/dist/lib/coverage-reporter.js.map +1 -0
  112. package/dist/lib/dashboard-server.d.ts +71 -0
  113. package/dist/lib/dashboard-server.d.ts.map +1 -0
  114. package/dist/lib/dashboard-server.js +403 -0
  115. package/dist/lib/dashboard-server.js.map +1 -0
  116. package/dist/lib/dry-run.d.ts +73 -0
  117. package/dist/lib/dry-run.d.ts.map +1 -0
  118. package/dist/lib/dry-run.js +130 -0
  119. package/dist/lib/dry-run.js.map +1 -0
  120. package/dist/lib/errors.d.ts +15 -0
  121. package/dist/lib/errors.d.ts.map +1 -1
  122. package/dist/lib/errors.js +38 -0
  123. package/dist/lib/errors.js.map +1 -1
  124. package/dist/lib/event-bus.d.ts +167 -0
  125. package/dist/lib/event-bus.d.ts.map +1 -0
  126. package/dist/lib/event-bus.js +229 -0
  127. package/dist/lib/event-bus.js.map +1 -0
  128. package/dist/lib/explainability.d.ts +85 -0
  129. package/dist/lib/explainability.d.ts.map +1 -0
  130. package/dist/lib/explainability.js +102 -0
  131. package/dist/lib/explainability.js.map +1 -0
  132. package/dist/lib/goal-dsl.d.ts +157 -0
  133. package/dist/lib/goal-dsl.d.ts.map +1 -0
  134. package/dist/lib/goal-dsl.js +392 -0
  135. package/dist/lib/goal-dsl.js.map +1 -0
  136. package/dist/lib/job-queue.d.ts +183 -0
  137. package/dist/lib/job-queue.d.ts.map +1 -0
  138. package/dist/lib/job-queue.js +310 -0
  139. package/dist/lib/job-queue.js.map +1 -0
  140. package/dist/lib/learning-loop.d.ts +113 -0
  141. package/dist/lib/learning-loop.d.ts.map +1 -0
  142. package/dist/lib/learning-loop.js +181 -0
  143. package/dist/lib/learning-loop.js.map +1 -0
  144. package/dist/lib/lifecycle-hooks.d.ts +116 -0
  145. package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
  146. package/dist/lib/lifecycle-hooks.js +148 -0
  147. package/dist/lib/lifecycle-hooks.js.map +1 -0
  148. package/dist/lib/locked-blackboard.d.ts.map +1 -1
  149. package/dist/lib/locked-blackboard.js +9 -5
  150. package/dist/lib/locked-blackboard.js.map +1 -1
  151. package/dist/lib/mcp-tool-consumer.d.ts +153 -0
  152. package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
  153. package/dist/lib/mcp-tool-consumer.js +320 -0
  154. package/dist/lib/mcp-tool-consumer.js.map +1 -0
  155. package/dist/lib/metrics.d.ts +119 -0
  156. package/dist/lib/metrics.d.ts.map +1 -0
  157. package/dist/lib/metrics.js +284 -0
  158. package/dist/lib/metrics.js.map +1 -0
  159. package/dist/lib/orchestrator-types.d.ts +309 -0
  160. package/dist/lib/orchestrator-types.d.ts.map +1 -0
  161. package/dist/lib/orchestrator-types.js +61 -0
  162. package/dist/lib/orchestrator-types.js.map +1 -0
  163. package/dist/lib/otel-bridge.d.ts +74 -0
  164. package/dist/lib/otel-bridge.d.ts.map +1 -0
  165. package/dist/lib/otel-bridge.js +167 -0
  166. package/dist/lib/otel-bridge.js.map +1 -0
  167. package/dist/lib/playground.d.ts +76 -0
  168. package/dist/lib/playground.d.ts.map +1 -0
  169. package/dist/lib/playground.js +224 -0
  170. package/dist/lib/playground.js.map +1 -0
  171. package/dist/lib/quadtree.d.ts +114 -0
  172. package/dist/lib/quadtree.d.ts.map +1 -0
  173. package/dist/lib/quadtree.js +259 -0
  174. package/dist/lib/quadtree.js.map +1 -0
  175. package/dist/lib/shared-blackboard.d.ts +101 -0
  176. package/dist/lib/shared-blackboard.d.ts.map +1 -0
  177. package/dist/lib/shared-blackboard.js +249 -0
  178. package/dist/lib/shared-blackboard.js.map +1 -0
  179. package/dist/lib/speculative-executor.d.ts +89 -0
  180. package/dist/lib/speculative-executor.d.ts.map +1 -0
  181. package/dist/lib/speculative-executor.js +107 -0
  182. package/dist/lib/speculative-executor.js.map +1 -0
  183. package/dist/lib/swarm-transport.d.ts +150 -0
  184. package/dist/lib/swarm-transport.d.ts.map +1 -0
  185. package/dist/lib/swarm-transport.js +307 -0
  186. package/dist/lib/swarm-transport.js.map +1 -0
  187. package/dist/lib/task-decomposer.d.ts +41 -0
  188. package/dist/lib/task-decomposer.d.ts.map +1 -0
  189. package/dist/lib/task-decomposer.js +272 -0
  190. package/dist/lib/task-decomposer.js.map +1 -0
  191. package/dist/lib/timeline-scrubber.d.ts +84 -0
  192. package/dist/lib/timeline-scrubber.d.ts.map +1 -0
  193. package/dist/lib/timeline-scrubber.js +173 -0
  194. package/dist/lib/timeline-scrubber.js.map +1 -0
  195. package/dist/lib/topology.d.ts +361 -0
  196. package/dist/lib/topology.d.ts.map +1 -0
  197. package/dist/lib/topology.js +591 -0
  198. package/dist/lib/topology.js.map +1 -0
  199. package/dist/security.d.ts +95 -0
  200. package/dist/security.d.ts.map +1 -1
  201. package/dist/security.js +267 -5
  202. package/dist/security.js.map +1 -1
  203. package/package.json +7 -5
  204. package/types/agent-adapter.d.ts +5 -0
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ /**
3
+ * ComparisonRunner — Run the same goal across two adapter configurations side-by-side
4
+ *
5
+ * Executes identical tasks through two different adapter setups and produces
6
+ * a structured comparison of results, timing, cost, and quality.
7
+ *
8
+ * Usage:
9
+ * const runner = new ComparisonRunner();
10
+ * const result = await runner.compare({
11
+ * goal: { action: 'review', params: { code: '...' } },
12
+ * configA: { name: 'GPT-4', adapter: openaiAdapter },
13
+ * configB: { name: 'Claude', adapter: anthropicAdapter },
14
+ * });
15
+ * runner.printReport(result);
16
+ *
17
+ * @module ComparisonRunner
18
+ * @version 1.0.0
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.ComparisonRunner = void 0;
22
+ // ============================================================================
23
+ // RUNNER
24
+ // ============================================================================
25
+ /**
26
+ * ComparisonRunner — Side-by-side adapter comparison.
27
+ */
28
+ class ComparisonRunner {
29
+ /**
30
+ * Run the same goal through two configurations and compare results.
31
+ */
32
+ async compare(input) {
33
+ const runs = input.runs ?? 1;
34
+ const [runsA, runsB] = await Promise.all([
35
+ this.runSide(input.configA, input.goal, runs, input.scorer),
36
+ this.runSide(input.configB, input.goal, runs, input.scorer),
37
+ ]);
38
+ const a = this.aggregateSide(input.configA.name, runsA, input.scorer);
39
+ const b = this.aggregateSide(input.configB.name, runsB, input.scorer);
40
+ const { winner, winReason } = this.determineWinner(a, b);
41
+ return {
42
+ goal: input.goal,
43
+ a,
44
+ b,
45
+ winner,
46
+ winReason,
47
+ comparedAt: Date.now(),
48
+ };
49
+ }
50
+ /**
51
+ * Print a human-readable comparison report.
52
+ */
53
+ printReport(result) {
54
+ const { a, b } = result;
55
+ console.log('═'.repeat(60));
56
+ console.log(' COMPARISON REPORT');
57
+ console.log('═'.repeat(60));
58
+ console.log(` A: ${a.name}`);
59
+ console.log(` B: ${b.name}`);
60
+ console.log('─'.repeat(60));
61
+ const rows = [
62
+ ['Metric', a.name, b.name],
63
+ ['Success Rate', `${pct(a.successRate)}`, `${pct(b.successRate)}`],
64
+ ['Avg Duration', `${a.avgDurationMs.toFixed(0)}ms`, `${b.avgDurationMs.toFixed(0)}ms`],
65
+ ];
66
+ if (a.avgScore !== null) {
67
+ rows.push(['Avg Score', `${a.avgScore.toFixed(1)}`, `${b.avgScore?.toFixed(1) ?? 'N/A'}`]);
68
+ }
69
+ if (a.avgCostUsd !== null) {
70
+ rows.push(['Avg Cost', `$${a.avgCostUsd.toFixed(4)}`, `$${b.avgCostUsd?.toFixed(4) ?? 'N/A'}`]);
71
+ }
72
+ for (const [label, va, vb] of rows) {
73
+ console.log(` ${label.padEnd(20)} ${va.padEnd(18)} ${vb}`);
74
+ }
75
+ console.log('─'.repeat(60));
76
+ console.log(` Winner: ${result.winner === 'TIE' ? 'TIE' : result.winner === 'A' ? a.name : b.name}`);
77
+ console.log(` Reason: ${result.winReason}`);
78
+ console.log('═'.repeat(60));
79
+ }
80
+ // --------------------------------------------------------------------------
81
+ // Internal
82
+ // --------------------------------------------------------------------------
83
+ async runSide(config, goal, runs, _scorer) {
84
+ const results = [];
85
+ for (let i = 0; i < runs; i++) {
86
+ const start = Date.now();
87
+ let output;
88
+ try {
89
+ output = await config.handler(goal);
90
+ }
91
+ catch (err) {
92
+ output = {
93
+ success: false,
94
+ error: err instanceof Error ? err.message : String(err),
95
+ };
96
+ }
97
+ results.push({ output, durationMs: Date.now() - start, runIndex: i });
98
+ }
99
+ return results;
100
+ }
101
+ aggregateSide(name, runs, scorer) {
102
+ const avgDurationMs = runs.reduce((s, r) => s + r.durationMs, 0) / runs.length;
103
+ const successRate = runs.filter((r) => r.output.success).length / runs.length;
104
+ let avgScore = null;
105
+ if (scorer) {
106
+ const scores = runs.map((r) => scorer(r.output));
107
+ avgScore = scores.reduce((s, v) => s + v, 0) / scores.length;
108
+ }
109
+ let avgCostUsd = null;
110
+ const costs = runs.map((r) => r.output.costUsd).filter((c) => c !== undefined);
111
+ if (costs.length > 0) {
112
+ avgCostUsd = costs.reduce((s, c) => s + c, 0) / costs.length;
113
+ }
114
+ return { name, runs, avgDurationMs, avgScore, avgCostUsd, successRate };
115
+ }
116
+ determineWinner(a, b) {
117
+ // Priority: success rate > score > speed > cost
118
+ if (a.successRate !== b.successRate) {
119
+ const w = a.successRate > b.successRate ? 'A' : 'B';
120
+ return { winner: w, winReason: `Higher success rate (${pct(Math.max(a.successRate, b.successRate))})` };
121
+ }
122
+ if (a.avgScore !== null && b.avgScore !== null && Math.abs(a.avgScore - b.avgScore) > 1) {
123
+ const w = a.avgScore > b.avgScore ? 'A' : 'B';
124
+ return { winner: w, winReason: `Higher quality score` };
125
+ }
126
+ const speedDiff = Math.abs(a.avgDurationMs - b.avgDurationMs);
127
+ if (speedDiff > a.avgDurationMs * 0.1) {
128
+ const w = a.avgDurationMs < b.avgDurationMs ? 'A' : 'B';
129
+ return { winner: w, winReason: `Faster execution` };
130
+ }
131
+ return { winner: 'TIE', winReason: 'No significant difference' };
132
+ }
133
+ }
134
+ exports.ComparisonRunner = ComparisonRunner;
135
+ function pct(n) {
136
+ return `${(n * 100).toFixed(0)}%`;
137
+ }
138
+ //# sourceMappingURL=comparison-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison-runner.js","sourceRoot":"","sources":["../../lib/comparison-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * ConfigWatcher — Hot-reload configuration from disk.
3
+ *
4
+ * Uses `fs.watch()` to monitor config files and applies changes to
5
+ * live CONFIG, trust levels, resource profiles, and budget ceilings.
6
+ * Emits events on reload so components can react.
7
+ *
8
+ * @module ConfigWatcher
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ /** Fields that can be hot-reloaded on CONFIG */
12
+ export interface ReloadableConfig {
13
+ maxParallelAgents?: number;
14
+ defaultTimeout?: number;
15
+ enableTracing?: boolean;
16
+ grantTokenTTL?: number;
17
+ maxBlackboardValueSize?: number;
18
+ [key: string]: unknown;
19
+ }
20
+ /** Trust level entry */
21
+ export interface TrustEntry {
22
+ agentId: string;
23
+ level: number;
24
+ tags?: string[];
25
+ }
26
+ /** Budget overrides */
27
+ export interface BudgetOverrides {
28
+ ceiling?: number;
29
+ perAgentCeiling?: number;
30
+ }
31
+ /** Callback targets for reloaded config */
32
+ export interface ConfigTargets {
33
+ /** Mutable CONFIG object to patch in-place */
34
+ config?: Record<string, unknown>;
35
+ /** AuthGuardian instance — for trust level updates */
36
+ authGuardian?: {
37
+ setTrustLevel?(agentId: string, level: number): void;
38
+ };
39
+ /** FederatedBudget instance — for ceiling updates */
40
+ budget?: {
41
+ setCeiling?(ceiling: number): void;
42
+ };
43
+ }
44
+ /** Emitted on successful reload */
45
+ export interface ReloadEvent {
46
+ file: string;
47
+ timestamp: number;
48
+ changes: string[];
49
+ }
50
+ /** Emitted on reload error */
51
+ export interface ReloadError {
52
+ file: string;
53
+ timestamp: number;
54
+ error: string;
55
+ }
56
+ /**
57
+ * Watches config files on disk and applies changes to live objects.
58
+ *
59
+ * Supports three config file types:
60
+ * - **config.json** — patches `CONFIG` object fields
61
+ * - **trust_levels.json** — array of `{ agentId, level }` applied to AuthGuardian
62
+ * - **budget.json** — `{ ceiling, perAgentCeiling }` applied to FederatedBudget
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const watcher = new ConfigWatcher({
67
+ * configPath: './data/config.json',
68
+ * trustPath: './data/trust_levels.json',
69
+ * targets: { config: CONFIG, authGuardian: guardian, budget: fed },
70
+ * });
71
+ * watcher.on('reload', (evt) => console.log('Reloaded:', evt.file));
72
+ * watcher.start();
73
+ * // ... later
74
+ * watcher.stop();
75
+ * ```
76
+ */
77
+ export declare class ConfigWatcher extends EventEmitter {
78
+ private watchers;
79
+ private targets;
80
+ private configPath?;
81
+ private trustPath?;
82
+ private budgetPath?;
83
+ private debounceMs;
84
+ private debounceTimers;
85
+ private running;
86
+ constructor(options?: {
87
+ configPath?: string;
88
+ trustPath?: string;
89
+ budgetPath?: string;
90
+ targets?: ConfigTargets;
91
+ debounceMs?: number;
92
+ });
93
+ /** Update targets after construction */
94
+ setTargets(targets: ConfigTargets): void;
95
+ /** Start watching all configured paths */
96
+ start(): void;
97
+ /** Stop all watchers */
98
+ stop(): void;
99
+ /** Manually trigger a reload for a specific file */
100
+ reload(filePath: string): void;
101
+ /** Whether the watcher is currently active */
102
+ isRunning(): boolean;
103
+ private debouncedReload;
104
+ private applyReload;
105
+ private applyConfig;
106
+ private applyTrust;
107
+ private applyBudget;
108
+ }
109
+ //# sourceMappingURL=config-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-watcher.d.ts","sourceRoot":"","sources":["../../lib/config-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAwB;AACxB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,uBAAuB;AACvB,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,sDAAsD;IACtD,YAAY,CAAC,EAAE;QAAE,aAAa,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACxE,qDAAqD;IACrD,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACjD;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAyD;IAC/E,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,aAAa,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;KAChB;IASN,wCAAwC;IACxC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIxC,0CAA0C;IAC1C,KAAK,IAAI,IAAI;IAkBb,wBAAwB;IACxB,IAAI,IAAI,IAAI;IAUZ,oDAAoD;IACpD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI9B,8CAA8C;IAC9C,SAAS,IAAI,OAAO;IAQpB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,WAAW;CAQpB"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * ConfigWatcher — Hot-reload configuration from disk.
4
+ *
5
+ * Uses `fs.watch()` to monitor config files and applies changes to
6
+ * live CONFIG, trust levels, resource profiles, and budget ceilings.
7
+ * Emits events on reload so components can react.
8
+ *
9
+ * @module ConfigWatcher
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ConfigWatcher = void 0;
46
+ const events_1 = require("events");
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ // ============================================================================
50
+ // CONFIG WATCHER
51
+ // ============================================================================
52
+ /**
53
+ * Watches config files on disk and applies changes to live objects.
54
+ *
55
+ * Supports three config file types:
56
+ * - **config.json** — patches `CONFIG` object fields
57
+ * - **trust_levels.json** — array of `{ agentId, level }` applied to AuthGuardian
58
+ * - **budget.json** — `{ ceiling, perAgentCeiling }` applied to FederatedBudget
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const watcher = new ConfigWatcher({
63
+ * configPath: './data/config.json',
64
+ * trustPath: './data/trust_levels.json',
65
+ * targets: { config: CONFIG, authGuardian: guardian, budget: fed },
66
+ * });
67
+ * watcher.on('reload', (evt) => console.log('Reloaded:', evt.file));
68
+ * watcher.start();
69
+ * // ... later
70
+ * watcher.stop();
71
+ * ```
72
+ */
73
+ class ConfigWatcher extends events_1.EventEmitter {
74
+ watchers = [];
75
+ targets;
76
+ configPath;
77
+ trustPath;
78
+ budgetPath;
79
+ debounceMs;
80
+ debounceTimers = new Map();
81
+ running = false;
82
+ constructor(options = {}) {
83
+ super();
84
+ this.configPath = options.configPath;
85
+ this.trustPath = options.trustPath;
86
+ this.budgetPath = options.budgetPath;
87
+ this.targets = options.targets ?? {};
88
+ this.debounceMs = options.debounceMs ?? 300;
89
+ }
90
+ /** Update targets after construction */
91
+ setTargets(targets) {
92
+ Object.assign(this.targets, targets);
93
+ }
94
+ /** Start watching all configured paths */
95
+ start() {
96
+ if (this.running)
97
+ return;
98
+ this.running = true;
99
+ const paths = [this.configPath, this.trustPath, this.budgetPath].filter(Boolean);
100
+ for (const filePath of paths) {
101
+ try {
102
+ if (!fs.existsSync(filePath))
103
+ continue;
104
+ const watcher = fs.watch(filePath, { persistent: false }, (_event) => {
105
+ this.debouncedReload(filePath);
106
+ });
107
+ this.watchers.push(watcher);
108
+ }
109
+ catch {
110
+ // File doesn't exist or not watchable — skip silently
111
+ }
112
+ }
113
+ }
114
+ /** Stop all watchers */
115
+ stop() {
116
+ this.running = false;
117
+ for (const w of this.watchers) {
118
+ try {
119
+ w.close();
120
+ }
121
+ catch { /* ignore */ }
122
+ }
123
+ this.watchers = [];
124
+ for (const timer of this.debounceTimers.values())
125
+ clearTimeout(timer);
126
+ this.debounceTimers.clear();
127
+ }
128
+ /** Manually trigger a reload for a specific file */
129
+ reload(filePath) {
130
+ this.applyReload(filePath);
131
+ }
132
+ /** Whether the watcher is currently active */
133
+ isRunning() {
134
+ return this.running;
135
+ }
136
+ // --------------------------------------------------------------------------
137
+ // INTERNAL
138
+ // --------------------------------------------------------------------------
139
+ debouncedReload(filePath) {
140
+ const existing = this.debounceTimers.get(filePath);
141
+ if (existing)
142
+ clearTimeout(existing);
143
+ this.debounceTimers.set(filePath, setTimeout(() => {
144
+ this.debounceTimers.delete(filePath);
145
+ this.applyReload(filePath);
146
+ }, this.debounceMs));
147
+ }
148
+ applyReload(filePath) {
149
+ try {
150
+ const resolved = path.resolve(filePath);
151
+ const raw = fs.readFileSync(resolved, 'utf-8');
152
+ const data = JSON.parse(raw);
153
+ const changes = [];
154
+ if (resolved === path.resolve(this.configPath ?? '')) {
155
+ this.applyConfig(data, changes);
156
+ }
157
+ else if (resolved === path.resolve(this.trustPath ?? '')) {
158
+ this.applyTrust(data, changes);
159
+ }
160
+ else if (resolved === path.resolve(this.budgetPath ?? '')) {
161
+ this.applyBudget(data, changes);
162
+ }
163
+ const evt = { file: filePath, timestamp: Date.now(), changes };
164
+ this.emit('reload', evt);
165
+ }
166
+ catch (err) {
167
+ const errEvt = {
168
+ file: filePath,
169
+ timestamp: Date.now(),
170
+ error: err instanceof Error ? err.message : String(err),
171
+ };
172
+ this.emit('error', errEvt);
173
+ }
174
+ }
175
+ applyConfig(data, changes) {
176
+ if (!this.targets.config || typeof data !== 'object' || data === null)
177
+ return;
178
+ const obj = data;
179
+ const allowed = new Set([
180
+ 'maxParallelAgents', 'defaultTimeout', 'enableTracing',
181
+ 'grantTokenTTL', 'maxBlackboardValueSize',
182
+ ]);
183
+ for (const [key, value] of Object.entries(obj)) {
184
+ if (allowed.has(key)) {
185
+ this.targets.config[key] = value;
186
+ changes.push(`config.${key}=${JSON.stringify(value)}`);
187
+ }
188
+ }
189
+ }
190
+ applyTrust(data, changes) {
191
+ if (!this.targets.authGuardian?.setTrustLevel || !Array.isArray(data))
192
+ return;
193
+ for (const entry of data) {
194
+ if (typeof entry === 'object' && entry !== null &&
195
+ 'agentId' in entry && 'level' in entry &&
196
+ typeof entry.agentId === 'string' &&
197
+ typeof entry.level === 'number') {
198
+ const { agentId, level } = entry;
199
+ this.targets.authGuardian.setTrustLevel(agentId, level);
200
+ changes.push(`trust.${agentId}=${level}`);
201
+ }
202
+ }
203
+ }
204
+ applyBudget(data, changes) {
205
+ if (!this.targets.budget?.setCeiling || typeof data !== 'object' || data === null)
206
+ return;
207
+ const obj = data;
208
+ if (typeof obj.ceiling === 'number') {
209
+ this.targets.budget.setCeiling(obj.ceiling);
210
+ changes.push(`budget.ceiling=${obj.ceiling}`);
211
+ }
212
+ }
213
+ }
214
+ exports.ConfigWatcher = ConfigWatcher;
215
+ //# sourceMappingURL=config-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-watcher.js","sourceRoot":"","sources":["../../lib/config-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * CostGovernor — Pre-flight budget prediction for task DAGs.
3
+ *
4
+ * Walks a TaskDAG, estimates per-node token spend using a pluggable cost
5
+ * model, and checks the total against FederatedBudget before execution.
6
+ *
7
+ * @module CostGovernor
8
+ */
9
+ /** Per-node cost estimate */
10
+ export interface NodeCostEstimate {
11
+ taskId: string;
12
+ agent: string;
13
+ action: string;
14
+ estimatedTokens: number;
15
+ confidence: number;
16
+ }
17
+ /** Full DAG cost prediction */
18
+ export interface DAGCostPrediction {
19
+ /** Total estimated tokens across all nodes */
20
+ totalTokens: number;
21
+ /** Per-node breakdown */
22
+ nodes: NodeCostEstimate[];
23
+ /** Whether the prediction fits within the budget */
24
+ withinBudget: boolean;
25
+ /** Budget remaining after predicted spend */
26
+ budgetRemaining: number;
27
+ /** Current budget ceiling */
28
+ budgetCeiling: number;
29
+ /** Per-agent totals */
30
+ perAgent: Record<string, number>;
31
+ /** Agents that would exceed their per-agent ceiling */
32
+ overBudgetAgents: string[];
33
+ /** Average confidence across estimates */
34
+ averageConfidence: number;
35
+ }
36
+ /** Cost model: maps (agent, action, params) → estimated tokens */
37
+ export interface CostModel {
38
+ estimate(agent: string, action: string, params: Record<string, unknown>): {
39
+ tokens: number;
40
+ confidence: number;
41
+ };
42
+ }
43
+ /** Minimal DAG shape — avoids importing from goal-decomposer */
44
+ export interface CostDAGNode {
45
+ id: string;
46
+ agent: string;
47
+ action: string;
48
+ params: Record<string, unknown>;
49
+ }
50
+ /** Minimal budget interface */
51
+ export interface CostBudget {
52
+ remaining(): number;
53
+ getCeiling(): number;
54
+ getAgentSpent(agentId: string): number;
55
+ getPerAgentCeiling(): number | undefined;
56
+ }
57
+ /**
58
+ * Lookup-based cost model. Register per-agent or per-action token estimates.
59
+ * Falls back to a configurable default.
60
+ */
61
+ export declare class LookupCostModel implements CostModel {
62
+ private agentDefaults;
63
+ private actionOverrides;
64
+ private defaultTokens;
65
+ constructor(defaultTokens?: number);
66
+ /** Set default token estimate for an agent */
67
+ setAgentDefault(agent: string, tokens: number): void;
68
+ /** Set token estimate for a specific agent:action pair */
69
+ setActionEstimate(agent: string, action: string, tokens: number): void;
70
+ estimate(agent: string, action: string, _params: Record<string, unknown>): {
71
+ tokens: number;
72
+ confidence: number;
73
+ };
74
+ }
75
+ /**
76
+ * Pre-flight budget check for task DAGs.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const governor = new CostGovernor(budget, new LookupCostModel(1000));
81
+ * const prediction = governor.predict(dag.nodes);
82
+ * if (!prediction.withinBudget) {
83
+ * console.log('DAG would exceed budget by', -prediction.budgetRemaining, 'tokens');
84
+ * }
85
+ *
86
+ * // As approval callback:
87
+ * const options = { approvalCallback: (dag) => governor.approve(dag.nodes) };
88
+ * ```
89
+ */
90
+ export declare class CostGovernor {
91
+ private budget;
92
+ private model;
93
+ constructor(budget: CostBudget, model?: CostModel);
94
+ /** Replace the cost model */
95
+ setCostModel(model: CostModel): void;
96
+ /**
97
+ * Predict the total cost of a DAG and check against budget.
98
+ */
99
+ predict(nodes: CostDAGNode[]): DAGCostPrediction;
100
+ /**
101
+ * Approval callback for TeamRunner — returns true if DAG fits budget.
102
+ */
103
+ approve(nodes: CostDAGNode[]): Promise<boolean>;
104
+ }
105
+ //# sourceMappingURL=cost-governor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-governor.d.ts","sourceRoot":"","sources":["../../lib/cost-governor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,oDAAoD;IACpD,YAAY,EAAE,OAAO,CAAC;IACtB,6CAA6C;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAClH;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,SAAS,IAAI,MAAM,CAAC;IACpB,UAAU,IAAI,MAAM,CAAC;IACrB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC1C;AAMD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,SAAM;IAI/B,8CAA8C;IAC9C,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpD,0DAA0D;IAC1D,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAItE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAUlH;AAMD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAY;gBAEb,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,SAAS;IAKjD,6BAA6B;IAC7B,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIpC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB;IAgDhD;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAGtD"}