@coralai/sps-cli 0.26.1 → 0.26.3

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 (100) hide show
  1. package/README-CN.md +6 -17
  2. package/README.md +5 -21
  3. package/dist/commands/tick.d.ts +0 -1
  4. package/dist/commands/tick.d.ts.map +1 -1
  5. package/dist/commands/tick.js +0 -18
  6. package/dist/commands/tick.js.map +1 -1
  7. package/dist/core/config.d.ts +0 -13
  8. package/dist/core/config.d.ts.map +1 -1
  9. package/dist/core/config.js +1 -14
  10. package/dist/core/config.js.map +1 -1
  11. package/dist/core/config.test.js +3 -33
  12. package/dist/core/config.test.js.map +1 -1
  13. package/dist/core/context.d.ts +0 -1
  14. package/dist/core/context.d.ts.map +1 -1
  15. package/dist/core/context.js +0 -1
  16. package/dist/core/context.js.map +1 -1
  17. package/dist/main.js +2 -2
  18. package/dist/main.js.map +1 -1
  19. package/package.json +1 -1
  20. package/project-template/conf.template +4 -13
  21. package/dist/core/acpState.d.ts +0 -4
  22. package/dist/core/acpState.d.ts.map +0 -1
  23. package/dist/core/acpState.js +0 -38
  24. package/dist/core/acpState.js.map +0 -1
  25. package/dist/core/ptyControl.d.ts +0 -27
  26. package/dist/core/ptyControl.d.ts.map +0 -1
  27. package/dist/core/ptyControl.js +0 -53
  28. package/dist/core/ptyControl.js.map +0 -1
  29. package/dist/interfaces/WorkerProvider.d.ts +0 -92
  30. package/dist/interfaces/WorkerProvider.d.ts.map +0 -1
  31. package/dist/interfaces/WorkerProvider.js +0 -2
  32. package/dist/interfaces/WorkerProvider.js.map +0 -1
  33. package/dist/manager/merge-mutex.d.ts +0 -20
  34. package/dist/manager/merge-mutex.d.ts.map +0 -1
  35. package/dist/manager/merge-mutex.js +0 -38
  36. package/dist/manager/merge-mutex.js.map +0 -1
  37. package/dist/manager/post-actions.d.ts +0 -81
  38. package/dist/manager/post-actions.d.ts.map +0 -1
  39. package/dist/manager/post-actions.js +0 -449
  40. package/dist/manager/post-actions.js.map +0 -1
  41. package/dist/manager/pty-session-manager.d.ts +0 -75
  42. package/dist/manager/pty-session-manager.d.ts.map +0 -1
  43. package/dist/manager/pty-session-manager.js +0 -343
  44. package/dist/manager/pty-session-manager.js.map +0 -1
  45. package/dist/manager/pty-session.d.ts +0 -77
  46. package/dist/manager/pty-session.d.ts.map +0 -1
  47. package/dist/manager/pty-session.js +0 -230
  48. package/dist/manager/pty-session.js.map +0 -1
  49. package/dist/manager/recovery.d.ts +0 -56
  50. package/dist/manager/recovery.d.ts.map +0 -1
  51. package/dist/manager/recovery.js +0 -510
  52. package/dist/manager/recovery.js.map +0 -1
  53. package/dist/providers/ClaudePrintProvider.d.ts +0 -54
  54. package/dist/providers/ClaudePrintProvider.d.ts.map +0 -1
  55. package/dist/providers/ClaudePrintProvider.js +0 -300
  56. package/dist/providers/ClaudePrintProvider.js.map +0 -1
  57. package/dist/providers/ClaudeTmuxProvider.d.ts +0 -94
  58. package/dist/providers/ClaudeTmuxProvider.d.ts.map +0 -1
  59. package/dist/providers/ClaudeTmuxProvider.js +0 -330
  60. package/dist/providers/ClaudeTmuxProvider.js.map +0 -1
  61. package/dist/providers/ClaudeWorkerProvider.d.ts +0 -6
  62. package/dist/providers/ClaudeWorkerProvider.d.ts.map +0 -1
  63. package/dist/providers/ClaudeWorkerProvider.js +0 -6
  64. package/dist/providers/ClaudeWorkerProvider.js.map +0 -1
  65. package/dist/providers/CodexExecProvider.d.ts +0 -36
  66. package/dist/providers/CodexExecProvider.d.ts.map +0 -1
  67. package/dist/providers/CodexExecProvider.js +0 -262
  68. package/dist/providers/CodexExecProvider.js.map +0 -1
  69. package/dist/providers/CodexTmuxProvider.d.ts +0 -71
  70. package/dist/providers/CodexTmuxProvider.d.ts.map +0 -1
  71. package/dist/providers/CodexTmuxProvider.js +0 -350
  72. package/dist/providers/CodexTmuxProvider.js.map +0 -1
  73. package/dist/providers/CodexWorkerProvider.d.ts +0 -6
  74. package/dist/providers/CodexWorkerProvider.d.ts.map +0 -1
  75. package/dist/providers/CodexWorkerProvider.js +0 -6
  76. package/dist/providers/CodexWorkerProvider.js.map +0 -1
  77. package/dist/providers/PTYAgentRuntime.d.ts +0 -54
  78. package/dist/providers/PTYAgentRuntime.d.ts.map +0 -1
  79. package/dist/providers/PTYAgentRuntime.js +0 -434
  80. package/dist/providers/PTYAgentRuntime.js.map +0 -1
  81. package/dist/providers/acpTmux.d.ts +0 -6
  82. package/dist/providers/acpTmux.d.ts.map +0 -1
  83. package/dist/providers/acpTmux.js +0 -51
  84. package/dist/providers/acpTmux.js.map +0 -1
  85. package/dist/providers/adapters/ClaudeACPAdapter.d.ts +0 -11
  86. package/dist/providers/adapters/ClaudeACPAdapter.d.ts.map +0 -1
  87. package/dist/providers/adapters/ClaudeACPAdapter.js +0 -150
  88. package/dist/providers/adapters/ClaudeACPAdapter.js.map +0 -1
  89. package/dist/providers/adapters/CodexACPAdapter.d.ts +0 -11
  90. package/dist/providers/adapters/CodexACPAdapter.d.ts.map +0 -1
  91. package/dist/providers/adapters/CodexACPAdapter.js +0 -158
  92. package/dist/providers/adapters/CodexACPAdapter.js.map +0 -1
  93. package/dist/providers/parsers/claude-parser.d.ts +0 -17
  94. package/dist/providers/parsers/claude-parser.d.ts.map +0 -1
  95. package/dist/providers/parsers/claude-parser.js +0 -112
  96. package/dist/providers/parsers/claude-parser.js.map +0 -1
  97. package/dist/providers/parsers/codex-parser.d.ts +0 -12
  98. package/dist/providers/parsers/codex-parser.d.ts.map +0 -1
  99. package/dist/providers/parsers/codex-parser.js +0 -91
  100. package/dist/providers/parsers/codex-parser.js.map +0 -1
