@ccpocket-base-auth/bridge 1.26.0

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 (89) hide show
  1. package/README.md +67 -0
  2. package/dist/archive-store.d.ts +28 -0
  3. package/dist/archive-store.js +68 -0
  4. package/dist/archive-store.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +82 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/codex-process.d.ts +171 -0
  9. package/dist/codex-process.js +1928 -0
  10. package/dist/codex-process.js.map +1 -0
  11. package/dist/debug-trace-store.d.ts +15 -0
  12. package/dist/debug-trace-store.js +78 -0
  13. package/dist/debug-trace-store.js.map +1 -0
  14. package/dist/doctor.d.ts +58 -0
  15. package/dist/doctor.js +663 -0
  16. package/dist/doctor.js.map +1 -0
  17. package/dist/firebase-auth.d.ts +35 -0
  18. package/dist/firebase-auth.js +132 -0
  19. package/dist/firebase-auth.js.map +1 -0
  20. package/dist/gallery-store.d.ts +67 -0
  21. package/dist/gallery-store.js +333 -0
  22. package/dist/gallery-store.js.map +1 -0
  23. package/dist/image-store.d.ts +23 -0
  24. package/dist/image-store.js +142 -0
  25. package/dist/image-store.js.map +1 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +191 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mdns.d.ts +7 -0
  30. package/dist/mdns.js +49 -0
  31. package/dist/mdns.js.map +1 -0
  32. package/dist/parser.d.ts +465 -0
  33. package/dist/parser.js +251 -0
  34. package/dist/parser.js.map +1 -0
  35. package/dist/project-history.d.ts +10 -0
  36. package/dist/project-history.js +73 -0
  37. package/dist/project-history.js.map +1 -0
  38. package/dist/prompt-history-backup.d.ts +15 -0
  39. package/dist/prompt-history-backup.js +46 -0
  40. package/dist/prompt-history-backup.js.map +1 -0
  41. package/dist/proxy.d.ts +15 -0
  42. package/dist/proxy.js +95 -0
  43. package/dist/proxy.js.map +1 -0
  44. package/dist/push-i18n.d.ts +7 -0
  45. package/dist/push-i18n.js +75 -0
  46. package/dist/push-i18n.js.map +1 -0
  47. package/dist/push-relay.d.ts +29 -0
  48. package/dist/push-relay.js +70 -0
  49. package/dist/push-relay.js.map +1 -0
  50. package/dist/recording-store.d.ts +51 -0
  51. package/dist/recording-store.js +158 -0
  52. package/dist/recording-store.js.map +1 -0
  53. package/dist/screenshot.d.ts +28 -0
  54. package/dist/screenshot.js +98 -0
  55. package/dist/screenshot.js.map +1 -0
  56. package/dist/sdk-process.d.ts +180 -0
  57. package/dist/sdk-process.js +937 -0
  58. package/dist/sdk-process.js.map +1 -0
  59. package/dist/session.d.ts +142 -0
  60. package/dist/session.js +615 -0
  61. package/dist/session.js.map +1 -0
  62. package/dist/sessions-index.d.ts +128 -0
  63. package/dist/sessions-index.js +1767 -0
  64. package/dist/sessions-index.js.map +1 -0
  65. package/dist/setup-launchd.d.ts +8 -0
  66. package/dist/setup-launchd.js +109 -0
  67. package/dist/setup-launchd.js.map +1 -0
  68. package/dist/setup-systemd.d.ts +8 -0
  69. package/dist/setup-systemd.js +118 -0
  70. package/dist/setup-systemd.js.map +1 -0
  71. package/dist/startup-info.d.ts +8 -0
  72. package/dist/startup-info.js +92 -0
  73. package/dist/startup-info.js.map +1 -0
  74. package/dist/usage.d.ts +69 -0
  75. package/dist/usage.js +545 -0
  76. package/dist/usage.js.map +1 -0
  77. package/dist/version.d.ts +13 -0
  78. package/dist/version.js +43 -0
  79. package/dist/version.js.map +1 -0
  80. package/dist/websocket.d.ts +127 -0
  81. package/dist/websocket.js +2482 -0
  82. package/dist/websocket.js.map +1 -0
  83. package/dist/worktree-store.d.ts +25 -0
  84. package/dist/worktree-store.js +59 -0
  85. package/dist/worktree-store.js.map +1 -0
  86. package/dist/worktree.d.ts +47 -0
  87. package/dist/worktree.js +313 -0
  88. package/dist/worktree.js.map +1 -0
  89. package/package.json +68 -0
