omp-fabric 1.25.19 → 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.
Files changed (38) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/chunks/{chunk-QJKOPPW2.js → chunk-5CW2S6EB.js} +2 -2
  3. package/dist/chunks/{chunk-5SSQD7TW.js → chunk-7NWMFYD3.js} +73 -20
  4. package/dist/chunks/chunk-7NWMFYD3.js.map +7 -0
  5. package/dist/chunks/{chunk-WQUMHDOS.js → chunk-ESPCTYVX.js} +39 -1
  6. package/dist/chunks/chunk-ESPCTYVX.js.map +7 -0
  7. package/dist/chunks/{chunk-YNABLCR3.js → chunk-KW6EUFD2.js} +2 -2
  8. package/dist/chunks/{chunk-BD6FHI24.js → chunk-OLFP7R5J.js} +3 -3
  9. package/dist/chunks/{chunk-NPM24GG6.js → chunk-TDO2BRZM.js} +2 -2
  10. package/dist/chunks/{chunk-D55BFSFK.js → chunk-TRM76YFF.js} +6 -84
  11. package/dist/chunks/chunk-TRM76YFF.js.map +7 -0
  12. package/dist/compaction/hook.js +1 -1
  13. package/dist/core/token-math.d.ts +4 -22
  14. package/dist/core/token-math.d.ts.map +1 -1
  15. package/dist/core/truncation-marker.d.ts +8 -0
  16. package/dist/core/truncation-marker.d.ts.map +1 -0
  17. package/dist/fabric-exec-tool.d.ts.map +1 -1
  18. package/dist/fabric-runtime-state.js +7 -7
  19. package/dist/fabric-runtime-state.js.map +3 -3
  20. package/dist/index.js +15 -10
  21. package/dist/index.js.map +2 -2
  22. package/dist/providers/omp-tools-provider.d.ts +2 -1
  23. package/dist/providers/omp-tools-provider.d.ts.map +1 -1
  24. package/dist/residency/host.js +4 -4
  25. package/dist/residency/omp-entry.js +4 -4
  26. package/dist/ui/core-tool-render.d.ts.map +1 -1
  27. package/dist/ui/dashboard.js +2 -2
  28. package/dist/ui/fabric-render.d.ts.map +1 -1
  29. package/docs/architecture.md +6 -0
  30. package/docs/certification.md +1 -1
  31. package/package.json +8 -8
  32. package/dist/chunks/chunk-5SSQD7TW.js.map +0 -7
  33. package/dist/chunks/chunk-D55BFSFK.js.map +0 -7
  34. package/dist/chunks/chunk-WQUMHDOS.js.map +0 -7
  35. /package/dist/chunks/{chunk-QJKOPPW2.js.map → chunk-5CW2S6EB.js.map} +0 -0
  36. /package/dist/chunks/{chunk-YNABLCR3.js.map → chunk-KW6EUFD2.js.map} +0 -0
  37. /package/dist/chunks/{chunk-BD6FHI24.js.map → chunk-OLFP7R5J.js.map} +0 -0
  38. /package/dist/chunks/{chunk-NPM24GG6.js.map → chunk-TDO2BRZM.js.map} +0 -0
@@ -83,6 +83,42 @@ var headlineArg = (args, max = 96) => {
83
83
  return void 0;
84
84
  };
85
85
 
