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.
- package/README.md +8 -2
- package/bin/hammoc.js +12 -0
- package/package.json +3 -3
- package/packages/client/dist/assets/index-Cb8l58mq.js +1451 -0
- package/packages/client/dist/assets/index-Cc_AX5QV.css +32 -0
- package/packages/client/dist/assets/{index-BQASJJka.js → index-G9znBi60.js} +1 -1
- package/packages/client/dist/index.html +2 -2
- package/packages/client/dist/sw.js +1 -1
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +3 -0
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/controllers/queueController.d.ts +1 -0
- package/packages/server/dist/controllers/queueController.d.ts.map +1 -1
- package/packages/server/dist/controllers/queueController.js +12 -0
- package/packages/server/dist/controllers/queueController.js.map +1 -1
- package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
- package/packages/server/dist/controllers/serverController.js +20 -2
- package/packages/server/dist/controllers/serverController.js.map +1 -1
- package/packages/server/dist/controllers/sessionController.d.ts +5 -10
- package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
- package/packages/server/dist/controllers/sessionController.js +65 -80
- package/packages/server/dist/controllers/sessionController.js.map +1 -1
- package/packages/server/dist/handlers/streamCallbacks.d.ts +4 -0
- package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
- package/packages/server/dist/handlers/streamCallbacks.js +9 -3
- package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
- package/packages/server/dist/handlers/websocket.d.ts +9 -15
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +668 -120
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/locales/en/server.json +3 -1
- package/packages/server/dist/locales/es/server.json +3 -1
- package/packages/server/dist/locales/ja/server.json +3 -1
- package/packages/server/dist/locales/ko/server.json +3 -1
- package/packages/server/dist/locales/pt/server.json +3 -1
- package/packages/server/dist/locales/zh-CN/server.json +3 -1
- package/packages/server/dist/routes/images.d.ts +7 -0
- package/packages/server/dist/routes/images.d.ts.map +1 -0
- package/packages/server/dist/routes/images.js +51 -0
- package/packages/server/dist/routes/images.js.map +1 -0
- package/packages/server/dist/routes/queue.d.ts.map +1 -1
- package/packages/server/dist/routes/queue.js +2 -1
- package/packages/server/dist/routes/queue.js.map +1 -1
- package/packages/server/dist/routes/sessions.d.ts.map +1 -1
- package/packages/server/dist/routes/sessions.js +2 -3
- package/packages/server/dist/routes/sessions.js.map +1 -1
- package/packages/server/dist/services/chatService.d.ts +2 -0
- package/packages/server/dist/services/chatService.d.ts.map +1 -1
- package/packages/server/dist/services/chatService.js +33 -1
- package/packages/server/dist/services/chatService.js.map +1 -1
- package/packages/server/dist/services/historyParser.d.ts +1 -11
- package/packages/server/dist/services/historyParser.d.ts.map +1 -1
- package/packages/server/dist/services/historyParser.js +148 -182
- package/packages/server/dist/services/historyParser.js.map +1 -1
- package/packages/server/dist/services/imageStorageService.d.ts +28 -0
- package/packages/server/dist/services/imageStorageService.d.ts.map +1 -0
- package/packages/server/dist/services/imageStorageService.js +108 -0
- package/packages/server/dist/services/imageStorageService.js.map +1 -0
- package/packages/server/dist/services/ptyService.d.ts +6 -0
- package/packages/server/dist/services/ptyService.d.ts.map +1 -1
- package/packages/server/dist/services/ptyService.js +59 -0
- package/packages/server/dist/services/ptyService.js.map +1 -1
- package/packages/server/dist/services/queueService.d.ts.map +1 -1
- package/packages/server/dist/services/queueService.js +23 -2
- package/packages/server/dist/services/queueService.js.map +1 -1
- package/packages/server/dist/services/sessionBufferManager.d.ts +26 -0
- package/packages/server/dist/services/sessionBufferManager.d.ts.map +1 -0
- package/packages/server/dist/services/sessionBufferManager.js +113 -0
- package/packages/server/dist/services/sessionBufferManager.js.map +1 -0
- package/packages/server/dist/services/sessionService.d.ts +26 -1
- package/packages/server/dist/services/sessionService.d.ts.map +1 -1
- package/packages/server/dist/services/sessionService.js +168 -39
- package/packages/server/dist/services/sessionService.js.map +1 -1
- package/packages/server/dist/services/summarizeService.d.ts +25 -0
- package/packages/server/dist/services/summarizeService.d.ts.map +1 -0
- package/packages/server/dist/services/summarizeService.js +122 -0
- package/packages/server/dist/services/summarizeService.js.map +1 -0
- package/packages/server/dist/utils/imageUtils.d.ts +11 -0
- package/packages/server/dist/utils/imageUtils.d.ts.map +1 -0
- package/packages/server/dist/utils/imageUtils.js +37 -0
- package/packages/server/dist/utils/imageUtils.js.map +1 -0
- package/packages/server/dist/utils/messageTree.d.ts +56 -0
- package/packages/server/dist/utils/messageTree.d.ts.map +1 -0
- package/packages/server/dist/utils/messageTree.js +370 -0
- package/packages/server/dist/utils/messageTree.js.map +1 -0
- package/packages/server/package.json +3 -1
- package/packages/shared/dist/constants/index.d.ts +3 -0
- package/packages/shared/dist/constants/index.d.ts.map +1 -0
- package/packages/shared/dist/constants/index.js +3 -0
- package/packages/shared/dist/constants/index.js.map +1 -0
- package/packages/shared/dist/constants/messageTree.d.ts +6 -0
- package/packages/shared/dist/constants/messageTree.d.ts.map +1 -0
- package/packages/shared/dist/constants/messageTree.js +7 -0
- package/packages/shared/dist/constants/messageTree.js.map +1 -0
- package/packages/shared/dist/index.d.ts +1 -1
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +1 -1
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/history.d.ts +21 -8
- package/packages/shared/dist/types/history.d.ts.map +1 -1
- package/packages/shared/dist/types/message.d.ts +10 -0
- package/packages/shared/dist/types/message.d.ts.map +1 -1
- package/packages/shared/dist/types/message.js.map +1 -1
- package/packages/shared/dist/types/preferences.d.ts +2 -1
- package/packages/shared/dist/types/preferences.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.js.map +1 -1
- package/packages/shared/dist/types/sdk.d.ts +8 -0
- package/packages/shared/dist/types/sdk.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.js.map +1 -1
- package/packages/shared/dist/types/session.d.ts +1 -0
- package/packages/shared/dist/types/session.d.ts.map +1 -1
- package/packages/shared/dist/types/session.js.map +1 -1
- package/packages/shared/dist/types/websocket.d.ts +59 -5
- package/packages/shared/dist/types/websocket.d.ts.map +1 -1
- package/scripts/spike-25.9-output.log +47 -0
- package/packages/client/dist/assets/index-Dr2X4keZ.css +0 -32
- 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;
|
|
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
|
-
*
|
|
175
|
-
*
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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
|
-
|
|
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
|