@@ -0,0 +1,615 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { execFileSync } from "node:child_process";
3
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { pathToSlug, renameClaudeSession, renameCodexSession } from "./sessions-index.js";
7
+ import { SdkProcess } from "./sdk-process.js";
8
+ import { CodexProcess } from "./codex-process.js";
9
+ import { createWorktree } from "./worktree.js";
10
+ const MAX_HISTORY_PER_SESSION = 100;
11
+ export class SessionManager {
12
+ sessions = new Map();
13
+ onMessage;
14
+ imageStore;
15
+ galleryStore;
16
+ onGalleryImage;
17
+ worktreeStore;
18
+ /** Cache slash commands per project path for early loading on subsequent sessions. */
19
+ commandCache = new Map();
20
+ constructor(onMessage, imageStore, galleryStore, onGalleryImage, worktreeStore) {
21
+ this.onMessage = onMessage;
22
+ this.imageStore = imageStore ?? null;
23
+ this.galleryStore = galleryStore ?? null;
24
+ this.onGalleryImage = onGalleryImage ?? null;
25
+ this.worktreeStore = worktreeStore ?? null;
26
+ }
27
+ create(projectPath, options, pastMessages, worktreeOpts, provider, codexOptions) {
28
+ const id = randomUUID().slice(0, 8);
29
+ const effectiveProvider = provider ?? "claude";
30
+ const proc = effectiveProvider === "codex" ? new CodexProcess() : new SdkProcess();
31
+ // Handle worktree: reuse existing or create new
32
+ let wtPath;
33
+ let wtBranch;
34
+ if (worktreeOpts?.existingWorktreePath) {
35
+ // Reuse an existing worktree (resume case)
36
+ wtPath = worktreeOpts.existingWorktreePath;
37
+ wtBranch = worktreeOpts.worktreeBranch;
38
+ console.log(`[session] Reusing existing worktree at ${wtPath}`);
39
+ }
40
+ else if (worktreeOpts?.useWorktree) {
41
+ // Create a new worktree
42
+ try {
43
+ const wt = createWorktree(projectPath, id, worktreeOpts.worktreeBranch);
44
+ wtPath = wt.worktreePath;
45
+ wtBranch = wt.branch;
46
+ console.log(`[session] Created worktree at ${wtPath} (branch: ${wtBranch})`);
47
+ }
48
+ catch (err) {
49
+ console.error(`[session] Failed to create worktree:`, err);
50
+ // Fall through to use original projectPath
51
+ }
52
+ }
53
+ // Use worktree path as cwd if available
54
+ const effectiveCwd = wtPath ?? projectPath;
55
+ let gitBranch = "";
56
+ try {
57
+ gitBranch = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
58
+ cwd: effectiveCwd, encoding: "utf-8",
59
+ }).trim();
60
+ }
61
+ catch { /* not a git repo */ }
62
+ const session = {
63
+ id,
64
+ process: proc,
65
+ provider: effectiveProvider,
66
+ history: [],
67
+ pastMessages: pastMessages && pastMessages.length > 0 ? pastMessages : undefined,
68
+ projectPath,
69
+ status: "starting",
70
+ createdAt: new Date(),
71
+ lastActivityAt: new Date(),
72
+ gitBranch,
73
+ worktreePath: wtPath,
74
+ worktreeBranch: wtBranch,
75
+ // Pre-populate claudeSessionId for resumed sessions so that get_history
76
+ // can return it immediately (before the SDK sends a system/result event).
77
+ claudeSessionId: options?.sessionId,
78
+ };
79
+ // Cache tool_use id → name for enriching tool_result messages
80
+ const toolUseNames = new Map();
81
+ proc.on("message", async (msg) => {
82
+ try {
83
+ session.lastActivityAt = new Date();
84
+ if (effectiveProvider === "claude") {
85
+ // Capture Claude session_id from result events
86
+ if (msg.type === "result" && "sessionId" in msg && msg.sessionId) {
87
+ session.claudeSessionId = msg.sessionId;
88
+ this.saveWorktreeMapping(session);
89
+ }
90
+ if (msg.type === "system" && "sessionId" in msg && msg.sessionId) {
91
+ session.claudeSessionId = msg.sessionId;
92
+ this.saveWorktreeMapping(session);
93
+ }
94
+ // Cache slash commands and skills from system messages.
95
+ if (msg.type === "system" &&
96
+ (msg.subtype === "init" || msg.subtype === "supported_commands") &&
97
+ msg.slashCommands) {
98
+ this.commandCache.set(projectPath, {
99
+ slashCommands: msg.slashCommands,
100
+ skills: msg.skills ?? this.commandCache.get(projectPath)?.skills ?? [],
101
+ skillMetadata: msg.skillMetadata ?? this.commandCache.get(projectPath)?.skillMetadata,
102
+ });
103
+ }
104
+ // Cache tool_use names from assistant messages
105
+ if (msg.type === "assistant" && Array.isArray(msg.message.content)) {
106
+ for (const content of msg.message.content) {
107
+ if (content.type === "tool_use") {
108
+ const toolUse = content;
109
+ toolUseNames.set(toolUse.id, toolUse.name);
110
+ }
111
+ }
112
+ }
113
+ // Enrich tool_result with toolName
114
+ if (msg.type === "tool_result") {
115
+ const cachedName = toolUseNames.get(msg.toolUseId);
116
+ if (cachedName) {
117
+ msg = { ...msg, toolName: cachedName };
118
+ }
119
+ }
120
+ }
121
+ else {
122
+ // Codex: capture thread_id for session tracking and worktree restore.
123
+ if (msg.type === "system" && "sessionId" in msg && msg.sessionId) {
124
+ session.claudeSessionId = msg.sessionId;
125
+ this.saveWorktreeMapping(session);
126
+ }
127
+ }
128
+ // Extract images from tool_result content for both Claude and Codex.
129
+ if (msg.type === "tool_result" && this.imageStore) {
130
+ const paths = this.imageStore.extractImagePaths(msg.content);
131
+ if (paths.length > 0) {
132
+ const images = await this.imageStore.registerImages(paths, session.projectPath);
133
+ if (images.length > 0) {
134
+ msg = { ...msg, images };
135
+ }
136
+ // Also register in GalleryStore (disk-persistent)
137
+ if (this.galleryStore) {
138
+ for (const p of paths) {
139
+ const meta = await this.galleryStore.addImage(p, session.projectPath, session.id);
140
+ if (meta && this.onGalleryImage) {
141
+ this.onGalleryImage(meta);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ // Extract base64 images from content blocks (e.g., MCP screenshots)
147
+ if (msg.rawContentBlocks) {
148
+ const imageBlocks = msg.rawContentBlocks
149
+ .filter((c) => c.type === "image" && c.source?.type === "base64");
150
+ if (imageBlocks.length > 0) {
151
+ const existingImages = msg.images ?? [];
152
+ const newImages = [];
153
+ for (const block of imageBlocks) {
154
+ const source = block.source;
155
+ if (typeof source?.data !== "string" || typeof source?.media_type !== "string")
156
+ continue;
157
+ const b64Data = source.data;
158
+ const mimeType = source.media_type;
159
+ const ref = this.imageStore.registerFromBase64(b64Data, mimeType);
160
+ if (ref) {
161
+ newImages.push(ref);
162
+ // Also persist to GalleryStore
163
+ if (this.galleryStore) {
164
+ const meta = await this.galleryStore.addImageFromBase64(b64Data, mimeType, session.projectPath, session.id);
165
+ if (meta && this.onGalleryImage) {
166
+ this.onGalleryImage(meta);
167
+ }
168
+ }
169
+ }
170
+ }
171
+ if (newImages.length > 0) {
172
+ msg = { ...msg, images: [...existingImages, ...newImages] };
173
+ }
174
+ }
175
+ // Strip transient rawContentBlocks before sending to client
176
+ const { rawContentBlocks: _, ...cleanMsg } = msg;
177
+ msg = cleanMsg;
178
+ }
179
+ }
180
+ // Don't add streaming deltas to history
181
+ if (msg.type !== "stream_delta" && msg.type !== "thinking_delta") {
182
+ // When SDK echoes back a user_input with UUID, merge into the
183
+ // UUID-less placeholder that websocket.ts pushed earlier.
184
+ // This avoids duplicate entries while preserving the UUID needed
185
+ // for rewind candidate matching.
186
+ let merged = false;
187
+ if (msg.type === "user_input" &&
188
+ "userMessageUuid" in msg &&
189
+ msg.userMessageUuid) {
190
+ for (let i = session.history.length - 1; i >= 0; i--) {
191
+ const m = session.history[i];
192
+ if (m.type === "user_input" &&
193
+ !("userMessageUuid" in m && m.userMessageUuid)) {
194
+ // Preserve the original text from the user input and only
195
+ // take the UUID from the SDK echo. The SDK may return a
196
+ // transformed/translated version of the user's message, so
197
+ // we must not overwrite the original text.
198
+ session.history[i] = {
199
+ ...m,
200
+ userMessageUuid: msg.userMessageUuid,
201
+ };
202
+ merged = true;
203
+ break;
204
+ }
205
+ }
206
+ }
207
+ if (!merged) {
208
+ session.history.push(msg);
209
+ }
210
+ if (session.history.length > MAX_HISTORY_PER_SESSION) {
211
+ // Protect user_input and system messages from eviction so they
212
+ // remain available when the client requests history after
213
+ // reconnecting. System messages carry slash commands, permission
214
+ // modes, and other metadata needed to restore client state.
215
+ const idx = session.history.findIndex(m => m.type !== "user_input" && m.type !== "system");
216
+ if (idx >= 0) {
217
+ session.history.splice(idx, 1);
218
+ }
219
+ else {
220
+ session.history.shift();
221
+ }
222
+ }
223
+ }
224
+ this.onMessage(id, msg);
225
+ // After a result (turn complete), backfill UUIDs from disk.
226
+ // The SDK does not echo user messages via the stream, so
227
+ // in-memory user_input entries lack UUIDs. The disk
228
+ // conversation file always has them.
229
+ if (msg.type === "result") {
230
+ this.backfillUserUuidsFromDisk(session);
231
+ }
232
+ }
233
+ catch (err) {
234
+ console.error(`[session] Error processing message for session ${id}:`, err);
235
+ }
236
+ });
237
+ proc.on("status", (status) => {
238
+ session.status = status;
239
+ });
240
+ proc.on("exit", () => {
241
+ session.status = "idle";
242
+ // Add status message to history so it stays in sync with session.status
243
+ session.history.push({ type: "status", status: "idle" });
244
+ });
245
+ // Re-persist customTitle after CLI finishes writing sessions-index.json.
246
+ // session_end fires after the query iterator completes (CLI has shut down
247
+ // and flushed its files), so writing the name here prevents the CLI from
248
+ // overwriting our customTitle.
249
+ if (proc instanceof SdkProcess) {
250
+ proc.on("session_end", async () => {
251
+ if (!session.name)
252
+ return;
253
+ try {
254
+ if (session.provider === "claude" && session.claudeSessionId) {
255
+ await renameClaudeSession(session.worktreePath ?? session.projectPath, session.claudeSessionId, session.name);
256
+ }
257
+ else if (session.provider === "codex" && session.claudeSessionId) {
258
+ await renameCodexSession(session.claudeSessionId, session.name);
259
+ }
260
+ }
261
+ catch (err) {
262
+ console.warn(`[session] Failed to re-persist session name on session end:`, err);
263
+ }
264
+ });
265
+ }
266
+ // Store Claude sandbox state for resume
267
+ if (effectiveProvider === "claude" && options?.sandboxEnabled != null) {
268
+ session.sandboxEnabled = options.sandboxEnabled;
269
+ }
270
+ if (effectiveProvider === "codex" && codexOptions) {
271
+ session.codexSettings = {
272
+ approvalPolicy: codexOptions.approvalPolicy,
273
+ sandboxMode: codexOptions.sandboxMode,
274
+ model: codexOptions.model,
275
+ modelReasoningEffort: codexOptions.modelReasoningEffort,
276
+ networkAccessEnabled: codexOptions.networkAccessEnabled,
277
+ webSearchMode: codexOptions.webSearchMode,
278
+ };
279
+ // Resume starts know the thread id up front.
280
+ if (codexOptions.threadId) {
281
+ session.claudeSessionId = codexOptions.threadId;
282
+ this.saveWorktreeMapping(session);
283
+ }
284
+ }
285
+ if (effectiveProvider === "codex") {
286
+ proc.start(effectiveCwd, codexOptions);
287
+ }
288
+ else {
289
+ proc.start(effectiveCwd, options);
290
+ }
291
+ // Add session to Map only after proc.start() succeeds.
292
+ // If start() throws, no zombie session is left behind.
293
+ this.sessions.set(id, session);
294
+ console.log(`[session] Created ${effectiveProvider} session ${id} for ${effectiveCwd}${wtPath ? ` (worktree of ${projectPath})` : ""}`);
295
+ return id;
296
+ }
297
+ get(id) {
298
+ return this.sessions.get(id);
299
+ }
300
+ list() {
301
+ return Array.from(this.sessions.values()).map((s) => {
302
+ const processWithPending = s.process;
303
+ const pendingPermission = s.status === "waiting_approval"
304
+ ? processWithPending.getPendingPermission?.()
305
+ : undefined;
306
+ return {
307
+ id: s.id,
308
+ provider: s.provider,
309
+ projectPath: s.projectPath,
310
+ claudeSessionId: s.claudeSessionId,
311
+ name: s.name,
312
+ status: s.status,
313
+ createdAt: s.createdAt.toISOString(),
314
+ lastActivityAt: s.lastActivityAt.toISOString(),
315
+ gitBranch: s.gitBranch,
316
+ lastMessage: this.extractLastMessage(s),
317
+ worktreePath: s.worktreePath,
318
+ worktreeBranch: s.worktreeBranch,
319
+ permissionMode: s.process instanceof SdkProcess
320
+ ? s.process.permissionMode
321
+ : s.process instanceof CodexProcess
322
+ ? (s.process.collaborationMode === "plan"
323
+ ? "plan"
324
+ : s.process.approvalPolicy === "never"
325
+ ? "bypassPermissions"
326
+ : "acceptEdits")
327
+ : undefined,
328
+ model: s.process instanceof SdkProcess
329
+ ? s.process.model
330
+ : undefined,
331
+ codexSettings: s.codexSettings,
332
+ agentNickname: s.process instanceof CodexProcess
333
+ ? s.process.agentNickname ?? undefined
334
+ : undefined,
335
+ agentRole: s.process instanceof CodexProcess
336
+ ? s.process.agentRole ?? undefined
337
+ : undefined,
338
+ sandboxEnabled: s.sandboxEnabled,
339
+ pendingPermission,
340
+ };
341
+ });
342
+ }
343
+ extractLastMessage(s) {
344
+ // Search in-memory history (newest first) for assistant text
345
+ for (let i = s.history.length - 1; i >= 0; i--) {
346
+ const msg = s.history[i];
347
+ if (msg.type === "assistant") {
348
+ const textBlock = msg.message.content.find((c) => c.type === "text");
349
+ if (textBlock && "text" in textBlock && textBlock.text) {
350
+ return textBlock.text.replace(/\s+/g, " ").trim().slice(0, 100);
351
+ }
352
+ }
353
+ }
354
+ // Fallback to pastMessages (raw Claude CLI format)
355
+ if (s.pastMessages) {
356
+ for (let i = s.pastMessages.length - 1; i >= 0; i--) {
357
+ const msg = s.pastMessages[i];
358
+ if (msg.role === "assistant") {
359
+ // Handle string content (defensive — normally array)
360
+ if (typeof msg.content === "string") {
361
+ return msg.content.replace(/\s+/g, " ").trim().slice(0, 100);
362
+ }
363
+ const content = msg.content;
364
+ const textBlock = content?.find((c) => c.type === "text");
365
+ if (textBlock?.text)
366
+ return textBlock.text.replace(/\s+/g, " ").trim().slice(0, 100);
367
+ }
368
+ }
369
+ }
370
+ return "";
371
+ }
372
+ getCachedCommands(projectPath) {
373
+ return this.commandCache.get(projectPath);
374
+ }
375
+ /** Get worktree store for external use (e.g., resume_session in websocket.ts). */
376
+ getWorktreeStore() {
377
+ return this.worktreeStore;
378
+ }
379
+ /** Save worktree mapping when a provider session ID is available. */
380
+ saveWorktreeMapping(session) {
381
+ if (this.worktreeStore && session.claudeSessionId && session.worktreePath && session.worktreeBranch) {
382
+ this.worktreeStore.set(session.claudeSessionId, {
383
+ worktreePath: session.worktreePath,
384
+ worktreeBranch: session.worktreeBranch,
385
+ projectPath: session.projectPath,
386
+ });
387
+ }
388
+ }
389
+ /**
390
+ * Rewind files to their state at the specified user message.
391
+ * Delegates to the session's SdkProcess.rewindFiles().
392
+ */
393
+ async rewindFiles(id, targetUuid, dryRun) {
394
+ const session = this.sessions.get(id);
395
+ if (!session) {
396
+ return { canRewind: false, error: "Session not found" };
397
+ }
398
+ if (session.provider === "codex") {
399
+ return { canRewind: false, error: "Rewind is not supported for Codex sessions" };
400
+ }
401
+ return session.process.rewindFiles(targetUuid, dryRun);
402
+ }
403
+ /**
404
+ * Rewind the conversation to a specific point.
405
+ * Stops the current process and restarts with resumeSessionAt.
406
+ *
407
+ * `targetUuid` is a **user message UUID**. The SDK's `resumeSessionAt`
408
+ * expects an **assistant message UUID**, so we look up the assistant
409
+ * message that follows the target user message.
410
+ */
411
+ rewindConversation(id, targetUuid, onReady) {
412
+ const session = this.sessions.get(id);
413
+ if (!session) {
414
+ throw new Error(`Session ${id} not found`);
415
+ }
416
+ if (session.provider === "codex") {
417
+ throw new Error("Rewind is not supported for Codex sessions");
418
+ }
419
+ const claudeSessionId = session.claudeSessionId;
420
+ if (!claudeSessionId) {
421
+ throw new Error("Session has no Claude session ID");
422
+ }
423
+ // resumeSessionAt expects assistant message UUID (per SDK docs).
424
+ // Convert user UUID → following assistant UUID.
425
+ const assistantUuid = this.findAssistantUuidAfterUser(session, targetUuid);
426
+ if (!assistantUuid) {
427
+ throw new Error("Cannot find assistant message after target user message");
428
+ }
429
+ const projectPath = session.projectPath;
430
+ const permissionMode = session.process.permissionMode;
431
+ const worktreePath = session.worktreePath;
432
+ const worktreeBranch = session.worktreeBranch;
433
+ // Stop and destroy the current session
434
+ this.destroy(id);
435
+ // Create a new session with resumeSessionAt (assistant UUID)
436
+ const newId = this.create(projectPath, {
437
+ sessionId: claudeSessionId,
438
+ permissionMode,
439
+ resumeSessionAt: assistantUuid,
440
+ }, undefined, worktreePath ? { existingWorktreePath: worktreePath, worktreeBranch } : undefined);
441
+ onReady(newId);
442
+ }
443
+ /**
444
+ * Find the assistant message UUID that follows a given user message UUID.
445
+ *
446
+ * Searches in-memory history first, then pastMessages (disk history).
447
+ */
448
+ findAssistantUuidAfterUser(session, userUuid) {
449
+ // 1. Search in-memory history
450
+ let foundUser = false;
451
+ for (const msg of session.history) {
452
+ if (!foundUser) {
453
+ // user_input or tool_result with matching userMessageUuid
454
+ if ((msg.type === "user_input" || msg.type === "tool_result") &&
455
+ "userMessageUuid" in msg &&
456
+ msg.userMessageUuid === userUuid) {
457
+ foundUser = true;
458
+ }
459
+ continue;
460
+ }
461
+ // Found user message — look for next assistant
462
+ if (msg.type === "assistant" && "messageUuid" in msg && msg.messageUuid) {
463
+ return msg.messageUuid;
464
+ }
465
+ }
466
+ // 2. Search pastMessages (disk history with uuid field)
467
+ if (session.pastMessages) {
468
+ foundUser = false;
469
+ for (const raw of session.pastMessages) {
470
+ const pm = raw;
471
+ if (!foundUser) {
472
+ if (pm.role === "user" && pm.uuid === userUuid) {
473
+ foundUser = true;
474
+ }
475
+ continue;
476
+ }
477
+ if (pm.role === "assistant" && pm.uuid) {
478
+ return pm.uuid;
479
+ }
480
+ }
481
+ }
482
+ return null;
483
+ }
484
+ /**
485
+ * Read the Claude CLI conversation history file from disk and backfill
486
+ * `userMessageUuid` into in-memory history entries that are missing it.
487
+ *
488
+ * The SDK does not echo user messages via the stream, so in-memory
489
+ * `user_input` entries (pushed by websocket.ts) lack UUIDs. The disk
490
+ * file, however, always contains UUIDs. We match by text content.
491
+ *
492
+ * Also re-broadcasts the updated `user_input` message so the Flutter
493
+ * client can update its UserChatEntry.messageUuid values.
494
+ */
495
+ backfillUserUuidsFromDisk(session) {
496
+ if (!session.claudeSessionId || !session.projectPath)
497
+ return;
498
+ const historyPath = this.findHistoryJsonlPath(session);
499
+ if (!historyPath)
500
+ return;
501
+ let lines;
502
+ try {
503
+ const raw = readFileSync(historyPath, "utf-8").trim();
504
+ if (!raw)
505
+ return;
506
+ lines = raw.split("\n");
507
+ }
508
+ catch {
509
+ // File may not exist yet (e.g., very new session)
510
+ return;
511
+ }
512
+ // Collect user message text→uuid queue from disk.
513
+ // Use an array per text key so duplicate messages ("yes", "ok", etc.)
514
+ // are matched in order rather than collapsed to one UUID.
515
+ const diskUuids = new Map();
516
+ for (const line of lines) {
517
+ try {
518
+ const entry = JSON.parse(line);
519
+ if (entry.type !== "user" && entry.role !== "user")
520
+ continue;
521
+ if (!entry.uuid)
522
+ continue;
523
+ // Extract text from content array
524
+ const content = entry.message?.content;
525
+ if (!Array.isArray(content))
526
+ continue;
527
+ const texts = content
528
+ .filter((c) => c.type === "text")
529
+ .map((c) => c.text);
530
+ if (texts.length > 0) {
531
+ const key = texts.join("\n");
532
+ const arr = diskUuids.get(key) ?? [];
533
+ arr.push(entry.uuid);
534
+ diskUuids.set(key, arr);
535
+ }
536
+ }
537
+ catch {
538
+ // skip malformed lines
539
+ }
540
+ }
541
+ // Backfill UUIDs into in-memory history
542
+ for (const msg of session.history) {
543
+ if (msg.type === "user_input" &&
544
+ !("userMessageUuid" in msg && msg.userMessageUuid)) {
545
+ const text = msg.text;
546
+ const queue = text ? diskUuids.get(text) : undefined;
547
+ if (queue && queue.length > 0) {
548
+ msg.userMessageUuid = queue.shift();
549
+ // Re-broadcast so Flutter can update UserChatEntry.messageUuid
550
+ this.onMessage(session.id, msg);
551
+ }
552
+ }
553
+ }
554
+ }
555
+ findHistoryJsonlPath(session) {
556
+ if (!session.claudeSessionId)
557
+ return null;
558
+ const projectsDir = join(homedir(), ".claude", "projects");
559
+ const fileName = `${session.claudeSessionId}.jsonl`;
560
+ const slugCandidates = new Set([
561
+ pathToSlug(session.projectPath),
562
+ ]);
563
+ // Worktree sessions are persisted under the worktree slug, not projectPath.
564
+ if (session.worktreePath) {
565
+ slugCandidates.add(pathToSlug(session.worktreePath));
566
+ }
567
+ for (const slug of slugCandidates) {
568
+ const candidate = join(projectsDir, slug, fileName);
569
+ if (existsSync(candidate))
570
+ return candidate;
571
+ }
572
+ // Fallback: scan all project dirs in case metadata paths drift.
573
+ try {
574
+ const entries = readdirSync(projectsDir, { withFileTypes: true });
575
+ for (const entry of entries) {
576
+ if (!entry.isDirectory() || entry.name.startsWith("."))
577
+ continue;
578
+ const candidate = join(projectsDir, entry.name, fileName);
579
+ if (existsSync(candidate))
580
+ return candidate;
581
+ }
582
+ }
583
+ catch {
584
+ return null;
585
+ }
586
+ return null;
587
+ }
588
+ /**
589
+ * Rename a running session (in-memory only).
590
+ * Persistent storage is handled by the caller (websocket.ts).
591
+ */
592
+ renameSession(id, name) {
593
+ const session = this.sessions.get(id);
594
+ if (!session)
595
+ return false;
596
+ session.name = name ?? undefined;
597
+ return true;
598
+ }
599
+ destroy(id) {
600
+ const session = this.sessions.get(id);
601
+ if (!session)
602
+ return false;
603
+ session.process.stop();
604
+ session.process.removeAllListeners();
605
+ this.sessions.delete(id);
606
+ console.log(`[session] Destroyed session ${id}`);
607
+ return true;
608
+ }
609
+ destroyAll() {
610
+ for (const [id] of this.sessions) {
611
+ this.destroy(id);
612
+ }
613
+ }
614
+ }
615
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}