86
+ // src/core/truncation-marker.ts
87
+ var TRUNCATION_MARKER = "[[omp-fabric:truncated]]";
88
+ var REASON_LABELS = {
89
+ matchLimit: "match limit",
90
+ perFileMatchLimit: "per-file match limit",
91
+ columnLimit: "column limit",
92
+ fileLimit: "file limit",
93
+ lineBudget: "line budget",
94
+ byteBudget: "byte budget",
95
+ outputLimit: "output limit",
96
+ resultLimit: "result limit"
97
+ };
98
+ var reasonLabel = (reason) => typeof reason === "string" ? REASON_LABELS[reason] ?? reason : void 0;
99
+ var noticeLabel = (signal) => {
100
+ const tool = typeof signal.tool === "string" && signal.tool.length > 0 ? signal.tool : "output";
101
+ const reasons = Array.isArray(signal.reasons) ? signal.reasons.map(reasonLabel).filter((value) => value !== void 0) : [];
102
+ return reasons.length > 0 ? `${tool} truncated \xB7 ${reasons.join(", ")}` : `${tool} truncated`;
103
+ };
104
+ var splitTruncationNotice = (value) => {
105
+ const afterNewline = value.lastIndexOf(`
106
+ ${TRUNCATION_MARKER}`);
107
+ const start = afterNewline >= 0 ? afterNewline + 1 : value.startsWith(TRUNCATION_MARKER) ? 0 : -1;
108
+ if (start === -1) return void 0;
109
+ const lineEnd = value.indexOf("\n", start);
110
+ const line = value.slice(start, lineEnd === -1 ? void 0 : lineEnd);
111
+ const body = value.slice(0, start === 0 ? 0 : start - 1) + (lineEnd === -1 ? "" : value.slice(lineEnd));
112
+ const raw = line.slice(TRUNCATION_MARKER.length).trim();
113
+ let signal = {};
114
+ try {
115
+ const parsed = JSON.parse(raw);
116
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) signal = parsed;
117
+ } catch {
118
+ }
119
+ return { text: body, label: noticeLabel(signal), signal };
120
+ };
121
+
86
122
  // src/ui/preview-lines.ts
87
123
  function countContentLines(content) {
88
124
  if (!content) return 0;
@@ -1089,6 +1125,8 @@ var recentTranscriptTools = (transcript, limit = 2) => {
1089
1125
 
1090
1126
  export {
1091
1127
  headlineArg,
1128
+ TRUNCATION_MARKER,
1129
+ splitTruncationNotice,
1092
1130
  countContentLines,
1093
1131
  selectPreviewTextLines,
1094
1132
  MAX_WRITE_DIFF_BYTES,
@@ -1099,4 +1137,4 @@ export {
1099
1137
  isFabricAgentToolPreview,
1100
1138
  recentTranscriptTools
1101
1139
  };
1102
- //# sourceMappingURL=chunk-WQUMHDOS.js.map
1140
+ //# sourceMappingURL=chunk-ESPCTYVX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/call-preview.ts", "../../src/core/truncation-marker.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", "export const TRUNCATION_MARKER = \"[[omp-fabric:truncated]]\";\n\nexport interface TruncationNotice {\n text: string;\n label: string;\n signal: Record<string, unknown>;\n}\n\nconst REASON_LABELS: Record<string, string> = {\n matchLimit: \"match limit\",\n perFileMatchLimit: \"per-file match limit\",\n columnLimit: \"column limit\",\n fileLimit: \"file limit\",\n lineBudget: \"line budget\",\n byteBudget: \"byte budget\",\n outputLimit: \"output limit\",\n resultLimit: \"result limit\",\n};\n\nconst reasonLabel = (reason: unknown): string | undefined =>\n typeof reason === \"string\" ? REASON_LABELS[reason] ?? reason : undefined;\n\nconst noticeLabel = (signal: Record<string, unknown>): string => {\n const tool = typeof signal.tool === \"string\" && signal.tool.length > 0 ? signal.tool : \"output\";\n const reasons = Array.isArray(signal.reasons)\n ? signal.reasons.map(reasonLabel).filter((value): value is string => value !== undefined)\n : [];\n return reasons.length > 0 ? `${tool} truncated \u00B7 ${reasons.join(\", \")}` : `${tool} truncated`;\n};\n\nexport const splitTruncationNotice = (value: string): TruncationNotice | undefined => {\n const afterNewline = value.lastIndexOf(`\\n${TRUNCATION_MARKER}`);\n const start = afterNewline >= 0\n ? afterNewline + 1\n : value.startsWith(TRUNCATION_MARKER) ? 0 : -1;\n if (start === -1) return undefined;\n const lineEnd = value.indexOf(\"\\n\", start);\n const line = value.slice(start, lineEnd === -1 ? undefined : lineEnd);\n const body = value.slice(0, start === 0 ? 0 : start - 1) + (lineEnd === -1 ? \"\" : value.slice(lineEnd));\n const raw = line.slice(TRUNCATION_MARKER.length).trim();\n let signal: Record<string, unknown> = {};\n try {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) signal = parsed as Record<string, unknown>;\n } catch {}\n return { text: body, label: noticeLabel(signal), signal };\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
+ }
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  peerLabelPrefix,
23
23
  writeHandoffSession
24
- } from "./chunk-QJKOPPW2.js";
24
+ } from "./chunk-5CW2S6EB.js";
25
25
  import {
26
26
  DEFAULT_FABRIC_CONFIG,
27
27
  MAX_AGENT_TIMEOUT_MS,
@@ -6825,4 +6825,4 @@ export {
6825
6825
  agentParticipantRecords,
6826
6826
  actorParticipantRecord
6827
6827
  };
6828
- //# sourceMappingURL=chunk-YNABLCR3.js.map
6828
+ //# sourceMappingURL=chunk-KW6EUFD2.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7VIQNUPS.js";
4
4
  import {
5
5
  headlineArg
6
- } from "./chunk-WQUMHDOS.js";
6
+ } from "./chunk-ESPCTYVX.js";
7
7
  import {
8
8
  NESTED_TOOL_CALL_ID_PREFIX
9
9
  } from "./chunk-LWHQR2JY.js";
