(item: Extract<ConversationItem, { kind: "tool" }>)
| 305 | } |
| 306 | |
| 307 | function summarizeCommandExecution(item: Extract<ConversationItem, { kind: "tool" }>) { |
| 308 | if (isFailedStatus(item.status)) { |
| 309 | return null; |
| 310 | } |
| 311 | const rawCommand = item.title.replace(/^Command:\s*/i, "").trim(); |
| 312 | const cleaned = cleanCommandText(rawCommand); |
| 313 | if (!cleaned) { |
| 314 | return null; |
| 315 | } |
| 316 | const segments = splitCommandSegments(cleaned); |
| 317 | if (segments.length === 0) { |
| 318 | return null; |
| 319 | } |
| 320 | const entries: ExploreEntry[] = []; |
| 321 | for (const segment of segments) { |
| 322 | const parsed = parseCommandSegment(segment); |
| 323 | if (!parsed) { |
| 324 | return null; |
| 325 | } |
| 326 | entries.push(...parsed); |
| 327 | } |
| 328 | if (entries.length === 0) { |
| 329 | return null; |
| 330 | } |
| 331 | const coalescedEntries = coalesceReadEntries(entries); |
| 332 | const status: ExploreItem["status"] = normalizeCommandStatus(item.status); |
| 333 | return { |
| 334 | id: item.id, |
| 335 | kind: "explore", |
| 336 | status, |
| 337 | entries: coalescedEntries, |
| 338 | } satisfies ExploreItem; |
| 339 | } |
| 340 | |
| 341 | function summarizeExploration(items: ConversationItem[]) { |
| 342 | const result: ConversationItem[] = []; |
no test coverage detected