pi-fabric 0.92.22 → 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.
Files changed (32) hide show
  1. package/dist/chunks/{chunk-U3FNEK2H.js → chunk-2462VF6I.js} +5 -3
  2. package/dist/chunks/chunk-2462VF6I.js.map +7 -0
  3. package/dist/chunks/{chunk-KI4VAMHK.js → chunk-5Y2TKOQV.js} +2 -2
  4. package/dist/chunks/{chunk-VH3W37YI.js → chunk-AFALENHK.js} +2 -2
  5. package/dist/chunks/{chunk-QLJ5P7HV.js → chunk-JJZFNBB7.js} +2 -2
  6. package/dist/chunks/{chunk-IWH6PCMK.js → chunk-R7G4HXVD.js} +2 -2
  7. package/dist/chunks/{chunk-ZZ4LHQYJ.js → chunk-RTXZHKMS.js} +22 -13
  8. package/dist/chunks/chunk-RTXZHKMS.js.map +7 -0
  9. package/dist/chunks/{chunk-YSXGVO2N.js → chunk-VIBQBYJ6.js} +18 -16
  10. package/dist/chunks/chunk-VIBQBYJ6.js.map +7 -0
  11. package/dist/chunks/{chunk-EFHCXJTV.js → chunk-ZHOMIIUF.js} +2 -2
  12. package/dist/compaction/hook.js +2 -2
  13. package/dist/fabric-runtime-state.js +5 -5
  14. package/dist/index.js +6 -6
  15. package/dist/residency/host.js +5 -5
  16. package/dist/residency/pi-entry.js +5 -5
  17. package/dist/ui/conversation.js +1 -1
  18. package/dist/ui/dashboard.js +3 -3
  19. package/dist/ui/fabric-code-parser.d.ts.map +1 -1
  20. package/dist/ui/highlight.d.ts.map +1 -1
  21. package/dist/ui/shiki-catalog.d.ts +3 -0
  22. package/dist/ui/shiki-catalog.d.ts.map +1 -0
  23. package/dist/ui/structured.d.ts.map +1 -1
  24. package/package.json +3 -2
  25. package/dist/chunks/chunk-U3FNEK2H.js.map +0 -7
  26. package/dist/chunks/chunk-YSXGVO2N.js.map +0 -7
  27. package/dist/chunks/chunk-ZZ4LHQYJ.js.map +0 -7
  28. /package/dist/chunks/{chunk-KI4VAMHK.js.map → chunk-5Y2TKOQV.js.map} +0 -0
  29. /package/dist/chunks/{chunk-VH3W37YI.js.map → chunk-AFALENHK.js.map} +0 -0
  30. /package/dist/chunks/{chunk-QLJ5P7HV.js.map → chunk-JJZFNBB7.js.map} +0 -0
  31. /package/dist/chunks/{chunk-IWH6PCMK.js.map → chunk-R7G4HXVD.js.map} +0 -0
  32. /package/dist/chunks/{chunk-EFHCXJTV.js.map → chunk-ZHOMIIUF.js.map} +0 -0
@@ -1,5 +1,7 @@
1
1
  // src/ui/fabric-code-parser.ts
2
- import { parser as pythonParser } from "@lezer/python";
2
+ import { createRequire } from "node:module";
3
+ var require2 = createRequire(import.meta.url);
4
+ var pythonParser;
3
5
  var identifierStart = (char) => /[A-Za-z_$π]/u.test(char);
4
6
  var identifierPart = (char) => /[A-Za-z0-9_$π]/u.test(char);
