@coralai/sps-cli 0.10.2 → 0.11.1
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 +63 -23
- package/dist/commands/workerDashboard.d.ts.map +1 -1
- package/dist/commands/workerDashboard.js +39 -11
- package/dist/commands/workerDashboard.js.map +1 -1
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +1 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/state.d.ts +10 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +5 -0
- package/dist/core/state.js.map +1 -1
- package/dist/engines/CloseoutEngine.d.ts.map +1 -1
- package/dist/engines/CloseoutEngine.js +79 -28
- package/dist/engines/CloseoutEngine.js.map +1 -1
- package/dist/engines/ExecutionEngine.d.ts +5 -0
- package/dist/engines/ExecutionEngine.d.ts.map +1 -1
- package/dist/engines/ExecutionEngine.js +80 -16
- package/dist/engines/ExecutionEngine.js.map +1 -1
- package/dist/engines/MonitorEngine.d.ts.map +1 -1
- package/dist/engines/MonitorEngine.js +6 -1
- package/dist/engines/MonitorEngine.js.map +1 -1
- package/dist/interfaces/WorkerProvider.d.ts +68 -15
- package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
- package/dist/models/types.d.ts +3 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/providers/ClaudePrintProvider.d.ts +54 -0
- package/dist/providers/ClaudePrintProvider.d.ts.map +1 -0
- package/dist/providers/ClaudePrintProvider.js +279 -0
- package/dist/providers/ClaudePrintProvider.js.map +1 -0
- package/dist/providers/ClaudeTmuxProvider.d.ts +94 -0
- package/dist/providers/ClaudeTmuxProvider.d.ts.map +1 -0
- package/dist/providers/ClaudeTmuxProvider.js +331 -0
- package/dist/providers/ClaudeTmuxProvider.js.map +1 -0
- package/dist/providers/ClaudeWorkerProvider.d.ts +5 -93
- package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
- package/dist/providers/ClaudeWorkerProvider.js +3 -303
- package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
- package/dist/providers/CodexExecProvider.d.ts +36 -0
- package/dist/providers/CodexExecProvider.d.ts.map +1 -0
- package/dist/providers/CodexExecProvider.js +238 -0
- package/dist/providers/CodexExecProvider.js.map +1 -0
- package/dist/providers/CodexTmuxProvider.d.ts +71 -0
- package/dist/providers/CodexTmuxProvider.d.ts.map +1 -0
- package/dist/providers/CodexTmuxProvider.js +351 -0
- package/dist/providers/CodexTmuxProvider.js.map +1 -0
- package/dist/providers/CodexWorkerProvider.d.ts +5 -70
- package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
- package/dist/providers/CodexWorkerProvider.js +3 -328
- package/dist/providers/CodexWorkerProvider.js.map +1 -1
- package/dist/providers/outputParser.d.ts +50 -0
- package/dist/providers/outputParser.d.ts.map +1 -0
- package/dist/providers/outputParser.js +219 -0
- package/dist/providers/outputParser.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +18 -6
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/streamRenderer.d.ts +13 -0
- package/dist/providers/streamRenderer.d.ts.map +1 -0
- package/dist/providers/streamRenderer.js +106 -0
- package/dist/providers/streamRenderer.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ProjectConfig } from '../core/config.js';
|
|
2
|
+
import type { WorkerProvider, LaunchResult } from '../interfaces/WorkerProvider.js';
|
|
3
|
+
import type { WorkerStatus } from '../models/types.js';
|
|
4
|
+
export declare class CodexTmuxProvider implements WorkerProvider {
|
|
5
|
+
private readonly config;
|
|
6
|
+
constructor(config: ProjectConfig);
|
|
7
|
+
prepareEnv(worktree: string, _seq: string): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Launch Codex in a tmux session (interactive mode).
|
|
10
|
+
* Handles session reuse and update prompt auto-skip.
|
|
11
|
+
*/
|
|
12
|
+
launch(session: string, worktree: string, promptFile: string): Promise<LaunchResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Wait for Codex to be ready.
|
|
15
|
+
* Must handle the update prompt blocker (auto-skip).
|
|
16
|
+
*/
|
|
17
|
+
waitReady(session: string, timeoutMs?: number): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Send task prompt to Codex via tmux paste-buffer.
|
|
20
|
+
*/
|
|
21
|
+
sendTask(session: string, promptFile: string): Promise<void>;
|
|
22
|
+
inspect(session: string): Promise<{
|
|
23
|
+
alive: boolean;
|
|
24
|
+
paneText: string;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Codex with --dangerously-bypass-approvals-and-sandbox doesn't need confirmation.
|
|
28
|
+
* But if run without that flag, it may show approval prompts.
|
|
29
|
+
* For now, always return not waiting since we use bypass mode.
|
|
30
|
+
*/
|
|
31
|
+
detectWaiting(session: string): Promise<{
|
|
32
|
+
waiting: boolean;
|
|
33
|
+
destructive: boolean;
|
|
34
|
+
prompt: string;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Detect completion by checking if Codex returned to › prompt after working.
|
|
38
|
+
*/
|
|
39
|
+
detectCompleted(session: string, logDir: string, _branch: string): Promise<WorkerStatus>;
|
|
40
|
+
detectBlocked(session: string): Promise<boolean>;
|
|
41
|
+
sendFix(session: string, fixPrompt: string, _resumeSessionId?: string): Promise<void>;
|
|
42
|
+
resolveConflict(session: string, worktree: string, branch: string, _resumeSessionId?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Release a worker session after task completion.
|
|
45
|
+
*
|
|
46
|
+
* WORKER_SESSION_REUSE=true: do nothing — keep Codex running so the
|
|
47
|
+
* next task can hot-reuse the session via /clear + cd.
|
|
48
|
+
*
|
|
49
|
+
* WORKER_SESSION_REUSE=false: quit Codex but keep tmux session alive.
|
|
50
|
+
*/
|
|
51
|
+
release(session: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Force-stop a worker session (error recovery, cleanup).
|
|
54
|
+
* Always quits Codex and kills the tmux session.
|
|
55
|
+
*/
|
|
56
|
+
stop(session: string): Promise<void>;
|
|
57
|
+
collectSummary(session: string): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Dismiss the rate-limit model switch prompt by selecting "Keep current model".
|
|
60
|
+
*
|
|
61
|
+
* The prompt shows:
|
|
62
|
+
* › 1. Switch to gpt-5.1-codex-mini
|
|
63
|
+
* 2. Keep current model
|
|
64
|
+
* 3. Keep current model (never show again)
|
|
65
|
+
*
|
|
66
|
+
* Strategy: press Down once to select option 2, then Enter.
|
|
67
|
+
*/
|
|
68
|
+
private dismissRateLimitPrompt;
|
|
69
|
+
private sleep;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=CodexTmuxProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexTmuxProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CodexTmuxProvider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0EvD,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa;IAI3B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqC1F;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IA6DtE;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAM7E;;;;OAIG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBzG;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC;IAgClB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKhD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalH;;;;;;;OAOG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItD;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
/**
|
|
4
|
+
* Codex CLI patterns (differs from Claude):
|
|
5
|
+
*
|
|
6
|
+
* Ready prompt: › <placeholder>
|
|
7
|
+
* gpt-5.3-codex default · ...
|
|
8
|
+
*
|
|
9
|
+
* Completion: returns to › prompt after task
|
|
10
|
+
*
|
|
11
|
+
* Update blocker: ✨ Update available!
|
|
12
|
+
* › 1. Update now
|
|
13
|
+
* 2. Skip
|
|
14
|
+
* 3. Skip until next version
|
|
15
|
+
* Press enter to continue
|
|
16
|
+
*
|
|
17
|
+
* Confirmation: (none with --dangerously-bypass-approvals-and-sandbox)
|
|
18
|
+
*
|
|
19
|
+
* Exit command: /quit (Claude uses /exit)
|
|
20
|
+
*/
|
|
21
|
+
/** Completion keywords in codex pane text. */
|
|
22
|
+
const COMPLETION_KEYWORDS = /\b(done|completed|finished|Next step:|committed|pushed|MR created|merge request)\b/i;
|
|
23
|
+
/** Codex ready prompt: › at start of line + model info line */
|
|
24
|
+
const CODEX_READY = /›\s.*$/m;
|
|
25
|
+
const CODEX_MODEL_LINE = /codex.*default.*·/i;
|
|
26
|
+
/** Codex update blocker pattern */
|
|
27
|
+
const CODEX_UPDATE_PROMPT = /Update available|Skip until next version/i;
|
|
28
|
+
/** Codex rate-limit model switch prompt */
|
|
29
|
+
const CODEX_RATE_LIMIT_PROMPT = /rate limit|Switch to .+codex-mini|Keep current model/i;
|
|
30
|
+
/**
|
|
31
|
+
* Run a tmux command. Returns null on failure.
|
|
32
|
+
*/
|
|
33
|
+
function tmux(args) {
|
|
34
|
+
try {
|
|
35
|
+
return execFileSync('tmux', args, {
|
|
36
|
+
encoding: 'utf-8',
|
|
37
|
+
timeout: 10_000,
|
|
38
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const stderr = err.stderr ?? '';
|
|
43
|
+
if (stderr.includes('server exited unexpectedly') || stderr.includes('no server running')) {
|
|
44
|
+
try {
|
|
45
|
+
const uid = process.getuid?.() ?? 1000;
|
|
46
|
+
const { rmSync } = require('node:fs');
|
|
47
|
+
rmSync(`/tmp/tmux-${uid}`, { recursive: true, force: true });
|
|
48
|
+
process.stderr.write('[codex-worker] Cleaned stale tmux socket, retrying\n');
|
|
49
|
+
return execFileSync('tmux', args, {
|
|
50
|
+
encoding: 'utf-8',
|
|
51
|
+
timeout: 10_000,
|
|
52
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function sessionExists(session) {
|
|
63
|
+
return tmux(['has-session', '-t', session]) !== null;
|
|
64
|
+
}
|
|
65
|
+
function capturePaneText(session, lines) {
|
|
66
|
+
return tmux(['capture-pane', '-t', session, '-p', '-S', `-${lines}`]) ?? '';
|
|
67
|
+
}
|
|
68
|
+
export class CodexTmuxProvider {
|
|
69
|
+
config;
|
|
70
|
+
constructor(config) {
|
|
71
|
+
this.config = config;
|
|
72
|
+
}
|
|
73
|
+
async prepareEnv(worktree, _seq) {
|
|
74
|
+
if (!existsSync(worktree)) {
|
|
75
|
+
throw new Error(`Worktree directory does not exist: ${worktree}`);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
execFileSync('git', ['-C', worktree, 'rev-parse', '--is-inside-work-tree'], {
|
|
79
|
+
encoding: 'utf-8', timeout: 5_000, stdio: ['ignore', 'pipe', 'pipe'],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
throw new Error(`Directory is not a git worktree: ${worktree}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Launch Codex in a tmux session (interactive mode).
|
|
88
|
+
* Handles session reuse and update prompt auto-skip.
|
|
89
|
+
*/
|
|
90
|
+
async launch(session, worktree, promptFile) {
|
|
91
|
+
const codexCmd = 'codex --sandbox danger-full-access -a never --no-alt-screen';
|
|
92
|
+
if (sessionExists(session)) {
|
|
93
|
+
const pane = capturePaneText(session, 10);
|
|
94
|
+
const codexAlive = CODEX_READY.test(pane) && CODEX_MODEL_LINE.test(pane);
|
|
95
|
+
if (codexAlive) {
|
|
96
|
+
process.stderr.write(`[codex-worker] Reusing live Codex session ${session}\n`);
|
|
97
|
+
tmux(['send-keys', '-t', session, '/clear', 'Enter']);
|
|
98
|
+
await this.sleep(1_000);
|
|
99
|
+
tmux(['send-keys', '-t', session, `/cd ${worktree}`, 'Enter']);
|
|
100
|
+
await this.sleep(500);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
process.stderr.write(`[codex-worker] Reusing tmux session ${session}\n`);
|
|
104
|
+
tmux(['send-keys', '-t', session, `cd ${worktree}`, 'Enter']);
|
|
105
|
+
await this.sleep(500);
|
|
106
|
+
tmux(['send-keys', '-t', session, codexCmd, 'Enter']);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const result = tmux(['new-session', '-d', '-s', session, '-c', worktree]);
|
|
111
|
+
if (result === null && !sessionExists(session)) {
|
|
112
|
+
throw new Error(`Failed to create tmux session: ${session}`);
|
|
113
|
+
}
|
|
114
|
+
tmux(['send-keys', '-t', session, codexCmd, 'Enter']);
|
|
115
|
+
}
|
|
116
|
+
// Wait for ready + send task prompt
|
|
117
|
+
const ready = await this.waitReady(session, 90_000);
|
|
118
|
+
if (!ready) {
|
|
119
|
+
throw new Error('Codex worker did not become ready within timeout');
|
|
120
|
+
}
|
|
121
|
+
await this.sendTask(session, promptFile);
|
|
122
|
+
return { pid: 0, outputFile: '' };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Wait for Codex to be ready.
|
|
126
|
+
* Must handle the update prompt blocker (auto-skip).
|
|
127
|
+
*/
|
|
128
|
+
async waitReady(session, timeoutMs = 90_000) {
|
|
129
|
+
const pollInterval = 3_000;
|
|
130
|
+
const deadline = Date.now() + timeoutMs;
|
|
131
|
+
let updateSkipped = false;
|
|
132
|
+
// Codex is slower to start than Claude — wait longer before first check
|
|
133
|
+
await this.sleep(5_000);
|
|
134
|
+
while (Date.now() < deadline) {
|
|
135
|
+
const text = capturePaneText(session, 30);
|
|
136
|
+
// Handle update prompt — send Enter to dismiss, then skip
|
|
137
|
+
if (!updateSkipped && CODEX_UPDATE_PROMPT.test(text)) {
|
|
138
|
+
process.stderr.write('[codex-worker] Detected update prompt, skipping\n');
|
|
139
|
+
// If showing numbered options (1/2/3), select 3 "Skip until next version"
|
|
140
|
+
if (/1\. Update now/i.test(text)) {
|
|
141
|
+
tmux(['send-keys', '-t', session, 'Down']);
|
|
142
|
+
await this.sleep(300);
|
|
143
|
+
tmux(['send-keys', '-t', session, 'Down']);
|
|
144
|
+
await this.sleep(300);
|
|
145
|
+
}
|
|
146
|
+
tmux(['send-keys', '-t', session, 'Enter']);
|
|
147
|
+
updateSkipped = true;
|
|
148
|
+
await this.sleep(5_000);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// Handle "Press enter to continue" after update banner
|
|
152
|
+
if (/Press enter to continue/i.test(text)) {
|
|
153
|
+
tmux(['send-keys', '-t', session, 'Enter']);
|
|
154
|
+
await this.sleep(3_000);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Handle rate-limit model switch prompt — select "Keep current model"
|
|
158
|
+
if (CODEX_RATE_LIMIT_PROMPT.test(text)) {
|
|
159
|
+
process.stderr.write('[codex-worker] Detected rate-limit model switch prompt, keeping current model\n');
|
|
160
|
+
this.dismissRateLimitPrompt(session);
|
|
161
|
+
await this.sleep(3_000);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Check if Codex is ready: › prompt + model info line
|
|
165
|
+
if (CODEX_MODEL_LINE.test(text) && CODEX_READY.test(text)) {
|
|
166
|
+
process.stderr.write('[codex-worker] Codex ready\n');
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
// Also match "OpenAI Codex" banner + › prompt
|
|
170
|
+
if (/OpenAI Codex/i.test(text) && /›/m.test(text)) {
|
|
171
|
+
process.stderr.write('[codex-worker] Codex ready (banner match)\n');
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
await this.sleep(pollInterval);
|
|
175
|
+
}
|
|
176
|
+
process.stderr.write(`[codex-worker] waitReady timed out after ${timeoutMs}ms\n`);
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Send task prompt to Codex via tmux paste-buffer.
|
|
181
|
+
*/
|
|
182
|
+
async sendTask(session, promptFile) {
|
|
183
|
+
if (!existsSync(promptFile)) {
|
|
184
|
+
throw new Error(`Prompt file does not exist: ${promptFile}`);
|
|
185
|
+
}
|
|
186
|
+
const content = readFileSync(promptFile, 'utf-8').trim();
|
|
187
|
+
const bufferFile = `/tmp/sps-task-${Date.now()}.txt`;
|
|
188
|
+
const { writeFileSync: writeTmp, unlinkSync } = await import('node:fs');
|
|
189
|
+
writeTmp(bufferFile, content);
|
|
190
|
+
tmux(['load-buffer', bufferFile]);
|
|
191
|
+
tmux(['paste-buffer', '-t', session]);
|
|
192
|
+
try {
|
|
193
|
+
unlinkSync(bufferFile);
|
|
194
|
+
}
|
|
195
|
+
catch { /* cleanup */ }
|
|
196
|
+
// Wait for TUI to finish processing the paste (bracket paste mode).
|
|
197
|
+
await this.sleep(1_500);
|
|
198
|
+
tmux(['send-keys', '-t', session, 'Enter']);
|
|
199
|
+
// Verify the prompt was submitted — retry Enter up to 3 times.
|
|
200
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
201
|
+
await this.sleep(2_000);
|
|
202
|
+
const pane = capturePaneText(session, 15);
|
|
203
|
+
// If we see processing indicators, the task was submitted
|
|
204
|
+
if (/thinking|running|searching|reading/i.test(pane)) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// If the Codex prompt (›) is still visible with text, retry Enter
|
|
208
|
+
if (/›\s*\S/m.test(pane)) {
|
|
209
|
+
process.stderr.write(`[codex-worker] Enter may not have registered (attempt ${attempt + 1}/3), retrying...\n`);
|
|
210
|
+
tmux(['send-keys', '-t', session, 'Enter']);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async inspect(session) {
|
|
215
|
+
const alive = sessionExists(session);
|
|
216
|
+
const paneText = alive ? capturePaneText(session, 50) : '';
|
|
217
|
+
return { alive, paneText };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Codex with --dangerously-bypass-approvals-and-sandbox doesn't need confirmation.
|
|
221
|
+
* But if run without that flag, it may show approval prompts.
|
|
222
|
+
* For now, always return not waiting since we use bypass mode.
|
|
223
|
+
*/
|
|
224
|
+
async detectWaiting(session) {
|
|
225
|
+
// Codex in bypass mode doesn't have confirmation prompts
|
|
226
|
+
// But check for any "Press enter" or similar blockers
|
|
227
|
+
const pane = capturePaneText(session, 15);
|
|
228
|
+
// Update prompt blocker
|
|
229
|
+
if (CODEX_UPDATE_PROMPT.test(pane)) {
|
|
230
|
+
return { waiting: true, destructive: false, prompt: 'Codex update prompt' };
|
|
231
|
+
}
|
|
232
|
+
// Rate-limit model switch prompt — auto-dismiss
|
|
233
|
+
if (CODEX_RATE_LIMIT_PROMPT.test(pane)) {
|
|
234
|
+
process.stderr.write('[codex-worker] Auto-dismissing rate-limit model switch prompt\n');
|
|
235
|
+
this.dismissRateLimitPrompt(session);
|
|
236
|
+
return { waiting: false, destructive: false, prompt: '' }; // handled, not waiting
|
|
237
|
+
}
|
|
238
|
+
return { waiting: false, destructive: false, prompt: '' };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Detect completion by checking if Codex returned to › prompt after working.
|
|
242
|
+
*/
|
|
243
|
+
async detectCompleted(session, logDir, _branch) {
|
|
244
|
+
// Priority 1: task_completed marker file (same as Claude)
|
|
245
|
+
const markerPath = `${logDir}/task_completed`;
|
|
246
|
+
if (existsSync(markerPath)) {
|
|
247
|
+
return 'COMPLETED';
|
|
248
|
+
}
|
|
249
|
+
// Priority 2: check for interactive prompts (needs auto-skip, not completion)
|
|
250
|
+
const pane = capturePaneText(session, 20);
|
|
251
|
+
if (CODEX_UPDATE_PROMPT.test(pane)) {
|
|
252
|
+
return 'NEEDS_INPUT'; // will trigger auto-confirm to skip update
|
|
253
|
+
}
|
|
254
|
+
if (CODEX_RATE_LIMIT_PROMPT.test(pane)) {
|
|
255
|
+
// Auto-dismiss and report ALIVE (not completed, not blocked)
|
|
256
|
+
process.stderr.write('[codex-worker] Rate-limit prompt detected during completion check, dismissing\n');
|
|
257
|
+
this.dismissRateLimitPrompt(session);
|
|
258
|
+
return 'ALIVE';
|
|
259
|
+
}
|
|
260
|
+
// Priority 3: completion keywords + back at › prompt
|
|
261
|
+
if (COMPLETION_KEYWORDS.test(pane) && CODEX_READY.test(pane) && CODEX_MODEL_LINE.test(pane)) {
|
|
262
|
+
return 'COMPLETED';
|
|
263
|
+
}
|
|
264
|
+
// Priority 4: session alive
|
|
265
|
+
if (sessionExists(session)) {
|
|
266
|
+
return 'ALIVE';
|
|
267
|
+
}
|
|
268
|
+
return 'DEAD';
|
|
269
|
+
}
|
|
270
|
+
async detectBlocked(session) {
|
|
271
|
+
const pane = capturePaneText(session, 30);
|
|
272
|
+
return /(error|fatal|rate.?limit|quota exceeded)/i.test(pane);
|
|
273
|
+
}
|
|
274
|
+
async sendFix(session, fixPrompt, _resumeSessionId) {
|
|
275
|
+
const escaped = fixPrompt.replace(/'/g, "'\\''");
|
|
276
|
+
tmux(['send-keys', '-t', session, escaped, 'Enter']);
|
|
277
|
+
}
|
|
278
|
+
async resolveConflict(session, worktree, branch, _resumeSessionId) {
|
|
279
|
+
const instruction = [
|
|
280
|
+
`There is a merge conflict on branch ${branch}.`,
|
|
281
|
+
`Working directory: ${worktree}`,
|
|
282
|
+
'Please resolve the conflict:',
|
|
283
|
+
`1. Run: git fetch origin && git rebase origin/${this.config.GITLAB_MERGE_BRANCH}`,
|
|
284
|
+
'2. Resolve any conflicts in the affected files',
|
|
285
|
+
'3. Run: git add . && git rebase --continue',
|
|
286
|
+
'4. Run: git push --force-with-lease',
|
|
287
|
+
].join('\n');
|
|
288
|
+
tmux(['send-keys', '-t', session, instruction, 'Enter']);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Release a worker session after task completion.
|
|
292
|
+
*
|
|
293
|
+
* WORKER_SESSION_REUSE=true: do nothing — keep Codex running so the
|
|
294
|
+
* next task can hot-reuse the session via /clear + cd.
|
|
295
|
+
*
|
|
296
|
+
* WORKER_SESSION_REUSE=false: quit Codex but keep tmux session alive.
|
|
297
|
+
*/
|
|
298
|
+
async release(session) {
|
|
299
|
+
if (!sessionExists(session))
|
|
300
|
+
return;
|
|
301
|
+
if (this.config.WORKER_SESSION_REUSE) {
|
|
302
|
+
// Keep everything alive — next launch() will /clear + /cd + send prompt
|
|
303
|
+
process.stderr.write(`[codex-worker] Session ${session} kept alive for reuse\n`);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
// Quit Codex but keep tmux session
|
|
307
|
+
tmux(['send-keys', '-t', session, '/quit', 'Enter']);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Force-stop a worker session (error recovery, cleanup).
|
|
311
|
+
* Always quits Codex and kills the tmux session.
|
|
312
|
+
*/
|
|
313
|
+
async stop(session) {
|
|
314
|
+
if (!sessionExists(session))
|
|
315
|
+
return;
|
|
316
|
+
tmux(['send-keys', '-t', session, '/quit', 'Enter']);
|
|
317
|
+
for (let i = 0; i < 5; i++) {
|
|
318
|
+
await this.sleep(1_000);
|
|
319
|
+
if (!sessionExists(session))
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
tmux(['kill-session', '-t', session]);
|
|
323
|
+
}
|
|
324
|
+
async collectSummary(session) {
|
|
325
|
+
return capturePaneText(session, 100);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Dismiss the rate-limit model switch prompt by selecting "Keep current model".
|
|
329
|
+
*
|
|
330
|
+
* The prompt shows:
|
|
331
|
+
* › 1. Switch to gpt-5.1-codex-mini
|
|
332
|
+
* 2. Keep current model
|
|
333
|
+
* 3. Keep current model (never show again)
|
|
334
|
+
*
|
|
335
|
+
* Strategy: press Down once to select option 2, then Enter.
|
|
336
|
+
*/
|
|
337
|
+
dismissRateLimitPrompt(session) {
|
|
338
|
+
// Navigate to "Keep current model" (option 2)
|
|
339
|
+
tmux(['send-keys', '-t', session, 'Down']);
|
|
340
|
+
// Small delay to let the UI register the selection
|
|
341
|
+
tmux(['send-keys', '-t', session, '']);
|
|
342
|
+
// Confirm selection
|
|
343
|
+
setTimeout(() => {
|
|
344
|
+
tmux(['send-keys', '-t', session, 'Enter']);
|
|
345
|
+
}, 500);
|
|
346
|
+
}
|
|
347
|
+
sleep(ms) {
|
|
348
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=CodexTmuxProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexTmuxProvider.js","sourceRoot":"","sources":["../../src/providers/CodexTmuxProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,71 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
constructor(config: ProjectConfig);
|
|
7
|
-
prepareEnv(worktree: string, _seq: string): Promise<void>;
|
|
8
|
-
/**
|
|
9
|
-
* Launch Codex in a tmux session (interactive mode).
|
|
10
|
-
* Handles session reuse and update prompt auto-skip.
|
|
11
|
-
*/
|
|
12
|
-
launch(session: string, worktree: string): Promise<void>;
|
|
13
|
-
/**
|
|
14
|
-
* Wait for Codex to be ready.
|
|
15
|
-
* Must handle the update prompt blocker (auto-skip).
|
|
16
|
-
*/
|
|
17
|
-
waitReady(session: string, timeoutMs?: number): Promise<boolean>;
|
|
18
|
-
/**
|
|
19
|
-
* Send task prompt to Codex via tmux paste-buffer.
|
|
20
|
-
*/
|
|
21
|
-
sendTask(session: string, promptFile: string): Promise<void>;
|
|
22
|
-
inspect(session: string): Promise<{
|
|
23
|
-
alive: boolean;
|
|
24
|
-
paneText: string;
|
|
25
|
-
}>;
|
|
26
|
-
/**
|
|
27
|
-
* Codex with --dangerously-bypass-approvals-and-sandbox doesn't need confirmation.
|
|
28
|
-
* But if run without that flag, it may show approval prompts.
|
|
29
|
-
* For now, always return not waiting since we use bypass mode.
|
|
30
|
-
*/
|
|
31
|
-
detectWaiting(session: string): Promise<{
|
|
32
|
-
waiting: boolean;
|
|
33
|
-
destructive: boolean;
|
|
34
|
-
prompt: string;
|
|
35
|
-
}>;
|
|
36
|
-
/**
|
|
37
|
-
* Detect completion by checking if Codex returned to › prompt after working.
|
|
38
|
-
*/
|
|
39
|
-
detectCompleted(session: string, logDir: string, _branch: string): Promise<WorkerStatus>;
|
|
40
|
-
detectBlocked(session: string): Promise<boolean>;
|
|
41
|
-
sendFix(session: string, fixPrompt: string): Promise<void>;
|
|
42
|
-
resolveConflict(session: string, worktree: string, branch: string): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Release a worker session after task completion.
|
|
45
|
-
*
|
|
46
|
-
* WORKER_SESSION_REUSE=true: do nothing — keep Codex running so the
|
|
47
|
-
* next task can hot-reuse the session via /clear + cd.
|
|
48
|
-
*
|
|
49
|
-
* WORKER_SESSION_REUSE=false: quit Codex but keep tmux session alive.
|
|
50
|
-
*/
|
|
51
|
-
release(session: string): Promise<void>;
|
|
52
|
-
/**
|
|
53
|
-
* Force-stop a worker session (error recovery, cleanup).
|
|
54
|
-
* Always quits Codex and kills the tmux session.
|
|
55
|
-
*/
|
|
56
|
-
stop(session: string): Promise<void>;
|
|
57
|
-
collectSummary(session: string): Promise<string>;
|
|
58
|
-
/**
|
|
59
|
-
* Dismiss the rate-limit model switch prompt by selecting "Keep current model".
|
|
60
|
-
*
|
|
61
|
-
* The prompt shows:
|
|
62
|
-
* › 1. Switch to gpt-5.1-codex-mini
|
|
63
|
-
* 2. Keep current model
|
|
64
|
-
* 3. Keep current model (never show again)
|
|
65
|
-
*
|
|
66
|
-
* Strategy: press Down once to select option 2, then Enter.
|
|
67
|
-
*/
|
|
68
|
-
private dismissRateLimitPrompt;
|
|
69
|
-
private sleep;
|
|
70
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Use CodexTmuxProvider or CodexExecProvider directly.
|
|
3
|
+
* This re-export exists for backward compatibility with existing imports.
|
|
4
|
+
*/
|
|
5
|
+
export { CodexTmuxProvider as CodexWorkerProvider } from './CodexTmuxProvider.js';
|
|
71
6
|
//# sourceMappingURL=CodexWorkerProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexWorkerProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CodexWorkerProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CodexWorkerProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CodexWorkerProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
|