@coralai/sps-cli 0.22.0 → 0.23.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 (41) hide show
  1. package/dist/commands/acpCommand.d.ts.map +1 -1
  2. package/dist/commands/acpCommand.js +62 -1
  3. package/dist/commands/acpCommand.js.map +1 -1
  4. package/dist/commands/workerDashboard.d.ts.map +1 -1
  5. package/dist/commands/workerDashboard.js +21 -5
  6. package/dist/commands/workerDashboard.js.map +1 -1
  7. package/dist/core/config.d.ts +1 -1
  8. package/dist/core/config.d.ts.map +1 -1
  9. package/dist/core/state.d.ts +1 -1
  10. package/dist/core/state.d.ts.map +1 -1
  11. package/dist/main.js +1 -1
  12. package/dist/main.js.map +1 -1
  13. package/dist/manager/pty-session-manager.d.ts +64 -0
  14. package/dist/manager/pty-session-manager.d.ts.map +1 -0
  15. package/dist/manager/pty-session-manager.js +241 -0
  16. package/dist/manager/pty-session-manager.js.map +1 -0
  17. package/dist/manager/pty-session.d.ts +62 -0
  18. package/dist/manager/pty-session.d.ts.map +1 -0
  19. package/dist/manager/pty-session.js +148 -0
  20. package/dist/manager/pty-session.js.map +1 -0
  21. package/dist/models/acp.d.ts +8 -0
  22. package/dist/models/acp.d.ts.map +1 -1
  23. package/dist/providers/ACPWorkerRuntime.d.ts.map +1 -1
  24. package/dist/providers/ACPWorkerRuntime.js +4 -0
  25. package/dist/providers/ACPWorkerRuntime.js.map +1 -1
  26. package/dist/providers/PTYAgentRuntime.d.ts +49 -0
  27. package/dist/providers/PTYAgentRuntime.d.ts.map +1 -0
  28. package/dist/providers/PTYAgentRuntime.js +287 -0
  29. package/dist/providers/PTYAgentRuntime.js.map +1 -0
  30. package/dist/providers/parsers/claude-parser.d.ts +17 -0
  31. package/dist/providers/parsers/claude-parser.d.ts.map +1 -0
  32. package/dist/providers/parsers/claude-parser.js +112 -0
  33. package/dist/providers/parsers/claude-parser.js.map +1 -0
  34. package/dist/providers/parsers/codex-parser.d.ts +12 -0
  35. package/dist/providers/parsers/codex-parser.d.ts.map +1 -0
  36. package/dist/providers/parsers/codex-parser.js +77 -0
  37. package/dist/providers/parsers/codex-parser.js.map +1 -0
  38. package/dist/providers/registry.d.ts.map +1 -1
  39. package/dist/providers/registry.js +5 -0
  40. package/dist/providers/registry.js.map +1 -1
  41. package/package.json +5 -1
