omp-fabric 1.25.20 → 1.25.21

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.
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/call-preview.ts", "../../src/ui/preview-lines.ts", "../../src/providers/write-diff-limits.ts", "../../src/ui/transcript-reader.ts", "../../src/ui/transcript-parser.ts", "../../src/ui/transcript.ts"],
4
- "sourcesContent": ["// A shared, provider-agnostic heuristic for the one-line \"headline\" argument\n// of a nested Fabric call \u2014 the value shown beside a tool's name in the chat\n// preview (e.g. `recall <query>`) and appended to its ref in the dashboard\n// (e.g. `extensions.vcc_recall \u00B7 <query>`). OMP core tools and the first-class\n// Fabric providers (agents/mesh/mcp management) keep their bespoke, tuned\n// previews; this picks up everything else \u2014 captured extension tools and\n// arbitrary MCP tools \u2014 so they no longer render as a bare tool name.\n//\n// The key order preserves the dashboard's prior task -> path -> query ->\n// message preference for the fields it already recognized, then extends to\n// other common payload names. The final first-string fallback covers tools\n// whose argument names are unfamiliar, skipping structural/metadata keys\n// (label/title/mode/limit/...) that describe the call rather than its\n// payload. Control characters are not stripped here: the inline preview\n// already tolerates them (matching the existing task fallback) and the\n// dashboard sanitizes labels via safeText at render time.\nexport const HEADLINE_ARG_KEYS = [\n \"task\", \"path\", \"query\", \"message\", \"search\", \"pattern\", \"command\", \"text\",\n \"prompt\", \"question\", \"input\", \"content\", \"expression\", \"url\", \"topic\",\n \"key\", \"filter\", \"name\", \"q\",\n] as const;\n\nconst HEADLINE_SKIP_KEYS = new Set([\n \"label\", \"title\", \"type\", \"kind\", \"mode\", \"format\", \"resultFormat\",\n \"limit\", \"max\", \"offset\", \"start\", \"concurrency\", \"overwrite\", \"id\",\n \"provider\", \"namespace\", \"server\", \"tool\", \"ref\", \"recursive\", \"synthesize\",\n \"commandDigest\",\n]);\n\nconst cleanOneLine = (value: string, max: number): string => {\n const single = value.replace(/\\s+/g, \" \").trim();\n if (!single) return \"\";\n return single.length <= max ? single : `${single.slice(0, Math.max(1, max - 1))}\u2026`;\n};\n\n/**\n * Pick the best single-line argument value to display beside a nested call's\n * tool name, for tools that have no bespoke preview. Returns `undefined`\n * when no string payload argument is present.\n */\nexport const headlineArg = (\n args: Record<string, unknown> | undefined,\n max = 96,\n): string | undefined => {\n if (!args) return undefined;\n for (const key of HEADLINE_ARG_KEYS) {\n const value = args[key];\n if (typeof value === \"string\") {\n const cleaned = cleanOneLine(value, max);\n if (cleaned) return cleaned;\n }\n }\n for (const [key, value] of Object.entries(args)) {\n if (HEADLINE_SKIP_KEYS.has(key)) continue;\n if (typeof value === \"string\") {\n const cleaned = cleanOneLine(value, max);\n if (cleaned) return cleaned;\n }\n }\n return undefined;\n};\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\n\nexport type PreviewLineEntry<T> =\n | { kind: \"line\"; line: T; index: number }\n | { kind: \"hidden\"; hidden: number };\n\nexport function countContentLines(content: string): number {\n if (!content) return 0;\n let terminators = 0;\n for (let index = 0; index < content.length; index++) {\n const code = content.charCodeAt(index);\n if (code === 13) {\n terminators++;\n if (content.charCodeAt(index + 1) === 10) index++;\n } else if (code === 10) {\n terminators++;\n }\n }\n const finalCode = content.charCodeAt(content.length - 1);\n return terminators + (finalCode === 10 || finalCode === 13 ? 0 : 1);\n}\n\nexport function selectPreviewTextLines(\n text: string,\n limit: number,\n): { entries: Array<PreviewLineEntry<string>>; shown: number; hidden: number; total: number } {\n if (!Number.isInteger(limit)) {\n const lines = collectPreviewTextLines(text);\n return { ...selectPreviewLines(lines, limit), total: lines.length };\n }\n\n const entries: Array<PreviewLineEntry<string>> = [];\n const split = limit >= 8;\n const head = split ? Math.ceil(limit * 0.65) : limit;\n const tailLimit = split ? Math.max(1, limit - head - 1) : 0;\n const tail: Array<string | undefined> = [];\n let tailSize = 0;\n let tailCursor = 0;\n let total = 0;\n forEachPreviewTextLine(text, (line, index) => {\n total++;\n if (limit <= 0 || index < limit) entries.push({ kind: \"line\", line, index });\n if (!split || index < head) return;\n tail[tailCursor] = line;\n if (++tailCursor === tailLimit) tailCursor = 0;\n if (tailSize < tailLimit) tailSize++;\n });\n\n if (limit <= 0 || total <= limit) return { entries, shown: total, hidden: 0, total };\n if (!split) return { entries, shown: limit, hidden: total - limit, total };\n const hidden = total - head - tailLimit;\n const selected = entries.slice(0, head);\n selected.push({ kind: \"hidden\", hidden });\n let tailSlot = tailSize === tailLimit ? tailCursor : 0;\n for (let offset = 0; offset < tailSize; offset++) {\n const line = tail[tailSlot];\n if (line === undefined) throw new RangeError(`Missing preview tail line ${offset}`);\n selected.push({ kind: \"line\", line, index: total - tailSize + offset });\n if (++tailSlot === tailLimit) tailSlot = 0;\n }\n return { entries: selected, shown: head + tailLimit, hidden, total };\n}\n\nfunction selectPreviewLines<T>(\n lines: T[],\n limit: number,\n): { entries: Array<PreviewLineEntry<T>>; shown: number; hidden: number } {\n if (lines.length <= limit || limit <= 0) {\n return {\n entries: lines.map((line, index) => ({ kind: \"line\", line, index })),\n shown: lines.length,\n hidden: 0,\n };\n }\n if (limit < 8) {\n return {\n entries: lines.slice(0, limit).map((line, index) => ({ kind: \"line\", line, index })),\n shown: limit,\n hidden: lines.length - limit,\n };\n }\n const head = Math.ceil(limit * 0.65);\n const tail = Math.max(1, limit - head - 1);\n const hidden = lines.length - head - tail;\n return {\n entries: [\n ...lines.slice(0, head).map((line, index) => ({ kind: \"line\" as const, line, index })),\n { kind: \"hidden\", hidden },\n ...lines.slice(-tail).map((line, offset) => ({\n kind: \"line\" as const,\n line,\n index: lines.length - tail + offset,\n })),\n ],\n shown: head + tail,\n hidden,\n };\n}\n\nfunction collectPreviewTextLines(text: string): string[] {\n const lines: string[] = [];\n forEachPreviewTextLine(text, (line) => lines.push(line));\n return lines;\n}\n\nfunction forEachPreviewTextLine(\n text: string,\n callback: (line: string, index: number) => void,\n): void {\n let index = 0;\n let pendingEmpty = 0;\n forEachRawTextLine(text, (line) => {\n if (line === \"\") {\n pendingEmpty++;\n return;\n }\n while (pendingEmpty > 0) {\n callback(\"\", index++);\n pendingEmpty--;\n }\n callback(line, index++);\n });\n if (index === 0 && pendingEmpty > 0 && text.length > 0) callback(\"\", index);\n}\n\nfunction forEachRawTextLine(text: string, callback: (line: string) => void): void {\n let start = 0;\n while (start <= text.length) {\n const newline = text.indexOf(\"\\n\", start);\n if (newline < 0) {\n callback(text.slice(start));\n break;\n }\n callback(text.slice(start, newline));\n start = newline + 1;\n }\n}\n", "// Pure write-diff size guards shared by the write-preview tool wrapper and the\n// dashboard's core-tool-render. Keep this module free of imports from\n// \"@oh-my-pi/pi-coding-agent\": it is part of the lazily imported\n// dashboard graph, which cannot resolve OMP's host package in managed\n// installs (issue #13).\n\nconst configuredMaxBytes = Number.parseInt(\n process.env.CODE_PREVIEW_MAX_WRITE_DIFF_BYTES ?? \"\",\n 10,\n);\nexport const MAX_WRITE_DIFF_BYTES =\n Number.isFinite(configuredMaxBytes) && configuredMaxBytes > 0\n ? configuredMaxBytes\n : 200_000;\n\nconst configuredMaxChangedLineCells = Number.parseInt(\n process.env.CODE_PREVIEW_MAX_WRITE_DIFF_CHANGED_LINE_CELLS ?? \"\",\n 10,\n);\nconst MAX_WRITE_DIFF_CHANGED_LINE_CELLS =\n Number.isFinite(configuredMaxChangedLineCells) && configuredMaxChangedLineCells > 0\n ? configuredMaxChangedLineCells\n : 1_000_000;\n\nexport const writeContentForPreview = (content: string): string | undefined =>\n Buffer.byteLength(content, \"utf8\") <= MAX_WRITE_DIFF_BYTES ? content : undefined;\n\nexport const shouldSkipWriteDiffBytes = (...texts: string[]): boolean => {\n let total = 0;\n for (const text of texts) {\n total += Buffer.byteLength(text, \"utf8\");\n if (total > MAX_WRITE_DIFF_BYTES) return true;\n }\n return false;\n};\n\nexport const shouldSkipWriteDiffComplexity = (before: string, after: string): boolean => {\n const beforeLines = before.split(\"\\n\");\n const afterLines = after.split(\"\\n\");\n const sharedLimit = Math.min(beforeLines.length, afterLines.length);\n let prefix = 0;\n while (prefix < sharedLimit && beforeLines[prefix] === afterLines[prefix]) prefix++;\n\n let suffix = 0;\n const suffixLimit = sharedLimit - prefix;\n while (\n suffix < suffixLimit &&\n beforeLines[beforeLines.length - suffix - 1] ===\n afterLines[afterLines.length - suffix - 1]\n ) {\n suffix++;\n }\n\n const changedBefore = beforeLines.length - prefix - suffix;\n const changedAfter = afterLines.length - prefix - suffix;\n return changedBefore * changedAfter > MAX_WRITE_DIFF_CHANGED_LINE_CELLS;\n};\n", "import fs from \"node:fs\";\nimport { readJsonlPageFromDescriptor } from \"../log-tail.js\";\nimport type { FabricLogLine } from \"../agents/types.js\";\nimport {\n missingToolStartIds,\n normalizedToolStarts,\n parsedEvents,\n parseRaw,\n TranscriptAccumulator,\n} from \"./transcript-parser.js\";\nimport type { FabricAgentTranscript, FabricTranscriptSource } from \"./transcript.js\";\n\nconst PAGE_LINES = 40;\nconst TOOL_LIFECYCLE_CONTEXT_LINES = PAGE_LINES * 4;\nconst MAX_PAGE_BYTES = 512 * 1024;\nconst MAX_CACHE_ENTRIES = 32;\nconst FORWARD_READ_CHUNK_BYTES = 64 * 1024;\n\ninterface CachedTranscript {\n device: number;\n inode: number;\n modifiedAt: number;\n offset: number;\n completeEnd: number;\n pageStart: number;\n pageEnd: number;\n hasMore: boolean;\n transcript: FabricAgentTranscript;\n}\n\ninterface ForwardTranscriptPage {\n lines: FabricLogLine[];\n end: number;\n}\n\nconst completeLogEnd = (descriptor: number, size: number, fallback = 0): number => {\n if (size <= 0) return 0;\n const scanFloor = Math.max(0, size - MAX_PAGE_BYTES);\n let scanEnd = size;\n while (scanEnd > scanFloor) {\n const scanStart = Math.max(scanFloor, scanEnd - FORWARD_READ_CHUNK_BYTES);\n const chunk = Buffer.allocUnsafe(scanEnd - scanStart);\n const bytesRead = fs.readSync(descriptor, chunk, 0, chunk.length, scanStart);\n if (bytesRead <= 0) return 0;\n for (let index = bytesRead - 1; index >= 0; index--) {\n if (chunk[index] === 0x0a) return scanStart + index + 1;\n }\n scanEnd = scanStart;\n }\n return Math.min(fallback, size);\n};\n\nconst readForwardPage = (\n descriptor: number,\n start: number,\n end: number,\n): ForwardTranscriptPage => {\n const lines: FabricLogLine[] = [];\n const readLimit = Math.min(end, Math.max(0, start) + MAX_PAGE_BYTES);\n let readOffset = Math.max(0, start);\n let pending = Buffer.alloc(0);\n let pendingOffset = readOffset;\n let pageEnd = readOffset;\n\n while (readOffset < readLimit && lines.length < PAGE_LINES) {\n const chunkSize = Math.min(FORWARD_READ_CHUNK_BYTES, readLimit - readOffset);\n const chunk = Buffer.allocUnsafe(chunkSize);\n const bytesRead = fs.readSync(descriptor, chunk, 0, chunkSize, readOffset);\n if (bytesRead <= 0) break;\n const data = pending.length > 0\n ? Buffer.concat([pending, chunk.subarray(0, bytesRead)])\n : chunk.subarray(0, bytesRead);\n const dataOffset = pending.length > 0 ? pendingOffset : readOffset;\n let lineStart = 0;\n for (let index = 0; index < data.length; index++) {\n if (data[index] !== 0x0a) continue;\n const raw = data.subarray(lineStart, index).toString(\"utf8\").replace(/\\r$/, \"\");\n pageEnd = dataOffset + index + 1;\n if (raw) {\n const offset = dataOffset + lineStart;\n const parsed = parseRaw(raw);\n lines.push({ offset, raw, ...(parsed ? { parsed } : {}) });\n if (lines.length >= PAGE_LINES) return { lines, end: pageEnd };\n }\n lineStart = index + 1;\n }\n pending = Buffer.from(data.subarray(lineStart));\n pendingOffset = dataOffset + lineStart;\n readOffset += bytesRead;\n }\n\n return { lines, end: readOffset >= end ? end : pageEnd };\n};\n\nexport class AgentTranscriptReader {\n readonly #cache = new Map<string, CachedTranscript>();\n\n read(\n source: FabricTranscriptSource,\n followLatest = true,\n ): FabricAgentTranscript {\n const filePath = source.logFile;\n if (!filePath) {\n return { entries: [], truncated: false, hasMore: false, hasNewer: false };\n }\n const cached = this.#cache.get(filePath);\n let descriptor: number | undefined;\n try {\n const noFollow = typeof fs.constants.O_NOFOLLOW === \"number\" ? fs.constants.O_NOFOLLOW : 0;\n descriptor = fs.openSync(filePath, fs.constants.O_RDONLY | noFollow);\n const stat = fs.fstatSync(descriptor);\n if (!stat.isFile()) {\n return cached?.transcript ?? {\n entries: [],\n truncated: false,\n hasMore: false,\n hasNewer: false,\n };\n }\n const sameFile = cached?.device === stat.dev && cached.inode === stat.ino;\n const sameSizeRewrite =\n sameFile && cached.offset === stat.size && cached.modifiedAt !== stat.mtimeMs;\n let state: CachedTranscript;\n if (!cached || !sameFile || stat.size < cached.offset || sameSizeRewrite) {\n state = this.#latestState(descriptor, stat);\n } else if (stat.size !== cached.offset || stat.mtimeMs !== cached.modifiedAt) {\n const wasAtTail = cached.pageEnd >= cached.completeEnd;\n const completeEnd = completeLogEnd(descriptor, stat.size, cached.completeEnd);\n if (\n cached.pageEnd > completeEnd ||\n (followLatest && wasAtTail && completeEnd > cached.completeEnd)\n ) {\n state = this.#latestState(descriptor, stat, completeEnd);\n } else {\n state = {\n ...cached,\n modifiedAt: stat.mtimeMs,\n offset: stat.size,\n completeEnd,\n transcript: {\n ...cached.transcript,\n hasNewer: cached.pageEnd < completeEnd,\n updatedAt: stat.mtimeMs,\n },\n };\n }\n } else {\n state = cached;\n }\n this.#remember(filePath, state);\n return state.transcript;\n } catch {\n return cached?.transcript ?? {\n entries: [],\n truncated: false,\n hasMore: false,\n hasNewer: false,\n };\n } finally {\n if (descriptor !== undefined) {\n try { fs.closeSync(descriptor); } catch {}\n }\n }\n }\n\n loadOlder(source: FabricTranscriptSource): boolean {\n const filePath = source.logFile;\n if (!filePath) return false;\n this.read(source, false);\n const cached = this.#cache.get(filePath);\n if (!cached?.hasMore || cached.pageStart <= 0) return false;\n let descriptor: number | undefined;\n try {\n const noFollow = typeof fs.constants.O_NOFOLLOW === \"number\" ? fs.constants.O_NOFOLLOW : 0;\n descriptor = fs.openSync(filePath, fs.constants.O_RDONLY | noFollow);\n const stat = fs.fstatSync(descriptor);\n if (!stat.isFile() || stat.dev !== cached.device || stat.ino !== cached.inode) return false;\n const completeEnd = completeLogEnd(descriptor, stat.size, cached.completeEnd);\n const pageEnd = Math.min(cached.pageStart, completeEnd);\n const page = readJsonlPageFromDescriptor(\n descriptor,\n PAGE_LINES,\n pageEnd,\n stat.size,\n MAX_PAGE_BYTES,\n );\n const pageStart = page.lines[0]?.offset;\n if (pageStart === undefined) return false;\n const state = this.#stateForPage(\n descriptor,\n stat,\n completeEnd,\n page.lines,\n pageStart,\n pageEnd,\n page.hasMore,\n );\n this.#remember(filePath, state);\n return true;\n } catch {\n return false;\n } finally {\n if (descriptor !== undefined) {\n try { fs.closeSync(descriptor); } catch {}\n }\n }\n }\n\n loadNewer(source: FabricTranscriptSource): boolean {\n const filePath = source.logFile;\n if (!filePath) return false;\n this.read(source, false);\n const cached = this.#cache.get(filePath);\n if (!cached || cached.pageEnd >= cached.completeEnd) return false;\n let descriptor: number | undefined;\n try {\n const noFollow = typeof fs.constants.O_NOFOLLOW === \"number\" ? fs.constants.O_NOFOLLOW : 0;\n descriptor = fs.openSync(filePath, fs.constants.O_RDONLY | noFollow);\n const stat = fs.fstatSync(descriptor);\n if (!stat.isFile() || stat.dev !== cached.device || stat.ino !== cached.inode) return false;\n const completeEnd = completeLogEnd(descriptor, stat.size, cached.completeEnd);\n const page = readForwardPage(descriptor, cached.pageEnd, completeEnd);\n if (page.lines.length === 0 || page.end <= cached.pageEnd) return false;\n const state = this.#stateForPage(\n descriptor,\n stat,\n completeEnd,\n page.lines,\n cached.pageEnd,\n page.end,\n cached.pageEnd > 0,\n );\n this.#remember(filePath, state);\n return true;\n } catch {\n return false;\n } finally {\n if (descriptor !== undefined) {\n try { fs.closeSync(descriptor); } catch {}\n }\n }\n }\n\n loadLatest(source: FabricTranscriptSource): boolean {\n const filePath = source.logFile;\n if (!filePath) return false;\n this.read(source, false);\n const cached = this.#cache.get(filePath);\n let descriptor: number | undefined;\n try {\n const noFollow = typeof fs.constants.O_NOFOLLOW === \"number\" ? fs.constants.O_NOFOLLOW : 0;\n descriptor = fs.openSync(filePath, fs.constants.O_RDONLY | noFollow);\n const stat = fs.fstatSync(descriptor);\n if (!stat.isFile()) return false;\n if (cached && (stat.dev !== cached.device || stat.ino !== cached.inode)) return false;\n const completeEnd = completeLogEnd(descriptor, stat.size, cached?.completeEnd ?? 0);\n const state = this.#latestState(descriptor, stat, completeEnd);\n this.#remember(filePath, state);\n return true;\n } catch {\n return false;\n } finally {\n if (descriptor !== undefined) {\n try { fs.closeSync(descriptor); } catch {}\n }\n }\n }\n\n clear(): void {\n this.#cache.clear();\n }\n\n #latestState(\n descriptor: number,\n stat: fs.Stats,\n knownCompleteEnd?: number,\n ): CachedTranscript {\n const completeEnd = knownCompleteEnd ?? completeLogEnd(descriptor, stat.size);\n const page = readJsonlPageFromDescriptor(\n descriptor,\n PAGE_LINES,\n completeEnd,\n stat.size,\n MAX_PAGE_BYTES,\n );\n return this.#stateForPage(\n descriptor,\n stat,\n completeEnd,\n page.lines,\n page.lines[0]?.offset ?? completeEnd,\n completeEnd,\n page.hasMore,\n );\n }\n\n #stateForPage(\n descriptor: number,\n stat: fs.Stats,\n completeEnd: number,\n lines: FabricLogLine[],\n pageStart: number,\n pageEnd: number,\n hasMore: boolean,\n ): CachedTranscript {\n const events = parsedEvents(lines);\n const missingStarts = missingToolStartIds(events);\n const lifecycleContext: Array<Record<string, unknown>> = [];\n if (missingStarts.size > 0 && pageStart > 0) {\n const contextPage = readJsonlPageFromDescriptor(\n descriptor,\n TOOL_LIFECYCLE_CONTEXT_LINES,\n pageStart,\n stat.size,\n MAX_PAGE_BYTES,\n );\n const contextEvents = parsedEvents(contextPage.lines);\n for (let index = contextEvents.length - 1; index >= 0 && missingStarts.size > 0; index--) {\n const starts = normalizedToolStarts(contextEvents[index]!);\n for (let startIndex = starts.length - 1; startIndex >= 0; startIndex--) {\n const start = starts[startIndex]!;\n if (!missingStarts.delete(start.id)) continue;\n lifecycleContext.unshift(start.event);\n }\n }\n }\n const accumulator = new TranscriptAccumulator();\n accumulator.append([...lifecycleContext, ...events]);\n const transcript = {\n ...accumulator.snapshot(hasMore, stat.mtimeMs, Number.MAX_SAFE_INTEGER),\n hasNewer: pageEnd < completeEnd,\n };\n return {\n device: stat.dev,\n inode: stat.ino,\n modifiedAt: stat.mtimeMs,\n offset: stat.size,\n completeEnd,\n pageStart,\n pageEnd,\n hasMore: transcript.hasMore ?? false,\n transcript,\n };\n }\n\n #remember(filePath: string, state: CachedTranscript): void {\n this.#cache.delete(filePath);\n this.#cache.set(filePath, state);\n while (this.#cache.size > MAX_CACHE_ENTRIES) {\n const oldest = this.#cache.keys().next().value as string | undefined;\n if (!oldest) break;\n this.#cache.delete(oldest);\n }\n }\n}\n", "import type { FabricLogLine } from \"../agents/types.js\";\nimport type { FabricAgentTranscript, FabricTranscriptEntry } from \"./transcript.js\";\nimport { unwrapActorEnvelopeText } from \"./conversation-transcript.js\";\nimport {\n clip,\n compactRedactedValue,\n contentText,\n messageError,\n recordOf,\n redact,\n redactRecord,\n terminalSafe,\n} from \"./transcript-sanitization.js\";\n\nconst MAX_TOOL_SUMMARY_CHARS = 500;\nconst MAX_TRANSCRIPT_MESSAGE_CHARS = 40_000;\nconst TRANSCRIPT_ENTRY_LIMIT = 80;\n\ntype FabricTranscriptEntryStatus = \"running\" | \"completed\" | \"failed\";\n\nexport class TranscriptAccumulator {\n readonly entries: FabricTranscriptEntry[] = [];\n readonly #tools = new Map<string, FabricTranscriptEntry>();\n readonly #anonymousTools = new Map<string, FabricTranscriptEntry[]>();\n readonly #activeTools: FabricTranscriptEntry[] = [];\n #assistant: FabricTranscriptEntry | undefined;\n #retry: FabricTranscriptEntry | undefined;\n #compaction: FabricTranscriptEntry | undefined;\n readonly #userMessages = new Map<string, FabricTranscriptEntry>();\n readonly #userBoundaries = new Map<string, { serial: number; ended: boolean }>();\n #sequence = 0;\n\n append(events: Array<Record<string, unknown>>): void {\n for (const event of events) this.#append(event);\n }\n\n snapshot(\n olderAvailable = false,\n updatedAt?: number,\n maxEntries = TRANSCRIPT_ENTRY_LIMIT,\n ): FabricAgentTranscript {\n const entries = maxEntries > 0 && this.entries.length > maxEntries\n ? this.entries.slice(-maxEntries)\n : this.entries;\n const omitted = entries.length < this.entries.length;\n return {\n entries: entries.map((entry) => ({ ...entry })),\n truncated: olderAvailable || omitted,\n hasMore: olderAvailable || omitted,\n ...(updatedAt !== undefined ? { updatedAt } : {}),\n };\n }\n\n #nextId(event: Record<string, unknown>, prefix = \"event\"): string {\n if (typeof event.toolCallId === \"string\") return event.toolCallId;\n if (typeof event.uuid === \"string\") return event.uuid;\n if (typeof event.id === \"string\") return event.id;\n return `${prefix}-${this.#sequence++}`;\n }\n\n #finishAssistant(status: \"completed\" | \"failed\"): void {\n if (!this.#assistant) return;\n this.#assistant.status = status;\n this.#assistant = undefined;\n }\n\n #pushMessage(\n kind: \"user\" | \"assistant\",\n id: string,\n text: string,\n status: FabricTranscriptEntryStatus = \"completed\",\n label = kind === \"assistant\" ? \"Agent\" : \"User\",\n identity?: string,\n ): void {\n const display = kind === \"user\" ? (unwrapActorEnvelopeText(text) ?? text) : text;\n const safe = clip(display, MAX_TRANSCRIPT_MESSAGE_CHARS, kind !== \"user\");\n if (!safe) return;\n const entry: FabricTranscriptEntry = { id, kind, label, text: safe, status };\n if (kind === \"user\" && identity) {\n // Identity-aware start/end correlation: message_start and message_end\n // carry the same timestamp/content within one lifecycle. The boundary\n // serial distinguishes repeated turns even if their timestamps collide.\n const existing = this.#userMessages.get(identity);\n if (existing) {\n existing.text = safe;\n return;\n }\n this.#userMessages.set(identity, entry);\n }\n this.entries.push(entry);\n }\n\n #userIdentity(event: Record<string, unknown>, message: Record<string, unknown>): string | undefined {\n if (event.type === \"message_start\" || event.type === \"message_end\" || event.type === \"message\") {\n const timestamp = message.timestamp;\n if (typeof timestamp === \"number\" && Number.isFinite(timestamp)) {\n const base = JSON.stringify([timestamp, contentText(message.content)]);\n let boundary = this.#userBoundaries.get(base);\n if (!boundary || (event.type === \"message_start\" && boundary.ended)) {\n boundary = { serial: (boundary?.serial ?? -1) + 1, ended: false };\n this.#userBoundaries.set(base, boundary);\n }\n if (event.type === \"message_end\") boundary.ended = true;\n return `user:${base}:${boundary.serial}`;\n }\n }\n return undefined;\n }\n\n #toolParent(id: string): FabricTranscriptEntry | undefined {\n if (!id.startsWith(\"fabric_\")) return undefined;\n for (let index = this.#activeTools.length - 1; index >= 0; index--) {\n const candidate = this.#activeTools[index];\n if (candidate?.toolName === \"fabric_exec\" && candidate.status === \"running\") return candidate;\n }\n return undefined;\n }\n\n #startTool(\n id: string,\n label: string,\n args: unknown,\n ): FabricTranscriptEntry {\n const existing = this.#tools.get(id);\n const safeArgs = args === undefined ? undefined : redactRecord(args);\n if (existing) {\n if (safeArgs !== undefined) existing.args = safeArgs;\n if (args !== undefined) existing.text = compactRedactedValue(safeArgs ?? redact(args));\n return existing;\n }\n const parent = this.#toolParent(id);\n const safeLabel = terminalSafe(label) || \"tool\";\n const entry: FabricTranscriptEntry = {\n id,\n kind: \"tool\",\n label: safeLabel,\n toolName: safeLabel,\n status: \"running\",\n ...(safeArgs !== undefined ? { args: safeArgs } : {}),\n ...(args !== undefined\n ? { text: compactRedactedValue(safeArgs ?? redact(args)) }\n : {}),\n ...(parent ? { parentId: parent.id, depth: (parent.depth ?? 0) + 1 } : {}),\n };\n this.entries.push(entry);\n this.#tools.set(id, entry);\n this.#activeTools.push(entry);\n return entry;\n }\n\n #finishTool(id: string | undefined, label: string, result: unknown, failed: boolean): void {\n const safeLabel = terminalSafe(label) || \"tool\";\n const anonymous = this.#anonymousTools.get(safeLabel);\n const entry = id ? this.#tools.get(id) : anonymous?.shift();\n if (anonymous?.length === 0) this.#anonymousTools.delete(safeLabel);\n const safeResult = result === undefined ? undefined : redact(result);\n if (entry) {\n entry.status = failed ? \"failed\" : \"completed\";\n if (safeResult !== undefined) entry.result = safeResult;\n if (failed && result !== undefined) {\n const failure = compactRedactedValue(safeResult);\n entry.text = clip(\n `${entry.text ? `${entry.text} \u00B7 ` : \"\"}error: ${failure}`,\n MAX_TOOL_SUMMARY_CHARS,\n );\n }\n this.#tools.delete(entry.id);\n const activeIndex = this.#activeTools.indexOf(entry);\n if (activeIndex >= 0) this.#activeTools.splice(activeIndex, 1);\n return;\n }\n this.entries.push({\n id: id ?? `tool-${this.#sequence++}`,\n kind: \"tool\",\n label: safeLabel,\n toolName: safeLabel,\n status: failed ? \"failed\" : \"completed\",\n ...(safeResult !== undefined ? { result: safeResult } : {}),\n ...(failed && safeResult !== undefined ? { text: compactRedactedValue(safeResult) } : {}),\n });\n }\n\n #appendSessionMessage(event: Record<string, unknown>, message: Record<string, unknown>): void {\n const id = this.#nextId(event, \"message\");\n if (message.role === \"user\") {\n this.#pushMessage(\"user\", id, contentText(message.content), \"completed\", \"User\", this.#userIdentity(event, message));\n return;\n }\n if (message.role === \"assistant\") {\n const error = messageError(message);\n const text = contentText(message.content);\n if (text) this.#pushMessage(\"assistant\", id, text, error ? \"failed\" : \"completed\");\n if (error) {\n this.entries.push({\n id: `${id}-error`,\n kind: \"error\",\n label: \"Agent error\",\n text: error,\n status: \"failed\",\n });\n }\n if (Array.isArray(message.content)) {\n for (const value of message.content) {\n const part = recordOf(value);\n if (part?.type !== \"toolCall\" || typeof part.name !== \"string\") continue;\n const toolId = typeof part.id === \"string\" ? part.id : `session-tool-${this.#sequence++}`;\n this.#startTool(toolId, part.name, part.arguments);\n }\n }\n return;\n }\n if (message.role === \"toolResult\") {\n const toolId = typeof message.toolCallId === \"string\" ? message.toolCallId : undefined;\n const label = typeof message.toolName === \"string\" ? message.toolName : \"tool\";\n this.#finishTool(\n toolId,\n label,\n { content: message.content, ...(message.details !== undefined ? { details: message.details } : {}) },\n message.isError === true,\n );\n }\n }\n\n #append(event: Record<string, unknown>): void {\n if (typeof event.type !== \"string\") return;\n const id = this.#nextId(event);\n\n if (event.type === \"message\") {\n const message = recordOf(event.message);\n if (message) this.#appendSessionMessage(event, message);\n return;\n }\n\n if (event.type === \"model_changed\") {\n const provider = typeof event.provider === \"string\" ? event.provider : \"\";\n const model = typeof event.modelId === \"string\" ? event.modelId : \"\";\n this.entries.push({\n id,\n kind: \"status\",\n label: \"Model changed\",\n ...(provider || model ? { text: [provider, model].filter(Boolean).join(\"/\") } : {}),\n status: \"completed\",\n });\n return;\n }\n\n if (event.type === \"thinking_level_changed\") {\n this.entries.push({\n id,\n kind: \"status\",\n label: \"Thinking changed\",\n ...(typeof event.thinkingLevel === \"string\" ? { text: event.thinkingLevel } : {}),\n status: \"completed\",\n });\n return;\n }\n\n if (event.type === \"compaction\") {\n this.entries.push({\n id,\n kind: \"status\",\n label: \"Compacted context\",\n ...(typeof event.summary === \"string\" ? { text: terminalSafe(event.summary) } : {}),\n status: \"completed\",\n });\n return;\n }\n\n if (event.type === \"stream_event\") {\n const stream = recordOf(event.event);\n const delta = recordOf(stream?.delta);\n if (stream?.type === \"content_block_delta\" && delta?.type === \"text_delta\") {\n const text = typeof delta.text === \"string\" ? terminalSafe(delta.text, false) : \"\";\n if (!text) return;\n if (!this.#assistant) {\n this.#assistant = {\n id,\n kind: \"assistant\",\n label: \"Claude\",\n text: clip(text, MAX_TRANSCRIPT_MESSAGE_CHARS, false),\n status: \"running\",\n };\n this.entries.push(this.#assistant);\n } else {\n this.#assistant.text = clip(\n `${this.#assistant.text ?? \"\"}${text}`,\n MAX_TRANSCRIPT_MESSAGE_CHARS,\n false,\n );\n }\n }\n return;\n }\n\n if (event.type === \"assistant\") {\n const message = recordOf(event.message);\n if (!message || message.role !== \"assistant\") return;\n if (Array.isArray(message.content)) {\n for (const value of message.content) {\n const part = recordOf(value);\n if (part?.type !== \"tool_use\") continue;\n const toolId = typeof part.id === \"string\" ? part.id : `claude-tool-${this.#sequence++}`;\n const label = typeof part.name === \"string\" ? part.name : \"tool\";\n this.#startTool(toolId, label, part.input);\n }\n }\n const text = terminalSafe(contentText(message.content));\n if (text) {\n if (this.#assistant) {\n this.#assistant.text = clip(text, MAX_TRANSCRIPT_MESSAGE_CHARS);\n this.#finishAssistant(\"completed\");\n } else {\n this.#pushMessage(\"assistant\", id, text, \"completed\", \"Claude\");\n }\n }\n if (typeof event.error === \"string\") {\n this.entries.push({\n id: `${id}-error`,\n kind: \"error\",\n label: \"Claude error\",\n text: clip(event.error, MAX_TOOL_SUMMARY_CHARS),\n status: \"failed\",\n });\n }\n return;\n }\n\n if (event.type === \"user\") {\n const message = recordOf(event.message);\n if (!message || !Array.isArray(message.content)) return;\n let hasToolResult = false;\n for (const value of message.content) {\n const part = recordOf(value);\n if (part?.type !== \"tool_result\" || typeof part.tool_use_id !== \"string\") continue;\n hasToolResult = true;\n this.#finishTool(part.tool_use_id, \"tool\", part.content, part.is_error === true);\n }\n if (!hasToolResult) this.#pushMessage(\"user\", id, contentText(message.content));\n return;\n }\n\n if (event.type === \"result\") {\n this.#finishAssistant(event.is_error === true ? \"failed\" : \"completed\");\n if (event.is_error === true || event.subtype !== \"success\") {\n const errors = Array.isArray(event.errors)\n ? event.errors.filter((value): value is string => typeof value === \"string\").join(\" \u00B7 \")\n : \"\";\n const text = errors || (typeof event.result === \"string\" ? event.result : \"Claude run failed\");\n this.entries.push({\n id,\n kind: \"error\",\n label: \"Claude result\",\n text: clip(text, MAX_TOOL_SUMMARY_CHARS),\n status: \"failed\",\n });\n }\n return;\n }\n\n if (event.type === \"system\" && event.subtype === \"api_retry\") {\n this.entries.push({\n id,\n kind: \"status\",\n label: \"Claude API retry\",\n status: \"running\",\n ...(typeof event.error === \"string\"\n ? { text: clip(event.error, MAX_TOOL_SUMMARY_CHARS) }\n : {}),\n });\n return;\n }\n\n if (event.type === \"message_start\") this.#finishAssistant(\"completed\");\n if (event.type === \"message_start\" || event.type === \"message_update\") {\n const message = recordOf(event.message);\n if (!message) return;\n if (message.role === \"user\") {\n if (event.type === \"message_start\") {\n this.#pushMessage(\"user\", id, contentText(message.content), \"completed\", \"User\", this.#userIdentity(event, message));\n }\n return;\n }\n if (message.role !== \"assistant\") return;\n const text = terminalSafe(contentText(message.content));\n if (!text) return;\n if (!this.#assistant) {\n this.#assistant = {\n id,\n kind: \"assistant\",\n label: \"Agent\",\n text: clip(text, MAX_TRANSCRIPT_MESSAGE_CHARS),\n status: \"running\",\n };\n this.entries.push(this.#assistant);\n } else {\n this.#assistant.text = clip(text, MAX_TRANSCRIPT_MESSAGE_CHARS);\n if (!this.entries.includes(this.#assistant)) this.entries.push(this.#assistant);\n }\n return;\n }\n\n if (event.type === \"message_end\") {\n const message = recordOf(event.message);\n if (!message) return;\n if (message.role === \"user\") {\n this.#pushMessage(\"user\", id, contentText(message.content), \"completed\", \"User\", this.#userIdentity(event, message));\n return;\n }\n if (message.role !== \"assistant\") return;\n const error = messageError(message);\n if (error) {\n this.#finishAssistant(\"failed\");\n this.entries.push({ id, kind: \"error\", label: \"Agent error\", text: error, status: \"failed\" });\n return;\n }\n const text = terminalSafe(contentText(message.content));\n if (!text) {\n this.#finishAssistant(\"completed\");\n return;\n }\n if (!this.#assistant) this.#pushMessage(\"assistant\", id, text);\n else {\n this.#assistant.text = clip(text, MAX_TRANSCRIPT_MESSAGE_CHARS);\n this.#finishAssistant(\"completed\");\n }\n return;\n }\n\n if (event.type === \"response\" && event.command === \"prompt\" && event.success === false) {\n const text = typeof event.error === \"string\" ? event.error : \"OMP rejected the prompt\";\n this.entries.push({\n id,\n kind: \"error\",\n label: \"Prompt rejected\",\n text: clip(text, MAX_TOOL_SUMMARY_CHARS),\n status: \"failed\",\n });\n return;\n }\n\n if (event.type === \"tool_execution_start\") {\n const label = typeof event.toolName === \"string\" ? event.toolName : \"tool\";\n const entry = this.#startTool(id, label, event.args);\n if (typeof event.toolCallId !== \"string\") {\n const key = terminalSafe(label) || \"tool\";\n this.#tools.delete(entry.id);\n this.#anonymousTools.set(key, [...(this.#anonymousTools.get(key) ?? []), entry]);\n }\n return;\n }\n\n if (event.type === \"tool_execution_end\") {\n const label = typeof event.toolName === \"string\" ? event.toolName : \"tool\";\n this.#finishTool(\n typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n label,\n event.result,\n event.isError === true,\n );\n return;\n }\n\n if (event.type === \"auto_retry_start\") {\n const attempt = typeof event.attempt === \"number\" ? ` ${event.attempt}` : \"\";\n this.#retry = {\n id,\n kind: \"status\",\n label: `Retry${attempt}`,\n status: \"running\",\n ...(typeof event.errorMessage === \"string\"\n ? { text: clip(event.errorMessage, MAX_TOOL_SUMMARY_CHARS) }\n : {}),\n };\n this.entries.push(this.#retry);\n return;\n }\n if (event.type === \"auto_retry_end\") {\n const failed = event.success === false;\n if (this.#retry) {\n this.#retry.status = failed ? \"failed\" : \"completed\";\n if (failed && typeof event.finalError === \"string\") {\n this.#retry.text = clip(event.finalError, MAX_TOOL_SUMMARY_CHARS);\n }\n this.#retry = undefined;\n }\n return;\n }\n\n if (event.type === \"auto_compaction_start\") {\n this.#compaction = {\n id,\n kind: \"status\",\n label: \"Compacting context\",\n status: \"running\",\n };\n this.entries.push(this.#compaction);\n return;\n }\n if (event.type === \"auto_compaction_end\") {\n if (this.#compaction) {\n const failed = event.aborted === true || typeof event.errorMessage === \"string\";\n this.#compaction.status = failed ? \"failed\" : \"completed\";\n if (typeof event.errorMessage === \"string\") {\n this.#compaction.text = clip(event.errorMessage, MAX_TOOL_SUMMARY_CHARS);\n }\n this.#compaction = undefined;\n }\n return;\n }\n\n if (event.type === \"extension_error\" || event.type === \"worker_stderr\") {\n const text =\n typeof event.error === \"string\"\n ? event.error\n : typeof event.text === \"string\"\n ? event.text\n : \"Extension error\";\n const warningLines = text.split(/\\r?\\n/).filter((line) => line.trim());\n const warningCount = event.type === \"worker_stderr\" && warningLines.length > 0 &&\n warningLines.every((line) => /^\\s*Warning:/.test(line)) ? warningLines.length : 0;\n this.entries.push({\n id,\n kind: \"error\",\n label: event.type === \"worker_stderr\" ? \"Worker stderr\" : \"Error\",\n text: clip(text, warningCount > 0 ? MAX_TRANSCRIPT_MESSAGE_CHARS : MAX_TOOL_SUMMARY_CHARS),\n ...(event.type === \"worker_stderr\" ? { warningCount } : {}),\n status: \"failed\",\n });\n }\n }\n}\n\nexport const parseRaw = (raw: string): Record<string, unknown> | undefined => {\n try {\n return recordOf(JSON.parse(raw));\n } catch {\n return undefined;\n }\n};\n\nexport const parsedEvents = (lines: FabricLogLine[]): Array<Record<string, unknown>> =>\n lines\n .map((line) => recordOf(line.parsed) ?? parseRaw(line.raw))\n .filter((event): event is Record<string, unknown> => event !== undefined);\n\ninterface ToolLifecycleStart {\n id: string;\n event: Record<string, unknown>;\n}\n\nexport const normalizedToolStarts = (event: Record<string, unknown>): ToolLifecycleStart[] => {\n if (\n event.type === \"tool_execution_start\" &&\n typeof event.toolCallId === \"string\"\n ) {\n return [{ id: event.toolCallId, event }];\n }\n\n const starts: ToolLifecycleStart[] = [];\n const appendContentStarts = (\n content: unknown,\n type: \"toolCall\" | \"tool_use\",\n ): void => {\n if (!Array.isArray(content)) return;\n for (const value of content) {\n const part = recordOf(value);\n if (part?.type !== type || typeof part.id !== \"string\") continue;\n const name = typeof part.name === \"string\" ? part.name : \"tool\";\n starts.push({\n id: part.id,\n event: {\n type: \"tool_execution_start\",\n toolCallId: part.id,\n toolName: name,\n args: type === \"toolCall\" ? part.arguments : part.input,\n },\n });\n }\n };\n\n if (event.type === \"message\") {\n const message = recordOf(event.message);\n if (message?.role === \"assistant\") appendContentStarts(message.content, \"toolCall\");\n } else if (event.type === \"assistant\") {\n const message = recordOf(event.message);\n if (message?.role === \"assistant\") appendContentStarts(message.content, \"tool_use\");\n }\n return starts;\n};\n\nconst toolLifecycleEndIds = (event: Record<string, unknown>): string[] => {\n if (event.type === \"tool_execution_end\" && typeof event.toolCallId === \"string\") {\n return [event.toolCallId];\n }\n if (event.type === \"message\") {\n const message = recordOf(event.message);\n return message?.role === \"toolResult\" && typeof message.toolCallId === \"string\"\n ? [message.toolCallId]\n : [];\n }\n if (event.type !== \"user\") return [];\n const message = recordOf(event.message);\n if (!Array.isArray(message?.content)) return [];\n return message.content.flatMap((value) => {\n const part = recordOf(value);\n return part?.type === \"tool_result\" && typeof part.tool_use_id === \"string\"\n ? [part.tool_use_id]\n : [];\n });\n};\n\nexport const missingToolStartIds = (events: Array<Record<string, unknown>>): Set<string> => {\n const active = new Set<string>();\n const missing = new Set<string>();\n for (const event of events) {\n for (const start of normalizedToolStarts(event)) active.add(start.id);\n for (const id of toolLifecycleEndIds(event)) {\n if (active.has(id)) active.delete(id);\n else missing.add(id);\n }\n }\n return missing;\n};\n", "import { TranscriptAccumulator } from \"./transcript-parser.js\";\nimport { AgentTranscriptReader } from \"./transcript-reader.js\";\nimport { recordOf } from \"./transcript-sanitization.js\";\n\ntype FabricTranscriptEntryStatus = \"running\" | \"completed\" | \"failed\";\n\nexport interface FabricTranscriptEntry {\n id: string;\n kind: \"user\" | \"assistant\" | \"tool\" | \"error\" | \"status\";\n label: string;\n text?: string;\n status?: FabricTranscriptEntryStatus;\n toolName?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n parentId?: string;\n depth?: number;\n /** Count only when the original stderr chunk contains warnings exclusively. */\n warningCount?: number;\n}\n\nexport interface FabricAgentTranscript {\n entries: FabricTranscriptEntry[];\n /** Kept for compatibility; true means older pages are available. */\n truncated: boolean;\n hasMore?: boolean;\n hasNewer?: boolean;\n updatedAt?: number;\n}\n\nexport interface FabricTranscriptSource {\n id: string;\n status: string;\n logFile?: string;\n}\n\nexport interface FabricAgentToolPreviewNode {\n id: string;\n name: string;\n status?: string;\n runner?: \"omp\" | \"claude\" | \"veda\";\n owner?: \"agent\" | \"actor\";\n /** Most recent tool the agent was observed running, when known. */\n currentTool?: string;\n text?: string;\n tools: FabricTranscriptEntry[];\n /** Descendant previews, one branch per spawned nested agent run. */\n agents?: FabricAgentToolPreviewNode[];\n /** True when descendant previews were cut by the preview tree budget. */\n agentsTruncated?: boolean;\n}\n\nexport interface FabricAgentToolPreview extends FabricAgentToolPreviewNode {\n kind: \"fabric-agent-tools\";\n}\n\nexport const projectAgentTranscript = (\n events: Array<Record<string, unknown>>,\n olderAvailable = false,\n): FabricAgentTranscript => {\n const accumulator = new TranscriptAccumulator();\n accumulator.append(events);\n return accumulator.snapshot(olderAvailable);\n};\n\nconst PREVIEW_TREE_GUARD_MAX_DEPTH = 8;\n\nconst isFabricAgentToolPreviewNode = (\n value: unknown,\n depth: number,\n): value is FabricAgentToolPreviewNode => {\n const record = recordOf(value);\n if (\n !record ||\n typeof record.id !== \"string\" ||\n typeof record.name !== \"string\" ||\n (record.text !== undefined && typeof record.text !== \"string\") ||\n (record.currentTool !== undefined && typeof record.currentTool !== \"string\") ||\n !Array.isArray(record.tools)\n ) {\n return false;\n }\n if (record.agents === undefined) return true;\n if (depth >= PREVIEW_TREE_GUARD_MAX_DEPTH || !Array.isArray(record.agents)) return false;\n return record.agents.every((child) => isFabricAgentToolPreviewNode(child, depth + 1));\n};\n\nexport const isFabricAgentToolPreview = (value: unknown): value is FabricAgentToolPreview =>\n recordOf(value)?.kind === \"fabric-agent-tools\" && isFabricAgentToolPreviewNode(value, 0);\n\nexport const recentTranscriptTools = (\n transcript: FabricAgentTranscript,\n limit = 2,\n): FabricTranscriptEntry[] => {\n const tools = transcript.entries.filter((entry) => entry.kind === \"tool\");\n const boundedLimit = Math.max(1, limit);\n const running = tools.filter((entry) => entry.status === \"running\");\n const completed = tools.filter((entry) => entry.status !== \"running\");\n const completedSlots = Math.max(0, boundedLimit - Math.min(running.length, boundedLimit));\n const retained = new Set([\n ...running.slice(-boundedLimit),\n ...completed.slice(-completedSlots),\n ]);\n return tools\n .filter((entry) => retained.has(entry))\n .slice(-boundedLimit)\n .map((entry) => ({ ...entry }));\n};\n\nexport { AgentTranscriptReader };\n"],
5
- "mappings": "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",
6
- "names": ["message"]
7
- }