hammoc 1.1.6 → 1.2.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 (117) hide show
  1. package/README.md +8 -2
  2. package/bin/hammoc.js +12 -0
  3. package/package.json +3 -3
  4. package/packages/client/dist/assets/{index-BQASJJka.js → index-Bz_ljWO0.js} +1 -1
  5. package/packages/client/dist/assets/index-Cc_AX5QV.css +32 -0
  6. package/packages/client/dist/assets/index-DjVOQMst.js +1451 -0
  7. package/packages/client/dist/index.html +2 -2
  8. package/packages/client/dist/sw.js +1 -1
  9. package/packages/server/dist/app.d.ts.map +1 -1
  10. package/packages/server/dist/app.js +3 -0
  11. package/packages/server/dist/app.js.map +1 -1
  12. package/packages/server/dist/controllers/queueController.d.ts +1 -0
  13. package/packages/server/dist/controllers/queueController.d.ts.map +1 -1
  14. package/packages/server/dist/controllers/queueController.js +12 -0
  15. package/packages/server/dist/controllers/queueController.js.map +1 -1
  16. package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
  17. package/packages/server/dist/controllers/serverController.js +20 -2
  18. package/packages/server/dist/controllers/serverController.js.map +1 -1
  19. package/packages/server/dist/controllers/sessionController.d.ts +5 -10
  20. package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
  21. package/packages/server/dist/controllers/sessionController.js +65 -80
  22. package/packages/server/dist/controllers/sessionController.js.map +1 -1
  23. package/packages/server/dist/handlers/streamCallbacks.d.ts +4 -0
  24. package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
  25. package/packages/server/dist/handlers/streamCallbacks.js +9 -3
  26. package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
  27. package/packages/server/dist/handlers/websocket.d.ts +9 -15
  28. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  29. package/packages/server/dist/handlers/websocket.js +668 -120
  30. package/packages/server/dist/handlers/websocket.js.map +1 -1
  31. package/packages/server/dist/locales/en/server.json +3 -1
  32. package/packages/server/dist/locales/es/server.json +3 -1
  33. package/packages/server/dist/locales/ja/server.json +3 -1
  34. package/packages/server/dist/locales/ko/server.json +3 -1
  35. package/packages/server/dist/locales/pt/server.json +3 -1
  36. package/packages/server/dist/locales/zh-CN/server.json +3 -1
  37. package/packages/server/dist/routes/images.d.ts +7 -0
  38. package/packages/server/dist/routes/images.d.ts.map +1 -0
  39. package/packages/server/dist/routes/images.js +51 -0
  40. package/packages/server/dist/routes/images.js.map +1 -0
  41. package/packages/server/dist/routes/queue.d.ts.map +1 -1
  42. package/packages/server/dist/routes/queue.js +2 -1
  43. package/packages/server/dist/routes/queue.js.map +1 -1
  44. package/packages/server/dist/routes/sessions.d.ts.map +1 -1
  45. package/packages/server/dist/routes/sessions.js +2 -3
  46. package/packages/server/dist/routes/sessions.js.map +1 -1
  47. package/packages/server/dist/services/chatService.d.ts +2 -0
  48. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  49. package/packages/server/dist/services/chatService.js +33 -1
  50. package/packages/server/dist/services/chatService.js.map +1 -1
  51. package/packages/server/dist/services/historyParser.d.ts +1 -11
  52. package/packages/server/dist/services/historyParser.d.ts.map +1 -1
  53. package/packages/server/dist/services/historyParser.js +144 -182
  54. package/packages/server/dist/services/historyParser.js.map +1 -1
  55. package/packages/server/dist/services/imageStorageService.d.ts +28 -0
  56. package/packages/server/dist/services/imageStorageService.d.ts.map +1 -0
  57. package/packages/server/dist/services/imageStorageService.js +108 -0
  58. package/packages/server/dist/services/imageStorageService.js.map +1 -0
  59. package/packages/server/dist/services/ptyService.d.ts +6 -0
  60. package/packages/server/dist/services/ptyService.d.ts.map +1 -1
  61. package/packages/server/dist/services/ptyService.js +59 -0
  62. package/packages/server/dist/services/ptyService.js.map +1 -1
  63. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  64. package/packages/server/dist/services/queueService.js +23 -2
  65. package/packages/server/dist/services/queueService.js.map +1 -1
  66. package/packages/server/dist/services/sessionBufferManager.d.ts +26 -0
  67. package/packages/server/dist/services/sessionBufferManager.d.ts.map +1 -0
  68. package/packages/server/dist/services/sessionBufferManager.js +113 -0
  69. package/packages/server/dist/services/sessionBufferManager.js.map +1 -0
  70. package/packages/server/dist/services/sessionService.d.ts +26 -1
  71. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  72. package/packages/server/dist/services/sessionService.js +168 -39
  73. package/packages/server/dist/services/sessionService.js.map +1 -1
  74. package/packages/server/dist/services/summarizeService.d.ts +25 -0
  75. package/packages/server/dist/services/summarizeService.d.ts.map +1 -0
  76. package/packages/server/dist/services/summarizeService.js +122 -0
  77. package/packages/server/dist/services/summarizeService.js.map +1 -0
  78. package/packages/server/dist/utils/imageUtils.d.ts +11 -0
  79. package/packages/server/dist/utils/imageUtils.d.ts.map +1 -0
  80. package/packages/server/dist/utils/imageUtils.js +37 -0
  81. package/packages/server/dist/utils/imageUtils.js.map +1 -0
  82. package/packages/server/dist/utils/messageTree.d.ts +56 -0
  83. package/packages/server/dist/utils/messageTree.d.ts.map +1 -0
  84. package/packages/server/dist/utils/messageTree.js +356 -0
  85. package/packages/server/dist/utils/messageTree.js.map +1 -0
  86. package/packages/server/package.json +3 -1
  87. package/packages/shared/dist/constants/index.d.ts +3 -0
  88. package/packages/shared/dist/constants/index.d.ts.map +1 -0
  89. package/packages/shared/dist/constants/index.js +3 -0
  90. package/packages/shared/dist/constants/index.js.map +1 -0
  91. package/packages/shared/dist/constants/messageTree.d.ts +6 -0
  92. package/packages/shared/dist/constants/messageTree.d.ts.map +1 -0
  93. package/packages/shared/dist/constants/messageTree.js +7 -0
  94. package/packages/shared/dist/constants/messageTree.js.map +1 -0
  95. package/packages/shared/dist/index.d.ts +1 -1
  96. package/packages/shared/dist/index.d.ts.map +1 -1
  97. package/packages/shared/dist/index.js +1 -1
  98. package/packages/shared/dist/index.js.map +1 -1
  99. package/packages/shared/dist/types/history.d.ts +21 -8
  100. package/packages/shared/dist/types/history.d.ts.map +1 -1
  101. package/packages/shared/dist/types/message.d.ts +10 -0
  102. package/packages/shared/dist/types/message.d.ts.map +1 -1
  103. package/packages/shared/dist/types/message.js.map +1 -1
  104. package/packages/shared/dist/types/preferences.d.ts +2 -1
  105. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  106. package/packages/shared/dist/types/preferences.js.map +1 -1
  107. package/packages/shared/dist/types/sdk.d.ts +8 -0
  108. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  109. package/packages/shared/dist/types/sdk.js.map +1 -1
  110. package/packages/shared/dist/types/session.d.ts +1 -0
  111. package/packages/shared/dist/types/session.d.ts.map +1 -1
  112. package/packages/shared/dist/types/session.js.map +1 -1
  113. package/packages/shared/dist/types/websocket.d.ts +59 -5
  114. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  115. package/scripts/spike-25.9-output.log +47 -0
  116. package/packages/client/dist/assets/index-Dr2X4keZ.css +0 -32
  117. package/packages/client/dist/assets/index-zjjTVZ6W.js +0 -1418
