@kenkaiiii/ggcoder 5.26.2 → 5.27.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 (107) hide show
  1. package/dist/app-sidecar.js +81 -47
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/core/agent-session-marker-anchors.test.js +181 -2
  4. package/dist/core/agent-session-marker-anchors.test.js.map +1 -1
  5. package/dist/core/agent-session-process-gate.test.d.ts +2 -0
  6. package/dist/core/agent-session-process-gate.test.d.ts.map +1 -0
  7. package/dist/core/agent-session-process-gate.test.js +88 -0
  8. package/dist/core/agent-session-process-gate.test.js.map +1 -0
  9. package/dist/core/agent-session-slash-restore.test.d.ts +2 -0
  10. package/dist/core/agent-session-slash-restore.test.d.ts.map +1 -0
  11. package/dist/core/agent-session-slash-restore.test.js +121 -0
  12. package/dist/core/agent-session-slash-restore.test.js.map +1 -0
  13. package/dist/core/agent-session.d.ts +66 -0
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +304 -35
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/compaction/compactor.d.ts +21 -0
  18. package/dist/core/compaction/compactor.d.ts.map +1 -1
  19. package/dist/core/compaction/compactor.js +16 -0
  20. package/dist/core/compaction/compactor.js.map +1 -1
  21. package/dist/core/compaction/compactor.test.js +91 -0
  22. package/dist/core/compaction/compactor.test.js.map +1 -1
  23. package/dist/core/foreign-session-import.d.ts +120 -0
  24. package/dist/core/foreign-session-import.d.ts.map +1 -0
  25. package/dist/core/foreign-session-import.js +594 -0
  26. package/dist/core/foreign-session-import.js.map +1 -0
  27. package/dist/core/foreign-session-import.test.d.ts +2 -0
  28. package/dist/core/foreign-session-import.test.d.ts.map +1 -0
  29. package/dist/core/foreign-session-import.test.js +220 -0
  30. package/dist/core/foreign-session-import.test.js.map +1 -0
  31. package/dist/core/foreign-transcript-blocks.d.ts +51 -0
  32. package/dist/core/foreign-transcript-blocks.d.ts.map +1 -0
  33. package/dist/core/foreign-transcript-blocks.js +151 -0
  34. package/dist/core/foreign-transcript-blocks.js.map +1 -0
  35. package/dist/core/mcp/catalog-cache.d.ts +63 -0
  36. package/dist/core/mcp/catalog-cache.d.ts.map +1 -0
  37. package/dist/core/mcp/catalog-cache.js +163 -0
  38. package/dist/core/mcp/catalog-cache.js.map +1 -0
  39. package/dist/core/mcp/catalog-cache.test.d.ts +2 -0
  40. package/dist/core/mcp/catalog-cache.test.d.ts.map +1 -0
  41. package/dist/core/mcp/catalog-cache.test.js +99 -0
  42. package/dist/core/mcp/catalog-cache.test.js.map +1 -0
  43. package/dist/core/mcp/client.d.ts +61 -0
  44. package/dist/core/mcp/client.d.ts.map +1 -1
  45. package/dist/core/mcp/client.js +216 -31
  46. package/dist/core/mcp/client.js.map +1 -1
  47. package/dist/core/mcp/legacy-negotiation.test.d.ts +2 -0
  48. package/dist/core/mcp/legacy-negotiation.test.d.ts.map +1 -0
  49. package/dist/core/mcp/legacy-negotiation.test.js +80 -0
  50. package/dist/core/mcp/legacy-negotiation.test.js.map +1 -0
  51. package/dist/core/mcp/oauth-provider.d.ts +1 -2
  52. package/dist/core/mcp/oauth-provider.d.ts.map +1 -1
  53. package/dist/core/mcp/oauth-provider.js +5 -1
  54. package/dist/core/mcp/oauth-provider.js.map +1 -1
  55. package/dist/core/mcp/oauth-store.d.ts +1 -1
  56. package/dist/core/mcp/oauth-store.d.ts.map +1 -1
  57. package/dist/core/mcp/oauth-store.js.map +1 -1
  58. package/dist/core/mcp/when-connected.test.d.ts +2 -0
  59. package/dist/core/mcp/when-connected.test.d.ts.map +1 -0
  60. package/dist/core/mcp/when-connected.test.js +46 -0
  61. package/dist/core/mcp/when-connected.test.js.map +1 -0
  62. package/dist/core/process-gate.d.ts +45 -0
  63. package/dist/core/process-gate.d.ts.map +1 -0
  64. package/dist/core/process-gate.js +71 -0
  65. package/dist/core/process-gate.js.map +1 -0
  66. package/dist/core/process-gate.test.d.ts +2 -0
  67. package/dist/core/process-gate.test.d.ts.map +1 -0
  68. package/dist/core/process-gate.test.js +87 -0
  69. package/dist/core/process-gate.test.js.map +1 -0
  70. package/dist/core/process-manager.d.ts +9 -0
  71. package/dist/core/process-manager.d.ts.map +1 -1
  72. package/dist/core/process-manager.js +17 -15
  73. package/dist/core/process-manager.js.map +1 -1
  74. package/dist/core/session-history.d.ts +61 -4
  75. package/dist/core/session-history.d.ts.map +1 -1
  76. package/dist/core/session-history.js +144 -15
  77. package/dist/core/session-history.js.map +1 -1
  78. package/dist/core/session-history.test.js +50 -1
  79. package/dist/core/session-history.test.js.map +1 -1
  80. package/dist/core/session-manager.d.ts +35 -6
  81. package/dist/core/session-manager.d.ts.map +1 -1
  82. package/dist/core/session-manager.js +39 -10
  83. package/dist/core/session-manager.js.map +1 -1
  84. package/dist/core/session-manager.test.js +14 -2
  85. package/dist/core/session-manager.test.js.map +1 -1
  86. package/dist/core/settings-manager.d.ts +1 -0
  87. package/dist/core/settings-manager.d.ts.map +1 -1
  88. package/dist/core/settings-manager.js +6 -0
  89. package/dist/core/settings-manager.js.map +1 -1
  90. package/dist/core/slash-commands.d.ts +2 -0
  91. package/dist/core/slash-commands.d.ts.map +1 -1
  92. package/dist/core/slash-commands.js +17 -0
  93. package/dist/core/slash-commands.js.map +1 -1
  94. package/dist/core/slash-commands.test.js +1 -0
  95. package/dist/core/slash-commands.test.js.map +1 -1
  96. package/dist/tools/tool-search.d.ts +12 -1
  97. package/dist/tools/tool-search.d.ts.map +1 -1
  98. package/dist/tools/tool-search.js +22 -3
  99. package/dist/tools/tool-search.js.map +1 -1
  100. package/dist/tools/tool-search.test.d.ts +2 -0
  101. package/dist/tools/tool-search.test.d.ts.map +1 -0
  102. package/dist/tools/tool-search.test.js +69 -0
  103. package/dist/tools/tool-search.test.js.map +1 -0
  104. package/dist/ui/App.d.ts.map +1 -1
  105. package/dist/ui/App.js +27 -1
  106. package/dist/ui/App.js.map +1 -1
  107. package/package.json +5 -5
