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.
- package/README.md +265 -2
- package/dist/background/index.d.ts +33 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +33 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/task-runner.d.ts +177 -0
- package/dist/background/task-runner.d.ts.map +1 -0
- package/dist/background/task-runner.js +551 -0
- package/dist/background/task-runner.js.map +1 -0
- package/dist/background/types.d.ts +135 -0
- package/dist/background/types.d.ts.map +1 -0
- package/dist/background/types.js +8 -0
- package/dist/background/types.js.map +1 -0
- package/dist/config/validator.d.ts +2 -2
- package/dist/config/validator.d.ts.map +1 -1
- package/dist/config/validator.js +2 -2
- package/dist/config/validator.js.map +1 -1
- package/dist/failover/health-tracker.d.ts +81 -1
- package/dist/failover/health-tracker.d.ts.map +1 -1
- package/dist/failover/health-tracker.js +229 -1
- package/dist/failover/health-tracker.js.map +1 -1
- package/dist/failover/orchestrator.d.ts.map +1 -1
- package/dist/failover/orchestrator.js +12 -2
- package/dist/failover/orchestrator.js.map +1 -1
- package/dist/hooks/hook-executor.d.ts +77 -0
- package/dist/hooks/hook-executor.d.ts.map +1 -0
- package/dist/hooks/hook-executor.js +308 -0
- package/dist/hooks/hook-executor.js.map +1 -0
- package/dist/hooks/hook-manager.d.ts +140 -0
- package/dist/hooks/hook-manager.d.ts.map +1 -0
- package/dist/hooks/hook-manager.js +520 -0
- package/dist/hooks/hook-manager.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/types.d.ts +221 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +31 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/auto-mode.d.ts +221 -0
- package/dist/mcp/auto-mode.d.ts.map +1 -0
- package/dist/mcp/auto-mode.js +436 -0
- package/dist/mcp/auto-mode.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +22 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/critique-plan.d.ts.map +1 -1
- package/dist/mcp/tools/critique-plan.js +57 -4
- package/dist/mcp/tools/critique-plan.js.map +1 -1
- package/dist/mcp/tools/design-feedback.d.ts.map +1 -1
- package/dist/mcp/tools/design-feedback.js +58 -4
- package/dist/mcp/tools/design-feedback.js.map +1 -1
- package/dist/mcp/tools/invoke-agent.d.ts.map +1 -1
- package/dist/mcp/tools/invoke-agent.js +64 -1
- package/dist/mcp/tools/invoke-agent.js.map +1 -1
- package/dist/mcp/tools/review-code.d.ts.map +1 -1
- package/dist/mcp/tools/review-code.js +57 -4
- package/dist/mcp/tools/review-code.js.map +1 -1
- package/dist/mcp/tools/tasks/delete-task.d.ts +25 -0
- package/dist/mcp/tools/tasks/delete-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/delete-task.js +148 -0
- package/dist/mcp/tools/tasks/delete-task.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -1
- package/dist/mcp/tools/tasks/execute-task.js +74 -5
- package/dist/mcp/tools/tasks/execute-task.js.map +1 -1
- package/dist/mcp/tools/tasks/index.d.ts +2 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -1
- package/dist/mcp/tools/tasks/index.js +6 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -1
- package/dist/observability/debug-logger.d.ts +209 -0
- package/dist/observability/debug-logger.d.ts.map +1 -0
- package/dist/observability/debug-logger.js +430 -0
- package/dist/observability/debug-logger.js.map +1 -0
- package/dist/observability/index.d.ts +12 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +180 -0
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +158 -0
- package/dist/observability/logger.js.map +1 -1
- package/dist/providers/anthropic.d.ts +40 -6
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +120 -8
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/base.d.ts +6 -3
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/router/context-manager.d.ts +214 -1
- package/dist/router/context-manager.d.ts.map +1 -1
- package/dist/router/context-manager.js +759 -2
- package/dist/router/context-manager.js.map +1 -1
- package/dist/router/context-types.d.ts +182 -0
- package/dist/router/context-types.d.ts.map +1 -0
- package/dist/router/context-types.js +8 -0
- package/dist/router/context-types.js.map +1 -0
- package/dist/router/engine.d.ts +3 -3
- package/dist/router/engine.d.ts.map +1 -1
- package/dist/router/engine.js +32 -4
- package/dist/router/engine.js.map +1 -1
- package/dist/router/pattern-executor.d.ts.map +1 -1
- package/dist/router/pattern-executor.js +38 -7
- package/dist/router/pattern-executor.js.map +1 -1
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +165 -0
- package/dist/server.js.map +1 -1
- package/dist/skills/hot-reloader.d.ts +104 -0
- package/dist/skills/hot-reloader.d.ts.map +1 -0
- package/dist/skills/hot-reloader.js +314 -0
- package/dist/skills/hot-reloader.js.map +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +16 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +96 -0
- package/dist/skills/skill-executor.d.ts.map +1 -0
- package/dist/skills/skill-executor.js +289 -0
- package/dist/skills/skill-executor.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +147 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +579 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/types.d.ts +198 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +21 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +22 -1
- package/dist/tasks/coordinator.d.ts.map +1 -1
- package/dist/tasks/coordinator.js +83 -0
- package/dist/tasks/coordinator.js.map +1 -1
- package/dist/tasks/state-coordinator.d.ts +19 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -1
- package/dist/tasks/state-coordinator.js +40 -0
- package/dist/tasks/state-coordinator.js.map +1 -1
- package/dist/types.d.ts +39 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -1
- 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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"}
|