@@ -1,150 +0,0 @@
1
- import { capturePaneText, pastePrompt, sessionExists, sleep, tmux } from '../acpTmux.js';
2
- const CLAUDE_READY = /bypass permissions|\? for shortcuts|tips for shortcuts/i;
3
- const CLAUDE_PROMPT = /❯\s*$/m;
4
- const CONFIRMATION_PROMPT = /(Do you want to proceed|y\/n|press enter|confirm|approve)/i;
5
- const THEME_PROMPT = /Choose the text style that looks best with your terminal|Dark mode|Light mode/i;
6
- const LOGIN_METHOD_PROMPT = /Select login method|Claude account with subscription|Anthropic Console account/i;
7
- const BROWSER_SIGNIN_PROMPT = /Opening browser to sign in|Browser didn't open\?|Paste code here if prompted/i;
8
- function isReady(text) {
9
- return CLAUDE_READY.test(text) || (/Claude Code/i.test(text) && CLAUDE_PROMPT.test(text));
10
- }
11
- function needsStartupInput(text) {
12
- return THEME_PROMPT.test(text) || LOGIN_METHOD_PROMPT.test(text) || BROWSER_SIGNIN_PROMPT.test(text);
13
- }
14
- export class ClaudeACPAdapter {
15
- async ensureSession(input) {
16
- const claudeCmd = 'claude --dangerously-skip-permissions';
17
- const ready = await this.bootstrapSession(input, claudeCmd);
18
- if (!ready) {
19
- const paneText = capturePaneText(input.sessionName, 80);
20
- if (needsStartupInput(paneText)) {
21
- return {
22
- sessionId: input.sessionName,
23
- sessionState: 'booting',
24
- paneText,
25
- lastSeenAt: new Date().toISOString(),
26
- };
27
- }
28
- throw new Error('Claude ACP session did not become ready within timeout');
29
- }
30
- return {
31
- sessionId: input.sessionName,
32
- sessionState: 'ready',
33
- paneText: capturePaneText(input.sessionName, 40),
34
- lastSeenAt: new Date().toISOString(),
35
- };
36
- }
37
- async startRun(input) {
38
- await pastePrompt(input.sessionName, input.prompt);
39
- for (let attempt = 0; attempt < 3; attempt++) {
40
- await sleep(2_000);
41
- const pane = capturePaneText(input.sessionName, 20);
42
- if (!isReady(pane)) {
43
- return {
44
- runId: `${Date.now()}`,
45
- runState: CONFIRMATION_PROMPT.test(pane) ? 'waiting_input' : 'running',
46
- paneText: pane,
47
- lastSeenAt: new Date().toISOString(),
48
- };
49
- }
50
- tmux(['send-keys', '-t', input.sessionName, 'Enter']);
51
- }
52
- return {
53
- runId: `${Date.now()}`,
54
- runState: 'running',
55
- paneText: capturePaneText(input.sessionName, 20),
56
- lastSeenAt: new Date().toISOString(),
57
- };
58
- }
59
- async inspectSession(input) {
60
- if (!sessionExists(input.sessionName)) {
61
- return { sessionState: 'offline', paneText: '', lastSeenAt: new Date().toISOString() };
62
- }
63
- const pane = capturePaneText(input.sessionName, 80);
64
- return {
65
- sessionState: isReady(pane) ? 'ready' : (needsStartupInput(pane) ? 'booting' : 'busy'),
66
- paneText: pane,
67
- lastSeenAt: new Date().toISOString(),
68
- };
69
- }
70
- async inspectRun(input) {
71
- if (!input.activeRun) {
72
- return { runState: null, paneText: '', lastSeenAt: new Date().toISOString() };
73
- }
74
- if (!sessionExists(input.sessionName)) {
75
- return { runState: 'lost', paneText: '', lastSeenAt: new Date().toISOString() };
76
- }
77
- const pane = capturePaneText(input.sessionName, 120);
78
- let runState = 'running';
79
- if (CONFIRMATION_PROMPT.test(pane)) {
80
- runState = 'waiting_input';
81
- }
82
- else if (isReady(pane)) {
83
- runState = 'completed';
84
- }
85
- return {
86
- runState,
87
- paneText: pane,
88
- lastSeenAt: new Date().toISOString(),
89
- };
90
- }
91
- async stopSession(input) {
92
- if (!sessionExists(input.sessionName))
93
- return;
94
- tmux(['send-keys', '-t', input.sessionName, '/exit', 'Enter']);
95
- await sleep(500);
96
- tmux(['kill-session', '-t', input.sessionName]);
97
- }
98
- async bootstrapSession(input, claudeCmd) {
99
- if (input.resetExisting && sessionExists(input.sessionName)) {
100
- tmux(['kill-session', '-t', input.sessionName]);
101
- await sleep(500);
102
- }
103
- if (sessionExists(input.sessionName)) {
104
- const pane = capturePaneText(input.sessionName, 20);
105
- if (isReady(pane))
106
- return true;
107
- tmux(['send-keys', '-t', input.sessionName, 'C-c']);
108
- await sleep(500);
109
- tmux(['send-keys', '-t', input.sessionName, claudeCmd, 'Enter']);
110
- }
111
- else {
112
- const result = tmux(['new-session', '-d', '-s', input.sessionName, '-c', input.cwd]);
113
- if (result === null && !sessionExists(input.sessionName)) {
114
- throw new Error(`Failed to create tmux session: ${input.sessionName}`);
115
- }
116
- tmux(['send-keys', '-t', input.sessionName, claudeCmd, 'Enter']);
117
- }
118
- if (await this.waitReady(input.sessionName, 90_000)) {
119
- return true;
120
- }
121
- tmux(['kill-session', '-t', input.sessionName]);
122
- await sleep(500);
123
- const recreate = tmux(['new-session', '-d', '-s', input.sessionName, '-c', input.cwd]);
124
- if (recreate === null && !sessionExists(input.sessionName)) {
125
- throw new Error(`Failed to recreate tmux session: ${input.sessionName}`);
126
- }
127
- tmux(['send-keys', '-t', input.sessionName, claudeCmd, 'Enter']);
128
- return this.waitReady(input.sessionName, 90_000);
129
- }
130
- async waitReady(session, timeoutMs) {
131
- const deadline = Date.now() + timeoutMs;
132
- await sleep(3_000);
133
- while (Date.now() < deadline) {
134
- const text = capturePaneText(session, 20);
135
- if (THEME_PROMPT.test(text) || LOGIN_METHOD_PROMPT.test(text)) {
136
- tmux(['send-keys', '-t', session, 'Enter']);
137
- await sleep(2_000);
138
- continue;
139
- }
140
- if (BROWSER_SIGNIN_PROMPT.test(text)) {
141
- return false;
142
- }
143
- if (isReady(text))
144
- return true;
145
- await sleep(2_000);
146
- }
147
- return false;
148
- }
149
- }
150
- //# sourceMappingURL=ClaudeACPAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClaudeACPAdapter.js","sourceRoot":"","sources":["../../../src/providers/adapters/ClaudeACPAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { EnsureSessionInput, EnsureSessionResult, InspectRunInput, InspectRunResult, InspectSessionInput, InspectSessionResult, StartRunInput, StartRunResult, StopSessionInput } from '../../interfaces/ACPClient.js';
2
- export declare class CodexACPAdapter {
3
- ensureSession(input: EnsureSessionInput): Promise<EnsureSessionResult>;
4
- startRun(input: StartRunInput): Promise<StartRunResult>;
5
- inspectSession(input: InspectSessionInput): Promise<InspectSessionResult>;
6
- inspectRun(input: InspectRunInput): Promise<InspectRunResult>;
7
- stopSession(input: StopSessionInput): Promise<void>;
8
- private bootstrapSession;
9
- private waitReady;
10
- }
11
- //# sourceMappingURL=CodexACPAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodexACPAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/adapters/CodexACPAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAkBvC,qBAAa,eAAe;IACpB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAetE,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBvD,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAYzE,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqB7D,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAO3C,gBAAgB;YAoChB,SAAS;CAuCxB"}
@@ -1,158 +0,0 @@
1
- import { capturePaneText, pastePrompt, sessionExists, sleep, tmux } from '../acpTmux.js';
2
- const CODEX_READY = /›\s.*$/m;
3
- const CODEX_MODEL_LINE = /codex.*default.*·|gpt-.*codex/i;
4
- const CODEX_UPDATE_PROMPT = /Update available|Skip until next version|Press enter to continue/i;
5
- const CODEX_RATE_LIMIT_PROMPT = /rate limit|Switch to .+codex-mini|Keep current model/i;
6
- const CODEX_TRUST_PROMPT = /Do you trust the contents of this directory|1\.\s+Yes, continue|Working with untrusted contents/i;
7
- function isReady(text) {
8
- return (CODEX_MODEL_LINE.test(text) && CODEX_READY.test(text))
9
- || (/OpenAI Codex/i.test(text) && /›/m.test(text));
10
- }
11
- function waitingInput(text) {
12
- return CODEX_UPDATE_PROMPT.test(text) || CODEX_RATE_LIMIT_PROMPT.test(text);
13
- }
14
- export class CodexACPAdapter {
15
- async ensureSession(input) {
16
- const codexCmd = 'codex --sandbox danger-full-access -a never --no-alt-screen';
17
- const ready = await this.bootstrapSession(input, codexCmd);
18
- if (!ready) {
19
- throw new Error('Codex ACP session did not become ready within timeout');
20
- }
21
- return {
22
- sessionId: input.sessionName,
23
- sessionState: 'ready',
24
- paneText: capturePaneText(input.sessionName, 40),
25
- lastSeenAt: new Date().toISOString(),
26
- };
27
- }
28
- async startRun(input) {
29
- await pastePrompt(input.sessionName, input.prompt);
30
- for (let attempt = 0; attempt < 3; attempt++) {
31
- await sleep(2_000);
32
- const pane = capturePaneText(input.sessionName, 20);
33
- if (!isReady(pane)) {
34
- return {
35
- runId: `${Date.now()}`,
36
- runState: waitingInput(pane) ? 'waiting_input' : 'running',
37
- paneText: pane,
38
- lastSeenAt: new Date().toISOString(),
39
- };
40
- }
41
- tmux(['send-keys', '-t', input.sessionName, 'Enter']);
42
- }
43
- return {
44
- runId: `${Date.now()}`,
45
- runState: 'running',
46
- paneText: capturePaneText(input.sessionName, 20),
47
- lastSeenAt: new Date().toISOString(),
48
- };
49
- }
50
- async inspectSession(input) {
51
- if (!sessionExists(input.sessionName)) {
52
- return { sessionState: 'offline', paneText: '', lastSeenAt: new Date().toISOString() };
53
- }
54
- const pane = capturePaneText(input.sessionName, 80);
55
- return {
56
- sessionState: isReady(pane) ? 'ready' : 'busy',
57
- paneText: pane,
58
- lastSeenAt: new Date().toISOString(),
59
- };
60
- }
61
- async inspectRun(input) {
62
- if (!input.activeRun) {
63
- return { runState: null, paneText: '', lastSeenAt: new Date().toISOString() };
64
- }
65
- if (!sessionExists(input.sessionName)) {
66
- return { runState: 'lost', paneText: '', lastSeenAt: new Date().toISOString() };
67
- }
68
- const pane = capturePaneText(input.sessionName, 120);
69
- let runState = 'running';
70
- if (isReady(pane)) {
71
- runState = 'completed';
72
- }
73
- else if (waitingInput(pane)) {
74
- runState = 'waiting_input';
75
- }
76
- return {
77
- runState,
78
- paneText: pane,
79
- lastSeenAt: new Date().toISOString(),
80
- };
81
- }
82
- async stopSession(input) {
83
- if (!sessionExists(input.sessionName))
84
- return;
85
- tmux(['send-keys', '-t', input.sessionName, '/quit', 'Enter']);
86
- await sleep(500);
87
- tmux(['kill-session', '-t', input.sessionName]);
88
- }
89
- async bootstrapSession(input, codexCmd) {
90
- if (input.resetExisting && sessionExists(input.sessionName)) {
91
- tmux(['kill-session', '-t', input.sessionName]);
92
- await sleep(500);
93
- }
94
- if (sessionExists(input.sessionName)) {
95
- const pane = capturePaneText(input.sessionName, 20);
96
- if (isReady(pane))
97
- return true;
98
- tmux(['send-keys', '-t', input.sessionName, 'C-c']);
99
- await sleep(500);
100
- tmux(['send-keys', '-t', input.sessionName, 'Enter']);
101
- await sleep(500);
102
- tmux(['send-keys', '-t', input.sessionName, codexCmd, 'Enter']);
103
- }
104
- else {
105
- const result = tmux(['new-session', '-d', '-s', input.sessionName, '-c', input.cwd]);
106
- if (result === null && !sessionExists(input.sessionName)) {
107
- throw new Error(`Failed to create tmux session: ${input.sessionName}`);
108
- }
109
- tmux(['send-keys', '-t', input.sessionName, codexCmd, 'Enter']);
110
- }
111
- if (await this.waitReady(input.sessionName, 90_000)) {
112
- return true;
113
- }
114
- tmux(['kill-session', '-t', input.sessionName]);
115
- await sleep(500);
116
- const recreate = tmux(['new-session', '-d', '-s', input.sessionName, '-c', input.cwd]);
117
- if (recreate === null && !sessionExists(input.sessionName)) {
118
- throw new Error(`Failed to recreate tmux session: ${input.sessionName}`);
119
- }
120
- tmux(['send-keys', '-t', input.sessionName, codexCmd, 'Enter']);
121
- return this.waitReady(input.sessionName, 90_000);
122
- }
123
- async waitReady(session, timeoutMs) {
124
- const deadline = Date.now() + timeoutMs;
125
- await sleep(5_000);
126
- while (Date.now() < deadline) {
127
- const text = capturePaneText(session, 30);
128
- if (isReady(text))
129
- return true;
130
- if (CODEX_UPDATE_PROMPT.test(text)) {
131
- if (/1\. Update now/i.test(text)) {
132
- tmux(['send-keys', '-t', session, 'Down']);
133
- await sleep(300);
134
- tmux(['send-keys', '-t', session, 'Down']);
135
- await sleep(300);
136
- }
137
- tmux(['send-keys', '-t', session, 'Enter']);
138
- await sleep(3_000);
139
- continue;
140
- }
141
- if (CODEX_TRUST_PROMPT.test(text)) {
142
- tmux(['send-keys', '-t', session, 'Enter']);
143
- await sleep(3_000);
144
- continue;
145
- }
146
- if (CODEX_RATE_LIMIT_PROMPT.test(text)) {
147
- tmux(['send-keys', '-t', session, 'Escape']);
148
- await sleep(500);
149
- tmux(['send-keys', '-t', session, 'Enter']);
150
- await sleep(2_000);
151
- continue;
152
- }
153
- await sleep(3_000);
154
- }
155
- return false;
156
- }
157
- }
158
- //# sourceMappingURL=CodexACPAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodexACPAdapter.js","sourceRoot":"","sources":["../../../src/providers/adapters/CodexACPAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,112 +0,0 @@
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('needs_confirmation');
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('needs_confirmation');
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('needs_confirmation');
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 / needs_confirmation → ready (user responded, prompt came back) ──
72
- if ((state === 'waiting_input' || state === 'needs_confirmation') && 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
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-parser.js","sourceRoot":"","sources":["../../../src/providers/parsers/claude-parser.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
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
@@ -1 +0,0 @@
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;IAkF9C,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,gBAAgB;CAGzB"}
@@ -1,91 +0,0 @@
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
- if (/update available/i.test(this.accumulated) && /press enter to continue/i.test(this.accumulated)) {
18
- session.setState('needs_confirmation');
19
- session.emit('waiting-input', {
20
- type: 'confirmation',
21
- prompt: 'Codex update notice — press Enter to continue',
22
- options: ['Update now', 'Skip', 'Skip until next version'],
23
- dangerous: false,
24
- timestamp: new Date().toISOString(),
25
- });
26
- this.accumulated = '';
27
- return;
28
- }
29
- // Trust/sandbox prompt during boot
30
- if (/trust|sandbox|approve/i.test(this.accumulated) && /\[y\/n\]|Enter/i.test(this.accumulated)) {
31
- session.setState('needs_confirmation');
32
- session.emit('waiting-input', {
33
- type: 'trust',
34
- prompt: 'Codex trust/sandbox prompt',
35
- dangerous: false,
36
- timestamp: new Date().toISOString(),
37
- });
38
- this.accumulated = '';
39
- return;
40
- }
41
- return;
42
- }
43
- // ── Permission prompts ──
44
- const permMatch = this.accumulated.match(/\? (Allow|Approve|Execute)[:\s]+(.+?)(?:\n|$)/);
45
- if (permMatch) {
46
- const promptText = permMatch[2].trim();
47
- session.setState('needs_confirmation');
48
- session.emit('waiting-input', {
49
- type: 'permission',
50
- prompt: promptText,
51
- dangerous: DANGEROUS_RE.test(promptText),
52
- timestamp: new Date().toISOString(),
53
- });
54
- this.accumulated = '';
55
- return;
56
- }
57
- // ── waiting_input / needs_confirmation → ready ──
58
- if ((state === 'waiting_input' || state === 'needs_confirmation') && this.hasPrompt()) {
59
- session.setState('ready');
60
- this.accumulated = '';
61
- return;
62
- }
63
- // ── ready → busy ──
64
- if (state === 'ready' && this.hasBusyIndicator(chunk)) {
65
- session.setState('busy');
66
- }
67
- // ── busy → ready (run completed) ──
68
- if (state === 'busy' && this.hasPrompt()) {
69
- const runId = session.getRunId();
70
- if (runId) {
71
- session.emit('run-completed', runId);
72
- }
73
- session.setState('ready');
74
- this.accumulated = '';
75
- return;
76
- }
77
- if (this.accumulated.length > 50_000) {
78
- this.accumulated = this.accumulated.slice(-10_000);
79
- }
80
- }
81
- hasPrompt() {
82
- const text = this.accumulated.trimEnd();
83
- return (/[$❯>]\s*$/.test(text) ||
84
- /^\s*[›❯>]\s(?!\d+\.)/m.test(text) ||
85
- (/OpenAI Codex/.test(text) && /(\/review|\/model|100% left)/.test(text)));
86
- }
87
- hasBusyIndicator(chunk) {
88
- return /Working|Running|Thinking|Executing|apply_patch|Searching|Reading|Ran|Updated|Inspecting|Planning/i.test(chunk);
89
- }
90
- }
91
- //# sourceMappingURL=codex-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-parser.js","sourceRoot":"","sources":["../../../src/providers/parsers/codex-parser.ts"],"names":[],"mappings":"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"}