@@ -12,7 +12,7 @@ import {
12
12
  buildThinkingDigest,
13
13
  snapshotHandoffSession,
14
14
  thinkingTransferPolicy
15
- } from "./chunk-QJKOPPW2.js";
15
+ } from "./chunk-5CW2S6EB.js";
16
16
  import {
17
17
  isFabricThinking
18
18
  } from "./chunk-SKYNDRW5.js";
@@ -2824,4 +2824,4 @@ export {
2824
2824
  resolveFabricIdentity,
2825
2825
  MainAgentController
2826
2826
  };
2827
- //# sourceMappingURL=chunk-BD6FHI24.js.map
2827
+ //# sourceMappingURL=chunk-OLFP7R5J.js.map
@@ -10,7 +10,7 @@ import {
10
10
  lifecycleSourceIdentity,
11
11
  loadModelUsage,
12
12
  useBudgetLedger
13
- } from "./chunk-YNABLCR3.js";
13
+ } from "./chunk-KW6EUFD2.js";
14
14
  import {
15
15
  normalizeModelAliases,
16
16
  resolveAvailableOmpModel
@@ -685,4 +685,4 @@ if (isMain) {
685
685
  export {
686
686
  runResidentHostFromConfigPath
687
687
  };
688
- //# sourceMappingURL=chunk-NPM24GG6.js.map
688
+ //# sourceMappingURL=chunk-TDO2BRZM.js.map
@@ -28,89 +28,11 @@ import {
28
28
  import "@oh-my-pi/pi-coding-agent";
29
29
 
30
30
  // src/core/token-math.ts
31
- var IMAGE_TOKEN_ESTIMATE = 1200;
32
- var FRAME_TOKEN_ESTIMATE = 5024;
33
- var contentParts = (content) => Array.isArray(content) ? content : [];
34
- var stringifyArguments = (value) => {
35
- try {
36
- return JSON.stringify(value) ?? "null";
37
- } catch {
38
- try {
39
- return JSON.stringify(value, (_key, nested) => typeof nested === "bigint" ? nested.toString() : nested) ?? "null";
40
- } catch {
41
- return "null";
42
- }
43
- }
44
- };
45
- var blockTokens = (chars) => chars > 0 ? Math.ceil(chars / 4) : 0;
46
- var textLength = (value) => typeof value === "string" ? Buffer.byteLength(value, "utf-8") : 0;
47
- var estimateTokens = (message) => {
48
- let tokens = 0;
49
- switch (message.role) {
50
- case "user":
51
- case "developer": {
52
- if (typeof message.content === "string") return blockTokens(textLength(message.content));
53
- for (const block of contentParts(message.content)) {
54
- if (block.type === "text") tokens += blockTokens(textLength(block.text));
55
- else if (block.type === "image") tokens += IMAGE_TOKEN_ESTIMATE;
56
- }
57
- return tokens;
58
- }
59
- case "assistant": {
60
- for (const block of contentParts(message.content)) {
61
- if (block.type === "text") {
62
- tokens += blockTokens(textLength(block.text));
63
- } else if (block.type === "thinking") {
64
- tokens += blockTokens(textLength(block.thinking));
65
- tokens += blockTokens(textLength(block.thinkingSignature));
66
- } else if (block.type === "toolCall") {
67
- tokens += blockTokens(textLength(block.name));
68
- tokens += blockTokens(textLength(stringifyArguments(block.arguments)));
69
- } else if (block.type === "redactedThinking") {
70
- tokens += blockTokens(textLength(block.data));
71
- } else if (block.type === "anthropicServerTool") {
72
- tokens += blockTokens(textLength(stringifyArguments(block.block)));
73
- }
74
- }
75
- return tokens;
76
- }
77
- case "custom":
78
- case "hookMessage":
79
- case "toolResult": {
80
- if (typeof message.content === "string") return blockTokens(textLength(message.content));
81
- for (const block of contentParts(message.content)) {
82
- if (block.type === "text") tokens += blockTokens(textLength(block.text));
83
- else if (block.type === "image") tokens += IMAGE_TOKEN_ESTIMATE;
84
- }
85
- return tokens;
86
- }
87
- case "bashExecution":
88
- return blockTokens(textLength(message.command)) + blockTokens(textLength(message.output));
89
- case "branchSummary":
90
- return blockTokens(textLength(message.summary));
91
- case "compactionSummary": {
92
- tokens = blockTokens(textLength(message.summary));
93
- if (message.blocks) {
94
- for (const block of message.blocks) {
95
- if (block.type === "text") tokens += blockTokens(textLength(block.text));
96
- else tokens += FRAME_TOKEN_ESTIMATE;
97
- }
98
- } else if (message.images) {
99
- tokens += message.images.length * FRAME_TOKEN_ESTIMATE;
100
- }
101
- return tokens;
102
- }
103
- }
104
- return 0;
105
- };
106
- var calculateContextTokens = (usage) => {
107
- if (typeof usage !== "object" || usage === null) return 0;
108
- const record = usage;
109
- const totalTokens = record.totalTokens;
110
- if (typeof totalTokens === "number" && totalTokens > 0) return totalTokens;
111
- const count = (value) => typeof value === "number" ? value : 0;
112
- return count(record.input) + count(record.output) + count(record.cacheRead) + count(record.cacheWrite);
113
- };
31
+ import { Tokenizer } from "@oh-my-pi/pi-agent-core";
32
+ import { calculateContextTokens as hostCalculateContextTokens } from "@oh-my-pi/pi-agent-core/compaction";
33
+ var tokenizer = new Tokenizer();
34
+ var estimateTokens = (message) => tokenizer.countMessage(message);
35
+ var calculateContextTokens = (usage) => typeof usage === "object" && usage !== null ? hostCalculateContextTokens(usage) : 0;
114
36
 
115
37
  // src/core/session-context.ts
116
38
  import { buildSessionContext as buildOmpSessionContext } from "@oh-my-pi/pi-coding-agent/session/session-context";
@@ -1748,4 +1670,4 @@ export {
1748
1670
  compileFabricSummary,
1749
1671
  registerCompactionHook
1750
1672
  };
1751
- //# sourceMappingURL=chunk-D55BFSFK.js.map
1673
+ //# sourceMappingURL=chunk-TRM76YFF.js.map