@@ -0,0 +1,287 @@
1
+ import { readACPState, writeACPState } from '../core/acpState.js';
2
+ import { PTYSessionManager } from '../manager/pty-session-manager.js';
3
+ function now() {
4
+ return new Date().toISOString();
5
+ }
6
+ function previewPrompt(prompt) {
7
+ const oneLine = prompt.replace(/\s+/g, ' ').trim();
8
+ return oneLine.length > 120 ? `${oneLine.slice(0, 117)}...` : oneLine;
9
+ }
10
+ // Shared singleton per tick process
11
+ let sharedManager = null;
12
+ export function getSharedPTYManager() {
13
+ if (!sharedManager) {
14
+ sharedManager = new PTYSessionManager();
15
+ }
16
+ return sharedManager;
17
+ }
18
+ export class PTYAgentRuntime {
19
+ ctx;
20
+ manager;
21
+ notifier = null;
22
+ constructor(ctx, manager, notifier) {
23
+ this.ctx = ctx;
24
+ this.manager = manager || getSharedPTYManager();
25
+ this.notifier = notifier || null;
26
+ }
27
+ /** Set notifier for waiting_input push notifications */
28
+ setNotifier(notifier) {
29
+ this.notifier = notifier;
30
+ }
31
+ async ensureSession(slot, tool, cwdOverride) {
32
+ const normalizedSlot = this.normalizeSlot(slot);
33
+ const selectedTool = tool || this.defaultTool();
34
+ const cwd = cwdOverride || this.ctx.paths.repoDir;
35
+ const session = await this.manager.ensureSession({
36
+ project: this.ctx.projectName,
37
+ slot: normalizedSlot,
38
+ tool: selectedTool,
39
+ cwd,
40
+ logsDir: this.ctx.paths.logsDir,
41
+ });
42
+ // Hook waiting-input events for persistence + notification
43
+ const ptySession = this.manager.getSession(this.ctx.projectName, normalizedSlot);
44
+ if (ptySession) {
45
+ ptySession.removeAllListeners('waiting-input');
46
+ ptySession.on('waiting-input', (event) => {
47
+ this.handleWaitingInput(normalizedSlot, event);
48
+ });
49
+ // Clear pending when state leaves waiting_input
50
+ ptySession.on('state-change', (newState) => {
51
+ if (newState !== 'waiting_input') {
52
+ this.clearPendingInput(normalizedSlot);
53
+ }
54
+ });
55
+ }
56
+ const record = this.buildSessionRecord(normalizedSlot, session, selectedTool, cwd);
57
+ // Persist to acp-state.json
58
+ const state = readACPState(this.ctx.paths.acpStateFile);
59
+ state.sessions[normalizedSlot] = record;
60
+ state.updatedAt = now();
61
+ state.updatedBy = 'pty-ensure';
62
+ writeACPState(this.ctx.paths.acpStateFile, state, state.updatedBy);
63
+ return record;
64
+ }
65
+ async startRun(slot, prompt, tool, cwdOverride) {
66
+ const normalizedSlot = this.normalizeSlot(slot);
67
+ const selectedTool = tool || this.defaultTool();
68
+ const cwd = cwdOverride || this.ctx.paths.repoDir;
69
+ // Ensure session exists first
70
+ let session = this.manager.getSession(this.ctx.projectName, normalizedSlot);
71
+ if (!session || !session.isAlive()) {
72
+ await this.ensureSession(slot, selectedTool, cwd);
73
+ session = this.manager.getSession(this.ctx.projectName, normalizedSlot);
74
+ }
75
+ if (!session)
76
+ throw new Error(`Failed to create session for ${normalizedSlot}`);
77
+ const { runId } = this.manager.startRun(this.ctx.projectName, normalizedSlot, prompt);
78
+ const info = this.manager.inspect(this.ctx.projectName, normalizedSlot);
79
+ const record = this.buildSessionRecord(normalizedSlot, info, selectedTool, cwd, {
80
+ runId,
81
+ status: 'running',
82
+ promptPreview: previewPrompt(prompt),
83
+ startedAt: now(),
84
+ });
85
+ // Persist
86
+ const state = readACPState(this.ctx.paths.acpStateFile);
87
+ state.sessions[normalizedSlot] = record;
88
+ state.updatedAt = now();
89
+ state.updatedBy = 'pty-start-run';
90
+ writeACPState(this.ctx.paths.acpStateFile, state, state.updatedBy);
91
+ return record;
92
+ }
93
+ async resumeRun(slot, prompt) {
94
+ const normalizedSlot = this.normalizeSlot(slot);
95
+ const session = this.manager.getSession(this.ctx.projectName, normalizedSlot);
96
+ if (!session || !session.isAlive()) {
97
+ throw new Error(`No live PTY session for ${normalizedSlot}`);
98
+ }
99
+ const { runId } = this.manager.resumeRun(this.ctx.projectName, normalizedSlot, prompt);
100
+ const info = this.manager.inspect(this.ctx.projectName, normalizedSlot);
101
+ const tool = session.tool;
102
+ const record = this.buildSessionRecord(normalizedSlot, info, tool, session.cwd, {
103
+ runId,
104
+ status: 'running',
105
+ promptPreview: previewPrompt(prompt),
106
+ startedAt: now(),
107
+ });
108
+ const state = readACPState(this.ctx.paths.acpStateFile);
109
+ state.sessions[normalizedSlot] = record;
110
+ state.updatedAt = now();
111
+ state.updatedBy = 'pty-resume-run';
112
+ writeACPState(this.ctx.paths.acpStateFile, state, state.updatedBy);
113
+ return record;
114
+ }
115
+ async inspect(slot) {
116
+ const state = readACPState(this.ctx.paths.acpStateFile);
117
+ if (slot) {
118
+ const normalizedSlot = this.normalizeSlot(slot);
119
+ const info = this.manager.inspect(this.ctx.projectName, normalizedSlot);
120
+ if (info) {
121
+ this.syncSessionRecord(state, normalizedSlot, info);
122
+ }
123
+ }
124
+ else {
125
+ // Inspect all slots
126
+ for (const [slotName, record] of Object.entries(state.sessions)) {
127
+ const info = this.manager.inspect(this.ctx.projectName, slotName);
128
+ if (info) {
129
+ this.syncSessionRecord(state, slotName, info);
130
+ }
131
+ else {
132
+ // Session gone — mark offline
133
+ record.sessionState = 'offline';
134
+ record.status = 'idle';
135
+ record.updatedAt = now();
136
+ }
137
+ }
138
+ }
139
+ state.updatedAt = now();
140
+ state.updatedBy = 'pty-inspect';
141
+ writeACPState(this.ctx.paths.acpStateFile, state, state.updatedBy);
142
+ return state;
143
+ }
144
+ async stopSession(slot) {
145
+ const normalizedSlot = this.normalizeSlot(slot);
146
+ this.manager.killSession(this.ctx.projectName, normalizedSlot);
147
+ const state = readACPState(this.ctx.paths.acpStateFile);
148
+ if (state.sessions[normalizedSlot]) {
149
+ state.sessions[normalizedSlot].sessionState = 'offline';
150
+ state.sessions[normalizedSlot].status = 'idle';
151
+ state.sessions[normalizedSlot].updatedAt = now();
152
+ }
153
+ state.updatedAt = now();
154
+ state.updatedBy = 'pty-stop';
155
+ writeACPState(this.ctx.paths.acpStateFile, state, state.updatedBy);
156
+ }
157
+ /**
158
+ * Wait for the current run on a slot to complete.
159
+ */
160
+ async waitForRunComplete(slot, timeoutMs) {
161
+ const normalizedSlot = this.normalizeSlot(slot);
162
+ return this.manager.waitForRunComplete(this.ctx.projectName, normalizedSlot, timeoutMs);
163
+ }
164
+ /**
165
+ * Send a response to a waiting_input prompt.
166
+ */
167
+ respond(slot, response) {
168
+ const normalizedSlot = this.normalizeSlot(slot);
169
+ this.manager.respond(this.ctx.projectName, normalizedSlot, response);
170
+ }
171
+ /**
172
+ * Get the underlying PTYSessionManager (for direct access if needed).
173
+ */
174
+ getManager() {
175
+ return this.manager;
176
+ }
177
+ // ─── Waiting Input Handling ─────────────────────────────────
178
+ handleWaitingInput(slot, event) {
179
+ const pending = {
180
+ type: event.type,
181
+ prompt: event.prompt,
182
+ options: event.options,
183
+ dangerous: event.dangerous,
184
+ timestamp: event.timestamp,
185
+ };
186
+ // Persist to acp-state.json
187
+ try {
188
+ const state = readACPState(this.ctx.paths.acpStateFile);
189
+ if (state.sessions[slot]) {
190
+ state.sessions[slot].pendingInput = pending;
191
+ state.sessions[slot].updatedAt = now();
192
+ if (state.sessions[slot].currentRun) {
193
+ state.sessions[slot].currentRun.status = 'waiting_input';
194
+ state.sessions[slot].currentRun.updatedAt = now();
195
+ }
196
+ }
197
+ writeACPState(this.ctx.paths.acpStateFile, state, 'pty-waiting-input');
198
+ }
199
+ catch { /* best effort */ }
200
+ // Log + Notify
201
+ const dangerTag = event.dangerous ? ' DANGEROUS' : '';
202
+ const msg = `[${this.ctx.projectName}] ${slot} waiting for input${dangerTag}: ${event.prompt}`;
203
+ process.stderr.write(`[pty-runtime] ${msg}\n`);
204
+ if (this.notifier) {
205
+ if (event.dangerous) {
206
+ this.notifier.sendWarning(msg).catch(() => { });
207
+ }
208
+ else {
209
+ this.notifier.send(msg, 'warning').catch(() => { });
210
+ }
211
+ }
212
+ }
213
+ clearPendingInput(slot) {
214
+ try {
215
+ const state = readACPState(this.ctx.paths.acpStateFile);
216
+ if (state.sessions[slot]?.pendingInput) {
217
+ state.sessions[slot].pendingInput = null;
218
+ state.sessions[slot].updatedAt = now();
219
+ writeACPState(this.ctx.paths.acpStateFile, state, 'pty-clear-input');
220
+ }
221
+ }
222
+ catch { /* best effort */ }
223
+ }
224
+ // ─── Internal ─────────────────────────────────────────────
225
+ normalizeSlot(slot) {
226
+ return slot.startsWith('worker-') ? slot : `worker-${slot}`;
227
+ }
228
+ defaultTool() {
229
+ return (this.ctx.config.raw.ACP_AGENT || this.ctx.config.WORKER_TOOL || 'claude');
230
+ }
231
+ buildSessionRecord(slot, info, tool, cwd, run) {
232
+ const isSessionInfo = 'state' in info;
233
+ const state = isSessionInfo ? info.state : info.getState();
234
+ const pid = isSessionInfo ? info.pid : info.pid;
235
+ const sessionId = isSessionInfo ? info.sessionId : info.sessionId;
236
+ const alive = isSessionInfo ? info.alive : info.isAlive();
237
+ const buffer = isSessionInfo ? info.buffer : info.getBuffer(30);
238
+ const sessionState = !alive ? 'offline' :
239
+ state === 'busy' || state === 'waiting_input' ? 'busy' :
240
+ state === 'ready' ? 'ready' :
241
+ 'booting';
242
+ const slotStatus = state === 'busy' ? 'active' :
243
+ state === 'waiting_input' ? 'active' :
244
+ 'idle';
245
+ return {
246
+ slot,
247
+ tool,
248
+ sessionId,
249
+ sessionName: sessionId,
250
+ cwd,
251
+ status: slotStatus,
252
+ sessionState,
253
+ currentRun: run ? {
254
+ runId: run.runId,
255
+ status: run.status,
256
+ promptPreview: run.promptPreview,
257
+ startedAt: run.startedAt,
258
+ updatedAt: now(),
259
+ completedAt: null,
260
+ } : null,
261
+ pendingInput: null,
262
+ createdAt: now(),
263
+ updatedAt: now(),
264
+ lastSeenAt: now(),
265
+ lastPaneText: buffer,
266
+ };
267
+ }
268
+ syncSessionRecord(state, slotName, info) {
269
+ const existing = state.sessions[slotName];
270
+ if (!existing)
271
+ return;
272
+ existing.sessionState = info.alive
273
+ ? (info.state === 'busy' || info.state === 'waiting_input' ? 'busy' : info.state === 'ready' ? 'ready' : 'booting')
274
+ : 'offline';
275
+ existing.status = info.state === 'busy' || info.state === 'waiting_input' ? 'active' : 'idle';
276
+ existing.lastSeenAt = now();
277
+ existing.lastPaneText = info.buffer;
278
+ existing.updatedAt = now();
279
+ // Update run status if run completed
280
+ if (existing.currentRun && info.state === 'ready' && existing.status === 'idle') {
281
+ existing.currentRun.status = 'completed';
282
+ existing.currentRun.completedAt = now();
283
+ existing.currentRun.updatedAt = now();
284
+ }
285
+ }
286
+ }
287
+ //# sourceMappingURL=PTYAgentRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PTYAgentRuntime.js","sourceRoot":"","sources":["../../src/providers/PTYAgentRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ClaudeOutputParser — real-time stream parser for Claude Code interactive output.
3
+ *
4
+ * Detects state transitions by matching patterns in the stripped-ANSI text stream.
5
+ * Fed by PTYSession.onData → stripAnsi → parser.feed()
6
+ */
7
+ import type { PTYSession, OutputParser } from '../../manager/pty-session.js';
8
+ export declare class ClaudeOutputParser implements OutputParser {
9
+ private accumulated;
10
+ private lastPromptAt;
11
+ reset(): void;
12
+ feed(chunk: string, session: PTYSession): void;
13
+ private hasPrompt;
14
+ private hasPromptInChunk;
15
+ private hasBusyIndicator;
16
+ }
17
+ //# sourceMappingURL=claude-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-parser.d.ts","sourceRoot":"","sources":["../../../src/providers/parsers/claude-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAqB,MAAM,8BAA8B,CAAC;AAIhG,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,YAAY,CAAK;IAEzB,KAAK,IAAI,IAAI;IAKb,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAqG9C,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,gBAAgB;CAIzB"}
@@ -0,0 +1,112 @@
1
+ const DANGEROUS_RE = /rm\s+-rf|git\s+push\s+--force|DROP\s+TABLE|DELETE\s+FROM|TRUNCATE|format\s+c:|dd\s+if=/i;
2
+ export class ClaudeOutputParser {
3
+ accumulated = '';
4
+ lastPromptAt = 0;
5
+ reset() {
6
+ this.accumulated = '';
7
+ this.lastPromptAt = 0;
8
+ }
9
+ feed(chunk, session) {
10
+ this.accumulated += chunk;
11
+ const state = session.getState();
12
+ // ── booting → ready (prompt appears for the first time) ──
13
+ if (state === 'booting') {
14
+ // Check both accumulated and current chunk for prompt
15
+ if (this.hasPrompt() || this.hasPromptInChunk(chunk)) {
16
+ session.setState('ready');
17
+ this.lastPromptAt = Date.now();
18
+ this.accumulated = '';
19
+ return;
20
+ }
21
+ // Also detect "bypass permissions" as ready indicator
22
+ if (/bypass permissions/i.test(this.accumulated)) {
23
+ session.setState('ready');
24
+ this.lastPromptAt = Date.now();
25
+ this.accumulated = '';
26
+ return;
27
+ }
28
+ // Trust prompt during boot
29
+ if (this.accumulated.includes('Yes, I trust this folder') ||
30
+ this.accumulated.includes('trust this folder')) {
31
+ session.setState('waiting_input');
32
+ session.emit('waiting-input', {
33
+ type: 'trust',
34
+ prompt: 'Trust this folder?',
35
+ options: ['Yes', 'No'],
36
+ dangerous: false,
37
+ timestamp: new Date().toISOString(),
38
+ });
39
+ this.accumulated = '';
40
+ return;
41
+ }
42
+ return;
43
+ }
44
+ // ── Permission / confirmation prompts (any state) ──
45
+ const permMatch = this.accumulated.match(/\? Allow[:\s]+(.+?)(?:\n|$)/);
46
+ if (permMatch) {
47
+ const promptText = permMatch[1].trim();
48
+ session.setState('waiting_input');
49
+ session.emit('waiting-input', {
50
+ type: 'permission',
51
+ prompt: promptText,
52
+ dangerous: DANGEROUS_RE.test(promptText),
53
+ timestamp: new Date().toISOString(),
54
+ });
55
+ this.accumulated = '';
56
+ return;
57
+ }
58
+ if (/Enter to confirm|Esc to cancel|y\/n\]?\s*$/i.test(this.accumulated)) {
59
+ const lines = this.accumulated.split('\n').filter(Boolean);
60
+ const promptText = lines[lines.length - 1]?.trim() || 'Confirmation required';
61
+ session.setState('waiting_input');
62
+ session.emit('waiting-input', {
63
+ type: 'confirmation',
64
+ prompt: promptText,
65
+ dangerous: DANGEROUS_RE.test(this.accumulated),
66
+ timestamp: new Date().toISOString(),
67
+ });
68
+ this.accumulated = '';
69
+ return;
70
+ }
71
+ // ── waiting_input → ready (user responded, prompt came back) ──
72
+ if (state === 'waiting_input' && this.hasPrompt()) {
73
+ session.setState('ready');
74
+ this.lastPromptAt = Date.now();
75
+ this.accumulated = '';
76
+ return;
77
+ }
78
+ // ── ready → busy (content appearing after prompt = Worker started working) ──
79
+ if (state === 'ready' && this.hasBusyIndicator(chunk)) {
80
+ session.setState('busy');
81
+ }
82
+ // ── busy → ready (prompt reappeared = run completed) ──
83
+ if (state === 'busy' && (this.hasPrompt() || this.hasPromptInChunk(chunk))) {
84
+ const runId = session.getRunId();
85
+ if (runId) {
86
+ session.emit('run-completed', runId);
87
+ }
88
+ session.setState('ready');
89
+ this.lastPromptAt = Date.now();
90
+ this.accumulated = '';
91
+ return;
92
+ }
93
+ // Prevent memory leak
94
+ if (this.accumulated.length > 50_000) {
95
+ this.accumulated = this.accumulated.slice(-10_000);
96
+ }
97
+ }
98
+ // ── Pattern matchers ──
99
+ hasPrompt() {
100
+ // Claude Code prompt: ❯ or > at end of a line, or bypass permissions indicator
101
+ return /[❯>]\s*$/m.test(this.accumulated) || /bypass permissions/i.test(this.accumulated);
102
+ }
103
+ hasPromptInChunk(chunk) {
104
+ // Check raw chunk for prompt characters (may have ANSI around them)
105
+ return chunk.includes('❯') || chunk.includes('bypass permissions');
106
+ }
107
+ hasBusyIndicator(chunk) {
108
+ // Spinner, tool calls, or working indicators
109
+ return /[●◐◑◒◓]|Working|Thinking|Read|Write|Bash|Edit|Search|Glob|Agent/.test(chunk);
110
+ }
111
+ }
112
+ //# sourceMappingURL=claude-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-parser.js","sourceRoot":"","sources":["../../../src/providers/parsers/claude-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CodexOutputParser — real-time stream parser for Codex CLI interactive output.
3
+ */
4
+ import type { PTYSession, OutputParser } from '../../manager/pty-session.js';
5
+ export declare class CodexOutputParser implements OutputParser {
6
+ private accumulated;
7
+ reset(): void;
8
+ feed(chunk: string, session: PTYSession): void;
9
+ private hasPrompt;
10
+ private hasBusyIndicator;
11
+ }
12
+ //# sourceMappingURL=codex-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-parser.d.ts","sourceRoot":"","sources":["../../../src/providers/parsers/codex-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAqB,MAAM,8BAA8B,CAAC;AAIhG,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,WAAW,CAAM;IAEzB,KAAK,IAAI,IAAI;IAIb,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAsE9C,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;CAGzB"}
@@ -0,0 +1,77 @@
1
+ const DANGEROUS_RE = /rm\s+-rf|git\s+push\s+--force|DROP\s+TABLE|DELETE\s+FROM|TRUNCATE/i;
2
+ export class CodexOutputParser {
3
+ accumulated = '';
4
+ reset() {
5
+ this.accumulated = '';
6
+ }
7
+ feed(chunk, session) {
8
+ this.accumulated += chunk;
9
+ const state = session.getState();
10
+ // ── booting → ready ──
11
+ if (state === 'booting') {
12
+ if (this.hasPrompt()) {
13
+ session.setState('ready');
14
+ this.accumulated = '';
15
+ return;
16
+ }
17
+ // Trust/sandbox prompt during boot
18
+ if (/trust|sandbox|approve/i.test(this.accumulated) && /\[y\/n\]|Enter/i.test(this.accumulated)) {
19
+ session.setState('waiting_input');
20
+ session.emit('waiting-input', {
21
+ type: 'trust',
22
+ prompt: 'Codex trust/sandbox prompt',
23
+ dangerous: false,
24
+ timestamp: new Date().toISOString(),
25
+ });
26
+ this.accumulated = '';
27
+ return;
28
+ }
29
+ return;
30
+ }
31
+ // ── Permission prompts ──
32
+ const permMatch = this.accumulated.match(/\? (Allow|Approve|Execute)[:\s]+(.+?)(?:\n|$)/);
33
+ if (permMatch) {
34
+ const promptText = permMatch[2].trim();
35
+ session.setState('waiting_input');
36
+ session.emit('waiting-input', {
37
+ type: 'permission',
38
+ prompt: promptText,
39
+ dangerous: DANGEROUS_RE.test(promptText),
40
+ timestamp: new Date().toISOString(),
41
+ });
42
+ this.accumulated = '';
43
+ return;
44
+ }
45
+ // ── waiting_input → ready ──
46
+ if (state === 'waiting_input' && this.hasPrompt()) {
47
+ session.setState('ready');
48
+ this.accumulated = '';
49
+ return;
50
+ }
51
+ // ── ready → busy ──
52
+ if (state === 'ready' && this.hasBusyIndicator(chunk)) {
53
+ session.setState('busy');
54
+ }
55
+ // ── busy → ready (run completed) ──
56
+ if (state === 'busy' && this.hasPrompt()) {
57
+ const runId = session.getRunId();
58
+ if (runId) {
59
+ session.emit('run-completed', runId);
60
+ }
61
+ session.setState('ready');
62
+ this.accumulated = '';
63
+ return;
64
+ }
65
+ if (this.accumulated.length > 50_000) {
66
+ this.accumulated = this.accumulated.slice(-10_000);
67
+ }
68
+ }
69
+ hasPrompt() {
70
+ // Codex prompt: $ or ❯ at end of line
71
+ return /[$❯>]\s*$/.test(this.accumulated.trimEnd());
72
+ }
73
+ hasBusyIndicator(chunk) {
74
+ return /Running|Thinking|Executing|apply_patch|Searching|Reading/.test(chunk);
75
+ }
76
+ }
77
+ //# sourceMappingURL=codex-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-parser.js","sourceRoot":"","sources":["../../../src/providers/parsers/codex-parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAUlE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAOpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAkB1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAEpE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,CAE9D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,CAEpE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAUlE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAOpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAkB1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAEpE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,CAE9D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,CAMpE"}
@@ -8,6 +8,7 @@ import { CodexTmuxProvider } from './CodexTmuxProvider.js';
8
8
  import { GitLabRepoBackend } from './GitLabRepoBackend.js';