@@ -0,0 +1,594 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { APP_MARKER_CUSTOM_KIND, } from "./session-manager.js";
5
+ import { asString, compactParts, extractCursorUserQuery, isRecord, joinText, normalizeTimestamp, parseJsonLine, textPart, toolCallPart, toolResultText, } from "./foreign-transcript-blocks.js";
6
+ const EMPTY_DROPPED = () => ({ toolResults: 0, messages: 0, records: 0 });
7
+ /** Human-readable summary of what an import discarded. */
8
+ export function describeDropped(dropped) {
9
+ const parts = [];
10
+ if (dropped.toolResults > 0)
11
+ parts.push(`${dropped.toolResults} unmappable tool result(s)`);
12
+ if (dropped.messages > 0)
13
+ parts.push(`${dropped.messages} empty message record(s)`);
14
+ if (dropped.records > 0)
15
+ parts.push(`${dropped.records} unreadable line(s)`);
16
+ return parts.length > 0 ? parts.join(", ") : "nothing";
17
+ }
18
+ // ── Format detection ───────────────────────────────────────
19
+ /**
20
+ * Identify a transcript from its records. Detection is shape-based, not
21
+ * filename-based, so a transcript copied out of its home directory still
22
+ * imports correctly.
23
+ */
24
+ export function detectForeignFormat(text) {
25
+ for (const line of text.split("\n").slice(0, 60)) {
26
+ const record = parseJsonLine(line);
27
+ if (!record)
28
+ continue;
29
+ const type = asString(record.type);
30
+ // Codex rollout lines wrap everything in `payload`, and its own record
31
+ // types (session_meta / response_item / event_msg / turn_context) are
32
+ // unambiguous.
33
+ if (type === "session_meta" ||
34
+ type === "response_item" ||
35
+ type === "event_msg" ||
36
+ type === "turn_context") {
37
+ return "codex";
38
+ }
39
+ // Pre-late-2025 Codex rollouts have no wrapper: the payload sits at the top
40
+ // level, opening with a `{ id, timestamp, git }` header.
41
+ if (type === undefined &&
42
+ typeof record.id === "string" &&
43
+ "timestamp" in record &&
44
+ "git" in record) {
45
+ return "codex";
46
+ }
47
+ if ((type === "function_call" || type === "function_call_output" || type === "reasoning") &&
48
+ !("uuid" in record)) {
49
+ return "codex";
50
+ }
51
+ // Claude Code records carry a uuid/parentUuid DAG alongside `message`.
52
+ if ((type === "user" || type === "assistant") && "uuid" in record && "message" in record) {
53
+ return "claude";
54
+ }
55
+ if (asString(record.source) === "cursor" || asString(record.client) === "cursor") {
56
+ return "cursor";
57
+ }
58
+ }
59
+ return undefined;
60
+ }
61
+ // ── Public entry point ─────────────────────────────────────
62
+ export function parseForeignTranscript(text, format) {
63
+ const resolved = format ?? detectForeignFormat(text);
64
+ if (!resolved) {
65
+ throw new Error("Unrecognized transcript format. Supported: Claude Code, Codex and Cursor JSONL sessions.");
66
+ }
67
+ switch (resolved) {
68
+ case "claude":
69
+ return parseClaudeTranscript(text);
70
+ case "codex":
71
+ return parseCodexTranscript(text);
72
+ case "cursor":
73
+ return parseCursorTranscript(text);
74
+ }
75
+ }
76
+ // ── Shared accumulator ─────────────────────────────────────
77
+ /**
78
+ * Collects parsed parts into well-formed `Message[]`.
79
+ *
80
+ * Every format interleaves assistant text, tool calls and tool results across
81
+ * separate records, so parsers push fragments and this class decides where a
82
+ * message boundary falls: consecutive assistant parts merge into one assistant
83
+ * message, and tool results batch into one `role:"tool"` message.
84
+ */
85
+ class TranscriptBuilder {
86
+ messages = [];
87
+ dropped = EMPTY_DROPPED();
88
+ pendingAssistant = [];
89
+ pendingToolResults = [];
90
+ /** Tool-call ids seen so far, so an orphan result is dropped, not invented. */
91
+ knownCallIds = new Set();
92
+ preview;
93
+ cwd;
94
+ startedAt;
95
+ noteTimestamp(value) {
96
+ const ms = normalizeTimestamp(value);
97
+ if (ms !== undefined && (this.startedAt === undefined || ms < this.startedAt)) {
98
+ this.startedAt = ms;
99
+ }
100
+ }
101
+ noteCwd(value) {
102
+ const cwd = asString(value);
103
+ if (cwd && !this.cwd)
104
+ this.cwd = cwd;
105
+ }
106
+ pushUser(text) {
107
+ const trimmed = text.trim();
108
+ if (!trimmed) {
109
+ this.dropped.messages += 1;
110
+ return;
111
+ }
112
+ this.flush();
113
+ if (!this.preview)
114
+ this.preview = trimmed;
115
+ this.messages.push({ role: "user", content: trimmed });
116
+ }
117
+ pushAssistant(parts) {
118
+ const usable = compactParts(parts);
119
+ if (usable.length === 0)
120
+ return;
121
+ // A tool result must not be reordered before the call it answers.
122
+ this.flushToolResults();
123
+ for (const part of usable) {
124
+ if (part.type === "tool_call")
125
+ this.knownCallIds.add(part.id);
126
+ }
127
+ this.pendingAssistant.push(...usable);
128
+ }
129
+ pushToolResult(callId, content, isError) {
130
+ if (!this.knownCallIds.has(callId)) {
131
+ // No matching call in this transcript: emitting it would invent a pairing
132
+ // the provider will reject on resume.
133
+ this.dropped.toolResults += 1;
134
+ return;
135
+ }
136
+ this.flushAssistant();
137
+ this.pendingToolResults.push({
138
+ type: "tool_result",
139
+ toolCallId: callId,
140
+ content,
141
+ ...(isError ? { isError: true } : {}),
142
+ });
143
+ }
144
+ flushAssistant() {
145
+ if (this.pendingAssistant.length === 0)
146
+ return;
147
+ this.messages.push({ role: "assistant", content: this.pendingAssistant });
148
+ this.pendingAssistant = [];
149
+ }
150
+ flushToolResults() {
151
+ if (this.pendingToolResults.length === 0)
152
+ return;
153
+ this.messages.push({ role: "tool", content: this.pendingToolResults });
154
+ this.pendingToolResults = [];
155
+ }
156
+ flush() {
157
+ this.flushAssistant();
158
+ this.flushToolResults();
159
+ }
160
+ /**
161
+ * Finish the transcript. A trailing assistant message whose last act was an
162
+ * unanswered tool call cannot be resumed (providers reject a dangling call),
163
+ * so those trailing calls are dropped.
164
+ */
165
+ finish(format) {
166
+ this.flush();
167
+ this.dropTrailingUnansweredCalls();
168
+ return {
169
+ format,
170
+ messages: this.messages,
171
+ ...(this.cwd ? { cwd: this.cwd } : {}),
172
+ ...(this.preview ? { preview: this.preview } : {}),
173
+ ...(this.startedAt !== undefined ? { startedAt: this.startedAt } : {}),
174
+ dropped: this.dropped,
175
+ };
176
+ }
177
+ dropTrailingUnansweredCalls() {
178
+ const last = this.messages[this.messages.length - 1];
179
+ if (!last || last.role !== "assistant" || typeof last.content === "string")
180
+ return;
181
+ const answered = new Set();
182
+ for (const message of this.messages) {
183
+ if (message.role !== "tool")
184
+ continue;
185
+ for (const result of message.content)
186
+ answered.add(result.toolCallId);
187
+ }
188
+ const kept = last.content.filter((part) => part.type !== "tool_call" || answered.has(part.id));
189
+ if (kept.length === last.content.length)
190
+ return;
191
+ this.dropped.toolResults += last.content.length - kept.length;
192
+ if (kept.length === 0)
193
+ this.messages.pop();
194
+ else
195
+ last.content = kept;
196
+ }
197
+ }
198
+ // ── Claude Code ────────────────────────────────────────────
199
+ /**
200
+ * Claude Code writes one JSONL record per DAG node under
201
+ * `~/.claude/projects/<encoded-cwd>/<session>.jsonl`. Message records are
202
+ * `{ type: "user"|"assistant", message: { role, content }, uuid, cwd, timestamp }`
203
+ * where `content` is a string or an Anthropic content-block array. Non-message
204
+ * record types (system, file-history-snapshot, mode, …) are UI state, not
205
+ * conversation, and are skipped without counting as data loss.
206
+ */
207
+ export function parseClaudeTranscript(text) {
208
+ const builder = new TranscriptBuilder();
209
+ const CONVERSATION_TYPES = new Set(["user", "assistant"]);
210
+ const SKIPPED_TYPES = new Set([
211
+ "system",
212
+ "summary",
213
+ "mode",
214
+ "permission-mode",
215
+ "last-prompt",
216
+ "file-history-snapshot",
217
+ ]);
218
+ for (const line of text.split("\n")) {
219
+ const record = parseJsonLine(line);
220
+ if (!record) {
221
+ if (line.trim())
222
+ builder.dropped.records += 1;
223
+ continue;
224
+ }
225
+ const type = asString(record.type);
226
+ if (!type || SKIPPED_TYPES.has(type))
227
+ continue;
228
+ if (!CONVERSATION_TYPES.has(type))
229
+ continue;
230
+ // Sidechain records are a subagent's private thread, not this conversation.
231
+ if (record.isSidechain === true)
232
+ continue;
233
+ builder.noteCwd(record.cwd);
234
+ builder.noteTimestamp(record.timestamp);
235
+ const message = isRecord(record.message) ? record.message : undefined;
236
+ if (!message)
237
+ continue;
238
+ const content = message.content;
239
+ if (type === "user") {
240
+ const direct = asString(content);
241
+ if (direct !== undefined) {
242
+ builder.pushUser(direct);
243
+ continue;
244
+ }
245
+ if (!Array.isArray(content))
246
+ continue;
247
+ // A "user" record is also how Claude records tool_result blocks.
248
+ const userText = [];
249
+ for (const block of content) {
250
+ if (!isRecord(block))
251
+ continue;
252
+ if (block.type === "tool_result") {
253
+ const callId = asString(block.tool_use_id);
254
+ if (!callId) {
255
+ builder.dropped.toolResults += 1;
256
+ continue;
257
+ }
258
+ builder.pushToolResult(callId, toolResultText(block.content), block.is_error === true);
259
+ }
260
+ else if (block.type === "text") {
261
+ const blockText = asString(block.text);
262
+ if (blockText)
263
+ userText.push(blockText);
264
+ }
265
+ }
266
+ if (userText.length > 0)
267
+ builder.pushUser(joinText(userText));
268
+ continue;
269
+ }
270
+ const parts = [];
271
+ const direct = asString(content);
272
+ if (direct !== undefined) {
273
+ parts.push(textPart(direct));
274
+ }
275
+ else if (Array.isArray(content)) {
276
+ for (const block of content) {
277
+ if (!isRecord(block))
278
+ continue;
279
+ switch (block.type) {
280
+ case "text": {
281
+ const blockText = asString(block.text);
282
+ if (blockText)
283
+ parts.push(textPart(blockText));
284
+ break;
285
+ }
286
+ case "thinking": {
287
+ const thinking = asString(block.thinking);
288
+ if (thinking)
289
+ parts.push({ type: "thinking", text: thinking });
290
+ break;
291
+ }
292
+ case "tool_use": {
293
+ const id = asString(block.id);
294
+ const name = asString(block.name);
295
+ if (id && name)
296
+ parts.push(toolCallPart(id, name, block.input));
297
+ break;
298
+ }
299
+ default:
300
+ break;
301
+ }
302
+ }
303
+ }
304
+ builder.pushAssistant(parts);
305
+ }
306
+ return builder.finish("claude");
307
+ }
308
+ // ── Codex ──────────────────────────────────────────────────
309
+ /**
310
+ * Codex rollouts live at `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`.
311
+ * Current records are `{ timestamp, type, payload }` where `type` is
312
+ * `session_meta` / `response_item` / `event_msg` / `turn_context`; older
313
+ * rollouts wrote the payload at the top level with no wrapper.
314
+ *
315
+ * Only `response_item` carries the model conversation. `event_msg` duplicates
316
+ * it for the UI, so importing both would double every turn.
317
+ */
318
+ export function parseCodexTranscript(text) {
319
+ const builder = new TranscriptBuilder();
320
+ for (const line of text.split("\n")) {
321
+ const record = parseJsonLine(line);
322
+ if (!record) {
323
+ if (line.trim())
324
+ builder.dropped.records += 1;
325
+ continue;
326
+ }
327
+ const wrapperType = asString(record.type);
328
+ const payload = isRecord(record.payload) ? record.payload : record;
329
+ builder.noteTimestamp(record.timestamp ?? payload.timestamp);
330
+ if (wrapperType === "session_meta" || wrapperType === "turn_context") {
331
+ builder.noteCwd(payload.cwd);
332
+ continue;
333
+ }
334
+ // event_msg mirrors response_item for the TUI; taking both duplicates turns.
335
+ if (wrapperType === "event_msg")
336
+ continue;
337
+ switch (asString(payload.type)) {
338
+ case "message": {
339
+ const role = asString(payload.role);
340
+ const body = codexMessageText(payload.content);
341
+ if (role === "user") {
342
+ // Legacy rollouts record the cwd only inside <environment_context>,
343
+ // so read it before deciding to skip that harness turn.
344
+ builder.noteCwd(codexCwdFrom(body));
345
+ // Codex injects environment/permission context as synthetic user and
346
+ // developer turns; those are its harness, not the user's words.
347
+ if (isCodexHarnessContext(body))
348
+ continue;
349
+ builder.pushUser(body);
350
+ }
351
+ else if (role === "assistant") {
352
+ builder.pushAssistant([textPart(body)]);
353
+ }
354
+ break;
355
+ }
356
+ case "reasoning": {
357
+ const summary = codexReasoningText(payload.summary);
358
+ if (summary)
359
+ builder.pushAssistant([{ type: "thinking", text: summary }]);
360
+ break;
361
+ }
362
+ case "function_call": {
363
+ const callId = asString(payload.call_id) ?? asString(payload.id);
364
+ const name = asString(payload.name);
365
+ if (callId && name)
366
+ builder.pushAssistant([toolCallPart(callId, name, payload.arguments)]);
367
+ break;
368
+ }
369
+ case "function_call_output": {
370
+ const callId = asString(payload.call_id);
371
+ if (!callId) {
372
+ builder.dropped.toolResults += 1;
373
+ break;
374
+ }
375
+ builder.pushToolResult(callId, toolResultText(payload.output));
376
+ break;
377
+ }
378
+ default:
379
+ break;
380
+ }
381
+ }
382
+ return builder.finish("codex");
383
+ }
384
+ const CODEX_CWD_RE = /<cwd>([^<]+)<\/cwd>/;
385
+ function codexCwdFrom(body) {
386
+ return CODEX_CWD_RE.exec(body)?.[1];
387
+ }
388
+ /** Codex's own injected context turns, which are harness text, not user input. */
389
+ function isCodexHarnessContext(body) {
390
+ const head = body.trimStart();
391
+ return (head.startsWith("<environment_context>") ||
392
+ head.startsWith("<permissions instructions>") ||
393
+ head.startsWith("<user_instructions>"));
394
+ }
395
+ function codexMessageText(content) {
396
+ const direct = asString(content);
397
+ if (direct !== undefined)
398
+ return direct;
399
+ if (!Array.isArray(content))
400
+ return "";
401
+ const parts = [];
402
+ for (const block of content) {
403
+ if (!isRecord(block))
404
+ continue;
405
+ const blockText = asString(block.text);
406
+ if (blockText)
407
+ parts.push(blockText);
408
+ }
409
+ return joinText(parts);
410
+ }
411
+ function codexReasoningText(summary) {
412
+ if (!Array.isArray(summary))
413
+ return "";
414
+ const parts = [];
415
+ for (const block of summary) {
416
+ if (!isRecord(block))
417
+ continue;
418
+ const blockText = asString(block.text);
419
+ if (blockText)
420
+ parts.push(blockText);
421
+ }
422
+ return joinText(parts);
423
+ }
424
+ // ── Cursor ─────────────────────────────────────────────────
425
+ /**
426
+ * Cursor exports a flat JSONL chat log: one record per turn, carrying a role
427
+ * and either a plain `text`/`content` string or a content-block array.
428
+ *
429
+ * The part that actually matters on import is the wrapping: Cursor sends the
430
+ * typed prompt inside `<user_query>`, preceded by context blocks such as
431
+ * `<cursor_commands>` and `<timestamp>`. Importing that verbatim leaks harness
432
+ * scaffolding into the session title and preview, so a recognized wrapper is
433
+ * stripped while a message with UNRECOGNIZED leading context is kept intact —
434
+ * that text may be something the user genuinely wrote.
435
+ */
436
+ export function parseCursorTranscript(text) {
437
+ const builder = new TranscriptBuilder();
438
+ for (const line of text.split("\n")) {
439
+ const record = parseJsonLine(line);
440
+ if (!record) {
441
+ if (line.trim())
442
+ builder.dropped.records += 1;
443
+ continue;
444
+ }
445
+ builder.noteTimestamp(record.timestamp ?? record.createdAt ?? record.time);
446
+ builder.noteCwd(record.cwd ?? record.workspacePath);
447
+ const role = asString(record.role) ?? asString(record.type);
448
+ const body = cursorBody(record);
449
+ if (role === "user" || role === "human") {
450
+ builder.pushUser(extractCursorUserQuery(body));
451
+ continue;
452
+ }
453
+ if (role !== "assistant" && role !== "ai")
454
+ continue;
455
+ const parts = [];
456
+ if (body)
457
+ parts.push(textPart(body));
458
+ for (const call of cursorToolCalls(record))
459
+ parts.push(call);
460
+ builder.pushAssistant(parts);
461
+ for (const result of cursorToolResults(record)) {
462
+ builder.pushToolResult(result.callId, result.text, result.isError);
463
+ }
464
+ }
465
+ return builder.finish("cursor");
466
+ }
467
+ function cursorBody(record) {
468
+ const direct = asString(record.text) ?? asString(record.content) ?? asString(record.message);
469
+ if (direct !== undefined)
470
+ return direct;
471
+ const content = record.content;
472
+ if (!Array.isArray(content))
473
+ return "";
474
+ const parts = [];
475
+ for (const block of content) {
476
+ if (!isRecord(block))
477
+ continue;
478
+ if (block.type === "text" || block.type === undefined) {
479
+ const blockText = asString(block.text);
480
+ if (blockText)
481
+ parts.push(blockText);
482
+ }
483
+ }
484
+ return joinText(parts);
485
+ }
486
+ function cursorToolCalls(record) {
487
+ const raw = record.toolCalls ?? record.tool_calls;
488
+ if (!Array.isArray(raw))
489
+ return [];
490
+ const calls = [];
491
+ for (const item of raw) {
492
+ if (!isRecord(item))
493
+ continue;
494
+ const id = asString(item.id) ?? asString(item.callId);
495
+ const name = asString(item.name) ?? asString(item.tool);
496
+ if (!id || !name)
497
+ continue;
498
+ calls.push(toolCallPart(id, name, item.args ?? item.arguments ?? item.input));
499
+ }
500
+ return calls;
501
+ }
502
+ function cursorToolResults(record) {
503
+ const raw = record.toolResults ?? record.tool_results;
504
+ if (!Array.isArray(raw))
505
+ return [];
506
+ const results = [];
507
+ for (const item of raw) {
508
+ if (!isRecord(item))
509
+ continue;
510
+ const callId = asString(item.callId) ?? asString(item.toolCallId) ?? asString(item.id);
511
+ if (!callId)
512
+ continue;
513
+ results.push({
514
+ callId,
515
+ text: toolResultText(item.result ?? item.output ?? item.content),
516
+ ...(item.isError === true ? { isError: true } : {}),
517
+ });
518
+ }
519
+ return results;
520
+ }
521
+ /**
522
+ * Read a foreign transcript and write it out as a real GG Coder session, so it
523
+ * resumes through the existing loader with no reader changes: a v2
524
+ * `SessionHeader` from `SessionManager.create()`, one `MessageEntry` per
525
+ * message chained through `parentId`, and a final leaf pointer.
526
+ *
527
+ * An `import` app marker records the source and everything the import dropped —
528
+ * import is lossy by definition, and a silent loss is worse than a noted one.
529
+ */
530
+ export async function importForeignSession(opts) {
531
+ let text;
532
+ try {
533
+ text = await fs.readFile(opts.filePath, "utf-8");
534
+ }
535
+ catch (err) {
536
+ throw new Error(`Could not read transcript at ${opts.filePath}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
537
+ }
538
+ const parsed = parseForeignTranscript(text, opts.format);
539
+ if (parsed.messages.length === 0) {
540
+ throw new Error(`No conversation found in ${path.basename(opts.filePath)}.`);
541
+ }
542
+ const cwd = opts.cwd ?? parsed.cwd ?? process.cwd();
543
+ const created = await opts.sessionManager.create(cwd, opts.provider, opts.model, {
544
+ ...(parsed.preview ? { preview: parsed.preview } : {}),
545
+ });
546
+ let parentId = null;
547
+ for (const message of parsed.messages) {
548
+ const id = crypto.randomUUID();
549
+ const entry = {
550
+ type: "message",
551
+ id,
552
+ parentId,
553
+ timestamp: new Date().toISOString(),
554
+ message,
555
+ };
556
+ await opts.sessionManager.appendEntry(created.path, entry);
557
+ parentId = id;
558
+ }
559
+ const marker = {
560
+ version: 1,
561
+ kind: "import",
562
+ afterMessageCount: parsed.messages.length,
563
+ data: {
564
+ source: parsed.format,
565
+ sourcePath: opts.filePath,
566
+ messageCount: parsed.messages.length,
567
+ dropped: describeDropped(parsed.dropped),
568
+ droppedCounts: { ...parsed.dropped },
569
+ },
570
+ };
571
+ const markerEntry = {
572
+ type: "custom",
573
+ kind: APP_MARKER_CUSTOM_KIND,
574
+ id: crypto.randomUUID(),
575
+ // parentId null keeps the marker off the message DAG, so the model never
576
+ // sees it while the host can still interleave it back into the transcript.
577
+ parentId: null,
578
+ timestamp: new Date().toISOString(),
579
+ data: marker,
580
+ };
581
+ await opts.sessionManager.appendEntry(created.path, markerEntry);
582
+ if (parentId)
583
+ await opts.sessionManager.updateLeaf(created.path, parentId);
584
+ return {
585
+ sessionId: created.id,
586
+ sessionPath: created.path,
587
+ cwd,
588
+ messageCount: parsed.messages.length,
589
+ format: parsed.format,
590
+ dropped: parsed.dropped,
591
+ ...(parsed.preview ? { preview: parsed.preview } : {}),
592
+ };
593
+ }
594
+ //# sourceMappingURL=foreign-session-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreign-session-import.js","sourceRoot":"","sources":["../../src/core/foreign-session-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=foreign-session-import.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreign-session-import.test.d.ts","sourceRoot":"","sources":["../../src/core/foreign-session-import.test.ts"],"names":[],"mappings":""}