mcp-codex-worker 0.1.22 → 0.1.24
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/dist/src/app.d.ts +1 -0
- package/dist/src/app.js +27 -5
- package/dist/src/app.js.map +1 -1
- package/dist/src/execution/codex-adapter.js +27 -4
- package/dist/src/execution/codex-adapter.js.map +1 -1
- package/dist/src/index.js +21 -10
- package/dist/src/index.js.map +1 -1
- package/dist/src/services/subscription-manager.d.ts +8 -0
- package/dist/src/services/subscription-manager.js +28 -0
- package/dist/src/services/subscription-manager.js.map +1 -0
- package/dist/src/services/task-file-writer.d.ts +11 -0
- package/dist/src/services/task-file-writer.js +36 -0
- package/dist/src/services/task-file-writer.js.map +1 -0
- package/dist/src/task/task-manager.d.ts +15 -0
- package/dist/src/task/task-manager.js +51 -1
- package/dist/src/task/task-manager.js.map +1 -1
- package/package.json +1 -1
- package/src/app.ts +27 -5
- package/src/execution/codex-adapter.ts +29 -4
- package/src/index.ts +25 -9
- package/src/services/subscription-manager.ts +31 -0
- package/src/services/task-file-writer.ts +44 -0
- package/src/task/task-manager.ts +57 -0
package/dist/src/app.d.ts
CHANGED
package/dist/src/app.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
1
3
|
import { createToolDefinitions, } from './mcp/tool-definitions.js';
|
|
2
4
|
import { OPERATION_BRIDGE_TIMEOUT_MS, OPERATION_POLL_INTERVAL_MS } from './config/defaults.js';
|
|
3
5
|
import { CodexRuntime } from './services/codex-runtime.js';
|
|
4
6
|
import { TaskManager } from './task/task-manager.js';
|
|
5
7
|
import { TaskStatus, isTerminalStatus } from './task/task-state.js';
|
|
8
|
+
import { TaskFileWriter } from './services/task-file-writer.js';
|
|
6
9
|
import { ProviderRegistry } from './execution/provider-registry.js';
|
|
7
10
|
import { CodexAdapter } from './execution/codex-adapter.js';
|
|
8
11
|
import { mapToWireState } from './task/wire-state-mapper.js';
|
|
@@ -14,9 +17,17 @@ export class CodexWorkerApp {
|
|
|
14
17
|
runtime = new CodexRuntime();
|
|
15
18
|
taskManager;
|
|
16
19
|
registry;
|
|
20
|
+
evictionInterval;
|
|
17
21
|
async initialize() {
|
|
18
|
-
// Create TaskManager
|
|
19
|
-
|
|
22
|
+
// Create TaskManager with persistence
|
|
23
|
+
const persistenceRoot = join(homedir(), '.mcp-codex-worker', 'tasks');
|
|
24
|
+
const fileWriter = new TaskFileWriter(persistenceRoot);
|
|
25
|
+
this.taskManager = new TaskManager({ persistenceRoot, fileWriter });
|
|
26
|
+
// Start eviction sweep for terminal tasks
|
|
27
|
+
this.evictionInterval = setInterval(() => {
|
|
28
|
+
this.taskManager.evictExpired();
|
|
29
|
+
}, 60_000);
|
|
30
|
+
this.evictionInterval.unref();
|
|
20
31
|
// Create ProviderRegistry and register the Codex adapter
|
|
21
32
|
this.registry = new ProviderRegistry();
|
|
22
33
|
const codexAdapter = new CodexAdapter({});
|
|
@@ -27,6 +38,8 @@ export class CodexWorkerApp {
|
|
|
27
38
|
return this.taskManager;
|
|
28
39
|
}
|
|
29
40
|
async shutdown() {
|
|
41
|
+
if (this.evictionInterval)
|
|
42
|
+
clearInterval(this.evictionInterval);
|
|
30
43
|
await this.runtime.shutdown();
|
|
31
44
|
}
|
|
32
45
|
async listTools() {
|
|
@@ -170,6 +183,8 @@ export class CodexWorkerApp {
|
|
|
170
183
|
createInput.labels = input.labels;
|
|
171
184
|
if (input.depends_on !== undefined)
|
|
172
185
|
createInput.dependsOn = input.depends_on;
|
|
186
|
+
if (input.keep_alive !== undefined)
|
|
187
|
+
createInput.keepAlive = input.keep_alive;
|
|
173
188
|
const task = this.taskManager.createTask(createInput);
|
|
174
189
|
// 2. Get handle
|
|
175
190
|
const handle = this.taskManager.getHandle(task.id);
|
|
@@ -294,8 +309,12 @@ export class CodexWorkerApp {
|
|
|
294
309
|
throw new Error(validation.reason ?? 'Unsupported response type');
|
|
295
310
|
}
|
|
296
311
|
}
|
|
297
|
-
//
|
|
298
|
-
|
|
312
|
+
// Peek at the head of the pending question queue — do NOT dequeue yet.
|
|
313
|
+
// We only remove it after the response is successfully forwarded to
|
|
314
|
+
// Codex, so a transient client crash leaves the question in place for
|
|
315
|
+
// the orchestrator to retry.
|
|
316
|
+
const questions = handle.getPendingQuestions();
|
|
317
|
+
const question = questions[0];
|
|
299
318
|
if (!question) {
|
|
300
319
|
throw new Error(`No pending question for task ${taskId}`);
|
|
301
320
|
}
|
|
@@ -327,8 +346,11 @@ export class CodexWorkerApp {
|
|
|
327
346
|
};
|
|
328
347
|
break;
|
|
329
348
|
}
|
|
330
|
-
// Forward the response to
|
|
349
|
+
// Forward the response to Codex. Only dequeue the question AFTER this
|
|
350
|
+
// succeeds — if it throws (client crash, process exit), the question
|
|
351
|
+
// stays in the queue so the orchestrator can retry.
|
|
331
352
|
await this.runtime.respondToServerRequest(question.requestId, payload);
|
|
353
|
+
handle.dequeuePendingQuestion();
|
|
332
354
|
// If queue is now empty and task was WAITING_ANSWER, resume tracking
|
|
333
355
|
// The adapter's executeSession will continue automatically
|
|
334
356
|
const currentTask = this.taskManager.getTask(taskId);
|
package/dist/src/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,14 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
34
34
|
async executeSession(handle, prompt, _signal, options) {
|
|
35
35
|
const runtime = this.getRuntime();
|
|
36
36
|
let detachPauseFlow;
|
|
37
|
+
let removeExitListener;
|
|
38
|
+
// Clean up listeners only once, regardless of which path triggers it.
|
|
39
|
+
const cleanup = () => {
|
|
40
|
+
detachPauseFlow?.();
|
|
41
|
+
detachPauseFlow = undefined;
|
|
42
|
+
removeExitListener?.();
|
|
43
|
+
removeExitListener = undefined;
|
|
44
|
+
};
|
|
37
45
|
try {
|
|
38
46
|
// 1. Create a new thread
|
|
39
47
|
const { params: threadParams } = await runtime.buildThreadStartParams({
|
|
@@ -54,6 +62,17 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
54
62
|
const client = runtime
|
|
55
63
|
.getCurrentClient();
|
|
56
64
|
detachPauseFlow = attachPauseFlow(client, handle, threadId);
|
|
65
|
+
// 3b. Listen for app-server crashes. If the process exits while the
|
|
66
|
+
// task is paused (WAITING_ANSWER), mark it failed so the
|
|
67
|
+
// orchestrator doesn't wait on a ghost.
|
|
68
|
+
const onExit = () => {
|
|
69
|
+
if (handle.isAlive()) {
|
|
70
|
+
handle.markFailed('Codex app-server process exited unexpectedly');
|
|
71
|
+
}
|
|
72
|
+
cleanup();
|
|
73
|
+
};
|
|
74
|
+
client.on('exit', onExit);
|
|
75
|
+
removeExitListener = () => client.off('exit', onExit);
|
|
57
76
|
// 4. Build turn params and start the turn via bridged request
|
|
58
77
|
const { params: turnParams } = await runtime.buildTurnStartParams({
|
|
59
78
|
threadId,
|
|
@@ -65,12 +84,14 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
65
84
|
// 5. Handle bridge result
|
|
66
85
|
if (bridgeResult.status === 'pending_request') {
|
|
67
86
|
// Pause flow already queued the question on the handle and
|
|
68
|
-
// markInputRequired was called.
|
|
69
|
-
//
|
|
87
|
+
// markInputRequired was called. Keep listeners attached —
|
|
88
|
+
// they will be cleaned up when the task reaches a terminal
|
|
89
|
+
// state via message-task, or when the client exits.
|
|
70
90
|
return;
|
|
71
91
|
}
|
|
72
92
|
if (bridgeResult.status === 'completed') {
|
|
73
93
|
handle.markCompleted();
|
|
94
|
+
cleanup();
|
|
74
95
|
return;
|
|
75
96
|
}
|
|
76
97
|
// status === 'running' — the bridge timed out before completion;
|
|
@@ -83,9 +104,11 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
83
104
|
else {
|
|
84
105
|
handle.markFailed(op.error ?? 'Turn failed');
|
|
85
106
|
}
|
|
107
|
+
cleanup();
|
|
86
108
|
}
|
|
87
|
-
|
|
88
|
-
|
|
109
|
+
catch (err) {
|
|
110
|
+
cleanup();
|
|
111
|
+
throw err;
|
|
89
112
|
}
|
|
90
113
|
}
|
|
91
114
|
async shutdown() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../../src/execution/codex-adapter.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,4EAA4E;AAC5E,uBAAuB;AACvB,8EAA8E;AAK9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAY3D,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,OAAO,YAAa,SAAQ,mBAAmB;IAC1C,EAAE,GAAa,OAAO,CAAC;IACvB,WAAW,GAAG,OAAO,CAAC;IAEd,OAAO,CAAsB;IACtC,OAAO,CAAgB;IAE/B,YAAY,OAA4B;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,eAAe;QACb,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,4EAA4E;IAC5E,yBAAyB;IACzB,4EAA4E;IAElE,KAAK,CAAC,cAAc,CAC5B,MAAkB,EAClB,MAAc,EACd,OAAoB,EACpB,OAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,eAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../../src/execution/codex-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
-
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, SubscribeRequestSchema, UnsubscribeRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
6
6
|
import { CodexWorkerApp } from './app.js';
|
|
7
|
+
import { SubscriptionManager } from './services/subscription-manager.js';
|
|
7
8
|
const require = createRequire(import.meta.url);
|
|
8
9
|
const pkg = require('../package.json');
|
|
9
10
|
const app = new CodexWorkerApp();
|
|
10
11
|
const server = new Server({ name: 'mcp-codex-worker', version: pkg.version }, {
|
|
11
12
|
capabilities: {
|
|
12
13
|
tools: {},
|
|
13
|
-
resources: {},
|
|
14
|
+
resources: { subscribe: true, listChanged: true },
|
|
14
15
|
},
|
|
15
16
|
});
|
|
16
17
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
@@ -45,20 +46,30 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
|
45
46
|
}],
|
|
46
47
|
};
|
|
47
48
|
});
|
|
49
|
+
const subscriptions = new SubscriptionManager();
|
|
50
|
+
server.setRequestHandler(SubscribeRequestSchema, async (request) => {
|
|
51
|
+
subscriptions.subscribe(request.params.uri);
|
|
52
|
+
return {};
|
|
53
|
+
});
|
|
54
|
+
server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {
|
|
55
|
+
subscriptions.unsubscribe(request.params.uri);
|
|
56
|
+
return {};
|
|
57
|
+
});
|
|
48
58
|
async function main() {
|
|
49
59
|
await app.initialize();
|
|
50
60
|
// Wire state-change notifications: when any task status changes,
|
|
51
61
|
// notify MCP clients that the scoreboard and task detail resources are updated.
|
|
52
62
|
const taskManager = app.getTaskManager();
|
|
53
63
|
taskManager.onStatusChange((task) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
// Notify subscribed URIs matching this task
|
|
65
|
+
const uris = subscriptions.getMatchingSubscriptions(task.id);
|
|
66
|
+
for (const uri of uris) {
|
|
67
|
+
server.sendResourceUpdated({ uri }).catch(() => { });
|
|
68
|
+
}
|
|
69
|
+
// Always notify the scoreboard even without explicit subscription
|
|
70
|
+
if (!uris.includes('task:///all')) {
|
|
71
|
+
server.sendResourceUpdated({ uri: 'task:///all' }).catch(() => { });
|
|
72
|
+
}
|
|
62
73
|
});
|
|
63
74
|
const transport = new StdioServerTransport();
|
|
64
75
|
await server.connect(transport);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class SubscriptionManager {
|
|
2
|
+
uris = new Set();
|
|
3
|
+
subscribe(uri) {
|
|
4
|
+
this.uris.add(uri);
|
|
5
|
+
}
|
|
6
|
+
unsubscribe(uri) {
|
|
7
|
+
this.uris.delete(uri);
|
|
8
|
+
}
|
|
9
|
+
isSubscribed(uri) {
|
|
10
|
+
return this.uris.has(uri);
|
|
11
|
+
}
|
|
12
|
+
getSubscribed() {
|
|
13
|
+
return [...this.uris];
|
|
14
|
+
}
|
|
15
|
+
getMatchingSubscriptions(taskId) {
|
|
16
|
+
const matches = [];
|
|
17
|
+
for (const uri of this.uris) {
|
|
18
|
+
if (uri === 'task:///all') {
|
|
19
|
+
matches.push(uri);
|
|
20
|
+
}
|
|
21
|
+
else if (uri.startsWith(`task:///${taskId}`)) {
|
|
22
|
+
matches.push(uri);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return matches;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=subscription-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-manager.js","sourceRoot":"","sources":["../../../src/services/subscription-manager.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAmB;IACb,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,wBAAwB,CAAC,MAAc;QACrC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TaskState } from '../task/task-state.js';
|
|
2
|
+
export declare class TaskFileWriter {
|
|
3
|
+
private readonly root;
|
|
4
|
+
private readonly ensuredDirs;
|
|
5
|
+
constructor(root: string);
|
|
6
|
+
private taskDir;
|
|
7
|
+
private ensureDir;
|
|
8
|
+
writeMeta(task: TaskState): Promise<void>;
|
|
9
|
+
appendSummary(taskId: string, line: string): Promise<void>;
|
|
10
|
+
appendVerbose(taskId: string, line: string): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { appendFile, mkdir, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export class TaskFileWriter {
|
|
4
|
+
root;
|
|
5
|
+
ensuredDirs = new Set();
|
|
6
|
+
constructor(root) {
|
|
7
|
+
this.root = root;
|
|
8
|
+
}
|
|
9
|
+
taskDir(taskId) {
|
|
10
|
+
return join(this.root, taskId);
|
|
11
|
+
}
|
|
12
|
+
async ensureDir(taskId) {
|
|
13
|
+
const dir = this.taskDir(taskId);
|
|
14
|
+
if (!this.ensuredDirs.has(taskId)) {
|
|
15
|
+
await mkdir(dir, { recursive: true });
|
|
16
|
+
this.ensuredDirs.add(taskId);
|
|
17
|
+
}
|
|
18
|
+
return dir;
|
|
19
|
+
}
|
|
20
|
+
async writeMeta(task) {
|
|
21
|
+
const dir = await this.ensureDir(task.id);
|
|
22
|
+
const target = join(dir, 'meta.json');
|
|
23
|
+
const tmp = join(dir, `meta.json.tmp.${process.pid}`);
|
|
24
|
+
await writeFile(tmp, JSON.stringify(task, null, 2), 'utf8');
|
|
25
|
+
await rename(tmp, target);
|
|
26
|
+
}
|
|
27
|
+
async appendSummary(taskId, line) {
|
|
28
|
+
const dir = await this.ensureDir(taskId);
|
|
29
|
+
await appendFile(join(dir, 'summary.log'), line + '\n', 'utf8');
|
|
30
|
+
}
|
|
31
|
+
async appendVerbose(taskId, line) {
|
|
32
|
+
const dir = await this.ensureDir(taskId);
|
|
33
|
+
await appendFile(join(dir, 'verbose.log'), line + '\n', 'utf8');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=task-file-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-file-writer.js","sourceRoot":"","sources":["../../../src/services/task-file-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,OAAO,cAAc;IACR,IAAI,CAAS;IACb,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjD,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,OAAO,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAAc;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAe;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,IAAY;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,IAAY;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { TaskStatus } from './task-state.js';
|
|
2
2
|
import type { TaskState, TaskTypeName, Provider, PendingQuestion } from './task-state.js';
|
|
3
3
|
import type { TaskHandle } from './task-handle.js';
|
|
4
|
+
import { TaskFileWriter } from '../services/task-file-writer.js';
|
|
4
5
|
export interface TaskManagerOptions {
|
|
5
6
|
/**
|
|
6
7
|
* Root directory for persistence files.
|
|
7
8
|
* `undefined` means persistence is disabled (in-memory only).
|
|
8
9
|
*/
|
|
9
10
|
persistenceRoot: string | undefined;
|
|
11
|
+
fileWriter?: TaskFileWriter | undefined;
|
|
10
12
|
}
|
|
11
13
|
export interface CreateTaskInput {
|
|
12
14
|
prompt: string;
|
|
@@ -18,6 +20,7 @@ export interface CreateTaskInput {
|
|
|
18
20
|
timeoutMs?: number;
|
|
19
21
|
dependsOn?: string[];
|
|
20
22
|
labels?: string[];
|
|
23
|
+
keepAlive?: number;
|
|
21
24
|
}
|
|
22
25
|
export type StatusChangeListener = (task: TaskState, previousStatus: TaskStatus) => void;
|
|
23
26
|
export type OutputListener = (taskId: string, line: string) => void;
|
|
@@ -39,7 +42,9 @@ export declare class TaskManager {
|
|
|
39
42
|
private readonly abortListeners;
|
|
40
43
|
private readonly statusListeners;
|
|
41
44
|
private readonly outputListeners;
|
|
45
|
+
private readonly createListeners;
|
|
42
46
|
readonly persistenceRoot: string | undefined;
|
|
47
|
+
readonly fileWriter: TaskFileWriter | undefined;
|
|
43
48
|
constructor(options: TaskManagerOptions);
|
|
44
49
|
/**
|
|
45
50
|
* Create a new task with a human-readable ID, store it, and return
|
|
@@ -91,10 +96,20 @@ export declare class TaskManager {
|
|
|
91
96
|
* Returns an unsubscribe function.
|
|
92
97
|
*/
|
|
93
98
|
onOutput(cb: OutputListener): () => void;
|
|
99
|
+
/**
|
|
100
|
+
* Subscribe to task creation events.
|
|
101
|
+
* Returns an unsubscribe function.
|
|
102
|
+
*/
|
|
103
|
+
onTaskCreate(cb: (task: TaskState) => void): () => void;
|
|
94
104
|
/**
|
|
95
105
|
* Emit a status change event to all listeners.
|
|
96
106
|
* Public so that the TaskHandle implementation can call it directly.
|
|
97
107
|
*/
|
|
98
108
|
emitStatusChange(task: TaskState, previousStatus: TaskStatus): void;
|
|
109
|
+
/**
|
|
110
|
+
* Remove terminal tasks whose keepAlive window has elapsed since completion.
|
|
111
|
+
* Returns the number of tasks evicted.
|
|
112
|
+
*/
|
|
113
|
+
evictExpired(): number;
|
|
99
114
|
private generateId;
|
|
100
115
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { uniqueNamesGenerator, adjectives, animals, } from 'unique-names-generator';
|
|
2
|
-
import { TaskStatus } from './task-state.js';
|
|
2
|
+
import { TaskStatus, isTerminalStatus } from './task-state.js';
|
|
3
3
|
import { TaskStore } from './task-store.js';
|
|
4
4
|
import { createTaskHandle } from './task-handle-impl.js';
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
@@ -28,9 +28,12 @@ export class TaskManager {
|
|
|
28
28
|
abortListeners = new Map();
|
|
29
29
|
statusListeners = new Set();
|
|
30
30
|
outputListeners = new Set();
|
|
31
|
+
createListeners = new Set();
|
|
31
32
|
persistenceRoot;
|
|
33
|
+
fileWriter;
|
|
32
34
|
constructor(options) {
|
|
33
35
|
this.persistenceRoot = options.persistenceRoot;
|
|
36
|
+
this.fileWriter = options.fileWriter;
|
|
34
37
|
}
|
|
35
38
|
// -------------------------------------------------------------------------
|
|
36
39
|
// Task creation
|
|
@@ -64,10 +67,15 @@ export class TaskManager {
|
|
|
64
67
|
task.timeoutMs = input.timeoutMs;
|
|
65
68
|
if (input.dependsOn !== undefined)
|
|
66
69
|
task.dependsOn = input.dependsOn;
|
|
70
|
+
if (input.keepAlive !== undefined)
|
|
71
|
+
task.keepAlive = input.keepAlive;
|
|
67
72
|
this.store.create(task);
|
|
68
73
|
// Pre-create the handle so getHandle never returns undefined for a known task
|
|
69
74
|
const handle = createTaskHandle(this, id);
|
|
70
75
|
this.handles.set(id, handle);
|
|
76
|
+
for (const listener of this.createListeners) {
|
|
77
|
+
listener(task);
|
|
78
|
+
}
|
|
71
79
|
return task;
|
|
72
80
|
}
|
|
73
81
|
// -------------------------------------------------------------------------
|
|
@@ -103,6 +111,9 @@ export class TaskManager {
|
|
|
103
111
|
if (result && result.status !== previousStatus) {
|
|
104
112
|
this.emitStatusChange(result, previousStatus);
|
|
105
113
|
}
|
|
114
|
+
if (this.fileWriter && result) {
|
|
115
|
+
this.fileWriter.writeMeta(result).catch(() => { });
|
|
116
|
+
}
|
|
106
117
|
return result;
|
|
107
118
|
}
|
|
108
119
|
/**
|
|
@@ -122,6 +133,9 @@ export class TaskManager {
|
|
|
122
133
|
for (const listener of this.outputListeners) {
|
|
123
134
|
listener(id, line);
|
|
124
135
|
}
|
|
136
|
+
if (this.fileWriter) {
|
|
137
|
+
this.fileWriter.appendSummary(id, line).catch(() => { });
|
|
138
|
+
}
|
|
125
139
|
}
|
|
126
140
|
/**
|
|
127
141
|
* Record a verbose-only output line.
|
|
@@ -137,6 +151,9 @@ export class TaskManager {
|
|
|
137
151
|
for (const listener of this.outputListeners) {
|
|
138
152
|
listener(id, `[verbose-only] ${line}`);
|
|
139
153
|
}
|
|
154
|
+
if (this.fileWriter) {
|
|
155
|
+
this.fileWriter.appendVerbose(id, line).catch(() => { });
|
|
156
|
+
}
|
|
140
157
|
}
|
|
141
158
|
// -------------------------------------------------------------------------
|
|
142
159
|
// Abort management
|
|
@@ -223,6 +240,14 @@ export class TaskManager {
|
|
|
223
240
|
this.outputListeners.delete(cb);
|
|
224
241
|
};
|
|
225
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Subscribe to task creation events.
|
|
245
|
+
* Returns an unsubscribe function.
|
|
246
|
+
*/
|
|
247
|
+
onTaskCreate(cb) {
|
|
248
|
+
this.createListeners.add(cb);
|
|
249
|
+
return () => { this.createListeners.delete(cb); };
|
|
250
|
+
}
|
|
226
251
|
/**
|
|
227
252
|
* Emit a status change event to all listeners.
|
|
228
253
|
* Public so that the TaskHandle implementation can call it directly.
|
|
@@ -233,6 +258,31 @@ export class TaskManager {
|
|
|
233
258
|
}
|
|
234
259
|
}
|
|
235
260
|
// -------------------------------------------------------------------------
|
|
261
|
+
// Eviction
|
|
262
|
+
// -------------------------------------------------------------------------
|
|
263
|
+
/**
|
|
264
|
+
* Remove terminal tasks whose keepAlive window has elapsed since completion.
|
|
265
|
+
* Returns the number of tasks evicted.
|
|
266
|
+
*/
|
|
267
|
+
evictExpired() {
|
|
268
|
+
const now = Date.now();
|
|
269
|
+
let count = 0;
|
|
270
|
+
for (const task of this.store.getAll()) {
|
|
271
|
+
if (!isTerminalStatus(task.status))
|
|
272
|
+
continue;
|
|
273
|
+
if (!task.completedAt)
|
|
274
|
+
continue;
|
|
275
|
+
const keepAlive = task.keepAlive ?? 300_000;
|
|
276
|
+
const completedMs = new Date(task.completedAt).getTime();
|
|
277
|
+
if (now - completedMs > keepAlive) {
|
|
278
|
+
this.store.delete(task.id);
|
|
279
|
+
this.handles.delete(task.id);
|
|
280
|
+
count += 1;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return count;
|
|
284
|
+
}
|
|
285
|
+
// -------------------------------------------------------------------------
|
|
236
286
|
// Internal helpers
|
|
237
287
|
// -------------------------------------------------------------------------
|
|
238
288
|
generateId() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../../src/task/task-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,OAAO,GACR,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../../src/task/task-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/app.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
|
|
1
4
|
import {
|
|
2
5
|
createToolDefinitions,
|
|
3
6
|
type ToolDefinition,
|
|
@@ -12,6 +15,7 @@ import { CodexRuntime } from './services/codex-runtime.js';
|
|
|
12
15
|
import { TaskManager } from './task/task-manager.js';
|
|
13
16
|
import type { TaskState } from './task/task-state.js';
|
|
14
17
|
import { TaskStatus, isTerminalStatus } from './task/task-state.js';
|
|
18
|
+
import { TaskFileWriter } from './services/task-file-writer.js';
|
|
15
19
|
import { ProviderRegistry } from './execution/provider-registry.js';
|
|
16
20
|
import { CodexAdapter } from './execution/codex-adapter.js';
|
|
17
21
|
import { mapToWireState } from './task/wire-state-mapper.js';
|
|
@@ -38,10 +42,19 @@ export class CodexWorkerApp {
|
|
|
38
42
|
private readonly runtime = new CodexRuntime();
|
|
39
43
|
private taskManager!: TaskManager;
|
|
40
44
|
private registry!: ProviderRegistry;
|
|
45
|
+
private evictionInterval?: ReturnType<typeof setInterval>;
|
|
41
46
|
|
|
42
47
|
async initialize(): Promise<void> {
|
|
43
|
-
// Create TaskManager
|
|
44
|
-
|
|
48
|
+
// Create TaskManager with persistence
|
|
49
|
+
const persistenceRoot = join(homedir(), '.mcp-codex-worker', 'tasks');
|
|
50
|
+
const fileWriter = new TaskFileWriter(persistenceRoot);
|
|
51
|
+
this.taskManager = new TaskManager({ persistenceRoot, fileWriter });
|
|
52
|
+
|
|
53
|
+
// Start eviction sweep for terminal tasks
|
|
54
|
+
this.evictionInterval = setInterval(() => {
|
|
55
|
+
this.taskManager.evictExpired();
|
|
56
|
+
}, 60_000);
|
|
57
|
+
this.evictionInterval.unref();
|
|
45
58
|
|
|
46
59
|
// Create ProviderRegistry and register the Codex adapter
|
|
47
60
|
this.registry = new ProviderRegistry();
|
|
@@ -55,6 +68,7 @@ export class CodexWorkerApp {
|
|
|
55
68
|
}
|
|
56
69
|
|
|
57
70
|
async shutdown(): Promise<void> {
|
|
71
|
+
if (this.evictionInterval) clearInterval(this.evictionInterval);
|
|
58
72
|
await this.runtime.shutdown();
|
|
59
73
|
}
|
|
60
74
|
|
|
@@ -218,6 +232,7 @@ export class CodexWorkerApp {
|
|
|
218
232
|
if (input.timeout_ms !== undefined) createInput.timeoutMs = input.timeout_ms;
|
|
219
233
|
if (input.labels !== undefined) createInput.labels = input.labels;
|
|
220
234
|
if (input.depends_on !== undefined) createInput.dependsOn = input.depends_on;
|
|
235
|
+
if (input.keep_alive !== undefined) createInput.keepAlive = input.keep_alive;
|
|
221
236
|
const task = this.taskManager.createTask(createInput);
|
|
222
237
|
|
|
223
238
|
// 2. Get handle
|
|
@@ -367,8 +382,12 @@ export class CodexWorkerApp {
|
|
|
367
382
|
}
|
|
368
383
|
}
|
|
369
384
|
|
|
370
|
-
//
|
|
371
|
-
|
|
385
|
+
// Peek at the head of the pending question queue — do NOT dequeue yet.
|
|
386
|
+
// We only remove it after the response is successfully forwarded to
|
|
387
|
+
// Codex, so a transient client crash leaves the question in place for
|
|
388
|
+
// the orchestrator to retry.
|
|
389
|
+
const questions = handle.getPendingQuestions();
|
|
390
|
+
const question = questions[0];
|
|
372
391
|
if (!question) {
|
|
373
392
|
throw new Error(`No pending question for task ${taskId}`);
|
|
374
393
|
}
|
|
@@ -402,8 +421,11 @@ export class CodexWorkerApp {
|
|
|
402
421
|
break;
|
|
403
422
|
}
|
|
404
423
|
|
|
405
|
-
// Forward the response to
|
|
424
|
+
// Forward the response to Codex. Only dequeue the question AFTER this
|
|
425
|
+
// succeeds — if it throws (client crash, process exit), the question
|
|
426
|
+
// stays in the queue so the orchestrator can retry.
|
|
406
427
|
await this.runtime.respondToServerRequest(question.requestId, payload);
|
|
428
|
+
handle.dequeuePendingQuestion();
|
|
407
429
|
|
|
408
430
|
// If queue is now empty and task was WAITING_ANSWER, resume tracking
|
|
409
431
|
// The adapter's executeSession will continue automatically
|
|
@@ -67,6 +67,15 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
67
67
|
): Promise<void> {
|
|
68
68
|
const runtime = this.getRuntime();
|
|
69
69
|
let detachPauseFlow: (() => void) | undefined;
|
|
70
|
+
let removeExitListener: (() => void) | undefined;
|
|
71
|
+
|
|
72
|
+
// Clean up listeners only once, regardless of which path triggers it.
|
|
73
|
+
const cleanup = () => {
|
|
74
|
+
detachPauseFlow?.();
|
|
75
|
+
detachPauseFlow = undefined;
|
|
76
|
+
removeExitListener?.();
|
|
77
|
+
removeExitListener = undefined;
|
|
78
|
+
};
|
|
70
79
|
|
|
71
80
|
try {
|
|
72
81
|
// 1. Create a new thread
|
|
@@ -93,6 +102,18 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
93
102
|
.getCurrentClient();
|
|
94
103
|
detachPauseFlow = attachPauseFlow(client, handle, threadId);
|
|
95
104
|
|
|
105
|
+
// 3b. Listen for app-server crashes. If the process exits while the
|
|
106
|
+
// task is paused (WAITING_ANSWER), mark it failed so the
|
|
107
|
+
// orchestrator doesn't wait on a ghost.
|
|
108
|
+
const onExit = () => {
|
|
109
|
+
if (handle.isAlive()) {
|
|
110
|
+
handle.markFailed('Codex app-server process exited unexpectedly');
|
|
111
|
+
}
|
|
112
|
+
cleanup();
|
|
113
|
+
};
|
|
114
|
+
client.on('exit', onExit);
|
|
115
|
+
removeExitListener = () => client.off('exit', onExit);
|
|
116
|
+
|
|
96
117
|
// 4. Build turn params and start the turn via bridged request
|
|
97
118
|
const { params: turnParams } = await runtime.buildTurnStartParams({
|
|
98
119
|
threadId,
|
|
@@ -109,13 +130,15 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
109
130
|
// 5. Handle bridge result
|
|
110
131
|
if (bridgeResult.status === 'pending_request') {
|
|
111
132
|
// Pause flow already queued the question on the handle and
|
|
112
|
-
// markInputRequired was called.
|
|
113
|
-
//
|
|
133
|
+
// markInputRequired was called. Keep listeners attached —
|
|
134
|
+
// they will be cleaned up when the task reaches a terminal
|
|
135
|
+
// state via message-task, or when the client exits.
|
|
114
136
|
return;
|
|
115
137
|
}
|
|
116
138
|
|
|
117
139
|
if (bridgeResult.status === 'completed') {
|
|
118
140
|
handle.markCompleted();
|
|
141
|
+
cleanup();
|
|
119
142
|
return;
|
|
120
143
|
}
|
|
121
144
|
|
|
@@ -133,8 +156,10 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
133
156
|
} else {
|
|
134
157
|
handle.markFailed(op.error ?? 'Turn failed');
|
|
135
158
|
}
|
|
136
|
-
|
|
137
|
-
|
|
159
|
+
cleanup();
|
|
160
|
+
} catch (err) {
|
|
161
|
+
cleanup();
|
|
162
|
+
throw err;
|
|
138
163
|
}
|
|
139
164
|
}
|
|
140
165
|
|
package/src/index.ts
CHANGED
|
@@ -9,9 +9,12 @@ import {
|
|
|
9
9
|
ListResourcesRequestSchema,
|
|
10
10
|
ListToolsRequestSchema,
|
|
11
11
|
ReadResourceRequestSchema,
|
|
12
|
+
SubscribeRequestSchema,
|
|
13
|
+
UnsubscribeRequestSchema,
|
|
12
14
|
} from '@modelcontextprotocol/sdk/types.js';
|
|
13
15
|
|
|
14
16
|
import { CodexWorkerApp } from './app.js';
|
|
17
|
+
import { SubscriptionManager } from './services/subscription-manager.js';
|
|
15
18
|
|
|
16
19
|
const require = createRequire(import.meta.url);
|
|
17
20
|
const pkg = require('../package.json') as { version: string };
|
|
@@ -22,7 +25,7 @@ const server = new Server(
|
|
|
22
25
|
{
|
|
23
26
|
capabilities: {
|
|
24
27
|
tools: {},
|
|
25
|
-
resources: {},
|
|
28
|
+
resources: { subscribe: true, listChanged: true },
|
|
26
29
|
},
|
|
27
30
|
},
|
|
28
31
|
);
|
|
@@ -62,6 +65,18 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
|
62
65
|
};
|
|
63
66
|
});
|
|
64
67
|
|
|
68
|
+
const subscriptions = new SubscriptionManager();
|
|
69
|
+
|
|
70
|
+
server.setRequestHandler(SubscribeRequestSchema, async (request) => {
|
|
71
|
+
subscriptions.subscribe(request.params.uri);
|
|
72
|
+
return {};
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {
|
|
76
|
+
subscriptions.unsubscribe(request.params.uri);
|
|
77
|
+
return {};
|
|
78
|
+
});
|
|
79
|
+
|
|
65
80
|
async function main(): Promise<void> {
|
|
66
81
|
await app.initialize();
|
|
67
82
|
|
|
@@ -69,14 +84,15 @@ async function main(): Promise<void> {
|
|
|
69
84
|
// notify MCP clients that the scoreboard and task detail resources are updated.
|
|
70
85
|
const taskManager = app.getTaskManager();
|
|
71
86
|
taskManager.onStatusChange((task) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
87
|
+
// Notify subscribed URIs matching this task
|
|
88
|
+
const uris = subscriptions.getMatchingSubscriptions(task.id);
|
|
89
|
+
for (const uri of uris) {
|
|
90
|
+
server.sendResourceUpdated({ uri }).catch(() => {});
|
|
91
|
+
}
|
|
92
|
+
// Always notify the scoreboard even without explicit subscription
|
|
93
|
+
if (!uris.includes('task:///all')) {
|
|
94
|
+
server.sendResourceUpdated({ uri: 'task:///all' }).catch(() => {});
|
|
95
|
+
}
|
|
80
96
|
});
|
|
81
97
|
|
|
82
98
|
const transport = new StdioServerTransport();
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class SubscriptionManager {
|
|
2
|
+
private readonly uris = new Set<string>();
|
|
3
|
+
|
|
4
|
+
subscribe(uri: string): void {
|
|
5
|
+
this.uris.add(uri);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
unsubscribe(uri: string): void {
|
|
9
|
+
this.uris.delete(uri);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
isSubscribed(uri: string): boolean {
|
|
13
|
+
return this.uris.has(uri);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getSubscribed(): string[] {
|
|
17
|
+
return [...this.uris];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getMatchingSubscriptions(taskId: string): string[] {
|
|
21
|
+
const matches: string[] = [];
|
|
22
|
+
for (const uri of this.uris) {
|
|
23
|
+
if (uri === 'task:///all') {
|
|
24
|
+
matches.push(uri);
|
|
25
|
+
} else if (uri.startsWith(`task:///${taskId}`)) {
|
|
26
|
+
matches.push(uri);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return matches;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { appendFile, mkdir, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import type { TaskState } from '../task/task-state.js';
|
|
5
|
+
|
|
6
|
+
export class TaskFileWriter {
|
|
7
|
+
private readonly root: string;
|
|
8
|
+
private readonly ensuredDirs = new Set<string>();
|
|
9
|
+
|
|
10
|
+
constructor(root: string) {
|
|
11
|
+
this.root = root;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
private taskDir(taskId: string): string {
|
|
15
|
+
return join(this.root, taskId);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private async ensureDir(taskId: string): Promise<string> {
|
|
19
|
+
const dir = this.taskDir(taskId);
|
|
20
|
+
if (!this.ensuredDirs.has(taskId)) {
|
|
21
|
+
await mkdir(dir, { recursive: true });
|
|
22
|
+
this.ensuredDirs.add(taskId);
|
|
23
|
+
}
|
|
24
|
+
return dir;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async writeMeta(task: TaskState): Promise<void> {
|
|
28
|
+
const dir = await this.ensureDir(task.id);
|
|
29
|
+
const target = join(dir, 'meta.json');
|
|
30
|
+
const tmp = join(dir, `meta.json.tmp.${process.pid}`);
|
|
31
|
+
await writeFile(tmp, JSON.stringify(task, null, 2), 'utf8');
|
|
32
|
+
await rename(tmp, target);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async appendSummary(taskId: string, line: string): Promise<void> {
|
|
36
|
+
const dir = await this.ensureDir(taskId);
|
|
37
|
+
await appendFile(join(dir, 'summary.log'), line + '\n', 'utf8');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async appendVerbose(taskId: string, line: string): Promise<void> {
|
|
41
|
+
const dir = await this.ensureDir(taskId);
|
|
42
|
+
await appendFile(join(dir, 'verbose.log'), line + '\n', 'utf8');
|
|
43
|
+
}
|
|
44
|
+
}
|
package/src/task/task-manager.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { TaskStore } from './task-store.js';
|
|
|
15
15
|
import type { TaskHandle } from './task-handle.js';
|
|
16
16
|
import type { TaskResult, SessionMetrics } from './task-handle.js';
|
|
17
17
|
import { createTaskHandle } from './task-handle-impl.js';
|
|
18
|
+
import { TaskFileWriter } from '../services/task-file-writer.js';
|
|
18
19
|
|
|
19
20
|
// ---------------------------------------------------------------------------
|
|
20
21
|
// Configuration
|
|
@@ -33,6 +34,7 @@ export interface TaskManagerOptions {
|
|
|
33
34
|
* `undefined` means persistence is disabled (in-memory only).
|
|
34
35
|
*/
|
|
35
36
|
persistenceRoot: string | undefined;
|
|
37
|
+
fileWriter?: TaskFileWriter | undefined;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
export interface CreateTaskInput {
|
|
@@ -45,6 +47,7 @@ export interface CreateTaskInput {
|
|
|
45
47
|
timeoutMs?: number;
|
|
46
48
|
dependsOn?: string[];
|
|
47
49
|
labels?: string[];
|
|
50
|
+
keepAlive?: number;
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
// ---------------------------------------------------------------------------
|
|
@@ -81,11 +84,14 @@ export class TaskManager {
|
|
|
81
84
|
|
|
82
85
|
private readonly statusListeners = new Set<StatusChangeListener>();
|
|
83
86
|
private readonly outputListeners = new Set<OutputListener>();
|
|
87
|
+
private readonly createListeners = new Set<(task: TaskState) => void>();
|
|
84
88
|
|
|
85
89
|
readonly persistenceRoot: string | undefined;
|
|
90
|
+
readonly fileWriter: TaskFileWriter | undefined;
|
|
86
91
|
|
|
87
92
|
constructor(options: TaskManagerOptions) {
|
|
88
93
|
this.persistenceRoot = options.persistenceRoot;
|
|
94
|
+
this.fileWriter = options.fileWriter;
|
|
89
95
|
}
|
|
90
96
|
|
|
91
97
|
// -------------------------------------------------------------------------
|
|
@@ -119,6 +125,7 @@ export class TaskManager {
|
|
|
119
125
|
if (input.effort !== undefined) task.effort = input.effort;
|
|
120
126
|
if (input.timeoutMs !== undefined) task.timeoutMs = input.timeoutMs;
|
|
121
127
|
if (input.dependsOn !== undefined) task.dependsOn = input.dependsOn;
|
|
128
|
+
if (input.keepAlive !== undefined) task.keepAlive = input.keepAlive;
|
|
122
129
|
|
|
123
130
|
this.store.create(task);
|
|
124
131
|
|
|
@@ -126,6 +133,10 @@ export class TaskManager {
|
|
|
126
133
|
const handle = createTaskHandle(this, id);
|
|
127
134
|
this.handles.set(id, handle);
|
|
128
135
|
|
|
136
|
+
for (const listener of this.createListeners) {
|
|
137
|
+
listener(task);
|
|
138
|
+
}
|
|
139
|
+
|
|
129
140
|
return task;
|
|
130
141
|
}
|
|
131
142
|
|
|
@@ -170,6 +181,10 @@ export class TaskManager {
|
|
|
170
181
|
this.emitStatusChange(result, previousStatus);
|
|
171
182
|
}
|
|
172
183
|
|
|
184
|
+
if (this.fileWriter && result) {
|
|
185
|
+
this.fileWriter.writeMeta(result).catch(() => {});
|
|
186
|
+
}
|
|
187
|
+
|
|
173
188
|
return result;
|
|
174
189
|
}
|
|
175
190
|
|
|
@@ -191,6 +206,10 @@ export class TaskManager {
|
|
|
191
206
|
for (const listener of this.outputListeners) {
|
|
192
207
|
listener(id, line);
|
|
193
208
|
}
|
|
209
|
+
|
|
210
|
+
if (this.fileWriter) {
|
|
211
|
+
this.fileWriter.appendSummary(id, line).catch(() => {});
|
|
212
|
+
}
|
|
194
213
|
}
|
|
195
214
|
|
|
196
215
|
/**
|
|
@@ -208,6 +227,10 @@ export class TaskManager {
|
|
|
208
227
|
for (const listener of this.outputListeners) {
|
|
209
228
|
listener(id, `[verbose-only] ${line}`);
|
|
210
229
|
}
|
|
230
|
+
|
|
231
|
+
if (this.fileWriter) {
|
|
232
|
+
this.fileWriter.appendVerbose(id, line).catch(() => {});
|
|
233
|
+
}
|
|
211
234
|
}
|
|
212
235
|
|
|
213
236
|
// -------------------------------------------------------------------------
|
|
@@ -304,6 +327,15 @@ export class TaskManager {
|
|
|
304
327
|
};
|
|
305
328
|
}
|
|
306
329
|
|
|
330
|
+
/**
|
|
331
|
+
* Subscribe to task creation events.
|
|
332
|
+
* Returns an unsubscribe function.
|
|
333
|
+
*/
|
|
334
|
+
onTaskCreate(cb: (task: TaskState) => void): () => void {
|
|
335
|
+
this.createListeners.add(cb);
|
|
336
|
+
return () => { this.createListeners.delete(cb); };
|
|
337
|
+
}
|
|
338
|
+
|
|
307
339
|
/**
|
|
308
340
|
* Emit a status change event to all listeners.
|
|
309
341
|
* Public so that the TaskHandle implementation can call it directly.
|
|
@@ -314,6 +346,31 @@ export class TaskManager {
|
|
|
314
346
|
}
|
|
315
347
|
}
|
|
316
348
|
|
|
349
|
+
// -------------------------------------------------------------------------
|
|
350
|
+
// Eviction
|
|
351
|
+
// -------------------------------------------------------------------------
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Remove terminal tasks whose keepAlive window has elapsed since completion.
|
|
355
|
+
* Returns the number of tasks evicted.
|
|
356
|
+
*/
|
|
357
|
+
evictExpired(): number {
|
|
358
|
+
const now = Date.now();
|
|
359
|
+
let count = 0;
|
|
360
|
+
for (const task of this.store.getAll()) {
|
|
361
|
+
if (!isTerminalStatus(task.status)) continue;
|
|
362
|
+
if (!task.completedAt) continue;
|
|
363
|
+
const keepAlive = task.keepAlive ?? 300_000;
|
|
364
|
+
const completedMs = new Date(task.completedAt).getTime();
|
|
365
|
+
if (now - completedMs > keepAlive) {
|
|
366
|
+
this.store.delete(task.id);
|
|
367
|
+
this.handles.delete(task.id);
|
|
368
|
+
count += 1;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return count;
|
|
372
|
+
}
|
|
373
|
+
|
|
317
374
|
// -------------------------------------------------------------------------
|
|
318
375
|
// Internal helpers
|
|
319
376
|
// -------------------------------------------------------------------------
|