@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.
- package/README.md +67 -0
- package/dist/archive-store.d.ts +28 -0
- package/dist/archive-store.js +68 -0
- package/dist/archive-store.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +82 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-process.d.ts +171 -0
- package/dist/codex-process.js +1928 -0
- package/dist/codex-process.js.map +1 -0
- package/dist/debug-trace-store.d.ts +15 -0
- package/dist/debug-trace-store.js +78 -0
- package/dist/debug-trace-store.js.map +1 -0
- package/dist/doctor.d.ts +58 -0
- package/dist/doctor.js +663 -0
- package/dist/doctor.js.map +1 -0
- package/dist/firebase-auth.d.ts +35 -0
- package/dist/firebase-auth.js +132 -0
- package/dist/firebase-auth.js.map +1 -0
- package/dist/gallery-store.d.ts +67 -0
- package/dist/gallery-store.js +333 -0
- package/dist/gallery-store.js.map +1 -0
- package/dist/image-store.d.ts +23 -0
- package/dist/image-store.js +142 -0
- package/dist/image-store.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +191 -0
- package/dist/index.js.map +1 -0
- package/dist/mdns.d.ts +7 -0
- package/dist/mdns.js +49 -0
- package/dist/mdns.js.map +1 -0
- package/dist/parser.d.ts +465 -0
- package/dist/parser.js +251 -0
- package/dist/parser.js.map +1 -0
- package/dist/project-history.d.ts +10 -0
- package/dist/project-history.js +73 -0
- package/dist/project-history.js.map +1 -0
- package/dist/prompt-history-backup.d.ts +15 -0
- package/dist/prompt-history-backup.js +46 -0
- package/dist/prompt-history-backup.js.map +1 -0
- package/dist/proxy.d.ts +15 -0
- package/dist/proxy.js +95 -0
- package/dist/proxy.js.map +1 -0
- package/dist/push-i18n.d.ts +7 -0
- package/dist/push-i18n.js +75 -0
- package/dist/push-i18n.js.map +1 -0
- package/dist/push-relay.d.ts +29 -0
- package/dist/push-relay.js +70 -0
- package/dist/push-relay.js.map +1 -0
- package/dist/recording-store.d.ts +51 -0
- package/dist/recording-store.js +158 -0
- package/dist/recording-store.js.map +1 -0
- package/dist/screenshot.d.ts +28 -0
- package/dist/screenshot.js +98 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/sdk-process.d.ts +180 -0
- package/dist/sdk-process.js +937 -0
- package/dist/sdk-process.js.map +1 -0
- package/dist/session.d.ts +142 -0
- package/dist/session.js +615 -0
- package/dist/session.js.map +1 -0
- package/dist/sessions-index.d.ts +128 -0
- package/dist/sessions-index.js +1767 -0
- package/dist/sessions-index.js.map +1 -0
- package/dist/setup-launchd.d.ts +8 -0
- package/dist/setup-launchd.js +109 -0
- package/dist/setup-launchd.js.map +1 -0
- package/dist/setup-systemd.d.ts +8 -0
- package/dist/setup-systemd.js +118 -0
- package/dist/setup-systemd.js.map +1 -0
- package/dist/startup-info.d.ts +8 -0
- package/dist/startup-info.js +92 -0
- package/dist/startup-info.js.map +1 -0
- package/dist/usage.d.ts +69 -0
- package/dist/usage.js +545 -0
- package/dist/usage.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.js +43 -0
- package/dist/version.js.map +1 -0
- package/dist/websocket.d.ts +127 -0
- package/dist/websocket.js +2482 -0
- package/dist/websocket.js.map +1 -0
- package/dist/worktree-store.d.ts +25 -0
- package/dist/worktree-store.js +59 -0
- package/dist/worktree-store.js.map +1 -0
- package/dist/worktree.d.ts +47 -0
- package/dist/worktree.js +313 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +68 -0
package/dist/session.js
ADDED
|
@@ -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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"}
|