network-ai 4.15.3 → 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 +266 -4
  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,310 @@
1
+ "use strict";
2
+ /**
3
+ * Persistent Job Queue — Resumable task orchestration with durable storage
4
+ *
5
+ * Provides a job queue that persists jobs to disk (JSON files) with support
6
+ * for status tracking, retries, priority ordering, and crash recovery.
7
+ * Designed for long-running swarm orchestration tasks that must survive
8
+ * process restarts.
9
+ *
10
+ * Backends:
11
+ * - FileJobStore (built-in) — JSON files in a directory
12
+ * - IJobStore interface — implement for SQLite, Postgres, etc.
13
+ *
14
+ * Features:
15
+ * - Priority-based FIFO queue
16
+ * - Configurable retries with exponential backoff
17
+ * - Job timeout enforcement
18
+ * - Crash recovery: stale "running" jobs are re-queued on startup
19
+ * - Pluggable storage backends
20
+ *
21
+ * Usage:
22
+ * const queue = new JobQueue({ store: new FileJobStore('./data/jobs') });
23
+ * await queue.start();
24
+ * await queue.enqueue({ type: 'delegateTask', payload: { agentId: 'analyzer', ... } });
25
+ *
26
+ * @module JobQueue
27
+ * @version 1.0.0
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.JobQueue = exports.FileJobStore = void 0;
31
+ const events_1 = require("events");
32
+ const promises_1 = require("fs/promises");
33
+ const path_1 = require("path");
34
+ const crypto_1 = require("crypto");
35
+ // ============================================================================
36
+ // FILE JOB STORE
37
+ // ============================================================================
38
+ /**
39
+ * File-system job store — persists jobs as individual JSON files.
40
+ * Simple and dependency-free. Suitable for single-node deployments.
41
+ */
42
+ class FileJobStore {
43
+ dir;
44
+ constructor(dir) {
45
+ this.dir = dir;
46
+ }
47
+ async init() {
48
+ try {
49
+ await (0, promises_1.stat)(this.dir);
50
+ }
51
+ catch {
52
+ await (0, promises_1.mkdir)(this.dir, { recursive: true });
53
+ }
54
+ }
55
+ async save(job) {
56
+ const filePath = (0, path_1.join)(this.dir, `${job.id}.json`);
57
+ await (0, promises_1.writeFile)(filePath, JSON.stringify(job, null, 2), 'utf-8');
58
+ }
59
+ async get(id) {
60
+ try {
61
+ const filePath = (0, path_1.join)(this.dir, `${id}.json`);
62
+ const raw = await (0, promises_1.readFile)(filePath, 'utf-8');
63
+ return JSON.parse(raw);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ async delete(id) {
70
+ try {
71
+ await (0, promises_1.unlink)((0, path_1.join)(this.dir, `${id}.json`));
72
+ }
73
+ catch {
74
+ // Ignore if already deleted
75
+ }
76
+ }
77
+ async listByStatus(status, limit = 100) {
78
+ const files = await (0, promises_1.readdir)(this.dir);
79
+ const jobs = [];
80
+ for (const file of files) {
81
+ if (!file.endsWith('.json'))
82
+ continue;
83
+ try {
84
+ const raw = await (0, promises_1.readFile)((0, path_1.join)(this.dir, file), 'utf-8');
85
+ const job = JSON.parse(raw);
86
+ if (job.status === status)
87
+ jobs.push(job);
88
+ }
89
+ catch {
90
+ // Skip corrupt files
91
+ }
92
+ }
93
+ // Sort by priority ASC, then createdAt ASC
94
+ jobs.sort((a, b) => a.priority - b.priority || a.createdAt - b.createdAt);
95
+ return jobs.slice(0, limit);
96
+ }
97
+ async countByStatus(status) {
98
+ const jobs = await this.listByStatus(status, Infinity);
99
+ return jobs.length;
100
+ }
101
+ async findStale(thresholdMs) {
102
+ const cutoff = Date.now() - thresholdMs;
103
+ const running = await this.listByStatus('running', Infinity);
104
+ return running.filter((j) => j.startedAt !== undefined && j.startedAt < cutoff);
105
+ }
106
+ }
107
+ exports.FileJobStore = FileJobStore;
108
+ // ============================================================================
109
+ // JOB QUEUE
110
+ // ============================================================================
111
+ /**
112
+ * Persistent job queue with priority ordering, retries, and crash recovery.
113
+ *
114
+ * Register handlers for job types, then start the queue. Jobs are
115
+ * persisted to the configured store and survive process restarts.
116
+ */
117
+ class JobQueue extends events_1.EventEmitter {
118
+ handlers = new Map();
119
+ activeJobs = new Map();
120
+ pollTimer = null;
121
+ running = false;
122
+ store;
123
+ pollIntervalMs;
124
+ concurrency;
125
+ retryBaseDelayMs;
126
+ retryMaxDelayMs;
127
+ staleThresholdMs;
128
+ constructor(config) {
129
+ super();
130
+ this.store = config.store;
131
+ this.pollIntervalMs = config.pollIntervalMs ?? 1000;
132
+ this.concurrency = config.concurrency ?? 5;
133
+ this.retryBaseDelayMs = config.retryBaseDelayMs ?? 1000;
134
+ this.retryMaxDelayMs = config.retryMaxDelayMs ?? 60_000;
135
+ this.staleThresholdMs = config.staleThresholdMs ?? 600_000;
136
+ }
137
+ /** Register a handler for a job type */
138
+ handle(type, handler) {
139
+ this.handlers.set(type, handler);
140
+ }
141
+ /** Start the queue: init store, recover stale jobs, begin polling */
142
+ async start() {
143
+ if (this.running)
144
+ return;
145
+ await this.store.init();
146
+ await this.recoverStaleJobs();
147
+ this.running = true;
148
+ this.pollTimer = setInterval(() => {
149
+ this.poll().catch((err) => this.emit('error', err));
150
+ }, this.pollIntervalMs);
151
+ this.emit('started');
152
+ }
153
+ /** Stop the queue (active jobs continue but no new ones are dequeued) */
154
+ async stop() {
155
+ if (!this.running)
156
+ return;
157
+ this.running = false;
158
+ if (this.pollTimer) {
159
+ clearInterval(this.pollTimer);
160
+ this.pollTimer = null;
161
+ }
162
+ // Wait for active jobs to finish
163
+ await Promise.allSettled(this.activeJobs.values());
164
+ this.activeJobs.clear();
165
+ this.emit('stopped');
166
+ }
167
+ /** Enqueue a new job */
168
+ async enqueue(options) {
169
+ const job = {
170
+ id: (0, crypto_1.randomBytes)(8).toString('hex'),
171
+ type: options.type,
172
+ payload: options.payload,
173
+ status: 'pending',
174
+ priority: options.priority ?? 2,
175
+ attempts: 0,
176
+ maxAttempts: options.maxAttempts ?? 3,
177
+ createdAt: Date.now(),
178
+ updatedAt: Date.now(),
179
+ timeoutMs: options.timeoutMs ?? 300_000,
180
+ metadata: options.metadata,
181
+ };
182
+ await this.store.save(job);
183
+ this.emit('enqueued', job);
184
+ return job;
185
+ }
186
+ /** Cancel a pending or running job */
187
+ async cancel(jobId) {
188
+ const job = await this.store.get(jobId);
189
+ if (!job)
190
+ return null;
191
+ if (job.status === 'completed' || job.status === 'cancelled')
192
+ return job;
193
+ job.status = 'cancelled';
194
+ job.updatedAt = Date.now();
195
+ job.completedAt = Date.now();
196
+ await this.store.save(job);
197
+ this.emit('cancelled', job);
198
+ return job;
199
+ }
200
+ /** Get a job by ID */
201
+ async getJob(jobId) {
202
+ return this.store.get(jobId);
203
+ }
204
+ /** Get queue stats */
205
+ async stats() {
206
+ const [pending, running, completed, failed, cancelled] = await Promise.all([
207
+ this.store.countByStatus('pending'),
208
+ this.store.countByStatus('running'),
209
+ this.store.countByStatus('completed'),
210
+ this.store.countByStatus('failed'),
211
+ this.store.countByStatus('cancelled'),
212
+ ]);
213
+ return { pending, running, completed, failed, cancelled, total: pending + running + completed + failed + cancelled };
214
+ }
215
+ /** Whether the queue is running */
216
+ get isRunning() {
217
+ return this.running;
218
+ }
219
+ // -----------------------------------------------------------------------
220
+ // Internal
221
+ // -----------------------------------------------------------------------
222
+ async poll() {
223
+ if (!this.running)
224
+ return;
225
+ const availableSlots = this.concurrency - this.activeJobs.size;
226
+ if (availableSlots <= 0)
227
+ return;
228
+ const jobs = await this.store.listByStatus('pending', availableSlots);
229
+ for (const job of jobs) {
230
+ if (this.activeJobs.has(job.id))
231
+ continue;
232
+ if (job.status !== 'pending')
233
+ continue;
234
+ const handler = this.handlers.get(job.type);
235
+ if (!handler) {
236
+ this.emit('unhandled', job);
237
+ continue;
238
+ }
239
+ const jobPromise = this.processJob(job, handler);
240
+ this.activeJobs.set(job.id, jobPromise);
241
+ jobPromise.finally(() => this.activeJobs.delete(job.id));
242
+ }
243
+ }
244
+ async processJob(job, handler) {
245
+ // Mark as running
246
+ job.status = 'running';
247
+ job.attempts++;
248
+ job.startedAt = Date.now();
249
+ job.updatedAt = Date.now();
250
+ await this.store.save(job);
251
+ this.emit('processing', job);
252
+ try {
253
+ const result = await Promise.race([
254
+ handler(job),
255
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Job timed out after ${job.timeoutMs}ms`)), job.timeoutMs)),
256
+ ]);
257
+ // Success
258
+ job.status = 'completed';
259
+ job.result = result;
260
+ job.completedAt = Date.now();
261
+ job.updatedAt = Date.now();
262
+ await this.store.save(job);
263
+ this.emit('completed', job);
264
+ }
265
+ catch (err) {
266
+ const errorMsg = err instanceof Error ? err.message : String(err);
267
+ if (job.attempts < job.maxAttempts) {
268
+ // Retry with backoff
269
+ const delay = Math.min(this.retryBaseDelayMs * Math.pow(2, job.attempts - 1), this.retryMaxDelayMs);
270
+ job.status = 'pending';
271
+ job.error = errorMsg;
272
+ job.updatedAt = Date.now();
273
+ // Add delay before re-processing by updating createdAt (moves to back of queue)
274
+ job.createdAt = Date.now() + delay;
275
+ await this.store.save(job);
276
+ this.emit('retry', job, delay);
277
+ }
278
+ else {
279
+ // Final failure
280
+ job.status = 'failed';
281
+ job.error = errorMsg;
282
+ job.completedAt = Date.now();
283
+ job.updatedAt = Date.now();
284
+ await this.store.save(job);
285
+ this.emit('failed', job);
286
+ }
287
+ }
288
+ }
289
+ async recoverStaleJobs() {
290
+ const stale = await this.store.findStale(this.staleThresholdMs);
291
+ for (const job of stale) {
292
+ if (job.attempts < job.maxAttempts) {
293
+ job.status = 'pending';
294
+ job.updatedAt = Date.now();
295
+ await this.store.save(job);
296
+ this.emit('recovered', job);
297
+ }
298
+ else {
299
+ job.status = 'failed';
300
+ job.error = 'Stale job exceeded max attempts';
301
+ job.completedAt = Date.now();
302
+ job.updatedAt = Date.now();
303
+ await this.store.save(job);
304
+ this.emit('failed', job);
305
+ }
306
+ }
307
+ }
308
+ }
309
+ exports.JobQueue = JobQueue;
310
+ //# sourceMappingURL=job-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../../lib/job-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * LearningLoop — Store successful DAG patterns and prefer proven ones.
3
+ *
4
+ * After a TeamResult completes, `recordOutcome()` extracts the DAG shape
5
+ * (agent→action edges, dependency structure) and scores it by success rate.
6
+ * Before planning, `suggestPatterns()` returns the top matching patterns
7
+ * so the GoalDecomposer or planner can bias toward proven approaches.
8
+ *
9
+ * @module LearningLoop
10
+ */
11
+ /** Compressed representation of a DAG pattern */
12
+ export interface DAGPattern {
13
+ id: string;
14
+ /** Original goal (or goal hash) that produced this pattern */
15
+ goalSignature: string;
16
+ /** Ordered agent→action pairs that form the pattern */
17
+ steps: PatternStep[];
18
+ /** Dependency edges: stepIndex → upstream stepIndex[] */
19
+ edges: number[][];
20
+ /** Number of times this pattern was used */
21
+ usageCount: number;
22
+ /** Number of successful completions */
23
+ successCount: number;
24
+ /** Number of failures */
25
+ failureCount: number;
26
+ /** Success rate: successCount / usageCount */
27
+ successRate: number;
28
+ /** Average execution duration in ms */
29
+ avgDurationMs: number;
30
+ /** Tags for classification */
31
+ tags: string[];
32
+ /** First recorded timestamp */
33
+ createdAt: number;
34
+ /** Last used timestamp */
35
+ lastUsedAt: number;
36
+ }
37
+ /** A single step in a pattern */
38
+ export interface PatternStep {
39
+ agent: string;
40
+ action: string;
41
+ }
42
+ /** Outcome of a team/DAG execution */
43
+ export interface DAGOutcome {
44
+ goal: string;
45
+ steps: PatternStep[];
46
+ edges: number[][];
47
+ success: boolean;
48
+ durationMs: number;
49
+ tags?: string[];
50
+ }
51
+ /** Match result when searching for proven patterns */
52
+ export interface PatternMatch {
53
+ pattern: DAGPattern;
54
+ /** How well this pattern matches the query (0-1) */
55
+ relevance: number;
56
+ }
57
+ /**
58
+ * Records DAG execution outcomes and recalls proven patterns.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const loop = new LearningLoop();
63
+ *
64
+ * // After execution:
65
+ * loop.recordOutcome({
66
+ * goal: 'Review and fix code',
67
+ * steps: [{ agent: 'reviewer', action: 'review' }, { agent: 'fixer', action: 'fix' }],
68
+ * edges: [[], [0]],
69
+ * success: true,
70
+ * durationMs: 5000,
71
+ * });
72
+ *
73
+ * // Before planning:
74
+ * const proven = loop.suggestPatterns('code review', ['review']);
75
+ * ```
76
+ */
77
+ export declare class LearningLoop {
78
+ private patterns;
79
+ private maxPatterns;
80
+ private minSuccessRate;
81
+ constructor(options?: {
82
+ maxPatterns?: number;
83
+ minSuccessRate?: number;
84
+ });
85
+ /**
86
+ * Record the outcome of a DAG execution.
87
+ * If a matching pattern exists (same signature), updates stats.
88
+ * Otherwise creates a new pattern entry.
89
+ */
90
+ recordOutcome(outcome: DAGOutcome): string;
91
+ /**
92
+ * Suggest proven patterns matching a goal description and tags.
93
+ * Returns patterns sorted by (relevance × successRate).
94
+ */
95
+ suggestPatterns(goalHint: string, tags?: string[], maxResults?: number): PatternMatch[];
96
+ /** Get a specific pattern by ID */
97
+ get(id: string): DAGPattern | undefined;
98
+ /** Get all patterns */
99
+ getAll(): DAGPattern[];
100
+ /** Number of stored patterns */
101
+ size(): number;
102
+ /** Clear all patterns */
103
+ clear(): void;
104
+ /** Export patterns for persistence */
105
+ export(): DAGPattern[];
106
+ /** Import patterns from a persisted array */
107
+ import(patterns: DAGPattern[]): void;
108
+ private computeSignature;
109
+ private findBySignature;
110
+ private tokenize;
111
+ private evict;
112
+ }
113
+ //# sourceMappingURL=learning-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-loop.d.ts","sourceRoot":"","sources":["../../lib/learning-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yDAAyD;IACzD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IAClB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,UAAU,CAAC;IACpB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO;IAK3E;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAwC1C;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,UAAU,SAAI,GAAG,YAAY,EAAE;IAoCtF,mCAAmC;IACnC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,uBAAuB;IACvB,MAAM,IAAI,UAAU,EAAE;IAItB,gCAAgC;IAChC,IAAI,IAAI,MAAM;IAId,yBAAyB;IACzB,KAAK,IAAI,IAAI;IAIb,sCAAsC;IACtC,MAAM,IAAI,UAAU,EAAE;IAItB,6CAA6C;IAC7C,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAWpC,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,KAAK;CASd"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * LearningLoop — Store successful DAG patterns and prefer proven ones.
4
+ *
5
+ * After a TeamResult completes, `recordOutcome()` extracts the DAG shape
6
+ * (agent→action edges, dependency structure) and scores it by success rate.
7
+ * Before planning, `suggestPatterns()` returns the top matching patterns
8
+ * so the GoalDecomposer or planner can bias toward proven approaches.
9
+ *
10
+ * @module LearningLoop
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.LearningLoop = void 0;
14
+ // ============================================================================
15
+ // LEARNING LOOP
16
+ // ============================================================================
17
+ /**
18
+ * Records DAG execution outcomes and recalls proven patterns.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const loop = new LearningLoop();
23
+ *
24
+ * // After execution:
25
+ * loop.recordOutcome({
26
+ * goal: 'Review and fix code',
27
+ * steps: [{ agent: 'reviewer', action: 'review' }, { agent: 'fixer', action: 'fix' }],
28
+ * edges: [[], [0]],
29
+ * success: true,
30
+ * durationMs: 5000,
31
+ * });
32
+ *
33
+ * // Before planning:
34
+ * const proven = loop.suggestPatterns('code review', ['review']);
35
+ * ```
36
+ */
37
+ class LearningLoop {
38
+ patterns = new Map();
39
+ maxPatterns;
40
+ minSuccessRate;
41
+ constructor(options = {}) {
42
+ this.maxPatterns = options.maxPatterns ?? 2000;
43
+ this.minSuccessRate = options.minSuccessRate ?? 0.3;
44
+ }
45
+ /**
46
+ * Record the outcome of a DAG execution.
47
+ * If a matching pattern exists (same signature), updates stats.
48
+ * Otherwise creates a new pattern entry.
49
+ */
50
+ recordOutcome(outcome) {
51
+ const sig = this.computeSignature(outcome.steps, outcome.edges);
52
+ const existing = this.findBySignature(sig);
53
+ if (existing) {
54
+ existing.usageCount++;
55
+ if (outcome.success)
56
+ existing.successCount++;
57
+ else
58
+ existing.failureCount++;
59
+ existing.successRate = existing.successCount / existing.usageCount;
60
+ existing.avgDurationMs = (existing.avgDurationMs * (existing.usageCount - 1) + outcome.durationMs) / existing.usageCount;
61
+ existing.lastUsedAt = Date.now();
62
+ if (outcome.tags) {
63
+ for (const t of outcome.tags) {
64
+ if (!existing.tags.includes(t))
65
+ existing.tags.push(t);
66
+ }
67
+ }
68
+ return existing.id;
69
+ }
70
+ const id = `pat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
71
+ const now = Date.now();
72
+ const pattern = {
73
+ id,
74
+ goalSignature: sig,
75
+ steps: [...outcome.steps],
76
+ edges: outcome.edges.map(e => [...e]),
77
+ usageCount: 1,
78
+ successCount: outcome.success ? 1 : 0,
79
+ failureCount: outcome.success ? 0 : 1,
80
+ successRate: outcome.success ? 1.0 : 0.0,
81
+ avgDurationMs: outcome.durationMs,
82
+ tags: outcome.tags ? [...outcome.tags] : [],
83
+ createdAt: now,
84
+ lastUsedAt: now,
85
+ };
86
+ this.patterns.set(id, pattern);
87
+ this.evict();
88
+ return id;
89
+ }
90
+ /**
91
+ * Suggest proven patterns matching a goal description and tags.
92
+ * Returns patterns sorted by (relevance × successRate).
93
+ */
94
+ suggestPatterns(goalHint, tags = [], maxResults = 5) {
95
+ const hintTokens = this.tokenize(goalHint);
96
+ const matches = [];
97
+ for (const pattern of this.patterns.values()) {
98
+ if (pattern.usageCount < 2)
99
+ continue; // not enough data
100
+ if (pattern.successRate < this.minSuccessRate)
101
+ continue;
102
+ let relevance = 0;
103
+ // Tag overlap scoring
104
+ if (tags.length > 0 && pattern.tags.length > 0) {
105
+ const overlap = tags.filter(t => pattern.tags.includes(t)).length;
106
+ relevance = overlap / Math.max(tags.length, 1);
107
+ }
108
+ // Goal signature token overlap (lightweight text similarity)
109
+ const patternTokens = this.tokenize(pattern.goalSignature);
110
+ if (hintTokens.length > 0 && patternTokens.length > 0) {
111
+ const tokenOverlap = hintTokens.filter(t => patternTokens.includes(t)).length;
112
+ const tokenScore = tokenOverlap / Math.max(hintTokens.length, 1);
113
+ relevance = Math.max(relevance, tokenScore);
114
+ }
115
+ if (relevance > 0) {
116
+ matches.push({
117
+ pattern,
118
+ relevance: relevance * pattern.successRate,
119
+ });
120
+ }
121
+ }
122
+ matches.sort((a, b) => b.relevance - a.relevance);
123
+ return matches.slice(0, maxResults);
124
+ }
125
+ /** Get a specific pattern by ID */
126
+ get(id) {
127
+ return this.patterns.get(id);
128
+ }
129
+ /** Get all patterns */
130
+ getAll() {
131
+ return [...this.patterns.values()];
132
+ }
133
+ /** Number of stored patterns */
134
+ size() {
135
+ return this.patterns.size;
136
+ }
137
+ /** Clear all patterns */
138
+ clear() {
139
+ this.patterns.clear();
140
+ }
141
+ /** Export patterns for persistence */
142
+ export() {
143
+ return [...this.patterns.values()];
144
+ }
145
+ /** Import patterns from a persisted array */
146
+ import(patterns) {
147
+ for (const p of patterns) {
148
+ this.patterns.set(p.id, p);
149
+ }
150
+ this.evict();
151
+ }
152
+ // --------------------------------------------------------------------------
153
+ // INTERNAL
154
+ // --------------------------------------------------------------------------
155
+ computeSignature(steps, edges) {
156
+ const stepParts = steps.map(s => `${s.agent}:${s.action}`).join('|');
157
+ const edgeParts = edges.map((deps, i) => deps.length > 0 ? `${i}<-${deps.join(',')}` : `${i}`).join(';');
158
+ return `${stepParts}#${edgeParts}`;
159
+ }
160
+ findBySignature(sig) {
161
+ for (const p of this.patterns.values()) {
162
+ if (p.goalSignature === sig)
163
+ return p;
164
+ }
165
+ return undefined;
166
+ }
167
+ tokenize(text) {
168
+ return text.toLowerCase().split(/\s+/).filter(t => t.length > 2);
169
+ }
170
+ evict() {
171
+ if (this.patterns.size <= this.maxPatterns)
172
+ return;
173
+ // Remove lowest-scoring patterns
174
+ const sorted = [...this.patterns.entries()].sort((a, b) => (a[1].successRate * a[1].usageCount) - (b[1].successRate * b[1].usageCount));
175
+ const toRemove = sorted.slice(0, this.patterns.size - this.maxPatterns);
176
+ for (const [id] of toRemove)
177
+ this.patterns.delete(id);
178
+ }
179
+ }
180
+ exports.LearningLoop = LearningLoop;
181
+ //# sourceMappingURL=learning-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-loop.js","sourceRoot":"","sources":["../../lib/learning-loop.ts"],"names":[],"mappings":"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"}