mcp-codex-subagent 2.0.8 → 2.0.10
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/event/bus.d.ts +53 -0
- package/dist/event/bus.d.ts.map +1 -0
- package/dist/event/bus.js +94 -0
- package/dist/event/bus.js.map +1 -0
- package/dist/event/throttle.d.ts +36 -0
- package/dist/event/throttle.d.ts.map +1 -0
- package/dist/event/throttle.js +66 -0
- package/dist/event/throttle.js.map +1 -0
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/process/event-parser.d.ts +37 -0
- package/dist/process/event-parser.d.ts.map +1 -0
- package/dist/process/event-parser.js +141 -0
- package/dist/process/event-parser.js.map +1 -0
- package/dist/process/runner.d.ts +48 -0
- package/dist/process/runner.d.ts.map +1 -0
- package/dist/process/runner.js +227 -0
- package/dist/process/runner.js.map +1 -0
- package/dist/process/types.d.ts +74 -0
- package/dist/process/types.d.ts.map +1 -0
- package/dist/process/types.js +5 -0
- package/dist/process/types.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +128 -36
- package/dist/server.js.map +1 -1
- package/dist/services/account-rotator.d.ts +28 -0
- package/dist/services/account-rotator.d.ts.map +1 -0
- package/dist/services/account-rotator.js +216 -0
- package/dist/services/account-rotator.js.map +1 -0
- package/dist/services/output-file.d.ts.map +1 -1
- package/dist/services/output-file.js +80 -36
- package/dist/services/output-file.js.map +1 -1
- package/dist/services/task-manager.d.ts +6 -0
- package/dist/services/task-manager.d.ts.map +1 -1
- package/dist/services/task-manager.js +24 -1
- package/dist/services/task-manager.js.map +1 -1
- package/dist/services/template-init.d.ts +10 -0
- package/dist/services/template-init.d.ts.map +1 -0
- package/dist/services/template-init.js +41 -0
- package/dist/services/template-init.js.map +1 -0
- package/dist/session/file-storage.d.ts +27 -0
- package/dist/session/file-storage.d.ts.map +1 -0
- package/dist/session/file-storage.js +281 -0
- package/dist/session/file-storage.js.map +1 -0
- package/dist/session/storage.js +1 -1
- package/dist/session/storage.js.map +1 -1
- package/dist/task/state-machine.d.ts +27 -0
- package/dist/task/state-machine.d.ts.map +1 -0
- package/dist/task/state-machine.js +59 -0
- package/dist/task/state-machine.js.map +1 -0
- package/dist/task/store.d.ts +91 -0
- package/dist/task/store.d.ts.map +1 -0
- package/dist/task/store.js +317 -0
- package/dist/task/store.js.map +1 -0
- package/dist/task/types.d.ts +72 -0
- package/dist/task/types.d.ts.map +1 -0
- package/dist/task/types.js +13 -0
- package/dist/task/types.js.map +1 -0
- package/dist/templates/index.d.ts +16 -0
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +57 -5
- package/dist/templates/index.js.map +1 -1
- package/dist/tools/definitions.d.ts +5 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +253 -179
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/description-builder.d.ts +18 -0
- package/dist/tools/description-builder.d.ts.map +1 -0
- package/dist/tools/description-builder.js +88 -0
- package/dist/tools/description-builder.js.map +1 -0
- package/dist/tools/handlers.d.ts +19 -17
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +287 -341
- package/dist/tools/handlers.js.map +1 -1
- package/dist/types.d.ts +5 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -10
- package/dist/types.js.map +1 -1
- package/dist/utils/ring-buffer.d.ts +41 -0
- package/dist/utils/ring-buffer.d.ts.map +1 -0
- package/dist/utils/ring-buffer.js +83 -0
- package/dist/utils/ring-buffer.js.map +1 -0
- package/dist/wave/dag.d.ts +32 -0
- package/dist/wave/dag.d.ts.map +1 -0
- package/dist/wave/dag.js +186 -0
- package/dist/wave/dag.js.map +1 -0
- package/dist/wave/git.d.ts +57 -0
- package/dist/wave/git.d.ts.map +1 -0
- package/dist/wave/git.js +227 -0
- package/dist/wave/git.js.map +1 -0
- package/dist/wave/orchestrator.d.ts +15 -0
- package/dist/wave/orchestrator.d.ts.map +1 -0
- package/dist/wave/orchestrator.js +565 -0
- package/dist/wave/orchestrator.js.map +1 -0
- package/dist/wave/progress.d.ts +51 -0
- package/dist/wave/progress.d.ts.map +1 -0
- package/dist/wave/progress.js +176 -0
- package/dist/wave/progress.js.map +1 -0
- package/dist/wave/registry.d.ts +66 -0
- package/dist/wave/registry.d.ts.map +1 -0
- package/dist/wave/registry.js +340 -0
- package/dist/wave/registry.js.map +1 -0
- package/dist/wave/semaphore.d.ts +42 -0
- package/dist/wave/semaphore.d.ts.map +1 -0
- package/dist/wave/semaphore.js +119 -0
- package/dist/wave/semaphore.js.map +1 -0
- package/dist/wave/types.d.ts +197 -0
- package/dist/wave/types.d.ts.map +1 -0
- package/dist/wave/types.js +147 -0
- package/dist/wave/types.js.map +1 -0
- package/package.json +15 -15
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskEventBus — lightweight pub/sub for task events.
|
|
3
|
+
*
|
|
4
|
+
* Subscribers receive parsed event objects (not raw JSON strings).
|
|
5
|
+
* Supports per-task subscriptions and wildcard ('*') subscriptions.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: Used to decouple event flow from inline handler code.
|
|
8
|
+
* Phase 2: Wave orchestration subscribes here for progress streams.
|
|
9
|
+
*/
|
|
10
|
+
import type { ParsedProcessEvent } from '../process/types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Event delivered to subscribers.
|
|
13
|
+
*/
|
|
14
|
+
export interface TaskEvent {
|
|
15
|
+
taskId: string;
|
|
16
|
+
event: ParsedProcessEvent;
|
|
17
|
+
}
|
|
18
|
+
export type TaskEventCallback = (taskEvent: TaskEvent) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Unsubscribe function returned by subscribe().
|
|
21
|
+
*/
|
|
22
|
+
export type Unsubscribe = () => void;
|
|
23
|
+
export declare class TaskEventBus {
|
|
24
|
+
/** Per-task subscribers */
|
|
25
|
+
private readonly taskSubs;
|
|
26
|
+
/** Wildcard subscribers (receive all events) */
|
|
27
|
+
private readonly wildcardSubs;
|
|
28
|
+
/**
|
|
29
|
+
* Subscribe to events for a specific task or all tasks ('*').
|
|
30
|
+
* Returns an unsubscribe function.
|
|
31
|
+
*/
|
|
32
|
+
subscribe(taskIdOrWildcard: string, callback: TaskEventCallback): Unsubscribe;
|
|
33
|
+
/**
|
|
34
|
+
* Emit an event for a task.
|
|
35
|
+
* Delivers to per-task subscribers first, then wildcard subscribers.
|
|
36
|
+
*/
|
|
37
|
+
emit(taskId: string, event: ParsedProcessEvent): void;
|
|
38
|
+
/**
|
|
39
|
+
* Remove all subscriptions for a specific task.
|
|
40
|
+
* Called when a task reaches a terminal state.
|
|
41
|
+
*/
|
|
42
|
+
removeTaskSubscriptions(taskId: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Remove all subscriptions (for shutdown/testing).
|
|
45
|
+
*/
|
|
46
|
+
clear(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Get subscriber count (for diagnostics).
|
|
49
|
+
*/
|
|
50
|
+
get subscriberCount(): number;
|
|
51
|
+
}
|
|
52
|
+
export declare const taskEventBus: TaskEventBus;
|
|
53
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/event/bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,YAAY;IACvB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAE7D;;;OAGG;IACH,SAAS,CACP,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,iBAAiB,GAC1B,WAAW;IAuBd;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAyBrD;;;OAGG;IACH,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI7C;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAM5B;CACF;AAID,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskEventBus — lightweight pub/sub for task events.
|
|
3
|
+
*
|
|
4
|
+
* Subscribers receive parsed event objects (not raw JSON strings).
|
|
5
|
+
* Supports per-task subscriptions and wildcard ('*') subscriptions.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: Used to decouple event flow from inline handler code.
|
|
8
|
+
* Phase 2: Wave orchestration subscribes here for progress streams.
|
|
9
|
+
*/
|
|
10
|
+
export class TaskEventBus {
|
|
11
|
+
/** Per-task subscribers */
|
|
12
|
+
taskSubs = new Map();
|
|
13
|
+
/** Wildcard subscribers (receive all events) */
|
|
14
|
+
wildcardSubs = new Set();
|
|
15
|
+
/**
|
|
16
|
+
* Subscribe to events for a specific task or all tasks ('*').
|
|
17
|
+
* Returns an unsubscribe function.
|
|
18
|
+
*/
|
|
19
|
+
subscribe(taskIdOrWildcard, callback) {
|
|
20
|
+
if (taskIdOrWildcard === '*') {
|
|
21
|
+
this.wildcardSubs.add(callback);
|
|
22
|
+
return () => {
|
|
23
|
+
this.wildcardSubs.delete(callback);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
let subs = this.taskSubs.get(taskIdOrWildcard);
|
|
27
|
+
if (!subs) {
|
|
28
|
+
subs = new Set();
|
|
29
|
+
this.taskSubs.set(taskIdOrWildcard, subs);
|
|
30
|
+
}
|
|
31
|
+
subs.add(callback);
|
|
32
|
+
return () => {
|
|
33
|
+
subs.delete(callback);
|
|
34
|
+
if (subs.size === 0) {
|
|
35
|
+
this.taskSubs.delete(taskIdOrWildcard);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Emit an event for a task.
|
|
41
|
+
* Delivers to per-task subscribers first, then wildcard subscribers.
|
|
42
|
+
*/
|
|
43
|
+
emit(taskId, event) {
|
|
44
|
+
const taskEvent = { taskId, event };
|
|
45
|
+
// Per-task subscribers
|
|
46
|
+
const subs = this.taskSubs.get(taskId);
|
|
47
|
+
if (subs) {
|
|
48
|
+
for (const cb of subs) {
|
|
49
|
+
try {
|
|
50
|
+
cb(taskEvent);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Don't let one subscriber break others
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Wildcard subscribers
|
|
58
|
+
for (const cb of this.wildcardSubs) {
|
|
59
|
+
try {
|
|
60
|
+
cb(taskEvent);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Don't let one subscriber break others
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Remove all subscriptions for a specific task.
|
|
69
|
+
* Called when a task reaches a terminal state.
|
|
70
|
+
*/
|
|
71
|
+
removeTaskSubscriptions(taskId) {
|
|
72
|
+
this.taskSubs.delete(taskId);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Remove all subscriptions (for shutdown/testing).
|
|
76
|
+
*/
|
|
77
|
+
clear() {
|
|
78
|
+
this.taskSubs.clear();
|
|
79
|
+
this.wildcardSubs.clear();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get subscriber count (for diagnostics).
|
|
83
|
+
*/
|
|
84
|
+
get subscriberCount() {
|
|
85
|
+
let count = this.wildcardSubs.size;
|
|
86
|
+
for (const subs of this.taskSubs.values()) {
|
|
87
|
+
count += subs.size;
|
|
88
|
+
}
|
|
89
|
+
return count;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// --- Module-level singleton ---
|
|
93
|
+
export const taskEventBus = new TaskEventBus();
|
|
94
|
+
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/event/bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,MAAM,OAAO,YAAY;IACvB,2BAA2B;IACV,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IACtE,gDAAgD;IAC/B,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE7D;;;OAGG;IACH,SAAS,CACP,gBAAwB,EACxB,QAA2B;QAE3B,IAAI,gBAAgB,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEnB,OAAO,GAAG,EAAE;YACV,IAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,IAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,MAAc,EAAE,KAAyB;QAC5C,MAAM,SAAS,GAAc,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAE/C,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,EAAE,CAAC,SAAS,CAAC,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,EAAE,CAAC,SAAS,CAAC,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,MAAc;QACpC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,eAAe;QACjB,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,iCAAiC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification throttle — coalesces MCP resource-update notifications.
|
|
3
|
+
*
|
|
4
|
+
* Under high parallelism, many tasks complete/update simultaneously.
|
|
5
|
+
* Instead of sending one notification per event, we batch them over
|
|
6
|
+
* a configurable window and send at most one per window.
|
|
7
|
+
*/
|
|
8
|
+
export interface ThrottleOptions {
|
|
9
|
+
/** Coalesce window in ms (default: 500) */
|
|
10
|
+
intervalMs?: number;
|
|
11
|
+
/** Callback to send the actual notification */
|
|
12
|
+
send: () => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare class NotificationThrottle {
|
|
15
|
+
private readonly intervalMs;
|
|
16
|
+
private readonly send;
|
|
17
|
+
private timer;
|
|
18
|
+
private pending;
|
|
19
|
+
constructor(options: ThrottleOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Request a notification. If one is already pending in the current
|
|
22
|
+
* window, this is a no-op (coalesced). Otherwise, schedules delivery
|
|
23
|
+
* at the end of the window.
|
|
24
|
+
*/
|
|
25
|
+
notify(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Flush any pending notification immediately.
|
|
28
|
+
* Call this during shutdown to ensure final state is delivered.
|
|
29
|
+
*/
|
|
30
|
+
flush(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Cancel any pending notification and stop the throttle.
|
|
33
|
+
*/
|
|
34
|
+
dispose(): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=throttle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/event/throttle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,eAAe;IAKpC;;;;OAIG;IACH,MAAM,IAAI,IAAI;IAed;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification throttle — coalesces MCP resource-update notifications.
|
|
3
|
+
*
|
|
4
|
+
* Under high parallelism, many tasks complete/update simultaneously.
|
|
5
|
+
* Instead of sending one notification per event, we batch them over
|
|
6
|
+
* a configurable window and send at most one per window.
|
|
7
|
+
*/
|
|
8
|
+
export class NotificationThrottle {
|
|
9
|
+
intervalMs;
|
|
10
|
+
send;
|
|
11
|
+
timer = null;
|
|
12
|
+
pending = false;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.intervalMs = options.intervalMs ?? 500;
|
|
15
|
+
this.send = options.send;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Request a notification. If one is already pending in the current
|
|
19
|
+
* window, this is a no-op (coalesced). Otherwise, schedules delivery
|
|
20
|
+
* at the end of the window.
|
|
21
|
+
*/
|
|
22
|
+
notify() {
|
|
23
|
+
this.pending = true;
|
|
24
|
+
if (this.timer !== null)
|
|
25
|
+
return; // already scheduled
|
|
26
|
+
this.timer = setTimeout(() => {
|
|
27
|
+
this.timer = null;
|
|
28
|
+
if (this.pending) {
|
|
29
|
+
this.pending = false;
|
|
30
|
+
this.send().catch(() => {
|
|
31
|
+
// Non-fatal — client may not support notifications
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}, this.intervalMs);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Flush any pending notification immediately.
|
|
38
|
+
* Call this during shutdown to ensure final state is delivered.
|
|
39
|
+
*/
|
|
40
|
+
async flush() {
|
|
41
|
+
if (this.timer !== null) {
|
|
42
|
+
clearTimeout(this.timer);
|
|
43
|
+
this.timer = null;
|
|
44
|
+
}
|
|
45
|
+
if (this.pending) {
|
|
46
|
+
this.pending = false;
|
|
47
|
+
try {
|
|
48
|
+
await this.send();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Non-fatal
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Cancel any pending notification and stop the throttle.
|
|
57
|
+
*/
|
|
58
|
+
dispose() {
|
|
59
|
+
if (this.timer !== null) {
|
|
60
|
+
clearTimeout(this.timer);
|
|
61
|
+
this.timer = null;
|
|
62
|
+
}
|
|
63
|
+
this.pending = false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../src/event/throttle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,OAAO,oBAAoB;IACd,UAAU,CAAS;IACnB,IAAI,CAAsB;IACnC,KAAK,GAAyC,IAAI,CAAC;IACnD,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,OAAwB;QAClC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,oBAAoB;QAErD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;oBACrB,mDAAmD;gBACrD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;CACF"}
|
package/dist/index.js
CHANGED
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { CodexMcpServer } from './server.js';
|
|
4
4
|
import { closeAllOutputHandles } from './services/output-file.js';
|
|
5
|
+
import { initTemplates } from './services/template-init.js';
|
|
6
|
+
import { validateAccountsBinary, cleanupRotationLock, } from './services/account-rotator.js';
|
|
7
|
+
import { taskStore } from './task/store.js';
|
|
8
|
+
import { flushNotifications } from './tools/handlers.js';
|
|
9
|
+
import { taskEventBus } from './event/bus.js';
|
|
10
|
+
import { groupRegistry } from './wave/registry.js';
|
|
11
|
+
import { concurrencySemaphore } from './wave/semaphore.js';
|
|
5
12
|
const SERVER_CONFIG = {
|
|
6
13
|
name: 'codex-mcp-server',
|
|
7
14
|
version: '0.0.6',
|
|
8
15
|
};
|
|
9
16
|
async function main() {
|
|
10
17
|
try {
|
|
18
|
+
await initTemplates(); // Must happen before server construction
|
|
19
|
+
validateAccountsBinary(); // Throws if CODEX_ROTATE=1 and binary missing
|
|
20
|
+
groupRegistry.loadAll(); // Restore group state from JSONL
|
|
11
21
|
const server = new CodexMcpServer(SERVER_CONFIG);
|
|
12
22
|
await server.start();
|
|
13
23
|
}
|
|
@@ -16,9 +26,30 @@ async function main() {
|
|
|
16
26
|
process.exit(1);
|
|
17
27
|
}
|
|
18
28
|
}
|
|
19
|
-
// Graceful shutdown:
|
|
29
|
+
// Graceful shutdown: cancel tasks, flush notifications, close handles
|
|
20
30
|
async function shutdown() {
|
|
21
31
|
try {
|
|
32
|
+
// 1. Dispose semaphore (reject all queued waiters)
|
|
33
|
+
concurrencySemaphore.dispose();
|
|
34
|
+
// 2. Cancel all running tasks (triggers process kills + cleanup)
|
|
35
|
+
const cancelled = await taskStore.cancelAll();
|
|
36
|
+
if (cancelled > 0) {
|
|
37
|
+
console.error(chalk.yellow(`Shutdown: cancelled ${cancelled} running task(s)`));
|
|
38
|
+
}
|
|
39
|
+
// 3. Transition non-terminal groups to done_timeout
|
|
40
|
+
for (const group of groupRegistry.getAllNonTerminal()) {
|
|
41
|
+
groupRegistry.transitionGroup(group.id, 'done_timeout', {
|
|
42
|
+
error: 'Server shutdown',
|
|
43
|
+
});
|
|
44
|
+
groupRegistry.persist(group.id);
|
|
45
|
+
}
|
|
46
|
+
// 4. Clean up rotation lock if held by this process
|
|
47
|
+
cleanupRotationLock();
|
|
48
|
+
// 5. Flush pending notifications
|
|
49
|
+
await flushNotifications();
|
|
50
|
+
// 6. Clear event bus subscriptions
|
|
51
|
+
taskEventBus.clear();
|
|
52
|
+
// 7. Close all output file handles
|
|
22
53
|
await closeAllOutputHandles();
|
|
23
54
|
}
|
|
24
55
|
catch {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACR,CAAC;AAEX,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC,CAAC,yCAAyC;QAChE,sBAAsB,EAAE,CAAC,CAAC,8CAA8C;QACxE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,iCAAiC;QAC1D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,mDAAmD;QACnD,oBAAoB,CAAC,OAAO,EAAE,CAAC;QAE/B,iEAAiE;QACjE,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;QAC9C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,uBAAuB,SAAS,kBAAkB,CAAC,CACjE,CAAC;QACJ,CAAC;QAED,oDAAoD;QACpD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACtD,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE;gBACtD,KAAK,EAAE,iBAAiB;aACzB,CAAC,CAAC;YACH,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,oDAAoD;QACpD,mBAAmB,EAAE,CAAC;QAEtB,iCAAiC;QACjC,MAAM,kBAAkB,EAAE,CAAC;QAE3B,mCAAmC;QACnC,YAAY,CAAC,KAAK,EAAE,CAAC;QAErB,mCAAmC;QACnC,MAAM,qBAAqB,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL event parser for codex --json output.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from tools/handlers.ts to be reusable across
|
|
5
|
+
* single-agent runner and future wave orchestration.
|
|
6
|
+
*
|
|
7
|
+
* Design:
|
|
8
|
+
* - Skips streaming intermediates (item.started, thread.started, turn.started)
|
|
9
|
+
* - Extracts completed items as clean JSONL
|
|
10
|
+
* - Preserves turn.completed for usage stats
|
|
11
|
+
* - Preserves turn.failed and item.failed for error visibility
|
|
12
|
+
* - Normalises legacy event shapes to the modern item schema
|
|
13
|
+
*
|
|
14
|
+
* Ref: https://developers.openai.com/codex/noninteractive/
|
|
15
|
+
*/
|
|
16
|
+
import type { ParsedProcessEvent } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Test whether a stderr chunk is noise (should be dropped).
|
|
19
|
+
*/
|
|
20
|
+
export declare function isStderrNoise(chunk: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Parse a single JSONL line from codex --json output.
|
|
23
|
+
*
|
|
24
|
+
* Returns a normalized JSON string, or null if the line should be skipped
|
|
25
|
+
* (intermediates, empty lines, malformed JSON).
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseCodexEvent(line: string): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Parse a JSON string into a typed event object.
|
|
30
|
+
* Returns null if parsing fails.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseEventString(jsonStr: string): ParsedProcessEvent | null;
|
|
33
|
+
/**
|
|
34
|
+
* Create a stderr event JSON string from a raw chunk.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createStderrEvent(chunk: string): string;
|
|
37
|
+
//# sourceMappingURL=event-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-parser.d.ts","sourceRoot":"","sources":["../../src/process/event-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAgBrD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuF3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAU3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL event parser for codex --json output.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from tools/handlers.ts to be reusable across
|
|
5
|
+
* single-agent runner and future wave orchestration.
|
|
6
|
+
*
|
|
7
|
+
* Design:
|
|
8
|
+
* - Skips streaming intermediates (item.started, thread.started, turn.started)
|
|
9
|
+
* - Extracts completed items as clean JSONL
|
|
10
|
+
* - Preserves turn.completed for usage stats
|
|
11
|
+
* - Preserves turn.failed and item.failed for error visibility
|
|
12
|
+
* - Normalises legacy event shapes to the modern item schema
|
|
13
|
+
*
|
|
14
|
+
* Ref: https://developers.openai.com/codex/noninteractive/
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Known stderr noise patterns from codex-core internals.
|
|
18
|
+
* These are non-actionable internal diagnostics that pollute output.
|
|
19
|
+
*/
|
|
20
|
+
const STDERR_NOISE_PATTERNS = [
|
|
21
|
+
'state db missing rollout path',
|
|
22
|
+
'missing rollout path for thread',
|
|
23
|
+
'codex_core::rollout::list',
|
|
24
|
+
'codex_core::config_watcher',
|
|
25
|
+
'codex_core::telemetry',
|
|
26
|
+
'Refreshing model list',
|
|
27
|
+
'model list refreshed',
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Test whether a stderr chunk is noise (should be dropped).
|
|
31
|
+
*/
|
|
32
|
+
export function isStderrNoise(chunk) {
|
|
33
|
+
return STDERR_NOISE_PATTERNS.some((p) => chunk.includes(p));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse a single JSONL line from codex --json output.
|
|
37
|
+
*
|
|
38
|
+
* Returns a normalized JSON string, or null if the line should be skipped
|
|
39
|
+
* (intermediates, empty lines, malformed JSON).
|
|
40
|
+
*/
|
|
41
|
+
export function parseCodexEvent(line) {
|
|
42
|
+
const trimmed = line.trim();
|
|
43
|
+
if (!trimmed)
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
const event = JSON.parse(trimmed);
|
|
47
|
+
// 1. Skip lifecycle / streaming intermediate events
|
|
48
|
+
if (event.type === 'thread.started' ||
|
|
49
|
+
event.type === 'turn.started' ||
|
|
50
|
+
event.type === 'item.started') {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// 2. Turn completion — emit usage stats
|
|
54
|
+
if (event.type === 'turn.completed') {
|
|
55
|
+
if (event.usage) {
|
|
56
|
+
return JSON.stringify({ type: 'turn_usage', ...event.usage });
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// 3. Turn failure — surface error
|
|
61
|
+
if (event.type === 'turn.failed') {
|
|
62
|
+
const err = event.error;
|
|
63
|
+
return JSON.stringify({
|
|
64
|
+
type: 'turn_failed',
|
|
65
|
+
code: err?.code ?? err?.codexErrorInfo?.type ?? null,
|
|
66
|
+
message: err?.message || 'Unknown turn failure',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// 4. Item failed — emit item with _failed marker
|
|
70
|
+
if (event.type === 'item.failed' && event.item) {
|
|
71
|
+
return JSON.stringify({ ...event.item, _failed: true });
|
|
72
|
+
}
|
|
73
|
+
// 5. Item completed — the primary event
|
|
74
|
+
if (event.type === 'item.completed' && event.item) {
|
|
75
|
+
return JSON.stringify(event.item);
|
|
76
|
+
}
|
|
77
|
+
// 6. Top-level error
|
|
78
|
+
if (event.type === 'error') {
|
|
79
|
+
const err = event.error ?? event;
|
|
80
|
+
return JSON.stringify({
|
|
81
|
+
type: 'error',
|
|
82
|
+
code: err.code ?? null,
|
|
83
|
+
message: err.message || trimmed,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// 7. Legacy / alternate event shapes (pre-2025)
|
|
87
|
+
if (event.type === 'message' && event.content) {
|
|
88
|
+
return JSON.stringify({
|
|
89
|
+
id: event.id ?? null,
|
|
90
|
+
type: 'agent_message',
|
|
91
|
+
text: event.content,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (event.type === 'function_call') {
|
|
95
|
+
return JSON.stringify({
|
|
96
|
+
id: event.id ?? null,
|
|
97
|
+
type: 'function_call',
|
|
98
|
+
name: event.name,
|
|
99
|
+
arguments: event.arguments,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (event.type === 'function_call_output') {
|
|
103
|
+
return JSON.stringify({
|
|
104
|
+
id: event.id ?? null,
|
|
105
|
+
type: 'function_call_output',
|
|
106
|
+
output: typeof event.output === 'string'
|
|
107
|
+
? event.output
|
|
108
|
+
: JSON.stringify(event.output),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// 8. Unknown event — pass through
|
|
112
|
+
return JSON.stringify(event);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Not valid JSON — skip malformed lines
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Parse a JSON string into a typed event object.
|
|
121
|
+
* Returns null if parsing fails.
|
|
122
|
+
*/
|
|
123
|
+
export function parseEventString(jsonStr) {
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(jsonStr);
|
|
126
|
+
if (parsed && typeof parsed === 'object' && parsed.type) {
|
|
127
|
+
return parsed;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a stderr event JSON string from a raw chunk.
|
|
137
|
+
*/
|
|
138
|
+
export function createStderrEvent(chunk) {
|
|
139
|
+
return JSON.stringify({ type: 'stderr', text: chunk.slice(0, 500) });
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=event-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-parser.js","sourceRoot":"","sources":["../../src/process/event-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodexProcessRunner — owns the lifecycle of one codex child process.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Spawn the codex process
|
|
6
|
+
* - Line-buffer stdout for JSONL parsing
|
|
7
|
+
* - Filter stderr noise
|
|
8
|
+
* - Emit normalized events via callbacks
|
|
9
|
+
* - Deterministic cleanup: SIGTERM → grace → SIGKILL → remove listeners
|
|
10
|
+
*
|
|
11
|
+
* Single-use: one runner per task, created once, not reused.
|
|
12
|
+
*/
|
|
13
|
+
import { type ProcessState, type SpawnOptions, type ProcessCallbacks, type ProcessExitInfo, type ProcessHandle } from './types.js';
|
|
14
|
+
export declare class CodexProcessRunner {
|
|
15
|
+
private child;
|
|
16
|
+
private _state;
|
|
17
|
+
private stdoutBuffer;
|
|
18
|
+
private readonly killGraceMs;
|
|
19
|
+
private readonly callbacks;
|
|
20
|
+
private exitPromise;
|
|
21
|
+
private exitResolve;
|
|
22
|
+
private wasKilledByUs;
|
|
23
|
+
constructor(callbacks: ProcessCallbacks, killGraceMs?: number);
|
|
24
|
+
get state(): ProcessState;
|
|
25
|
+
/**
|
|
26
|
+
* Spawn the codex process. Returns a ProcessHandle for PID access
|
|
27
|
+
* and kill control.
|
|
28
|
+
*/
|
|
29
|
+
spawn(options: SpawnOptions): ProcessHandle;
|
|
30
|
+
/**
|
|
31
|
+
* Kill the process deterministically.
|
|
32
|
+
* SIGTERM → wait grace period → SIGKILL → wait for exit.
|
|
33
|
+
*/
|
|
34
|
+
kill(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Wait for the process to exit naturally.
|
|
37
|
+
*/
|
|
38
|
+
waitForExit(): Promise<ProcessExitInfo>;
|
|
39
|
+
private onStdout;
|
|
40
|
+
private onStderr;
|
|
41
|
+
private onClose;
|
|
42
|
+
private onError;
|
|
43
|
+
/**
|
|
44
|
+
* Remove all listeners from the child process.
|
|
45
|
+
*/
|
|
46
|
+
private removeListeners;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/process/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAUpB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,WAAW,CAAkD;IACrE,OAAO,CAAC,aAAa,CAAS;gBAElB,SAAS,EAAE,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM;IAK7D,IAAI,KAAK,IAAI,YAAY,CAExB;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa;IAuD3C;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD3B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAS7C,OAAO,CAAC,QAAQ,CAgBd;IAEF,OAAO,CAAC,QAAQ,CAWd;IAEF,OAAO,CAAC,OAAO,CAoCb;IAEF,OAAO,CAAC,OAAO,CAgBb;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe;CAOxB"}
|