kumo-cli 1.0.3 → 1.0.5

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 (147) hide show
  1. package/README.md +13 -5
  2. package/dist/auth/credentialsStore.js +61 -14
  3. package/dist/auth/credentialsStore.js.map +1 -1
  4. package/dist/auth/credentialsStore.test.js +60 -0
  5. package/dist/auth/credentialsStore.test.js.map +1 -0
  6. package/dist/claude/fileHistory.js +79 -0
  7. package/dist/claude/fileHistory.js.map +1 -0
  8. package/dist/claude/sessionScanner.js +7 -95
  9. package/dist/claude/sessionScanner.js.map +1 -1
  10. package/dist/claude/sessionScanner.test.js +24 -0
  11. package/dist/claude/sessionScanner.test.js.map +1 -0
  12. package/dist/claude/transcriptParser.js +83 -0
  13. package/dist/claude/transcriptParser.js.map +1 -0
  14. package/dist/claude/transcriptParser.test.js +78 -0
  15. package/dist/claude/transcriptParser.test.js.map +1 -0
  16. package/dist/commands/agentPrompt.js +18 -0
  17. package/dist/commands/agentPrompt.js.map +1 -0
  18. package/dist/commands/cliArgs.js +56 -0
  19. package/dist/commands/cliArgs.js.map +1 -0
  20. package/dist/commands/cliArgs.test.js +25 -0
  21. package/dist/commands/cliArgs.test.js.map +1 -0
  22. package/dist/core/logger.js +7 -2
  23. package/dist/core/logger.js.map +1 -1
  24. package/dist/core/projectFileWatcher.js +56 -0
  25. package/dist/core/projectFileWatcher.js.map +1 -0
  26. package/dist/handlers/fileHandlerPayloads.js +72 -0
  27. package/dist/handlers/fileHandlerPayloads.js.map +1 -0
  28. package/dist/handlers/fileHandlerPayloads.test.js +55 -0
  29. package/dist/handlers/fileHandlerPayloads.test.js.map +1 -0
  30. package/dist/handlers/fileHandlers.js +74 -0
  31. package/dist/handlers/fileHandlers.js.map +1 -0
  32. package/dist/handlers/messageRouter.js +8 -205
  33. package/dist/handlers/messageRouter.js.map +1 -1
  34. package/dist/handlers/promptImages.js +113 -0
  35. package/dist/handlers/promptImages.js.map +1 -0
  36. package/dist/handlers/promptImages.test.js +52 -0
  37. package/dist/handlers/promptImages.test.js.map +1 -0
  38. package/dist/handlers/router.types.js +2 -0
  39. package/dist/handlers/router.types.js.map +1 -0
  40. package/dist/handlers/runtimeHandlers.js +67 -0
  41. package/dist/handlers/runtimeHandlers.js.map +1 -0
  42. package/dist/handlers/sessionHandlers.js +119 -0
  43. package/dist/handlers/sessionHandlers.js.map +1 -0
  44. package/dist/handlers/terminalHandlers.js +40 -0
  45. package/dist/handlers/terminalHandlers.js.map +1 -0
  46. package/dist/index.js +60 -145
  47. package/dist/index.js.map +1 -1
  48. package/dist/pty/notificationDetector.js +29 -0
  49. package/dist/pty/notificationDetector.js.map +1 -0
  50. package/dist/pty/notificationDetector.test.js +24 -0
  51. package/dist/pty/notificationDetector.test.js.map +1 -0
  52. package/dist/pty/ptyMenuParser.js +11 -277
  53. package/dist/pty/ptyMenuParser.js.map +1 -1
  54. package/dist/pty/ptyMenuParser.test.js +26 -0
  55. package/dist/pty/ptyMenuParser.test.js.map +1 -0
  56. package/dist/pty/selectionMenuDetector.js +49 -0
  57. package/dist/pty/selectionMenuDetector.js.map +1 -0
  58. package/dist/pty/selectionMenuDetector.test.js +62 -0
  59. package/dist/pty/selectionMenuDetector.test.js.map +1 -0
  60. package/dist/pty/selectionMenuMeta.js +54 -0
  61. package/dist/pty/selectionMenuMeta.js.map +1 -0
  62. package/dist/pty/selectionMenuMeta.test.js +26 -0
  63. package/dist/pty/selectionMenuMeta.test.js.map +1 -0
  64. package/dist/pty/selectionMenuParser.js +83 -0
  65. package/dist/pty/selectionMenuParser.js.map +1 -0
  66. package/dist/pty/selectionMenuParser.test.js +30 -0
  67. package/dist/pty/selectionMenuParser.test.js.map +1 -0
  68. package/dist/pty/spawn.js +31 -5
  69. package/dist/pty/spawn.js.map +1 -1
  70. package/dist/pty/spawn.test.js +16 -0
  71. package/dist/pty/spawn.test.js.map +1 -0
  72. package/dist/pty/statusSessionDetector.js +28 -0
  73. package/dist/pty/statusSessionDetector.js.map +1 -0
  74. package/dist/pty/statusSessionDetector.test.js +23 -0
  75. package/dist/pty/statusSessionDetector.test.js.map +1 -0
  76. package/dist/pty/terminalManager.js +11 -6
  77. package/dist/pty/terminalManager.js.map +1 -1
  78. package/dist/pty/textInputDetector.js +60 -0
  79. package/dist/pty/textInputDetector.js.map +1 -0
  80. package/dist/pty/textInputDetector.test.js +32 -0
  81. package/dist/pty/textInputDetector.test.js.map +1 -0
  82. package/dist/services/bootstrapService.js +28 -0
  83. package/dist/services/bootstrapService.js.map +1 -0
  84. package/dist/services/checkpointService.js +113 -0
  85. package/dist/services/checkpointService.js.map +1 -0
  86. package/dist/services/checkpointService.test.js +61 -0
  87. package/dist/services/checkpointService.test.js.map +1 -0
  88. package/dist/services/claudeMenuBridge.js +116 -0
  89. package/dist/services/claudeMenuBridge.js.map +1 -0
  90. package/dist/services/claudeMenuBridge.test.js +90 -0
  91. package/dist/services/claudeMenuBridge.test.js.map +1 -0
  92. package/dist/services/claudeService.js +5 -98
  93. package/dist/services/claudeService.js.map +1 -1
  94. package/dist/services/cliRuntime.js +49 -0
  95. package/dist/services/cliRuntime.js.map +1 -0
  96. package/dist/services/cliRuntime.test.js +55 -0
  97. package/dist/services/cliRuntime.test.js.map +1 -0
  98. package/dist/services/fileService.js +19 -23
  99. package/dist/services/fileService.js.map +1 -1
  100. package/dist/services/modelAdapter.test.js +47 -0
  101. package/dist/services/modelAdapter.test.js.map +1 -0
  102. package/dist/services/modelArgs.test.js +64 -0
  103. package/dist/services/modelArgs.test.js.map +1 -0
  104. package/dist/services/modelBaseUrl.test.js +32 -0
  105. package/dist/services/modelBaseUrl.test.js.map +1 -0
  106. package/dist/services/modelService.js +20 -9
  107. package/dist/services/modelService.js.map +1 -1
  108. package/dist/services/modelService.test.js +60 -0
  109. package/dist/services/modelService.test.js.map +1 -1
  110. package/dist/services/notificationDedupe.js +23 -0
  111. package/dist/services/notificationDedupe.js.map +1 -0
  112. package/dist/services/notificationDedupe.test.js +20 -0
  113. package/dist/services/notificationDedupe.test.js.map +1 -0
  114. package/dist/services/pairingService.js +17 -8
  115. package/dist/services/pairingService.js.map +1 -1
  116. package/dist/services/sessionListService.js +19 -0
  117. package/dist/services/sessionListService.js.map +1 -0
  118. package/dist/services/sessionListService.test.js +22 -0
  119. package/dist/services/sessionListService.test.js.map +1 -0
  120. package/dist/services/sessionRollbackService.js +195 -0
  121. package/dist/services/sessionRollbackService.js.map +1 -0
  122. package/dist/services/sessionRollbackService.test.js +142 -0
  123. package/dist/services/sessionRollbackService.test.js.map +1 -0
  124. package/dist/services/sessionService.js +41 -52
  125. package/dist/services/sessionService.js.map +1 -1
  126. package/dist/services/tunnelHelpers.js +69 -0
  127. package/dist/services/tunnelHelpers.js.map +1 -0
  128. package/dist/services/tunnelHelpers.test.js +42 -0
  129. package/dist/services/tunnelHelpers.test.js.map +1 -0
  130. package/dist/services/tunnelService.js +69 -25
  131. package/dist/services/tunnelService.js.map +1 -1
  132. package/dist/services/tunnelService.test.js +91 -0
  133. package/dist/services/tunnelService.test.js.map +1 -0
  134. package/dist/transport/webrtcTransport.js +145 -0
  135. package/dist/transport/webrtcTransport.js.map +1 -0
  136. package/dist/transport/webrtcTransport.test.js +104 -0
  137. package/dist/transport/webrtcTransport.test.js.map +1 -0
  138. package/dist/transport/webrtcTypes.js +29 -0
  139. package/dist/transport/webrtcTypes.js.map +1 -0
  140. package/dist/transport/webrtcTypes.test.js +20 -0
  141. package/dist/transport/webrtcTypes.test.js.map +1 -0
  142. package/dist/transport/wsClient.js +16 -3
  143. package/dist/transport/wsClient.js.map +1 -1
  144. package/dist/utils/safePath.js +18 -6
  145. package/dist/utils/safePath.js.map +1 -1
  146. package/package.json +5 -2
  147. package/scripts/run-tests.mjs +46 -0
