hammoc 1.1.6 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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-Cb8l58mq.js +1451 -0
  5. package/packages/client/dist/assets/index-Cc_AX5QV.css +32 -0
  6. package/packages/client/dist/assets/{index-BQASJJka.js → index-G9znBi60.js} +1 -1
  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 +148 -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 +370 -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":"AAAA,OAAO,EAAE,KAAK,EAA8D,MAAM,gCAAgC,CAAC;AASnH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,EAAE;IACF,kBAAkB;IAClB,EAAE;IACF,iDAAiD;IACjD,EAAE;IACF,4BAA4B;IAC5B,uGAAuG;IACvG,6CAA6C;IAC7C,6DAA6D;IAC7D,sEAAsE;IACtE,yCAAyC;IACzC,uJAAuJ;IACvJ,+EAA+E;IAC/E,EAAE;IACF,+JAA+J;IAC/J,6BAA6B;IAC7B,EAAE;IACF,kEAAkE;IAClE,EAAE;IACF,SAAS;IACT,aAAa;CACd,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC7D,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,mCAAmC,EAAE;IAC3E,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mDAAmD,EAAE;CAC/E,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB,EAAE,GAAW;IACpE,MAAM,IAAI,GAA2B,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,KAAK,GAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAE3E,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAEzF,IAAI,UAAU,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC;YACH,QAAQ,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;YAC7D,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,QAAQ,CAAC,0CAA0C,EAAE,QAAQ,CAAC,CAAC;gBAC/D,UAAU,GAAG,QAAQ,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC;QAEhC,MAAM,SAAS,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QACnG,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,EAAE;YACtC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,WAAW,CAAC,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3F,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;QACtC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,kBAAkB,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAS,oBAAoB,CAAC,UAA2D;IACvF,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,gBAAgB,CAAqB;IACrC,cAAc,CAAiB;IAC/B,YAAY,CAAW;IACvB,eAAe,CAAW;IAC1B,YAAY,GAAiB,IAAI,CAAC;IAE1C,YAAY,SAA4B,EAAE;QACxC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,SAAS,CAAC;QACzD,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,WAAmB;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAe;QAC7B,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,KAAe;QAChC,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,WAAW,CAChB,OAAe,EACf,UAAuB,EAAE,EACzB,UAAuB;QAEvB,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;QAClE,MAAM,kBAAkB,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC;QAE3E,uEAAuE;QACvE,qEAAqE;QACrE,gEAAgE;QAChE,kDAAkD;QAClD,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE;YACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,IAAI,0BAA0B,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB;gBAClC,CAAC,CAAC,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC;gBAC3D,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,QAAiB;gBACvB,MAAM,EAAE,aAAsB;gBAC9B,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,YAAY,GAAY;YAC5B,GAAG,EAAE,IAAI,CAAC,gBAAgB;YAC1B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,YAAY,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YACtE,eAAe,EAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;YAC/E,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,sBAAsB,EAAE,IAAI,EAAE,6BAA6B;YAC3D,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,wDAAwD;YACtG,YAAY;YACZ,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU;YACV,uDAAuD;YACvD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvB,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC;QAEF,0BAA0B;QAC1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,IAAI,YAAY,CAAC,GAAoB,CAAC,KAAK,SAAS,EAAE,CAAC;gBACrD,OAAO,YAAY,CAAC,GAAoB,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,kBAAkB,YAAY,CAAC,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1P,+DAA+D;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBACxB,MAAM,EAAE,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC;gBAChD,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBACxB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,aAAa,GAAiB;YAChC,EAAE,EAAE,EAAE;YACN,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC9C,MAAM,OAAO,CAAC;gBAEd,yBAAyB;gBACzB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,OAmBX,CAAC;oBACF,aAAa,GAAG;wBACd,EAAE,EAAE,GAAG,CAAC,IAAI;wBACZ,SAAS,EAAE,GAAG,CAAC,UAAU;wBACzB,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;wBACpD,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,GAAG,CAAC,QAAQ;wBACrB,KAAK,EAAE;4BACL,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY;4BACnC,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;4BACrC,oBAAoB,EAAE,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC;4BAC5D,wBAAwB,EAAE,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC;4BACpE,YAAY,EAAE,GAAG,CAAC,cAAc;4BAChC,aAAa,EAAE,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC;yBACpD;qBACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,OAAe,EACf,UAAuB,EAAE;QAEzB,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QAEpC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAAoB;QAC1C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,wBAAwB,CAC5B,OAAe,EACf,SAA0B,EAC1B,UAAuB,EAAE,EACzB,UAAuB;IACvB,uEAAuE;IACvE,YAA4C;QAE5C,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjE,+DAA+D;QAC/D,kFAAkF;QAClF,KAAK,SAAS,CAAC,CAAC,aAAa;YAC3B,IAAI,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,YAAY,EAAE,CAAE,MAAM,CAAC,KAA2B,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;gBACtE,MAAM,MAAM,CAAC,KAAK,CAAC;gBAEnB,mEAAmE;gBACnE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,WAAW,GAA0C,WAAW,CAAC,GAAG,EAAE;oBACxE,GAAG,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;oBACxE,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;gBAC9B,CAAC,EAAE,KAAK,CAAC,CAAC;gBAEV,MAAM,GAAG,MAAM,WAAW,CAAC;gBAE3B,IAAI,WAAW,EAAE,CAAC;oBAChB,aAAa,CAAC,WAAW,CAAC,CAAC;oBAC3B,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;CACF;AAED;;;GAGG;AACH,KAAK,SAAS,CAAC,CAAC,uBAAuB,CACrC,IAAY,EACZ,MAAyB;IAOzB,MAAM;QACJ,IAAI,EAAE,MAAe;QACrB,UAAU,EAAE,EAAE;QACd,OAAO,EAAE;YACP,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;gBACtB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACtB,IAAI,EAAE,OAAgB;oBACtB,MAAM,EAAE;wBACN,IAAI,EAAE,QAAiB;wBACvB,UAAU,EAAE,GAAG,CAAC,QAAQ;wBACxB,IAAI,EAAE,GAAG,CAAC,IAAI;qBACf;iBACF,CAAC,CAAC;aACJ;SACF;QACD,kBAAkB,EAAE,IAAI;KACzB,CAAC;AACJ,CAAC"}
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,CAmBxD;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
  /**
@@ -221,6 +278,10 @@ export function cleanCommandTags(content) {
221
278
  if (content.includes('<local-command-stdout>')) {
222
279
  return '';
223
280
  }
281
+ // Skip local command caveats (SDK-injected wrapper for command context)
282
+ if (content.includes('<local-command-caveat>')) {
283
+ return '';
284
+ }
224
285
  let cleaned = content;
225
286
  // Remove <ide_opened_file> blocks entirely (content included)
226
287
  cleaned = cleaned.replace(/<ide_opened_file>[\s\S]*?<\/ide_opened_file>/g, '');
@@ -243,16 +304,58 @@ export function cleanCommandTags(content) {
243
304
  * @param raw Array of raw messages (sorted)
244
305
  * @returns Array of transformed HistoryMessages for display
245
306
  */
