mcp-agent-foundry 1.3.1 → 2.1.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 (144) hide show
  1. package/README.md +265 -2
  2. package/dist/background/index.d.ts +33 -0
  3. package/dist/background/index.d.ts.map +1 -0
  4. package/dist/background/index.js +33 -0
  5. package/dist/background/index.js.map +1 -0
  6. package/dist/background/task-runner.d.ts +177 -0
  7. package/dist/background/task-runner.d.ts.map +1 -0
  8. package/dist/background/task-runner.js +551 -0
  9. package/dist/background/task-runner.js.map +1 -0
  10. package/dist/background/types.d.ts +135 -0
  11. package/dist/background/types.d.ts.map +1 -0
  12. package/dist/background/types.js +8 -0
  13. package/dist/background/types.js.map +1 -0
  14. package/dist/config/validator.d.ts +2 -2
  15. package/dist/config/validator.d.ts.map +1 -1
  16. package/dist/config/validator.js +2 -2
  17. package/dist/config/validator.js.map +1 -1
  18. package/dist/failover/health-tracker.d.ts +81 -1
  19. package/dist/failover/health-tracker.d.ts.map +1 -1
  20. package/dist/failover/health-tracker.js +229 -1
  21. package/dist/failover/health-tracker.js.map +1 -1
  22. package/dist/failover/orchestrator.d.ts.map +1 -1
  23. package/dist/failover/orchestrator.js +12 -2
  24. package/dist/failover/orchestrator.js.map +1 -1
  25. package/dist/hooks/hook-executor.d.ts +77 -0
  26. package/dist/hooks/hook-executor.d.ts.map +1 -0
  27. package/dist/hooks/hook-executor.js +308 -0
  28. package/dist/hooks/hook-executor.js.map +1 -0
  29. package/dist/hooks/hook-manager.d.ts +140 -0
  30. package/dist/hooks/hook-manager.d.ts.map +1 -0
  31. package/dist/hooks/hook-manager.js +520 -0
  32. package/dist/hooks/hook-manager.js.map +1 -0
  33. package/dist/hooks/index.d.ts +10 -0
  34. package/dist/hooks/index.d.ts.map +1 -0
  35. package/dist/hooks/index.js +10 -0
  36. package/dist/hooks/index.js.map +1 -0
  37. package/dist/hooks/types.d.ts +221 -0
  38. package/dist/hooks/types.d.ts.map +1 -0
  39. package/dist/hooks/types.js +31 -0
  40. package/dist/hooks/types.js.map +1 -0
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +1 -1
  43. package/dist/mcp/auto-mode.d.ts +221 -0
  44. package/dist/mcp/auto-mode.d.ts.map +1 -0
  45. package/dist/mcp/auto-mode.js +436 -0
  46. package/dist/mcp/auto-mode.js.map +1 -0
  47. package/dist/mcp/index.d.ts +14 -0
  48. package/dist/mcp/index.d.ts.map +1 -0
  49. package/dist/mcp/index.js +22 -0
  50. package/dist/mcp/index.js.map +1 -0
  51. package/dist/mcp/tools/critique-plan.d.ts.map +1 -1
  52. package/dist/mcp/tools/critique-plan.js +57 -4
  53. package/dist/mcp/tools/critique-plan.js.map +1 -1
  54. package/dist/mcp/tools/design-feedback.d.ts.map +1 -1
  55. package/dist/mcp/tools/design-feedback.js +58 -4
  56. package/dist/mcp/tools/design-feedback.js.map +1 -1
  57. package/dist/mcp/tools/invoke-agent.d.ts.map +1 -1
  58. package/dist/mcp/tools/invoke-agent.js +64 -1
  59. package/dist/mcp/tools/invoke-agent.js.map +1 -1
  60. package/dist/mcp/tools/review-code.d.ts.map +1 -1
  61. package/dist/mcp/tools/review-code.js +57 -4
  62. package/dist/mcp/tools/review-code.js.map +1 -1
  63. package/dist/mcp/tools/tasks/delete-task.d.ts +25 -0
  64. package/dist/mcp/tools/tasks/delete-task.d.ts.map +1 -0
  65. package/dist/mcp/tools/tasks/delete-task.js +148 -0
  66. package/dist/mcp/tools/tasks/delete-task.js.map +1 -0
  67. package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -1
  68. package/dist/mcp/tools/tasks/execute-task.js +74 -5
  69. package/dist/mcp/tools/tasks/execute-task.js.map +1 -1
  70. package/dist/mcp/tools/tasks/index.d.ts +2 -0
  71. package/dist/mcp/tools/tasks/index.d.ts.map +1 -1
  72. package/dist/mcp/tools/tasks/index.js +6 -0
  73. package/dist/mcp/tools/tasks/index.js.map +1 -1
  74. package/dist/observability/debug-logger.d.ts +209 -0
  75. package/dist/observability/debug-logger.d.ts.map +1 -0
  76. package/dist/observability/debug-logger.js +430 -0
  77. package/dist/observability/debug-logger.js.map +1 -0
  78. package/dist/observability/index.d.ts +12 -0
  79. package/dist/observability/index.d.ts.map +1 -0
  80. package/dist/observability/index.js +12 -0
  81. package/dist/observability/index.js.map +1 -0
  82. package/dist/observability/logger.d.ts +180 -0
  83. package/dist/observability/logger.d.ts.map +1 -1
  84. package/dist/observability/logger.js +158 -0
  85. package/dist/observability/logger.js.map +1 -1
  86. package/dist/providers/anthropic.d.ts +40 -6
  87. package/dist/providers/anthropic.d.ts.map +1 -1
  88. package/dist/providers/anthropic.js +120 -8
  89. package/dist/providers/anthropic.js.map +1 -1
  90. package/dist/providers/base.d.ts +6 -3
  91. package/dist/providers/base.d.ts.map +1 -1
  92. package/dist/providers/base.js.map +1 -1
  93. package/dist/router/context-manager.d.ts +214 -1
  94. package/dist/router/context-manager.d.ts.map +1 -1
  95. package/dist/router/context-manager.js +759 -2
  96. package/dist/router/context-manager.js.map +1 -1
  97. package/dist/router/context-types.d.ts +182 -0
  98. package/dist/router/context-types.d.ts.map +1 -0
  99. package/dist/router/context-types.js +8 -0
  100. package/dist/router/context-types.js.map +1 -0
  101. package/dist/router/engine.d.ts +3 -3
  102. package/dist/router/engine.d.ts.map +1 -1
  103. package/dist/router/engine.js +32 -4
  104. package/dist/router/engine.js.map +1 -1
  105. package/dist/router/pattern-executor.d.ts.map +1 -1
  106. package/dist/router/pattern-executor.js +38 -7
  107. package/dist/router/pattern-executor.js.map +1 -1
  108. package/dist/server.d.ts +41 -0
  109. package/dist/server.d.ts.map +1 -1
  110. package/dist/server.js +165 -0
  111. package/dist/server.js.map +1 -1
  112. package/dist/skills/hot-reloader.d.ts +104 -0
  113. package/dist/skills/hot-reloader.d.ts.map +1 -0
  114. package/dist/skills/hot-reloader.js +314 -0
  115. package/dist/skills/hot-reloader.js.map +1 -0
  116. package/dist/skills/index.d.ts +14 -0
  117. package/dist/skills/index.d.ts.map +1 -0
  118. package/dist/skills/index.js +16 -0
  119. package/dist/skills/index.js.map +1 -0
  120. package/dist/skills/skill-executor.d.ts +96 -0
  121. package/dist/skills/skill-executor.d.ts.map +1 -0
  122. package/dist/skills/skill-executor.js +289 -0
  123. package/dist/skills/skill-executor.js.map +1 -0
  124. package/dist/skills/skill-loader.d.ts +147 -0
  125. package/dist/skills/skill-loader.d.ts.map +1 -0
  126. package/dist/skills/skill-loader.js +579 -0
  127. package/dist/skills/skill-loader.js.map +1 -0
  128. package/dist/skills/types.d.ts +198 -0
  129. package/dist/skills/types.d.ts.map +1 -0
  130. package/dist/skills/types.js +21 -0
  131. package/dist/skills/types.js.map +1 -0
  132. package/dist/tasks/coordinator.d.ts +22 -1
  133. package/dist/tasks/coordinator.d.ts.map +1 -1
  134. package/dist/tasks/coordinator.js +83 -0
  135. package/dist/tasks/coordinator.js.map +1 -1
  136. package/dist/tasks/state-coordinator.d.ts +19 -0
  137. package/dist/tasks/state-coordinator.d.ts.map +1 -1
  138. package/dist/tasks/state-coordinator.js +40 -0
  139. package/dist/tasks/state-coordinator.js.map +1 -1
  140. package/dist/types.d.ts +39 -7
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/types.js +9 -0
  143. package/dist/types.js.map +1 -1
  144. package/package.json +1 -1
