@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.
Files changed (62) hide show
  1. package/README.md +63 -23
  2. package/dist/commands/workerDashboard.d.ts.map +1 -1
  3. package/dist/commands/workerDashboard.js +39 -11
  4. package/dist/commands/workerDashboard.js.map +1 -1
  5. package/dist/core/config.d.ts +1 -0
  6. package/dist/core/config.d.ts.map +1 -1
  7. package/dist/core/config.js +1 -0
  8. package/dist/core/config.js.map +1 -1
  9. package/dist/core/state.d.ts +10 -0
  10. package/dist/core/state.d.ts.map +1 -1
  11. package/dist/core/state.js +5 -0
  12. package/dist/core/state.js.map +1 -1
  13. package/dist/engines/CloseoutEngine.d.ts.map +1 -1
  14. package/dist/engines/CloseoutEngine.js +79 -28
  15. package/dist/engines/CloseoutEngine.js.map +1 -1
  16. package/dist/engines/ExecutionEngine.d.ts +5 -0
  17. package/dist/engines/ExecutionEngine.d.ts.map +1 -1
  18. package/dist/engines/ExecutionEngine.js +80 -16
  19. package/dist/engines/ExecutionEngine.js.map +1 -1
  20. package/dist/engines/MonitorEngine.d.ts.map +1 -1
  21. package/dist/engines/MonitorEngine.js +6 -1
  22. package/dist/engines/MonitorEngine.js.map +1 -1
  23. package/dist/interfaces/WorkerProvider.d.ts +68 -15
  24. package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
  25. package/dist/models/types.d.ts +3 -1
  26. package/dist/models/types.d.ts.map +1 -1
  27. package/dist/providers/ClaudePrintProvider.d.ts +54 -0
  28. package/dist/providers/ClaudePrintProvider.d.ts.map +1 -0
  29. package/dist/providers/ClaudePrintProvider.js +279 -0
  30. package/dist/providers/ClaudePrintProvider.js.map +1 -0
  31. package/dist/providers/ClaudeTmuxProvider.d.ts +94 -0
  32. package/dist/providers/ClaudeTmuxProvider.d.ts.map +1 -0
  33. package/dist/providers/ClaudeTmuxProvider.js +331 -0
  34. package/dist/providers/ClaudeTmuxProvider.js.map +1 -0
  35. package/dist/providers/ClaudeWorkerProvider.d.ts +5 -93
  36. package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
  37. package/dist/providers/ClaudeWorkerProvider.js +3 -303
  38. package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
  39. package/dist/providers/CodexExecProvider.d.ts +36 -0
  40. package/dist/providers/CodexExecProvider.d.ts.map +1 -0
  41. package/dist/providers/CodexExecProvider.js +238 -0
  42. package/dist/providers/CodexExecProvider.js.map +1 -0
  43. package/dist/providers/CodexTmuxProvider.d.ts +71 -0
  44. package/dist/providers/CodexTmuxProvider.d.ts.map +1 -0
  45. package/dist/providers/CodexTmuxProvider.js +351 -0
  46. package/dist/providers/CodexTmuxProvider.js.map +1 -0
  47. package/dist/providers/CodexWorkerProvider.d.ts +5 -70
  48. package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
  49. package/dist/providers/CodexWorkerProvider.js +3 -328
  50. package/dist/providers/CodexWorkerProvider.js.map +1 -1
  51. package/dist/providers/outputParser.d.ts +50 -0
  52. package/dist/providers/outputParser.d.ts.map +1 -0
  53. package/dist/providers/outputParser.js +219 -0
  54. package/dist/providers/outputParser.js.map +1 -0
  55. package/dist/providers/registry.d.ts.map +1 -1
  56. package/dist/providers/registry.js +18 -6
  57. package/dist/providers/registry.js.map +1 -1
  58. package/dist/providers/streamRenderer.d.ts +13 -0
  59. package/dist/providers/streamRenderer.d.ts.map +1 -0
  60. package/dist/providers/streamRenderer.js +106 -0
  61. package/dist/providers/streamRenderer.js.map +1 -0
  62. 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
- import type { ProjectConfig } from '../core/config.js';
2
- import type { WorkerProvider } from '../interfaces/WorkerProvider.js';
3
- import type { WorkerStatus } from '../models/types.js';
4
- export declare class CodexWorkerProvider 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): 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":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0EvD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,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,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC9D;;;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;IAe5D,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,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1D,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavF;;;;;;;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"}
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"}