246
- export function transformToHistoryMessages(raw) {
307
+ export function transformToHistoryMessages(raw, projectSlug, sessionId) {
247
308
  const results = [];
248
309
  // Map tool_use block id → index in results (for merging tool_results)
249
310
  const toolUseIndexMap = new Map();
311
+ // Redirect map: when a message is skipped (non-display type, isMeta, empty
312
+ // content), record uuid → parentUuid so that its children's parentId resolves
313
+ // to the nearest included ancestor. Without this, children of skipped messages
314
+ // become orphan roots in the client tree, breaking the conversation chain.
315
+ const skippedRedirect = new Map();
316
+ function resolveParentId(parentUuid) {
317
+ if (!parentUuid)
318
+ return undefined;
319
+ let id = parentUuid;
320
+ const visited = new Set();
321
+ while (id && skippedRedirect.has(id)) {
322
+ if (visited.has(id))
323
+ return undefined; // cycle → treat as root
324
+ visited.add(id);
325
+ id = skippedRedirect.get(id);
326
+ }
327
+ return id;
328
+ }
250
329
  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))
330
+ // Skip non-display types and meta messages, but record redirect so children
331
+ // can resolve to the nearest included ancestor.
332
+ const isDisplayType = ['user', 'assistant', 'tool_use', 'tool_result', 'queue-operation', 'system'].includes(m.type);
333
+ if (!isDisplayType || m.isMeta) {
334
+ skippedRedirect.set(m.uuid, m.parentUuid ?? undefined);
253
335
  continue;
254
- if (m.isMeta)
336
+ }
337
+ // Track whether this message produces any visible output.
338
+ const resultsBefore = results.length;
339
+ // Resolve parentId through redirect chain (handles skipped ancestors)
340
+ const parentId = resolveParentId(m.parentUuid);
341
+ // Handle system messages (e.g., compact_boundary)
342
+ if (m.type === 'system') {
343
+ if (m.subtype === 'compact_boundary') {
344
+ results.push({
345
+ id: m.uuid,
346
+ type: 'system',
347
+ subtype: 'compact_boundary',
348
+ content: m.content || 'Conversation compacted',
349
+ parentId,
350
+ timestamp: m.timestamp,
351
+ });
352
+ }
353
+ // Non-compact_boundary system messages: skip with redirect
354
+ if (results.length === resultsBefore) {
355
+ skippedRedirect.set(m.uuid, m.parentUuid ?? undefined);
356
+ }
255
357
  continue;
358
+ }
256
359
  // Handle queue-operation task notifications