@@ -1,15 +1,13 @@
1
- import { stripAnsi, CLAUDE_CODE_COLORS } from './ansiCodes.js';
1
+ import { stripAnsi } from './ansiCodes.js';
2
+ import { detectSelectionMenu, isMenuEqual } from './selectionMenuDetector.js';
3
+ import { detectTextInput } from './textInputDetector.js';
4
+ import { detectNotification } from './notificationDetector.js';
5
+ import { detectSession, detectStatus } from './statusSessionDetector.js';
2
6
  // regex constants hoisted for perf
3
7
  const RE_WINDOW_SIZE = /\x1b\[8;(\d+);(\d+)t/;
4
8
  const RE_CURSOR_POS = /\x1b\[\d+;\d+H/g;
5
9
  const RE_CURSOR_RIGHT = /\x1b\[(\d+)C/g;
6
10
  const RE_COLOR = /\x1b\[[0-9;]*m/g;
7
- const RE_NUM_PREFIX = /^\d+[\.\s]\s+/;
8
- const RE_OPT_SELECTED = /^❯?\s*(\d+)[\.\s]\s*(.+)/;
9
- const RE_OPT_PLAIN = /^(\d+)[\.\s]\s*(.+)/;
10
- const TITLE_KEYWORDS = ['Select', 'Using', 'How do you', 'login method', 'Detected a custom API key', 'Do you want to use this API key', 'Bypass Permissions', 'trust', 'safety check'];
11
- const LABEL_SEPARATORS = [' · ', ' - ', ' – '];
12
- const RE_LOGIN_WARNING = /^not logged in\s*[·•]\s*run\s*\/login$/i;
13
11
  export class PtyMenuParser {
14
12
  callback;
15
13
  buffer = '';
@@ -38,33 +36,30 @@ export class PtyMenuParser {
38
36
  }
39
37
  parseScreen() {
40
38
  this.updateScreenBuffer();
41
- const menu = this.detectSelectionMenu();
39
+ const menu = detectSelectionMenu(this.screenBuffer.lines, this.screenBuffer.rawLines);
42
40
  if (menu) {
43
- if (!this.isMenuEqual(menu, this.lastParsedMenu)) {
41
+ if (!isMenuEqual(menu, this.lastParsedMenu)) {
44
42
  this.lastParsedMenu = menu;
45
43
  this.callback(menu);
46
44
  }
47
45
  return;
48
46
  }
49
- const input = this.detectTextInput();
47
+ const input = detectTextInput(this.screenBuffer.lines, this.screenBuffer.rawLines);
50
48
  if (input) {
51
49
  this.callback(input);
52
50
  return;
53
51
  }
54
- const notification = this.detectNotification();
52
+ const notification = detectNotification(this.screenBuffer.lines, this.screenBuffer.rawLines);
55
53
  if (notification) {
56
54
  this.callback(notification);
57
55
  return;
58
56
  }
59
- const status = this.detectStatus();
57
+ const status = detectStatus(this.screenBuffer.lines);
60
58
  if (status)
61
59
  this.callback(status);
62
- const session = this.detectSession();
60
+ const session = detectSession(this.buffer);
63
61
  if (session)
64
62
  this.callback(session);
65
- const prompt = this.detectPromptBar();
66
- if (prompt)
67
- this.callback(prompt);
68
63
  }
69
64
  updateScreenBuffer() {
70
65
  const windowSizeMatch = this.buffer.match(RE_WINDOW_SIZE);
@@ -92,266 +87,5 @@ export class PtyMenuParser {
92
87
  this.screenBuffer.rawLines = rawLines;
93
88
  this.screenBuffer.lines = rawLines.map((line) => stripAnsi(line));
94
89
  }
95
- detectSelectionMenu() {
96
- const { lines, rawLines } = this.screenBuffer;
97
- let selectedIndex = -1;
98
- const options = [];
99
- const seenIndices = new Set();
100
- let title = '';
101
- let descriptionLines = [];
102
- let hint = '';
103
- let footer = '';
104
- let inMenu = false;
105
- let menuStartLine = -1;
106
- for (let i = 0; i < lines.length; i++) {
107
- const line = lines[i].trim();
108
- const rawLine = rawLines[i] || '';
109
- if (this.hasSelectionMarker(rawLine)) {
110
- if (!inMenu) {
111
- inMenu = true;
112
- menuStartLine = i;
113
- for (let j = i - 1; j >= 0; j--) {
114
- const prevLine = lines[j].trim();
115
- if (!RE_NUM_PREFIX.test(prevLine))
116
- break;
117
- const prevMatch = prevLine.match(RE_OPT_PLAIN);
118
- if (prevMatch) {
119
- const idx = parseInt(prevMatch[1], 10) - 1;
120
- if (!seenIndices.has(idx)) {
121
- seenIndices.add(idx);
122
- const [label, desc] = this.splitLabelDescription(prevMatch[2]);
123
- options.push({ index: idx, label, description: desc, isSelected: false });
124
- menuStartLine = j;
125
- }
126
- }
127
- }
128
- }
129
- const optMatch = line.match(RE_OPT_SELECTED);
130
- if (optMatch) {
131
- const idx = parseInt(optMatch[1], 10) - 1;
132
- if (seenIndices.has(idx))
133
- continue;
134
- seenIndices.add(idx);
135
- const [label, desc] = this.splitLabelDescription(optMatch[2]);
136
- options.push({ index: idx, label, description: desc, isSelected: true });
137
- selectedIndex = idx;
138
- }
139
- }
140
- else if (inMenu && RE_NUM_PREFIX.test(line)) {
141
- const optMatch = line.match(RE_OPT_PLAIN);
142
- if (optMatch) {
143
- const idx = parseInt(optMatch[1], 10) - 1;
144
- if (seenIndices.has(idx))
145
- continue;
146
- seenIndices.add(idx);
147
- const [label, desc] = this.splitLabelDescription(optMatch[2]);
148
- options.push({ index: idx, label, description: desc, isSelected: false });
149
- }
150
- }
151
- else if (inMenu && (line.includes('Esc to cancel') || line.includes('↑↓ to navigate'))) {
152
- footer = line;
153
- break;
154
- }
155
- if (rawLine.includes('Foundry:') || rawLine.includes('http')) {
156
- const hintMatch = stripAnsi(rawLine).match(/(https?:\/\/[^\s]+)/);
157
- if (hintMatch)
158
- hint = hintMatch[0];
159
- }
160
- }
161
- if (menuStartLine > 0) {
162
- const collected = [];
163
- for (let i = menuStartLine - 1; i >= 0; i--) {
164
- const raw = lines[i] ?? '';
165
- const cleaned = raw.replace(/^\s*[│|]\s?/, '').replace(/\s?[│|]\s*$/, '').trim();
166
- if (/^[╭╮╰╯─━┄┈\-]+$/.test(cleaned))
167
- continue;
168
- if (cleaned.startsWith('╭') || cleaned.startsWith('╰'))
169
- continue;
170
- if (cleaned.startsWith('❯') || /^\$\s/.test(cleaned))
171
- break;
172
- collected.push(cleaned);
173
- if (collected.length >= 30)
174
- break;
175
- }
176
- collected.reverse();
177
- while (collected.length > 0 && !collected[0])
178
- collected.shift();
179
- while (collected.length > 0 && !collected[collected.length - 1])
180
- collected.pop();
181
- const titleIdx = collected.findIndex((l) => TITLE_KEYWORDS.some((k) => l.toLowerCase().includes(k.toLowerCase())));
182
- if (titleIdx >= 0) {
183
- let startIdx = titleIdx;
184
- while (startIdx > 0 && collected[startIdx - 1])
185
- startIdx--;
186
- let endIdx = titleIdx;
187
- while (endIdx < collected.length - 1 && collected[endIdx + 1])
188
- endIdx++;
189
- title = collected.slice(startIdx, endIdx + 1).join(' ');
190
- descriptionLines = [...collected.slice(0, startIdx), ...collected.slice(endIdx + 1)]
191
- .filter((l, i, a) => !(l === '' && a[i - 1] === ''));
192
- while (descriptionLines.length > 0 && !descriptionLines[0])
193
- descriptionLines.shift();
194
- while (descriptionLines.length > 0 && !descriptionLines[descriptionLines.length - 1])
195
- descriptionLines.pop();
196
- }
197
- else if (collected.length > 0) {
198
- descriptionLines = collected.filter((l, i, a) => !(l === '' && a[i - 1] === ''));
199
- }
200
- }
201
- if (options.length > 0 && selectedIndex >= 0) {
202
- options.sort((a, b) => a.index - b.index);
203
- return {
204
- type: 'selection',
205
- title,
206
- description: descriptionLines.length > 0 ? descriptionLines.join('\n') : undefined,
207
- options,
208
- selectedIndex,
209
- hint: hint || undefined,
210
- footer: footer || undefined,
211
- };
212
- }
213
- return null;
214
- }
215
- hasSelectionMarker(rawLine) {
216
- const purple = `38;2;${CLAUDE_CODE_COLORS.PURPLE.r};${CLAUDE_CODE_COLORS.PURPLE.g};${CLAUDE_CODE_COLORS.PURPLE.b}`;
217
- return rawLine.includes('❯') && rawLine.includes(purple);
218
- }
219
- splitLabelDescription(content) {
220
- for (const sep of LABEL_SEPARATORS) {
221
- const idx = content.indexOf(sep);
222
- if (idx !== -1)
223
- return [content.slice(0, idx).trim(), content.slice(idx + sep.length).trim()];
224
- }
225
- return [content.trim(), undefined];
226
- }
227
- detectTextInput() {
228
- const { lines, rawLines } = this.screenBuffer;
229
- let hasCursor = false;
230
- let cursorLineIdx = -1;
231
- let hasEnterToContinue = false;
232
- let hasEscToGoBack = false;
233
- for (let i = 0; i < rawLines.length; i++) {
234
- const rawLine = rawLines[i] || '';
235
- const line = lines[i] || '';
236
- if (rawLine.includes('\x1b[7m')) {
237
- hasCursor = true;
238
- cursorLineIdx = i;
239
- }
240
- if (line.includes('Enter to continue'))
241
- hasEnterToContinue = true;
242
- if (line.includes('Esc to go back'))
243
- hasEscToGoBack = true;
244
- }
245
- if (!hasCursor || cursorLineIdx < 0)
246
- return null;
247
- if (!hasEnterToContinue && !hasEscToGoBack)
248
- return null;
249
- const valueLine = lines[cursorLineIdx]?.trim() || '';
250
- let label = '';
251
- let description = '';
252
- for (let i = cursorLineIdx - 1; i >= 0; i--) {
253
- const line = lines[i]?.trim() || '';
254
- if (!line || line.startsWith('─'))
255
- continue;
256
- if (!label && !line.startsWith('Set up') && !line.includes('http')) {
257
- if (line.includes('?') || /^[A-Z]/.test(line)) {
258
- label = line;
259
- continue;
260
- }
261
- }
262
- if (label && !description) {
263
- description = line;
264
- break;
265
- }
266
- if (!label)
267
- label = line;
268
- }
269
- let sectionTitle = '';
270
- for (let i = 0; i < lines.length; i++) {
271
- const rawLine = rawLines[i] || '';
272
- const line = lines[i]?.trim() || '';
273
- if (rawLine.includes('38;2;177;185;249') && rawLine.includes('[1m') && line.includes('Set up')) {
274
- sectionTitle = line;
275
- break;
276
- }
277
- }
278
- return { type: 'input', label: label || sectionTitle, value: valueLine, placeholder: description || undefined, cursorPosition: valueLine.length };
279
- }
280
- detectNotification() {
281
- const { lines, rawLines } = this.screenBuffer;
282
- for (let i = 0; i < lines.length; i++) {
283
- const line = lines[i];
284
- const rawLine = rawLines[i] || '';
285
- const normalized = line.trim().replace(/\s+/g, ' ');
286
- const redColor = `38;2;${CLAUDE_CODE_COLORS.RED.r};${CLAUDE_CODE_COLORS.RED.g};${CLAUDE_CODE_COLORS.RED.b}`;
287
- if (rawLine.includes(redColor)) {
288
- if (RE_LOGIN_WARNING.test(normalized))
289
- return { type: 'notification', level: 'warning', message: 'Not logged in · Run /login' };
290
- if (line.includes('expired') || line.includes('revoked') || line.includes('failed')) {
291
- return { type: 'notification', level: 'error', message: line.trim() };
292
- }
293
- }
294
- if (line.includes('✘'))
295
- return { type: 'notification', level: 'error', message: line.replace('✘', '').trim() };
296
- if (line.includes('✓') || line.includes('✔'))
297
- return { type: 'notification', level: 'success', message: line.replace(/[✓✔]/, '').trim() };
298
- if (line.includes('⎿') && line.includes('interrupted'))
299
- return { type: 'notification', level: 'warning', message: 'Login interrupted' };
300
- if (line.includes('⎿') && line.includes('cancelled'))
301
- return { type: 'notification', level: 'warning', message: 'Action cancelled' };
302
- }
303
- return null;
304
- }
305
- detectStatus() {
306
- for (const line of this.screenBuffer.lines) {
307
- const modelMatch = line.match(/(Sonnet|Claude|Opus|Haiku)\s*[\d.]+/i);
308
- const effortMatch = line.match(/(low|medium|high|xhigh|max)\s*effort/i);
309
- if (modelMatch || effortMatch) {
310
- return {
311
- type: 'status',
312
- loggedIn: !line.includes('Not logged'),
313
- model: modelMatch ? modelMatch[0] : undefined,
314
- effort: effortMatch ? effortMatch[1] : undefined,
315
- };
316
- }
317
- }
318
- return null;
319
- }
320
- detectSession() {
321
- const resumeMatch = this.buffer.match(/--resume\s+([a-f0-9-]{36})/i);
322
- if (resumeMatch)
323
- return { type: 'session', sessionId: resumeMatch[1], resumeCommand: `claude --resume ${resumeMatch[1]}` };
324
- return null;
325
- }
326
- detectPromptBar() {
327
- const { lines, rawLines } = this.screenBuffer;
328
- for (let i = 0; i < lines.length; i++) {
329
- const line = lines[i];
330
- const rawLine = rawLines[i] || '';
331
- if (line.startsWith('❯')) {
332
- return { type: 'prompt', command: line.slice(1).trim(), isEditing: rawLine.includes('\x1b[7m') };
333
- }
334
- }
335
- return null;
336
- }
337
- isMenuEqual(a, b) {
338
- if (!a || !b)
339
- return false;
340
- if (a.title !== b.title)
341
- return false;
342
- if ((a.description ?? '') !== (b.description ?? ''))
343
- return false;
344
- if (a.selectedIndex !== b.selectedIndex)
345
- return false;
346
- if (a.options.length !== b.options.length)
347
- return false;
348
- for (let i = 0; i < a.options.length; i++) {
349
- if (a.options[i].label !== b.options[i].label)
350
- return false;
351
- if (a.options[i].isSelected !== b.options[i].isSelected)
352
- return false;
353
- }
354
- return true;
355
- }
356
90
  }
357
91
  //# sourceMappingURL=ptyMenuParser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ptyMenuParser.js","sourceRoot":"","sources":["../../src/pty/ptyMenuParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ptyMenuParser.js","sourceRoot":"","sources":["../../src/pty/ptyMenuParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { PtyMenuParser } from "./ptyMenuParser.js";
4
+ test("detectStatus prefers the latest model shown on screen", () => {
5
+ const parser = new PtyMenuParser(() => { });
6
+ Reflect.set(parser, "screenBuffer", {
7
+ lines: [
8
+ "Claude Code",
9
+ "Opus 4.8 · medium effort",
10
+ "some other content",
11
+ "Sonnet 4.6 · medium effort",
12
+ ],
13
+ rawLines: [],
14
+ cols: 120,
15
+ rows: 30,
16
+ });
17
+ const detectStatus = Reflect.get(parser, "detectStatus");
18
+ const status = detectStatus.call(parser);
19
+ assert.deepEqual(status, {
20
+ type: "status",
21
+ loggedIn: true,
22
+ model: "Sonnet 4.6",
23
+ effort: "medium",
24
+ });
25
+ });
26
+ //# sourceMappingURL=ptyMenuParser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ptyMenuParser.test.js","sourceRoot":"","sources":["../../src/pty/ptyMenuParser.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE;QAClC,KAAK,EAAE;YACL,aAAa;YACb,0BAA0B;YAC1B,oBAAoB;YACpB,4BAA4B;SAC7B;QACD,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAkB,CAAC;IAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAK/B,CAAC;IACT,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { CLAUDE_CODE_COLORS } from './ansiCodes.js';
2
+ import { extractMenuMeta } from './selectionMenuMeta.js';
3
+ import { parseSelectionOptions } from './selectionMenuParser.js';
4
+ // parse the current rendered screen into a numbered selection menu if one is present
5
+ export function detectSelectionMenu(lines, rawLines) {
6
+ const parsed = parseSelectionOptions(lines, rawLines, (rawLine) => hasSelectionMarker(rawLine));
7
+ const meta = parsed.menuStartLine > 0 ? extractMenuMeta(lines, parsed.menuStartLine) : { title: '', descriptionLines: [] };
8
+ return buildSelectionMenu(parsed.options, parsed.selectedIndex, meta.title, meta.descriptionLines, parsed.hint, parsed.footer);
9
+ }
10
+ // compare two parsed menus to avoid re-sending the same prompt options
11
+ export function isMenuEqual(left, right) {
12
+ if (!left || !right)
13
+ return false;
14
+ if (left.title !== right.title)
15
+ return false;
16
+ if ((left.description ?? '') !== (right.description ?? ''))
17
+ return false;
18
+ if (left.selectedIndex !== right.selectedIndex)
19
+ return false;
20
+ if (left.options.length !== right.options.length)
21
+ return false;
22
+ for (let index = 0; index < left.options.length; index += 1) {
23
+ if (left.options[index].label !== right.options[index].label)
24
+ return false;
25
+ if (left.options[index].isSelected !== right.options[index].isSelected)
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ // detect the colored selection caret used by claude menus
31
+ function hasSelectionMarker(rawLine) {
32
+ const purple = `38;2;${CLAUDE_CODE_COLORS.PURPLE.r};${CLAUDE_CODE_COLORS.PURPLE.g};${CLAUDE_CODE_COLORS.PURPLE.b}`;
33
+ return rawLine.includes('❯') && rawLine.includes(purple);
34
+ }
35
+ function buildSelectionMenu(options, selectedIndex, title, descriptionLines, hint, footer) {
36
+ if (options.length === 0 || selectedIndex < 0)
37
+ return null;
38
+ options.sort((left, right) => left.index - right.index);
39
+ return {
40
+ type: 'selection',
41
+ title,
42
+ description: descriptionLines.length > 0 ? descriptionLines.join('\n') : undefined,
43
+ options,
44
+ selectedIndex,
45
+ hint: hint || undefined,
46
+ footer: footer || undefined,
47
+ };
48
+ }
49
+ //# sourceMappingURL=selectionMenuDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionMenuDetector.js","sourceRoot":"","sources":["../../src/pty/selectionMenuDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAAC,KAAe,EAAE,QAAkB;IACrE,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAC3H,OAAO,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACjI,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,IAA0B,EAAE,KAA2B;IACjF,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC/D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0DAA0D;AAC1D,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,QAAQ,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IACnH,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA0B,EAC1B,aAAqB,EACrB,KAAa,EACb,gBAA0B,EAC1B,IAAY,EACZ,MAAc;IAEd,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK;QACL,WAAW,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAClF,OAAO;QACP,aAAa;QACb,IAAI,EAAE,IAAI,IAAI,SAAS;QACvB,MAAM,EAAE,MAAM,IAAI,SAAS;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { CLAUDE_CODE_COLORS } from './ansiCodes.js';
4
+ import { detectSelectionMenu, isMenuEqual } from './selectionMenuDetector.js';
5
+ function purpleSelectionLine(content) {
6
+ return `\x1b[38;2;${CLAUDE_CODE_COLORS.PURPLE.r};${CLAUDE_CODE_COLORS.PURPLE.g};${CLAUDE_CODE_COLORS.PURPLE.b}m${content}\x1b[0m`;
7
+ }
8
+ test('detectSelectionMenu extracts title, options, hint, and footer', () => {
9
+ const lines = [
10
+ '',
11
+ 'Select model',
12
+ 'Pick one for this session',
13
+ '1. Sonnet · balanced',
14
+ '❯ 2. Opus · strongest',
15
+ 'Foundry: https://example.com/provider',
16
+ '↑↓ to navigate',
17
+ ];
18
+ const rawLines = [
19
+ '',
20
+ 'Select model',
21
+ 'Pick one for this session',
22
+ '1. Sonnet · balanced',
23
+ purpleSelectionLine('❯ 2. Opus · strongest'),
24
+ 'Foundry: https://example.com/provider',
25
+ '↑↓ to navigate',
26
+ ];
27
+ const result = detectSelectionMenu(lines, rawLines);
28
+ assert.deepEqual(result, {
29
+ type: 'selection',
30
+ title: 'Select model Pick one for this session',
31
+ description: undefined,
32
+ options: [
33
+ { index: 0, label: 'Sonnet', description: 'balanced', isSelected: false },
34
+ { index: 1, label: 'Opus', description: 'strongest', isSelected: true },
35
+ ],
36
+ selectedIndex: 1,
37
+ hint: 'https://example.com/provider',
38
+ footer: '↑↓ to navigate',
39
+ });
40
+ });
41
+ test('isMenuEqual ignores object identity and compares logical content', () => {
42
+ const left = {
43
+ type: 'selection',
44
+ title: 'Select model',
45
+ options: [
46
+ { index: 0, label: 'Sonnet', isSelected: true },
47
+ { index: 1, label: 'Opus', isSelected: false },
48
+ ],
49
+ selectedIndex: 0,
50
+ };
51
+ const right = {
52
+ type: 'selection',
53
+ title: 'Select model',
54
+ options: [
55
+ { index: 0, label: 'Sonnet', isSelected: true },
56
+ { index: 1, label: 'Opus', isSelected: false },
57
+ ],
58
+ selectedIndex: 0,
59
+ };
60
+ assert.equal(isMenuEqual(left, right), true);
61
+ });
62
+ //# sourceMappingURL=selectionMenuDetector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionMenuDetector.test.js","sourceRoot":"","sources":["../../src/pty/selectionMenuDetector.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9E,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,aAAa,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC;AACpI,CAAC;AAED,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,cAAc;QACd,2BAA2B;QAC3B,sBAAsB;QACtB,uBAAuB;QACvB,uCAAuC;QACvC,gBAAgB;KACjB,CAAC;IACF,MAAM,QAAQ,GAAG;QACf,EAAE;QACF,cAAc;QACd,2BAA2B;QAC3B,sBAAsB;QACtB,mBAAmB,CAAC,uBAAuB,CAAC;QAC5C,uCAAuC;QACvC,gBAAgB;KACjB,CAAC;IAEF,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE;YACzE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE;SACxE;QACD,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,WAAoB;QAC1B,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/C,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;SAC/C;QACD,aAAa,EAAE,CAAC;KACjB,CAAC;IACF,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE,WAAoB;QAC1B,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/C,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;SAC/C;QACD,aAAa,EAAE,CAAC;KACjB,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,54 @@
1
+ const TITLE_KEYWORDS = ['Select', 'Using', 'How do you', 'login method', 'Detected a custom API key', 'Do you want to use this API key', 'Bypass Permissions', 'trust', 'safety check'];
2
+ // derive menu title and description from the lines rendered above the first option
3
+ export function extractMenuMeta(lines, menuStartLine) {
4
+ const collected = [];
5
+ for (let index = menuStartLine - 1; index >= 0; index -= 1) {
6
+ const rawLine = lines[index] ?? '';
7
+ const cleaned = rawLine.replace(/^\s*[│|]\s?/, '').replace(/\s?[│|]\s*$/, '').trim();
8
+ if (/^[╭╮╰╯─━┄┈\-]+$/.test(cleaned))
9
+ continue;
10
+ if (cleaned.startsWith('╭') || cleaned.startsWith('╰'))
11
+ continue;
12
+ if (cleaned.startsWith('❯') || /^\$\s/.test(cleaned))
13
+ break;
14
+ collected.push(cleaned);
15
+ if (collected.length >= 30)
16
+ break;
17
+ }
18
+ collected.reverse();
19
+ while (collected.length > 0 && !collected[0])
20
+ collected.shift();
21
+ while (collected.length > 0 && !collected[collected.length - 1])
22
+ collected.pop();
23
+ const titleIndex = collected.findIndex((line) => TITLE_KEYWORDS.some((keyword) => line.toLowerCase().includes(keyword.toLowerCase())));
24
+ if (titleIndex < 0) {
25
+ return {
26
+ title: '',
27
+ descriptionLines: dedupeBlankLines(collected),
28
+ };
29
+ }
30
+ let startIndex = titleIndex;
31
+ while (startIndex > 0 && collected[startIndex - 1])
32
+ startIndex -= 1;
33
+ let endIndex = titleIndex;
34
+ while (endIndex < collected.length - 1 && collected[endIndex + 1])
35
+ endIndex += 1;
36
+ return {
37
+ title: collected.slice(startIndex, endIndex + 1).join(' '),
38
+ descriptionLines: trimEdgeBlanks(dedupeBlankLines([...collected.slice(0, startIndex), ...collected.slice(endIndex + 1)])),
39
+ };
40
+ }
41
+ // collapse repeated blank lines while keeping meaningful spacing between content lines
42
+ function dedupeBlankLines(lines) {
43
+ return lines.filter((line, index, array) => !(line === '' && array[index - 1] === ''));
44
+ }
45
+ // drop leading and trailing blank lines from a collected text block
46
+ function trimEdgeBlanks(lines) {
47
+ const result = [...lines];
48
+ while (result.length > 0 && !result[0])
49
+ result.shift();
50
+ while (result.length > 0 && !result[result.length - 1])
51
+ result.pop();
52
+ return result;
53
+ }
54
+ //# sourceMappingURL=selectionMenuMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionMenuMeta.js","sourceRoot":"","sources":["../../src/pty/selectionMenuMeta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { extractMenuMeta } from './selectionMenuMeta.js';
4
+ test('extractMenuMeta derives title and description above the first option', () => {
5
+ const lines = [
6
+ 'Choose carefully',
7
+ '',
8
+ 'Select a model',
9
+ ' 1. alpha',
10
+ ];
11
+ const meta = extractMenuMeta(lines, 3);
12
+ assert.equal(meta.title, 'Select a model');
13
+ assert.deepEqual(meta.descriptionLines, ['Choose carefully']);
14
+ });
15
+ test('extractMenuMeta falls back to description-only blocks when no title keyword exists', () => {
16
+ const lines = [
17
+ 'custom heading',
18
+ '',
19
+ 'more details',
20
+ ' 1. alpha',
21
+ ];
22
+ const meta = extractMenuMeta(lines, 3);
23
+ assert.equal(meta.title, '');
24
+ assert.deepEqual(meta.descriptionLines, ['custom heading', '', 'more details']);
25
+ });
26
+ //# sourceMappingURL=selectionMenuMeta.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionMenuMeta.test.js","sourceRoot":"","sources":["../../src/pty/selectionMenuMeta.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;IAChF,MAAM,KAAK,GAAG;QACZ,kBAAkB;QAClB,EAAE;QACF,gBAAgB;QAChB,YAAY;KACb,CAAC;IAEF,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC3C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oFAAoF,EAAE,GAAG,EAAE;IAC9F,MAAM,KAAK,GAAG;QACZ,gBAAgB;QAChB,EAAE;QACF,cAAc;QACd,YAAY;KACb,CAAC;IAEF,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC"}