mcp-codex-worker 0.1.35 → 0.1.36
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.
|
@@ -37,6 +37,7 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
37
37
|
let detachPauseFlow;
|
|
38
38
|
let detachEventCapture;
|
|
39
39
|
let removeExitListener;
|
|
40
|
+
let heartbeatTimer;
|
|
40
41
|
// Clean up listeners only once, regardless of which path triggers it.
|
|
41
42
|
const cleanup = () => {
|
|
42
43
|
detachPauseFlow?.();
|
|
@@ -45,6 +46,10 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
45
46
|
detachEventCapture = undefined;
|
|
46
47
|
removeExitListener?.();
|
|
47
48
|
removeExitListener = undefined;
|
|
49
|
+
if (heartbeatTimer) {
|
|
50
|
+
clearInterval(heartbeatTimer);
|
|
51
|
+
heartbeatTimer = undefined;
|
|
52
|
+
}
|
|
48
53
|
};
|
|
49
54
|
try {
|
|
50
55
|
// 1. Create a new thread
|
|
@@ -67,17 +72,44 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
67
72
|
.getCurrentClient();
|
|
68
73
|
detachPauseFlow = attachPauseFlow(client, handle, threadId);
|
|
69
74
|
detachEventCapture = attachEventCapture(client, handle, threadId, this.options.fileWriter);
|
|
70
|
-
// 3b.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
// 3b. Capture stderr for diagnostics — logs to verbose + events.jsonl
|
|
76
|
+
const onStderr = (chunk) => {
|
|
77
|
+
handle.writeOutputFileOnly(`[stderr] ${chunk.trimEnd()}`);
|
|
78
|
+
if (this.options.fileWriter) {
|
|
79
|
+
this.options.fileWriter.appendEvent(handle.taskId, {
|
|
80
|
+
method: '_stderr',
|
|
81
|
+
data: chunk.trimEnd(),
|
|
82
|
+
}).catch(() => { });
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
client.on('stderr', onStderr);
|
|
86
|
+
// 3c. Listen for app-server crashes. If the process exits while the
|
|
87
|
+
// task is paused (WAITING_ANSWER), mark it failed with the exit
|
|
88
|
+
// code so we can trace the cause.
|
|
89
|
+
const onExit = (info) => {
|
|
74
90
|
if (handle.isAlive()) {
|
|
75
|
-
handle.markFailed(
|
|
91
|
+
handle.markFailed(`Codex app-server exited (code=${String(info.code)}, signal=${String(info.signal)})`);
|
|
92
|
+
}
|
|
93
|
+
if (this.options.fileWriter) {
|
|
94
|
+
this.options.fileWriter.appendEvent(handle.taskId, {
|
|
95
|
+
method: '_process_exit',
|
|
96
|
+
code: info.code,
|
|
97
|
+
signal: info.signal,
|
|
98
|
+
}).catch(() => { });
|
|
76
99
|
}
|
|
77
100
|
cleanup();
|
|
78
101
|
};
|
|
79
102
|
client.on('exit', onExit);
|
|
80
|
-
removeExitListener = () =>
|
|
103
|
+
removeExitListener = () => {
|
|
104
|
+
client.off('exit', onExit);
|
|
105
|
+
client.off('stderr', onStderr);
|
|
106
|
+
};
|
|
107
|
+
// 3d. Heartbeat — prevent Codex idle timeout during approval waits.
|
|
108
|
+
// Sends a lightweight request every 30s to keep the connection alive.
|
|
109
|
+
heartbeatTimer = setInterval(() => {
|
|
110
|
+
runtime.request('account/rateLimits/read', {}).catch(() => { });
|
|
111
|
+
}, 30_000);
|
|
112
|
+
heartbeatTimer.unref();
|
|
81
113
|
// 4. Build turn params and start the turn via bridged request
|
|
82
114
|
const { params: turnParams } = await runtime.buildTurnStartParams({
|
|
83
115
|
threadId,
|
|
@@ -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,0BAA0B,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAa3D,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;QAC9C,IAAI,kBAA4C,CAAC;QACjD,IAAI,kBAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../../src/execution/codex-adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -72,6 +72,7 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
72
72
|
let detachPauseFlow: (() => void) | undefined;
|
|
73
73
|
let detachEventCapture: (() => void) | undefined;
|
|
74
74
|
let removeExitListener: (() => void) | undefined;
|
|
75
|
+
let heartbeatTimer: ReturnType<typeof setInterval> | undefined;
|
|
75
76
|
|
|
76
77
|
// Clean up listeners only once, regardless of which path triggers it.
|
|
77
78
|
const cleanup = () => {
|
|
@@ -81,6 +82,10 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
81
82
|
detachEventCapture = undefined;
|
|
82
83
|
removeExitListener?.();
|
|
83
84
|
removeExitListener = undefined;
|
|
85
|
+
if (heartbeatTimer) {
|
|
86
|
+
clearInterval(heartbeatTimer);
|
|
87
|
+
heartbeatTimer = undefined;
|
|
88
|
+
}
|
|
84
89
|
};
|
|
85
90
|
|
|
86
91
|
try {
|
|
@@ -109,17 +114,48 @@ export class CodexAdapter extends BaseProviderAdapter {
|
|
|
109
114
|
detachPauseFlow = attachPauseFlow(client, handle, threadId);
|
|
110
115
|
detachEventCapture = attachEventCapture(client, handle, threadId, this.options.fileWriter);
|
|
111
116
|
|
|
112
|
-
// 3b.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
117
|
+
// 3b. Capture stderr for diagnostics — logs to verbose + events.jsonl
|
|
118
|
+
const onStderr = (chunk: string) => {
|
|
119
|
+
handle.writeOutputFileOnly(`[stderr] ${chunk.trimEnd()}`);
|
|
120
|
+
if (this.options.fileWriter) {
|
|
121
|
+
this.options.fileWriter.appendEvent(handle.taskId, {
|
|
122
|
+
method: '_stderr',
|
|
123
|
+
data: chunk.trimEnd(),
|
|
124
|
+
}).catch(() => {});
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
client.on('stderr', onStderr);
|
|
128
|
+
|
|
129
|
+
// 3c. Listen for app-server crashes. If the process exits while the
|
|
130
|
+
// task is paused (WAITING_ANSWER), mark it failed with the exit
|
|
131
|
+
// code so we can trace the cause.
|
|
132
|
+
const onExit = (info: { code: number | null; signal: string | null }) => {
|
|
116
133
|
if (handle.isAlive()) {
|
|
117
|
-
handle.markFailed(
|
|
134
|
+
handle.markFailed(
|
|
135
|
+
`Codex app-server exited (code=${String(info.code)}, signal=${String(info.signal)})`,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
if (this.options.fileWriter) {
|
|
139
|
+
this.options.fileWriter.appendEvent(handle.taskId, {
|
|
140
|
+
method: '_process_exit',
|
|
141
|
+
code: info.code,
|
|
142
|
+
signal: info.signal,
|
|
143
|
+
}).catch(() => {});
|
|
118
144
|
}
|
|
119
145
|
cleanup();
|
|
120
146
|
};
|
|
121
147
|
client.on('exit', onExit);
|
|
122
|
-
removeExitListener = () =>
|
|
148
|
+
removeExitListener = () => {
|
|
149
|
+
client.off('exit', onExit);
|
|
150
|
+
client.off('stderr', onStderr);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// 3d. Heartbeat — prevent Codex idle timeout during approval waits.
|
|
154
|
+
// Sends a lightweight request every 30s to keep the connection alive.
|
|
155
|
+
heartbeatTimer = setInterval(() => {
|
|
156
|
+
runtime.request('account/rateLimits/read', {}).catch(() => {});
|
|
157
|
+
}, 30_000);
|
|
158
|
+
heartbeatTimer.unref();
|
|
123
159
|
|
|
124
160
|
// 4. Build turn params and start the turn via bridged request
|
|
125
161
|
const { params: turnParams } = await runtime.buildTurnStartParams({
|