257
360
  if (m.type === 'queue-operation' && m.content) {
258
361
  const taskNotif = parseTaskNotification(m.content);
@@ -262,6 +365,7 @@ export function transformToHistoryMessages(raw) {
262
365
  type: 'task_notification',
263
366
  content: taskNotif.summary,
264
367
  timestamp: m.timestamp,
368
+ parentId,
265
369
  taskStatus: taskNotif.status,
266
370
  taskSummary: taskNotif.summary,
267
371
  taskToolUseId: taskNotif.toolUseId,
@@ -272,8 +376,11 @@ export function transformToHistoryMessages(raw) {
272
376
  if (m.type === 'assistant') {
273
377
  const messageContent = m.message?.content;
274
378
  if (Array.isArray(messageContent)) {
275
- // Split content blocks into separate HistoryMessages
379
+ // Split content blocks into separate HistoryMessages.
380
+ // The first emitted fragment uses m.uuid as its id so that child
381
+ // messages whose parentId references this raw uuid can resolve it.
276
382
  let thinkingContent;
383
+ let firstFragmentEmitted = false;
277
384
  for (const block of messageContent) {
278
385
  if (block.type === 'thinking') {
279
386
  thinkingContent = block.thinking;
@@ -282,11 +389,14 @@ export function transformToHistoryMessages(raw) {
282
389
  const text = block.text;
283
390
  // Skip "(no content)" placeholder
284
391
  if (text.trim() && text.trim() !== '(no content)') {
392
+ const id = !firstFragmentEmitted ? m.uuid : `${m.uuid}-text-${results.length}`;
393
+ firstFragmentEmitted = true;
285
394
  results.push({
286
- id: `${m.uuid}-text-${results.length}`,
395
+ id,
287
396
  type: 'assistant',
288
397
  content: text,
289
398
  timestamp: m.timestamp,
399
+ parentId,
290
400
  thinking: thinkingContent,
291
401
  });
292
402
  thinkingContent = undefined;
@@ -295,11 +405,14 @@ export function transformToHistoryMessages(raw) {
295
405
  else if (block.type === 'tool_use') {
296
406
  const toolBlock = block;
297
407
  const idx = results.length;
408
+ const id = !firstFragmentEmitted ? m.uuid : `${m.uuid}-tool-${toolBlock.id}`;
409
+ firstFragmentEmitted = true;
298
410
  results.push({
299
- id: `${m.uuid}-tool-${toolBlock.id}`,
411
+ id,
300
412
  type: 'tool_use',
301
413
  content: `Calling ${toolBlock.name}`,
302
414
  timestamp: m.timestamp,
415
+ parentId,
303
416
  toolName: toolBlock.name,
304
417
  toolInput: toolBlock.input,
305
418
  thinking: thinkingContent,
@@ -310,11 +423,13 @@ export function transformToHistoryMessages(raw) {
310
423
  }
311
424
  // If only thinking with no text/tool, create thinking-only message
312
425
  if (thinkingContent) {
426
+ const id = !firstFragmentEmitted ? m.uuid : `${m.uuid}-thinking`;
313
427
  results.push({
314
- id: `${m.uuid}-thinking`,
428
+ id,
315
429
  type: 'assistant',
316
430
  content: '',
317
431
  timestamp: m.timestamp,
432
+ parentId,
318
433
  thinking: thinkingContent,
319
434
  });
320
435
  }
@@ -328,6 +443,7 @@ export function transformToHistoryMessages(raw) {
328
443
  type: 'assistant',
329
444
  content: text,
330
445
  timestamp: m.timestamp,
446
+ parentId,
331
447
  });
332
448
  }
333
449
  }
@@ -369,6 +485,7 @@ export function transformToHistoryMessages(raw) {
369
485
  type: 'task_notification',
370
486
  content: taskNotif.summary,
371
487
  timestamp: m.timestamp,
488
+ parentId,
372
489
  taskStatus: taskNotif.status,
373
490
  taskSummary: taskNotif.summary,
374
491
  taskToolUseId: taskNotif.toolUseId,
@@ -377,12 +494,13 @@ export function transformToHistoryMessages(raw) {
377
494
  else {
378
495
  const cleaned = cleanCommandTags(textContent);
379
496
  if (cleaned.trim()) {
380
- const images = extractImages(messageContent);
497
+ const images = extractImages(messageContent, projectSlug, sessionId);
381
498
  results.push({
382
499
  id: m.uuid,
383
500
  type: 'user',
384
501
  content: cleaned,
385
502
  timestamp: m.timestamp,
503
+ parentId,
386
504
  ...(images && { images }),
387
505
  });
388
506
  }
@@ -400,6 +518,7 @@ export function transformToHistoryMessages(raw) {
400
518
  type: 'task_notification',
401
519
  content: taskNotif.summary,
402
520
  timestamp: m.timestamp,
521
+ parentId,
403
522
  taskStatus: taskNotif.status,
404
523
  taskSummary: taskNotif.summary,
405
524
  taskToolUseId: taskNotif.toolUseId,
@@ -413,6 +532,7 @@ export function transformToHistoryMessages(raw) {
413
532
  type: 'user',
414
533
  content: cleaned,
415
534
  timestamp: m.timestamp,
535
+ parentId,
416
536
  });
417
537
  }
418
538
  }
@@ -426,6 +546,7 @@ export function transformToHistoryMessages(raw) {
426
546
  type: 'tool_use',
427
547
  content: `Calling ${m.toolName}`,
428
548
  timestamp: m.timestamp,
549
+ parentId,
429
550
  toolName: m.toolName,
430
551
  toolInput: m.toolInput,
431
552
  });
@@ -461,6 +582,7 @@ export function transformToHistoryMessages(raw) {
461
582
  type: 'tool_result',
462
583
  content,
463
584
  timestamp: m.timestamp,
585
+ parentId,
464
586
  toolResult: {
465
587
  success: !m.error,
466
588
  output: m.result,
@@ -470,169 +592,13 @@ export function transformToHistoryMessages(raw) {
470
592
  }
471
593
  }
472
594
  }
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 });
595
+ // If this raw message produced no visible output (e.g., empty assistant,
596
+ // user consumed entirely by tool_result merging), register redirect so
597
+ // children's parentId resolves to this message's parent instead.
598
+ if (results.length === resultsBefore) {
599
+ skippedRedirect.set(m.uuid, m.parentUuid ?? undefined);
503
600
  }
504
601
  }
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;
602
+ return results;
637
603
  }
638
604
  //# sourceMappingURL=historyParser.js.map