@@ -0,0 +1,551 @@
1
+ /**
2
+ * Background Task Runner
3
+ *
4
+ * Manages background task execution for non-blocking agent invocations
5
+ * and pipeline steps. Supports concurrency limits, cancellation,
6
+ * progress tracking, and event-based notifications.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ import { randomUUID } from 'crypto';
10
+ // ============================================================================
11
+ // Constants
12
+ // ============================================================================
13
+ /**
14
+ * Default configuration for the background task runner.
15
+ */
16
+ const DEFAULT_CONFIG = {
17
+ maxConcurrent: 5,
18
+ defaultTimeout: 300000, // 5 minutes
19
+ enableNotifications: true,
20
+ };
21
+ /**
22
+ * Default cleanup age for old tasks (1 hour).
23
+ */
24
+ const DEFAULT_CLEANUP_AGE_MS = 3600000;
25
+ // ============================================================================
26
+ // BackgroundTaskRunner Class
27
+ // ============================================================================
28
+ /**
29
+ * Manages background task execution with concurrency control.
30
+ *
31
+ * Features:
32
+ * - Queue-based execution with configurable concurrency
33
+ * - Task cancellation via AbortController
34
+ * - Progress tracking and notifications
35
+ * - Event emission for task lifecycle
36
+ * - Automatic cleanup of old tasks
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const runner = new BackgroundTaskRunner({ maxConcurrent: 3 }, logger);
41
+ *
42
+ * // Submit a background task
43
+ * const taskId = await runner.run(
44
+ * 'agent_invocation',
45
+ * 'Review authentication code',
46
+ * async () => {
47
+ * return await orchestrator.executeWithFailover('reviewer', messages, options);
48
+ * },
49
+ * { role: 'reviewer', provider: 'openai' }
50
+ * );
51
+ *
52
+ * // Check status later
53
+ * const task = runner.getTask(taskId);
54
+ * if (task?.status === 'completed') {
55
+ * console.log('Result:', task.result);
56
+ * }
57
+ *
58
+ * // Or wait for completion
59
+ * const completed = await runner.waitFor(taskId, 60000);
60
+ * ```
61
+ */
62
+ export class BackgroundTaskRunner extends EventEmitter {
63
+ tasks = new Map();
64
+ queue = [];
65
+ runningCount = 0;
66
+ config;
67
+ logger;
68
+ isEnabled = true;
69
+ isShuttingDown = false;
70
+ constructor(config, logger) {
71
+ super();
72
+ this.config = { ...DEFAULT_CONFIG, ...config };
73
+ this.logger = logger;
74
+ this.logger.debug('BackgroundTaskRunner initialized', {
75
+ maxConcurrent: this.config.maxConcurrent,
76
+ defaultTimeout: this.config.defaultTimeout,
77
+ });
78
+ }
79
+ // ==========================================================================
80
+ // Public API
81
+ // ==========================================================================
82
+ /**
83
+ * Check if background tasks are enabled.
84
+ * Respects AGENT_FOUNDRY_DISABLE_BACKGROUND_TASKS env var.
85
+ */
86
+ isBackgroundEnabled() {
87
+ const envDisabled = process.env['AGENT_FOUNDRY_DISABLE_BACKGROUND_TASKS'];
88
+ if (envDisabled === '1' || envDisabled === 'true') {
89
+ return false;
90
+ }
91
+ return this.isEnabled && !this.isShuttingDown;
92
+ }
93
+ /**
94
+ * Enable or disable background task execution.
95
+ */
96
+ setEnabled(enabled) {
97
+ this.isEnabled = enabled;
98
+ this.logger.info('Background tasks enabled state changed', { enabled });
99
+ }
100
+ /**
101
+ * Submit a task to run in the background.
102
+ * Returns immediately with task ID.
103
+ *
104
+ * @param task - Task definition (without id, status, createdAt)
105
+ * @returns Task ID for tracking
106
+ */
107
+ submit(task) {
108
+ if (!this.isBackgroundEnabled()) {
109
+ throw new Error('Background tasks are disabled');
110
+ }
111
+ const id = randomUUID();
112
+ const backgroundTask = {
113
+ ...task,
114
+ id,
115
+ status: 'pending',
116
+ createdAt: new Date(),
117
+ abortController: new AbortController(),
118
+ };
119
+ this.tasks.set(id, backgroundTask);
120
+ this.queue.push(backgroundTask);
121
+ this.logger.debug('Background task submitted', {
122
+ taskId: id,
123
+ type: backgroundTask.type,
124
+ role: backgroundTask.role,
125
+ });
126
+ this.emit('task:submitted', backgroundTask);
127
+ this.notify({
128
+ taskId: id,
129
+ type: 'started',
130
+ timestamp: new Date(),
131
+ message: `Task queued: ${backgroundTask.prompt.slice(0, 100)}...`,
132
+ });
133
+ // Process queue asynchronously
134
+ setImmediate(() => this.processQueue());
135
+ return id;
136
+ }
137
+ /**
138
+ * Execute a function as a background task.
139
+ *
140
+ * @param type - Task type
141
+ * @param description - Task description
142
+ * @param fn - Async function to execute
143
+ * @param options - Additional options
144
+ * @returns Task ID for tracking
145
+ */
146
+ async run(type, description, fn, options) {
147
+ const taskId = this.submit({
148
+ type,
149
+ prompt: description,
150
+ role: options?.role,
151
+ provider: options?.provider,
152
+ worktreeId: options?.worktreeId,
153
+ parentTaskId: options?.parentTaskId,
154
+ });
155
+ const task = this.tasks.get(taskId);
156
+ if (!task) {
157
+ throw new Error(`Task ${taskId} not found after submit`);
158
+ }
159
+ // Store the execution function
160
+ task._execute = fn;
161
+ // Store timeout if provided
162
+ if (options?.timeout) {
163
+ task._timeout = options.timeout;
164
+ }
165
+ return taskId;
166
+ }
167
+ /**
168
+ * Get task by ID.
169
+ */
170
+ getTask(taskId) {
171
+ return this.tasks.get(taskId);
172
+ }
173
+ /**
174
+ * Get all tasks.
175
+ */
176
+ getAllTasks() {
177
+ return Array.from(this.tasks.values());
178
+ }
179
+ /**
180
+ * Get running tasks.
181
+ */
182
+ getRunningTasks() {
183
+ return Array.from(this.tasks.values()).filter(t => t.status === 'running');
184
+ }
185
+ /**
186
+ * Get pending tasks in queue.
187
+ */
188
+ getPendingTasks() {
189
+ return Array.from(this.tasks.values()).filter(t => t.status === 'pending');
190
+ }
191
+ /**
192
+ * Get completed tasks.
193
+ */
194
+ getCompletedTasks() {
195
+ return Array.from(this.tasks.values()).filter(t => t.status === 'completed' || t.status === 'failed' || t.status === 'cancelled');
196
+ }
197
+ /**
198
+ * Cancel a running or pending task.
199
+ *
200
+ * @param taskId - ID of task to cancel
201
+ * @returns true if task was cancelled, false if not found or already complete
202
+ */
203
+ cancel(taskId) {
204
+ const task = this.tasks.get(taskId);
205
+ if (!task) {
206
+ return false;
207
+ }
208
+ if (task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') {
209
+ return false;
210
+ }
211
+ // Abort if running
212
+ if (task.abortController) {
213
+ task.abortController.abort();
214
+ }
215
+ // Remove from queue if pending
216
+ const queueIndex = this.queue.findIndex(t => t.id === taskId);
217
+ if (queueIndex !== -1) {
218
+ this.queue.splice(queueIndex, 1);
219
+ }
220
+ // Update status
221
+ task.status = 'cancelled';
222
+ task.completedAt = new Date();
223
+ this.logger.info('Background task cancelled', { taskId });
224
+ this.emit('task:cancelled', task);
225
+ this.notify({
226
+ taskId,
227
+ type: 'failed',
228
+ timestamp: new Date(),
229
+ message: 'Task was cancelled',
230
+ error: 'Cancelled by user',
231
+ });
232
+ return true;
233
+ }
234
+ /**
235
+ * Wait for a task to complete.
236
+ *
237
+ * @param taskId - ID of task to wait for
238
+ * @param timeout - Maximum time to wait in ms (default: 60000)
239
+ * @returns The completed task
240
+ * @throws Error if task not found or timeout exceeded
241
+ */
242
+ async waitFor(taskId, timeout = 60000) {
243
+ const task = this.tasks.get(taskId);
244
+ if (!task) {
245
+ throw new Error(`Task ${taskId} not found`);
246
+ }
247
+ // Already complete
248
+ if (task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') {
249
+ return task;
250
+ }
251
+ // Wait for completion
252
+ return new Promise((resolve, reject) => {
253
+ const timeoutId = setTimeout(() => {
254
+ cleanup();
255
+ reject(new Error(`Timeout waiting for task ${taskId}`));
256
+ }, timeout);
257
+ const checkCompletion = (completedTask) => {
258
+ if (completedTask.id === taskId) {
259
+ cleanup();
260
+ resolve(completedTask);
261
+ }
262
+ };
263
+ const checkFailure = (failedTask, error) => {
264
+ if (failedTask.id === taskId) {
265
+ cleanup();
266
+ reject(error);
267
+ }
268
+ };
269
+ const checkCancellation = (cancelledTask) => {
270
+ if (cancelledTask.id === taskId) {
271
+ cleanup();
272
+ reject(new Error('Task was cancelled'));
273
+ }
274
+ };
275
+ const cleanup = () => {
276
+ clearTimeout(timeoutId);
277
+ this.off('task:completed', checkCompletion);
278
+ this.off('task:failed', checkFailure);
279
+ this.off('task:cancelled', checkCancellation);
280
+ };
281
+ this.on('task:completed', checkCompletion);
282
+ this.on('task:failed', checkFailure);
283
+ this.on('task:cancelled', checkCancellation);
284
+ });
285
+ }
286
+ /**
287
+ * Update task progress.
288
+ *
289
+ * @param taskId - ID of task to update
290
+ * @param progress - Progress percentage (0-100)
291
+ * @param message - Optional progress message
292
+ */
293
+ updateProgress(taskId, progress, message) {
294
+ const task = this.tasks.get(taskId);
295
+ if (!task || task.status !== 'running') {
296
+ return;
297
+ }
298
+ task.progress = Math.max(0, Math.min(100, progress));
299
+ if (message) {
300
+ task.progressMessage = message;
301
+ }
302
+ this.emit('task:progress', task, progress, message);
303
+ this.notify({
304
+ taskId,
305
+ type: 'progress',
306
+ timestamp: new Date(),
307
+ message: message || `Progress: ${progress}%`,
308
+ });
309
+ }
310
+ /**
311
+ * Clean up completed/failed tasks older than specified age.
312
+ *
313
+ * @param maxAgeMs - Maximum age in ms (default: 1 hour)
314
+ * @returns Number of tasks cleaned up
315
+ */
316
+ cleanup(maxAgeMs = DEFAULT_CLEANUP_AGE_MS) {
317
+ const cutoff = Date.now() - maxAgeMs;
318
+ let cleaned = 0;
319
+ for (const [taskId, task] of this.tasks) {
320
+ if ((task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') &&
321
+ task.completedAt &&
322
+ task.completedAt.getTime() < cutoff) {
323
+ this.tasks.delete(taskId);
324
+ cleaned++;
325
+ }
326
+ }
327
+ if (cleaned > 0) {
328
+ this.logger.debug('Cleaned up old background tasks', { cleaned, maxAgeMs });
329
+ }
330
+ return cleaned;
331
+ }
332
+ /**
333
+ * Shutdown the runner - cancel pending tasks and wait for running tasks.
334
+ *
335
+ * @param timeout - Maximum time to wait for running tasks in ms (default: 30000)
336
+ */
337
+ async shutdown(timeout = 30000) {
338
+ this.logger.info('Shutting down background task runner');
339
+ this.isShuttingDown = true;
340
+ // Cancel all pending tasks
341
+ const pending = [...this.queue];
342
+ for (const task of pending) {
343
+ this.cancel(task.id);
344
+ }
345
+ // Wait for running tasks to complete
346
+ const running = this.getRunningTasks();
347
+ if (running.length > 0) {
348
+ this.logger.debug('Waiting for running tasks to complete', {
349
+ count: running.length,
350
+ timeout,
351
+ });
352
+ const promises = running.map(task => this.waitFor(task.id, timeout).catch(() => {
353
+ // Cancel if timeout
354
+ this.cancel(task.id);
355
+ }));
356
+ await Promise.allSettled(promises);
357
+ }
358
+ this.logger.info('Background task runner shutdown complete');
359
+ }
360
+ /**
361
+ * Get statistics about the task runner.
362
+ */
363
+ getStats() {
364
+ const tasks = this.getAllTasks();
365
+ return {
366
+ pending: tasks.filter(t => t.status === 'pending').length,
367
+ running: tasks.filter(t => t.status === 'running').length,
368
+ completed: tasks.filter(t => t.status === 'completed').length,
369
+ failed: tasks.filter(t => t.status === 'failed').length,
370
+ cancelled: tasks.filter(t => t.status === 'cancelled').length,
371
+ total: tasks.length,
372
+ queueLength: this.queue.length,
373
+ maxConcurrent: this.config.maxConcurrent,
374
+ };
375
+ }
376
+ /**
377
+ * Serialize tasks for persistence.
378
+ * Only serializes metadata, not results or errors.
379
+ */
380
+ serializeTasks() {
381
+ return Array.from(this.tasks.values()).map(task => ({
382
+ id: task.id,
383
+ type: task.type,
384
+ status: task.status,
385
+ role: task.role,
386
+ provider: task.provider,
387
+ model: task.model,
388
+ prompt: task.prompt,
389
+ createdAt: task.createdAt.getTime(),
390
+ startedAt: task.startedAt?.getTime(),
391
+ completedAt: task.completedAt?.getTime(),
392
+ progress: task.progress,
393
+ progressMessage: task.progressMessage,
394
+ worktreeId: task.worktreeId,
395
+ parentTaskId: task.parentTaskId,
396
+ }));
397
+ }
398
+ // ==========================================================================
399
+ // Private Methods
400
+ // ==========================================================================
401
+ /**
402
+ * Process the task queue, starting tasks up to maxConcurrent.
403
+ */
404
+ processQueue() {
405
+ if (this.isShuttingDown) {
406
+ return;
407
+ }
408
+ while (this.runningCount < this.config.maxConcurrent &&
409
+ this.queue.length > 0) {
410
+ const task = this.queue.shift();
411
+ if (task && task.status === 'pending') {
412
+ this.executeTask(task);
413
+ }
414
+ }
415
+ }
416
+ /**
417
+ * Execute a single task.
418
+ */
419
+ async executeTask(task) {
420
+ this.runningCount++;
421
+ task.status = 'running';
422
+ task.startedAt = new Date();
423
+ this.logger.debug('Starting background task execution', {
424
+ taskId: task.id,
425
+ type: task.type,
426
+ role: task.role,
427
+ });
428
+ this.emit('task:started', task);
429
+ this.notify({
430
+ taskId: task.id,
431
+ type: 'started',
432
+ timestamp: new Date(),
433
+ message: `Task started: ${task.prompt.slice(0, 100)}...`,
434
+ });
435
+ // Get the execution function
436
+ const executeTask = task;
437
+ const executeFunc = executeTask._execute;
438
+ if (!executeFunc) {
439
+ this.markFailed(task.id, new Error('No execution function provided'));
440
+ this.runningCount--;
441
+ this.processQueue();
442
+ return;
443
+ }
444
+ // Get timeout
445
+ const taskWithTimeout = task;
446
+ const timeout = taskWithTimeout._timeout || this.config.defaultTimeout;
447
+ // Set up timeout
448
+ const timeoutId = setTimeout(() => {
449
+ if (task.status === 'running') {
450
+ if (task.abortController) {
451
+ task.abortController.abort();
452
+ }
453
+ this.markFailed(task.id, new Error(`Task timed out after ${timeout}ms`));
454
+ }
455
+ }, timeout);
456
+ try {
457
+ // Execute with abort signal check
458
+ const result = await executeFunc();
459
+ // Check if cancelled during execution
460
+ if (task.abortController?.signal.aborted) {
461
+ // Task was cancelled, don't update status
462
+ clearTimeout(timeoutId);
463
+ this.runningCount--;
464
+ this.processQueue();
465
+ return;
466
+ }
467
+ clearTimeout(timeoutId);
468
+ this.markCompleted(task.id, result);
469
+ }
470
+ catch (error) {
471
+ clearTimeout(timeoutId);
472
+ const err = error instanceof Error ? error : new Error(String(error));
473
+ this.markFailed(task.id, err);
474
+ }
475
+ finally {
476
+ this.runningCount--;
477
+ this.processQueue();
478
+ }
479
+ }
480
+ /**
481
+ * Mark a task as completed.
482
+ */
483
+ markCompleted(taskId, result) {
484
+ const task = this.tasks.get(taskId);
485
+ if (!task || task.status !== 'running') {
486
+ return;
487
+ }
488
+ task.status = 'completed';
489
+ task.completedAt = new Date();
490
+ task.result = result;
491
+ task.progress = 100;
492
+ this.logger.debug('Background task completed', {
493
+ taskId,
494
+ durationMs: task.completedAt.getTime() - (task.startedAt?.getTime() || 0),
495
+ });
496
+ this.emit('task:completed', task);
497
+ this.notify({
498
+ taskId,
499
+ type: 'completed',
500
+ timestamp: new Date(),
501
+ message: `Task completed successfully`,
502
+ result,
503
+ });
504
+ }
505
+ /**
506
+ * Mark a task as failed.
507
+ */
508
+ markFailed(taskId, error) {
509
+ const task = this.tasks.get(taskId);
510
+ if (!task || (task.status !== 'running' && task.status !== 'pending')) {
511
+ return;
512
+ }
513
+ task.status = 'failed';
514
+ task.completedAt = new Date();
515
+ task.error = error;
516
+ this.logger.error('Background task failed', {
517
+ taskId,
518
+ error,
519
+ durationMs: task.startedAt
520
+ ? task.completedAt.getTime() - task.startedAt.getTime()
521
+ : 0,
522
+ });
523
+ this.emit('task:failed', task, error);
524
+ this.notify({
525
+ taskId,
526
+ type: 'failed',
527
+ timestamp: new Date(),
528
+ message: `Task failed: ${error.message}`,
529
+ error: error.message,
530
+ });
531
+ }
532
+ /**
533
+ * Send a notification if enabled.
534
+ */
535
+ notify(notification) {
536
+ if (!this.config.enableNotifications) {
537
+ return;
538
+ }
539
+ if (this.config.onNotification) {
540
+ try {
541
+ this.config.onNotification(notification);
542
+ }
543
+ catch (error) {
544
+ this.logger.warn('Notification callback error', {
545
+ error: error instanceof Error ? error.message : String(error),
546
+ });
547
+ }
548
+ }
549
+ }
550
+ }
551
+ //# sourceMappingURL=task-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../src/background/task-runner.ts"],"names":[],"mappings":"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"}