9
9
  import { MatrixNotifier } from './MatrixNotifier.js';
10
10
  import { ACPWorkerRuntime } from './ACPWorkerRuntime.js';
11
+ import { PTYAgentRuntime } from './PTYAgentRuntime.js';
11
12
  export function createTaskBackend(config) {
12
13
  switch (config.PM_TOOL) {
13
14
  case 'plane': return new PlaneTaskBackend(config);
@@ -40,6 +41,10 @@ export function createNotifier(config) {
40
41
  return new MatrixNotifier(config);
41
42
  }
42
43
  export function createAgentRuntime(ctx) {
44
+ const transport = ctx.config.raw.WORKER_TRANSPORT || 'acp';
45
+ if (transport === 'pty') {
46
+ return new PTYAgentRuntime(ctx);
47
+ }
43
48
  return new ACPWorkerRuntime(ctx);
44
49
  }
45
50
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IAE5C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACtD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,OAAO,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IAE5C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACtD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC3D,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-cli",
3
- "version": "0.22.0",
3
+ "version": "0.23.1",
4
4
  "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -35,5 +35,9 @@
35
35
  "@types/node": "^25.5.0",
36
36
  "tsx": "^4.21.0",
37
37
  "typescript": "^5.9.3"
38
+ },
39
+ "dependencies": {
40
+ "node-pty": "^1.1.0",
41
+ "strip-ansi": "^7.2.0"
38
42
  }
39
43
  }