kumo-cli 1.1.0 → 1.2.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 (96) hide show
  1. package/README.md +140 -131
  2. package/dist/auth/credentialsStore.js +19 -6
  3. package/dist/auth/credentialsStore.js.map +1 -1
  4. package/dist/claude/conversation.js +272 -0
  5. package/dist/claude/conversation.js.map +1 -0
  6. package/dist/claude/transcriptParser.js +98 -93
  7. package/dist/claude/transcriptParser.js.map +1 -1
  8. package/dist/commands/cliArgs.js +1 -0
  9. package/dist/commands/cliArgs.js.map +1 -1
  10. package/dist/core/config.js +0 -5
  11. package/dist/core/config.js.map +1 -1
  12. package/dist/core/logger.js +47 -6
  13. package/dist/core/logger.js.map +1 -1
  14. package/dist/core/projectFileWatcher.js +100 -36
  15. package/dist/core/projectFileWatcher.js.map +1 -1
  16. package/dist/engine/claudeArgs.js +4 -0
  17. package/dist/engine/claudeArgs.js.map +1 -1
  18. package/dist/engine/claudeBinary.js +14 -5
  19. package/dist/engine/claudeBinary.js.map +1 -1
  20. package/dist/engine/claudeConfig.js +20 -6
  21. package/dist/engine/claudeConfig.js.map +1 -1
  22. package/dist/engine/claudeLogin.js +76 -0
  23. package/dist/engine/claudeLogin.js.map +1 -0
  24. package/dist/engine/controlChannel.js +13 -1
  25. package/dist/engine/controlChannel.js.map +1 -1
  26. package/dist/engine/liveTranscript.js +70 -21
  27. package/dist/engine/liveTranscript.js.map +1 -1
  28. package/dist/engine/ndjson.js +15 -10
  29. package/dist/engine/ndjson.js.map +1 -1
  30. package/dist/engine/permissions.js +5 -2
  31. package/dist/engine/permissions.js.map +1 -1
  32. package/dist/engine/probePool.js +51 -0
  33. package/dist/engine/probePool.js.map +1 -0
  34. package/dist/engine/processTree.js +45 -0
  35. package/dist/engine/processTree.js.map +1 -0
  36. package/dist/engine/remoteConfig.js +17 -0
  37. package/dist/engine/remoteConfig.js.map +1 -0
  38. package/dist/engine/sessionManager.js +99 -84
  39. package/dist/engine/sessionManager.js.map +1 -1
  40. package/dist/engine/settingsCommands.js +56 -0
  41. package/dist/engine/settingsCommands.js.map +1 -1
  42. package/dist/engine/streamSession.js +59 -66
  43. package/dist/engine/streamSession.js.map +1 -1
  44. package/dist/engine/taskTracker.js +1 -1
  45. package/dist/engine/taskTracker.js.map +1 -1
  46. package/dist/engine/toolLabels.js +32 -0
  47. package/dist/engine/toolLabels.js.map +1 -0
  48. package/dist/handlers/controlRequest.js +17 -0
  49. package/dist/handlers/controlRequest.js.map +1 -0
  50. package/dist/handlers/fileHandlers.js +12 -0
  51. package/dist/handlers/fileHandlers.js.map +1 -1
  52. package/dist/handlers/messageRouter.js +8 -1
  53. package/dist/handlers/messageRouter.js.map +1 -1
  54. package/dist/handlers/promptImages.js +0 -55
  55. package/dist/handlers/promptImages.js.map +1 -1
  56. package/dist/handlers/runtimeHandlers.js +51 -151
  57. package/dist/handlers/runtimeHandlers.js.map +1 -1
  58. package/dist/handlers/sessionHandlers.js +48 -14
  59. package/dist/handlers/sessionHandlers.js.map +1 -1
  60. package/dist/handlers/terminalHandlers.js +9 -2
  61. package/dist/handlers/terminalHandlers.js.map +1 -1
  62. package/dist/http/httpClient.js +6 -0
  63. package/dist/http/httpClient.js.map +1 -1
  64. package/dist/index.js +58 -16
  65. package/dist/index.js.map +1 -1
  66. package/dist/pty/terminalManager.js +58 -11
  67. package/dist/pty/terminalManager.js.map +1 -1
  68. package/dist/services/bootstrapService.js +17 -1
  69. package/dist/services/bootstrapService.js.map +1 -1
  70. package/dist/services/claudeAdapterProxy.js +68 -21
  71. package/dist/services/claudeAdapterProxy.js.map +1 -1
  72. package/dist/services/cliRuntime.js +5 -5
  73. package/dist/services/cliRuntime.js.map +1 -1
  74. package/dist/services/fileService.js +50 -24
  75. package/dist/services/fileService.js.map +1 -1
  76. package/dist/services/forkService.js +1 -1
  77. package/dist/services/forkService.js.map +1 -1
  78. package/dist/services/modelService.js +62 -18
  79. package/dist/services/modelService.js.map +1 -1
  80. package/dist/services/pairingService.js +21 -15
  81. package/dist/services/pairingService.js.map +1 -1
  82. package/dist/services/sessionService.js +204 -85
  83. package/dist/services/sessionService.js.map +1 -1
  84. package/dist/services/tunnelHelpers.js +9 -5
  85. package/dist/services/tunnelHelpers.js.map +1 -1
  86. package/dist/services/tunnelService.js +17 -0
  87. package/dist/services/tunnelService.js.map +1 -1
  88. package/dist/transport/wsClient.js +60 -38
  89. package/dist/transport/wsClient.js.map +1 -1
  90. package/dist/utils/json.js +7 -0
  91. package/dist/utils/json.js.map +1 -0
  92. package/dist/utils/localHost.js +17 -0
  93. package/dist/utils/localHost.js.map +1 -0
  94. package/dist/utils/safePath.js +51 -20
  95. package/dist/utils/safePath.js.map +1 -1
  96. package/package.json +62 -62