5
7
  var readEscape = (source, index) => {
@@ -36,7 +38,7 @@ var readEscape = (source, index) => {
36
38
  };
37
39
  var tokenizePython = (source) => {
38
40
  const tokens = [];
39
- pythonParser.parse(source).iterate({
41
+ (pythonParser ??= require2("@lezer/python").parser).parse(source).iterate({
40
42
  enter(node) {
41
43
  if (node.name === "Comment" || node.name === "FormatString") return false;
42
44
  const text = source.slice(node.from, node.to);
@@ -406,4 +408,4 @@ export {
406
408
  fabricWriteBindings,
407
409
  fabricExecTitleHint
408
410
  };
409
- //# sourceMappingURL=chunk-U3FNEK2H.js.map
411
+ //# sourceMappingURL=chunk-2462VF6I.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ui/fabric-code-parser.ts"],
4
+ "sourcesContent": ["import { createRequire } from \"node:module\";\nimport type { FabricKernel } from \"../runtime/kernel.js\";\n\nconst require = createRequire(import.meta.url);\nlet pythonParser: typeof import(\"@lezer/python\")[\"parser\"] | undefined;\n\nexport interface FabricWriteBinding {\n path: string;\n stringKey: string;\n}\n\ntype Token = { kind: \"identifier\" | \"string\" | \"punctuation\"; text: string };\n\nconst identifierStart = (char: string): boolean => /[A-Za-z_$\u03C0]/u.test(char);\nconst identifierPart = (char: string): boolean => /[A-Za-z0-9_$\u03C0]/u.test(char);\n\nconst readEscape = (source: string, index: number): { value: string; next: number } => {\n const char = source[index];\n if (char === undefined) return { value: \"\", next: index };\n const simple: Record<string, string> = {\n n: \"\\n\", r: \"\\r\", t: \"\\t\", b: \"\\b\", f: \"\\f\", v: \"\\v\", 0: \"\\0\",\n };\n if (char in simple) return { value: simple[char]!, next: index + 1 };\n if (char === \"\\n\") return { value: \"\", next: index + 1 };\n if (char === \"\\r\") return { value: \"\", next: source[index + 1] === \"\\n\" ? index + 2 : index + 1 };\n if (char === \"x\") {\n const digits = source.slice(index + 1, index + 3);\n if (/^[0-9a-f]{2}$/i.test(digits)) return { value: String.fromCharCode(Number.parseInt(digits, 16)), next: index + 3 };\n }\n if (char === \"u\") {\n if (source[index + 1] === \"{\") {\n const end = source.indexOf(\"}\", index + 2);\n const digits = end < 0 ? \"\" : source.slice(index + 2, end);\n if (/^[0-9a-f]{1,6}$/i.test(digits)) {\n return { value: String.fromCodePoint(Number.parseInt(digits, 16)), next: end + 1 };\n }\n }\n const digits = source.slice(index + 1, index + 5);\n if (/^[0-9a-f]{4}$/i.test(digits)) return { value: String.fromCharCode(Number.parseInt(digits, 16)), next: index + 5 };\n }\n return { value: char, next: index + 1 };\n};\n\n// Use the Python grammar so comments, docstrings and interpolated strings\n// cannot masquerade as capability calls. Normalize keyword arguments to the\n// same token shape as object/dictionary fields for the shared title renderer.\nconst tokenizePython = (source: string): Token[] => {\n const tokens: Token[] = [];\n (pythonParser ??= (require(\"@lezer/python\") as typeof import(\"@lezer/python\")).parser).parse(source).iterate({\n enter(node) {\n if (node.name === \"Comment\" || node.name === \"FormatString\") return false;\n const text = source.slice(node.from, node.to);\n if (node.name === \"String\") {\n const match = /^(r|u)?('''|\"\"\"|'|\")/i.exec(text);\n if (!match) return false;\n const quote = match[2]!;\n if (!text.endsWith(quote) || text.length < match[0].length + quote.length) return false;\n const body = text.slice(match[0].length, -quote.length);\n let value = \"\";\n for (let index = 0; index < body.length;) {\n if (body[index] === \"\\\\\" && match[1]?.toLowerCase() !== \"r\") {\n const escape = body[index + 1] ?? \"\";\n const width = escape === \"x\" ? 2 : escape === \"u\" ? 4 : escape === \"U\" ? 8 : 0;\n if (width) {\n const digits = body.slice(index + 2, index + 2 + width);\n if (digits.length !== width || !/^[0-9a-f]+$/i.test(digits)) return false;\n const point = Number.parseInt(digits, 16);\n if (point > 0x10ffff) return false;\n value += String.fromCodePoint(point);\n index += width + 2;\n } else if (/[0-7]/.test(escape)) {\n const digits = /^[0-7]{1,3}/.exec(body.slice(index + 1))![0];\n value += String.fromCharCode(Number.parseInt(digits, 8));\n index += digits.length + 1;\n } else if (escape === \"a\") {\n value += \"\\x07\";\n index += 2;\n } else if (/[\\\\'\"nrtbfv\\n\\r]/.test(escape)) {\n const escaped = readEscape(body, index + 1);\n value += escaped.value;\n index = escaped.next;\n } else if (escape === \"N\") {\n // Unicode-name lookup needs Python's database; stay conservative.\n return false;\n } else {\n // Unknown Python escapes remain literal, unlike JavaScript.\n value += body.slice(index, index + 2);\n index += 2;\n }\n } else value += body[index++]!;\n }\n tokens.push({ kind: \"string\", text: value });\n return false;\n }\n if (node.node.firstChild) return;\n if (node.name === \"VariableName\" || node.name === \"PropertyName\") {\n tokens.push({ kind: \"identifier\", text });\n } else tokens.push({ kind: \"punctuation\", text: text === \"=\" ? \":\" : text });\n },\n });\n return tokens;\n};\n\nconst tokenize = (source: string): Token[] => {\n const tokens: Token[] = [];\n let index = 0;\n while (index < source.length) {\n const char = source[index]!;\n if (/\\s/u.test(char)) { index++; continue; }\n if (char === \"/\" && source[index + 1] === \"/\") {\n index = source.indexOf(\"\\n\", index + 2);\n if (index < 0) break;\n continue;\n }\n if (char === \"/\" && source[index + 1] === \"*\") {\n const end = source.indexOf(\"*/\", index + 2);\n index = end < 0 ? source.length : end + 2;\n continue;\n }\n if (char === \"'\" || char === '\"' || char === \"`\") {\n const quote = char;\n let value = \"\";\n let dynamicTemplate = false;\n index++;\n while (index < source.length) {\n const current = source[index]!;\n if (current === quote) { index++; break; }\n if (quote === \"`\" && current === \"$\" && source[index + 1] === \"{\") dynamicTemplate = true;\n if (current === \"\\\\\") {\n const escaped = readEscape(source, index + 1);\n value += escaped.value;\n index = escaped.next;\n continue;\n }\n value += current;\n index++;\n }\n if (!dynamicTemplate) tokens.push({ kind: \"string\", text: value });\n continue;\n }\n if (identifierStart(char)) {\n const start = index++;\n while (index < source.length && identifierPart(source[index]!)) index++;\n tokens.push({ kind: \"identifier\", text: source.slice(start, index) });\n continue;\n }\n tokens.push({ kind: \"punctuation\", text: char });\n index++;\n }\n return tokens;\n};\n\nexport const fabricStringLiterals = (code: string): string[] =>\n tokenize(code).filter((token) => token.kind === \"string\").map((token) => token.text);\n\nconst propertyName = (token: Token | undefined): string | undefined =>\n token?.kind === \"identifier\" || token?.kind === \"string\" ? token.text : undefined;\n\nconst namedStringKey = (tokens: Token[], start: number, end: number): string | undefined => {\n if (tokens[start]?.text !== \"\u03C0\") return undefined;\n if (tokens[start + 1]?.text === \".\" && tokens[start + 2]?.kind === \"identifier\" && start + 3 === end) {\n return tokens[start + 2]!.text;\n }\n if (tokens[start + 1]?.text === \"[\" && tokens[start + 2]?.kind === \"string\" && tokens[start + 3]?.text === \"]\" && start + 4 === end) {\n return tokens[start + 2]!.text;\n }\n return undefined;\n};\n\nconst objectBinding = (tokens: Token[], start: number): { binding?: FabricWriteBinding; next: number } => {\n let depth = 1;\n let index = start + 1;\n let path: string | undefined;\n let stringKey: string | undefined;\n while (index < tokens.length && depth > 0) {\n if (tokens[index]?.text === \"{\") { depth++; index++; continue; }\n if (tokens[index]?.text === \"}\") { depth--; index++; continue; }\n if (depth !== 1) { index++; continue; }\n const name = propertyName(tokens[index]);\n if (!name || tokens[index + 1]?.text !== \":\") { index++; continue; }\n const valueStart = index + 2;\n let valueEnd = valueStart;\n let nested = 0;\n while (valueEnd < tokens.length) {\n const text = tokens[valueEnd]!.text;\n if (nested === 0 && (text === \",\" || text === \"}\")) break;\n if (text === \"(\" || text === \"[\" || text === \"{\") nested++;\n else if (text === \")\" || text === \"]\" || text === \"}\") nested--;\n valueEnd++;\n }\n if ([\"path\", \"file\", \"file_path\"].includes(name) && valueEnd === valueStart + 1 && tokens[valueStart]?.kind === \"string\") {\n path = tokens[valueStart]!.text;\n } else if ([\"content\", \"text\", \"contents\"].includes(name)) {\n stringKey = namedStringKey(tokens, valueStart, valueEnd);\n }\n index = valueEnd;\n }\n return path !== undefined && stringKey !== undefined\n ? { binding: { path, stringKey }, next: index }\n : { next: index };\n};\n\nexport const fabricWriteBindings = (code: string): FabricWriteBinding[] => {\n const tokens = tokenize(code);\n const bindings: FabricWriteBinding[] = [];\n for (let index = 0; index < tokens.length - 5; index++) {\n if (tokens[index]?.text !== \"pi\" || tokens[index + 1]?.text !== \".\" || tokens[index + 2]?.text !== \"write\" || tokens[index + 3]?.text !== \"(\" || tokens[index + 4]?.text !== \"{\") continue;\n const parsed = objectBinding(tokens, index + 4);\n if (parsed.binding) bindings.push(parsed.binding);\n index = parsed.next - 1;\n }\n return bindings;\n};\n\nconst TITLE_MAX_CHARS = 80;\nconst TITLE_MAX_ANCHOR_CHARS = 40;\nconst TITLE_MAX_COMMAND_CHARS = 30;\nconst TITLE_MAX_TASK_CHARS = 40;\nconst TITLE_MAX_PATTERN_CHARS = 24;\nconst TITLE_MAX_KEY_CHARS = 24;\nconst TITLE_MAX_WINDOW_TOKENS = 96;\nconst TITLE_SAFE_ANCHOR = /^[A-Za-z0-9_./~@*+,-]+$/;\nconst TITLE_FILE_LIKE = /\\.[A-Za-z0-9]{1,8}$/;\n\nconst PI_VERB_LABELS: Record<string, string> = {\n read: \"Read\",\n bash: \"Shell\",\n edit: \"Edit\",\n write: \"Write\",\n grep: \"Search\",\n find: \"Search\",\n ls: \"Search\",\n};\n\nconst ROOT_VERB_LABELS: Record<string, string> = {\n agents: \"Agent\",\n memory: \"Memory\",\n state: \"State\",\n schema: \"Schema\",\n compact: \"Compact\",\n mesh: \"Mesh\",\n tools: \"Tools\",\n};\n\nconst TITLE_PATH_KEYS = new Set([\"path\", \"file\", \"file_path\"]);\n\nconst humanizeIdentifier = (value: string): string =>\n value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (char) => char.toUpperCase());\n\nconst titleAnchorPathLike = (value: string): boolean =>\n value.length > 0 &&\n value.length <= 64 &&\n TITLE_SAFE_ANCHOR.test(value) &&\n (value.includes(\"/\") || TITLE_FILE_LIKE.test(value) || value.includes(\"*\"));\n\nconst titleBasename = (value: string): string =>\n value.split(\"/\").filter(Boolean).pop() ?? value;\n\nconst titleClip = (value: string, maxChars: number): string =>\n value.length > maxChars ? `${value.slice(0, maxChars - 1)}\u2026` : value;\n\nconst clipWords = (value: string, maxChars: number): string => {\n if (value.length <= maxChars) return value;\n const cut = value.slice(0, maxChars - 1);\n const space = cut.lastIndexOf(\" \");\n return `${space > 0 ? cut.slice(0, space) : cut}\u2026`;\n};\n\n// Token range of one call's argument list: from just after the opening paren\n// to the depth-matched close, capped so a malformed call cannot smear across\n// the rest of the program.\nconst callWindow = (tokens: Token[], openIndex: number): { start: number; end: number } => {\n let depth = 0;\n let end = openIndex;\n while (end < tokens.length && end - openIndex < TITLE_MAX_WINDOW_TOKENS) {\n const text = tokens[end]!.text;\n if (text === \"(\" || text === \"[\" || text === \"{\") depth++;\n else if (text === \")\" || text === \"]\" || text === \"}\") {\n depth--;\n if (depth <= 0) break;\n }\n end++;\n }\n return { start: openIndex + 1, end };\n};\n\nconst isNamedStringToken = (tokens: Token[], index: number): boolean =>\n tokens[index]?.kind === \"string\" && tokens[index - 1]?.text === \"[\" && tokens[index - 2]?.text === \"\u03C0\";\n\nconst windowKeyedString = (\n tokens: Token[],\n start: number,\n end: number,\n keys: Set<string> | string,\n): string | undefined => {\n for (let index = start; index < end; index++) {\n if (tokens[index]?.kind !== \"string\" || isNamedStringToken(tokens, index)) continue;\n if (tokens[index - 1]?.text !== \":\") continue;\n const key = propertyName(tokens[index - 2]);\n if (key === undefined || !(typeof keys === \"string\" ? key === keys : keys.has(key))) continue;\n return tokens[index]!.text;\n }\n return undefined;\n};\n\nconst windowFirstString = (tokens: Token[], start: number, end: number): string | undefined => {\n for (let index = start; index < end; index++) {\n if (tokens[index]?.kind === \"string\" && !isNamedStringToken(tokens, index)) return tokens[index]!.text;\n }\n return undefined;\n};\n\nconst windowPathLike = (tokens: Token[], start: number, end: number): string | undefined => {\n for (let index = start; index < end; index++) {\n if (tokens[index]?.kind === \"string\" && !isNamedStringToken(tokens, index) && titleAnchorPathLike(tokens[index]!.text)) {\n return tokens[index]!.text;\n }\n }\n return undefined;\n};\n\nconst dirQualifier = (value: string): string | undefined =>\n TITLE_FILE_LIKE.test(titleBasename(value))\n ? titleClip(titleBasename(value), TITLE_MAX_ANCHOR_CHARS)\n : TITLE_SAFE_ANCHOR.test(value) && value !== \".\" && value.length <= TITLE_MAX_ANCHOR_CHARS\n ? value\n : undefined;\n\nconst searchTarget = (tokens: Token[], start: number, end: number): string | undefined => {\n const pattern = windowKeyedString(tokens, start, end, \"pattern\");\n let head: string | undefined;\n if (pattern !== undefined) {\n if (titleAnchorPathLike(pattern)) head = titleClip(titleBasename(pattern), TITLE_MAX_ANCHOR_CHARS);\n else if (TITLE_SAFE_ANCHOR.test(pattern) && pattern.length <= TITLE_MAX_PATTERN_CHARS) head = `\"${pattern}\"`;\n }\n const pathValue = windowKeyedString(tokens, start, end, TITLE_PATH_KEYS);\n let tail: string | undefined = pathValue !== undefined ? dirQualifier(pathValue) : undefined;\n if (tail === undefined && pathValue === undefined) {\n // ls-style positional: the first bare string argument.\n const positional = windowFirstString(tokens, start, end);\n if (positional !== undefined && TITLE_SAFE_ANCHOR.test(positional) && positional.length <= TITLE_MAX_ANCHOR_CHARS) {\n tail = titleAnchorPathLike(positional) ? titleClip(titleBasename(positional), TITLE_MAX_ANCHOR_CHARS) : positional;\n }\n }\n if (head !== undefined && tail !== undefined) return `${head} in ${tail}`;\n return head ?? tail;\n};\n\nconst pathTarget = (tokens: Token[], start: number, end: number): string | undefined => {\n const keyed = windowKeyedString(tokens, start, end, TITLE_PATH_KEYS);\n if (keyed !== undefined && TITLE_FILE_LIKE.test(titleBasename(keyed))) {\n return titleClip(titleBasename(keyed), TITLE_MAX_ANCHOR_CHARS);\n }\n const loose = windowPathLike(tokens, start, end);\n if (loose !== undefined) return titleClip(titleBasename(loose), TITLE_MAX_ANCHOR_CHARS);\n return keyed !== undefined ? dirQualifier(keyed) : undefined;\n};\n\nconst piCallTarget = (\n label: string,\n tokens: Token[],\n start: number,\n end: number,\n): string | undefined => {\n if (label === \"Shell\") {\n const command = windowFirstString(tokens, start, end);\n return command !== undefined ? titleClip(command.split(\"\\n\")[0]!, TITLE_MAX_COMMAND_CHARS) : undefined;\n }\n if (label === \"Search\") return searchTarget(tokens, start, end);\n return pathTarget(tokens, start, end);\n};\n\n// Deterministic lexical title for a fabric_exec program, derived without\n// executing it. Every recognized call contributes \"Verb target\" \u2014 target is\n// a basename, glob, quoted literal search head, command head, mcp ref, or\n// task/key clip \u2014 and segments join in first-occurrence order under a char\n// budget. \u03C0 payload keys are skipped so named strings never surface in\n// titles. Returns undefined when the program holds no recognizable Fabric\n// call, letting callers keep a neutral fallback.\nexport const fabricExecTitleHint = (code: string, kernel: FabricKernel = \"typescript\"): string | undefined => {\n const tokens = kernel === \"python\" ? tokenizePython(code) : tokenize(code);\n const groups = new Map<string, (string | undefined)[]>();\n const record = (verb: string, target: string | undefined): void => {\n const list = groups.get(verb);\n if (list) list.push(target);\n else groups.set(verb, [target]);\n };\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index]!;\n if (token.kind !== \"identifier\") continue;\n if ((token.text === \"agents\" || token.text === \"compact\") && tokens[index + 1]?.text === \"(\") {\n const window = callWindow(tokens, index + 1);\n const target = token.text === \"agents\"\n ? (() => {\n const task = windowKeyedString(tokens, window.start, window.end, \"task\");\n return task !== undefined ? clipWords(task.split(\"\\n\")[0]!, TITLE_MAX_TASK_CHARS) : undefined;\n })()\n : undefined;\n record(ROOT_VERB_LABELS[token.text]!, target);\n continue;\n }\n const dot = tokens[index + 1];\n const leaf = tokens[index + 2];\n if (dot?.text !== \".\" || leaf?.kind !== \"identifier\") continue;\n if (token.text === \"pi\" && tokens[index + 3]?.text === \"(\") {\n const label = PI_VERB_LABELS[leaf.text] ?? humanizeIdentifier(leaf.text);\n const window = callWindow(tokens, index + 3);\n record(label, piCallTarget(label, tokens, window.start, window.end));\n continue;\n }\n if (\n token.text === \"mcp\" &&\n tokens[index + 3]?.text === \".\" &&\n tokens[index + 4]?.kind === \"identifier\" &&\n tokens[index + 5]?.text === \"(\"\n ) {\n record(\"Mcp\", `${leaf.text}.${tokens[index + 4]!.text}`);\n continue;\n }\n if (tokens[index + 3]?.text === \"(\") {\n const label = ROOT_VERB_LABELS[token.text];\n if (!label) continue;\n if (token.text === \"memory\" || token.text === \"state\") {\n const window = callWindow(tokens, index + 3);\n const key = windowKeyedString(tokens, window.start, window.end, \"key\");\n record(label, key !== undefined ? clipWords(key.split(\"\\n\")[0]!, TITLE_MAX_KEY_CHARS) : undefined);\n } else {\n record(label, undefined);\n }\n }\n }\n if (groups.size === 0) return undefined;\n const segments: string[] = [];\n for (const [verb, targets] of groups) {\n const first = targets.find((target) => target !== undefined);\n let segment = verb;\n if (first !== undefined) {\n segment = `${verb} ${first}`;\n if (targets.length > 1) {\n segment += targets.every((target) => target === first) ? ` \u00D7${targets.length}` : ` +${targets.length - 1}`;\n }\n } else if (targets.length > 1) {\n segment += ` \u00D7${targets.length}`;\n }\n segments.push(segment);\n }\n let title: string | undefined;\n let overflow = false;\n for (const segment of segments) {\n if (title === undefined) {\n title = segment.length <= TITLE_MAX_CHARS ? segment : clipWords(segment, TITLE_MAX_CHARS);\n continue;\n }\n const candidate = `${title} + ${segment}`;\n if (candidate.length <= TITLE_MAX_CHARS) {\n title = candidate;\n continue;\n }\n overflow = true;\n break;\n }\n if (overflow && title !== undefined && title.length + 3 <= TITLE_MAX_CHARS) title = `${title} +\u2026`;\n return title;\n};"],
5
+ "mappings": "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",
6
+ "names": ["require", "digits"]
7
+ }
@@ -18,7 +18,7 @@ import {
18
18
  import {
19
19
  peerLabelPrefix,
20
20
  writeHandoffSession
21
- } from "./chunk-IWH6PCMK.js";
21
+ } from "./chunk-R7G4HXVD.js";
22
22
  import {
23
23
  resolveAgentDir
24
24
  } from "./chunk-PXAICAUT.js";
@@ -6870,4 +6870,4 @@ export {
6870
6870
  agentParticipantRecords,
6871
6871
  actorParticipantRecord
6872
6872
  };
6873
- //# sourceMappingURL=chunk-KI4VAMHK.js.map
6873
+ //# sourceMappingURL=chunk-5Y2TKOQV.js.map
@@ -10,7 +10,7 @@ import {
10
10
  buildThinkingDigest,
11
11
  snapshotHandoffSession,
12
12
  thinkingTransferPolicy
13
- } from "./chunk-IWH6PCMK.js";
13
+ } from "./chunk-R7G4HXVD.js";
14
14
  import {
15
15
  isFabricThinking
16
16
  } from "./chunk-MGWQOKBV.js";
@@ -2012,4 +2012,4 @@ export {
2012
2012
  PrewalkController,
2013
2013
  PrewalkDriftTracker
2014
2014
  };
2015
- //# sourceMappingURL=chunk-VH3W37YI.js.map
2015
+ //# sourceMappingURL=chunk-AFALENHK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  fabricExecTitleHint
3
- } from "./chunk-U3FNEK2H.js";
3
+ } from "./chunk-2462VF6I.js";
4
4
  import {
5
5
  FABRIC_BRANCH_RUN_DESCRIPTION_MAX_BYTES,
6
6
  FABRIC_BRANCH_RUN_NAME_MAX_BYTES,
@@ -1921,4 +1921,4 @@ export {
1921
1921
  compileFabricSummary,
1922
1922
  registerCompactionHook
1923
1923
  };
1924
- //# sourceMappingURL=chunk-QLJ5P7HV.js.map
1924
+ //# sourceMappingURL=chunk-JJZFNBB7.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  compileFabricSummary,
3
3
  rawContextTokens
4
- } from "./chunk-QLJ5P7HV.js";
4
+ } from "./chunk-JJZFNBB7.js";
5
5
  import {
6
6
  compactionRequestBoundsError,
7
7
  encodeCompactionRequest
@@ -444,4 +444,4 @@ export {
444
444
  buildPeerCards,
445
445
  awaitPeerSettle
446
446
  };
447
- //# sourceMappingURL=chunk-IWH6PCMK.js.map
447
+ //# sourceMappingURL=chunk-R7G4HXVD.js.map
@@ -5,8 +5,17 @@ import {
5
5
  // src/ui/highlight.ts
6
6
  import { readFileSync, statSync } from "node:fs";
7
7
  import { basename, extname } from "node:path";
8
- import { bundledLanguages } from "shiki/langs";
9
- import { bundledThemesInfo } from "shiki/themes";
8
+
9
+ // src/ui/shiki-catalog.ts
10
+ import { createRequire } from "node:module";
11
+ var require2 = createRequire(import.meta.url);
12
+ var languages;
13
+ var themeTypes;
14
+ var shikiLanguages = () => languages ??= require2("shiki/langs").bundledLanguages;
15
+ var shikiThemeType = (id) => {
16
+ themeTypes ??= new Map(require2("shiki/themes").bundledThemesInfo.map((theme) => [theme.id, theme.type]));
17
+ return themeTypes.get(id);
18
+ };
10
19
 
11
20
  // src/ui/shiki-theme.ts
12
21
  var THEME_IMPORTS = {
@@ -220,7 +229,6 @@ var EXTENSION_ALIASES = /* @__PURE__ */ new Map([
220
229
  [".prisma", "prisma"],
221
230
  [".dockerfile", "dockerfile"]
222
231
  ]);
223
- var THEME_TYPE = new Map(bundledThemesInfo.map((theme) => [theme.id, theme.type]));
224
232
  var LOW_CONTRAST_FALLBACK = "\x1B[38;2;139;148;158m";
225
233
  var highlighter;
226
234
  var readyTheme;
@@ -324,22 +332,22 @@ function observePiTheme(theme) {
324
332
  const variant = classifyPiTheme(theme);
325
333
  if (variant) syncEffectiveTheme(themePreference, variant);
326
334
  }
327
- var effectiveShikiThemeIsLight = () => THEME_TYPE.get(currentTheme) === "light";
335
+ var effectiveShikiThemeIsLight = () => shikiThemeType(currentTheme) === "light";
328
336
  var observedThemeVariant = () => observedVariant;
329
337
  function languageFromPath(filePath) {
330
338
  if (!filePath) return void 0;
331
339
  const name = basename(filePath).toLowerCase();
332
340
  if (name.startsWith(".env")) {
333
341
  const candidate = "dotenv";
334
- return candidate in bundledLanguages ? candidate : void 0;
342
+ return candidate in shikiLanguages() ? candidate : void 0;
335
343
  }
336
344
  if (name === "dockerfile" || name.startsWith("dockerfile.")) {
337
- return "dockerfile" in bundledLanguages ? "dockerfile" : void 0;
345
+ return "dockerfile" in shikiLanguages() ? "dockerfile" : void 0;
338
346
  }
339
347
  const exact = EXACT_BASENAMES.get(name);
340
- if (exact && exact in bundledLanguages) return exact;
348
+ if (exact && exact in shikiLanguages()) return exact;
341
349
  const byExt = EXTENSION_ALIASES.get(extname(name));
342
- return byExt && byExt in bundledLanguages ? byExt : void 0;
350
+ return byExt && byExt in shikiLanguages() ? byExt : void 0;
343
351
  }
344
352
  function configureHighlighting(themePreferenceValue, syntaxEnabled = true) {
345
353
  const preference = themePreferenceValue.trim() || "auto";
@@ -446,7 +454,7 @@ var isLowContrastFg = (params) => {
446
454
  return luminance < 72;
447
455
  };
448
456
  var normalizeContrast = (ansi) => {
449
- if (THEME_TYPE.get(currentTheme) === "light") return ansi;
457
+ if (shikiThemeType(currentTheme) === "light") return ansi;
450
458
  return ansi.replace(
451
459
  /\x1b\[([0-9;]*)m/g,
452
460
  (seq, params) => isLowContrastFg(params) ? LOW_CONTRAST_FALLBACK : seq
@@ -514,7 +522,7 @@ function highlightCode(text, lang, invalidate) {
514
522
  return null;
515
523
  }
516
524
  const shikiLang = normalizeLanguage(lang);
517
- if (!(shikiLang in bundledLanguages)) return null;
525
+ if (!(shikiLang in shikiLanguages())) return null;
518
526
  const cacheKey = `${currentTheme}\0${shikiLang}\0${text.length}\0${hashString(text)}`;
519
527
  const cached = renderCache.get(cacheKey);
520
528
  if (cached) {
@@ -654,7 +662,7 @@ function highlightFileLines(filePath, lang, from, to, invalidate) {
654
662
  return null;
655
663
  }
656
664
  const shikiLang = normalizeLanguage(lang);
657
- if (!(shikiLang in bundledLanguages)) return null;
665
+ if (!(shikiLang in shikiLanguages())) return null;
658
666
  if (!loadedLanguages.has(shikiLang)) {
659
667
  requestLanguageLoad(shikiLang, invalidate);
660
668
  return null;
@@ -714,7 +722,7 @@ function highlightSourceLines(cacheKey, sourceLines, lang, from, to, invalidate)
714
722
  return null;
715
723
  }
716
724
  const shikiLang = normalizeLanguage(lang);
717
- if (!(shikiLang in bundledLanguages)) return null;
725
+ if (!(shikiLang in shikiLanguages())) return null;
718
726
  if (!loadedLanguages.has(shikiLang)) {
719
727
  requestLanguageLoad(shikiLang, invalidate);
720
728
  return null;
@@ -764,6 +772,7 @@ var fileHighlightRange = (entry, from, to, invalidate) => {
764
772
  };
765
773
 
766
774
  export {
775
+ shikiLanguages,
767
776
  ansi256ToRgb,
768
777
  observePiTheme,
769
778
  effectiveShikiThemeIsLight,
@@ -774,4 +783,4 @@ export {
774
783
  highlightFileLines,
775
784
  highlightSourceLines
776
785
  };
777
- //# sourceMappingURL=chunk-ZZ4LHQYJ.js.map
786
+ //# sourceMappingURL=chunk-RTXZHKMS.js.map
@@ -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
- } from "./chunk-ZZ4LHQYJ.js";
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-U3FNEK2H.js";
23
+ } from "./chunk-2462VF6I.js";
23
24
 
24
25
  // src/ui/structured.ts
25
- import { stringify } from "yaml";
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 = (yaml, sections, maxChars) => {
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 = yaml.length + separators + headers.reduce((sum, header) => sum + header.length, 0);
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 `${yaml}
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 yaml = formatJsonAsYaml(skeleton);
123
- if (yaml !== void 0) {
124
- if (sections.length === 0) return { text: yaml, language: "yaml" };
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(yaml, sections, maxChars),
129
+ text: renderHoistedSections(yaml2, sections, maxChars),
127
130
  language: "yaml",
128
- highlightedLineCount: countNewlines(yaml) + 1
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 bundledLanguages) return language;
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-YSXGVO2N.js.map
4220
+ //# sourceMappingURL=chunk-VIBQBYJ6.js.map