pi-fabric 0.92.21 → 0.92.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/handoff-continuation.d.ts +4 -0
- package/dist/agents/handoff-continuation.d.ts.map +1 -0
- package/dist/chunks/{chunk-U3FNEK2H.js → chunk-2462VF6I.js} +5 -3
- package/dist/chunks/chunk-2462VF6I.js.map +7 -0
- package/dist/chunks/{chunk-KI4VAMHK.js → chunk-5Y2TKOQV.js} +2 -2
- package/dist/chunks/{chunk-MAP2LVSM.js → chunk-AFALENHK.js} +50 -19
- package/dist/chunks/chunk-AFALENHK.js.map +7 -0
- package/dist/chunks/{chunk-QLJ5P7HV.js → chunk-JJZFNBB7.js} +2 -2
- package/dist/chunks/{chunk-IWH6PCMK.js → chunk-R7G4HXVD.js} +2 -2
- package/dist/chunks/{chunk-ZZ4LHQYJ.js → chunk-RTXZHKMS.js} +22 -13
- package/dist/chunks/chunk-RTXZHKMS.js.map +7 -0
- package/dist/chunks/{chunk-YSXGVO2N.js → chunk-VIBQBYJ6.js} +18 -16
- package/dist/chunks/chunk-VIBQBYJ6.js.map +7 -0
- package/dist/chunks/{chunk-EFHCXJTV.js → chunk-ZHOMIIUF.js} +2 -2
- package/dist/compaction/hook.js +2 -2
- package/dist/fabric-runtime-state.js +5 -5
- package/dist/index.js +6 -6
- package/dist/prewalk/handoff.d.ts.map +1 -1
- package/dist/residency/host.js +5 -5
- package/dist/residency/pi-entry.js +5 -5
- package/dist/ui/conversation.js +1 -1
- package/dist/ui/dashboard.js +3 -3
- package/dist/ui/fabric-code-parser.d.ts.map +1 -1
- package/dist/ui/highlight.d.ts.map +1 -1
- package/dist/ui/shiki-catalog.d.ts +3 -0
- package/dist/ui/shiki-catalog.d.ts.map +1 -0
- package/dist/ui/structured.d.ts.map +1 -1
- package/docs/agents.md +4 -0
- package/package.json +3 -2
- package/skillsets/python/fabric-exec/references/agents.md +2 -0
- package/skillsets/typescript/fabric-exec/references/agents.md +2 -0
- package/dist/chunks/chunk-MAP2LVSM.js.map +0 -7
- package/dist/chunks/chunk-U3FNEK2H.js.map +0 -7
- package/dist/chunks/chunk-YSXGVO2N.js.map +0 -7
- package/dist/chunks/chunk-ZZ4LHQYJ.js.map +0 -7
- /package/dist/chunks/{chunk-KI4VAMHK.js.map → chunk-5Y2TKOQV.js.map} +0 -0
- /package/dist/chunks/{chunk-QLJ5P7HV.js.map → chunk-JJZFNBB7.js.map} +0 -0
- /package/dist/chunks/{chunk-IWH6PCMK.js.map → chunk-R7G4HXVD.js.map} +0 -0
- /package/dist/chunks/{chunk-EFHCXJTV.js.map → chunk-ZHOMIIUF.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ui/highlight.ts", "../../src/ui/shiki-catalog.ts", "../../src/ui/shiki-theme.ts", "../../src/ui/shiki-language.ts"],
|
|
4
|
+
"sourcesContent": ["import { readFileSync, statSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\nimport { shikiLanguages, shikiThemeType } from \"./shiki-catalog.js\";\nimport type { GrammarState, Highlighter } from \"shiki\";\nimport { resolveShikiTheme, type ShikiThemeVariant } from \"./code-preview.js\";\nimport { resolveShikiThemeObject } from \"./shiki-theme.js\";\nimport { resolveShikiLanguageObjects } from \"./shiki-language.js\";\n\nconst configuredMaxHighlightChars = Number.parseInt(\n process.env.CODE_PREVIEW_MAX_HIGHLIGHT_CHARS ?? \"\",\n 10,\n);\nconst MAX_HIGHLIGHT_CHARS =\n Number.isFinite(configuredMaxHighlightChars) && configuredMaxHighlightChars > 0\n ? configuredMaxHighlightChars\n : 80_000;\nconst configuredFileHighlightMaxSourceChars = Number.parseInt(\n process.env.CODE_PREVIEW_FILE_HIGHLIGHT_MAX_CHARS ?? \"\",\n 10,\n);\n// Files larger than this never enter full-file tokenization; their previews\n// fall back to per-run tokenization. Bounds worst-case background work.\nconst FILE_HIGHLIGHT_MAX_SOURCE_CHARS =\n Number.isFinite(configuredFileHighlightMaxSourceChars) &&\n configuredFileHighlightMaxSourceChars > 0\n ? configuredFileHighlightMaxSourceChars\n : 200_000;\n// One background slice covers ~5-10ms of shiki work on heavy grammars\n// (measured ~106ms for a 1.3k-line TS file), keeping each event-loop tick\n// well under one frame.\nconst FILE_HIGHLIGHT_TICK_LINE_BUDGET = 96;\nconst FILE_HIGHLIGHT_TICK_CHAR_BUDGET = 16_000;\nconst FILE_HIGHLIGHT_ENTRY_LIMIT = 24;\nconst FILE_HIGHLIGHT_CHAR_LIMIT = 4_000_000;\nconst CACHE_LIMIT = 192;\nconst CACHE_CHAR_LIMIT = 4_000_000;\nconst PRELOADED_LANGUAGES = [\n \"bash\",\n \"typescript\",\n \"tsx\",\n \"javascript\",\n \"jsx\",\n \"json\",\n \"markdown\",\n \"yaml\",\n \"toml\",\n \"css\",\n] as const;\n\nconst LANGUAGE_ALIASES = new Map<string, string>([\n [\"sh\", \"bash\"],\n [\"shell\", \"bash\"],\n [\"zsh\", \"bash\"],\n [\"ts\", \"typescript\"],\n [\"js\", \"javascript\"],\n [\"md\", \"markdown\"],\n [\"yml\", \"yaml\"],\n [\"py\", \"python\"],\n [\"rs\", \"rust\"],\n [\"rb\", \"ruby\"],\n [\"cs\", \"csharp\"],\n [\"fs\", \"fsharp\"],\n [\"ps1\", \"powershell\"],\n]);\n\nconst EXACT_BASENAMES = new Map<string, string>([\n [\"dockerfile\", \"dockerfile\"],\n [\"makefile\", \"makefile\"],\n [\"gnumakefile\", \"makefile\"],\n [\"justfile\", \"makefile\"],\n [\"procfile\", \"shellscript\"],\n [\"gemfile\", \"ruby\"],\n [\"rakefile\", \"ruby\"],\n [\"cargo.lock\", \"toml\"],\n [\"package-lock.json\", \"json\"],\n [\"composer.lock\", \"json\"],\n [\"pnpm-lock.yaml\", \"yaml\"],\n [\"pnpm-lock.yml\", \"yaml\"],\n [\"yarn.lock\", \"yaml\"],\n]);\n\nconst EXTENSION_ALIASES = new Map<string, string>([\n [\".ts\", \"typescript\"],\n [\".tsx\", \"tsx\"],\n [\".js\", \"javascript\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"javascript\"],\n [\".cjs\", \"javascript\"],\n [\".json\", \"json\"],\n [\".md\", \"markdown\"],\n [\".markdown\", \"markdown\"],\n [\".yml\", \"yaml\"],\n [\".yaml\", \"yaml\"],\n [\".toml\", \"toml\"],\n [\".sh\", \"bash\"],\n [\".bash\", \"bash\"],\n [\".zsh\", \"bash\"],\n [\".css\", \"css\"],\n [\".html\", \"html\"],\n [\".htm\", \"html\"],\n [\".py\", \"python\"],\n [\".rs\", \"rust\"],\n [\".go\", \"go\"],\n [\".rb\", \"ruby\"],\n [\".php\", \"php\"],\n [\".sql\", \"sql\"],\n [\".xml\", \"xml\"],\n [\".svg\", \"xml\"],\n [\".vue\", \"vue\"],\n [\".svelte\", \"svelte\"],\n [\".c\", \"c\"],\n [\".h\", \"c\"],\n [\".cpp\", \"cpp\"],\n [\".cc\", \"cpp\"],\n [\".hpp\", \"cpp\"],\n [\".java\", \"java\"],\n [\".kt\", \"kotlin\"],\n [\".swift\", \"swift\"],\n [\".lua\", \"lua\"],\n [\".r\", \"r\"],\n [\".scala\", \"scala\"],\n [\".clj\", \"clojure\"],\n [\".ex\", \"elixir\"],\n [\".exs\", \"elixir\"],\n [\".erl\", \"erlang\"],\n [\".hs\", \"haskell\"],\n [\".ml\", \"ocaml\"],\n [\".fs\", \"fsharp\"],\n [\".fsx\", \"fsharp\"],\n [\".cs\", \"csharp\"],\n [\".ps1\", \"powershell\"],\n [\".graphql\", \"graphql\"],\n [\".prisma\", \"prisma\"],\n [\".dockerfile\", \"dockerfile\"],\n]);\n\nconst LOW_CONTRAST_FALLBACK = \"\\x1b[38;2;139;148;158m\";\n\nlet highlighter: Highlighter | undefined;\nlet readyTheme: string | undefined;\nlet initializingTheme: string | undefined;\nlet initVersion = 0;\nlet highlighterGeneration = 0;\nlet themePreference = \"auto\";\nlet observedVariant: ShikiThemeVariant = \"dark\";\nlet currentTheme = resolveShikiTheme(themePreference, observedVariant);\nlet enabled = true;\nconst loadedLanguages = new Set<string>();\nconst pendingLanguages = new Set<string>();\nconst languageLoadCallbacks = new Map<string, Set<() => void>>();\nconst highlighterReadyCallbacks = new Set<() => void>();\nconst renderCache = new Map<string, { value: string[]; size: number }>();\nlet renderCacheChars = 0;\n\nconst hashString = (value: string): number => {\n let hash = 5381;\n for (let index = 0; index < value.length; index++) {\n hash = ((hash << 5) + hash + value.charCodeAt(index)) | 0;\n }\n return hash;\n};\n\nconst escapeControlChars = (text: string): string =>\n text\n .replace(/\\x1b/g, \"\u241B\")\n .replace(/\\r/g, \"\u240D\")\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/g, \"\uFFFD\");\n\nconst normalizeLanguage = (language: string): string => {\n const normalized = language.toLowerCase();\n return LANGUAGE_ALIASES.get(normalized) ?? normalized;\n};\n\ninterface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nconst ANSI_16_RGB: readonly Rgb[] = [\n { r: 0, g: 0, b: 0 },\n { r: 205, g: 49, b: 49 },\n { r: 13, g: 161, b: 13 },\n { r: 229, g: 165, b: 10 },\n { r: 36, g: 114, b: 200 },\n { r: 188, g: 63, b: 188 },\n { r: 17, g: 168, b: 205 },\n { r: 229, g: 229, b: 229 },\n { r: 102, g: 102, b: 102 },\n { r: 241, g: 76, b: 76 },\n { r: 35, g: 209, b: 139 },\n { r: 245, g: 245, b: 67 },\n { r: 59, g: 142, b: 234 },\n { r: 214, g: 112, b: 214 },\n { r: 41, g: 184, b: 219 },\n { r: 255, g: 255, b: 255 },\n];\n\nexport const ansi256ToRgb = (index: number): Rgb => {\n if (index < 16) return ANSI_16_RGB[Math.max(0, index)] ?? { r: 0, g: 0, b: 0 };\n if (index < 232) {\n const cube = index - 16;\n const channel = (value: number): number => (value === 0 ? 0 : 55 + 40 * value);\n return {\n r: channel(Math.floor(cube / 36)),\n g: channel(Math.floor((cube % 36) / 6)),\n b: channel(cube % 6),\n };\n }\n const gray = 8 + 10 * (Math.min(index, 255) - 232);\n return { r: gray, g: gray, b: gray };\n};\n\nconst parseAnsiBgColor = (sequence: string): Rgb | undefined => {\n const truecolor = sequence.match(/\\x1b\\[4?8;2;(\\d+);(\\d+);(\\d+)m/);\n if (truecolor) {\n return { r: Number(truecolor[1]), g: Number(truecolor[2]), b: Number(truecolor[3]) };\n }\n const indexed = sequence.match(/\\x1b\\[4?8;5;(\\d+)m/);\n if (indexed) return ansi256ToRgb(Number(indexed[1]));\n return undefined;\n};\n\nconst relativeLuminance = ({ r, g, b }: Rgb): number =>\n (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n\n/** Minimal structural view of Pi's active theme, as handed to renderers. */\nexport interface PiThemeLike {\n name?: string;\n getBgAnsi?(color: \"userMessageBg\"): string;\n}\n\n/**\n * Classify Pi's active theme as a light or dark variant. Named built-ins are\n * matched directly, custom themes fall back to the luminance of Pi's message\n * background color, and as a last resort COLORFGBG provides a terminal hint.\n */\nexport const classifyPiTheme = (\n theme: PiThemeLike | undefined,\n env: NodeJS.ProcessEnv = process.env,\n): ShikiThemeVariant | undefined => {\n const name = theme?.name?.trim().toLowerCase();\n if (name === \"light\") return \"light\";\n if (name === \"dark\") return \"dark\";\n const background = theme?.getBgAnsi\n ? parseAnsiBgColor(theme.getBgAnsi(\"userMessageBg\"))\n : undefined;\n if (background) return relativeLuminance(background) >= 0.5 ? \"light\" : \"dark\";\n const colorFgBg = env.COLORFGBG;\n if (colorFgBg) {\n const index = colorFgBg\n .split(\";\")\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isInteger(part) && part >= 0 && part <= 255)\n .at(-1);\n if (index !== undefined) {\n return relativeLuminance(ansi256ToRgb(index)) >= 0.5 ? \"light\" : \"dark\";\n }\n }\n return undefined;\n};\n\nconst syncEffectiveTheme = (preference: string, variant: ShikiThemeVariant): boolean => {\n themePreference = preference;\n observedVariant = variant;\n const effective = resolveShikiTheme(preference, variant);\n if (effective === currentTheme) return false;\n currentTheme = effective;\n renderCache.clear();\n renderCacheChars = 0;\n resetFileHighlighting();\n if (enabled && (highlighter || initializingTheme)) {\n void initHighlighting(effective, true);\n }\n return true;\n};\n\n/**\n * Adopt the variant of the pi theme instance handed to a renderer. When the\n * configured preference follows the variant (\"auto\" or a \"light/dark\" pair),\n * the effective shiki theme swaps as Pi auto-switches.\n */\nexport function observePiTheme(theme: PiThemeLike | undefined): void {\n const variant = classifyPiTheme(theme);\n if (variant) syncEffectiveTheme(themePreference, variant);\n}\n\n/** The shiki theme currently used for rendering (after variant resolution). */\nexport const effectiveShikiTheme = (): string => currentTheme;\n\n/** Whether the effective shiki theme is a light theme. */\nexport const effectiveShikiThemeIsLight = (): boolean =>\n shikiThemeType(currentTheme) === \"light\";\n\n/** Pi's most recently observed theme variant. */\nexport const observedThemeVariant = (): ShikiThemeVariant => observedVariant;\n\n/** Resolve a shiki language id from a file path, or undefined if unsupported. */\nexport function languageFromPath(filePath: string | undefined): string | undefined {\n if (!filePath) return undefined;\n const name = basename(filePath).toLowerCase();\n if (name.startsWith(\".env\")) {\n const candidate = \"dotenv\";\n return candidate in shikiLanguages() ? candidate : undefined;\n }\n if (name === \"dockerfile\" || name.startsWith(\"dockerfile.\")) {\n return \"dockerfile\" in shikiLanguages() ? \"dockerfile\" : undefined;\n }\n const exact = EXACT_BASENAMES.get(name);\n if (exact && exact in shikiLanguages()) return exact;\n const byExt = EXTENSION_ALIASES.get(extname(name));\n return byExt && byExt in shikiLanguages() ? byExt : undefined;\n}\n\n/** Configure highlighting without loading Shiki until the first code preview needs it. */\nexport function configureHighlighting(themePreferenceValue: string, syntaxEnabled = true): void {\n const preference = themePreferenceValue.trim() || \"auto\";\n const wasEnabled = enabled;\n enabled = syntaxEnabled;\n if (!enabled) {\n themePreference = preference;\n currentTheme = resolveShikiTheme(preference, observedVariant);\n initVersion++;\n initializingTheme = undefined;\n highlighter?.dispose();\n highlighter = undefined;\n readyTheme = undefined;\n highlighterGeneration++;\n loadedLanguages.clear();\n pendingLanguages.clear();\n languageLoadCallbacks.clear();\n highlighterReadyCallbacks.clear();\n renderCache.clear();\n renderCacheChars = 0;\n resetFileHighlighting();\n return;\n }\n const themeChanged = syncEffectiveTheme(preference, observedVariant);\n // syncEffectiveTheme already rebuilds eagerly on a real theme swap and\n // highlightCode's requestInit lazily covers a never-initialized highlighter;\n // the only remaining case that needs an explicit init is re-enabling after\n // a disable disposed the highlighter. Rebuilding unconditionally here cost\n // a full 10-grammar shiki init (~80-260ms of main-thread work) on every\n // /fabric settings save even when nothing display-related had changed.\n if (!themeChanged && !wasEnabled && !highlighter && !initializingTheme) {\n void initHighlighting(currentTheme, syntaxEnabled);\n }\n}\n\n/** Initialize (or reinitialize) the shared shiki highlighter. Fire-and-forget safe. */\nexport async function initHighlighting(theme: string, syntaxEnabled = true): Promise<void> {\n currentTheme = theme;\n enabled = syntaxEnabled;\n if (!enabled) return;\n const version = ++initVersion;\n initializingTheme = theme;\n try {\n const { createHighlighter } = await import(\"shiki\");\n // Resolve the theme object from pi-fabric's own module graph and hand\n // createHighlighter the *object*, not a bare id string. Shiki's internal\n // lazy `import(\"@shikijs/themes/<id>)` for string ids cannot be resolved\n // inside Pi's extension host (issue #46); passing the object sidesteps it.\n const themeObject = await resolveShikiThemeObject(theme);\n if (!themeObject) {\n throw new Error(`Unknown shiki theme: ${theme}`);\n }\n const next = await createHighlighter({\n themes: [themeObject],\n langs: await resolveShikiLanguageObjects(PRELOADED_LANGUAGES),\n });\n if (version !== initVersion) {\n next.dispose();\n return;\n }\n highlighter?.dispose();\n highlighter = next;\n resetFileHighlighting();\n readyTheme = theme;\n initializingTheme = undefined;\n highlighterGeneration++;\n loadedLanguages.clear();\n for (const lang of PRELOADED_LANGUAGES) loadedLanguages.add(lang);\n notifyReady();\n } catch (error) {\n if (version !== initVersion) return;\n initializingTheme = undefined;\n console.warn(\"[pi-fabric] Shiki failed to initialize; previews will be plain text.\", error);\n highlighter?.dispose();\n highlighter = undefined;\n readyTheme = undefined;\n highlighterGeneration++;\n loadedLanguages.clear();\n highlighterReadyCallbacks.clear();\n }\n}\n\nconst shouldSkipHighlight = (text: string): boolean => text.length > MAX_HIGHLIGHT_CHARS;\n\nconst ansiFg = (hex: string): string => {\n const clean = hex.replace(/^#/, \"\").slice(0, 6);\n const n = Number.parseInt(clean, 16);\n return Number.isFinite(n)\n ? `\\x1b[38;2;${(n >> 16) & 255};${(n >> 8) & 255};${n & 255}m`\n : \"\";\n};\n\nconst ansiFromToken = (token: { content: string; color?: string; fontStyle?: number }): string => {\n let open = token.color ? ansiFg(token.color) : \"\";\n let close = token.color ? \"\\x1b[39m\" : \"\";\n const fontStyle = token.fontStyle ?? 0;\n if (fontStyle & 2) {\n open += \"\\x1b[1m\";\n close = \"\\x1b[22m\" + close;\n }\n if (fontStyle & 1) {\n open += \"\\x1b[3m\";\n close = \"\\x1b[23m\" + close;\n }\n if (fontStyle & 4) {\n open += \"\\x1b[4m\";\n close = \"\\x1b[24m\" + close;\n }\n return open + escapeControlChars(token.content) + close;\n};\n\nconst isLowContrastFg = (params: string): boolean => {\n if (params === \"30\" || params === \"90\" || params === \"38;5;0\" || params === \"38;5;8\") return true;\n if (!params.startsWith(\"38;2;\")) return false;\n const parts = params.split(\";\").map(Number);\n const r = parts[2];\n const g = parts[3];\n const b = parts[4];\n if (r === undefined || g === undefined || b === undefined) return false;\n if (!Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)) return false;\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n return luminance < 72;\n};\n\nconst normalizeContrast = (ansi: string): string => {\n if (shikiThemeType(currentTheme) === \"light\") return ansi;\n return ansi.replace(/\\x1b\\[([0-9;]*)m/g, (seq, params: string) =>\n isLowContrastFg(params) ? LOW_CONTRAST_FALLBACK : seq,\n );\n};\n\nconst cacheRendered = (key: string, value: string[]): void => {\n const size = value.reduce((total, line) => total + line.length, 0);\n renderCache.set(key, { value, size });\n renderCacheChars += size;\n while (renderCache.size > CACHE_LIMIT || renderCacheChars > CACHE_CHAR_LIMIT) {\n const first = renderCache.keys().next().value;\n if (first === undefined) break;\n const cached = renderCache.get(first);\n if (cached) renderCacheChars -= cached.size;\n renderCache.delete(first);\n }\n};\n\nconst requestInit = (invalidate?: () => void): void => {\n if (invalidate) highlighterReadyCallbacks.add(invalidate);\n if (initializingTheme === currentTheme) return;\n void initHighlighting(currentTheme, enabled);\n};\n\nconst notifyReady = (): void => {\n const callbacks = [...highlighterReadyCallbacks];\n highlighterReadyCallbacks.clear();\n for (const callback of callbacks) {\n try {\n callback();\n } catch {\n // A stale invalidate callback is harmless.\n }\n }\n};\n\nconst requestLanguageLoad = (lang: string, invalidate?: () => void): void => {\n if (invalidate) {\n const callbacks = languageLoadCallbacks.get(lang) ?? new Set();\n callbacks.add(invalidate);\n languageLoadCallbacks.set(lang, callbacks);\n }\n if (pendingLanguages.has(lang)) return;\n const instance = highlighter;\n if (!instance) return;\n pendingLanguages.add(lang);\n const generation = highlighterGeneration;\n void instance\n .loadLanguage(lang as never)\n .then(() => {\n if (generation !== highlighterGeneration) return;\n loadedLanguages.add(lang);\n const callbacks = languageLoadCallbacks.get(lang);\n languageLoadCallbacks.delete(lang);\n for (const callback of callbacks ?? []) {\n try {\n callback();\n } catch {\n // Stale invalidate; ignore.\n }\n }\n })\n .catch(() => {\n if (generation === highlighterGeneration) languageLoadCallbacks.delete(lang);\n })\n .finally(() => {\n if (generation === highlighterGeneration) pendingLanguages.delete(lang);\n });\n};\n\n/**\n * Highlight `text` as `lang`, returning per-line truecolor ANSI strings that match\n * pi-code-previews' rendering (same shiki theme + token conversion). Returns null\n * when highlighting is disabled, the language is unsupported, the highlighter is\n * not yet ready, or the content is too large. Pass `invalidate` to request a\n * re-render once the highlighter/language becomes ready.\n */\nexport function highlightCode(\n text: string,\n lang: string,\n invalidate?: () => void,\n): string[] | null {\n if (!enabled || !lang || shouldSkipHighlight(text)) return null;\n // A variant flip restarts initialization with the new theme; while it is in\n // flight the old highlighter cannot serve the current theme. Register the\n // invalidate so the preview repaints once the swap completes.\n if (!highlighter || readyTheme !== currentTheme) {\n requestInit(invalidate);\n return null;\n }\n const shikiLang = normalizeLanguage(lang);\n if (!(shikiLang in shikiLanguages())) return null;\n const cacheKey = `${currentTheme}\\0${shikiLang}\\0${text.length}\\0${hashString(text)}`;\n const cached = renderCache.get(cacheKey);\n if (cached) {\n renderCache.delete(cacheKey);\n renderCache.set(cacheKey, cached);\n return cached.value;\n }\n if (!loadedLanguages.has(shikiLang)) {\n requestLanguageLoad(shikiLang, invalidate);\n return null;\n }\n try {\n const tokens = highlighter.codeToTokensBase(text, {\n lang: shikiLang as never,\n theme: currentTheme as never,\n });\n const rendered = tokens.map((line) =>\n normalizeContrast(line.map(ansiFromToken).join(\"\")),\n );\n cacheRendered(cacheKey, rendered);\n return rendered;\n } catch {\n return null;\n }\n}\n\ninterface FileHighlightWaiter {\n to: number;\n invalidate: () => void;\n}\n\ninterface FileHighlightEntry {\n highlighter: Highlighter;\n lang: string;\n // Present only for disk-backed entries; virtual documents omit both.\n mtimeMs?: number;\n size?: number;\n sourceLines: string[];\n lines: string[];\n state: GrammarState | undefined;\n target: number;\n waiters: FileHighlightWaiter[];\n stale: boolean;\n chars: number;\n}\n\nexport interface FileHighlightLine {\n raw: string;\n ansi: string;\n}\n\nconst fileHighlightCache = new Map<string, FileHighlightEntry>();\nlet fileHighlightChars = 0;\nconst fileHighlightQueue: FileHighlightEntry[] = [];\nlet fileHighlightQueueScheduled = false;\n\nconst expandFileLineTabs = (text: string): string => text.replace(/\\t/g, \" \");\n\nconst dropFileHighlightEntry = (key: string, entry: FileHighlightEntry): void => {\n if (fileHighlightCache.get(key) !== entry) return;\n entry.stale = true;\n entry.waiters = [];\n fileHighlightCache.delete(key);\n fileHighlightChars -= entry.chars;\n};\n\nconst evictFileHighlightCache = (): void => {\n while (\n fileHighlightCache.size > FILE_HIGHLIGHT_ENTRY_LIMIT ||\n fileHighlightChars > FILE_HIGHLIGHT_CHAR_LIMIT\n ) {\n const oldestKey = fileHighlightCache.keys().next().value;\n if (oldestKey === undefined) break;\n const oldest = fileHighlightCache.get(oldestKey);\n if (oldest) dropFileHighlightEntry(oldestKey, oldest);\n else fileHighlightCache.delete(oldestKey);\n }\n};\n\nconst resetFileHighlighting = (): void => {\n for (const [, entry] of fileHighlightCache) {\n entry.stale = true;\n entry.waiters = [];\n }\n fileHighlightCache.clear();\n fileHighlightQueue.length = 0;\n fileHighlightChars = 0;\n};\n\nconst fireSatisfiedWaiters = (entry: FileHighlightEntry): void => {\n const covered = entry.lines.length;\n const ready = new Set<() => void>();\n const remaining: FileHighlightWaiter[] = [];\n for (const waiter of entry.waiters) {\n if (waiter.to <= covered) ready.add(waiter.invalidate);\n else remaining.push(waiter);\n }\n entry.waiters = remaining;\n if (ready.size === 0) return;\n queueMicrotask(() => {\n for (const invalidate of ready) {\n try {\n invalidate();\n } catch {\n // A stale invalidate callback is harmless.\n }\n }\n });\n};\n\nconst advanceFileHighlight = (entry: FileHighlightEntry): void => {\n const instance = highlighter;\n if (!instance || readyTheme !== currentTheme || instance !== entry.highlighter) {\n entry.stale = true;\n return;\n }\n const start = entry.lines.length;\n const hardEnd = Math.min(entry.target, entry.sourceLines.length);\n let end = start;\n let chars = 0;\n const maxEnd = Math.min(start + FILE_HIGHLIGHT_TICK_LINE_BUDGET, hardEnd);\n while (end < maxEnd && chars <= FILE_HIGHLIGHT_TICK_CHAR_BUDGET) {\n chars += (entry.sourceLines[end]?.length ?? 0) + 1;\n end++;\n }\n if (end <= start) return;\n try {\n const tokens = instance.codeToTokensBase(entry.sourceLines.slice(start, end).join(\"\\n\"), {\n lang: entry.lang as never,\n theme: currentTheme as never,\n ...(entry.state ? { grammarState: entry.state } : {}),\n });\n const rendered = tokens.map((line) =>\n normalizeContrast(line.map(ansiFromToken).join(\"\")),\n );\n entry.state = instance.getLastGrammarState(tokens as never);\n entry.lines.push(...rendered);\n const delta = rendered.reduce((total, line) => total + line.length, 0);\n entry.chars += delta;\n fileHighlightChars += delta;\n } catch {\n entry.stale = true;\n }\n};\n\nconst pumpFileHighlightQueue = (): void => {\n fileHighlightQueueScheduled = false;\n let entry = fileHighlightQueue.shift();\n while (\n entry !== undefined &&\n (entry.stale ||\n entry.highlighter !== highlighter ||\n entry.lines.length >= Math.min(entry.target, entry.sourceLines.length))\n ) {\n if (entry.waiters.length > 0) fireSatisfiedWaiters(entry);\n entry = fileHighlightQueue.shift();\n }\n if (!entry) return;\n advanceFileHighlight(entry);\n if (!entry.stale) {\n fireSatisfiedWaiters(entry);\n // Coverage only progresses while something on screen waits for it; an\n // entry with no waiters parks so idle state never burns CPU.\n if (entry.waiters.length > 0) fileHighlightQueue.push(entry);\n }\n if (fileHighlightQueue.length > 0) {\n fileHighlightQueueScheduled = true;\n setImmediate(pumpFileHighlightQueue);\n }\n};\n\nconst scheduleFileHighlight = (entry: FileHighlightEntry): void => {\n if (!fileHighlightQueue.includes(entry)) fileHighlightQueue.push(entry);\n if (fileHighlightQueueScheduled) return;\n fileHighlightQueueScheduled = true;\n setImmediate(pumpFileHighlightQueue);\n};\n\n/**\n * Highlight a line range of an on-disk file with full grammar state, returning\n * per-line { raw, ansi } entries for 0-based [from, to). `raw` is the\n * tab-expanded source line so callers can verify the rendered content still\n * matches the file. Returns null while coverage has not reached `to` (or when\n * the file is unusable); passing `invalidate` repaints as soon as the range is\n * covered and pumps bounded background tokenization \u2014 parked shiki\n * GrammarState, one ~5-10ms slice per event-loop tick, work only while\n * waiters exist.\n */\nexport function highlightFileLines(\n filePath: string,\n lang: string,\n from: number,\n to: number,\n invalidate?: () => void,\n): FileHighlightLine[] | null {\n if (!enabled || !lang || !filePath || to <= from || from < 0) return null;\n if (!highlighter || readyTheme !== currentTheme) {\n requestInit(invalidate);\n return null;\n }\n const shikiLang = normalizeLanguage(lang);\n if (!(shikiLang in shikiLanguages())) return null;\n if (!loadedLanguages.has(shikiLang)) {\n requestLanguageLoad(shikiLang, invalidate);\n return null;\n }\n let stat;\n try {\n stat = statSync(filePath);\n } catch {\n return null;\n }\n if (!stat.isFile() || stat.size > FILE_HIGHLIGHT_MAX_SOURCE_CHARS) return null;\n const key = `${currentTheme}\\0${shikiLang}\\0${filePath}`;\n let entry = fileHighlightCache.get(key);\n if (entry && (entry.mtimeMs !== stat.mtimeMs || entry.size !== stat.size)) {\n dropFileHighlightEntry(key, entry);\n entry = undefined;\n }\n if (!entry) {\n let text: string;\n try {\n text = readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n if (text.includes(\"\\0\")) return null;\n const sourceLines = text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map(expandFileLineTabs);\n entry = {\n highlighter,\n lang: shikiLang,\n mtimeMs: stat.mtimeMs,\n size: stat.size,\n sourceLines,\n lines: [],\n state: undefined,\n target: 0,\n waiters: [],\n stale: false,\n chars: sourceLines.reduce((total, line) => total + line.length, 0),\n };\n fileHighlightCache.set(key, entry);\n fileHighlightChars += entry.chars;\n evictFileHighlightCache();\n if (entry.stale) {\n // Evicted immediately by the char budget; treat as unusable.\n entry.waiters = [];\n return null;\n }\n } else {\n fileHighlightCache.delete(key);\n fileHighlightCache.set(key, entry);\n }\n return fileHighlightRange(entry, from, to, invalidate);\n}\n\n/**\n * Highlight a line range of an in-memory document with full grammar state.\n * Shares the disk-backed pump, cache, and budgets; the caller supplies the\n * cache identity via `cacheKey` (already namespaced by theme + language) and\n * the tab-expanded source lines. Returns null while coverage has not reached\n * `to`; passing `invalidate` repaints as soon as the range is covered.\n */\nexport function highlightSourceLines(\n cacheKey: string,\n sourceLines: string[],\n lang: string,\n from: number,\n to: number,\n invalidate?: () => void,\n): FileHighlightLine[] | null {\n if (!enabled || !lang || !cacheKey || to <= from || from < 0) return null;\n if (!highlighter || readyTheme !== currentTheme) {\n requestInit(invalidate);\n return null;\n }\n const shikiLang = normalizeLanguage(lang);\n if (!(shikiLang in shikiLanguages())) return null;\n if (!loadedLanguages.has(shikiLang)) {\n requestLanguageLoad(shikiLang, invalidate);\n return null;\n }\n let entry = fileHighlightCache.get(cacheKey);\n if (!entry) {\n entry = {\n highlighter,\n lang: shikiLang,\n sourceLines,\n lines: [],\n state: undefined,\n target: 0,\n waiters: [],\n stale: false,\n chars: sourceLines.reduce((total, line) => total + line.length, 0),\n };\n fileHighlightCache.set(cacheKey, entry);\n fileHighlightChars += entry.chars;\n evictFileHighlightCache();\n if (entry.stale) {\n entry.waiters = [];\n return null;\n }\n } else {\n fileHighlightCache.delete(cacheKey);\n fileHighlightCache.set(cacheKey, entry);\n }\n return fileHighlightRange(entry, from, to, invalidate);\n}\n\nconst fileHighlightRange = (\n entry: FileHighlightEntry,\n from: number,\n to: number,\n invalidate?: () => void,\n): FileHighlightLine[] | null => {\n const total = entry.sourceLines.length;\n if (from >= total) return null;\n const clampedTo = Math.max(Math.min(to, total), Math.min(from, total));\n entry.target = Math.max(entry.target, clampedTo);\n if (invalidate && entry.lines.length < clampedTo) {\n entry.waiters = entry.waiters.filter((waiter) => waiter.invalidate !== invalidate);\n entry.waiters.push({ to: clampedTo, invalidate });\n scheduleFileHighlight(entry);\n }\n // Coverage past EOF: serve the existing lines rather than wait forever on a\n // target that can never be reached.\n if (entry.lines.length < clampedTo) return null;\n const out: FileHighlightLine[] = [];\n for (let index = from; index < Math.min(to, total); index++) {\n out.push({ raw: entry.sourceLines[index] ?? \"\", ansi: entry.lines[index] ?? \"\" });\n }\n return out;\n};\n", "import { createRequire } from \"node:module\";\n\n// Render callbacks are synchronous. Resolve optional catalogs on the first\n// preview, not while loading the extension (even metadata has a static graph).\nconst require = createRequire(import.meta.url);\nlet languages: typeof import(\"shiki/langs\")[\"bundledLanguages\"] | undefined;\nlet themeTypes: Map<string, \"light\" | \"dark\"> | undefined;\n\nexport const shikiLanguages = (): typeof import(\"shiki/langs\")[\"bundledLanguages\"] =>\n languages ??= (require(\"shiki/langs\") as typeof import(\"shiki/langs\")).bundledLanguages;\n\nexport const shikiThemeType = (id: string): \"light\" | \"dark\" | undefined => {\n themeTypes ??= new Map((require(\"shiki/themes\") as typeof import(\"shiki/themes\")).bundledThemesInfo.map(theme => [theme.id, theme.type]));\n return themeTypes.get(id);\n};\n", "import type { ThemeRegistration } from \"shiki\";\n\n// Theme resolution for issue #46.\n//\n// Pi's extension host cannot resolve shiki's internal lazy\n// `import(\"@shikijs/themes/<id>)` (triggered when createHighlighter is handed\n// a bare theme *id string*), so previews fell back to plain text. We resolve\n// each theme object from pi-fabric's own module graph with static imports and\n// hand createHighlighter the *object*, so shiki never performs that\n// host-fragile subpath import at runtime.\n//\n// Each entry is a static dynamic import so the module is only fetched when a\n// theme is actually selected, and so vitest can intercept it.\n\nconst THEME_IMPORTS = {\n \"andromeeda\": () => import(\"@shikijs/themes/andromeeda\"),\n \"aurora-x\": () => import(\"@shikijs/themes/aurora-x\"),\n \"ayu-dark\": () => import(\"@shikijs/themes/ayu-dark\"),\n \"ayu-light\": () => import(\"@shikijs/themes/ayu-light\"),\n \"ayu-mirage\": () => import(\"@shikijs/themes/ayu-mirage\"),\n \"catppuccin-frappe\": () => import(\"@shikijs/themes/catppuccin-frappe\"),\n \"catppuccin-latte\": () => import(\"@shikijs/themes/catppuccin-latte\"),\n \"catppuccin-macchiato\": () => import(\"@shikijs/themes/catppuccin-macchiato\"),\n \"catppuccin-mocha\": () => import(\"@shikijs/themes/catppuccin-mocha\"),\n \"dark-plus\": () => import(\"@shikijs/themes/dark-plus\"),\n \"dracula\": () => import(\"@shikijs/themes/dracula\"),\n \"dracula-soft\": () => import(\"@shikijs/themes/dracula-soft\"),\n \"everforest-dark\": () => import(\"@shikijs/themes/everforest-dark\"),\n \"everforest-light\": () => import(\"@shikijs/themes/everforest-light\"),\n \"github-dark\": () => import(\"@shikijs/themes/github-dark\"),\n \"github-dark-default\": () => import(\"@shikijs/themes/github-dark-default\"),\n \"github-dark-dimmed\": () => import(\"@shikijs/themes/github-dark-dimmed\"),\n \"github-dark-high-contrast\": () =>\n import(\"@shikijs/themes/github-dark-high-contrast\"),\n \"github-light\": () => import(\"@shikijs/themes/github-light\"),\n \"github-light-default\": () => import(\"@shikijs/themes/github-light-default\"),\n \"github-light-high-contrast\": () =>\n import(\"@shikijs/themes/github-light-high-contrast\"),\n \"gruvbox-dark-hard\": () => import(\"@shikijs/themes/gruvbox-dark-hard\"),\n \"gruvbox-dark-medium\": () => import(\"@shikijs/themes/gruvbox-dark-medium\"),\n \"gruvbox-dark-soft\": () => import(\"@shikijs/themes/gruvbox-dark-soft\"),\n \"gruvbox-light-hard\": () => import(\"@shikijs/themes/gruvbox-light-hard\"),\n \"gruvbox-light-medium\": () => import(\"@shikijs/themes/gruvbox-light-medium\"),\n \"gruvbox-light-soft\": () => import(\"@shikijs/themes/gruvbox-light-soft\"),\n \"horizon\": () => import(\"@shikijs/themes/horizon\"),\n \"horizon-bright\": () => import(\"@shikijs/themes/horizon-bright\"),\n \"houston\": () => import(\"@shikijs/themes/houston\"),\n \"kanagawa-dragon\": () => import(\"@shikijs/themes/kanagawa-dragon\"),\n \"kanagawa-lotus\": () => import(\"@shikijs/themes/kanagawa-lotus\"),\n \"kanagawa-wave\": () => import(\"@shikijs/themes/kanagawa-wave\"),\n \"laserwave\": () => import(\"@shikijs/themes/laserwave\"),\n \"light-plus\": () => import(\"@shikijs/themes/light-plus\"),\n \"material-theme\": () => import(\"@shikijs/themes/material-theme\"),\n \"material-theme-darker\": () => import(\"@shikijs/themes/material-theme-darker\"),\n \"material-theme-lighter\": () => import(\"@shikijs/themes/material-theme-lighter\"),\n \"material-theme-ocean\": () => import(\"@shikijs/themes/material-theme-ocean\"),\n \"material-theme-palenight\": () =>\n import(\"@shikijs/themes/material-theme-palenight\"),\n \"min-dark\": () => import(\"@shikijs/themes/min-dark\"),\n \"min-light\": () => import(\"@shikijs/themes/min-light\"),\n \"monokai\": () => import(\"@shikijs/themes/monokai\"),\n \"night-owl\": () => import(\"@shikijs/themes/night-owl\"),\n \"night-owl-light\": () => import(\"@shikijs/themes/night-owl-light\"),\n \"nord\": () => import(\"@shikijs/themes/nord\"),\n \"one-dark-pro\": () => import(\"@shikijs/themes/one-dark-pro\"),\n \"one-light\": () => import(\"@shikijs/themes/one-light\"),\n \"plastic\": () => import(\"@shikijs/themes/plastic\"),\n \"poimandres\": () => import(\"@shikijs/themes/poimandres\"),\n \"red\": () => import(\"@shikijs/themes/red\"),\n \"rose-pine\": () => import(\"@shikijs/themes/rose-pine\"),\n \"rose-pine-dawn\": () => import(\"@shikijs/themes/rose-pine-dawn\"),\n \"rose-pine-moon\": () => import(\"@shikijs/themes/rose-pine-moon\"),\n \"slack-dark\": () => import(\"@shikijs/themes/slack-dark\"),\n \"slack-ochin\": () => import(\"@shikijs/themes/slack-ochin\"),\n \"snazzy-light\": () => import(\"@shikijs/themes/snazzy-light\"),\n \"solarized-dark\": () => import(\"@shikijs/themes/solarized-dark\"),\n \"solarized-light\": () => import(\"@shikijs/themes/solarized-light\"),\n \"synthwave-84\": () => import(\"@shikijs/themes/synthwave-84\"),\n \"tokyo-night\": () => import(\"@shikijs/themes/tokyo-night\"),\n \"vesper\": () => import(\"@shikijs/themes/vesper\"),\n \"vitesse-black\": () => import(\"@shikijs/themes/vitesse-black\"),\n \"vitesse-dark\": () => import(\"@shikijs/themes/vitesse-dark\"),\n \"vitesse-light\": () => import(\"@shikijs/themes/vitesse-light\"),\n} as const satisfies Record<string, () => Promise<{ default: ThemeRegistration }>>;\n\n/**\n * Resolve a shiki theme id to its loaded theme object. Returns undefined when\n * the id is not a bundled shiki theme, so callers can fall back gracefully.\n */\nexport async function resolveShikiThemeObject(\n themeId: string,\n): Promise<ThemeRegistration | undefined> {\n const loader = THEME_IMPORTS[themeId as keyof typeof THEME_IMPORTS];\n if (!loader) return undefined;\n const mod = await loader();\n return mod.default;\n}\n", "import type { LanguageRegistration } from \"shiki\";\n\n// Resolve bundled language grammars through pi-fabric's dependency graph.\n// Shiki's own lazy imports are not resolvable from Pi's jiti extension host.\nconst LANGUAGE_IMPORTS = {\n bash: () => import(\"@shikijs/langs/shellscript\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n jsx: () => import(\"@shikijs/langs/jsx\"),\n json: () => import(\"@shikijs/langs/json\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n toml: () => import(\"@shikijs/langs/toml\"),\n css: () => import(\"@shikijs/langs/css\"),\n} as const satisfies Record<\n string,\n () => Promise<{ default: LanguageRegistration[] }>\n>;\n\n/**\n * Resolve the language registrations used during highlighter initialization.\n * Passing objects prevents Shiki from issuing host-fragile lazy imports.\n */\nexport async function resolveShikiLanguageObjects(\n languageIds: readonly string[],\n): Promise<LanguageRegistration[]> {\n const modules = await Promise.all(\n languageIds.map(async (languageId) => {\n const loader = LANGUAGE_IMPORTS[languageId as keyof typeof LANGUAGE_IMPORTS];\n if (!loader) throw new Error(`Unsupported preloaded Shiki language: ${languageId}`);\n return loader();\n }),\n );\n return modules.flatMap((module) => module.default);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require"]
|
|
7
|
+
}
|
|
@@ -6,8 +6,9 @@ import {
|
|
|
6
6
|
highlightSourceLines,
|
|
7
7
|
languageFromPath,
|
|
8
8
|
observePiTheme,
|
|
9
|
-
observedThemeVariant
|
|
10
|
-
|
|
9
|
+
observedThemeVariant,
|
|
10
|
+
shikiLanguages
|
|
11
|
+
} from "./chunk-RTXZHKMS.js";
|
|
11
12
|
import {
|
|
12
13
|
countContentLines,
|
|
13
14
|
countNewlines,
|
|
@@ -19,10 +20,12 @@ import {
|
|
|
19
20
|
} from "./chunk-J2HV2URQ.js";
|
|
20
21
|
import {
|
|
21
22
|
fabricStringLiterals
|
|
22
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-2462VF6I.js";
|
|
23
24
|
|
|
24
25
|
// src/ui/structured.ts
|
|
25
|
-
import {
|
|
26
|
+
import { createRequire } from "node:module";
|
|
27
|
+
var require2 = createRequire(import.meta.url);
|
|
28
|
+
var yaml;
|
|
26
29
|
var normalizeJsonValue = (value) => {
|
|
27
30
|
try {
|
|
28
31
|
const serialized = JSON.stringify(value);
|
|
@@ -34,7 +37,7 @@ var normalizeJsonValue = (value) => {
|
|
|
34
37
|
var formatJsonAsYaml = (value) => {
|
|
35
38
|
const normalized = normalizeJsonValue(value);
|
|
36
39
|
if (normalized === void 0) return void 0;
|
|
37
|
-
return stringify(normalized, { indent: 2, lineWidth: 0 }).trimEnd();
|
|
40
|
+
return (yaml ??= require2("yaml")).stringify(normalized, { indent: 2, lineWidth: 0 }).trimEnd();
|
|
38
41
|
};
|
|
39
42
|
var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
40
43
|
var hoistMultilineStrings = (value, path, sections, seen) => {
|
|
@@ -97,15 +100,15 @@ var fairSectionBudgets = (lengths, budget) => {
|
|
|
97
100
|
}
|
|
98
101
|
return budgets;
|
|
99
102
|
};
|
|
100
|
-
var renderHoistedSections = (
|
|
103
|
+
var renderHoistedSections = (yaml2, sections, maxChars) => {
|
|
101
104
|
const headers = sections.map((section) => `--- ${section.path} (${section.text.length} chars) ---
|
|
102
105
|
`);
|
|
103
106
|
const separators = sections.length * 2;
|
|
104
|
-
const fixedChars =
|
|
107
|
+
const fixedChars = yaml2.length + separators + headers.reduce((sum, header) => sum + header.length, 0);
|
|
105
108
|
const fullChars = fixedChars + sections.reduce((sum, section) => sum + section.text.length, 0);
|
|
106
109
|
const budgets = maxChars !== void 0 && fullChars > maxChars ? fairSectionBudgets(sections.map((section) => section.text.length), maxChars - fixedChars) : sections.map((section) => section.text.length);
|
|
107
110
|
const raw = sections.map((section, index) => `${headers[index]}${boundedSection(section.text, budgets[index])}`).join("\n\n");
|
|
108
|
-
return `${
|
|
111
|
+
return `${yaml2}
|
|
109
112
|
|
|
110
113
|
${raw}`;
|
|
111
114
|
};
|
|
@@ -119,13 +122,13 @@ var formatFabricValue = (value, format, maxChars) => {
|
|
|
119
122
|
if (format === "auto" || format === "yaml") {
|
|
120
123
|
const sections = [];
|
|
121
124
|
const skeleton = hoistMultilineStrings(value, "", sections, /* @__PURE__ */ new Set());
|
|
122
|
-
const
|
|
123
|
-
if (
|
|
124
|
-
if (sections.length === 0) return { text:
|
|
125
|
+
const yaml2 = formatJsonAsYaml(skeleton);
|
|
126
|
+
if (yaml2 !== void 0) {
|
|
127
|
+
if (sections.length === 0) return { text: yaml2, language: "yaml" };
|
|
125
128
|
return {
|
|
126
|
-
text: renderHoistedSections(
|
|
129
|
+
text: renderHoistedSections(yaml2, sections, maxChars),
|
|
127
130
|
language: "yaml",
|
|
128
|
-
highlightedLineCount: countNewlines(
|
|
131
|
+
highlightedLineCount: countNewlines(yaml2) + 1
|
|
129
132
|
};
|
|
130
133
|
}
|
|
131
134
|
}
|
|
@@ -186,7 +189,6 @@ var formatToolCallDuration = (startedAt, endedAt) => {
|
|
|
186
189
|
|
|
187
190
|
// src/ui/core-tool-render.ts
|
|
188
191
|
import { diffLines } from "diff";
|
|
189
|
-
import { bundledLanguages } from "shiki/langs";
|
|
190
192
|
|
|
191
193
|
// src/ui/diff-background.ts
|
|
192
194
|
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
@@ -2147,7 +2149,7 @@ var resolveLanguage = (filePath, content) => {
|
|
|
2147
2149
|
php: "php"
|
|
2148
2150
|
};
|
|
2149
2151
|
const language = executable ? shebang[executable] : void 0;
|
|
2150
|
-
if (language && language in
|
|
2152
|
+
if (language && language in shikiLanguages()) return language;
|
|
2151
2153
|
}
|
|
2152
2154
|
if (!content || content.length > CONTENT_LANGUAGE_DETECTION_CHARS) return void 0;
|
|
2153
2155
|
const trimmed = content.trim();
|
|
@@ -4215,4 +4217,4 @@ export {
|
|
|
4215
4217
|
formatJsonAsYaml,
|
|
4216
4218
|
formatFabricValue
|
|
4217
4219
|
};
|
|
4218
|
-
//# sourceMappingURL=chunk-
|
|
4220
|
+
//# sourceMappingURL=chunk-VIBQBYJ6.js.map
|