@@ -3,8 +3,8 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { log } from '../core/logger.js';
5
5
  import { cwdToProjectFolder } from '../utils/safePath.js';
6
- import { parseTranscriptMessage, rememberToolResults } from '../claude/transcriptParser.js';
7
- import { hydratePromptImages } from '../handlers/promptImages.js';
6
+ import { buildConversation, isCompactBoundary, parseEntries } from '../claude/conversation.js';
7
+ import { compactBoundaryMessage, imageBlocks, isThinkingBlock, parseTranscriptMessage, rememberToolResults, thinkingSeconds, } from '../claude/transcriptParser.js';
8
8
  function isPidAlive(pid) {
9
9
  if (typeof pid !== 'number')
10
10
  return false;
@@ -41,8 +41,27 @@ export async function getActiveSessions() {
41
41
  catch { }
42
42
  return active;
43
43
  }
44
- // locate ~/.claude/projects/<slug>/<sessionId>.jsonl in any project folder
44
+ // locate ~/.claude/projects/<slug>/<sessionId>.jsonl, the cli's own project first
45
+ // where each session's transcript was found; a hit is checked, a miss scans again
46
+ const jsonlPaths = new Map();
47
+ const MAX_JSONL_PATHS = 200;
45
48
  export function findSessionJsonl(sessionId) {
49
+ const known = jsonlPaths.get(sessionId);
50
+ if (known && fs.existsSync(known))
51
+ return known;
52
+ jsonlPaths.delete(sessionId);
53
+ const found = scanSessionJsonl(sessionId);
54
+ if (found) {
55
+ if (jsonlPaths.size >= MAX_JSONL_PATHS)
56
+ jsonlPaths.delete(jsonlPaths.keys().next().value);
57
+ jsonlPaths.set(sessionId, found);
58
+ }
59
+ return found;
60
+ }
61
+ function scanSessionJsonl(sessionId) {
62
+ const own = getSessionFileInfo(sessionId).sessionFile;
63
+ if (fs.existsSync(own))
64
+ return own;
46
65
  const projectsDir = path.join(os.homedir(), '.claude', 'projects');
47
66
  if (!fs.existsSync(projectsDir))
48
67
  return null;
@@ -55,68 +74,87 @@ export function findSessionJsonl(sessionId) {
55
74
  }
56
75
  return null;
57
76
  }
77
+ // the transcript text read last, for the taps on its tools that follow; read again once the
78
+ // file grows or changes
79
+ let lastText = null;
80
+ function transcriptText(file) {
81
+ const { size, mtimeMs } = fs.statSync(file);
82
+ if (lastText?.file !== file || lastText.size !== size || lastText.mtimeMs !== mtimeMs) {
83
+ lastText = { file, size, mtimeMs, text: fs.readFileSync(file, 'utf-8') };
84
+ }
85
+ return lastText.text;
86
+ }
87
+ // one session file summed up for the list; null when it holds no messages yet
88
+ function summarizeSessionFile(file) {
89
+ let firstMessage = '';
90
+ let lastTimestamp = '';
91
+ let hasMessages = false;
92
+ let messageCount = 0;
93
+ let customTitle = '';
94
+ let aiTitle = '';
95
+ for (const line of fs.readFileSync(file, 'utf-8').split('\n')) {
96
+ let entry;
97
+ try {
98
+ entry = JSON.parse(line);
99
+ }
100
+ catch {
101
+ continue;
102
+ }
103
+ // titles are rewritten as the session goes on; the last one wins
104
+ if (entry['type'] === 'custom-title' && typeof entry['customTitle'] === 'string')
105
+ customTitle = entry['customTitle'];
106
+ if (entry['type'] === 'ai-title' && typeof entry['aiTitle'] === 'string')
107
+ aiTitle = entry['aiTitle'];
108
+ if (entry['type'] !== 'user' && entry['type'] !== 'assistant')
109
+ continue;
110
+ const message = entry['message'];
111
+ if (!message?.['role'] || message['role'] === 'system')
112
+ continue;
113
+ hasMessages = true;
114
+ if (typeof entry['timestamp'] === 'string')
115
+ lastTimestamp = entry['timestamp'];
116
+ const text = parseTranscriptMessage(entry, { includeNoise: true })?.content ?? '';
117
+ const isCommand = /<local-command-/i.test(text);
118
+ // tool results, subagent and meta lines are not chat bubbles
119
+ if (text.trim() && !isCommand && !entry['isMeta'] && !entry['isSidechain'])
120
+ messageCount++;
121
+ if (!firstMessage && message['role'] === 'user' && !isCommand)
122
+ firstMessage = text.slice(0, 200);
123
+ }
124
+ if (!hasMessages)
125
+ return null;
126
+ const title = customTitle || aiTitle;
127
+ return { sessionId: path.basename(file, '.jsonl'), firstMessage, lastTimestamp, messageCount, ...(title ? { title } : {}) };
128
+ }
129
+ // summaries by file, read again only when a file changed: the list is asked for on every reconnect
130
+ const summaries = new Map();
58
131
  // list sessions for a given cwd with their first user message and last activity time
59
132
  export async function getSessionListForCwd(cwdOverride) {
60
- const { cwd, folderName, projectDir } = projectDirFor(cwdOverride);
61
- log(`[session_list] cwd=${cwd}, folder=${folderName}, dir=${projectDir}`);
133
+ const { projectDir } = projectDirFor(cwdOverride);
62
134
  const sessions = [];
63
- try {
64
- if (!fs.existsSync(projectDir))
65
- return sessions;
66
- const files = fs.readdirSync(projectDir).filter((f) => f.endsWith('.jsonl'));
67
- for (const file of files) {
68
- const sessionId = path.basename(file, '.jsonl');
69
- try {
70
- const raw = fs.readFileSync(path.join(projectDir, file), 'utf-8');
71
- const lines = raw.split('\n').filter((l) => l.trim());
72
- let firstMessage = '';
73
- let lastTimestamp = '';
74
- let hasMessages = false;
75
- let messageCount = 0;
76
- let customTitle = '';
77
- let aiTitle = '';
78
- for (const line of lines) {
79
- try {
80
- const entry = JSON.parse(line);
81
- // titles are rewritten as the session goes on; the last one wins
82
- if (entry['type'] === 'custom-title' && typeof entry['customTitle'] === 'string')
83
- customTitle = entry['customTitle'];
84
- if (entry['type'] === 'ai-title' && typeof entry['aiTitle'] === 'string')
85
- aiTitle = entry['aiTitle'];
86
- if (entry['type'] !== 'user' && entry['type'] !== 'assistant')
87
- continue;
88
- const msgObj = entry['message'];
89
- if (!msgObj || !msgObj['role'] || msgObj['role'] === 'system')
90
- continue;
91
- hasMessages = true;
92
- const ts = entry['timestamp'];
93
- if (ts)
94
- lastTimestamp = ts;
95
- let text = '';
96
- if (typeof msgObj['content'] === 'string')
97
- text = msgObj['content'];
98
- else if (Array.isArray(msgObj['content'])) {
99
- text = msgObj['content']
100
- .filter((b) => b['type'] === 'text' && b['text'])
101
- .map((b) => b['text']).join('');
102
- }
103
- const isCommand = /<local-command-/i.test(text);
104
- // tool results, subagent and meta lines are not chat bubbles
105
- if (text.trim() && !isCommand && !entry['isMeta'] && !entry['isSidechain'])
106
- messageCount++;
107
- if (!firstMessage && msgObj['role'] === 'user' && !isCommand)
108
- firstMessage = text.slice(0, 200);
109
- }
110
- catch { }
111
- }
112
- const title = customTitle || aiTitle;
113
- if (hasMessages)
114
- sessions.push({ sessionId, firstMessage, lastTimestamp, messageCount, ...(title ? { title } : {}) });
135
+ if (!fs.existsSync(projectDir))
136
+ return sessions;
137
+ const names = fs.readdirSync(projectDir).filter((f) => f.endsWith('.jsonl'));
138
+ // a deleted transcript's summary goes too
139
+ const present = new Set(names.map((name) => path.join(projectDir, name)));
140
+ for (const file of summaries.keys()) {
141
+ if (path.dirname(file) === projectDir && !present.has(file))
142
+ summaries.delete(file);
143
+ }
144
+ for (const name of names) {
145
+ const file = path.join(projectDir, name);
146
+ try {
147
+ const { size, mtimeMs } = fs.statSync(file);
148
+ let cached = summaries.get(file);
149
+ if (cached?.size !== size || cached.mtimeMs !== mtimeMs) {
150
+ cached = { size, mtimeMs, summary: summarizeSessionFile(file) };
151
+ summaries.set(file, cached);
115
152
  }
116
- catch { }
153
+ if (cached.summary)
154
+ sessions.push(cached.summary);
117
155
  }
156
+ catch { }
118
157
  }
119
- catch { }
120
158
  sessions.sort((a, b) => (b.lastTimestamp || '').localeCompare(a.lastTimestamp || ''));
121
159
  return sessions;
122
160
  }
@@ -141,37 +179,118 @@ export function getSessionFileInfo(sessionId, cwdOverride) {
141
179
  const info = projectDirFor(cwdOverride);
142
180
  return { ...info, sessionFile: path.join(info.projectDir, `${sessionId}.jsonl`) };
143
181
  }
144
- export function readSessionJsonlLines(sessionId, cwdOverride) {
145
- const { sessionFile } = getSessionFileInfo(sessionId, cwdOverride);
146
- if (!fs.existsSync(sessionFile))
147
- return [];
148
- return fs.readFileSync(sessionFile, 'utf-8').split('\n').filter((line) => line.trim().length > 0);
149
- }
150
- // read a session jsonl file and materialize messages for the app
151
- export function readSessionHistory(sessionId) {
152
- const lines = readSessionJsonlLines(sessionId);
153
- const messages = [];
154
- const seenUuids = new Set();
182
+ // messages per history page; a page starts on a prompt or a compaction when one is near
183
+ export const HISTORY_PAGE_SIZE = 80;
184
+ const PAGE_STARTS = new Set(['user', 'compact']);
185
+ const CACHED_CONVERSATIONS = 4;
186
+ const conversations = new Map();
187
+ // the conversation of a session as the extension shows it, parsed again only when the jsonl changed
188
+ function loadConversation(sessionId) {
189
+ const file = findSessionJsonl(sessionId);
190
+ const stat = file ? fs.statSync(file, { throwIfNoEntry: false }) : undefined;
191
+ if (!file || !stat)
192
+ return { size: 0, mtimeMs: 0, messages: [], images: new Map() };
193
+ const cached = conversations.get(sessionId);
194
+ if (cached && cached.size === stat.size && cached.mtimeMs === stat.mtimeMs)
195
+ return cached;
196
+ const entries = parseEntries(fs.readFileSync(file, 'utf-8').split('\n'));
155
197
  const toolResults = new Map();
156
- for (const line of lines) {
157
- try {
158
- rememberToolResults(JSON.parse(line), toolResults);
198
+ for (const entry of entries)
199
+ rememberToolResults(entry, toolResults);
200
+ const conversation = { size: stat.size, mtimeMs: stat.mtimeMs, messages: [], images: new Map() };
201
+ // thinking time by message id: from the entry before to the thinking line, shown on the
202
+ // message's first visible line
203
+ const thinking = new Map();
204
+ let previousAt = NaN;
205
+ for (const entry of buildConversation(entries)) {
206
+ const at = Date.parse(entry.timestamp ?? '');
207
+ const id = entry.message?.id;
208
+ const content = entry.message?.content;
209
+ if (id && Array.isArray(content) && content.some(isThinkingBlock) && at >= previousAt) {
210
+ thinking.set(id, (thinking.get(id) ?? 0) + at - previousAt);
159
211
  }
160
- catch { }
212
+ if (!Number.isNaN(at))
213
+ previousAt = at;
214
+ const parsed = isCompactBoundary(entry)
215
+ ? compactBoundaryMessage(entry)
216
+ : parseTranscriptMessage(entry, { includeNoise: true, toolResults });
217
+ if (!parsed)
218
+ continue;
219
+ const thoughtMs = id ? thinking.get(id) : undefined;
220
+ if (thoughtMs !== undefined) {
221
+ parsed.thinkingSeconds = thinkingSeconds(thoughtMs);
222
+ thinking.delete(id);
223
+ }
224
+ conversation.messages.push(parsed);
225
+ if (parsed.images && parsed.id)
226
+ conversation.images.set(parsed.id, imageBlocks(entry.message?.content));
227
+ }
228
+ conversations.delete(sessionId);
229
+ conversations.set(sessionId, conversation);
230
+ if (conversations.size > CACHED_CONVERSATIONS)
231
+ conversations.delete(conversations.keys().next().value);
232
+ return conversation;
233
+ }
234
+ // the newest page of a session, or the page just before the message `before`
235
+ export function readSessionPage(sessionId, before) {
236
+ const { messages } = loadConversation(sessionId);
237
+ const end = before ? Math.max(0, messages.findIndex((message) => message.id === before)) : messages.length;
238
+ let start = Math.max(0, end - HISTORY_PAGE_SIZE);
239
+ // a long run of claude's own messages is cut anyway, so a page stays small
240
+ const floor = Math.max(0, start - HISTORY_PAGE_SIZE);
241
+ while (start > floor && !PAGE_STARTS.has(messages[start].role))
242
+ start--;
243
+ return { messages: messages.slice(start, end), hasMore: start > 0 };
244
+ }
245
+ export function findPromptImage(sessionId, messageId, index) {
246
+ return loadConversation(sessionId).images.get(messageId)?.[index] ?? null;
247
+ }
248
+ // what one tool printed, cut so a single frame stays small
249
+ export const TOOL_OUTPUT_LIMIT = 64 * 1024;
250
+ // the result of a tool use as claude saw it, read from the session file when the app opens the
251
+ // tool; null while the tool still runs
252
+ export function findToolResult(sessionId, toolUseId) {
253
+ const file = findSessionJsonl(sessionId);
254
+ if (!file)
255
+ return null;
256
+ let text;
257
+ try {
258
+ text = transcriptText(file);
161
259
  }
162
- for (const line of lines) {
260
+ catch (error) {
261
+ // gone meanwhile, or past the longest string node can hold
262
+ log(`[tool_result] cannot read ${file}: ${error}`);
263
+ return null;
264
+ }
265
+ const needle = `"tool_use_id":${JSON.stringify(toolUseId)}`;
266
+ for (let at = text.indexOf(needle); at >= 0; at = text.indexOf(needle, at + needle.length)) {
267
+ const end = text.indexOf('\n', at);
268
+ const line = text.slice(text.lastIndexOf('\n', at) + 1, end < 0 ? undefined : end);
269
+ let entry;
163
270
  try {
164
- const parsed = parseTranscriptMessage(JSON.parse(line), {
165
- sessionId,
166
- seenUuids,
167
- includeNoise: true,
168
- toolResults,
169
- });
170
- if (parsed)
171
- messages.push(parsed);
271
+ entry = JSON.parse(line);
172
272
  }
173
- catch { }
273
+ catch {
274
+ continue;
275
+ }
276
+ const content = entry.message?.content;
277
+ const block = Array.isArray(content) ? content.find((b) => b.type === 'tool_result' && b.tool_use_id === toolUseId) : undefined;
278
+ if (!block)
279
+ continue;
280
+ const output = resultText(block.content);
281
+ return { output: output.slice(0, TOOL_OUTPUT_LIMIT), isError: block.is_error === true, truncated: output.length > TOOL_OUTPUT_LIMIT };
174
282
  }
175
- return hydratePromptImages(messages);
283
+ return null;
284
+ }
285
+ // a tool_result content: plain text, or text and image blocks
286
+ function resultText(content) {
287
+ if (typeof content === 'string')
288
+ return content;
289
+ if (!Array.isArray(content))
290
+ return '';
291
+ return content
292
+ .map((block) => (block?.type === 'text' ? block.text ?? '' : block?.type === 'image' ? '[image]' : ''))
293
+ .filter(Boolean)
294
+ .join('\n');
176
295
  }
177
296
  //# sourceMappingURL=sessionService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessionService.js","sourceRoot":"","sources":["../../src/services/sessionService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionService.js","sourceRoot":"","sources":["../../src/services/sessionService.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  export const DEFAULT_TUNNEL_HOST = '127.0.0.1';
2
- // build a stable host header for the proxied local target
2
+ // a host name with an optional port, nothing a header could smuggle
3
+ const HOST_HEADER = /^[A-Za-z0-9.-]{1,253}(:\d{1,5})?$/;
4
+ // build a stable host header for the proxied local target; an invalid host falls back to the default
3
5
  export function resolveTunnelHostHeader(port, requestedHost) {
4
6
  const trimmedHost = typeof requestedHost === 'string' ? requestedHost.trim() : '';
5
- if (!trimmedHost)
7
+ if (!trimmedHost || !HOST_HEADER.test(trimmedHost))
6
8
  return undefined;
7
9
  return trimmedHost.includes(':') ? trimmedHost : `${trimmedHost}:${port}`;
8
10
  }
@@ -12,15 +14,17 @@ export function normalizeTunnelPath(pathValue) {
12
14
  }
13
15
  // decode a tunnel request body only for methods that may legally send one
14
16
  export function decodeTunnelBody(request) {
15
- if (!request.body || request.method === 'GET' || request.method === 'HEAD') {
17
+ if (typeof request.body !== 'string' || !request.body || request.method === 'GET' || request.method === 'HEAD') {
16
18
  return undefined;
17
19
  }
18
20
  return Buffer.from(request.body, 'base64');
19
21
  }
20
22
  // drop hop-by-hop headers and rewrite local origins before proxying the request
21
23
  export function filterTunnelRequestHeaders(headers, targetHost, port, hostHeader) {
22
- const filteredHeaders = Object.fromEntries(Object.entries(headers)
23
- .filter(([key]) => {
24
+ const filteredHeaders = Object.fromEntries(Object.entries(headers && typeof headers === 'object' ? headers : {})
25
+ .filter(([key, value]) => {
26
+ if (typeof value !== 'string')
27
+ return false;
24
28
  const lowerKey = key.toLowerCase();
25
29
  return !lowerKey.startsWith('sec-') && !['host', 'connection', 'accept-encoding', 'upgrade-insecure-requests'].includes(lowerKey);
26
30
  })
@@ -1 +1 @@
1
- {"version":3,"file":"tunnelHelpers.js","sourceRoot":"","sources":["../../src/services/tunnelHelpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnelHelpers.js","sourceRoot":"","sources":["../../src/services/tunnelHelpers.ts"],"names":[],"mappings":"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"}
@@ -48,8 +48,25 @@ async function proxyHttpRequest(input) {
48
48
  req.end();
49
49
  });
50
50
  }
51
+ // requests proxied at once; a page firing hundreds of calls waits on 503s instead of
52
+ // opening hundreds of sockets and buffers on this machine
53
+ const MAX_TUNNEL_IN_FLIGHT = 32;
54
+ let inFlight = 0;
51
55
  // proxy a http request from the server through this cli to a local service
52
56
  export async function handleTunnelRequest(req) {
57
+ if (inFlight >= MAX_TUNNEL_IN_FLIGHT)
58
+ return tunnelError(String(req.requestId), 503, 'too many tunnel requests');
59
+ inFlight++;
60
+ try {
61
+ return await proxyTunnelRequest(req);
62
+ }
63
+ finally {
64
+ inFlight--;
65
+ }
66
+ }
67
+ async function proxyTunnelRequest(req) {
68
+ if (typeof req.method !== 'string' || !/^[A-Z]{1,16}$/.test(req.method))
69
+ return tunnelError(String(req.requestId), 400, 'invalid method');
53
70
  const port = Number(req.port);
54
71
  if (!Number.isInteger(port) || port < 1 || port > 65535)
55
72
  return tunnelError(req.requestId, 400, 'invalid port');
@@ -1 +1 @@
1
- {"version":3,"file":"tunnelService.js","sourceRoot":"","sources":["../../src/services/tunnelService.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAoB5B,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAC7F,MAAM,yBAAyB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACrG,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,KAAK,CAAC,CAAC;AAC9E,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC;KAC1C,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;KAClC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CACzE,CAAC;AAEF,SAAS,WAAW,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAe;IACrE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAO/B;IACC,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB;YACE,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,EACD,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC;YACrC,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,IAAI;oBAAE,SAAS;gBACxB,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBACtB,IAAI,KAAK,GAAG,yBAAyB,EAAE,CAAC;oBACtC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;oBAClD,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3E,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI;YAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAqB;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;IAChH,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACjH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,UAAU,mBAAmB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAqB;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;IAClH,MAAM,eAAe,GAAG,0BAA0B,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACvG,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;YACjC,QAAQ,EAAE,mBAAmB;YAC7B,IAAI;YACJ,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,eAAe;YACxB,IAAI;SACL,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,GAAG,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,4BAA4B,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACrG,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvI,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,GAAI,GAAa,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAC/E,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tunnelService.js","sourceRoot":"","sources":["../../src/services/tunnelService.ts"],"names":[],"mappings":"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"}
@@ -9,17 +9,25 @@ function stringifyPayload(data) {
9
9
  return JSON.stringify({ error: error instanceof Error ? error.message : String(error) });
10
10
  }
11
11
  }
12
- function logPayload(data) {
13
- if (!data || typeof data !== 'object')
14
- return stringifyPayload(data);
15
- const msg = data;
16
- return stringifyPayload({
17
- type: msg['type'],
18
- requestId: msg['requestId'],
19
- terminalId: msg['terminalId'],
20
- status: msg['status'],
21
- size: stringifyPayload(data).length,
22
- });
12
+ // terminal traffic is a frame per keystroke and per output burst: too chatty for the log
13
+ const UNLOGGED = new Set(['terminal_output', 'terminal_input']);
14
+ // one log line per frame, sized from the already serialized text
15
+ function logFrame(direction, msg, size) {
16
+ if (UNLOGGED.has(String(msg['type'])))
17
+ return;
18
+ const extras = ['requestId', 'terminalId', 'status'].filter((key) => msg[key] !== undefined).map((key) => ` ${key}=${String(msg[key])}`);
19
+ log(`[ws] ${direction} ${String(msg['type'])}${extras.join('')} ${size}B`);
20
+ }
21
+ // the server pings every 30s; missing two and a half of them means the link is dead
22
+ const SERVER_PING_TIMEOUT_MS = 75_000;
23
+ // the largest frame the app sends: a file write, prompt images or a 10 MB tunnel body as base64
24
+ const MAX_PAYLOAD_BYTES = 64 * 1024 * 1024;
25
+ // reconnect waits double from 3s up to 30s, plus some jitter so many clis do not return at once
26
+ const RECONNECT_BASE_MS = 3000;
27
+ const RECONNECT_MAX_MS = 30_000;
28
+ export function reconnectDelay(attempt) {
29
+ const delay = Math.min(RECONNECT_BASE_MS * 2 ** Math.max(0, attempt - 1), RECONNECT_MAX_MS);
30
+ return delay + Math.floor(Math.random() * delay * 0.25);
23
31
  }
24
32
  export class WsClient {
25
33
  onOpen;
@@ -27,7 +35,10 @@ export class WsClient {
27
35
  onClose;
28
36
  ws = null;
29
37
  reconnectTimer = null;
30
- pingInterval = null;
38
+ pingWatchdog = null;
39
+ attempts = 0;
40
+ // close() was called: the socket stays down
41
+ closed = false;
31
42
  constructor(onOpen, onMessage, onClose) {
32
43
  this.onOpen = onOpen;
33
44
  this.onMessage = onMessage;
@@ -36,61 +47,72 @@ export class WsClient {
36
47
  send(data) {
37
48
  if (this.ws && this.ws.readyState === WebSocket.OPEN) {
38
49
  const payload = stringifyPayload(data);
39
- log(`[ws] outgoing ${logPayload(data)}`);
50
+ logFrame('outgoing', data, payload.length);
40
51
  this.ws.send(payload);
52
+ return;
41
53
  }
54
+ // the app resyncs what it missed once the socket is back
55
+ log(`[ws] dropped ${String(data['type'])} while disconnected`);
42
56
  }
43
57
  connect() {
44
- this.ws = new WebSocket(SERVER_WS());
45
- this.ws.on('open', () => {
58
+ this.closed = false;
59
+ const ws = new WebSocket(SERVER_WS(), { maxPayload: MAX_PAYLOAD_BYTES });
60
+ this.ws = ws;
61
+ // ws answers pings itself; a silent server means a half-open link, so drop it and reconnect
62
+ const armWatchdog = () => {
63
+ this.clearWatchdog();
64
+ this.pingWatchdog = setTimeout(() => ws.terminate(), SERVER_PING_TIMEOUT_MS);
65
+ };
66
+ ws.on('open', () => {
67
+ this.attempts = 0;
46
68
  log(`[ws] connected to ${SERVER_WS()}`);
47
- if (this.pingInterval)
48
- clearInterval(this.pingInterval);
49
- this.pingInterval = setInterval(() => {
50
- if (this.ws && this.ws.readyState === WebSocket.OPEN) {
51
- this.ws.ping();
52
- this.send({ type: 'cli_heartbeat' });
53
- }
54
- }, 5000);
69
+ armWatchdog();
55
70
  Promise.resolve(this.onOpen()).catch((e) => log(`[onOpen] error: ${e}`));
56
71
  });
57
- this.ws.on('ping', () => this.ws?.pong());
58
- this.ws.on('message', (raw) => {
72
+ ws.on('ping', armWatchdog);
73
+ ws.on('message', (raw) => {
59
74
  const rawText = raw.toString();
60
75
  try {
61
76
  const parsed = JSON.parse(rawText);
62
- log(`[ws] incoming ${logPayload(parsed)}`);
77
+ logFrame('incoming', parsed, rawText.length);
63
78
  this.onMessage(parsed);
64
79
  }
65
80
  catch (error) {
66
81
  log(`[ws] incoming parse error: ${error}`);
67
82
  }
68
83
  });
69
- this.ws.on('close', () => {
70
- log(`[ws] disconnected, reconnecting in 3s`);
71
- if (this.pingInterval) {
72
- clearInterval(this.pingInterval);
73
- this.pingInterval = null;
74
- }
84
+ ws.on('close', () => {
85
+ this.clearWatchdog();
86
+ // closed on purpose, or replaced by a newer socket: no reconnect from here
87
+ if (this.closed || this.ws !== ws)
88
+ return;
89
+ const delay = reconnectDelay(++this.attempts);
90
+ log(`[ws] disconnected, reconnecting in ${Math.round(delay / 1000)}s`);
75
91
  this.onClose?.();
76
- this.reconnectTimer = setTimeout(() => this.connect(), 3000);
92
+ this.reconnectTimer = setTimeout(() => this.connect(), delay);
77
93
  });
78
- this.ws.on('error', () => { });
94
+ // the reason a connect failed; 'close' follows and schedules the retry
95
+ // a refused connect to localhost is an AggregateError with no message, only codes
96
+ ws.on('error', (error) => log(`[ws] error: ${error.message || error.code || error.name}`));
79
97
  }
80
98
  close() {
99
+ this.closed = true;
81
100
  if (this.reconnectTimer) {
82
101
  clearTimeout(this.reconnectTimer);
83
102
  this.reconnectTimer = null;
84
103
  }
85
- if (this.pingInterval) {
86
- clearInterval(this.pingInterval);
87
- this.pingInterval = null;
88
- }
104
+ this.clearWatchdog();
89
105
  try {
90
106
  this.ws?.close();
91
107
  }
92
108
  catch { }
93
109
  this.ws = null;
94
110
  }
111
+ clearWatchdog() {
112
+ if (this.pingWatchdog) {
113
+ clearTimeout(this.pingWatchdog);
114
+ this.pingWatchdog = null;
115
+ }
116
+ }
95
117
  }
96
118
  //# sourceMappingURL=wsClient.js.map