@@ -96,6 +96,8 @@ export class ChatService {
96
96
  allowedTools;
97
97
  disallowedTools;
98
98
  currentQuery = null;
99
+ /** Warning message from rewindFiles failure (non-fatal, streaming continues) */
100
+ rewindWarning = null;
99
101
  constructor(config = {}) {
100
102
  this.workingDirectory = config.workingDirectory;
101
103
  this.permissionMode = config.permissionMode ?? 'default';
@@ -167,6 +169,7 @@ export class ChatService {
167
169
  const queryOptions = {
168
170
  cwd: this.workingDirectory,
169
171
  permissionMode: this.permissionMode,
172
+ allowDangerouslySkipPermissions: this.permissionMode === 'bypassPermissions',
170
173
  allowedTools: resolvedAllowed.length > 0 ? resolvedAllowed : undefined,
171
174
  disallowedTools: resolvedDisallowed.length > 0 ? resolvedDisallowed : undefined,
172
175
  maxTurns: options.maxTurns,
@@ -180,6 +183,9 @@ export class ChatService {
180
183
  maxThinkingTokens: options.maxThinkingTokens,
181
184
  maxBudgetUsd: options.maxBudgetUsd,
182
185
  effort: options.effort,
186
+ resumeSessionAt: options.resumeSessionAt,
187
+ forkSession: options.forkSession,
188
+ enableFileCheckpointing: options.enableFileCheckpointing,
183
189
  canUseTool,
184
190
  // Capture CLI stderr for debugging process exit errors
185
191
  stderr: (data) => {
@@ -192,7 +198,11 @@ export class ChatService {
192
198
  delete queryOptions[key];
193
199
  }
194
200
  });
195
- log.debug(`SDK query cwd="${queryOptions.cwd}"${queryOptions.resume ? `, resume="${queryOptions.resume}"` : ''}${queryOptions.model ? `, model="${queryOptions.model}"` : ''}${queryOptions.sessionId ? `, sessionId="${queryOptions.sessionId}"` : ''}`);
201
+ log.debug(`SDK query cwd="${queryOptions.cwd}"${queryOptions.resume ? `, resume="${queryOptions.resume}"` : ''}${queryOptions.model ? `, model="${queryOptions.model}"` : ''}${queryOptions.sessionId ? `, sessionId="${queryOptions.sessionId}"` : ''}${queryOptions.resumeSessionAt ? `, resumeSessionAt="${queryOptions.resumeSessionAt}"` : ''}${queryOptions.forkSession ? `, forkSession=true` : ''}${options.enableFileCheckpointing ? `, checkpointing=true` : ''}`);
202
+ // Story 25.7: explicit log for resumeSessionAt branching
203
+ if (queryOptions.resumeSessionAt) {
204
+ log.info(`resumeSessionAt branch: assistantUuid="${queryOptions.resumeSessionAt}", resume="${queryOptions.resume}"`);
205
+ }
196
206
  // Use AsyncIterable prompt when images are present (Story 5.5)
197
207
  const { images } = options;
198
208
  if (images && images.length > 0) {
@@ -207,6 +217,28 @@ export class ChatService {
207
217
  options: queryOptions,
208
218
  });
209
219
  }
220
+ // Story 25.7: rewind files to the specified user message checkpoint before streaming
221
+ this.rewindWarning = null;
222
+ if (options.rewindToMessageUuid && !this.currentQuery) {
223
+ log.error('rewindFiles requested but currentQuery is null');
224
+ this.rewindWarning = 'File rewind failed: query not initialized';
225
+ }
226
+ else if (options.rewindToMessageUuid && this.currentQuery) {
227
+ try {
228
+ const rewindResult = await this.currentQuery.rewindFiles(options.rewindToMessageUuid);
229
+ log.info(`rewindFiles result: canRewind=${rewindResult.canRewind}, filesChanged=${rewindResult.filesChanged?.length ?? 0}, insertions=${rewindResult.insertions ?? 0}, deletions=${rewindResult.deletions ?? 0}`);
230
+ if (!rewindResult.canRewind) {
231
+ const reason = rewindResult.error ?? 'unknown reason';
232
+ log.warn(`rewindFiles failed: ${reason}`);
233
+ this.rewindWarning = `File rewind failed: ${reason}`;
234
+ }
235
+ }
236
+ catch (err) {
237
+ const msg = err instanceof Error ? err.message : String(err);
238
+ log.error(`rewindFiles threw: ${msg}`);
239
+ this.rewindWarning = `File rewind error: ${msg}`;
240
+ }
241
+ }
210
242
  let finalResponse = {
211
243
  id: '',
212
244
  sessionId: '',
@@ -1 +1 @@
1
- {"version":3,"file":"chatService.js","sourceRoot":"","sources":["../../src/services/chatService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatService.js","sourceRoot":"","sources":["../../src/services/chatService.ts"],"names":[],"mappings":"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"}
@@ -55,15 +55,5 @@ export declare function cleanCommandTags(content: string): string;
55
55
  * @param raw Array of raw messages (sorted)
56
56
  * @returns Array of transformed HistoryMessages for display
57
57
  */
58
- export declare function transformToHistoryMessages(raw: RawJSONLMessage[]): HistoryMessage[];
59
- /**
60
- * Convert completed stream buffer events to HistoryMessages.
61
- * Used by getMessages API to merge recent stream data with JSONL history
62
- * when the SDK hasn't flushed to disk yet.
63
- */
64
- export declare function transformBufferToHistoryMessages(events: Array<{
65
- event: string;
66
- data: unknown;
67
- ts: number;
68
- }>): HistoryMessage[];
58
+ export declare function transformToHistoryMessages(raw: RawJSONLMessage[], projectSlug?: string, sessionId?: string): HistoryMessage[];
69
59
  //# sourceMappingURL=historyParser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"historyParser.d.ts","sourceRoot":"","sources":["../../src/services/historyParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAOf,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwBjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAuE7E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAqCvF;AAwED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,cAAc,EAAE,CAsOnF;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1D,cAAc,EAAE,CAuJlB"}
1
+ {"version":3,"file":"historyParser.d.ts","sourceRoot":"","sources":["../../src/services/historyParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAQf,MAAM,gBAAgB,CAAC;AASxB;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwBjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAuE7E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAqCvF;AA+HD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA+S7H"}
@@ -10,8 +10,15 @@
10
10
  * thinking → text → tool_use (each) with tool_result merged by ID
11
11
  */
12
12
  import fs from 'fs/promises';
13
+ import path from 'path';
13
14
  import { createReadStream, existsSync } from 'fs';
14
15
  import * as readline from 'node:readline';
16
+ import { sessionService } from './sessionService.js';
17
+ import { createLogger } from '../utils/logger.js';
18
+ import sharp from 'sharp';
19
+ import { buildImageFilename, buildThumbnailFilename, buildImageUrl, getImageDir } from '../utils/imageUtils.js';
20
+ const THUMBNAIL_MAX_WIDTH = 400;
21
+ const THUMBNAIL_MAX_HEIGHT = 300;
15
22
  /**
16
23
  * Parse a JSONL file and return raw messages
17
24
  * @param filePath Path to the JSONL session file
@@ -169,21 +176,71 @@ function extractTextContent(content) {
169
176
  }
170
177
  return '';
171
178
  }
179
+ const extractImagesLog = createLogger('historyParser:extractImages');
172
180
  /**
173
- * Extract image attachments from message content
174
- * @param content The message content (array of ContentBlock)
175
- * @returns Array of image attachments in HistoryMessage format
181
+ * Extract image attachments from message content as URL-based ImageRef[].
182
+ * Story 27.2: Computes SHA-256 hash of base64 data to generate deterministic URLs.
183
+ * Lazy backfill: writes image file to disk if not already present (for pre-existing sessions).
176
184
  */
177
- function extractImages(content) {
185
+ function extractImages(content, projectSlug, sessionId) {
178
186
  if (!content || !Array.isArray(content))
179
187
  return undefined;
180
- const images = content
181
- .filter((block) => block.type === 'image')
182
- .map((block, index) => ({
183
- mimeType: block.source.media_type,
184
- data: block.source.data,
185
- name: `image-${index + 1}`, // Generate name from index
186
- }));
188
+ if (!projectSlug || !sessionId)
189
+ return undefined;
190
+ const imageBlocks = content.filter((block) => block.type === 'image');
191
+ if (imageBlocks.length === 0)
192
+ return undefined;
193
+ const projectDir = sessionService.getProjectDir(projectSlug);
194
+ const imageDir = getImageDir(projectDir, sessionId);
195
+ const images = [];
196
+ for (let i = 0; i < imageBlocks.length; i++) {
197
+ const block = imageBlocks[i];
198
+ try {
199
+ const filename = buildImageFilename(block.source.data, block.source.media_type);
200
+ if (!filename)
201
+ continue;
202
+ const thumbFilename = buildThumbnailFilename(block.source.data, block.source.media_type);
203
+ const url = buildImageUrl(projectSlug, sessionId, filename);
204
+ // Lazy backfill: write image & thumbnail to disk if missing
205
+ const filePath = path.join(imageDir, filename);
206
+ const thumbPath = thumbFilename ? path.join(imageDir, thumbFilename) : null;
207
+ if (!existsSync(filePath)) {
208
+ const buffer = Buffer.from(block.source.data, 'base64');
209
+ // Fire-and-forget async write — next parse will find it on disk
210
+ fs.mkdir(imageDir, { recursive: true })
211
+ .then(async () => {
212
+ await fs.writeFile(filePath, buffer);
213
+ if (thumbPath && !existsSync(thumbPath)) {
214
+ await sharp(buffer)
215
+ .resize(THUMBNAIL_MAX_WIDTH, THUMBNAIL_MAX_HEIGHT, { fit: 'inside' })
216
+ .toFile(thumbPath);
217
+ }
218
+ })
219
+ .catch((err) => extractImagesLog.warn(`Lazy backfill failed for ${filename}: ${err}`));
220
+ }
221
+ else if (thumbPath && !existsSync(thumbPath)) {
222
+ // Original exists but thumbnail missing — backfill thumbnail only
223
+ fs.readFile(filePath)
224
+ .then((buffer) => sharp(buffer)
225
+ .resize(THUMBNAIL_MAX_WIDTH, THUMBNAIL_MAX_HEIGHT, { fit: 'inside' })
226
+ .toFile(thumbPath))
227
+ .catch((err) => extractImagesLog.warn(`Thumbnail backfill failed for ${filename}: ${err}`));
228
+ }
229
+ // Only include thumbnailUrl when the file actually exists on disk
230
+ const thumbnailUrl = thumbPath && existsSync(thumbPath)
231
+ ? buildImageUrl(projectSlug, sessionId, thumbFilename)
232
+ : undefined;
233
+ images.push({
234
+ url,
235
+ ...(thumbnailUrl ? { thumbnailUrl } : {}),
236
+ mimeType: block.source.media_type,
237
+ name: `image-${i + 1}`,
238
+ });
239
+ }
240
+ catch (err) {
241
+ extractImagesLog.warn(`Failed to process image block ${i}: ${err}`);
242
+ }
243
+ }
187
244
  return images.length > 0 ? images : undefined;
188
245
  }
189
246
  /**
@@ -243,16 +300,58 @@ export function cleanCommandTags(content) {
243
300
  * @param raw Array of raw messages (sorted)
244
301
  * @returns Array of transformed HistoryMessages for display
245
302
  */
246
- export function transformToHistoryMessages(raw) {
303
+ export function transformToHistoryMessages(raw, projectSlug, sessionId) {
247
304
  const results = [];
248
305
  // Map tool_use block id → index in results (for merging tool_results)
249
306
  const toolUseIndexMap = new Map();
307
+ // Redirect map: when a message is skipped (non-display type, isMeta, empty
308
+ // content), record uuid → parentUuid so that its children's parentId resolves
309
+ // to the nearest included ancestor. Without this, children of skipped messages
310
+ // become orphan roots in the client tree, breaking the conversation chain.
311
+ const skippedRedirect = new Map();
312
+ function resolveParentId(parentUuid) {
313
+ if (!parentUuid)
314
+ return undefined;
315
+ let id = parentUuid;
316
+ const visited = new Set();
317
+ while (id && skippedRedirect.has(id)) {
318
+ if (visited.has(id))
319
+ return undefined; // cycle → treat as root
320
+ visited.add(id);
321
+ id = skippedRedirect.get(id);
322
+ }
323
+ return id;
324
+ }
250
325
  for (const m of raw) {
251
- // Skip non-display types and meta messages
252
- if (!['user', 'assistant', 'tool_use', 'tool_result', 'queue-operation'].includes(m.type))
326
+ // Skip non-display types and meta messages, but record redirect so children
327
+ // can resolve to the nearest included ancestor.
328
+ const isDisplayType = ['user', 'assistant', 'tool_use', 'tool_result', 'queue-operation', 'system'].includes(m.type);
329
+ if (!isDisplayType || m.isMeta) {
330
+ skippedRedirect.set(m.uuid, m.parentUuid ?? undefined);
253
331
  continue;
254
- if (m.isMeta)
332
+ }
333
+ // Track whether this message produces any visible output.
334
+ const resultsBefore = results.length;
335
+ // Resolve parentId through redirect chain (handles skipped ancestors)
336
+ const parentId = resolveParentId(m.parentUuid);
337
+ // Handle system messages (e.g., compact_boundary)
338
+ if (m.type === 'system') {
339
+ if (m.subtype === 'compact_boundary') {
340
+ results.push({
341
+ id: m.uuid,
342
+ type: 'system',
343
+ subtype: 'compact_boundary',
344
+ content: m.content || 'Conversation compacted',
345
+ parentId,
346
+ timestamp: m.timestamp,
347
+ });
348
+ }
349
+ // Non-compact_boundary system messages: skip with redirect
350
+ if (results.length === resultsBefore) {
351
+ skippedRedirect.set(m.uuid, m.parentUuid ?? undefined);
352
+ }
255
353
  continue;
354
+ }
256
355
  // Handle queue-operation task notifications
257
356
  if (m.type === 'queue-operation' && m.content) {
258
357
  const taskNotif = parseTaskNotification(m.content);
@@ -262,6 +361,7 @@ export function transformToHistoryMessages(raw) {
262
361
  type: 'task_notification',
263
362
  content: taskNotif.summary,
264
363
  timestamp: m.timestamp,
364
+ parentId,
265
365
  taskStatus: taskNotif.status,
266
366
  taskSummary: taskNotif.summary,
267
367
  taskToolUseId: taskNotif.toolUseId,
@@ -272,8 +372,11 @@ export function transformToHistoryMessages(raw) {
272
372
  if (m.type === 'assistant') {
273
373
  const messageContent = m.message?.content;
274
374
  if (Array.isArray(messageContent)) {
275
- // Split content blocks into separate HistoryMessages
375
+ // Split content blocks into separate HistoryMessages.
376
+ // The first emitted fragment uses m.uuid as its id so that child
377
+ // messages whose parentId references this raw uuid can resolve it.
276
378
  let thinkingContent;
379
+ let firstFragmentEmitted = false;
277
380
  for (const block of messageContent) {
278
381
  if (block.type === 'thinking') {
279
382
  thinkingContent = block.thinking;
@@ -282,11 +385,14 @@ export function transformToHistoryMessages(raw) {
282
385
  const text = block.text;
283
386
  // Skip "(no content)" placeholder
284
387
  if (text.trim() && text.trim() !== '(no content)') {
388
+ const id = !firstFragmentEmitted ? m.uuid : `${m.uuid}-text-${results.length}`;
389
+ firstFragmentEmitted = true;
285
390
  results.push({
286
- id: `${m.uuid}-text-${results.length}`,
391
+ id,
287
392
  type: 'assistant',
288
393
  content: text,
289
394
  timestamp: m.timestamp,
395
+ parentId,
290
396
  thinking: thinkingContent,
291
397
  });
292
398
  thinkingContent = undefined;
@@ -295,11 +401,14 @@ export function transformToHistoryMessages(raw) {
295
401
  else if (block.type === 'tool_use') {
296
402
  const toolBlock = block;
297
403
  const idx = results.length;
404
+ const id = !firstFragmentEmitted ? m.uuid : `${m.uuid}-tool-${toolBlock.id}`;
405
+ firstFragmentEmitted = true;
298
406
  results.push({
299
- id: `${m.uuid}-tool-${toolBlock.id}`,
407
+ id,
300
408
  type: 'tool_use',
301
409
  content: `Calling ${toolBlock.name}`,
302
410
  timestamp: m.timestamp,
411
+ parentId,
303
412
  toolName: toolBlock.name,
304
413
  toolInput: toolBlock.input,
305
414
  thinking: thinkingContent,
@@ -310,11 +419,13 @@ export function transformToHistoryMessages(raw) {
310
419
  }
311
420
  // If only thinking with no text/tool, create thinking-only message
312
421
  if (thinkingContent) {
422
+ const id = !firstFragmentEmitted ? m.uuid : `${m.uuid}-thinking`;
313
423
  results.push({
314
- id: `${m.uuid}-thinking`,
424
+ id,
315
425
  type: 'assistant',
316
426
  content: '',
317
427
  timestamp: m.timestamp,
428
+ parentId,
318
429
  thinking: thinkingContent,
319
430
  });
320
431
  }
@@ -328,6 +439,7 @@ export function transformToHistoryMessages(raw) {
328
439
  type: 'assistant',
329
440
  content: text,
330
441
  timestamp: m.timestamp,
442
+ parentId,
331
443
  });
332
444
  }
333
445
  }
@@ -369,6 +481,7 @@ export function transformToHistoryMessages(raw) {
369
481
  type: 'task_notification',
370
482
  content: taskNotif.summary,
371
483
  timestamp: m.timestamp,
484
+ parentId,
372
485
  taskStatus: taskNotif.status,
373
486
  taskSummary: taskNotif.summary,
374
487
  taskToolUseId: taskNotif.toolUseId,
@@ -377,12 +490,13 @@ export function transformToHistoryMessages(raw) {
377
490
  else {
378
491
  const cleaned = cleanCommandTags(textContent);
379
492
  if (cleaned.trim()) {
380
- const images = extractImages(messageContent);
493
+ const images = extractImages(messageContent, projectSlug, sessionId);
381
494
  results.push({
382
495
  id: m.uuid,
383
496
  type: 'user',
384
497
  content: cleaned,
385
498
  timestamp: m.timestamp,
499
+ parentId,
386
500
  ...(images && { images }),
387
501
  });
388
502
  }
@@ -400,6 +514,7 @@ export function transformToHistoryMessages(raw) {
400
514
  type: 'task_notification',
401
515
  content: taskNotif.summary,
402
516
  timestamp: m.timestamp,
517
+ parentId,
403
518
  taskStatus: taskNotif.status,
404
519
  taskSummary: taskNotif.summary,
405
520
  taskToolUseId: taskNotif.toolUseId,
@@ -413,6 +528,7 @@ export function transformToHistoryMessages(raw) {
413
528
  type: 'user',
414
529
  content: cleaned,
415
530
  timestamp: m.timestamp,
531
+ parentId,
416
532
  });
417
533
  }
418
534
  }
@@ -426,6 +542,7 @@ export function transformToHistoryMessages(raw) {
426
542
  type: 'tool_use',
427
543
  content: `Calling ${m.toolName}`,
428
544
  timestamp: m.timestamp,
545
+ parentId,
429
546
  toolName: m.toolName,
430
547
  toolInput: m.toolInput,
431
548
  });
@@ -461,6 +578,7 @@ export function transformToHistoryMessages(raw) {
461
578
  type: 'tool_result',
462
579
  content,
463
580
  timestamp: m.timestamp,
581
+ parentId,
464
582
  toolResult: {
465
583
  success: !m.error,
466
584
  output: m.result,
@@ -470,169 +588,13 @@ export function transformToHistoryMessages(raw) {
470
588
  }
471
589
  }
472
590
  }
473
- }
474
- return results;
475
- }
476
- /**
477
- * Convert completed stream buffer events to HistoryMessages.
478
- * Used by getMessages API to merge recent stream data with JSONL history
479
- * when the SDK hasn't flushed to disk yet.
480
- */
481
- export function transformBufferToHistoryMessages(events) {
482
- const messages = [];
483
- let messageId = null;
484
- let pendingThinking;
485
- let textAccumulator = '';
486
- let lastTs = Date.now();
487
- const toolResults = new Map();
488
- const toolInputUpdates = new Map();
489
- // First pass: collect tool results, input updates, and permission responses
490
- const permissionResponses = new Map();
491
- for (const { event, data } of events) {
492
- if (event === 'tool:result') {
493
- const d = data;
494
- toolResults.set(d.toolCallId, { result: d.result });
495
- }
496
- else if (event === 'tool:input-update') {
497
- const d = data;
498
- toolInputUpdates.set(d.toolCallId, d.input);
499
- }
500
- else if (event === 'permission:resolved') {
501
- const d = data;
502
- permissionResponses.set(d.requestId, { approved: d.approved, response: d.response });
591
+ // If this raw message produced no visible output (e.g., empty assistant,
592
+ // user consumed entirely by tool_result merging), register redirect so
593
+ // children's parentId resolves to this message's parent instead.
594
+ if (results.length === resultsBefore) {
595
+ skippedRedirect.set(m.uuid, m.parentUuid ?? undefined);
503
596
  }
504
597
  }
505
- const flushText = () => {
506
- if (textAccumulator && messageId) {
507
- messages.push({
508
- id: `${messageId}-text-${messages.length}`,
509
- type: 'assistant',
510
- content: textAccumulator,
511
- timestamp: new Date(lastTs).toISOString(),
512
- ...(pendingThinking && { thinking: pendingThinking }),
513
- });
514
- pendingThinking = undefined;
515
- textAccumulator = '';
516
- }
517
- };
518
- for (const { event, data, ts } of events) {
519
- lastTs = ts;
520
- switch (event) {
521
- case 'user:message': {
522
- const d = data;
523
- if (d.sessionId && !messageId)
524
- messageId = d.sessionId;
525
- messages.push({
526
- id: `${messageId || 'buf'}-user-${messages.length}`,
527
- type: 'user',
528
- content: d.content,
529
- timestamp: new Date(ts).toISOString(),
530
- });
531
- break;
532
- }
533
- case 'system:task-notification': {
534
- const d = data;
535
- messages.push({
536
- id: `${messageId || 'buf'}-task-${d.taskId}`,
537
- type: 'task_notification',
538
- content: d.summary || '',
539
- timestamp: new Date(ts).toISOString(),
540
- taskStatus: d.status,
541
- taskSummary: d.summary,
542
- taskToolUseId: d.toolUseId,
543
- });
544
- break;
545
- }
546
- case 'session:created':
547
- case 'session:resumed': {
548
- const d = data;
549
- if (!messageId)
550
- messageId = d.sessionId;
551
- break;
552
- }
553
- case 'message:chunk': {
554
- const d = data;
555
- if (d.messageId)
556
- messageId = d.messageId;
557
- textAccumulator += d.content;
558
- break;
559
- }
560
- case 'thinking:chunk': {
561
- flushText();
562
- const d = data;
563
- pendingThinking = (pendingThinking ?? '') + d.content;
564
- break;
565
- }
566
- case 'tool:call': {
567
- const d = data;
568
- flushText();
569
- const finalInput = toolInputUpdates.get(d.id) ?? d.input;
570
- const result = toolResults.get(d.id);
571
- messages.push({
572
- id: `${messageId}-tool-${d.id}`,
573
- type: 'tool_use',
574
- content: `Calling ${d.name}`,
575
- timestamp: new Date(ts).toISOString(),
576
- toolName: d.name,
577
- toolInput: finalInput,
578
- ...(pendingThinking && { thinking: pendingThinking }),
579
- ...(result && { toolResult: result.result }),
580
- });
581
- pendingThinking = undefined;
582
- break;
583
- }
584
- case 'permission:request': {
585
- const d = data;
586
- // Only handle AskUserQuestion here — other tools are already covered by tool:call
587
- if (d.toolCall && d.toolCall.name === 'AskUserQuestion') {
588
- flushText();
589
- const resolved = permissionResponses.get(d.id);
590
- // Format response as string for toolResult.output
591
- let responseStr;
592
- if (resolved?.response) {
593
- if (typeof resolved.response === 'string')
594
- responseStr = resolved.response;
595
- else if (Array.isArray(resolved.response))
596
- responseStr = resolved.response.join(', ');
597
- else if (typeof resolved.response === 'object')
598
- responseStr = Object.values(resolved.response).flat().join(', ');
599
- }
600
- messages.push({
601
- id: `${messageId}-tool-${d.toolCall.id}`,
602
- type: 'tool_use',
603
- content: `Calling ${d.toolCall.name}`,
604
- timestamp: new Date(ts).toISOString(),
605
- toolName: d.toolCall.name,
606
- toolInput: d.toolCall.input,
607
- ...(pendingThinking && { thinking: pendingThinking }),
608
- ...(resolved && responseStr && {
609
- toolResult: { success: resolved.approved, output: responseStr },
610
- }),
611
- });
612
- pendingThinking = undefined;
613
- }
614
- break;
615
- }
616
- case 'message:complete': {
617
- const d = data;
618
- if (d.id)
619
- messageId = d.id;
620
- flushText();
621
- if (pendingThinking && messageId) {
622
- messages.push({
623
- id: `${messageId}-thinking-${messages.length}`,
624
- type: 'assistant',
625
- content: '',
626
- timestamp: new Date(ts).toISOString(),
627
- thinking: pendingThinking,
628
- });
629
- pendingThinking = undefined;
630
- }
631
- break;
632
- }
633
- }
634
- }
635
- flushText();
636
- return messages;
598
+ return results;
637
599
  }
638
600
  //# sourceMappingURL=historyParser.js.map