@quandev104/pi-style 0.1.1

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 (69) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +193 -0
  4. package/dist/extensions/pi-style.js +7897 -0
  5. package/dist/extensions/pi-style.js.map +1 -0
  6. package/extension-src/pi-style/app/command-service.ts +244 -0
  7. package/extension-src/pi-style/app/commands.ts +12 -0
  8. package/extension-src/pi-style/app/config-storage.ts +98 -0
  9. package/extension-src/pi-style/app/doctor.ts +53 -0
  10. package/extension-src/pi-style/app/index.ts +322 -0
  11. package/extension-src/pi-style/app/providers.ts +268 -0
  12. package/extension-src/pi-style/app/render-scheduler.ts +48 -0
  13. package/extension-src/pi-style/app/runtime.ts +404 -0
  14. package/extension-src/pi-style/app/snapshot.ts +15 -0
  15. package/extension-src/pi-style/domain/capabilities.ts +34 -0
  16. package/extension-src/pi-style/domain/config-authorization.ts +20 -0
  17. package/extension-src/pi-style/domain/config-diagnostics.ts +20 -0
  18. package/extension-src/pi-style/domain/config-diff.ts +30 -0
  19. package/extension-src/pi-style/domain/config-migrations.ts +52 -0
  20. package/extension-src/pi-style/domain/config-normalization.ts +567 -0
  21. package/extension-src/pi-style/domain/config-presets.ts +51 -0
  22. package/extension-src/pi-style/domain/config-types.ts +115 -0
  23. package/extension-src/pi-style/domain/providers.ts +37 -0
  24. package/extension-src/pi-style/domain/status-presets.ts +60 -0
  25. package/extension-src/pi-style/domain/status-renderer.ts +142 -0
  26. package/extension-src/pi-style/domain/status.ts +430 -0
  27. package/extension-src/pi-style/domain/theme.ts +232 -0
  28. package/extension-src/pi-style/features/.gitkeep +0 -0
  29. package/extension-src/pi-style/features/editor/index.ts +304 -0
  30. package/extension-src/pi-style/features/messages/boxed-block.ts +74 -0
  31. package/extension-src/pi-style/features/messages/index.ts +145 -0
  32. package/extension-src/pi-style/features/messages/special-blocks.ts +281 -0
  33. package/extension-src/pi-style/features/startup/index.ts +564 -0
  34. package/extension-src/pi-style/features/startup/logo.ts +151 -0
  35. package/extension-src/pi-style/features/status-line/index.ts +319 -0
  36. package/extension-src/pi-style/features/tools/boxed/bash.ts +347 -0
  37. package/extension-src/pi-style/features/tools/boxed/edit.ts +113 -0
  38. package/extension-src/pi-style/features/tools/boxed/fallback.ts +67 -0
  39. package/extension-src/pi-style/features/tools/boxed/find.ts +65 -0
  40. package/extension-src/pi-style/features/tools/boxed/grep.ts +108 -0
  41. package/extension-src/pi-style/features/tools/boxed/index.ts +64 -0
  42. package/extension-src/pi-style/features/tools/boxed/ls.ts +65 -0
  43. package/extension-src/pi-style/features/tools/boxed/quick-edit.ts +190 -0
  44. package/extension-src/pi-style/features/tools/boxed/read.ts +204 -0
  45. package/extension-src/pi-style/features/tools/boxed/session-config.ts +45 -0
  46. package/extension-src/pi-style/features/tools/boxed/shared.ts +157 -0
  47. package/extension-src/pi-style/features/tools/boxed/write.ts +89 -0
  48. package/extension-src/pi-style/features/tools/index.ts +480 -0
  49. package/extension-src/pi-style/pi/commands.ts +17 -0
  50. package/extension-src/pi-style/pi/compatibility-coordinator.ts +195 -0
  51. package/extension-src/pi-style/pi/compatibility-probe.ts +645 -0
  52. package/extension-src/pi-style/pi/compatibility-registry.ts +329 -0
  53. package/extension-src/pi-style/pi/config-host.ts +52 -0
  54. package/extension-src/pi-style/pi/config-session.ts +105 -0
  55. package/extension-src/pi-style/pi/index.ts +77 -0
  56. package/extension-src/pi-style/pi/operational-state.ts +29 -0
  57. package/extension-src/pi-style/pi/session-coordinator.ts +187 -0
  58. package/extension-src/pi-style/pi/session-usage.ts +62 -0
  59. package/extension-src/pi-style/pi/startup-resources.ts +70 -0
  60. package/extension-src/pi-style/shared/.gitkeep +0 -0
  61. package/extension-src/pi-style/shared/ansi.ts +386 -0
  62. package/extension-src/pi-style/shared/box.ts +805 -0
  63. package/extension-src/pi-style/shared/disposable-store.ts +28 -0
  64. package/extension-src/pi-style/shared/elapsed.ts +88 -0
  65. package/extension-src/pi-style/shared/render-budget.ts +367 -0
  66. package/extension-src/pi-style/shared/split-diff.ts +692 -0
  67. package/extension-src/pi-style/shared/theme-extras.ts +292 -0
  68. package/package.json +68 -0
  69. package/themes/.gitkeep +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../extension-src/pi-style/domain/config-diagnostics.ts","../../extension-src/pi-style/domain/config-presets.ts","../../extension-src/pi-style/domain/config-types.ts","../../extension-src/pi-style/domain/status-presets.ts","../../extension-src/pi-style/domain/config-normalization.ts","../../extension-src/pi-style/domain/config-migrations.ts","../../extension-src/pi-style/app/config-storage.ts","../../extension-src/pi-style/app/command-service.ts","../../extension-src/pi-style/app/commands.ts","../../extension-src/pi-style/pi/config-host.ts","../../extension-src/pi-style/pi/commands.ts","../../extension-src/pi-style/pi/session-coordinator.ts","../../extension-src/pi-style/app/doctor.ts","../../extension-src/pi-style/domain/config-diff.ts","../../extension-src/pi-style/domain/status.ts","../../extension-src/pi-style/features/editor/index.ts","../../extension-src/pi-style/domain/theme.ts","../../extension-src/pi-style/shared/ansi.ts","../../extension-src/pi-style/features/startup/logo.ts","../../extension-src/pi-style/features/startup/index.ts","../../extension-src/pi-style/domain/status-renderer.ts","../../extension-src/pi-style/features/status-line/index.ts","../../extension-src/pi-style/shared/disposable-store.ts","../../extension-src/pi-style/app/providers.ts","../../extension-src/pi-style/app/render-scheduler.ts","../../extension-src/pi-style/app/snapshot.ts","../../extension-src/pi-style/app/runtime.ts","../../extension-src/pi-style/app/index.ts","../../extension-src/pi-style/features/messages/special-blocks.ts","../../extension-src/pi-style/shared/theme-extras.ts","../../extension-src/pi-style/shared/box.ts","../../extension-src/pi-style/shared/elapsed.ts","../../extension-src/pi-style/shared/render-budget.ts","../../extension-src/pi-style/features/messages/boxed-block.ts","../../extension-src/pi-style/features/tools/boxed/session-config.ts","../../extension-src/pi-style/domain/config-authorization.ts","../../extension-src/pi-style/pi/compatibility-probe.ts","../../extension-src/pi-style/features/messages/index.ts","../../extension-src/pi-style/features/tools/index.ts","../../extension-src/pi-style/features/tools/boxed/bash.ts","../../extension-src/pi-style/features/tools/boxed/shared.ts","../../extension-src/pi-style/features/tools/boxed/edit.ts","../../extension-src/pi-style/shared/split-diff.ts","../../extension-src/pi-style/features/tools/boxed/fallback.ts","../../extension-src/pi-style/features/tools/boxed/find.ts","../../extension-src/pi-style/features/tools/boxed/grep.ts","../../extension-src/pi-style/features/tools/boxed/ls.ts","../../extension-src/pi-style/features/tools/boxed/quick-edit.ts","../../extension-src/pi-style/features/tools/boxed/read.ts","../../extension-src/pi-style/features/tools/boxed/write.ts","../../extension-src/pi-style/features/tools/boxed/index.ts","../../extension-src/pi-style/pi/compatibility-registry.ts","../../extension-src/pi-style/pi/compatibility-coordinator.ts","../../extension-src/pi-style/pi/config-session.ts","../../extension-src/pi-style/pi/operational-state.ts","../../extension-src/pi-style/pi/startup-resources.ts","../../extension-src/pi-style/pi/session-usage.ts","../../extension-src/pi-style/pi/index.ts"],"sourcesContent":["export type ConfigDiagnosticLevel = \"warning\" | \"error\";\nexport interface ConfigDiagnostic {\n\treadonly code: string;\n\treadonly level: ConfigDiagnosticLevel;\n\treadonly path: string;\n\treadonly message: string;\n}\n\nexport function boundedDiagnostics(items: readonly ConfigDiagnostic[], limit = 32): readonly ConfigDiagnostic[] {\n\tconst seen = new Set<string>();\n\tconst result: ConfigDiagnostic[] = [];\n\tfor (const item of items) {\n\t\tconst key = `${item.level}:${item.code}:${item.path}:${item.message}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(Object.freeze(item));\n\t\tif (result.length >= limit) break;\n\t}\n\treturn Object.freeze(result);\n}\n","import type { PiStyleConfig, PresetName } from \"./config-types.js\";\n\n/** Code-defined coordinated defaults. Explicit fields are merged after these values. */\nexport const CONFIG_PRESETS: Readonly<Record<PresetName, Readonly<PiStyleConfig>>> = Object.freeze({\n\tdefault: Object.freeze({\n\t\tstartup: { mode: \"compact\" },\n\t}),\n\tminimal: Object.freeze({\n\t\tstatusLine: { layout: { left: [\"path\", \"git\"], right: [\"context_pct\"], secondary: [] } },\n\t\teditor: { style: \"native\", frame: \"native\", showMetadata: false },\n\t\tstartup: { mode: \"off\" },\n\t\tmessages: { enabled: false },\n\t\ttools: { enabled: false },\n\t\ttheme: { terminalBackgroundSync: \"off\" },\n\t}),\n\tcompact: Object.freeze({\n\t\tstatusLine: {\n\t\t\tlayout: { left: [\"model\", \"thinking\", \"git\"], right: [\"context_pct\"], secondary: [\"extension_statuses\"] },\n\t\t},\n\t\teditor: { style: \"compact\", frame: \"auto\", showMetadata: false },\n\t\tstartup: { mode: \"compact\" },\n\t}),\n\tfull: Object.freeze({\n\t\tstatusLine: {\n\t\t\tlayout: {\n\t\t\t\tleft: [\"hostname\", \"model\", \"thinking\", \"path\", \"git\", \"session\"],\n\t\t\t\tright: [\"token_in\", \"token_out\", \"cache_read\", \"cost\", \"context_pct\", \"time_spent\", \"time\"],\n\t\t\t\tsecondary: [\"extension_statuses\"],\n\t\t\t},\n\t\t},\n\t\teditor: { style: \"boxed\", frame: \"outline\", showMetadata: true },\n\t\tstartup: { mode: \"overlay\", showResources: true },\n\t}),\n\tascii: Object.freeze({\n\t\teditor: { style: \"compact\", frame: \"auto\" },\n\t\tstartup: { mode: \"compact\" },\n\t\ttheme: { nerdFonts: \"off\", terminalBackgroundSync: \"off\" },\n\t}),\n\tnative: Object.freeze({\n\t\tstatusLine: { layout: { left: [\"model\", \"path\"], right: [\"context_pct\"], secondary: [] } },\n\t\teditor: { style: \"native\", frame: \"native\", showMetadata: false },\n\t\tstartup: { mode: \"off\" },\n\t\tmessages: { enabled: false },\n\t\ttools: { enabled: false },\n\t\ttheme: { terminalBackgroundSync: \"off\" },\n\t}),\n});\n\nexport function presetConfig(name: unknown): Readonly<PiStyleConfig> {\n\treturn CONFIG_PRESETS[(typeof name === \"string\" && name in CONFIG_PRESETS ? name : \"default\") as PresetName];\n}\n","export const PI_STYLE_SCHEMA_VERSION = 1 as const;\n\nexport type Placement = \"above\" | \"below\";\nexport type NerdFontsMode = \"auto\" | \"on\" | \"off\";\nexport type ToggleMode = \"auto\" | \"on\" | \"off\";\nexport type PresetName = \"default\" | \"minimal\" | \"compact\" | \"full\" | \"ascii\" | \"native\";\nexport type EditorStyle = \"compact\" | \"boxed\" | \"dock\" | \"native\";\nexport type EditorFrame = \"auto\" | \"halfblock\" | \"line\" | \"solid\" | \"outline\" | \"native\";\n\nexport interface StatusCustomItemConfig {\n\tid: string;\n\tstatusKey: string;\n\tlabel?: string;\n\tpriority?: number;\n\tplacement?: \"left\" | \"right\" | \"secondary\";\n}\n\nexport interface PiStyleConfig {\n\tenabled?: boolean;\n\tpreset?: string;\n\tplacement?: string;\n\tstartup?: { mode?: string; showResources?: boolean; alwaysExpanded?: boolean };\n\tstatusLine?: {\n\t\tenabled?: boolean;\n\t\tseparator?: string;\n\t\tlayout?: { left?: string[]; right?: string[]; secondary?: string[] };\n\t\tdisabledSegments?: string[];\n\t\tcustomItems?: StatusCustomItemConfig[];\n\t\t/** Blank rows reserved below the primary status row (0 disables). */\n\t\tbottomMargin?: number;\n\t\t/** Context progress-bar cell count (default 10). */\n\t\tcontextBarWidth?: number;\n\t};\n\teditor?: { enabled?: boolean; style?: string; frame?: string; showMetadata?: boolean };\n\tmessages?: { enabled?: boolean; userPrefix?: boolean; assistantPrefix?: boolean; specialBlocks?: boolean };\n\ttools?: {\n\t\tenabled?: boolean;\n\t\tstyle?: string;\n\t\tmaxCollapsedLines?: number;\n\t\tmaxExpandedLines?: number;\n\t\tdimOutput?: boolean;\n\t\tshowElapsed?: boolean;\n\t};\n\ttheme?: {\n\t\tnerdFonts?: string;\n\t\tterminalBackgroundSync?: string;\n\t\tcolors?: Record<string, unknown>;\n\t\tglyphs?: Record<string, unknown>;\n\t};\n\tcompatibility?: {\n\t\tallowSafePatches?: boolean;\n\t\tallowCorePatches?: boolean;\n\t\tpreferExistingEditor?: boolean;\n\t\tpreferExistingFooter?: boolean;\n\t};\n\tdebug?: boolean;\n\tschemaVersion?: number;\n}\n\nexport interface NormalizedPiStyleConfig {\n\treadonly schemaVersion: typeof PI_STYLE_SCHEMA_VERSION;\n\treadonly enabled: boolean;\n\treadonly preset: PresetName;\n\treadonly placement: Placement;\n\treadonly startup: {\n\t\tmode: \"off\" | \"compact\" | \"overlay\";\n\t\tshowResources: boolean;\n\t\talwaysExpanded: boolean;\n\t};\n\treadonly statusLine: {\n\t\tenabled: boolean;\n\t\tseparator: string;\n\t\tlayout: { left: readonly string[]; right: readonly string[]; secondary: readonly string[] };\n\t\tdisabledSegments: readonly string[];\n\t\tcustomItems: readonly StatusCustomItemConfig[];\n\t\t/** Blank rows reserved below the primary status row (0 disables). */\n\t\tbottomMargin: number;\n\t\t/** Context progress-bar cell count. */\n\t\tcontextBarWidth: number;\n\t};\n\treadonly editor: { enabled: boolean; style: EditorStyle; frame: EditorFrame; showMetadata: boolean };\n\treadonly messages: { enabled: boolean; userPrefix: boolean; assistantPrefix: boolean; specialBlocks: boolean };\n\treadonly tools: {\n\t\tenabled: boolean;\n\t\tstyle: string;\n\t\tmaxCollapsedLines: number;\n\t\tmaxExpandedLines: number;\n\t\tdimOutput: boolean;\n\t\tshowElapsed: boolean;\n\t};\n\treadonly theme: {\n\t\tnerdFonts: NerdFontsMode;\n\t\tterminalBackgroundSync: ToggleMode;\n\t\tcolors: Readonly<Record<string, string>>;\n\t\tglyphs: Readonly<Record<string, string>>;\n\t};\n\treadonly compatibility: {\n\t\tallowSafePatches: boolean;\n\t\tallowCorePatches: boolean;\n\t\tpreferExistingEditor: boolean;\n\t\tpreferExistingFooter: boolean;\n\t};\n\t/** Internal provenance marker; never serialized or accepted as a command field. */\n\treadonly productCorePatchesExplicit?: boolean;\n\treadonly debug: boolean;\n}\n\nexport interface ConfigSources {\n\tdefaults?: unknown;\n\tglobal?: unknown;\n\tproject?: unknown;\n\tenvironment?: Record<string, string | undefined>;\n\tsession?: unknown;\n\tprojectTrusted?: boolean;\n}\n","import type { PresetName } from \"./config-types.js\";\nimport type { StatusLayout, StatusSegmentId } from \"./status.js\";\n\nexport const STATUS_PRESETS: Readonly<Record<PresetName, StatusLayout>> = Object.freeze({\n\tdefault: Object.freeze({\n\t\tleft: [\"path\", \"git\", \"context_bar\", \"cost\"],\n\t\tright: [\"model_effort\"],\n\t\tsecondary: [\"extension_statuses\"],\n\t}),\n\tminimal: Object.freeze({ left: [\"path\", \"git\"], right: [\"context_pct\"], secondary: [] }),\n\tcompact: Object.freeze({\n\t\tleft: [\"model\", \"thinking\", \"git\"],\n\t\tright: [\"context_pct\"],\n\t\tsecondary: [\"extension_statuses\"],\n\t}),\n\tfull: Object.freeze({\n\t\tleft: [\"hostname\", \"model\", \"thinking\", \"path\", \"git\", \"session\"],\n\t\tright: [\"token_in\", \"token_out\", \"cache_read\", \"cost\", \"context_pct\", \"time_spent\", \"time\"],\n\t\tsecondary: [\"extension_statuses\"],\n\t}),\n\tascii: Object.freeze({\n\t\tleft: [\"path\", \"git\", \"context_bar\", \"cost\"],\n\t\tright: [\"model_effort\"],\n\t\tsecondary: [\"extension_statuses\"],\n\t}),\n\tnative: Object.freeze({ left: [\"model\", \"path\"], right: [\"context_pct\"], secondary: [] }),\n});\n\nfunction unique(values: readonly unknown[]): StatusSegmentId[] {\n\tconst result: StatusSegmentId[] = [];\n\tfor (const value of values) {\n\t\tif (typeof value !== \"string\" || result.includes(value)) continue;\n\t\tresult.push(value);\n\t}\n\treturn result;\n}\n\nexport function normalizeStatusLayout(\n\tpreset: PresetName,\n\tinput:\n\t\t| {\n\t\t\t\tleft?: readonly unknown[] | undefined;\n\t\t\t\tright?: readonly unknown[] | undefined;\n\t\t\t\tsecondary?: readonly unknown[] | undefined;\n\t\t }\n\t\t| undefined,\n): StatusLayout {\n\tconst base = STATUS_PRESETS[preset] ?? STATUS_PRESETS.default;\n\tconst left = input?.left === undefined ? base.left : unique(input.left);\n\tconst right = input?.right === undefined ? base.right : unique(input.right);\n\tconst secondary = input?.secondary === undefined ? base.secondary : unique(input.secondary);\n\tconst seen = new Set<StatusSegmentId>();\n\tconst dedupe = (values: readonly StatusSegmentId[]) =>\n\t\tvalues.filter((value) => {\n\t\t\tif (seen.has(value)) return false;\n\t\t\tseen.add(value);\n\t\t\treturn true;\n\t\t});\n\treturn Object.freeze({ left: dedupe(left), right: dedupe(right), secondary: dedupe(secondary) });\n}\n","import { boundedDiagnostics, type ConfigDiagnostic } from \"./config-diagnostics.js\";\nimport { presetConfig } from \"./config-presets.js\";\nimport {\n\ttype ConfigSources,\n\ttype NormalizedPiStyleConfig,\n\tPI_STYLE_SCHEMA_VERSION,\n\ttype PiStyleConfig,\n} from \"./config-types.js\";\nimport { normalizeStatusLayout } from \"./status-presets.js\";\n\nexport const DEFAULT_CONFIG: NormalizedPiStyleConfig = Object.freeze({\n\tschemaVersion: PI_STYLE_SCHEMA_VERSION,\n\tenabled: true,\n\tpreset: \"default\",\n\tplacement: \"below\",\n\tstartup: Object.freeze({ mode: \"compact\", showResources: false, alwaysExpanded: false }),\n\tstatusLine: Object.freeze({\n\t\tenabled: true,\n\t\tseparator: \"powerline-thin\",\n\t\tlayout: Object.freeze({\n\t\t\tleft: [\"path\", \"git\", \"context_bar\", \"cost\"],\n\t\t\tright: [\"model_effort\"],\n\t\t\tsecondary: [],\n\t\t}),\n\t\tdisabledSegments: [],\n\t\tcustomItems: [],\n\t\tbottomMargin: 1,\n\t\tcontextBarWidth: 10,\n\t}),\n\teditor: Object.freeze({ enabled: true, style: \"compact\", frame: \"auto\", showMetadata: false }),\n\tmessages: Object.freeze({ enabled: true, userPrefix: true, assistantPrefix: true, specialBlocks: true }),\n\ttools: Object.freeze({\n\t\tenabled: true,\n\t\tstyle: \"compact-box\",\n\t\tmaxCollapsedLines: 10,\n\t\tmaxExpandedLines: 50,\n\t\tdimOutput: false,\n\t\tshowElapsed: true,\n\t}),\n\ttheme: Object.freeze({ nerdFonts: \"auto\", terminalBackgroundSync: \"auto\", colors: {}, glyphs: {} }),\n\tcompatibility: Object.freeze({\n\t\tallowSafePatches: true,\n\t\tallowCorePatches: false,\n\t\tpreferExistingEditor: true,\n\t\tpreferExistingFooter: true,\n\t}),\n\tdebug: false,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction merge(base: Record<string, unknown>, source: unknown): Record<string, unknown> {\n\tif (!isRecord(source)) return base;\n\tconst result: Record<string, unknown> = { ...base };\n\tfor (const [key, value] of Object.entries(source))\n\t\tresult[key] =\n\t\t\tisRecord(value) && isRecord(result[key]) ? merge(result[key] as Record<string, unknown>, value) : value;\n\treturn result;\n}\nfunction bool(value: unknown, fallback: boolean): boolean {\n\treturn typeof value === \"boolean\" ? value : fallback;\n}\nfunction boundedInt(value: unknown, fallback: number, min: number, max: number): number {\n\treturn typeof value === \"number\" && Number.isFinite(value)\n\t\t? Math.min(max, Math.max(min, Math.floor(value)))\n\t\t: fallback;\n}\nfunction stringEnum<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n\treturn typeof value === \"string\" && (allowed as readonly string[]).includes(value) ? (value as T) : fallback;\n}\nfunction strings(value: unknown, fallback: readonly string[]): readonly string[] {\n\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\") ? [...value] : fallback;\n}\nfunction stringMap(value: unknown): Readonly<Record<string, string>> {\n\treturn isRecord(value)\n\t\t? Object.fromEntries(\n\t\t\t\tObject.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === \"string\"),\n\t\t\t)\n\t\t: {};\n}\nfunction customItems(value: unknown): readonly import(\"./config-types.js\").StatusCustomItemConfig[] {\n\tif (!Array.isArray(value)) return [];\n\treturn value.filter((item): item is import(\"./config-types.js\").StatusCustomItemConfig => {\n\t\tif (!isRecord(item) || typeof item.id !== \"string\" || typeof item.statusKey !== \"string\") return false;\n\t\treturn item.placement === undefined || [\"left\", \"right\", \"secondary\"].includes(item.placement as string);\n\t});\n}\n\nexport function normalizeConfig(\n\tinput: unknown,\n\tdefaults: NormalizedPiStyleConfig = DEFAULT_CONFIG,\n): NormalizedPiStyleConfig {\n\tconst value = merge(defaults as unknown as Record<string, unknown>, acceptedInput(input));\n\tconst inputRecord = isRecord(input) ? input : {};\n\tconst inputStatus = isRecord(inputRecord.statusLine) ? inputRecord.statusLine : {};\n\tconst inputLayout = isRecord(inputStatus.layout) ? inputStatus.layout : undefined;\n\tconst startup = isRecord(value.startup) ? value.startup : {};\n\tconst status = isRecord(value.statusLine) ? value.statusLine : {};\n\tconst editor = isRecord(value.editor) ? value.editor : {};\n\tconst messages = isRecord(value.messages) ? value.messages : {};\n\tconst tools = isRecord(value.tools) ? value.tools : {};\n\tconst theme = isRecord(value.theme) ? value.theme : {};\n\tconst compatibility = isRecord(value.compatibility) ? value.compatibility : {};\n\tconst max =\n\t\ttypeof tools.maxCollapsedLines === \"number\" &&\n\t\tNumber.isFinite(tools.maxCollapsedLines) &&\n\t\ttools.maxCollapsedLines >= 0\n\t\t\t? Math.floor(tools.maxCollapsedLines)\n\t\t\t: defaults.tools.maxCollapsedLines;\n\tconst maxExpanded =\n\t\ttypeof tools.maxExpandedLines === \"number\" && Number.isFinite(tools.maxExpandedLines) && tools.maxExpandedLines >= 0\n\t\t\t? Math.min(Math.floor(tools.maxExpandedLines), 1000)\n\t\t\t: defaults.tools.maxExpandedLines;\n\treturn Object.freeze({\n\t\tschemaVersion: PI_STYLE_SCHEMA_VERSION,\n\t\tenabled: bool(value.enabled, defaults.enabled),\n\t\tpreset: stringEnum(value.preset, [\"default\", \"minimal\", \"compact\", \"full\", \"ascii\", \"native\"], defaults.preset),\n\t\tplacement: stringEnum(value.placement, [\"above\", \"below\"], defaults.placement),\n\t\tstartup: Object.freeze({\n\t\t\tmode: stringEnum(startup.mode, [\"off\", \"compact\", \"overlay\"], defaults.startup.mode),\n\t\t\tshowResources: bool(startup.showResources, defaults.startup.showResources),\n\t\t\talwaysExpanded: bool(startup.alwaysExpanded, defaults.startup.alwaysExpanded),\n\t\t}),\n\t\tstatusLine: Object.freeze({\n\t\t\tenabled: bool(status.enabled, defaults.statusLine.enabled),\n\t\t\tseparator: typeof status.separator === \"string\" ? status.separator : defaults.statusLine.separator,\n\t\t\tlayout: normalizeStatusLayout(\n\t\t\t\tstringEnum(value.preset, [\"default\", \"minimal\", \"compact\", \"full\", \"ascii\", \"native\"], defaults.preset),\n\t\t\t\tinputLayout\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tleft:\n\t\t\t\t\t\t\t\tinputLayout.left === undefined ? undefined : strings(inputLayout.left, defaults.statusLine.layout.left),\n\t\t\t\t\t\t\tright:\n\t\t\t\t\t\t\t\tinputLayout.right === undefined\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: strings(inputLayout.right, defaults.statusLine.layout.right),\n\t\t\t\t\t\t\tsecondary:\n\t\t\t\t\t\t\t\tinputLayout.secondary === undefined\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: strings(inputLayout.secondary, defaults.statusLine.layout.secondary),\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t\tdisabledSegments: strings(status.disabledSegments, defaults.statusLine.disabledSegments),\n\t\t\tcustomItems: customItems(status.customItems),\n\t\t\tbottomMargin: boundedInt(status.bottomMargin, defaults.statusLine.bottomMargin, 0, 4),\n\t\t\tcontextBarWidth: boundedInt(status.contextBarWidth, defaults.statusLine.contextBarWidth, 4, 40),\n\t\t}),\n\t\teditor: Object.freeze({\n\t\t\tenabled: bool(editor.enabled, defaults.editor.enabled),\n\t\t\tstyle: stringEnum(editor.style, [\"compact\", \"boxed\", \"dock\", \"native\"], defaults.editor.style),\n\t\t\tframe: stringEnum(\n\t\t\t\teditor.frame,\n\t\t\t\t[\"auto\", \"halfblock\", \"line\", \"solid\", \"outline\", \"native\"],\n\t\t\t\tdefaults.editor.frame,\n\t\t\t),\n\t\t\tshowMetadata: bool(editor.showMetadata, defaults.editor.showMetadata),\n\t\t}),\n\t\tmessages: Object.freeze({\n\t\t\tenabled: bool(messages.enabled, defaults.messages.enabled),\n\t\t\tuserPrefix: bool(messages.userPrefix, defaults.messages.userPrefix),\n\t\t\tassistantPrefix: bool(messages.assistantPrefix, defaults.messages.assistantPrefix),\n\t\t\tspecialBlocks: bool(messages.specialBlocks, defaults.messages.specialBlocks),\n\t\t}),\n\t\ttools: Object.freeze({\n\t\t\tenabled: bool(tools.enabled, defaults.tools.enabled),\n\t\t\tstyle: typeof tools.style === \"string\" ? tools.style : defaults.tools.style,\n\t\t\tmaxCollapsedLines: max,\n\t\t\tmaxExpandedLines: maxExpanded,\n\t\t\tdimOutput: bool(tools.dimOutput, defaults.tools.dimOutput),\n\t\t\tshowElapsed: bool(tools.showElapsed, defaults.tools.showElapsed),\n\t\t}),\n\t\ttheme: Object.freeze({\n\t\t\tnerdFonts: stringEnum(theme.nerdFonts, [\"auto\", \"on\", \"off\"], defaults.theme.nerdFonts),\n\t\t\tterminalBackgroundSync: stringEnum(\n\t\t\t\ttheme.terminalBackgroundSync,\n\t\t\t\t[\"auto\", \"on\", \"off\"],\n\t\t\t\tdefaults.theme.terminalBackgroundSync,\n\t\t\t),\n\t\t\tcolors: stringMap(theme.colors),\n\t\t\tglyphs: stringMap(theme.glyphs),\n\t\t}),\n\t\tcompatibility: Object.freeze({\n\t\t\tallowSafePatches: bool(compatibility.allowSafePatches, defaults.compatibility.allowSafePatches),\n\t\t\tallowCorePatches: bool(compatibility.allowCorePatches, defaults.compatibility.allowCorePatches),\n\t\t\tpreferExistingEditor: bool(compatibility.preferExistingEditor, defaults.compatibility.preferExistingEditor),\n\t\t\tpreferExistingFooter: bool(compatibility.preferExistingFooter, defaults.compatibility.preferExistingFooter),\n\t\t}),\n\t\tdebug: bool(value.debug, defaults.debug),\n\t});\n}\n\nexport function resolveConfig(sources: ConfigSources): NormalizedPiStyleConfig {\n\treturn resolveConfigDetailed(sources).config;\n}\n\nconst PRESET_NAMES = [\"default\", \"minimal\", \"compact\", \"full\", \"ascii\", \"native\"] as const;\nconst ENUMS: Readonly<Record<string, readonly string[]>> = {\n\tpreset: PRESET_NAMES,\n\tplacement: [\"above\", \"below\"],\n\t\"startup.mode\": [\"off\", \"compact\", \"overlay\"],\n\t\"editor.style\": [\"compact\", \"boxed\", \"dock\", \"native\"],\n\t\"editor.frame\": [\"auto\", \"halfblock\", \"line\", \"solid\", \"outline\", \"native\"],\n\t\"theme.nerdFonts\": [\"auto\", \"on\", \"off\"],\n\t\"theme.terminalBackgroundSync\": [\"auto\", \"on\", \"off\"],\n};\nconst BOOL_PATHS = new Set([\n\t\"enabled\",\n\t\"startup.showResources\",\n\t\"startup.alwaysExpanded\",\n\t\"statusLine.enabled\",\n\t\"editor.enabled\",\n\t\"editor.showMetadata\",\n\t\"messages.enabled\",\n\t\"messages.userPrefix\",\n\t\"messages.assistantPrefix\",\n\t\"messages.specialBlocks\",\n\t\"tools.enabled\",\n\t\"tools.showElapsed\",\n\t\"tools.dimOutput\",\n\t\"compatibility.allowSafePatches\",\n\t\"compatibility.allowCorePatches\",\n\t\"compatibility.preferExistingEditor\",\n\t\"compatibility.preferExistingFooter\",\n\t\"debug\",\n]);\nconst STRING_ARRAY_PATHS = new Set([\n\t\"statusLine.layout.left\",\n\t\"statusLine.layout.right\",\n\t\"statusLine.layout.secondary\",\n\t\"statusLine.disabledSegments\",\n]);\nconst MAP_PATHS = new Set([\"theme.colors\", \"theme.glyphs\"]);\nconst CONTAINER_PATHS = new Set([\n\t\"startup\",\n\t\"statusLine\",\n\t\"statusLine.layout\",\n\t\"editor\",\n\t\"messages\",\n\t\"tools\",\n\t\"theme\",\n\t\"compatibility\",\n]);\nfunction validCustomItem(item: unknown): boolean {\n\tif (!isRecord(item) || typeof item.id !== \"string\" || typeof item.statusKey !== \"string\") return false;\n\tif (Object.keys(item).some((key) => ![\"id\", \"statusKey\", \"label\", \"priority\", \"placement\"].includes(key)))\n\t\treturn false;\n\tif (item.label !== undefined && typeof item.label !== \"string\") return false;\n\tif (item.priority !== undefined && (typeof item.priority !== \"number\" || !Number.isFinite(item.priority)))\n\t\treturn false;\n\treturn (\n\t\titem.placement === undefined ||\n\t\titem.placement === \"left\" ||\n\t\titem.placement === \"right\" ||\n\t\titem.placement === \"secondary\"\n\t);\n}\nfunction validLeaf(path: string, value: unknown): boolean {\n\tif (BOOL_PATHS.has(path)) return typeof value === \"boolean\";\n\tif (ENUMS[path]) return typeof value === \"string\" && ENUMS[path].includes(value);\n\tif (path === \"statusLine.separator\" || path === \"tools.style\") return typeof value === \"string\";\n\tif (path === \"tools.maxCollapsedLines\" || path === \"tools.maxExpandedLines\")\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n\tif (path === \"statusLine.bottomMargin\" || path === \"statusLine.contextBarWidth\")\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n\tif (STRING_ARRAY_PATHS.has(path)) return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n\tif (MAP_PATHS.has(path)) return isRecord(value) && Object.values(value).every((item) => typeof item === \"string\");\n\tif (path === \"statusLine.customItems\") return Array.isArray(value) && value.every(validCustomItem);\n\treturn false;\n}\nexport interface ConfigLayerResult {\n\treadonly accepted: unknown;\n\treadonly diagnostics: readonly ConfigDiagnostic[];\n\treadonly paths: ReadonlySet<string>;\n}\nfunction cloneLeaf(value: unknown): unknown {\n\treturn Array.isArray(value)\n\t\t? value.map((item) => (isRecord(item) ? { ...item } : item))\n\t\t: isRecord(value)\n\t\t\t? { ...value }\n\t\t\t: value;\n}\nexport function validateConfigLayer(input: unknown): ConfigLayerResult {\n\tconst diagnostics: ConfigDiagnostic[] = [];\n\tconst paths = new Set<string>();\n\tconst walk = (value: unknown, prefix: string): unknown => {\n\t\tif (!isRecord(value)) return value;\n\t\tconst result: Record<string, unknown> = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tconst path = prefix ? `${prefix}.${key}` : key;\n\t\t\tif (path === \"schemaVersion\") {\n\t\t\t\tif (nestedValue === undefined || nestedValue === PI_STYLE_SCHEMA_VERSION) result[key] = nestedValue;\n\t\t\t\telse\n\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\tcode: \"CFG-SCHEMA\",\n\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tmessage: \"unsupported schema version ignored\",\n\t\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (path === \"statusLine.customItems\" && Array.isArray(nestedValue)) {\n\t\t\t\tconst acceptedItems: Record<string, unknown>[] = [];\n\t\t\t\tfor (const [index, item] of nestedValue.entries()) {\n\t\t\t\t\tif (!isRecord(item)) {\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tpath: `${path}[${index}]`,\n\t\t\t\t\t\t\tmessage: \"custom item must be an object\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst allowed = [\"id\", \"statusKey\", \"label\", \"priority\", \"placement\"];\n\t\t\t\t\tlet valid = typeof item.id === \"string\" && typeof item.statusKey === \"string\";\n\t\t\t\t\tif (typeof item.id !== \"string\")\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tpath: `${path}[${index}].id`,\n\t\t\t\t\t\t\tmessage: \"required custom item field is invalid or missing\",\n\t\t\t\t\t\t});\n\t\t\t\t\tif (typeof item.statusKey !== \"string\")\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tpath: `${path}[${index}].statusKey`,\n\t\t\t\t\t\t\tmessage: \"required custom item field is invalid or missing\",\n\t\t\t\t\t\t});\n\t\t\t\t\tfor (const field of Object.keys(item)) {\n\t\t\t\t\t\tif (!allowed.includes(field)) {\n\t\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\t\tpath: `${path}[${index}].${field}`,\n\t\t\t\t\t\t\t\tmessage: \"unknown custom item field ignored\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (item.label !== undefined && typeof item.label !== \"string\") {\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tpath: `${path}[${index}].label`,\n\t\t\t\t\t\t\tmessage: \"invalid custom item field ignored\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (item.priority !== undefined && (typeof item.priority !== \"number\" || !Number.isFinite(item.priority))) {\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tpath: `${path}[${index}].priority`,\n\t\t\t\t\t\t\tmessage: \"invalid custom item field ignored\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (item.placement !== undefined && ![\"left\", \"right\", \"secondary\"].includes(item.placement as string)) {\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\tpath: `${path}[${index}].placement`,\n\t\t\t\t\t\t\tmessage: \"invalid custom item field ignored\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (valid) {\n\t\t\t\t\t\tacceptedItems.push({ ...item });\n\t\t\t\t\t\tpaths.add(`${path}[${index}].id`);\n\t\t\t\t\t\tpaths.add(`${path}[${index}].statusKey`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[key] = acceptedItems;\n\t\t\t\tpaths.add(path);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (validLeaf(path, nestedValue)) {\n\t\t\t\tresult[key] = cloneLeaf(nestedValue);\n\t\t\t\tpaths.add(path);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tisRecord(nestedValue) &&\n\t\t\t\tCONTAINER_PATHS.has(path) &&\n\t\t\t\t!MAP_PATHS.has(path) &&\n\t\t\t\tpath !== \"statusLine.customItems\"\n\t\t\t) {\n\t\t\t\tconst child = walk(nestedValue, path);\n\t\t\t\tif (isRecord(child) && Object.keys(child).length > 0) result[key] = child;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (path !== \"statusLine.customItems\" || !Array.isArray(nestedValue))\n\t\t\t\tdiagnostics.push({ code: \"CFG-VALUE\", level: \"warning\", path, message: \"invalid or unknown field ignored\" });\n\t\t\tif (path === \"statusLine.customItems\" && Array.isArray(nestedValue))\n\t\t\t\tfor (const [index, item] of nestedValue.entries()) {\n\t\t\t\t\tif (!isRecord(item)) continue;\n\t\t\t\t\tfor (const field of [\"id\", \"statusKey\", \"label\", \"priority\", \"placement\"]) {\n\t\t\t\t\t\tif (Object.hasOwn(item, field)) {\n\t\t\t\t\t\t\tconst fieldValue = item[field];\n\t\t\t\t\t\t\tconst valid =\n\t\t\t\t\t\t\t\tfield === \"id\" || field === \"statusKey\" || field === \"label\"\n\t\t\t\t\t\t\t\t\t? typeof fieldValue === \"string\"\n\t\t\t\t\t\t\t\t\t: field === \"priority\"\n\t\t\t\t\t\t\t\t\t\t? typeof fieldValue === \"number\" && Number.isFinite(fieldValue)\n\t\t\t\t\t\t\t\t\t\t: fieldValue === \"left\" || fieldValue === \"right\" || fieldValue === \"secondary\";\n\t\t\t\t\t\t\tif (!valid)\n\t\t\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\t\t\tpath: `${path}[${index}].${field}`,\n\t\t\t\t\t\t\t\t\tmessage: \"invalid custom item field ignored\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const field of Object.keys(item))\n\t\t\t\t\t\tif (![\"id\", \"statusKey\", \"label\", \"priority\", \"placement\"].includes(field))\n\t\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\t\tcode: \"CFG-VALUE\",\n\t\t\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t\t\t\tpath: `${path}[${index}].${field}`,\n\t\t\t\t\t\t\t\tmessage: \"unknown custom item field ignored\",\n\t\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t}\n\t\treturn result;\n\t};\n\treturn { accepted: walk(input, \"\"), diagnostics: boundedDiagnostics(diagnostics), paths };\n}\nfunction acceptedInput(input: unknown): unknown {\n\treturn validateConfigLayer(input).accepted;\n}\n\nexport function resolveConfigDetailed(sources: ConfigSources): {\n\treadonly config: NormalizedPiStyleConfig;\n\treadonly diagnostics: readonly ConfigDiagnostic[];\n\treadonly sources: Readonly<Record<string, string>>;\n} {\n\tconst diagnostics: ConfigDiagnostic[] = [];\n\tconst layerResults = new Map<string, ConfigLayerResult>();\n\tconst layers: readonly [string, unknown][] = [\n\t\t[\"global\", sources.global],\n\t\t[\"project\", sources.projectTrusted === false ? undefined : sources.project],\n\t\t[\"session\", sources.session],\n\t];\n\tfor (const [name, value] of layers) {\n\t\tconst result = validateConfigLayer(value);\n\t\tlayerResults.set(name, result);\n\t\tdiagnostics.push(...result.diagnostics);\n\t}\n\tconst defaults = sources.defaults ?? DEFAULT_CONFIG;\n\tlet merged: unknown = defaults;\n\tconst presetCandidates = [\n\t\t[\"session\", sources.session],\n\t\t[\"project\", sources.projectTrusted === false ? undefined : sources.project],\n\t\t[\"global\", sources.global],\n\t\t[\"default\", defaults],\n\t] as const;\n\tlet selectedPreset: unknown;\n\tfor (const [, source] of presetCandidates) {\n\t\tconst candidate = isRecord(source) ? source.preset : undefined;\n\t\tif (candidate === undefined) continue;\n\t\tif (typeof candidate === \"string\" && (PRESET_NAMES as readonly string[]).includes(candidate)) {\n\t\t\tselectedPreset = candidate;\n\t\t\tbreak;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\tcode: \"CFG-ENUM\",\n\t\t\tlevel: \"warning\",\n\t\t\tpath: \"preset\",\n\t\t\tmessage: \"unsupported value; lower-precedence preset used\",\n\t\t});\n\t}\n\tmerged = merge(isRecord(merged) ? merged : {}, presetConfig(selectedPreset));\n\tfor (const name of [\"global\", \"project\"] as const)\n\t\tmerged = merge(isRecord(merged) ? merged : {}, layerResults.get(name)?.accepted);\n\tconst env = sources.environment ?? {};\n\tconst envPatch: PiStyleConfig = {};\n\tif (env.PI_STYLE_DISABLED === \"1\") envPatch.enabled = false;\n\tif (env.PI_STYLE_NERD_FONTS === \"1\" || env.PI_STYLE_NERD_FONTS === \"0\")\n\t\tenvPatch.theme = { nerdFonts: env.PI_STYLE_NERD_FONTS === \"1\" ? \"on\" : \"off\" };\n\tif (env.PI_STYLE_EDITOR && [\"native\", \"compact\", \"boxed\", \"dock\"].includes(env.PI_STYLE_EDITOR))\n\t\tenvPatch.editor = { style: env.PI_STYLE_EDITOR };\n\tif (env.PI_STYLE_OSC11 === \"1\" || env.PI_STYLE_OSC11 === \"0\")\n\t\tenvPatch.theme = { ...(envPatch.theme ?? {}), terminalBackgroundSync: env.PI_STYLE_OSC11 === \"1\" ? \"on\" : \"off\" };\n\tif (env.PI_STYLE_DEBUG === \"1\") envPatch.debug = true;\n\tif (env.PI_STYLE_STATUS === \"above\" || env.PI_STYLE_STATUS === \"below\") envPatch.placement = env.PI_STYLE_STATUS;\n\tif (env.PI_STYLE_STATUS === \"off\") envPatch.statusLine = { enabled: false };\n\tif (env.PI_STYLE_DISABLED !== undefined && env.PI_STYLE_DISABLED !== \"1\")\n\t\tdiagnostics.push({\n\t\t\tcode: \"CFG-ENV\",\n\t\t\tlevel: \"warning\",\n\t\t\tpath: \"PI_STYLE_DISABLED\",\n\t\t\tmessage: \"expected 1; override ignored\",\n\t\t});\n\tif (env.PI_STYLE_NERD_FONTS !== undefined && ![\"0\", \"1\"].includes(env.PI_STYLE_NERD_FONTS))\n\t\tdiagnostics.push({\n\t\t\tcode: \"CFG-ENV\",\n\t\t\tlevel: \"warning\",\n\t\t\tpath: \"PI_STYLE_NERD_FONTS\",\n\t\t\tmessage: \"expected 0 or 1; override ignored\",\n\t\t});\n\tif (env.PI_STYLE_STATUS !== undefined && ![\"above\", \"below\", \"off\"].includes(env.PI_STYLE_STATUS))\n\t\tdiagnostics.push({\n\t\t\tcode: \"CFG-ENV\",\n\t\t\tlevel: \"warning\",\n\t\t\tpath: \"PI_STYLE_STATUS\",\n\t\t\tmessage: \"expected above, below, or off; override ignored\",\n\t\t});\n\tif (env.PI_STYLE_EDITOR !== undefined && ![\"native\", \"compact\", \"boxed\", \"dock\"].includes(env.PI_STYLE_EDITOR))\n\t\tdiagnostics.push({\n\t\t\tcode: \"CFG-ENV\",\n\t\t\tlevel: \"warning\",\n\t\t\tpath: \"PI_STYLE_EDITOR\",\n\t\t\tmessage: \"unknown editor style; override ignored\",\n\t\t});\n\tfor (const [key, value] of Object.entries(env))\n\t\tif (\n\t\t\tvalue !== undefined &&\n\t\t\tkey.startsWith(\"PI_STYLE_\") &&\n\t\t\t![\n\t\t\t\t\"PI_STYLE_DISABLED\",\n\t\t\t\t\"PI_STYLE_NERD_FONTS\",\n\t\t\t\t\"PI_STYLE_EDITOR\",\n\t\t\t\t\"PI_STYLE_OSC11\",\n\t\t\t\t\"PI_STYLE_DEBUG\",\n\t\t\t\t\"PI_STYLE_STATUS\",\n\t\t\t].includes(key)\n\t\t)\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"CFG-ENV\",\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tpath: key,\n\t\t\t\tmessage: \"unsupported environment override ignored\",\n\t\t\t});\n\tmerged = merge(isRecord(merged) ? merged : {}, envPatch);\n\tmerged = merge(isRecord(merged) ? merged : {}, layerResults.get(\"session\")?.accepted);\n\tconst sourceMap: Record<string, string> = {};\n\tconst sourcePath = (value: unknown, prefix: string, sourceName: string) => {\n\t\tif (!isRecord(value)) return;\n\t\tfor (const [key, nested] of Object.entries(value)) {\n\t\t\tconst path = prefix ? `${prefix}.${key}` : key;\n\t\t\tif (validLeaf(path, nested)) {\n\t\t\t\tsourceMap[path] = sourceName;\n\t\t\t\tif (path === \"statusLine.customItems\" && Array.isArray(nested))\n\t\t\t\t\tfor (const [index, item] of nested.entries())\n\t\t\t\t\t\tif (isRecord(item))\n\t\t\t\t\t\t\tfor (const field of [\"id\", \"statusKey\", \"label\", \"priority\", \"placement\"])\n\t\t\t\t\t\t\t\tif (Object.hasOwn(item, field)) sourceMap[`${path}[${index}].${field}`] = sourceName;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (isRecord(nested)) sourcePath(nested, path, sourceName);\n\t\t}\n\t};\n\tsourcePath(defaults, \"\", \"default\");\n\tsourcePath(\n\t\tpresetConfig(selectedPreset),\n\t\t\"\",\n\t\t`preset:${typeof selectedPreset === \"string\" ? selectedPreset : \"default\"}`,\n\t);\n\tsourcePath(layerResults.get(\"global\")?.accepted, \"\", \"global\");\n\tif (sources.projectTrusted !== false) sourcePath(layerResults.get(\"project\")?.accepted, \"\", \"project\");\n\tsourcePath(envPatch, \"\", \"environment\");\n\tsourcePath(layerResults.get(\"session\")?.accepted, \"\", \"session\");\n\treturn { config: normalizeConfig(merged), diagnostics: boundedDiagnostics(diagnostics), sources: sourceMap };\n}\n","import { boundedDiagnostics, type ConfigDiagnostic } from \"./config-diagnostics.js\";\nimport { PI_STYLE_SCHEMA_VERSION } from \"./config-types.js\";\n\nfunction record(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport interface MigrationResult {\n\treadonly config: Record<string, unknown> | undefined;\n\treadonly diagnostics: readonly ConfigDiagnostic[];\n\treadonly readOnly: boolean;\n}\n\n/** Purely validates the durable envelope; v1 is identity and future data is read-only. */\nexport function migrateConfig(input: unknown, source = \"config\"): MigrationResult {\n\tif (!record(input))\n\t\treturn {\n\t\t\tconfig: undefined,\n\t\t\treadOnly: false,\n\t\t\tdiagnostics: boundedDiagnostics([\n\t\t\t\t{ code: \"CFG-001\", level: \"warning\", path: source, message: \"configuration must be an object; defaults used\" },\n\t\t\t]),\n\t\t};\n\tconst version = input.schemaVersion;\n\tif (version === undefined)\n\t\treturn {\n\t\t\tconfig: { ...input, schemaVersion: PI_STYLE_SCHEMA_VERSION },\n\t\t\treadOnly: false,\n\t\t\tdiagnostics: boundedDiagnostics([\n\t\t\t\t{\n\t\t\t\t\tcode: \"CFG-002\",\n\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\tpath: `${source}.schemaVersion`,\n\t\t\t\t\tmessage: \"missing schemaVersion accepted as v1-shaped input\",\n\t\t\t\t},\n\t\t\t]),\n\t\t};\n\tif (version !== PI_STYLE_SCHEMA_VERSION)\n\t\treturn {\n\t\t\tconfig: undefined,\n\t\t\treadOnly: true,\n\t\t\tdiagnostics: boundedDiagnostics([\n\t\t\t\t{\n\t\t\t\t\tcode: \"CFG-003\",\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tpath: `${source}.schemaVersion`,\n\t\t\t\t\tmessage: `unsupported schemaVersion ${String(version)}; ignored without rewrite`,\n\t\t\t\t},\n\t\t\t]),\n\t\t};\n\treturn { config: { ...input }, readOnly: false, diagnostics: [] };\n}\n","import type { ConfigDiagnostic } from \"../domain/config-diagnostics.js\";\nimport { migrateConfig } from \"../domain/config-migrations.js\";\n\nexport interface ConfigStoragePaths {\n\treadonly globalPath: string;\n\treadonly projectPath: string;\n}\nexport interface ConfigFilePort {\n\tread(path: string): Promise<string>;\n\twriteAtomic(path: string, content: string): Promise<void>;\n}\nexport interface ConfigRead {\n\treadonly value: unknown;\n\treadonly diagnostics: readonly ConfigDiagnostic[];\n\treadonly readOnly: boolean;\n}\n\nexport async function readScopedConfig(\n\tport: ConfigFilePort,\n\tpath: string,\n\tselectedNamespace = \"piStyle\",\n): Promise<ConfigRead> {\n\ttry {\n\t\tconst parsed = JSON.parse(await port.read(path)) as unknown;\n\t\tif (!record(parsed))\n\t\t\treturn {\n\t\t\t\tvalue: undefined,\n\t\t\t\treadOnly: true,\n\t\t\t\tdiagnostics: [{ code: \"CFG-001\", level: \"warning\", path, message: \"settings root must be an object\" }],\n\t\t\t};\n\t\tif (!Object.hasOwn(parsed, selectedNamespace)) return { value: undefined, readOnly: false, diagnostics: [] };\n\t\tconst result = migrateConfig(parsed[selectedNamespace], `${path}.${selectedNamespace}`);\n\t\treturn { value: result.config, diagnostics: result.diagnostics, readOnly: result.readOnly };\n\t} catch (error) {\n\t\tconst code =\n\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error ? (error as { code?: unknown }).code : undefined;\n\t\tif (code === \"ENOENT\") return { value: undefined, readOnly: false, diagnostics: [] };\n\t\treturn {\n\t\t\tvalue: undefined,\n\t\t\treadOnly: true,\n\t\t\tdiagnostics: [\n\t\t\t\t{\n\t\t\t\t\tcode: \"CFG-IO\",\n\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\tpath,\n\t\t\t\t\tmessage: `settings unreadable; preserved without rewrite (${error instanceof Error ? error.message : \"invalid JSON\"})`,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergePatch(base: unknown, patch: unknown): unknown {\n\tif (!record(base) || !record(patch)) return patch;\n\tconst result: Record<string, unknown> = { ...base };\n\tfor (const [key, value] of Object.entries(patch)) result[key] = mergePatch(result[key], value);\n\treturn result;\n}\n\nconst writeLocks = new Map<string, Promise<void>>();\n\nexport async function writeScopedConfig(\n\tport: ConfigFilePort,\n\tpath: string,\n\tvalue: unknown,\n\tselectedNamespace = \"piStyle\",\n): Promise<void> {\n\tconst previous = writeLocks.get(path) ?? Promise.resolve();\n\tconst operation = previous.then(async () => {\n\t\tlet document: Record<string, unknown> = {};\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(await port.read(path)) as unknown;\n\t\t\tif (!record(parsed)) throw new Error(\"settings root must be an object\");\n\t\t\tdocument = parsed;\n\t\t} catch (error) {\n\t\t\tconst code =\n\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error ? (error as { code?: unknown }).code : undefined;\n\t\t\tif (code !== \"ENOENT\") throw new Error(`refusing to rewrite unreadable settings: ${path}`);\n\t\t}\n\t\tif (Object.hasOwn(document, selectedNamespace)) {\n\t\t\tconst existing = migrateConfig(document[selectedNamespace], `${path}.${selectedNamespace}`);\n\t\t\tif (existing.readOnly || !record(document[selectedNamespace]))\n\t\t\t\tthrow new Error(`refusing to rewrite protected ${selectedNamespace} namespace: ${path}`);\n\t\t}\n\t\tconst nextNamespace = mergePatch(document[selectedNamespace], value);\n\t\tawait port.writeAtomic(path, `${JSON.stringify({ ...document, [selectedNamespace]: nextNamespace }, null, 2)}\\n`);\n\t});\n\twriteLocks.set(path, operation);\n\ttry {\n\t\tawait operation;\n\t} finally {\n\t\tif (writeLocks.get(path) === operation) writeLocks.delete(path);\n\t}\n}\n","import { validateConfigLayer } from \"../domain/config-normalization.js\";\nimport type { NormalizedPiStyleConfig } from \"../domain/config-types.js\";\nimport { type ConfigFilePort, type ConfigStoragePaths, writeScopedConfig } from \"./config-storage.js\";\n\nexport type Mutation = Record<string, unknown>;\nexport interface CommandUi {\n\tselect(title: string, options: string[]): Promise<string | undefined>;\n\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void;\n}\nexport interface CommandHost {\n\treadonly ui: CommandUi;\n\treadonly cwd: string;\n\tisProjectTrusted(): boolean;\n}\nexport interface CommandApp {\n\treadonly config: NormalizedPiStyleConfig;\n\tapplySession(patch: Mutation): void;\n\tsetProjectTrusted?(trusted: boolean): void;\n\treload(): Promise<void>;\n\tdoctor(): Readonly<Record<string, unknown>>;\n}\n\nconst surfaces = new Set([\"status\", \"editor\", \"startup\", \"messages\", \"tools\"]);\nconst presets = [\"default\", \"minimal\", \"compact\", \"full\", \"ascii\", \"native\"];\nconst styles = [\"compact\", \"boxed\", \"dock\", \"native\"];\nconst frames = [\"auto\", \"halfblock\", \"line\", \"solid\", \"outline\", \"native\"];\nconst startupModes = [\"off\", \"compact\", \"overlay\"];\nconst allowedPaths = new Set([\n\t\"enabled\",\n\t\"preset\",\n\t\"placement\",\n\t\"startup.mode\",\n\t\"startup.showResources\",\n\t\"statusLine.enabled\",\n\t\"statusLine.separator\",\n\t\"statusLine.layout.left\",\n\t\"statusLine.layout.right\",\n\t\"statusLine.layout.secondary\",\n\t\"statusLine.disabledSegments\",\n\t\"statusLine.customItems\",\n\t\"statusLine.bottomMargin\",\n\t\"statusLine.contextBarWidth\",\n\t\"editor.enabled\",\n\t\"editor.style\",\n\t\"editor.frame\",\n\t\"editor.showMetadata\",\n\t\"messages.enabled\",\n\t\"messages.userPrefix\",\n\t\"messages.assistantPrefix\",\n\t\"messages.specialBlocks\",\n\t\"tools.enabled\",\n\t\"tools.style\",\n\t\"tools.maxCollapsedLines\",\n\t\"tools.maxExpandedLines\",\n\t\"tools.dimOutput\",\n\t\"tools.showElapsed\",\n\t\"theme.nerdFonts\",\n\t\"theme.terminalBackgroundSync\",\n\t\"theme.colors\",\n\t\"theme.glyphs\",\n\t\"compatibility.allowSafePatches\",\n\t\"compatibility.allowCorePatches\",\n\t\"compatibility.preferExistingEditor\",\n\t\"compatibility.preferExistingFooter\",\n\t\"debug\",\n]);\nfunction validatePathValue(path: string, value: unknown): boolean {\n\tif (!allowedPaths.has(path)) return false;\n\tif (\n\t\t[\n\t\t\t\"enabled\",\n\t\t\t\"startup.showResources\",\n\t\t\t\"statusLine.enabled\",\n\t\t\t\"editor.enabled\",\n\t\t\t\"editor.showMetadata\",\n\t\t\t\"messages.enabled\",\n\t\t\t\"messages.userPrefix\",\n\t\t\t\"messages.assistantPrefix\",\n\t\t\t\"messages.specialBlocks\",\n\t\t\t\"tools.enabled\",\n\t\t\t\"tools.showElapsed\",\n\t\t\t\"tools.dimOutput\",\n\t\t\t\"compatibility.allowSafePatches\",\n\t\t\t\"compatibility.allowCorePatches\",\n\t\t\t\"compatibility.preferExistingEditor\",\n\t\t\t\"compatibility.preferExistingFooter\",\n\t\t\t\"debug\",\n\t\t].includes(path)\n\t)\n\t\treturn typeof value === \"boolean\";\n\tif (path === \"preset\") return typeof value === \"string\" && presets.includes(value);\n\tif (path === \"placement\") return value === \"above\" || value === \"below\";\n\tif (path === \"startup.mode\") return typeof value === \"string\" && startupModes.includes(value);\n\tif (path === \"editor.style\") return typeof value === \"string\" && styles.includes(value);\n\tif (path === \"editor.frame\") return typeof value === \"string\" && frames.includes(value);\n\tif ([\"theme.nerdFonts\", \"theme.terminalBackgroundSync\", \"statusLine.separator\", \"tools.style\"].includes(path))\n\t\treturn typeof value === \"string\";\n\tif (path === \"tools.maxCollapsedLines\" || path === \"tools.maxExpandedLines\")\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n\tif (path === \"statusLine.bottomMargin\" || path === \"statusLine.contextBarWidth\")\n\t\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n\tif (path.endsWith(\".colors\") || path.endsWith(\".glyphs\"))\n\t\treturn (\n\t\t\ttypeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t!Array.isArray(value) &&\n\t\t\tObject.values(value).every((item) => typeof item === \"string\")\n\t\t);\n\tif (path.includes(\"layout.\") || path === \"statusLine.disabledSegments\")\n\t\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\");\n\treturn (\n\t\tpath === \"statusLine.customItems\" &&\n\t\tvalidateConfigLayer({ statusLine: { customItems: value } }).diagnostics.length === 0\n\t);\n}\nfunction validateMutation(patch: Mutation, prefix = \"\"): boolean {\n\treturn Object.entries(patch).every(([key, value]) => {\n\t\tconst path = prefix ? `${prefix}.${key}` : key;\n\t\tif (\n\t\t\t[\n\t\t\t\t\"theme.colors\",\n\t\t\t\t\"theme.glyphs\",\n\t\t\t\t\"statusLine.layout.left\",\n\t\t\t\t\"statusLine.layout.right\",\n\t\t\t\t\"statusLine.layout.secondary\",\n\t\t\t\t\"statusLine.disabledSegments\",\n\t\t\t\t\"statusLine.customItems\",\n\t\t\t].includes(path)\n\t\t)\n\t\t\treturn validatePathValue(path, value);\n\t\tif (typeof value === \"object\" && value !== null && !Array.isArray(value))\n\t\t\treturn Object.keys(value).length > 0 && validateMutation(value as Mutation, path);\n\t\treturn validatePathValue(path, value);\n\t});\n}\nfunction sanitizeMutation(patch: Mutation): Mutation | undefined {\n\treturn validateMutation(patch) ? patch : undefined;\n}\n\nfunction mutation(parts: readonly string[]): Mutation | undefined {\n\tif (parts[0] === \"set\" && parts[1] && parts[2]) {\n\t\ttry {\n\t\t\tconst value = JSON.parse(parts.slice(2).join(\" \")) as unknown;\n\t\t\tconst patch: Mutation = {};\n\t\t\tlet cursor = patch;\n\t\t\tconst keys = parts[1].split(\".\");\n\t\t\tfor (const key of keys.slice(0, -1)) {\n\t\t\t\tconst next = cursor[key];\n\t\t\t\tif (typeof next === \"object\" && next !== null && !Array.isArray(next)) cursor = next as Mutation;\n\t\t\t\telse {\n\t\t\t\t\tcursor[key] = {};\n\t\t\t\t\tcursor = cursor[key] as Mutation;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcursor[keys.at(-1) as string] = value;\n\t\t\treturn sanitizeMutation(patch);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\tconst [action, value, extra] = parts;\n\tif (action === \"on\" || action === \"off\") return { enabled: action === \"on\" };\n\tif (action === \"preset\" && value && presets.includes(value)) return { preset: value };\n\tif (action === \"placement\" && (value === \"above\" || value === \"below\")) return { placement: value };\n\tif (action === \"editor\" && value && styles.includes(value) && (!extra || frames.includes(extra)))\n\t\treturn { editor: { style: value, ...(extra ? { frame: extra } : {}) } };\n\tif (action === \"startup\" && value && startupModes.includes(value)) return { startup: { mode: value } };\n\tif (action === \"surface\" && value && surfaces.has(value) && (extra === \"on\" || extra === \"off\")) {\n\t\tif (value === \"startup\") return { startup: { mode: extra === \"on\" ? \"compact\" : \"off\" } };\n\t\treturn { [value === \"status\" ? \"statusLine\" : value]: { enabled: extra === \"on\" } };\n\t}\n\treturn undefined;\n}\n\nexport async function executePiStyleCommand(\n\targs: string,\n\thost: CommandHost,\n\tapp: CommandApp,\n\tstorage: { readonly port: ConfigFilePort; readonly paths: ConfigStoragePaths },\n): Promise<void> {\n\tconst parts = args.trim().split(/\\s+/).filter(Boolean);\n\tconst [action, scope, ...rest] = parts;\n\tif (!action) {\n\t\thost.ui.notify(\n\t\t\t`pi-style preset ${app.config.preset}; status ${app.config.statusLine.enabled ? \"on\" : \"off\"}`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn;\n\t}\n\tif (action === \"reload\") {\n\t\tawait app.reload();\n\t\treturn;\n\t}\n\tif (action === \"doctor\") {\n\t\thost.ui.notify(JSON.stringify(app.doctor()), \"info\");\n\t\treturn;\n\t}\n\tif (action === \"persist\") {\n\t\tif (scope !== \"global\" && scope !== \"project\") {\n\t\t\thost.ui.notify(\"persistence requires explicit global or project scope\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tif (scope === \"project\" && !host.isProjectTrusted()) {\n\t\t\thost.ui.notify(\"pi-style project persistence requires a trusted project\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst patch = mutation(rest);\n\t\tif (!patch) {\n\t\t\thost.ui.notify(\"invalid pi-style mutation or value\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tconst sanitized = sanitizeMutation(patch);\n\t\tif (!sanitized) {\n\t\t\thost.ui.notify(\"mutation contains fields that cannot be persisted\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait writeScopedConfig(\n\t\t\t\tstorage.port,\n\t\t\t\tscope === \"global\" ? storage.paths.globalPath : storage.paths.projectPath,\n\t\t\t\tsanitized,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\thost.ui.notify(\n\t\t\t\t`pi-style settings write failed: ${error instanceof Error ? error.message : \"unknown error\"}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tapp.applySession(patch);\n\t\tif (\n\t\t\t(patch.messages as Record<string, unknown> | undefined)?.enabled === true ||\n\t\t\t(patch.tools as Record<string, unknown> | undefined)?.enabled === true\n\t\t)\n\t\t\thost.ui.notify(\"desired Tier C state stored; awaiting session authorization\", \"info\");\n\t\treturn;\n\t}\n\tconst patch = mutation(parts);\n\tif (patch) app.applySession(patch);\n\telse if (action === \"preset\" && !scope) {\n\t\tconst selected = await host.ui.select(\"pi-style preset\", presets);\n\t\tif (selected) app.applySession({ preset: selected });\n\t} else host.ui.notify(\"invalid pi-style command or value\", \"warning\");\n}\n","import type { CommandApp, CommandHost } from \"./command-service.js\";\nimport { executePiStyleCommand } from \"./command-service.js\";\nimport type { ConfigFilePort, ConfigStoragePaths } from \"./config-storage.js\";\n\nexport function runCommand(\n\targs: string,\n\thost: CommandHost,\n\tapp: CommandApp,\n\tstorage: { readonly port: ConfigFilePort; readonly paths: ConfigStoragePaths },\n): Promise<void> {\n\treturn executePiStyleCommand(args, host, app, storage);\n}\n","import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { ConfigFilePort, ConfigStoragePaths } from \"../app/config-storage.js\";\n\nconst locks = new Map<string, Promise<void>>();\n\nfunction serialize(path: string, operation: () => Promise<void>): Promise<void> {\n\tconst previous = locks.get(path) ?? Promise.resolve();\n\tconst current = previous.catch(() => undefined).then(operation);\n\tlocks.set(path, current);\n\treturn current.finally(() => {\n\t\tif (locks.get(path) === current) locks.delete(path);\n\t});\n}\n\nexport interface ConfigHostFs {\n\treadonly mkdir?: typeof mkdir;\n\treadonly readFile?: typeof readFile;\n\treadonly rename?: typeof rename;\n\treadonly unlink?: typeof unlink;\n\treadonly writeFile?: typeof writeFile;\n}\n\nexport function createPiConfigFilePort(fs: ConfigHostFs = {}): ConfigFilePort {\n\tconst fsMkdir = fs.mkdir ?? mkdir;\n\tconst fsReadFile = fs.readFile ?? readFile;\n\tconst fsRename = fs.rename ?? rename;\n\tconst fsUnlink = fs.unlink ?? unlink;\n\tconst fsWriteFile = fs.writeFile ?? writeFile;\n\treturn {\n\t\tread: (path) => fsReadFile(path, \"utf8\"),\n\t\twriteAtomic: async (path, content) =>\n\t\t\tserialize(path, async () => {\n\t\t\t\tawait fsMkdir(dirname(path), { recursive: true });\n\t\t\t\tconst temporary = `${path}.pi-style-${process.pid}-${Date.now()}.tmp`;\n\t\t\t\ttry {\n\t\t\t\t\tawait fsWriteFile(temporary, content, { mode: 0o600 });\n\t\t\t\t\tawait fsRename(temporary, path);\n\t\t\t\t} finally {\n\t\t\t\t\tawait fsUnlink(temporary).catch(() => undefined);\n\t\t\t\t}\n\t\t\t}),\n\t};\n}\n\nexport function defaultStoragePaths(cwd: string, overrides: Partial<ConfigStoragePaths> = {}): ConfigStoragePaths {\n\treturn {\n\t\tglobalPath: overrides.globalPath ?? join(getAgentDir(), \"settings.json\"),\n\t\tprojectPath: overrides.projectPath ?? join(cwd, CONFIG_DIR_NAME, \"settings.json\"),\n\t};\n}\n","import type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { CommandApp } from \"../app/command-service.js\";\nimport { runCommand } from \"../app/commands.js\";\nimport { createPiConfigFilePort, defaultStoragePaths } from \"./config-host.js\";\n\nexport function registerPiStyleCommand(pi: ExtensionAPI, app: CommandApp): void {\n\tpi.registerCommand(\"pi-style\", {\n\t\tdescription: \"Configure pi-style for this session\",\n\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\tconst cwd = ctx.cwd ?? process.cwd();\n\t\t\tawait runCommand(args, { ui: ctx.ui, cwd, isProjectTrusted: ctx.isProjectTrusted }, app, {\n\t\t\t\tport: createPiConfigFilePort(),\n\t\t\t\tpaths: defaultStoragePaths(cwd),\n\t\t\t});\n\t\t},\n\t});\n}\n","import type { ExtensionAPI, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { type KeyId, matchesKey } from \"@earendil-works/pi-tui\";\nimport type { ConfigFilePort } from \"../app/config-storage.js\";\nimport { createPiStyleApp, type PiStyleApp } from \"../app/index.js\";\nimport { setSpecialBlockTheme } from \"../features/messages/special-blocks.js\";\nimport { setToolsRenderConfig } from \"../features/tools/boxed/session-config.js\";\nimport { createCompatibilityCoordinator } from \"./compatibility-coordinator.js\";\nimport {\n\ttype CompatibilityCleanupResult,\n\ttype CompatibilityProbeReport,\n\tdisposePiCompatibilityProbe,\n} from \"./compatibility-probe.js\";\nimport { createPiConfigFilePort, defaultStoragePaths } from \"./config-host.js\";\nimport { createConfigSourceAdapter, readSessionAuthorization } from \"./config-session.js\";\nimport { buildOperationalState } from \"./operational-state.js\";\nimport { collectToolDetails } from \"./startup-resources.js\";\n\nexport type CompatibilityTestHooks = {\n\tdispose?: (report: CompatibilityProbeReport) => CompatibilityCleanupResult;\n\tfilePort?: ConfigFilePort;\n\tpaths?: (cwd: string) => { globalPath: string; projectPath: string };\n\t/** Test-only capability seam; Pi's ExtensionContext does not provide a Git runner. */\n\tgitRunner?: import(\"../domain/providers.js\").GitCommandRunner;\n\t/** Override the thinking-cycle key binding consumed to suppress Pi's status toast. */\n\tthinkingCycleKey?: string;\n};\n\nconst THINKING_CYCLE = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\nexport function createPiStyleSessionCoordinator(pi: ExtensionAPI, hooks: CompatibilityTestHooks = {}) {\n\tconst filePort = hooks.filePort ?? createPiConfigFilePort();\n\tconst gitRunner =\n\t\thooks.gitRunner ??\n\t\t({\n\t\t\trun: async (args, commandCwd, timeoutMs, signal) => {\n\t\t\t\tconst result = await pi.exec(\"git\", [...args], {\n\t\t\t\t\tcwd: commandCwd,\n\t\t\t\t\ttimeout: timeoutMs,\n\t\t\t\t\t...(signal ? { signal } : {}),\n\t\t\t\t});\n\t\t\t\treturn { stdout: result.stdout, stderr: result.stderr, code: result.code };\n\t\t\t},\n\t\t} satisfies import(\"../domain/providers.js\").GitCommandRunner);\n\tlet cwd = process.cwd();\n\tlet active = false;\n\tlet tuiSession = false;\n\tlet terminalInputUnsubscribe: (() => void) | undefined;\n\tconst source = createConfigSourceAdapter(\n\t\tpi,\n\t\tfilePort,\n\t\thooks.paths ?? ((sessionCwd) => defaultStoragePaths(sessionCwd)),\n\t);\n\tconst compatibility = createCompatibilityCoordinator(\n\t\t(report) => hooks.dispose?.(report) ?? disposePiCompatibilityProbe(report),\n\t);\n\t// Initial read may be empty in real Pi (flag values apply after extension load);\n\t// start() re-reads and re-captures at every session_start.\n\tlet authorization = readSessionAuthorization(pi);\n\tlet productGate: \"omitted\" | \"allow\" | \"deny\" = \"omitted\";\n\tconst syncOperational = (config: import(\"../domain/config-types.js\").NormalizedPiStyleConfig) => {\n\t\tapp.setOperationalState(\n\t\t\tbuildOperationalState(\n\t\t\t\tconfig,\n\t\t\t\tauthorization,\n\t\t\t\tcompatibility,\n\t\t\t\tapp.runtime.current?.installationState,\n\t\t\t\tapp.productPolicy.corePatchGate,\n\t\t\t),\n\t\t);\n\t};\n\tconst app: PiStyleApp = createPiStyleApp(\n\t\tundefined,\n\t\t{\n\t\t\tload: async (trusted) => {\n\t\t\t\tsource.setSession(cwd, trusted);\n\t\t\t\treturn source.load();\n\t\t\t},\n\t\t},\n\t\t(config) => {\n\t\t\tproductGate = app.productPolicy.corePatchGate;\n\t\t\tif (!active) return;\n\t\t\tif (compatibility.report) {\n\t\t\t\tconst cleanup = compatibility.dispose();\n\t\t\t\tif (!cleanup.complete) {\n\t\t\t\t\tsyncOperational(config);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcompatibility.install(config, tuiSession, productGate);\n\t\t\tsyncOperational(config);\n\t\t},\n\t);\n\n\treturn {\n\t\tapp,\n\t\tasync start(event: { reason: string }, ctx: ExtensionContext): Promise<void> {\n\t\t\t// Authorization is session-bound: Pi applies extension flag values only after\n\t\t\t// extension modules finish loading, so flags must be read here (session_start),\n\t\t\t// never at coordinator creation time.\n\t\t\tauthorization = readSessionAuthorization(pi);\n\t\t\tcompatibility.captureAuthorization(\n\t\t\t\tauthorization.core,\n\t\t\t\tauthorization.user,\n\t\t\t\tauthorization.assistant,\n\t\t\t\tauthorization.specialBlocks,\n\t\t\t\tauthorization.tools,\n\t\t\t\tauthorization.ascii,\n\t\t\t);\n\t\t\t// Replacement is failure-atomic: retain the current runtime until\n\t\t\t// compatibility ownership has been restored successfully.\n\t\t\tif (compatibility.report) {\n\t\t\t\tconst cleanup = compatibility.dispose();\n\t\t\t\tif (!cleanup.complete) {\n\t\t\t\t\tsyncOperational(app.config);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (app.runtime.current) app.sessionShutdown();\n\t\t\tcwd = ctx.cwd ?? process.cwd();\n\t\t\ttuiSession = ctx.mode === \"tui\";\n\t\t\tapp.setProjectTrusted(ctx.isProjectTrusted());\n\t\t\tsource.setSession(cwd, ctx.isProjectTrusted());\n\t\t\tactive = false;\n\t\t\tawait app.reload();\n\t\t\tproductGate = app.productPolicy.corePatchGate;\n\t\t\tactive = true;\n\t\t\tcompatibility.install(app.config, ctx.mode === \"tui\", productGate);\n\t\t\t// Session-scoped render configuration for the boxed tool/message surfaces.\n\t\t\t// Populated once per session (never inside render).\n\t\t\tsetToolsRenderConfig(app.config.tools);\n\t\t\tif (ctx.ui?.theme) setSpecialBlockTheme(ctx.ui.theme as never);\n\t\t\tconst toolDetails = collectToolDetails(pi.getActiveTools?.(), pi.getAllTools?.());\n\t\t\tapp.sessionStart(\n\t\t\t\t{\n\t\t\t\t\tmode: ctx.mode,\n\t\t\t\t\thasUI: ctx.hasUI,\n\t\t\t\t\t...(ctx.ui ? { ui: ctx.ui } : {}),\n\t\t\t\t\t...(ctx.cwd ? { cwd: ctx.cwd } : {}),\n\t\t\t\t\t...(ctx.model\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tmodel: {\n\t\t\t\t\t\t\t\t\tid: ctx.model.id,\n\t\t\t\t\t\t\t\t\tname: ctx.model.name,\n\t\t\t\t\t\t\t\t\tprovider: ctx.model.provider,\n\t\t\t\t\t\t\t\t\treasoning: ctx.model.reasoning,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...(ctx.thinkingLevel ? { thinkingLevel: ctx.thinkingLevel } : {}),\n\t\t\t\t\tgetContextUsage: ctx.getContextUsage,\n\t\t\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\t\t\tgitRunner,\n\t\t\t\t},\n\t\t\t\tevent.reason as \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\",\n\t\t\t\t{\n\t\t\t\t\t...(typeof ctx.getSystemPrompt === \"function\" ? { systemPrompt: ctx.getSystemPrompt() } : {}),\n\t\t\t\t\t...(toolDetails ? { toolDetails } : {}),\n\t\t\t\t\t...(ctx.scopedModels && ctx.scopedModels.length > 0 ? { models: ctx.scopedModels.length } : {}),\n\t\t\t\t},\n\t\t\t);\n\t\t\tterminalInputUnsubscribe?.();\n\t\t\tterminalInputUnsubscribe = undefined;\n\t\t\t// Consume Pi's default thinking-cycle key and re-issue it through the public API so\n\t\t\t// the footer shows the level without Pi's transient \"Thinking level: X\" status toast.\n\t\t\tconst cycleKey = hooks.thinkingCycleKey ?? \"shift+tab\";\n\t\t\tif (ctx.mode === \"tui\" && ctx.ui?.onTerminalInput) {\n\t\t\t\tterminalInputUnsubscribe = ctx.ui.onTerminalInput((data) => {\n\t\t\t\t\tif (!matchesKey(data, cycleKey as KeyId)) return undefined;\n\t\t\t\t\tconst current = pi.getThinkingLevel?.();\n\t\t\t\t\tconst index = Math.max(0, THINKING_CYCLE.indexOf(current as (typeof THINKING_CYCLE)[number]));\n\t\t\t\t\tconst next = THINKING_CYCLE[(index + 1) % THINKING_CYCLE.length];\n\t\t\t\t\tpi.setThinkingLevel?.(next as never);\n\t\t\t\t\treturn { consume: true };\n\t\t\t\t});\n\t\t\t}\n\t\t\tsyncOperational(app.config);\n\t\t},\n\t\tshutdown(): void {\n\t\t\tactive = false;\n\t\t\ttuiSession = false;\n\t\t\tterminalInputUnsubscribe?.();\n\t\t\tterminalInputUnsubscribe = undefined;\n\t\t\tapp.sessionShutdown();\n\t\t\tcompatibility.dispose();\n\t\t},\n\t};\n}\n","import type { ConfigDiagnostic } from \"../domain/config-diagnostics.js\";\nimport type { NormalizedPiStyleConfig } from \"../domain/config-types.js\";\n\nexport interface DoctorOperationalState {\n\treadonly compatibility?: Readonly<Record<string, unknown>>;\n\treadonly provider?: Readonly<Record<string, unknown>>;\n\treadonly installations?: Readonly<Record<string, unknown>>;\n\treadonly authorization?: Readonly<Record<string, unknown>>;\n}\n\nexport interface DoctorState {\n\treadonly config: NormalizedPiStyleConfig;\n\treadonly diagnostics: readonly ConfigDiagnostic[];\n\treadonly sources?: Readonly<Record<string, string>>;\n\treadonly surfaces: Readonly<Record<string, unknown>>;\n\treadonly piVersion?: string;\n\treadonly compatibility?: string;\n\treadonly operational?: DoctorOperationalState;\n}\n\nexport function createDoctor(state: DoctorState): Readonly<Record<string, unknown>> {\n\treturn Object.freeze({\n\t\tconfig: Object.freeze({\n\t\t\tpreset: state.config.preset,\n\t\t\tenabled: state.config.enabled,\n\t\t\tplacement: state.config.placement,\n\t\t\tstatusLine: state.config.statusLine.enabled ? \"enabled\" : \"disabled\",\n\t\t\teditor: state.config.editor.enabled ? \"enabled\" : \"disabled\",\n\t\t\tstartup: state.config.startup.mode,\n\t\t}),\n\t\tdiagnostics: state.diagnostics,\n\t\tsources: state.sources ?? {},\n\t\tsurfaces: state.surfaces,\n\t\t...(state.piVersion ? { piVersion: state.piVersion } : {}),\n\t\t...(state.operational?.compatibility && typeof state.operational.compatibility.piVersion === \"string\"\n\t\t\t? { piVersion: state.operational.compatibility.piVersion }\n\t\t\t: {}),\n\t\t...(state.operational?.compatibility && typeof state.operational.compatibility.versionRange === \"string\"\n\t\t\t? { piVersionRange: state.operational.compatibility.versionRange }\n\t\t\t: {}),\n\t\t...(state.compatibility ? { compatibility: state.compatibility } : {}),\n\t\t...(state.operational\n\t\t\t? {\n\t\t\t\t\toperational: Object.freeze({\n\t\t\t\t\t\t...(state.operational.compatibility ? { compatibility: state.operational.compatibility } : {}),\n\t\t\t\t\t\t...(state.operational.provider ? { provider: state.operational.provider } : {}),\n\t\t\t\t\t\t...(state.operational.installations ? { installations: state.operational.installations } : {}),\n\t\t\t\t\t\t...(state.operational.authorization ? { authorization: state.operational.authorization } : {}),\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: {}),\n\t});\n}\n","import type { NormalizedPiStyleConfig } from \"./config-types.js\";\n\nexport type ConfigImpact = \"none\" | \"status\" | \"editor\" | \"startup\" | \"compatibility\" | \"all\";\n\nexport interface ConfigDiff {\n\treadonly changed: readonly string[];\n\treadonly impacts: readonly ConfigImpact[];\n}\n\nexport function diffConfig(previous: NormalizedPiStyleConfig, next: NormalizedPiStyleConfig): ConfigDiff {\n\tconst changed: string[] = [];\n\tconst impacts = new Set<ConfigImpact>();\n\tconst compare = (key: string, before: unknown, after: unknown, impact: ConfigImpact) => {\n\t\tif (JSON.stringify(before) === JSON.stringify(after)) return;\n\t\tchanged.push(key);\n\t\timpacts.add(impact);\n\t};\n\tcompare(\"enabled\", previous.enabled, next.enabled, \"all\");\n\tcompare(\"statusLine\", previous.statusLine, next.statusLine, \"status\");\n\tcompare(\"placement\", previous.placement, next.placement, \"status\");\n\tcompare(\"editor\", previous.editor, next.editor, \"editor\");\n\tcompare(\"startup\", previous.startup, next.startup, \"startup\");\n\tcompare(\"messages\", previous.messages, next.messages, \"compatibility\");\n\tcompare(\"tools\", previous.tools, next.tools, \"compatibility\");\n\tcompare(\"theme\", previous.theme, next.theme, \"all\");\n\tcompare(\"compatibility\", previous.compatibility, next.compatibility, \"compatibility\");\n\tif (impacts.has(\"all\"))\n\t\treturn Object.freeze({ changed: Object.freeze(changed), impacts: Object.freeze([\"all\"] as const) });\n\treturn Object.freeze({ changed: Object.freeze(changed), impacts: Object.freeze([...impacts]) });\n}\n","import type { ResolvedTheme, SemanticToken } from \"./theme.js\";\n\nexport const STATUS_SEGMENT_IDS = [\n\t\"pi\",\n\t\"model\",\n\t\"thinking\",\n\t\"model_effort\",\n\t\"path\",\n\t\"git\",\n\t\"context_pct\",\n\t\"context_bar\",\n\t\"context_total\",\n\t\"auto_compact\",\n\t\"token_in\",\n\t\"token_out\",\n\t\"cache_read\",\n\t\"cache_write\",\n\t\"cost\",\n\t\"time_spent\",\n\t\"time\",\n\t\"hostname\",\n\t\"session\",\n\t\"extension_statuses\",\n] as const;\nexport type StatusSegmentId = (typeof STATUS_SEGMENT_IDS)[number] | (string & {});\nexport type ThinkingLevel = \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\nexport type ContextState = \"low\" | \"medium\" | \"high\" | \"critical\";\n\nexport interface GitSnapshot {\n\treadonly available: boolean;\n\treadonly branch: string | null;\n\treadonly staged: number;\n\treadonly unstaged: number;\n\treadonly untracked: number;\n\treadonly ahead?: number;\n\treadonly behind?: number;\n\treadonly refreshing: boolean;\n\treadonly error?: string;\n}\n\nexport interface ContextSnapshot {\n\treadonly currentTokens?: number;\n\treadonly windowTokens?: number;\n\treadonly percent?: number;\n\treadonly state?: ContextState;\n\treadonly autoCompacting?: boolean;\n\treadonly customCompaction?: string;\n}\n\nexport interface UsageSnapshot {\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n\treadonly cacheReadTokens: number;\n\treadonly cacheWriteTokens: number;\n\treadonly cost?: number;\n\treadonly currency?: string;\n\treadonly subscriptionMode?: \"api\" | \"subscription\" | \"unknown\";\n\treadonly streaming: boolean;\n}\n\nexport interface ExtensionStatus {\n\treadonly key: string;\n\treadonly value: string;\n}\n\nexport interface StatusSnapshot {\n\treadonly model?: string;\n\t/** Provider name for the active model (e.g. `deepseek`), when known. */\n\treadonly provider?: string;\n\t/** Whether the active model supports reasoning/thinking levels, when known. */\n\treadonly reasoning?: boolean;\n\treadonly thinkingLevel?: ThinkingLevel;\n\treadonly cwd?: string;\n\treadonly git?: GitSnapshot;\n\treadonly context?: ContextSnapshot;\n\treadonly usage?: UsageSnapshot;\n\treadonly hostname?: string;\n\treadonly sessionName?: string | undefined;\n\treadonly sessionId?: string | undefined;\n\treadonly sessionStartedAt?: number;\n\treadonly extensionStatuses?: readonly ExtensionStatus[];\n}\n\nexport interface StatusSegmentOptions {\n\treadonly disabled?: boolean;\n\treadonly label?: string;\n\treadonly [key: string]: unknown;\n}\n\nexport interface StatusCustomItem {\n\treadonly id: string;\n\treadonly statusKey: string;\n\treadonly label?: string;\n\treadonly priority?: number;\n\treadonly placement?: \"left\" | \"right\" | \"secondary\";\n}\n\nexport interface SegmentContext {\n\treadonly snapshot: StatusSnapshot;\n\treadonly theme: ResolvedTheme;\n\treadonly options: Readonly<Record<string, StatusSegmentOptions | undefined>>;\n\treadonly width: number;\n}\n\nexport interface SegmentRenderResult {\n\treadonly visible: boolean;\n\treadonly content: string;\n\treadonly compactContent?: string;\n\treadonly minWidth?: number;\n\treadonly truncatable?: boolean;\n}\n\nexport interface StatusSegment {\n\treadonly id: StatusSegmentId;\n\treadonly defaultPriority: number;\n\treadonly essential?: boolean;\n\treadonly overflow?: \"primary\" | \"secondary\" | \"drop\";\n\trender(context: SegmentContext): SegmentRenderResult;\n}\n\nexport interface StatusLayout {\n\treadonly left: readonly StatusSegmentId[];\n\treadonly right: readonly StatusSegmentId[];\n\treadonly secondary: readonly StatusSegmentId[];\n}\n\nexport interface StatusRenderResult {\n\treadonly primary: string;\n\treadonly secondary?: string;\n\treadonly lines: readonly string[];\n\treadonly visibleSegments: readonly StatusSegmentId[];\n}\n\nfunction segment(\n\tid: StatusSegmentId,\n\tpriority: number,\n\trender: StatusSegment[\"render\"],\n\tessential = false,\n): StatusSegment {\n\treturn { id, defaultPriority: priority, essential, overflow: essential ? \"primary\" : \"secondary\", render };\n}\n\nexport function createBuiltinSegments(): ReadonlyMap<StatusSegmentId, StatusSegment> {\n\tconst segments: StatusSegment[] = [\n\t\tsegment(\"pi\", 10, ({ theme }) => ({\n\t\t\tvisible: true,\n\t\t\tcontent: theme.apply(\"accent\", `${theme.glyph(\"pi\")} pi`),\n\t\t\tcompactContent: theme.apply(\"accent\", theme.glyph(\"pi\")),\n\t\t})),\n\t\tsegment(\n\t\t\t\"model\",\n\t\t\t100,\n\t\t\t({ snapshot, theme }) => ({\n\t\t\t\tvisible: Boolean(snapshot.model),\n\t\t\t\tcontent: theme.apply(\"model\", snapshot.model ?? \"\"),\n\t\t\t\tcompactContent: theme.apply(\"model\", snapshot.model ?? \"\"),\n\t\t\t\ttruncatable: true,\n\t\t\t}),\n\t\t\ttrue,\n\t\t),\n\t\tsegment(\n\t\t\t\"model_effort\",\n\t\t\t40,\n\t\t\t({ snapshot, theme }) => {\n\t\t\t\tconst model = snapshot.model;\n\t\t\t\tif (!model) return { visible: false, content: \"\" };\n\t\t\t\tconst label = snapshot.provider ? `(${snapshot.provider}) ${model}` : model;\n\t\t\t\tconst styledLabel = theme.apply(\"model\", label);\n\t\t\t\tconst effort = effortLevel(snapshot);\n\t\t\t\tif (!effort) {\n\t\t\t\t\treturn { visible: true, content: styledLabel, compactContent: theme.apply(\"model\", model) };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tcontent: `${styledLabel} ${theme.apply(\"separator\", \"•\")} ${styleEffort(theme, effort)}`,\n\t\t\t\t\tcompactContent: theme.apply(\"model\", model),\n\t\t\t\t};\n\t\t\t},\n\t\t\tfalse,\n\t\t),\n\t\tsegment(\n\t\t\t\"thinking\",\n\t\t\t95,\n\t\t\t({ snapshot, theme }) => {\n\t\t\t\tconst level = snapshot.thinkingLevel;\n\t\t\t\tif (!level) return { visible: false, content: \"\" };\n\t\t\t\tconst label = thinkingLabel(level);\n\t\t\t\tconst text = `think:${label}`;\n\t\t\t\tconst compactText = `t:${label}`;\n\t\t\t\tif (level === \"high\" || level === \"xhigh\" || level === \"max\") {\n\t\t\t\t\treturn { visible: true, content: theme.rainbow(text), compactContent: theme.rainbow(compactText) };\n\t\t\t\t}\n\t\t\t\tconst token =\n\t\t\t\t\tlevel === \"minimal\"\n\t\t\t\t\t\t? \"thinkingMinimal\"\n\t\t\t\t\t\t: level === \"low\"\n\t\t\t\t\t\t\t? \"thinkingLow\"\n\t\t\t\t\t\t\t: level === \"medium\"\n\t\t\t\t\t\t\t\t? \"thinkingMedium\"\n\t\t\t\t\t\t\t\t: \"thinking\";\n\t\t\t\treturn {\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tcontent: theme.apply(token, text),\n\t\t\t\t\tcompactContent: theme.apply(token, compactText),\n\t\t\t\t};\n\t\t\t},\n\t\t\ttrue,\n\t\t),\n\t\tsegment(\"path\", 80, ({ snapshot, theme }) => {\n\t\t\tconst name = snapshot.cwd?.split(/[\\\\/]/).filter(Boolean).at(-1) ?? snapshot.cwd;\n\t\t\treturn {\n\t\t\t\tvisible: Boolean(snapshot.cwd),\n\t\t\t\tcontent: theme.apply(\"path\", name ?? \"\"),\n\t\t\t\tcompactContent: theme.apply(\"path\", name ?? \"\"),\n\t\t\t\ttruncatable: true,\n\t\t\t};\n\t\t}),\n\t\tsegment(\"git\", 75, ({ snapshot, theme }) => {\n\t\t\tconst git = snapshot.git;\n\t\t\tif (!git?.available || !git.branch) return { visible: false, content: \"\" };\n\t\t\tconst counts = `${git.staged ? ` +${git.staged}` : \"\"}${git.unstaged ? ` *${git.unstaged}` : \"\"}${git.untracked ? ` ?${git.untracked}` : \"\"}`;\n\t\t\tconst token = git.staged || git.unstaged || git.untracked ? \"gitDirty\" : \"gitClean\";\n\t\t\treturn {\n\t\t\t\tvisible: true,\n\t\t\t\tcontent: theme.apply(token, `${theme.glyph(\"git\")} ${git.branch}${counts}`),\n\t\t\t\tcompactContent: theme.apply(token, `${theme.glyph(\"git\")} ${git.branch}`),\n\t\t\t};\n\t\t}),\n\t\tsegment(\n\t\t\t\"context_pct\",\n\t\t\t90,\n\t\t\t({ snapshot, theme }) => {\n\t\t\t\tconst percent = contextPercent(snapshot.context ?? {});\n\t\t\t\tconst state = contextState(percent);\n\t\t\t\tconst token =\n\t\t\t\t\tstate === \"critical\"\n\t\t\t\t\t\t? \"contextCritical\"\n\t\t\t\t\t\t: state === \"high\"\n\t\t\t\t\t\t\t? \"contextHigh\"\n\t\t\t\t\t\t\t: state === \"medium\"\n\t\t\t\t\t\t\t\t? \"contextMedium\"\n\t\t\t\t\t\t\t\t: \"contextLow\";\n\t\t\t\treturn {\n\t\t\t\t\tvisible: percent !== undefined,\n\t\t\t\t\tcontent: percent === undefined ? \"\" : theme.apply(token, `ctx:${Math.round(percent)}%`),\n\t\t\t\t\tcompactContent: percent === undefined ? \"\" : theme.apply(token, `${Math.round(percent)}%`),\n\t\t\t\t};\n\t\t\t},\n\t\t\ttrue,\n\t\t),\n\t\tsegment(\"context_bar\", 70, ({ snapshot, theme, options }) => {\n\t\t\tconst percent = contextPercent(snapshot.context ?? {});\n\t\t\tif (percent === undefined) return { visible: false, content: \"\" };\n\t\t\tconst token = contextBarToken(percent);\n\t\t\tconst window = snapshot.context?.windowTokens;\n\t\t\tconst label = `ctx${window !== undefined ? ` (${formatTokens(window)})` : \"\"}:`;\n\t\t\tconst width = (options[\"context_bar\"]?.width as number | undefined) ?? CONTEXT_BAR_WIDTH;\n\t\t\treturn {\n\t\t\t\tvisible: true,\n\t\t\t\tcontent: `${theme.apply(\"muted\", label)} ${theme.apply(token, contextBar(percent, width))} ${theme.apply(token, `${Math.round(percent)}%`)}`,\n\t\t\t\tcompactContent: theme.apply(token, `${Math.round(percent)}%`),\n\t\t\t};\n\t\t}),\n\t\tsegment(\"context_total\", 60, ({ snapshot, theme }) => ({\n\t\t\tvisible: snapshot.context?.currentTokens !== undefined && snapshot.context.windowTokens !== undefined,\n\t\t\tcontent:\n\t\t\t\tsnapshot.context?.currentTokens !== undefined && snapshot.context.windowTokens !== undefined\n\t\t\t\t\t? theme.apply(\"contextLow\", `${snapshot.context.currentTokens}/${snapshot.context.windowTokens}`)\n\t\t\t\t\t: \"\",\n\t\t})),\n\t\tsegment(\"auto_compact\", 55, ({ snapshot, theme }) => ({\n\t\t\tvisible: Boolean(snapshot.context?.autoCompacting || snapshot.context?.customCompaction),\n\t\t\tcontent: theme.apply(\"warning\", snapshot.context?.customCompaction ?? \"compacting\"),\n\t\t\tcompactContent: theme.apply(\"warning\", \"compact\"),\n\t\t})),\n\t\tsegment(\"token_in\", 50, ({ snapshot, theme }) => ({\n\t\t\tvisible: snapshot.usage?.inputTokens !== undefined,\n\t\t\tcontent: theme.apply(\"tokens\", `in:${snapshot.usage?.inputTokens ?? 0}`),\n\t\t\tcompactContent: theme.apply(\"tokens\", `i:${snapshot.usage?.inputTokens ?? 0}`),\n\t\t})),\n\t\tsegment(\"token_out\", 50, ({ snapshot, theme }) => ({\n\t\t\tvisible: snapshot.usage?.outputTokens !== undefined,\n\t\t\tcontent: theme.apply(\"tokens\", `out:${snapshot.usage?.outputTokens ?? 0}`),\n\t\t\tcompactContent: theme.apply(\"tokens\", `o:${snapshot.usage?.outputTokens ?? 0}`),\n\t\t})),\n\t\tsegment(\"cache_read\", 40, ({ snapshot, theme }) => ({\n\t\t\tvisible: Boolean(snapshot.usage?.cacheReadTokens),\n\t\t\tcontent: theme.apply(\"cache\", `cache:${snapshot.usage?.cacheReadTokens ?? 0}`),\n\t\t\tcompactContent: theme.apply(\"cache\", `cr:${snapshot.usage?.cacheReadTokens ?? 0}`),\n\t\t})),\n\t\tsegment(\"cache_write\", 35, ({ snapshot, theme }) => ({\n\t\t\tvisible: Boolean(snapshot.usage?.cacheWriteTokens),\n\t\t\tcontent: theme.apply(\"cache\", `cw:${snapshot.usage?.cacheWriteTokens ?? 0}`),\n\t\t})),\n\t\tsegment(\"cost\", 65, ({ snapshot, theme }) => {\n\t\t\tconst cost = snapshot.usage?.cost;\n\t\t\tconst content = cost === undefined || cost <= 0 ? \"\" : theme.apply(\"cost\", `$${cost.toFixed(3)}`);\n\t\t\treturn { visible: Boolean(content), content, compactContent: content };\n\t\t}),\n\t\tsegment(\"time_spent\", 25, ({ snapshot, theme }) => ({\n\t\t\tvisible: snapshot.sessionStartedAt !== undefined,\n\t\t\tcontent:\n\t\t\t\tsnapshot.sessionStartedAt === undefined\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: theme.apply(\"time\", formatElapsed(Date.now() - snapshot.sessionStartedAt)),\n\t\t\tcompactContent:\n\t\t\t\tsnapshot.sessionStartedAt === undefined\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: theme.apply(\"time\", formatElapsed(Date.now() - snapshot.sessionStartedAt)),\n\t\t})),\n\t\tsegment(\"time\", 20, ({ theme }) => ({\n\t\t\tvisible: true,\n\t\t\tcontent: theme.apply(\"time\", new Date().toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" })),\n\t\t\tcompactContent: theme.apply(\"time\", new Date().toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" })),\n\t\t})),\n\t\tsegment(\"hostname\", 20, ({ snapshot, theme }) => ({\n\t\t\tvisible: Boolean(snapshot.hostname),\n\t\t\tcontent: theme.apply(\"muted\", snapshot.hostname ?? \"\"),\n\t\t})),\n\t\tsegment(\"session\", 20, ({ snapshot, theme }) => ({\n\t\t\tvisible: Boolean(snapshot.sessionName || snapshot.sessionId),\n\t\t\tcontent: theme.apply(\"muted\", snapshot.sessionName ?? snapshot.sessionId ?? \"\"),\n\t\t})),\n\t\tsegment(\"extension_statuses\", 30, ({ snapshot, theme }) => {\n\t\t\tconst statuses = snapshot.extensionStatuses;\n\t\t\tif (!statuses || statuses.length === 0) return { visible: false, content: \"\" };\n\t\t\t// Values already carry their display label (extensions publish via\n\t\t\t// `ctx.ui.setStatus(key, text)` where text is the visible string).\n\t\t\t// Mirror Pi's native footer: sort by key, join the values only.\n\t\t\tconst text = [...statuses]\n\t\t\t\t.sort((a, b) => a.key.localeCompare(b.key))\n\t\t\t\t.map((item) => item.value)\n\t\t\t\t.join(\" \");\n\t\t\treturn { visible: true, content: theme.apply(\"muted\", text) };\n\t\t}),\n\t];\n\treturn new Map(segments.map((item) => [item.id, item]));\n}\n\nconst CONTEXT_BAR_WIDTH = 10;\n\nfunction contextBar(percent: number, width = CONTEXT_BAR_WIDTH): string {\n\tconst filled = Math.max(0, Math.min(width, Math.round((percent / 100) * width)));\n\treturn \"█\".repeat(filled) + \"░\".repeat(width - filled);\n}\n\n/** Bar colors: green under 50%, yellow from 50% to 70%, red above 70%. */\nfunction contextBarToken(percent: number): SemanticToken {\n\tif (percent > 70) return \"error\";\n\tif (percent >= 50) return \"warning\";\n\treturn \"success\";\n}\n\nfunction formatTokens(value: number): string {\n\tif (value >= 1_000_000) {\n\t\tconst millions = value / 1_000_000;\n\t\treturn `${Number.isInteger(millions) ? millions : millions.toFixed(1)}M`;\n\t}\n\tif (value >= 1_000) {\n\t\tconst thousands = value / 1_000;\n\t\treturn `${Number.isInteger(thousands) ? thousands : thousands.toFixed(1)}K`;\n\t}\n\treturn String(value);\n}\n\nfunction effortLevel(snapshot: StatusSnapshot): ThinkingLevel | undefined {\n\tconst level = snapshot.thinkingLevel;\n\tif (!level) return undefined;\n\t// Reasoning models always surface an effort level (defaulting to off); other\n\t// models only show a level when one is actively set.\n\tif (snapshot.reasoning === true) return level;\n\treturn level === \"off\" ? undefined : level;\n}\n\nfunction styleEffort(theme: ResolvedTheme, level: ThinkingLevel): string {\n\tif (level === \"high\" || level === \"xhigh\" || level === \"max\") return theme.rainbow(level);\n\tconst token =\n\t\tlevel === \"minimal\"\n\t\t\t? \"thinkingMinimal\"\n\t\t\t: level === \"low\"\n\t\t\t\t? \"thinkingLow\"\n\t\t\t\t: level === \"medium\"\n\t\t\t\t\t? \"thinkingMedium\"\n\t\t\t\t\t: \"thinking\";\n\treturn theme.apply(token, level);\n}\n\nfunction formatElapsed(ms: number): string {\n\tconst seconds = Math.max(0, Math.floor(ms / 1000));\n\treturn `${Math.floor(seconds / 3600)}:${String(Math.floor((seconds % 3600) / 60)).padStart(2, \"0\")}:${String(seconds % 60).padStart(2, \"0\")}`;\n}\n\nfunction thinkingLabel(level: ThinkingLevel): string {\n\treturn level === \"minimal\" ? \"min\" : level === \"medium\" ? \"med\" : level;\n}\n\nexport function contextState(percent: number | undefined): ContextState | undefined {\n\tif (percent === undefined || !Number.isFinite(percent)) return undefined;\n\tif (percent >= 90) return \"critical\";\n\tif (percent >= 75) return \"high\";\n\tif (percent >= 50) return \"medium\";\n\treturn \"low\";\n}\n\nexport function normalizeThinkingLevel(value: unknown): ThinkingLevel {\n\treturn [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(value as string)\n\t\t? (value as ThinkingLevel)\n\t\t: \"off\";\n}\n\nexport function contextPercent(\n\tvalue: Pick<ContextSnapshot, \"currentTokens\" | \"windowTokens\" | \"percent\">,\n): number | undefined {\n\tconst percent =\n\t\tvalue.percent ??\n\t\t(value.currentTokens !== undefined && value.windowTokens\n\t\t\t? (value.currentTokens / value.windowTokens) * 100\n\t\t\t: undefined);\n\treturn percent === undefined ? undefined : Math.max(0, Math.min(100, percent));\n}\n\nexport function contextSemanticToken(state: ContextState): SemanticToken {\n\treturn state === \"critical\"\n\t\t? \"contextCritical\"\n\t\t: state === \"high\"\n\t\t\t? \"contextHigh\"\n\t\t\t: state === \"medium\"\n\t\t\t\t? \"contextMedium\"\n\t\t\t\t: \"contextLow\";\n}\n","import type { ExtensionUIContext } from \"@earendil-works/pi-coding-agent\";\nimport { CustomEditor } from \"@earendil-works/pi-coding-agent\";\nimport { type EditorComponent, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { NormalizedPiStyleConfig } from \"../../domain/config-types.js\";\nimport { contextPercent, type StatusSnapshot, type ThinkingLevel } from \"../../domain/status.js\";\nimport type { ResolvedTheme } from \"../../domain/theme.js\";\nimport { resolveTheme } from \"../../domain/theme.js\";\nimport { stripAnsi, truncateAnsi } from \"../../shared/ansi.js\";\n\nexport const EDITOR_DIAGNOSTIC_KEY = \"pi-style.editor\";\ntype SetEditorComponent = NonNullable<ExtensionUIContext[\"setEditorComponent\"]>;\ntype EditorFactory = NonNullable<Parameters<SetEditorComponent>[0]>;\ntype Tui = Parameters<EditorFactory>[0];\ntype PiEditorTheme = Parameters<EditorFactory>[1];\ntype Keybindings = Parameters<EditorFactory>[2];\ntype EditorHost = Pick<ExtensionUIContext, \"setEditorComponent\"> & {\n\tgetEditorComponent?: () => EditorFactory | undefined;\n\tnotify?: (message: string, type?: \"info\" | \"warning\" | \"error\") => void;\n\t/** Full Pi theme; provides thinking-level border colors when available. */\n\treadonly theme?: { getThinkingBorderColor?: (level: ThinkingLevel) => (str: string) => string };\n};\n\nexport interface EditorInstallation {\n\treadonly generation: number;\n\treadonly installedFactory: EditorFactory;\n\treadonly previousFactory: EditorFactory | undefined;\n\treadonly preservedPrevious: boolean;\n\tupdate(snapshot: StatusSnapshot): void;\n\tconfigure(config: NormalizedPiStyleConfig): void;\n\tdispose(): void;\n}\n\ninterface EditorOptions {\n\tconfig: NormalizedPiStyleConfig;\n\tsnapshot: StatusSnapshot;\n\ttheme: PiEditorTheme;\n\t/** Full Pi theme for thinking-level border colors (optional; falls back to borderColor). */\n\tfullTheme?: { getThinkingBorderColor?: (level: ThinkingLevel) => (str: string) => string };\n\tonSnapshot: (snapshot: StatusSnapshot) => void;\n}\n\nconst widthOf = visibleWidth;\n\nfunction widthSafe(value: string, width: number): string {\n\tif (width <= 0) return \"\";\n\tconst fitted = widthOf(value) > width ? truncateAnsi(value, width, \"\") : value;\n\tconst current = widthOf(fitted);\n\treturn current < width ? fitted + \" \".repeat(width - current) : fitted;\n}\n\nfunction isNativeBorderLine(line: string): boolean {\n\tconst stripped = stripAnsi(line);\n\treturn /^─{2,}$/.test(stripped) || /^─── [↑↓] \\d+ more /.test(stripped);\n}\n\nfunction semanticTheme(theme: PiEditorTheme, config: NormalizedPiStyleConfig): ResolvedTheme {\n\tconst editorTheme = theme;\n\treturn resolveTheme(\n\t\t{\n\t\t\tfg: (token) => {\n\t\t\t\tif (token === \"borderActive\" || token.startsWith(\"thinking\")) return editorTheme.borderColor(\"\");\n\t\t\t\treturn \"\";\n\t\t\t},\n\t\t},\n\t\tconfig,\n\t);\n}\n\n/**\n * A thin CustomEditor treatment: all text, cursor, paste, autocomplete, history,\n * and keybinding state remains owned by Pi's editor implementation.\n */\nexport class StyledEditor extends CustomEditor implements EditorComponent {\n\tprivate config: NormalizedPiStyleConfig;\n\tprivate snapshot: StatusSnapshot;\n\tprivate readonly piTheme: PiEditorTheme;\n\tprivate readonly fullTheme: EditorOptions[\"fullTheme\"];\n\tprivate readonly onSnapshot: (snapshot: StatusSnapshot) => void;\n\tprivate semantic: ResolvedTheme;\n\tprivate disposed = false;\n\n\tconstructor(tui: Tui, theme: PiEditorTheme, keybindings: Keybindings, options: EditorOptions) {\n\t\tsuper(tui, theme, keybindings);\n\t\tthis.config = options.config;\n\t\tthis.snapshot = options.snapshot;\n\t\tthis.piTheme = theme;\n\t\tthis.fullTheme = options.fullTheme;\n\t\tthis.onSnapshot = options.onSnapshot;\n\t\tthis.semantic = semanticTheme(theme, options.config);\n\t\tthis.setPaddingX(0);\n\t}\n\n\tupdate(snapshot: StatusSnapshot): void {\n\t\tif (this.disposed) return;\n\t\tthis.snapshot = snapshot;\n\t\tthis.invalidate();\n\t}\n\n\tconfigure(config: NormalizedPiStyleConfig): void {\n\t\tif (this.disposed) return;\n\t\tthis.config = config;\n\t\tthis.semantic = semanticTheme(this.piTheme, config);\n\t\tthis.invalidate();\n\t}\n\n\toverride handleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tsuper.handleInput(data);\n\t\tthis.onSnapshot({ ...this.snapshot });\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.semantic = semanticTheme(this.piTheme, this.config);\n\t\tthis.tui.requestRender();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (width <= 0) return [];\n\t\tconst nativeLines = super.render(width);\n\t\t// Autocomplete (slash menu / @-mentions) restructure: Pi draws the\n\t\t// suggestions after its own bottom border, which pushes the below-editor\n\t\t// widgets (status line) down. Re-frame the native output so the dropdown\n\t\t// lives INSIDE the input box, keeping the footer directly below the input.\n\t\t// Native layout: [top border, text lines, bottom border, dropdown lines...].\n\t\tif ((this as unknown as { autocompleteState?: unknown }).autocompleteState) {\n\t\t\tconst prompt = this.prompt();\n\t\t\tconst padding = this.paddingFor(width, this.styleFor(width));\n\t\t\tconst promptWidth = widthOf(prompt) + 1;\n\t\t\tconst prefix = `${\" \".repeat(padding)}${prompt} `;\n\t\t\tconst continuation = \" \".repeat(padding + promptWidth);\n\t\t\tconst borderIndex = nativeLines.slice(1).findIndex((line) => isNativeBorderLine(line));\n\t\t\tconst split = borderIndex >= 0 ? borderIndex + 1 : nativeLines.length;\n\t\t\tconst body = nativeLines.slice(1, split);\n\t\t\tconst dropdown = nativeLines.slice(split);\n\t\t\tconst border = this.borderFor(width);\n\t\t\tconst renderedBody = body.map((line, index) => widthSafe(`${index === 0 ? prefix : continuation}${line}`, width));\n\t\t\treturn [\n\t\t\t\tborder(\"─\".repeat(width)),\n\t\t\t\t...renderedBody,\n\t\t\t\t...dropdown.map((line) => widthSafe(line, width)),\n\t\t\t\tborder(\"─\".repeat(width)),\n\t\t\t];\n\t\t}\n\t\tconst style = this.styleFor(width);\n\t\tif (style === \"native\") return nativeLines.map((line) => widthSafe(line, width));\n\n\t\tconst prompt = this.prompt();\n\t\tconst promptWidth = widthOf(prompt) + 1;\n\t\tconst padding = this.paddingFor(width, style);\n\t\tconst innerWidth = Math.max(1, width - promptWidth - padding * 2);\n\t\tconst innerLines = super.render(innerWidth);\n\t\tif (innerLines.length === 0) return [];\n\n\t\tconst body = innerLines.slice(1, -1);\n\t\tconst prefix = `${\" \".repeat(padding)}${prompt} `;\n\t\tconst continuation = \" \".repeat(padding + promptWidth);\n\t\tconst renderedBody = body.map((line, index) => {\n\t\t\tconst lead = index === 0 ? prefix : continuation;\n\t\t\treturn widthSafe(`${lead}${line}`, width);\n\t\t});\n\t\tconst metadata = this.metadata(width, style);\n\t\tconst framed = this.frame(width, style, renderedBody, metadata);\n\t\treturn framed.map((line) => widthSafe(line, width));\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.invalidate();\n\t}\n\n\tprivate prompt(): string {\n\t\tconst configured = this.config.theme.glyphs.prompt;\n\t\tif (configured) return configured;\n\t\treturn this.semantic.mode === \"ascii\" ? \">\" : \"❯\";\n\t}\n\n\tprivate styleFor(width: number): \"compact\" | \"boxed\" | \"dock\" | \"native\" {\n\t\tif (width < 20) return \"native\";\n\t\tif ([\"compact\", \"boxed\", \"dock\", \"native\"].includes(this.config.editor.style)) {\n\t\t\tif (this.config.editor.style === \"native\") return \"native\";\n\t\t\tif (width < 40 && this.config.editor.style !== \"compact\") return \"compact\";\n\t\t\treturn this.config.editor.style as \"compact\" | \"boxed\" | \"dock\";\n\t\t}\n\t\treturn \"compact\";\n\t}\n\n\tprivate paddingFor(width: number, style: \"compact\" | \"boxed\" | \"dock\" | \"native\"): number {\n\t\tif (width < 50) return 0;\n\t\treturn style === \"boxed\" ? 2 : style === \"dock\" ? 1 : 1;\n\t}\n\n\tprivate borderFor(width: number): (line: string) => string {\n\t\t// Sync the frame color with the active thinking level, matching Pi's native editor.\n\t\tconst level = this.snapshot.thinkingLevel;\n\t\tconst thinking = this.fullTheme?.getThinkingBorderColor?.(level ?? \"off\");\n\t\tconst border = thinking ?? this.piTheme.borderColor;\n\t\treturn (line: string) => border(widthSafe(line, width));\n\t}\n\n\tprivate frame(\n\t\twidth: number,\n\t\tstyle: \"compact\" | \"boxed\" | \"dock\" | \"native\",\n\t\tbody: string[],\n\t\tmetadata: string[],\n\t): string[] {\n\t\tconst border = this.borderFor(width);\n\t\tconst lineMode = this.config.editor.frame === \"line\" || this.config.editor.frame === \"solid\";\n\t\tif (style === \"compact\" || lineMode) {\n\t\t\t// Match Pi's native editor: a horizontal border above and below the input.\n\t\t\treturn [border(\"─\".repeat(width)), ...body, border(\"─\".repeat(width)), ...metadata];\n\t\t}\n\t\tif (style === \"boxed\") {\n\t\t\tconst glyph = this.config.editor.frame === \"halfblock\" ? \"▀\" : \"━\";\n\t\t\treturn [border(glyph.repeat(width)), ...body, border(glyph.repeat(width)), ...metadata];\n\t\t}\n\t\tif (this.config.editor.frame === \"native\") return body;\n\t\treturn [\n\t\t\tborder(`┌${\"─\".repeat(Math.max(0, width - 2))}┐`),\n\t\t\t...body,\n\t\t\tborder(`└${\"─\".repeat(Math.max(0, width - 2))}┘`),\n\t\t\t...metadata,\n\t\t];\n\t}\n\n\tprivate metadata(width: number, style: \"compact\" | \"boxed\" | \"dock\" | \"native\"): string[] {\n\t\tif (!this.config.editor.showMetadata || width < 60) return [];\n\t\tconst percent = contextPercent(this.snapshot.context ?? {});\n\t\tif (percent === undefined) return [];\n\t\tconst label = `ctx ${Math.round(percent)}%`;\n\t\treturn [this.piTheme.borderColor(` ${style === \"boxed\" ? \"· \" : \"\"}${label}`)];\n\t}\n}\n\nexport function installEditor(options: {\n\thost: EditorHost;\n\tconfig: NormalizedPiStyleConfig;\n\tgeneration: number;\n\tinitialSnapshot: StatusSnapshot;\n\tisCurrent?: () => boolean;\n}): EditorInstallation | undefined {\n\tif (!options.host.setEditorComponent) return undefined;\n\tconst previous = options.host.getEditorComponent?.();\n\tif (previous && options.config.compatibility.preferExistingEditor) {\n\t\treturn {\n\t\t\tgeneration: options.generation,\n\t\t\tinstalledFactory: previous,\n\t\t\tpreviousFactory: previous,\n\t\t\tpreservedPrevious: true,\n\t\t\tupdate() {},\n\t\t\tconfigure() {},\n\t\t\tdispose() {},\n\t\t};\n\t}\n\tlet config = options.config;\n\tlet snapshot = options.initialSnapshot;\n\tlet disposed = false;\n\tconst components = new Set<StyledEditor>();\n\tconst factory = ((tui: Tui, theme: PiEditorTheme, keybindings: Keybindings) => {\n\t\tconst editor = new StyledEditor(tui, theme, keybindings, {\n\t\t\tconfig,\n\t\t\tsnapshot,\n\t\t\ttheme,\n\t\t\t...(options.host.theme ? { fullTheme: options.host.theme } : {}),\n\t\t\tonSnapshot: (next) => {\n\t\t\t\tif (!disposed && options.isCurrent?.() !== false) snapshot = next;\n\t\t\t},\n\t\t});\n\t\tcomponents.add(editor);\n\t\treturn editor;\n\t}) as EditorFactory;\n\ttry {\n\t\toptions.host.setEditorComponent(factory);\n\t} catch {\n\t\toptions.host.notify?.(\"pi-style editor unavailable; keeping the native editor\", \"warning\");\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tgeneration: options.generation,\n\t\tinstalledFactory: factory,\n\t\tpreviousFactory: previous,\n\t\tpreservedPrevious: false,\n\t\tupdate(next) {\n\t\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\t\tsnapshot = next;\n\t\t\tfor (const component of components) component.update(next);\n\t\t},\n\t\tconfigure(next) {\n\t\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\t\tconfig = next;\n\t\t\tfor (const component of components) component.configure(next);\n\t\t},\n\t\tdispose() {\n\t\t\tif (disposed) return;\n\t\t\tdisposed = true;\n\t\t\tfor (const component of components) component.dispose();\n\t\t\tcomponents.clear();\n\t\t\tif (options.host.getEditorComponent?.() === factory) {\n\t\t\t\toptions.host.setEditorComponent(previous);\n\t\t\t}\n\t\t},\n\t};\n}\n","import type { NormalizedPiStyleConfig } from \"./config-types.js\";\n\nexport type GlyphMode = \"nerd\" | \"unicode\" | \"ascii\";\nexport type SemanticToken =\n\t| \"surface\"\n\t| \"surfaceRaised\"\n\t| \"surfaceMuted\"\n\t| \"text\"\n\t| \"muted\"\n\t| \"dim\"\n\t| \"accent\"\n\t| \"accentStrong\"\n\t| \"border\"\n\t| \"borderMuted\"\n\t| \"borderActive\"\n\t| \"success\"\n\t| \"warning\"\n\t| \"error\"\n\t| \"model\"\n\t| \"thinking\"\n\t| \"thinkingMinimal\"\n\t| \"thinkingLow\"\n\t| \"thinkingMedium\"\n\t| \"thinkingHigh\"\n\t| \"thinkingXhigh\"\n\t| \"thinkingMax\"\n\t| \"path\"\n\t| \"gitClean\"\n\t| \"gitDirty\"\n\t| \"contextLow\"\n\t| \"contextMedium\"\n\t| \"contextHigh\"\n\t| \"contextCritical\"\n\t| \"tokens\"\n\t| \"cache\"\n\t| \"cost\"\n\t| \"time\"\n\t| \"separator\";\n\n/** Structural view of Pi's theme. fg/bg follow Pi's `(color, text) => string` shape. */\nexport interface ActiveTheme {\n\tfg?: (color: string, text: string) => string;\n\tbg?: (color: string, text: string) => string;\n\tcolors?: Record<string, string>;\n}\n\nexport interface ResolvedTheme {\n\t/** ANSI color prefix for a semantic token, or \"\" when uncolored. */\n\treadonly color: (token: SemanticToken) => string;\n\t/** Prefix + text + reset; returns plain text when the token is uncolored. */\n\treadonly apply: (token: SemanticToken, text: string) => string;\n\t/** Rainbow gradient text (used for high thinking levels); plain when uncolored. */\n\treadonly rainbow: (text: string) => string;\n\treadonly glyph: (name: keyof typeof GLYPHS.unicode) => string;\n\treadonly mode: GlyphMode;\n\treadonly noColor: boolean;\n}\n\n/**\n * Default semantic colors — hex values render without any Pi theme; theme names resolve through Pi's theme.\n */\nconst SEMANTIC_COLORS: Record<SemanticToken, string> = {\n\tsurface: \"\",\n\tsurfaceRaised: \"\",\n\tsurfaceMuted: \"\",\n\ttext: \"text\",\n\tmuted: \"muted\",\n\tdim: \"dim\",\n\taccent: \"accent\",\n\taccentStrong: \"accent\",\n\tborder: \"border\",\n\tborderMuted: \"borderMuted\",\n\tborderActive: \"borderAccent\",\n\tsuccess: \"success\",\n\twarning: \"warning\",\n\terror: \"error\",\n\tmodel: \"#d787af\",\n\tthinking: \"thinkingOff\",\n\tthinkingMinimal: \"thinkingMinimal\",\n\tthinkingLow: \"thinkingLow\",\n\tthinkingMedium: \"thinkingMedium\",\n\tthinkingHigh: \"thinkingHigh\",\n\tthinkingXhigh: \"thinkingXhigh\",\n\tthinkingMax: \"thinkingMax\",\n\tpath: \"#00afaf\",\n\tgitClean: \"success\",\n\tgitDirty: \"warning\",\n\tcontextLow: \"dim\",\n\tcontextMedium: \"warning\",\n\tcontextHigh: \"error\",\n\tcontextCritical: \"error\",\n\ttokens: \"muted\",\n\tcache: \"muted\",\n\tcost: \"text\",\n\ttime: \"muted\",\n\tseparator: \"dim\",\n};\n\nconst GLYPHS = {\n\tnerd: {\n\t\tpi: \"π\",\n\t\tgit: \"\\uE0A0\",\n\t\tpath: \"\\uF07B\",\n\t\tcontext: \"\\u{F035B}\",\n\t\tseparator: \"\\uE0B0\",\n\t\tpowerlineLeft: \"\\uE0B0\",\n\t\tpowerlineRight: \"\\uE0B2\",\n\t\tpowerlineThinLeft: \"\\uE0B1\",\n\t\tpowerlineThinRight: \"\\uE0B3\",\n\t},\n\tunicode: {\n\t\tpi: \"π\",\n\t\tgit: \"⎇\",\n\t\tpath: \"⌂\",\n\t\tcontext: \"◫\",\n\t\tseparator: \"│\",\n\t\tpowerlineLeft: \"›\",\n\t\tpowerlineRight: \"‹\",\n\t\tpowerlineThinLeft: \"│\",\n\t\tpowerlineThinRight: \"│\",\n\t},\n\tascii: {\n\t\tpi: \"pi\",\n\t\tgit: \"git\",\n\t\tpath: \"path\",\n\t\tcontext: \"ctx\",\n\t\tseparator: \"|\",\n\t\tpowerlineLeft: \">\",\n\t\tpowerlineRight: \"<\",\n\t\tpowerlineThinLeft: \"|\",\n\t\tpowerlineThinRight: \"|\",\n\t},\n} as const;\n\nfunction isHex(color: string): color is `#${string}` {\n\treturn /^#[0-9a-fA-F]{6}$/.test(color);\n}\n\nexport function hexToAnsiPrefix(hex: string): string {\n\tconst value = hex.replace(\"#\", \"\");\n\tconst r = Number.parseInt(value.slice(0, 2), 16);\n\tconst g = Number.parseInt(value.slice(2, 4), 16);\n\tconst b = Number.parseInt(value.slice(4, 6), 16);\n\treturn `\\x1b[38;2;${r};${g};${b}m`;\n}\n\n/** Rainbow gradient for high thinking levels. */\nconst RAINBOW_COLORS = [\n\t\"#b281d6\",\n\t\"#d787af\",\n\t\"#febc38\",\n\t\"#e4c00f\",\n\t\"#89d281\",\n\t\"#00afaf\",\n\t\"#178fb9\",\n\t\"#b281d6\",\n] as const;\n\nfunction rainbowAnsi(text: string): string {\n\tlet result = \"\";\n\tlet colorIndex = 0;\n\tfor (const char of text) {\n\t\tif (char === \" \" || char === \":\") {\n\t\t\tresult += char;\n\t\t} else {\n\t\t\tresult += hexToAnsiPrefix(RAINBOW_COLORS[colorIndex % RAINBOW_COLORS.length] ?? \"#b281d6\") + char;\n\t\t\tcolorIndex++;\n\t\t}\n\t}\n\treturn `${result}\\x1b[0m`;\n}\n\nfunction colorPrefixFor(\n\tactive: ActiveTheme | undefined,\n\tconfig: NormalizedPiStyleConfig,\n\tnoColor: boolean,\n\ttoken: SemanticToken,\n): string {\n\tif (noColor) return \"\";\n\tconst raw = config.theme.colors[token] ?? SEMANTIC_COLORS[token];\n\tif (!raw) return \"\";\n\tif (isHex(raw)) return hexToAnsiPrefix(raw);\n\tif (active?.fg) {\n\t\ttry {\n\t\t\t// Pi's fg returns `\\x1b[38;5;Nm` + text + `\\x1b[39m`; keep only the prefix.\n\t\t\tconst styled = active.fg(raw, \"\");\n\t\t\treturn styled.endsWith(\"\\x1b[39m\") ? styled.slice(0, -5) : styled;\n\t\t} catch {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\treturn \"\";\n}\n\nexport function detectGlyphMode(\n\tconfig: NormalizedPiStyleConfig,\n\tenv: Record<string, string | undefined> = {},\n): GlyphMode {\n\tif (env.PI_STYLE_NERD_FONTS === \"1\") return \"nerd\";\n\tif (env.PI_STYLE_NERD_FONTS === \"0\") return \"unicode\";\n\tif (config.theme.nerdFonts === \"on\") return \"nerd\";\n\tif (config.theme.nerdFonts === \"off\") return \"unicode\";\n\tif (env.GHOSTTY_RESOURCES_DIR) return \"nerd\";\n\t// Conservative heuristic: known terminals commonly ship with a Nerd Font. An explicit override stays authoritative.\n\tconst term = (env.TERM_PROGRAM ?? \"\").toLowerCase();\n\tif ([\"iterm\", \"wezterm\", \"kitty\", \"ghostty\", \"alacritty\", \"warp\"].some((name) => term.includes(name))) {\n\t\treturn \"nerd\";\n\t}\n\treturn config.preset === \"ascii\" ? \"ascii\" : \"unicode\";\n}\n\nexport function resolveTheme(\n\tactive: ActiveTheme | undefined,\n\tconfig: NormalizedPiStyleConfig,\n\tenv: Record<string, string | undefined> = {},\n): ResolvedTheme {\n\tconst noColor = Object.hasOwn(env, \"NO_COLOR\") && env.NO_COLOR !== \"\" && config.theme.colors.colorOverride !== \"on\";\n\tconst mode = config.preset === \"ascii\" ? \"ascii\" : detectGlyphMode(config, env);\n\tconst color = (token: SemanticToken) => colorPrefixFor(active, config, noColor, token);\n\treturn {\n\t\tmode,\n\t\tnoColor,\n\t\tcolor,\n\t\tapply: (token, text) => {\n\t\t\tconst prefix = color(token);\n\t\t\treturn prefix ? `${prefix}${text}\\x1b[0m` : text;\n\t\t},\n\t\trainbow: (text) => (noColor ? text : rainbowAnsi(text)),\n\t\tglyph: (name) => config.theme.glyphs[name] ?? GLYPHS[mode][name],\n\t};\n}\nexport { GLYPHS };\n","function isFinal(byte: string): boolean {\n\treturn byte >= \"@\" && byte <= \"~\";\n}\n\nconst CUBE_STEPS = [0, 95, 135, 175, 215, 255] as const;\n\nfunction xterm256ToRgb(index: number): { r: number; g: number; b: number } | undefined {\n\tif (index >= 0 && index < 16) {\n\t\t// Base 16 palette approximation used by the gradient logic.\n\t\tconst base = [\n\t\t\t[0, 0, 0],\n\t\t\t[128, 0, 0],\n\t\t\t[0, 128, 0],\n\t\t\t[128, 128, 0],\n\t\t\t[0, 0, 128],\n\t\t\t[128, 0, 128],\n\t\t\t[0, 128, 128],\n\t\t\t[192, 192, 192],\n\t\t\t[128, 128, 128],\n\t\t\t[255, 0, 0],\n\t\t\t[0, 255, 0],\n\t\t\t[255, 255, 0],\n\t\t\t[0, 0, 255],\n\t\t\t[255, 0, 255],\n\t\t\t[0, 255, 255],\n\t\t\t[255, 255, 255],\n\t\t] as const;\n\t\tconst entry = base[index] ?? [0, 0, 0];\n\t\tconst [r, g, b] = entry;\n\t\treturn { r, g, b };\n\t}\n\tif (index >= 16 && index < 232) {\n\t\tconst cube = index - 16;\n\t\treturn {\n\t\t\tr: CUBE_STEPS[Math.floor(cube / 36)] ?? 0,\n\t\t\tg: CUBE_STEPS[Math.floor((cube % 36) / 6)] ?? 0,\n\t\t\tb: CUBE_STEPS[cube % 6] ?? 0,\n\t\t};\n\t}\n\tif (index >= 232 && index < 256) {\n\t\tconst gray = 8 + 10 * (index - 232);\n\t\treturn { r: gray, g: gray, b: gray };\n\t}\n\treturn undefined;\n}\n\n/**\n * Parse an ANSI foreground prefix into RGB. Supports 24-bit `38;2;r;g;b` and\n * 256-color `38;5;N` forms; returns undefined when the prefix is empty or not\n * a foreground color (e.g. `38;5;Nm` reset fragments).\n */\nexport function parseAnsiFgToRgb(prefix: string): { r: number; g: number; b: number } | undefined {\n\tconst esc = \"\\u001b\";\n\tconst direct = new RegExp(`^${esc}\\\\[38;2;(\\\\d{1,3});(\\\\d{1,3});(\\\\d{1,3})m$`).exec(prefix);\n\tif (direct) {\n\t\tconst r = Number.parseInt(direct[1] ?? \"0\", 10);\n\t\tconst g = Number.parseInt(direct[2] ?? \"0\", 10);\n\t\tconst b = Number.parseInt(direct[3] ?? \"0\", 10);\n\t\tif (r <= 255 && g <= 255 && b <= 255) return { r, g, b };\n\t}\n\tconst indexed = new RegExp(`^${esc}\\\\[38;5;(\\\\d{1,3})m$`).exec(prefix);\n\tif (indexed) {\n\t\tconst index = Number.parseInt(indexed[1] ?? \"0\", 10);\n\t\tif (index <= 255) return xterm256ToRgb(index);\n\t}\n\treturn undefined;\n}\nexport function stripAnsi(value: string): string {\n\tlet output = \"\";\n\tfor (let i = 0; i < value.length; i++) {\n\t\tif (value.charCodeAt(i) !== 27) {\n\t\t\toutput += value[i];\n\t\t\tcontinue;\n\t\t}\n\t\ti++;\n\t\tif (value[i] === \"[\") {\n\t\t\twhile (i + 1 < value.length && !isFinal(value[i + 1] ?? \"\")) i++;\n\t\t\ti++;\n\t\t} else if (value[i] === \"]\") {\n\t\t\twhile (i + 1 < value.length && value.charCodeAt(i + 1) !== 7) {\n\t\t\t\ti++;\n\t\t\t\tif (value.charCodeAt(i) === 27 && value[i + 1] === \"\\\\\") {\n\t\t\t\t\ti++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn output;\n}\nexport function visibleWidth(value: string): number {\n\treturn [...stripAnsi(value)].length;\n}\nexport function resetAnsi(value: string): string {\n\treturn `${value}\\x1b[0m`;\n}\n\n/** Return the value unchanged when it fits the width; truncate it otherwise. */\nexport function fitAnsiWidth(value: string, width: number, ellipsis = \"…\"): string {\n\treturn visibleWidth(value) <= width ? value : truncateAnsi(value, width, ellipsis);\n}\nexport function truncateAnsi(value: string, width: number, ellipsis = \"…\"): string {\n\tif (width <= 0) return \"\";\n\tif (visibleWidth(value) <= width) return resetAnsi(value);\n\tlet output = \"\";\n\tlet visible = 0;\n\tfor (let i = 0; i < value.length && visible < width - visibleWidth(ellipsis); i++) {\n\t\tif (value.charCodeAt(i) === 27) {\n\t\t\tconst start = i;\n\t\t\ti++;\n\t\t\twhile (i + 1 < value.length && !isFinal(value[i + 1] ?? \"\")) i++;\n\t\t\ti++;\n\t\t\toutput += value.slice(start, i + 1);\n\t\t\tcontinue;\n\t\t}\n\t\toutput += value[i];\n\t\tvisible++;\n\t}\n\treturn resetAnsi(output + ellipsis);\n}\nexport function wrapAnsi(value: string, width: number): string[] {\n\tif (width <= 0) return [\"\"];\n\tconst lines: string[] = [];\n\tlet line = \"\";\n\tfor (const word of value.split(/\\s+/)) {\n\t\tconst next = line ? `${line} ${word}` : word;\n\t\tif (visibleWidth(next) <= width) line = next;\n\t\telse {\n\t\t\tif (line) lines.push(resetAnsi(line));\n\t\t\tline = truncateAnsi(word, width);\n\t\t}\n\t}\n\tif (line || lines.length === 0) lines.push(resetAnsi(line));\n\treturn lines;\n}\n\n// ── Hex color + background helpers ──\n\nexport const RESET_BACKGROUND = \"\\x1b[49m\";\nexport const ERASE_TO_END_OF_LINE = \"\\x1b[K\";\nconst ESC = \"\\x1b\";\n\nexport function isHexColor(value: string): boolean {\n\tconst cleaned = value.replace(\"#\", \"\");\n\treturn cleaned.length === 3\n\t\t? /^[0-9a-fA-F]{3}$/.test(cleaned)\n\t\t: (cleaned.length === 6 || cleaned.length === 8) && /^[0-9a-fA-F]+$/.test(cleaned);\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n\tconst cleaned = hex.replace(\"#\", \"\");\n\tif (cleaned.length === 3) {\n\t\tconst r = Number.parseInt((cleaned[0] ?? \"\") + (cleaned[0] ?? \"\"), 16);\n\t\tconst g = Number.parseInt((cleaned[1] ?? \"\") + (cleaned[1] ?? \"\"), 16);\n\t\tconst b = Number.parseInt((cleaned[2] ?? \"\") + (cleaned[2] ?? \"\"), 16);\n\t\treturn { r, g, b };\n\t}\n\tif ((cleaned.length !== 6 && cleaned.length !== 8) || !/^[0-9a-fA-F]+$/.test(cleaned)) {\n\t\treturn { r: 0, g: 0, b: 0 };\n\t}\n\tconst r = Number.parseInt(cleaned.slice(0, 2), 16);\n\tconst g = Number.parseInt(cleaned.slice(2, 4), 16);\n\tconst b = Number.parseInt(cleaned.slice(4, 6), 16);\n\treturn { r, g, b };\n}\n\nfunction channelToHex(value: number): string {\n\treturn Math.max(0, Math.min(255, Math.round(value)))\n\t\t.toString(16)\n\t\t.padStart(2, \"0\");\n}\n\nexport function rgbToHex(rgb: { r: number; g: number; b: number }): string {\n\treturn `#${channelToHex(rgb.r)}${channelToHex(rgb.g)}${channelToHex(rgb.b)}`;\n}\n\nconst CUBE_VALUES = [0, 95, 135, 175, 215, 255] as const;\nconst GRAY_VALUES = Array.from({ length: 24 }, (_, i) => 8 + i * 10);\n\nfunction _ansi256ToRgb(index: number): { r: number; g: number; b: number } {\n\tif (index >= 232) {\n\t\tconst gray = 8 + (index - 232) * 10;\n\t\treturn { r: gray, g: gray, b: gray };\n\t}\n\tconst cubeIndex = Math.max(0, index - 16);\n\tconst redIndex = Math.floor(cubeIndex / 36);\n\tconst greenIndex = Math.floor((cubeIndex % 36) / 6);\n\tconst blueIndex = cubeIndex % 6;\n\treturn { r: CUBE_VALUES[redIndex] ?? 0, g: CUBE_VALUES[greenIndex] ?? 0, b: CUBE_VALUES[blueIndex] ?? 0 };\n}\n\nconst _ANSI_16_RGB: ReadonlyArray<readonly [number, number, number]> = [\n\t[0, 0, 0],\n\t[128, 0, 0],\n\t[0, 128, 0],\n\t[128, 128, 0],\n\t[0, 0, 128],\n\t[128, 0, 128],\n\t[0, 128, 128],\n\t[192, 192, 192],\n\t[128, 128, 128],\n\t[255, 0, 0],\n\t[0, 255, 0],\n\t[255, 255, 0],\n\t[0, 0, 255],\n\t[255, 0, 255],\n\t[0, 255, 255],\n\t[255, 255, 255],\n] as const;\n\nfunction colorDistance(r1: number, g1: number, b1: number, r2: number, g2: number, b2: number): number {\n\tconst dr = r1 - r2;\n\tconst dg = g1 - g2;\n\tconst db = b1 - b2;\n\treturn dr * dr * 0.299 + dg * dg * 0.587 + db * db * 0.114;\n}\n\nfunction findClosestCubeIndex(value: number): number {\n\tlet minDist = Number.POSITIVE_INFINITY;\n\tlet minIdx = 0;\n\tfor (let i = 0; i < CUBE_VALUES.length; i++) {\n\t\tconst dist = Math.abs(value - (CUBE_VALUES[i] ?? 0));\n\t\tif (dist < minDist) {\n\t\t\tminDist = dist;\n\t\t\tminIdx = i;\n\t\t}\n\t}\n\treturn minIdx;\n}\n\nfunction findClosestGrayIndex(gray: number): number {\n\tlet minDist = Number.POSITIVE_INFINITY;\n\tlet minIdx = 0;\n\tfor (let i = 0; i < GRAY_VALUES.length; i++) {\n\t\tconst dist = Math.abs(gray - (GRAY_VALUES[i] ?? 0));\n\t\tif (dist < minDist) {\n\t\t\tminDist = dist;\n\t\t\tminIdx = i;\n\t\t}\n\t}\n\treturn minIdx;\n}\n\nfunction rgbTo256(r: number, g: number, b: number): number {\n\tconst rIdx = findClosestCubeIndex(r);\n\tconst gIdx = findClosestCubeIndex(g);\n\tconst bIdx = findClosestCubeIndex(b);\n\tconst cubeR = CUBE_VALUES[rIdx] ?? 0;\n\tconst cubeG = CUBE_VALUES[gIdx] ?? 0;\n\tconst cubeB = CUBE_VALUES[bIdx] ?? 0;\n\tconst cubeIndex = 16 + 36 * rIdx + 6 * gIdx + bIdx;\n\tconst cubeDist = colorDistance(r, g, b, cubeR, cubeG, cubeB);\n\n\tconst gray = Math.round(0.299 * r + 0.587 * g + 0.114 * b);\n\tconst grayIdx = findClosestGrayIndex(gray);\n\tconst grayValue = GRAY_VALUES[grayIdx] ?? 0;\n\tconst grayIndex = 232 + grayIdx;\n\tconst grayDist = colorDistance(r, g, b, grayValue, grayValue, grayValue);\n\n\tconst spread = Math.max(r, g, b) - Math.min(r, g, b);\n\tif (spread < 10 && grayDist < cubeDist) return grayIndex;\n\treturn cubeIndex;\n}\n\n/** Color-mode-aware escape prefix/suffix pairs for a hex color (cached per mode+hex). */\nfunction colorEscapes(mode: string, hex: string, kind: \"fg\" | \"bg\"): { prefix: string; suffix: string } | undefined {\n\tif (!isHexColor(hex)) return undefined;\n\tconst { r, g, b } = hexToRgb(hex);\n\tconst cacheKey = `${mode}:${kind}:${hex}`;\n\tconst cache = kind === \"fg\" ? fgEscapeCache : bgEscapeCache;\n\tlet cached = cache.get(cacheKey);\n\tif (!cached) {\n\t\tif (mode === \"256color\") {\n\t\t\tconst idx = rgbTo256(r, g, b);\n\t\t\tcached = {\n\t\t\t\tprefix: `\\x1b[${kind === \"fg\" ? 38 : 48};5;${idx}m`,\n\t\t\t\tsuffix: kind === \"fg\" ? \"\\x1b[39m\" : RESET_BACKGROUND,\n\t\t\t};\n\t\t} else {\n\t\t\tcached = {\n\t\t\t\tprefix: `\\x1b[${kind === \"fg\" ? 38 : 48};2;${r};${g};${b}m`,\n\t\t\t\tsuffix: kind === \"fg\" ? \"\\x1b[39m\" : RESET_BACKGROUND,\n\t\t\t};\n\t\t}\n\t\tcache.set(cacheKey, cached);\n\t}\n\treturn cached;\n}\n\nconst fgEscapeCache = new Map<string, { prefix: string; suffix: string }>();\nconst bgEscapeCache = new Map<string, { prefix: string; suffix: string }>();\n\n/** Foreground-styling helper: accepts a theme (for getColorMode) or \"truecolor\". */\nexport function fgHex(theme: { getColorMode?: () => string } | undefined, hex: string, text: string): string {\n\tconst mode = typeof theme?.getColorMode === \"function\" ? theme.getColorMode() : \"truecolor\";\n\tconst escapes = colorEscapes(mode, hex, \"fg\");\n\tif (!escapes) return text;\n\treturn `${escapes.prefix}${text}${escapes.suffix}`;\n}\n\n/** Background ANSI prefix for a hex color, or \"\" when not a hex color. */\nexport function bgHexAnsi(theme: { getColorMode?: () => string } | undefined, hex: string): string {\n\tconst mode = typeof theme?.getColorMode === \"function\" ? theme.getColorMode() : \"truecolor\";\n\treturn colorEscapes(mode, hex, \"bg\")?.prefix ?? \"\";\n}\n\nexport function bgHex(theme: { getColorMode?: () => string } | undefined, hex: string, text: string): string {\n\tconst mode = typeof theme?.getColorMode === \"function\" ? theme.getColorMode() : \"truecolor\";\n\tconst escapes = colorEscapes(mode, hex, \"bg\");\n\tif (!escapes) return text;\n\treturn `${escapes.prefix}${text}${escapes.suffix}`;\n}\n\n/** Whether an SGR code sequence contains a background-affecting action (set/reset). */\nfunction finalBackgroundAction(rawCodes: string): \"none\" | \"reset\" | \"set\" {\n\tconst codes = rawCodes.split(\";\").filter(Boolean);\n\tif (codes.length === 0) return \"reset\";\n\tlet action: \"none\" | \"reset\" | \"set\" = \"none\";\n\tconst sgrColorParameterEnd = (index: number): number => {\n\t\tconst code = Number(codes[index]);\n\t\tif (code !== 38 && code !== 48) return index;\n\t\tconst mode = Number(codes[index + 1]);\n\t\tif (mode === 2) return Math.min(codes.length - 1, index + 4);\n\t\tif (mode === 5) return Math.min(codes.length - 1, index + 2);\n\t\treturn index;\n\t};\n\tfor (let i = 0; i < codes.length; i++) {\n\t\tconst code = Number(codes[i]);\n\t\tif (code === 0 || code === 49) {\n\t\t\taction = \"reset\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === 48) {\n\t\t\taction = \"set\";\n\t\t\ti = sgrColorParameterEnd(i);\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === 38) {\n\t\t\ti = sgrColorParameterEnd(i);\n\t\t\tcontinue;\n\t\t}\n\t\tif ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) action = \"set\";\n\t}\n\treturn action;\n}\n\nfunction removeStandaloneBackgroundReset(rawCodes: string): string {\n\tconst codes = rawCodes.split(\";\").filter(Boolean);\n\tif (codes.length === 0) return \"0\";\n\tconst rebuilt: string[] = [];\n\tconst sgrColorParameterEnd = (index: number): number => {\n\t\tconst code = Number(codes[index]);\n\t\tif (code !== 38 && code !== 48) return index;\n\t\tconst mode = Number(codes[index + 1]);\n\t\tif (mode === 2) return Math.min(codes.length - 1, index + 4);\n\t\tif (mode === 5) return Math.min(codes.length - 1, index + 2);\n\t\treturn index;\n\t};\n\tfor (let i = 0; i < codes.length; i++) {\n\t\tconst code = Number(codes[i]);\n\t\tif (code === 49) continue;\n\t\tconst end = sgrColorParameterEnd(i);\n\t\tfor (let j = i; j <= end; j++) rebuilt.push(codes[j] ?? \"\");\n\t\ti = end;\n\t}\n\treturn rebuilt.join(\";\");\n}\n\n/** Re-apply a background after reset sequences so a fill survives nested resets. */\nexport function keepAnsiBackgroundAcrossResets(text: string, bgAnsi: string): string {\n\tif (!text) return text;\n\treturn text.replace(new RegExp(`${ESC}\\\\[([0-9;]*)m`, \"g\"), (sequence, rawCodes) => {\n\t\tconst codes = String(rawCodes ?? \"\");\n\t\tif (finalBackgroundAction(codes) !== \"reset\") return sequence;\n\t\tconst rebuilt = removeStandaloneBackgroundReset(codes);\n\t\treturn `${rebuilt ? `\\x1b[${rebuilt}m` : \"\"}${bgAnsi}`;\n\t});\n}\n\n/** Wrap text in a background fill that survives nested resets; optional fill-to-end-of-line. */\nexport function wrapAnsiBackground(text: string, bgAnsi: string, options: { fillToEnd?: boolean } = {}): string {\n\tif (!bgAnsi || bgAnsi === RESET_BACKGROUND) return text;\n\tconst body = keepAnsiBackgroundAcrossResets(text, bgAnsi);\n\tconst fill = options.fillToEnd ? `${bgAnsi}${ERASE_TO_END_OF_LINE}` : \"\";\n\treturn `${bgAnsi}${body}${fill}${RESET_BACKGROUND}`;\n}\n","import { hexToAnsiPrefix, type ResolvedTheme } from \"../../domain/theme.js\";\nimport { fitAnsiWidth, parseAnsiFgToRgb, visibleWidth } from \"../../shared/ansi.js\";\n\n/**\n * Compact startup logo header. Renders the block-art Pi logo with a\n * per-character accent gradient plus side details, with stacked/truncated\n * fallbacks for narrow widths. Pure render: color comes only from the\n * resolved theme.\n */\n\nexport const PI_LOGO_LINES = [\n\t\"████████████╗\",\n\t\"████████████║\",\n\t\"████╔═══████║\",\n\t\"████║ ████║\",\n\t\"████████╬═══████╗\",\n\t\"████████║ ████║ \",\n\t\"████╔═══╝ ████║\",\n\t\"████║ ████║\",\n\t\"╚═══╝ ╚═══╝\",\n] as const;\n\nconst LOGO_PALETTE_STEPS = 24;\nconst LOGO_MAX_DARKEN = 0.18;\nconst LOGO_MAX_LIGHTEN = 0.18;\nconst LOGO_ROW_PHASE_STEP = 0.12;\nconst LOGO_GAP = \" \";\n/** Minimum side-detail width before the logo collapses to stacked lines. */\nconst LOGO_SIDE_DETAIL_MIN_WIDTH = 12;\n\ntype Rgb = { r: number; g: number; b: number };\n\nfunction clampChannel(value: number): number {\n\treturn Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction interpolateRgb(start: Rgb, end: Rgb, factor: number): Rgb {\n\treturn {\n\t\tr: clampChannel(start.r + (end.r - start.r) * factor),\n\t\tg: clampChannel(start.g + (end.g - start.g) * factor),\n\t\tb: clampChannel(start.b + (end.b - start.b) * factor),\n\t};\n}\n\nfunction darkenRgb(rgb: Rgb, amount: number): Rgb {\n\treturn {\n\t\tr: clampChannel(rgb.r * (1 - amount)),\n\t\tg: clampChannel(rgb.g * (1 - amount)),\n\t\tb: clampChannel(rgb.b * (1 - amount)),\n\t};\n}\n\nfunction lightenRgb(rgb: Rgb, amount: number): Rgb {\n\treturn {\n\t\tr: clampChannel(rgb.r + (255 - rgb.r) * amount),\n\t\tg: clampChannel(rgb.g + (255 - rgb.g) * amount),\n\t\tb: clampChannel(rgb.b + (255 - rgb.b) * amount),\n\t};\n}\n\nfunction buildLogoPalette(accent: Rgb): Rgb[] {\n\treturn Array.from({ length: LOGO_PALETTE_STEPS }, (_, index) => {\n\t\tconst progress = index / LOGO_PALETTE_STEPS;\n\t\tconst wave = -Math.cos(progress * Math.PI * 2);\n\t\treturn wave < 0 ? darkenRgb(accent, LOGO_MAX_DARKEN * -wave) : lightenRgb(accent, LOGO_MAX_LIGHTEN * wave);\n\t});\n}\n\nfunction sampleLogoGradient(palette: Rgb[], position: number): Rgb {\n\tconst wrapped = ((position % 1) + 1) % 1;\n\tconst scaled = wrapped * palette.length;\n\tconst baseIndex = Math.floor(scaled) % palette.length;\n\tconst nextIndex = (baseIndex + 1) % palette.length;\n\tconst base = palette[baseIndex];\n\tconst next = palette[nextIndex];\n\tif (!base || !next) return { r: 0, g: 0, b: 0 };\n\treturn interpolateRgb(base, next, scaled - Math.floor(scaled));\n}\n\nfunction renderLogoGradientLine(line: string, palette: Rgb[], phase: number): string {\n\tconst characters = [...line];\n\tconst span = Math.max(characters.length - 1, 1);\n\treturn characters\n\t\t.map((character, index) => {\n\t\t\tif (character === \" \") return character;\n\t\t\tconst color = sampleLogoGradient(palette, index / span + phase);\n\t\t\treturn `${hexToAnsiPrefix(rgbToHex(color))}${character}`;\n\t\t})\n\t\t.join(\"\");\n}\n\nfunction rgbToHex(rgb: Rgb): string {\n\treturn `#${[rgb.r, rgb.g, rgb.b].map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nlet logoGradientCacheKey: string | undefined;\nlet logoGradientCacheLines: string[] | undefined;\n\n/** Accent RGB resolved from the active theme, or undefined when uncolored. */\nexport function resolveAccentRgb(resolved: ResolvedTheme): Rgb | undefined {\n\tconst accentAnsi = resolved.color(\"accent\");\n\tif (!accentAnsi) return undefined;\n\treturn parseAnsiFgToRgb(accentAnsi);\n}\n\n/** The block-art logo lines, gradient-styled when an accent color is resolvable. */\nexport function styledLogoLines(resolved: ResolvedTheme): string[] {\n\tconst accent = resolveAccentRgb(resolved);\n\tif (!accent) return [...PI_LOGO_LINES];\n\tconst cacheKey = `${resolved.color(\"accent\")}|${resolved.mode}`;\n\tif (cacheKey === logoGradientCacheKey && logoGradientCacheLines) return logoGradientCacheLines;\n\tconst palette = buildLogoPalette(accent);\n\tlogoGradientCacheLines = PI_LOGO_LINES.map((line, rowIndex) =>\n\t\trenderLogoGradientLine(line, palette, rowIndex * LOGO_ROW_PHASE_STEP),\n\t);\n\tlogoGradientCacheKey = cacheKey;\n\treturn logoGradientCacheLines;\n}\n\n/**\n * Assemble the compact startup header: gradient logo with side details when\n * wide enough, stacked logo + details next, and a minimal title/status pair\n * for very narrow terminals. Every returned line fits within `width`.\n */\nexport function compactLogoHeader(\n\tresolved: ResolvedTheme,\n\tdetails: readonly [title: string, hints: string, status: string],\n\twidth: number,\n): string[] {\n\tconst logoLines = styledLogoLines(resolved);\n\tconst logoWidth = Math.max(...PI_LOGO_LINES.map((line) => visibleWidth(line)));\n\tconst safeWidth = Math.max(1, width);\n\tconst detailWidth = safeWidth - logoWidth - visibleWidth(LOGO_GAP);\n\n\tif (detailWidth >= LOGO_SIDE_DETAIL_MIN_WIDTH) {\n\t\tconst detailStartRow = Math.max(0, Math.floor((PI_LOGO_LINES.length - details.length) / 2));\n\t\treturn PI_LOGO_LINES.map((plainLine, index) => {\n\t\t\tconst logoPadding = \" \".repeat(Math.max(0, logoWidth - visibleWidth(plainLine)));\n\t\t\tconst detailIndex = index - detailStartRow;\n\t\t\tconst detailText = details[detailIndex];\n\t\t\tconst detail = detailText ? fitAnsiWidth(detailText, detailWidth) : \"\";\n\t\t\treturn `${logoLines[index]}${logoPadding}${detail ? `${LOGO_GAP}${detail}` : \"\"}`;\n\t\t});\n\t}\n\n\tif (safeWidth >= logoWidth) {\n\t\treturn [...logoLines, ...details.map((detail) => fitAnsiWidth(detail, safeWidth))];\n\t}\n\n\treturn [details[0], details[2]].map((detail) => fitAnsiWidth(detail, safeWidth));\n}\n","import type { Component, OverlayHandle, OverlayOptions } from \"@earendil-works/pi-tui\";\nimport type { NormalizedPiStyleConfig } from \"../../domain/config-types.js\";\nimport type { StatusSnapshot } from \"../../domain/status.js\";\nimport { type ActiveTheme, type ResolvedTheme, resolveTheme } from \"../../domain/theme.js\";\nimport { fitAnsiWidth, truncateAnsi, visibleWidth } from \"../../shared/ansi.js\";\nimport { compactLogoHeader } from \"./logo.js\";\n\nexport type StartupReason = \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\";\n\nexport interface StartupDetailItem {\n\treadonly kind: \"system\" | \"append\" | \"context\";\n\treadonly path: string;\n\treadonly words: number;\n\treadonly lines: number;\n}\n\nexport interface StartupToolItem {\n\treadonly source: string;\n\treadonly name: string;\n}\n\nexport interface StartupResources {\n\treadonly contextFiles?: number;\n\treadonly extensions?: number;\n\treadonly skills?: number;\n\treadonly prompts?: number;\n\treadonly tools?: number;\n\treadonly models?: number;\n\treadonly details?: readonly StartupDetailItem[];\n\treadonly toolDetails?: readonly StartupToolItem[];\n\treadonly error?: string;\n}\n\nexport interface StartupSnapshot extends StatusSnapshot {\n\treadonly reason: StartupReason;\n\treadonly project?: string | undefined;\n\treadonly startupProvider?: string | undefined;\n\treadonly resources?: StartupResources | undefined;\n\treadonly preset?: string | undefined;\n\treadonly compatibility?: string | undefined;\n}\n\nexport type StartupTheme = ActiveTheme;\n\nfunction activeThemeFromPi(theme: unknown): ActiveTheme {\n\tif (!theme || typeof theme !== \"object\") return {};\n\tconst candidate = theme as { fg?: (token: string, text?: string) => string; colors?: Record<string, string> };\n\treturn {\n\t\t...(candidate.colors ? { colors: candidate.colors } : {}),\n\t\t...(candidate.fg ? { fg: (color: string, text: string) => candidate.fg?.(color, text) ?? text } : {}),\n\t};\n}\n\nexport interface StartupHost {\n\tsetHeader?: (factory: ((tui: unknown, theme: unknown) => Component & { dispose?(): void }) | undefined) => void;\n\tsetWidget?: (key: string, content: unknown, options?: unknown) => void;\n\tcustom?: <T>(\n\t\tfactory: (\n\t\t\ttui: unknown,\n\t\t\ttheme: unknown,\n\t\t\tkeybindings: unknown,\n\t\t\tdone: (value: T) => void,\n\t\t) => Component & { dispose?(): void },\n\t\toptions?: { overlay?: boolean; overlayOptions?: OverlayOptions; onHandle?: (handle: OverlayHandle) => void },\n\t) => Promise<T>;\n\tonTerminalInput?: (handler: (...args: readonly unknown[]) => unknown) => () => void;\n\treadonly mode?: string;\n\treadonly hasUI?: boolean;\n\t/** Optional public-adapter capability used to avoid overwriting a later header owner. */\n\tgetHeaderFactory?: () => unknown;\n}\n\nexport interface StartupInstallation {\n\treadonly generation: number;\n\tupdate(snapshot: StartupSnapshot): void;\n\tdismiss(): void;\n\tconfigure(config: NormalizedPiStyleConfig): void;\n\tdispose(): void;\n}\n\nexport interface StartupInstallOptions {\n\thost: StartupHost;\n\tconfig: NormalizedPiStyleConfig;\n\tsnapshot: StartupSnapshot;\n\tgeneration: number;\n\trequestRender?: () => void;\n\ttimeoutMs?: number;\n\tisCurrent?: () => boolean;\n}\n\nexport const STARTUP_WIDGET_KEY = \"pi-style.startup\";\nconst owners = new WeakMap<object, Map<string, symbol>>();\n\nfunction ownerMap(host: object): Map<string, symbol> {\n\tlet map = owners.get(host);\n\tif (!map) {\n\t\tmap = new Map();\n\t\towners.set(host, map);\n\t}\n\treturn map;\n}\n\nfunction safeCall(fn: () => void): boolean {\n\ttry {\n\t\tfn();\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction shouldShow(reason: StartupReason, mode: \"off\" | \"compact\" | \"overlay\"): boolean {\n\tif (mode === \"off\") return false;\n\treturn reason === \"startup\" || reason === \"reload\" || reason === \"new\" || reason === \"resume\" || reason === \"fork\";\n}\n\nfunction overlayAllowed(reason: StartupReason): boolean {\n\treturn reason === \"startup\";\n}\n\nfunction resourceChipRows(resources: StartupResources | undefined): { label: string; count: number }[] {\n\tif (!resources) return [];\n\tconst rows: { label: string; count: number }[] = [];\n\tif (resources.contextFiles !== undefined) rows.push({ label: \"context\", count: resources.contextFiles });\n\tif (resources.extensions !== undefined) rows.push({ label: \"extensions\", count: resources.extensions });\n\tif (resources.skills !== undefined) rows.push({ label: \"skills\", count: resources.skills });\n\tif (resources.prompts !== undefined) rows.push({ label: \"prompts\", count: resources.prompts });\n\tif (resources.tools !== undefined) rows.push({ label: \"tools\", count: resources.tools });\n\tif (resources.models !== undefined) rows.push({ label: \"models\", count: resources.models });\n\treturn rows;\n}\n\nconst PANEL_SIDE_PADDING = 2;\nconst PANEL_MIN_WIDTH = 64;\nconst PANEL_OUTER_WIDTH = PANEL_SIDE_PADDING * 2 + 2;\n/** Panels render only when the surface is wide enough to keep the box intact. */\nconst MIN_PANELS_WIDTH = PANEL_MIN_WIDTH + PANEL_OUTER_WIDTH;\nconst RESOURCE_ROW_GAP = \" · \";\nconst CONTEXT_KIND_RANK: Record<StartupDetailItem[\"kind\"], number> = { system: 0, append: 1, context: 2 };\n\n/** `◆ Resources` summary chips. */\nfunction renderResourceChips(resolved: ResolvedTheme, resources: StartupResources | undefined): string {\n\tconst rows = resourceChipRows(resources);\n\tif (rows.length === 0) return \"\";\n\tconst marker = resolved.apply(\"accent\", \"◆ Resources\");\n\tconst chips = rows.map((row, index) => {\n\t\tconst label = resolved.apply(index === 0 ? \"text\" : \"muted\", row.label);\n\t\tconst count = resolved.apply(\"success\", String(row.count));\n\t\treturn `${label} ${count}`;\n\t});\n\treturn [marker, ...chips].join(resolved.apply(\"dim\", RESOURCE_ROW_GAP));\n}\n\nfunction sortedContextItems(items: readonly StartupDetailItem[]): StartupDetailItem[] {\n\treturn [...items].sort((a, b) => (CONTEXT_KIND_RANK[a.kind] ?? 9) - (CONTEXT_KIND_RANK[b.kind] ?? 9));\n}\n\nfunction renderPanelBorder(resolved: ResolvedTheme, left: string, right: string, panelWidth: number): string {\n\treturn resolved.apply(\"dim\", `${left}${\"─\".repeat(panelWidth + PANEL_SIDE_PADDING * 2)}${right}`);\n}\n\nfunction renderPanelLine(resolved: ResolvedTheme, content: string, panelWidth: number): string {\n\tconst sidePadding = \" \".repeat(PANEL_SIDE_PADDING);\n\tconst padding = \" \".repeat(Math.max(0, panelWidth - visibleWidth(content)));\n\treturn `${resolved.apply(\"dim\", \"│\")}${sidePadding}${content}${padding}${sidePadding}${resolved.apply(\"dim\", \"│\")}`;\n}\n\n/** Boxed System & Context table. */\nfunction renderSystemContextPanel(\n\tresolved: ResolvedTheme,\n\titems: readonly StartupDetailItem[],\n\tminTotalWidth: number,\n): string[] {\n\tconst sorted = sortedContextItems(items);\n\tconst titleLine = resolved.apply(\"accent\", \"System & Context\");\n\tif (sorted.length === 0) return [];\n\tconst typeHeader = \"Type\";\n\tconst pathHeader = \"Path\";\n\tconst metricLabel = \"Words/Lines\";\n\tconst typeWidth = Math.max(typeHeader.length, ...sorted.map((item) => visibleWidth(item.kind)));\n\tconst divider = resolved.apply(\"muted\", \" | \");\n\tconst dividerWidth = visibleWidth(divider);\n\tconst metricWidth = Math.max(metricLabel.length, ...sorted.map((item) => `${item.words}/${item.lines}`.length));\n\tconst fixedColumnsWidth = typeWidth + dividerWidth + dividerWidth + metricWidth;\n\tconst panelWidth = Math.max(PANEL_MIN_WIDTH, minTotalWidth - PANEL_OUTER_WIDTH, visibleWidth(titleLine));\n\tconst pathWidth = Math.max(pathHeader.length, panelWidth - fixedColumnsWidth);\n\tconst header = `${resolved.apply(\"text\", typeHeader.padEnd(typeWidth))}${divider}${resolved.apply(\n\t\t\"text\",\n\t\tpathHeader.padEnd(pathWidth),\n\t)}${divider}${resolved.apply(\"text\", metricLabel.padStart(metricWidth))}`;\n\tconst separator = `${resolved.apply(\"dim\", \"─\".repeat(typeWidth))}${divider}${resolved.apply(\n\t\t\"dim\",\n\t\t\"─\".repeat(pathWidth),\n\t)}${divider}${resolved.apply(\"dim\", \"─\".repeat(metricWidth))}`;\n\tconst lines = [\n\t\trenderPanelBorder(resolved, \"┌\", \"┐\", panelWidth),\n\t\trenderPanelLine(resolved, titleLine, panelWidth),\n\t\trenderPanelLine(resolved, header, panelWidth),\n\t\trenderPanelLine(resolved, separator, panelWidth),\n\t];\n\tfor (const item of sorted) {\n\t\tconst metric = `${item.words}/${item.lines}`;\n\t\tconst typePadding = \" \".repeat(Math.max(0, typeWidth - visibleWidth(item.kind)));\n\t\tconst path = fitAnsiWidth(item.path, pathWidth);\n\t\tconst pathPadding = \" \".repeat(Math.max(0, pathWidth - visibleWidth(path)));\n\t\tconst metricPadding = \" \".repeat(Math.max(0, metricWidth - visibleWidth(metric)));\n\t\tlines.push(\n\t\t\trenderPanelLine(\n\t\t\t\tresolved,\n\t\t\t\t`${resolved.apply(\"text\", item.kind)}${typePadding}${divider}${resolved.apply(\n\t\t\t\t\t\"text\",\n\t\t\t\t\tpath,\n\t\t\t\t)}${pathPadding}${divider}${metricPadding}${resolved.apply(\"text\", metric)}`,\n\t\t\t\tpanelWidth,\n\t\t\t),\n\t\t);\n\t}\n\tlines.push(renderPanelBorder(resolved, \"└\", \"┘\", panelWidth));\n\treturn lines;\n}\n\nfunction groupToolDetails(tools: readonly StartupToolItem[]): { source: string; names: string[] }[] {\n\tconst groups = new Map<string, Set<string>>();\n\tfor (const tool of tools) {\n\t\tconst source = tool.source.trim() || \"extension\";\n\t\tconst name = tool.name.trim();\n\t\tif (!name) continue;\n\t\tlet names = groups.get(source);\n\t\tif (!names) {\n\t\t\tnames = new Set();\n\t\t\tgroups.set(source, names);\n\t\t}\n\t\tnames.add(name);\n\t}\n\treturn [...groups.entries()]\n\t\t.map(([source, names]) => ({ source, names: [...names].sort((a, b) => a.localeCompare(b)) }))\n\t\t.sort((a, b) => {\n\t\t\tif (a.source === \"core\") return -1;\n\t\t\tif (b.source === \"core\") return 1;\n\t\t\treturn a.source.localeCompare(b.source);\n\t\t});\n}\n\n/** Boxed Available Tools table. */\nfunction renderToolsPanel(resolved: ResolvedTheme, tools: readonly StartupToolItem[], minTotalWidth: number): string[] {\n\tconst groups = groupToolDetails(tools);\n\tif (groups.length === 0) return [];\n\tconst titleLine = resolved.apply(\"accent\", \"Available Tools\");\n\tconst sourceHeader = \"Source\";\n\tconst countHeader = \"Count\";\n\tconst toolsHeader = \"Tools\";\n\tconst countWidth = Math.max(countHeader.length, ...groups.map((group) => String(group.names.length).length));\n\tconst divider = resolved.apply(\"muted\", \" | \");\n\tconst dividerWidth = visibleWidth(divider);\n\tconst panelWidth = Math.max(PANEL_MIN_WIDTH, minTotalWidth - PANEL_OUTER_WIDTH, visibleWidth(titleLine));\n\tconst availableTextWidth = Math.max(\n\t\tsourceHeader.length + toolsHeader.length,\n\t\tpanelWidth - countWidth - dividerWidth * 2,\n\t);\n\tconst maxSourceWidth = Math.max(sourceHeader.length, ...groups.map((group) => visibleWidth(group.source)));\n\tconst sourceWidth = Math.min(maxSourceWidth, Math.max(sourceHeader.length, Math.floor(availableTextWidth * 0.28)));\n\tconst toolsWidth = Math.max(toolsHeader.length, availableTextWidth - sourceWidth);\n\tconst header = `${resolved.apply(\"text\", sourceHeader.padEnd(sourceWidth))}${divider}${resolved.apply(\n\t\t\"text\",\n\t\tcountHeader.padStart(countWidth),\n\t)}${divider}${resolved.apply(\"text\", toolsHeader.padEnd(toolsWidth))}`;\n\tconst separator = `${resolved.apply(\"dim\", \"─\".repeat(sourceWidth))}${divider}${resolved.apply(\n\t\t\"dim\",\n\t\t\"─\".repeat(countWidth),\n\t)}${divider}${resolved.apply(\"dim\", \"─\".repeat(toolsWidth))}`;\n\tconst lines = [\n\t\trenderPanelBorder(resolved, \"┌\", \"┐\", panelWidth),\n\t\trenderPanelLine(resolved, titleLine, panelWidth),\n\t\trenderPanelLine(resolved, header, panelWidth),\n\t\trenderPanelLine(resolved, separator, panelWidth),\n\t];\n\tfor (const group of groups) {\n\t\tconst count = String(group.names.length);\n\t\tconst toolList = fitAnsiWidth(group.names.join(\", \"), toolsWidth);\n\t\tconst source = fitAnsiWidth(group.source, sourceWidth);\n\t\tconst sourcePadding = \" \".repeat(Math.max(0, sourceWidth - visibleWidth(source)));\n\t\tconst countPadding = \" \".repeat(Math.max(0, countWidth - count.length));\n\t\tlines.push(\n\t\t\trenderPanelLine(\n\t\t\t\tresolved,\n\t\t\t\t`${resolved.apply(\"text\", source)}${sourcePadding}${divider}${countPadding}${resolved.apply(\n\t\t\t\t\t\"success\",\n\t\t\t\t\tcount,\n\t\t\t\t)}${divider}${resolved.apply(\"text\", toolList)}`,\n\t\t\t\tpanelWidth,\n\t\t\t),\n\t\t);\n\t}\n\tlines.push(renderPanelBorder(resolved, \"└\", \"┘\", panelWidth));\n\treturn lines;\n}\n\n/** Left margin for the whole startup block so it does not touch the terminal edge. */\nconst STARTUP_INDENT = \" \";\n/** Blank rows above the block, separating it from the status line / terminal top. */\nconst STARTUP_PADDING_TOP = 2;\n/** Blank rows below the block, separating it from the editor / chat. */\nconst STARTUP_PADDING_BOTTOM = 2;\n\nfunction styledLines(\n\ttheme: ActiveTheme,\n\tconfig: NormalizedPiStyleConfig,\n\tsnapshot: StartupSnapshot,\n\toverlay: boolean,\n\twidth: number,\n): string[] {\n\tif (width <= 0 || config.startup.mode === \"off\") return [];\n\tconst resolved = resolveTheme(theme, config);\n\tconst lines: string[] = [];\n\tconst indentWidth = visibleWidth(STARTUP_INDENT);\n\tconst bodyWidth = Math.max(1, width - indentWidth);\n\tconst indent = (content: string): string => `${STARTUP_INDENT}${content}`;\n\n\t// Breathing room above the block (separates it from the status line / terminal top).\n\tlines.push(...Array.from({ length: STARTUP_PADDING_TOP }, () => \"\"));\n\n\tconst logoTitle = resolved.mode === \"ascii\" ? \"pi-style\" : `${resolved.glyph(\"pi\")} pi-style`;\n\tlines.push(\n\t\t...compactLogoHeader(\n\t\t\tresolved,\n\t\t\t[\n\t\t\t\tresolved.apply(\"accent\", logoTitle),\n\t\t\t\tresolved.apply(\"muted\", \"/ commands · ! bash\"),\n\t\t\t\tresolved.apply(\"success\", \"● ready\"),\n\t\t\t],\n\t\t\tbodyWidth,\n\t\t).map(indent),\n\t);\n\n\tconst info: string[] = [];\n\tif (config.startup.showResources) {\n\t\tconst chips = renderResourceChips(resolved, snapshot.resources);\n\t\tif (chips) info.push(chips);\n\t\tif (snapshot.resources?.error)\n\t\t\tinfo.push(resolved.apply(\"muted\", `resources unavailable · ${snapshot.resources.error}`));\n\t}\n\tif (info.length > 0) lines.push(\"\", ...info.map(indent));\n\n\tconst expanded = overlay || config.startup.alwaysExpanded;\n\tif (expanded && bodyWidth >= MIN_PANELS_WIDTH && config.startup.showResources) {\n\t\tconst contextItems = snapshot.resources?.details ?? [];\n\t\tconst toolItems = snapshot.resources?.toolDetails ?? [];\n\t\tif (contextItems.length > 0) {\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...renderSystemContextPanel(resolved, contextItems, bodyWidth).map(indent));\n\t\t}\n\t\tif (toolItems.length > 0) {\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(...renderToolsPanel(resolved, toolItems, bodyWidth).map(indent));\n\t\t}\n\t}\n\n\t// Breathing room below the block (separates it from the editor / chat).\n\tlines.push(...Array.from({ length: STARTUP_PADDING_BOTTOM }, () => \"\"));\n\tif (overlay) lines.push(indent(resolved.apply(\"dim\", \"enter prompt to continue · esc dismiss\")));\n\n\treturn lines.map((line) => (visibleWidth(line) <= width ? line : truncateAnsi(line, width, \"\")));\n}\n\nclass StartupComponent implements Component {\n\tprivate snapshot: StartupSnapshot;\n\tprivate config: NormalizedPiStyleConfig;\n\tprivate readonly theme: ActiveTheme;\n\tprivate readonly overlay: boolean;\n\tprivate readonly requestRender: () => void;\n\n\tconstructor(\n\t\ttheme: ActiveTheme,\n\t\tconfig: NormalizedPiStyleConfig,\n\t\tsnapshot: StartupSnapshot,\n\t\toverlay: boolean,\n\t\trequestRender: () => void,\n\t) {\n\t\tthis.theme = theme;\n\t\tthis.config = config;\n\t\tthis.snapshot = snapshot;\n\t\tthis.overlay = overlay;\n\t\tthis.requestRender = requestRender;\n\t}\n\n\tsetSnapshot(snapshot: StartupSnapshot): void {\n\t\tthis.snapshot = snapshot;\n\t\tthis.invalidate();\n\t}\n\n\tsetConfig(config: NormalizedPiStyleConfig): void {\n\t\tthis.config = config;\n\t\tthis.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\treturn styledLines(this.theme, this.config, this.snapshot, this.overlay, width);\n\t}\n\n\tinvalidate(): void {\n\t\tthis.requestRender();\n\t}\n}\n\nexport function renderStartup(\n\tsnapshot: StartupSnapshot,\n\tconfig: NormalizedPiStyleConfig,\n\ttheme: ActiveTheme,\n\twidth: number,\n\toverlay = false,\n): string[] {\n\treturn styledLines(theme, config, snapshot, overlay, width);\n}\n\nexport function installStartup(options: StartupInstallOptions): StartupInstallation | undefined {\n\tconst { host } = options;\n\tif (options.config.startup.mode === \"off\" || !shouldShow(options.snapshot.reason, options.config.startup.mode))\n\t\treturn undefined;\n\tif (!host.hasUI || host.mode !== \"tui\") return undefined;\n\tconst token = Symbol(\"pi-style.startup\");\n\tconst map = ownerMap(host as object);\n\tlet config = options.config;\n\tlet snapshot = options.snapshot;\n\tlet disposed = false;\n\tlet dismissed = false;\n\tlet headerInstalled = false;\n\tlet installedHeaderFactory: unknown;\n\tlet widgetInstalled = false;\n\tlet overlayHandle: OverlayHandle | undefined;\n\tlet removeInput: (() => void) | undefined;\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet overlayDone: ((value: undefined) => void) | undefined;\n\tconst components: StartupComponent[] = [];\n\tconst timeoutMs = options.timeoutMs;\n\tconst component = (theme: unknown, isOverlay: boolean, tui: { requestRender?: () => void }) => {\n\t\tconst result = new StartupComponent(activeThemeFromPi(theme), config, snapshot, isOverlay, () => {\n\t\t\ttui.requestRender?.();\n\t\t\toptions.requestRender?.();\n\t\t});\n\t\tcomponents.push(result);\n\t\treturn result;\n\t};\n\tconst clearTimer = () => {\n\t\tif (timeout) clearTimeout(timeout);\n\t\ttimeout = undefined;\n\t};\n\tconst dismiss = () => {\n\t\tif (disposed || dismissed) return;\n\t\tdismissed = true;\n\t\tclearTimer();\n\t\toverlayHandle?.hide();\n\t\toverlayHandle = undefined;\n\t\toverlayDone?.(undefined);\n\t\toverlayDone = undefined;\n\t};\n\tconst clearHeader = () => {\n\t\tif (!headerInstalled || map.get(\"header\") !== token) return;\n\t\tconst current = host.getHeaderFactory?.();\n\t\tif (host.getHeaderFactory && current !== installedHeaderFactory) return;\n\t\tif (host.setHeader) safeCall(() => host.setHeader?.(undefined));\n\t\tmap.delete(\"header\");\n\t};\n\tconst clearWidget = () => {\n\t\tif (!widgetInstalled || map.get(STARTUP_WIDGET_KEY) !== token) return;\n\t\tif (host.setWidget) safeCall(() => host.setWidget?.(STARTUP_WIDGET_KEY, undefined));\n\t\tmap.delete(STARTUP_WIDGET_KEY);\n\t};\n\tconst mountCompact = (): boolean => {\n\t\tconst factory = (tui: unknown, theme: unknown) => component(theme, false, tui as { requestRender?: () => void });\n\t\t// Pi's public `setHeader` is the intended startup-header surface (\"shown at\n\t\t// startup, above chat\"). Prefer it so the startup renders at the top of the\n\t\t// terminal rather than inside the editor area. The injected ownership\n\t\t// adapter, when present, still guards against overwriting a later owner;\n\t\t// the widget remains the fallback when the header API is unavailable.\n\t\tlet currentHeader: unknown = Symbol(\"unreadable\");\n\t\tconst observable =\n\t\t\thost.getHeaderFactory &&\n\t\t\tsafeCall(() => {\n\t\t\t\tcurrentHeader = host.getHeaderFactory?.();\n\t\t\t});\n\t\tconst headerAvailable = host.setHeader !== undefined && (!observable || currentHeader === undefined);\n\t\tif (headerAvailable && safeCall(() => host.setHeader?.(factory))) {\n\t\t\tinstalledHeaderFactory = factory;\n\t\t\theaderInstalled = true;\n\t\t\tmap.set(\"header\", token);\n\t\t\treturn true;\n\t\t}\n\t\tif (host.setWidget && safeCall(() => host.setWidget?.(STARTUP_WIDGET_KEY, factory, { placement: \"aboveEditor\" }))) {\n\t\t\twidgetInstalled = true;\n\t\t\tmap.set(STARTUP_WIDGET_KEY, token);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\tconst mountOverlay = () => {\n\t\tif (!host.custom || !overlayAllowed(snapshot.reason)) {\n\t\t\tmountCompact();\n\t\t\treturn;\n\t\t}\n\t\tconst overlayOptions: OverlayOptions = {\n\t\t\tanchor: \"center\",\n\t\t\twidth: \"80%\",\n\t\t\tmaxHeight: \"60%\",\n\t\t\tminWidth: 40,\n\t\t\tvisible: (width, height) => width >= 40 && height >= 8,\n\t\t};\n\t\tvoid host\n\t\t\t.custom<undefined>(\n\t\t\t\t(tui, theme, _keybindings, done) => {\n\t\t\t\t\toverlayDone = done;\n\t\t\t\t\treturn component(theme, true, tui as { requestRender?: () => void });\n\t\t\t\t},\n\t\t\t\t{ overlay: true, overlayOptions, onHandle: (handle) => (overlayHandle = handle) },\n\t\t\t)\n\t\t\t.catch(() => {\n\t\t\t\tif (!disposed && !dismissed) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\tmountCompact();\n\t\t\t\t}\n\t\t\t});\n\t};\n\tconst installation: StartupInstallation = {\n\t\tgeneration: options.generation,\n\t\tupdate(next) {\n\t\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\t\tsnapshot = next;\n\t\t\tfor (const item of components) item.setSnapshot(next);\n\t\t\toptions.requestRender?.();\n\t\t},\n\t\tdismiss,\n\t\tconfigure(next) {\n\t\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\t\tconfig = next;\n\t\t\tfor (const item of components) item.setConfig(next);\n\t\t\tif (next.startup.mode === \"off\") {\n\t\t\t\tdismiss();\n\t\t\t\tclearHeader();\n\t\t\t\tclearWidget();\n\t\t\t}\n\t\t\toptions.requestRender?.();\n\t\t},\n\t\tdispose() {\n\t\t\tif (disposed) return;\n\t\t\tdismiss();\n\t\t\tdisposed = true;\n\t\t\tremoveInput?.();\n\t\t\tremoveInput = undefined;\n\t\t\tclearHeader();\n\t\t\tclearWidget();\n\t\t\tmap.delete(\"installation\");\n\t\t},\n\t};\n\tmap.set(\"installation\", token);\n\tremoveInput = host.onTerminalInput?.(() => dismiss());\n\tif (config.startup.mode === \"compact\" && !mountCompact()) {\n\t\tinstallation.dispose();\n\t\treturn undefined;\n\t}\n\tif (config.startup.mode === \"overlay\") mountOverlay();\n\tif (config.startup.mode === \"overlay\" && timeoutMs !== undefined && timeoutMs >= 0) {\n\t\ttimeout = setTimeout(() => dismiss(), timeoutMs);\n\t}\n\treturn installation;\n}\n","import type {\n\tSegmentContext,\n\tSegmentRenderResult,\n\tStatusLayout,\n\tStatusRenderResult,\n\tStatusSegment,\n\tStatusSegmentId,\n\tStatusSnapshot,\n} from \"../domain/status.js\";\nimport type { ResolvedTheme } from \"../domain/theme.js\";\nimport { truncateAnsi, visibleWidth } from \"../shared/ansi.js\";\n\nexport interface StatusRendererOptions {\n\treadonly separator?: string;\n\treadonly padding?: string;\n\treadonly segments: ReadonlyMap<StatusSegmentId, StatusSegment>;\n\treadonly theme: ResolvedTheme;\n\treadonly options?: Readonly<\n\t\tRecord<string, { readonly disabled?: boolean; readonly [key: string]: unknown } | undefined>\n\t>;\n}\n\ninterface Candidate {\n\treadonly id: StatusSegmentId;\n\treadonly segment: StatusSegment;\n\treadonly result: SegmentRenderResult;\n\tcontent: string;\n\tcompact: boolean;\n\tmoved: boolean;\n}\n\nfunction uniqueLayout(layout: StatusLayout): StatusLayout {\n\tconst seen = new Set<StatusSegmentId>();\n\tconst dedupe = (items: readonly StatusSegmentId[]) =>\n\t\titems.filter((id) => {\n\t\t\tif (seen.has(id)) return false;\n\t\t\tseen.add(id);\n\t\t\treturn true;\n\t\t});\n\treturn { left: dedupe(layout.left), right: dedupe(layout.right), secondary: dedupe(layout.secondary) };\n}\n\nfunction renderGroup(items: readonly Candidate[], separator: string, padding: string): string {\n\treturn items\n\t\t.map((item) => item.content)\n\t\t.filter(Boolean)\n\t\t.join(`${padding}${separator}${padding}`);\n}\n\nfunction widthOf(items: readonly Candidate[], separator: string, padding: string): number {\n\treturn visibleWidth(renderGroup(items, separator, padding));\n}\n\nexport function renderStatus(\n\tlayout: StatusLayout,\n\tsnapshot: StatusSnapshot,\n\twidth: number,\n\toptions: StatusRendererOptions,\n): StatusRenderResult {\n\tif (width <= 0) return { primary: \"\", lines: [], visibleSegments: [] };\n\tconst separator = options.separator ?? \"│\";\n\tconst padding = options.padding ?? \" \";\n\tconst normalized = uniqueLayout(layout);\n\tconst context: SegmentContext = { snapshot, theme: options.theme, options: options.options ?? {}, width };\n\tconst candidates = new Map<StatusSegmentId, Candidate>();\n\tfor (const id of [...normalized.left, ...normalized.right, ...normalized.secondary]) {\n\t\tif (candidates.has(id)) continue;\n\t\tconst segment = options.segments.get(id);\n\t\tif (!segment || options.options?.[id]?.disabled) continue;\n\t\ttry {\n\t\t\tconst result = segment.render(context);\n\t\t\tif (!result.visible || !result.content) continue;\n\t\t\tcandidates.set(id, { id, segment, result, content: result.content, compact: false, moved: false });\n\t\t} catch {\n\t\t\t// A broken optional segment must not break the status row.\n\t\t}\n\t}\n\tconst primary = [...normalized.left, ...normalized.right]\n\t\t.map((id) => candidates.get(id))\n\t\t.filter((candidate): candidate is Candidate => candidate !== undefined)\n\t\t.sort(\n\t\t\t(a, b) =>\n\t\t\t\t(b.segment.essential ? 1 : 0) - (a.segment.essential ? 1 : 0) ||\n\t\t\t\tb.segment.defaultPriority - a.segment.defaultPriority,\n\t\t);\n\tconst secondary = normalized.secondary\n\t\t.map((id) => candidates.get(id))\n\t\t.filter((candidate): candidate is Candidate => candidate !== undefined);\n\tconst visible: Candidate[] = [];\n\tconst overflow: Candidate[] = [];\n\tfor (const candidate of primary) {\n\t\tvisible.push(candidate);\n\t\tif (widthOf(visible, separator, padding) <= width) continue;\n\t\tif (candidate.result.compactContent && !candidate.compact) {\n\t\t\tcandidate.content = candidate.result.compactContent;\n\t\t\tcandidate.compact = true;\n\t\t\tif (widthOf(visible, separator, padding) <= width) continue;\n\t\t}\n\t\tvisible.pop();\n\t\tif (candidate.segment.overflow !== \"drop\" && candidate.segment.overflow !== \"primary\") {\n\t\t\tcandidate.moved = true;\n\t\t\toverflow.push(candidate);\n\t\t}\n\t}\n\tfor (const candidate of [...overflow].sort((a, b) => b.segment.defaultPriority - a.segment.defaultPriority))\n\t\tsecondary.push(candidate);\n\t// Right-aligned trailing group: layout.right candidates render flush to the\n\t// right edge, mirroring Pi's native footer (model • effort on the far right).\n\t// Group order follows the layout declaration; the priority sort above only\n\t// decides what drops on overflow.\n\tconst visibleIds = new Set(visible.map((candidate) => candidate.id));\n\tconst groupOf = (group: readonly StatusSegmentId[]) =>\n\t\tgroup\n\t\t\t.map((id) => candidates.get(id))\n\t\t\t.filter((candidate): candidate is Candidate => candidate !== undefined && visibleIds.has(candidate.id));\n\tconst leftVisible = groupOf(normalized.left);\n\tconst rightVisible = groupOf(normalized.right);\n\tconst leftText = renderGroup(leftVisible, separator, padding);\n\tconst rightText = renderGroup(rightVisible, separator, padding);\n\tlet primaryText: string;\n\tif (!rightText) {\n\t\tprimaryText = leftText;\n\t} else {\n\t\tconst core = leftText ? `${leftText}${padding}${separator}${padding}` : \"\";\n\t\tconst gap = Math.max(2, width - visibleWidth(core) - visibleWidth(rightText));\n\t\tprimaryText = `${core}${\" \".repeat(gap)}${rightText}`;\n\t}\n\tif (visibleWidth(primaryText) > width) primaryText = truncateAnsi(primaryText, width);\n\tconst secondaryVisible: Candidate[] = [];\n\tfor (const candidate of [...secondary].sort((a, b) => b.segment.defaultPriority - a.segment.defaultPriority)) {\n\t\tsecondaryVisible.push(candidate);\n\t\tif (widthOf(secondaryVisible, separator, padding) > width) secondaryVisible.pop();\n\t}\n\tconst secondaryText = renderGroup(secondaryVisible, separator, padding);\n\tconst lines = secondaryText ? [primaryText, secondaryText] : primaryText ? [primaryText] : [];\n\treturn {\n\t\tprimary: primaryText,\n\t\t...(secondaryText ? { secondary: secondaryText } : {}),\n\t\tlines,\n\t\tvisibleSegments: [...visible, ...secondaryVisible].map((candidate) => candidate.id),\n\t};\n}\n","import type { NormalizedPiStyleConfig } from \"../../domain/config-types.js\";\nimport { createBuiltinSegments, type SegmentContext, type StatusSnapshot } from \"../../domain/status.js\";\nimport { renderStatus } from \"../../domain/status-renderer.js\";\nimport { type ResolvedTheme, resolveTheme } from \"../../domain/theme.js\";\nimport { visibleWidth } from \"../../shared/ansi.js\";\n\nexport const PRIMARY_WIDGET_KEY = \"pi-style.status.primary\";\nexport const SECONDARY_WIDGET_KEY = \"pi-style.status.secondary\";\n\ntype WidgetPlacement = \"aboveEditor\" | \"belowEditor\";\ntype RenderComponent = { render(width: number): string[]; invalidate(): void; dispose?(): void };\ntype WidgetFactory = (tui: { requestRender?: () => void }, theme: ActivePiTheme) => RenderComponent;\n\n/** Read-only view of Pi's footer data provider, kept out of the domain layer. */\nexport interface FooterDataProviderView {\n\tgetGitBranch(): string | null;\n\tgetExtensionStatuses(): ReadonlyMap<string, string>;\n\tonBranchChange(callback: () => void): () => void;\n}\n\ntype FooterFactory = (\n\ttui: { requestRender?: (force?: boolean) => void },\n\t// The footer renders nothing, so the theme is intentionally untyped.\n\ttheme: unknown,\n\tfooterData: FooterDataProviderView,\n) => RenderComponent;\n\n/** Minimal structural view of Pi's theme, kept out of the domain layer. */\nexport interface ActivePiTheme {\n\tfg?: (token: string, text: string) => string;\n\tcolors?: Record<string, string>;\n}\n\nexport interface StatusLineWidgetHost {\n\tsetWidget(\n\t\tkey: string,\n\t\tcontent: string[] | WidgetFactory | undefined,\n\t\toptions?: { placement?: WidgetPlacement },\n\t): void;\n\t/** Replace the native Pi footer with a pi-style owned component; undefined restores it. */\n\tsetFooter(factory: FooterFactory | undefined): void;\n}\n\nexport interface StatusLineInstallation {\n\treadonly generation: number;\n\treadonly primaryKey: typeof PRIMARY_WIDGET_KEY;\n\treadonly secondaryKey: typeof SECONDARY_WIDGET_KEY;\n\tupdate(snapshot: StatusSnapshot): void;\n\tconfigure(config: NormalizedPiStyleConfig): void;\n\tdispose(): void;\n}\n\nexport interface StatusLineInstallOptions {\n\thost: StatusLineWidgetHost;\n\tconfig: NormalizedPiStyleConfig;\n\tgeneration: number;\n\tinitialSnapshot: StatusSnapshot;\n\tisCurrent?: () => boolean;\n\t/** Force a full terminal redraw (clear screen + scrollback) on the first footer mount. */\n\tclearOnStartup?: boolean;\n}\n\ninterface Ownership {\n\ttoken: symbol;\n\tgeneration: number;\n}\n\nconst ownership = new WeakMap<object, Map<string, Ownership>>();\nconst activeInstallations = new WeakMap<object, Map<number, StatusLineInstallation>>();\n\nfunction ownerMap(host: object): Map<string, Ownership> {\n\tlet map = ownership.get(host);\n\tif (!map) {\n\t\tmap = new Map();\n\t\townership.set(host, map);\n\t}\n\treturn map;\n}\nfunction installationMap(host: object): Map<number, StatusLineInstallation> {\n\tlet map = activeInstallations.get(host);\n\tif (!map) {\n\t\tmap = new Map();\n\t\tactiveInstallations.set(host, map);\n\t}\n\treturn map;\n}\nfunction safeWidget(\n\thost: StatusLineWidgetHost,\n\tkey: string,\n\tcontent: string[] | WidgetFactory | undefined,\n\tplacement?: WidgetPlacement,\n): boolean {\n\ttry {\n\t\thost.setWidget(key, content, placement ? { placement } : undefined);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction placementFor(config: NormalizedPiStyleConfig): WidgetPlacement {\n\treturn config.placement === \"below\" ? \"belowEditor\" : \"aboveEditor\";\n}\nfunction separatorsFor(config: NormalizedPiStyleConfig, theme: ResolvedTheme): string {\n\tconst style = config.statusLine.separator;\n\tif (style === \"powerline\") return theme.apply(\"separator\", theme.glyph(\"powerlineLeft\"));\n\tif (style === \"powerline-thin\" || style === \"\" || style === undefined) {\n\t\treturn theme.apply(\"separator\", theme.glyph(\"powerlineThinLeft\"));\n\t}\n\tif (style === \"none\") return \" \";\n\treturn theme.apply(\"separator\", style);\n}\n\nexport function installStatusLine(options: StatusLineInstallOptions): StatusLineInstallation {\n\tconst existing = installationMap(options.host).get(options.generation);\n\tif (existing) return existing;\n\tconst token = Symbol(\"pi-style.status-line\");\n\tconst owners = ownerMap(options.host);\n\tlet config = options.config;\n\tlet snapshot: StatusSnapshot = options.initialSnapshot;\n\tlet disposed = false;\n\tlet primaryComponent: RenderComponent | undefined;\n\tlet secondaryComponent: RenderComponent | undefined;\n\tlet footerData: FooterDataProviderView | undefined;\n\tlet footerOwner = false;\n\tlet footerUnsubscribe: (() => void) | undefined;\n\tlet clearedOnStartup = false;\n\tconst segments = new Map(createBuiltinSegments());\n\tfor (const item of config.statusLine.customItems) {\n\t\tif (!item.id || !item.statusKey) continue;\n\t\tsegments.set(item.id, {\n\t\t\tid: item.id,\n\t\t\tdefaultPriority: item.priority ?? 40,\n\t\t\toverflow: \"secondary\",\n\t\t\trender: ({ snapshot }: SegmentContext) => {\n\t\t\t\tconst status = snapshot.extensionStatuses?.find(\n\t\t\t\t\t(entry: { readonly key: string; readonly value: string }) => entry.key === item.statusKey,\n\t\t\t\t);\n\t\t\t\tif (!status) return { visible: false, content: \"\" };\n\t\t\t\treturn { visible: true, content: `${item.label ? `${item.label}:` : \"\"}${status.value}`, truncatable: true };\n\t\t\t},\n\t\t});\n\t}\n\n\tconst render = (activeTheme: ActivePiTheme, width: number, secondary: boolean): string[] => {\n\t\tif (width <= 0 || !config.enabled || !config.statusLine.enabled) return [];\n\t\tconst resolved = resolveTheme(\n\t\t\tactiveTheme.colors || activeTheme.fg\n\t\t\t\t? {\n\t\t\t\t\t\t...(activeTheme.colors ? { colors: activeTheme.colors } : {}),\n\t\t\t\t\t\t// Call through the theme instance so `this` binds correctly inside Pi's fg().\n\t\t\t\t\t\t...(activeTheme.fg ? { fg: (color: string, text: string) => activeTheme.fg?.(color, text) ?? text } : {}),\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tconfig,\n\t\t);\n\t\tconst result = renderStatus(config.statusLine.layout, effectiveSnapshot(snapshot), width, {\n\t\t\tseparator: separatorsFor(config, resolved),\n\t\t\tsegments,\n\t\t\ttheme: resolved,\n\t\t\toptions: {\n\t\t\t\t...Object.fromEntries(config.statusLine.disabledSegments.map((id) => [id, { disabled: true }])),\n\t\t\t\tcontext_bar: { width: config.statusLine.contextBarWidth },\n\t\t\t},\n\t\t});\n\t\tconst lines = secondary ? result.lines.slice(1) : result.lines.slice(0, 1);\n\t\tconst rendered = lines.filter((line) => visibleWidth(line) <= width);\n\t\tif (!secondary && rendered.length > 0 && config.statusLine.bottomMargin > 0) {\n\t\t\t// Blank rows below the primary row keep the status line off the terminal edge.\n\t\t\treturn [...rendered, ...Array.from({ length: config.statusLine.bottomMargin }, () => \"\")];\n\t\t}\n\t\treturn rendered;\n\t};\n\t/** Merge authoritative native footer data (branch + extension statuses) into the snapshot. */\n\tconst effectiveSnapshot = (input: StatusSnapshot): StatusSnapshot => {\n\t\tif (!footerData) return input;\n\t\tconst statuses = footerData.getExtensionStatuses();\n\t\tconst extensionStatuses = statuses.size > 0 ? [...statuses].map(([key, value]) => ({ key, value })) : undefined;\n\t\tconst branch = footerData.getGitBranch();\n\t\tconst git = branch && input.git ? { ...input.git, branch } : input.git;\n\t\treturn {\n\t\t\t...input,\n\t\t\t...(extensionStatuses ? { extensionStatuses } : {}),\n\t\t\t...(git ? { git } : {}),\n\t\t};\n\t};\n\tconst releaseFooterData = (): void => {\n\t\tfooterUnsubscribe?.();\n\t\tfooterUnsubscribe = undefined;\n\t\tfooterData = undefined;\n\t};\n\tconst footerFactory: FooterFactory = (tui, _theme, data) => {\n\t\tfooterData = data;\n\t\tfooterUnsubscribe?.();\n\t\tfooterUnsubscribe = data.onBranchChange(() => {\n\t\t\tprimaryComponent?.invalidate();\n\t\t\tsecondaryComponent?.invalidate();\n\t\t\ttui.requestRender?.();\n\t\t});\n\t\tif (options.clearOnStartup && !clearedOnStartup) {\n\t\t\tclearedOnStartup = true;\n\t\t\t// Force a full redraw on the first frame: clears the screen and scrollback.\n\t\t\ttui.requestRender?.(true);\n\t\t}\n\t\treturn {\n\t\t\t// The native footer is replaced by an empty component; visible status lives in widgets.\n\t\t\trender() {\n\t\t\t\treturn [];\n\t\t\t},\n\t\t\tinvalidate() {\n\t\t\t\ttui.requestRender?.();\n\t\t\t},\n\t\t\tdispose() {\n\t\t\t\treleaseFooterData();\n\t\t\t},\n\t\t};\n\t};\n\tconst mountFooter = (): void => {\n\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\tif (!config.enabled || !config.statusLine.enabled) {\n\t\t\tclearFooter();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\toptions.host.setFooter(footerFactory);\n\t\t\tfooterOwner = true;\n\t\t} catch {\n\t\t\tfooterOwner = false;\n\t\t}\n\t};\n\tconst clearFooter = (): void => {\n\t\tif (!footerOwner) return;\n\t\tfooterOwner = false;\n\t\treleaseFooterData();\n\t\ttry {\n\t\t\toptions.host.setFooter(undefined);\n\t\t} catch {\n\t\t\t// Best-effort restore; cleanup must never throw.\n\t\t}\n\t};\n\tconst factory =\n\t\t(secondary: boolean): WidgetFactory =>\n\t\t(tui, theme) => {\n\t\t\tconst currentTheme = theme;\n\t\t\tconst component: RenderComponent = {\n\t\t\t\trender(width) {\n\t\t\t\t\tconst lines = render(currentTheme, width, secondary);\n\t\t\t\t\treturn lines;\n\t\t\t\t},\n\t\t\t\tinvalidate() {\n\t\t\t\t\t// Pi supplies a fresh theme to the factory on theme replacement. Do not retain\n\t\t\t\t\t// pre-rendered ANSI strings; the next render reads the current component theme.\n\t\t\t\t\tprimaryComponent = secondary ? primaryComponent : component;\n\t\t\t\t\tsecondaryComponent = secondary ? component : secondaryComponent;\n\t\t\t\t\tif (tui.requestRender) tui.requestRender();\n\t\t\t\t},\n\t\t\t\tdispose() {},\n\t\t\t};\n\t\t\tif (secondary) secondaryComponent = component;\n\t\t\telse primaryComponent = component;\n\t\t\treturn component;\n\t\t};\n\tconst claim = (key: string) => owners.set(key, { token, generation: options.generation });\n\tconst mount = () => {\n\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\tif (!config.enabled || !config.statusLine.enabled) {\n\t\t\tclear(PRIMARY_WIDGET_KEY);\n\t\t\tclear(SECONDARY_WIDGET_KEY);\n\t\t\tclearFooter();\n\t\t\treturn;\n\t\t}\n\t\tif (safeWidget(options.host, PRIMARY_WIDGET_KEY, factory(false), placementFor(config))) claim(PRIMARY_WIDGET_KEY);\n\t\tif (safeWidget(options.host, SECONDARY_WIDGET_KEY, factory(true), \"belowEditor\")) claim(SECONDARY_WIDGET_KEY);\n\t\tmountFooter();\n\t};\n\tfunction clear(key: string): void {\n\t\tconst current = owners.get(key);\n\t\tif (current?.token !== token || current.generation !== options.generation) return;\n\t\tif (safeWidget(options.host, key, undefined)) owners.delete(key);\n\t}\n\tconst installation: StatusLineInstallation = {\n\t\tgeneration: options.generation,\n\t\tprimaryKey: PRIMARY_WIDGET_KEY,\n\t\tsecondaryKey: SECONDARY_WIDGET_KEY,\n\t\tupdate(next) {\n\t\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\t\tsnapshot = next;\n\t\t\tprimaryComponent?.invalidate();\n\t\t\tsecondaryComponent?.invalidate();\n\t\t},\n\t\tconfigure(next) {\n\t\t\tif (disposed || options.isCurrent?.() === false) return;\n\t\t\tconst placementChanged = placementFor(next) !== placementFor(config);\n\t\t\tconst enabledChanged = next.enabled !== config.enabled || next.statusLine.enabled !== config.statusLine.enabled;\n\t\t\tconfig = next;\n\t\t\tif (placementChanged || enabledChanged) {\n\t\t\t\tclear(PRIMARY_WIDGET_KEY);\n\t\t\t\tclear(SECONDARY_WIDGET_KEY);\n\t\t\t\tclearFooter();\n\t\t\t\tprimaryComponent = undefined;\n\t\t\t\tsecondaryComponent = undefined;\n\t\t\t\tmount();\n\t\t\t} else {\n\t\t\t\tprimaryComponent?.invalidate();\n\t\t\t\tsecondaryComponent?.invalidate();\n\t\t\t}\n\t\t},\n\t\tdispose() {\n\t\t\tif (disposed) return;\n\t\t\tdisposed = true;\n\t\t\tclear(PRIMARY_WIDGET_KEY);\n\t\t\tclear(SECONDARY_WIDGET_KEY);\n\t\t\tclearFooter();\n\t\t\tinstallationMap(options.host).delete(options.generation);\n\t\t},\n\t};\n\tinstallationMap(options.host).set(options.generation, installation);\n\tmount();\n\treturn installation;\n}\n","export interface Disposable {\n\tdispose(): void | Promise<void>;\n}\n\nexport class DisposableStore implements Disposable {\n\tprivate readonly items: Disposable[] = [];\n\tprivate disposed = false;\n\tadd<T extends Disposable>(item: T): T {\n\t\tif (this.disposed) {\n\t\t\tvoid item.dispose();\n\t\t\treturn item;\n\t\t}\n\t\tthis.items.push(item);\n\t\treturn item;\n\t}\n\taddCallback(callback: () => void | Promise<void>): void {\n\t\tthis.add({ dispose: callback });\n\t}\n\tget size(): number {\n\t\treturn this.items.length;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (let i = this.items.length - 1; i >= 0; i--) await this.items[i]?.dispose();\n\t\tthis.items.length = 0;\n\t}\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type {\n\tContextProvider,\n\tGitCommandResult,\n\tGitCommandRunner,\n\tGitProvider,\n\tUsageProvider,\n} from \"../domain/providers.js\";\nimport type { ContextSnapshot, GitSnapshot, UsageSnapshot } from \"../domain/status.js\";\n\nconst execFileAsync = promisify(execFile);\nconst EMPTY_USAGE: UsageSnapshot = Object.freeze({\n\tinputTokens: 0,\n\toutputTokens: 0,\n\tcacheReadTokens: 0,\n\tcacheWriteTokens: 0,\n\tstreaming: false,\n\tsubscriptionMode: \"unknown\",\n});\n\nexport class NodeGitCommandRunner implements GitCommandRunner {\n\tasync run(args: readonly string[], cwd: string, timeoutMs: number, signal?: AbortSignal): Promise<GitCommandResult> {\n\t\tif (signal?.aborted) return { stdout: \"\", stderr: \"git command aborted\", code: 1 };\n\t\ttry {\n\t\t\tconst result = await execFileAsync(\"git\", [...args], {\n\t\t\t\tcwd,\n\t\t\t\ttimeout: timeoutMs,\n\t\t\t\tmaxBuffer: 1024 * 1024,\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\treturn { stdout: result.stdout, stderr: result.stderr, code: 0 };\n\t\t} catch (error) {\n\t\t\tconst failure = error as { stdout?: string; stderr?: string; code?: number; signal?: string };\n\t\t\treturn {\n\t\t\t\tstdout: failure.stdout ?? \"\",\n\t\t\t\tstderr: failure.stderr ?? (failure.signal ? `git terminated by ${failure.signal}` : \"git command failed\"),\n\t\t\t\tcode: failure.code ?? 1,\n\t\t\t};\n\t\t}\n\t}\n}\n\ninterface GitEntry {\n\tvalue: GitSnapshot;\n\texpiresAt: number;\n\tretryAt: number;\n\tgeneration: number;\n\tpromise?: Promise<GitSnapshot>;\n\tcontroller?: AbortController;\n\tneedsRefresh?: boolean;\n\tresultReady: boolean;\n}\n\nexport interface GitProviderStats {\n\treadonly entries: number;\n\treadonly inFlight: number;\n\treadonly refreshes: number;\n\treadonly disposed: boolean;\n}\n\nexport interface GitProviderClock {\n\tnow(): number;\n}\n\nexport class CachedGitProvider implements GitProvider {\n\tprivate readonly cache = new Map<string, GitEntry>();\n\tprivate disposed = false;\n\tprivate refreshCount = 0;\n\tconstructor(\n\t\tprivate readonly runner: GitCommandRunner = new NodeGitCommandRunner(),\n\t\tprivate readonly ttlMs = 1000,\n\t\tprivate readonly timeoutMs = 800,\n\t\tprivate readonly maxBackoffMs = 5000,\n\t\tprivate readonly clock: GitProviderClock = { now: () => Date.now() },\n\t) {}\n\tget stats(): GitProviderStats {\n\t\treturn {\n\t\t\tentries: this.cache.size,\n\t\t\tinFlight: [...this.cache.values()].filter((entry) => entry.promise).length,\n\t\t\trefreshes: this.refreshCount,\n\t\t\tdisposed: this.disposed,\n\t\t};\n\t}\n\tasync get(cwd: string): Promise<GitSnapshot> {\n\t\tif (this.disposed) return unavailableGit(\"provider disposed\");\n\t\tconst now = this.clock.now();\n\t\tconst current = this.cache.get(cwd);\n\t\tif (current && current.expiresAt > now && !current.needsRefresh) return current.value;\n\t\tif (current?.promise) return current.resultReady ? current.value : current.promise;\n\t\tif (current && current.retryAt > now) return current.value;\n\t\tconst stale = current?.value;\n\t\tconst entry: GitEntry = current ?? {\n\t\t\tvalue: refreshingGit(),\n\t\t\texpiresAt: 0,\n\t\t\tretryAt: 0,\n\t\t\tgeneration: 0,\n\t\t\tresultReady: false,\n\t\t};\n\t\tentry.needsRefresh = false;\n\t\tentry.resultReady = Boolean(stale);\n\t\tentry.value = stale ? { ...stale, refreshing: true } : refreshingGit();\n\t\tentry.controller = new AbortController();\n\t\tentry.promise = this.refresh(cwd, entry, stale, entry.controller.signal);\n\t\tthis.cache.set(cwd, entry);\n\t\treturn stale ? entry.value : entry.promise;\n\t}\n\tinvalidate(cwd?: string): void {\n\t\tconst keys = cwd === undefined ? [...this.cache.keys()] : [cwd];\n\t\tfor (const key of keys) {\n\t\t\tconst entry = this.cache.get(key);\n\t\t\tif (!entry) continue;\n\t\t\tentry.generation++;\n\t\t\tentry.expiresAt = 0;\n\t\t\tif (entry.promise) entry.needsRefresh = true;\n\t\t\telse this.cache.delete(key);\n\t\t}\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (const entry of this.cache.values()) entry.controller?.abort();\n\t\tthis.cache.clear();\n\t}\n\tprivate async refresh(\n\t\tcwd: string,\n\t\tentry: GitEntry,\n\t\tstale: GitSnapshot | undefined,\n\t\tsignal: AbortSignal,\n\t): Promise<GitSnapshot> {\n\t\tthis.refreshCount++;\n\t\tconst generation = entry.generation;\n\t\tlet value: GitSnapshot;\n\t\ttry {\n\t\t\tconst result = await this.runner.run([\"status\", \"--porcelain=v1\", \"--branch\"], cwd, this.timeoutMs, signal);\n\t\t\tif (result.code !== 0) {\n\t\t\t\tvalue = stale\n\t\t\t\t\t? { ...stale, refreshing: false, error: result.stderr.trim() || \"git status failed\" }\n\t\t\t\t\t: unavailableGit(result.stderr.trim() || \"git status failed\");\n\t\t\t} else value = parseGitStatus(result.stdout);\n\t\t} catch (error) {\n\t\t\tvalue = stale ? { ...stale, refreshing: false, error: String(error) } : unavailableGit(String(error));\n\t\t}\n\t\tif (this.disposed || this.cache.get(cwd) !== entry) return value;\n\t\tconst invalidated = entry.generation !== generation || entry.needsRefresh;\n\t\tdelete entry.promise;\n\t\tdelete entry.controller;\n\t\tentry.value = value;\n\t\tentry.resultReady = true;\n\t\tif (invalidated) {\n\t\t\tentry.needsRefresh = false;\n\t\t\tentry.expiresAt = 0;\n\t\t\tvoid this.get(cwd);\n\t\t\treturn value;\n\t\t}\n\t\tentry.retryAt = value.error ? this.clock.now() + Math.min(this.maxBackoffMs, Math.max(this.ttlMs, 100)) : 0;\n\t\tentry.expiresAt = this.clock.now() + this.ttlMs;\n\t\tif (entry.needsRefresh) {\n\t\t\tentry.needsRefresh = false;\n\t\t\tvoid this.get(cwd);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nfunction refreshingGit(): GitSnapshot {\n\treturn Object.freeze({ available: false, branch: null, staged: 0, unstaged: 0, untracked: 0, refreshing: true });\n}\nfunction unavailableGit(error: string): GitSnapshot {\n\treturn Object.freeze({\n\t\tavailable: false,\n\t\tbranch: null,\n\t\tstaged: 0,\n\t\tunstaged: 0,\n\t\tuntracked: 0,\n\t\trefreshing: false,\n\t\terror,\n\t});\n}\nexport function parseGitStatus(output: string): GitSnapshot {\n\tconst lines = output.split(\"\\n\").filter(Boolean);\n\tconst header = lines.find((line) => line.startsWith(\"## \"))?.slice(3) ?? \"\";\n\tif (!header) return unavailableGit(\"not a git repository\");\n\tconst branch = header.split(\"...\")[0]?.replace(/^HEAD \\(no branch\\)$/, \"detached\") ?? null;\n\tlet staged = 0;\n\tlet unstaged = 0;\n\tlet untracked = 0;\n\tfor (const line of lines) {\n\t\tif (line.startsWith(\"## \")) continue;\n\t\tif (line.startsWith(\"??\")) {\n\t\t\tuntracked++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.length < 2) continue;\n\t\tif (line[0] !== \" \") staged++;\n\t\tif (line[1] !== \" \") unstaged++;\n\t}\n\tconst ahead = /\\[ahead (\\d+)\\]/.exec(header)?.[1];\n\tconst behind = /\\[behind (\\d+)\\]/.exec(header)?.[1];\n\treturn Object.freeze({\n\t\tavailable: true,\n\t\tbranch: branch || null,\n\t\tstaged,\n\t\tunstaged,\n\t\tuntracked,\n\t\t...(ahead ? { ahead: Number(ahead) } : {}),\n\t\t...(behind ? { behind: Number(behind) } : {}),\n\t\trefreshing: false,\n\t});\n}\n\nexport class InMemoryUsageProvider implements UsageProvider {\n\tprivate readonly values = new Map<string, UsageSnapshot>();\n\tprivate readonly events = new Map<string, Set<string>>();\n\tprivate readonly finalized = new Map<string, Set<string>>();\n\tget(sessionId: string): UsageSnapshot {\n\t\treturn this.values.get(sessionId) ?? EMPTY_USAGE;\n\t}\n\trecord(\n\t\tsessionId: string,\n\t\tusage: Partial<UsageSnapshot>,\n\t\toptions: { eventId?: string; finalized?: boolean } = {},\n\t): void {\n\t\tif (options.eventId) {\n\t\t\tconst ids = this.events.get(sessionId) ?? new Set<string>();\n\t\t\tconst finalized = this.finalized.get(sessionId) ?? new Set<string>();\n\t\t\tif (finalized.has(options.eventId) || (ids.has(options.eventId) && !options.finalized)) return;\n\t\t\tids.add(options.eventId);\n\t\t\tthis.events.set(sessionId, ids);\n\t\t\tif (options.finalized) {\n\t\t\t\tfinalized.add(options.eventId);\n\t\t\t\tthis.finalized.set(sessionId, finalized);\n\t\t\t}\n\t\t}\n\t\tconst current = this.get(sessionId);\n\t\tconst next = {\n\t\t\t...current,\n\t\t\t...usage,\n\t\t\tstreaming: options.finalized ? false : (usage.streaming ?? current.streaming),\n\t\t};\n\t\tthis.values.set(sessionId, Object.freeze(next));\n\t}\n\treset(sessionId?: string): void {\n\t\tif (sessionId === undefined) {\n\t\t\tthis.values.clear();\n\t\t\tthis.events.clear();\n\t\t\tthis.finalized.clear();\n\t\t\treturn;\n\t\t}\n\t\tthis.values.delete(sessionId);\n\t\tthis.events.delete(sessionId);\n\t\tthis.finalized.delete(sessionId);\n\t}\n}\n\nexport class InMemoryContextProvider implements ContextProvider {\n\tprivate readonly values = new Map<string, ContextSnapshot>();\n\tget(sessionId: string): ContextSnapshot | undefined {\n\t\treturn this.values.get(sessionId);\n\t}\n\tset(sessionId: string, context: ContextSnapshot): void {\n\t\tthis.values.set(sessionId, Object.freeze({ ...context }));\n\t}\n\tclear(sessionId?: string): void {\n\t\tif (sessionId === undefined) this.values.clear();\n\t\telse this.values.delete(sessionId);\n\t}\n}\n","export type UpdateClass = \"immediate\" | \"coalesced\" | \"deferred\" | \"delayed-retry\";\nexport interface SchedulerHost {\n\trequestRender(): void;\n}\n\nexport class RenderScheduler {\n\tprivate stopped = false;\n\tprivate immediateQueued = false;\n\tprivate coalescedTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate deferredTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate retryTimer: ReturnType<typeof setTimeout> | undefined;\n\tconstructor(\n\t\tprivate readonly host: SchedulerHost,\n\t\tprivate readonly generation: number,\n\t\tprivate readonly isCurrent: (generation: number) => boolean = (current) => current === this.generation,\n\t) {}\n\tschedule(kind: UpdateClass): void {\n\t\tif (this.stopped || !this.isCurrent(this.generation)) return;\n\t\tif (kind === \"immediate\") {\n\t\t\tif (this.immediateQueued) return;\n\t\t\tthis.immediateQueued = true;\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tthis.immediateQueued = false;\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tconst target = kind === \"coalesced\" ? \"coalescedTimer\" : kind === \"deferred\" ? \"deferredTimer\" : \"retryTimer\";\n\t\tif (this[target] !== undefined) return;\n\t\tconst delay = kind === \"coalesced\" ? 16 : kind === \"deferred\" ? 50 : 100;\n\t\tthis[target] = setTimeout(() => {\n\t\t\tthis[target] = undefined;\n\t\t\tthis.render();\n\t\t}, delay);\n\t}\n\tprivate render(): void {\n\t\tif (!this.stopped && this.isCurrent(this.generation)) this.host.requestRender();\n\t}\n\tcancel(): void {\n\t\tthis.stopped = true;\n\t\tif (this.coalescedTimer !== undefined) clearTimeout(this.coalescedTimer);\n\t\tif (this.deferredTimer !== undefined) clearTimeout(this.deferredTimer);\n\t\tif (this.retryTimer !== undefined) clearTimeout(this.retryTimer);\n\t\tthis.coalescedTimer = undefined;\n\t\tthis.deferredTimer = undefined;\n\t\tthis.retryTimer = undefined;\n\t}\n}\n","import type { StatusSnapshot } from \"../domain/status.js\";\n\nexport interface UiSnapshot extends StatusSnapshot {\n\treadonly revision: number;\n\treadonly generation: number;\n}\n\nexport function createSnapshot(generation: number, revision = 0, values: StatusSnapshot = {}): UiSnapshot {\n\treturn Object.freeze({ generation, revision, ...values });\n}\n\nexport function replaceSnapshot(current: UiSnapshot, generation: number, values: StatusSnapshot): UiSnapshot {\n\tif (current.generation !== generation) return current;\n\treturn createSnapshot(generation, current.revision + 1, values);\n}\n","import type { ExtensionContext, ExtensionUIContext } from \"@earendil-works/pi-coding-agent\";\nimport { diffConfig } from \"../domain/config-diff.js\";\nimport type { NormalizedPiStyleConfig } from \"../domain/config-types.js\";\nimport type { GitCommandRunner } from \"../domain/providers.js\";\nimport type { StatusSnapshot } from \"../domain/status.js\";\nimport { normalizeThinkingLevel } from \"../domain/status.js\";\nimport { installEditor } from \"../features/editor/index.js\";\nimport {\n\tinstallStartup,\n\ttype StartupHost,\n\ttype StartupReason,\n\ttype StartupResources,\n\ttype StartupSnapshot,\n} from \"../features/startup/index.js\";\nimport { installStatusLine } from \"../features/status-line/index.js\";\nimport { DisposableStore } from \"../shared/disposable-store.js\";\nimport { CachedGitProvider, InMemoryContextProvider, InMemoryUsageProvider } from \"./providers.js\";\nimport { RenderScheduler } from \"./render-scheduler.js\";\nimport { createSnapshot, replaceSnapshot, type UiSnapshot } from \"./snapshot.js\";\n\nexport interface RuntimeInstallationState {\n\treadonly status: \"installed\" | \"disabled\" | \"failed\";\n\treadonly editor: \"installed\" | \"preserved\" | \"disabled\" | \"failed\";\n\treadonly startup: \"installed\" | \"disabled\" | \"failed\";\n}\n\nexport interface PiStyleRuntime {\n\tgeneration: number;\n\treadonly providerIdentity: { git: object; context: object; usage: object };\n\treadonly installationState: RuntimeInstallationState;\n\tmode: ExtensionContext[\"mode\"];\n\thasUI: boolean;\n\tdisposed: boolean;\n\tsnapshot: UiSnapshot;\n\tdisposables: DisposableStore;\n\tscheduler: RenderScheduler;\n\tupdate(values: StatusSnapshot): void;\n\tupdateStartupResources(resources: StartupResources): void;\n\tdismissStartup(): void;\n\tinvalidateGit(): void;\n\tconfigure(config: NormalizedPiStyleConfig): void;\n\tdispose(): void;\n}\n\nexport interface RuntimeHost {\n\treadonly mode: ExtensionContext[\"mode\"];\n\treadonly hasUI: boolean;\n\treadonly ui?: ExtensionUIContext;\n\treadonly cwd?: string;\n\treadonly model?: { id?: string; name?: string; provider?: string; reasoning?: boolean } | undefined;\n\treadonly thinkingLevel?: string | undefined;\n\treadonly config: NormalizedPiStyleConfig;\n\treadonly startupReason?: StartupReason;\n\treadonly provider?: string;\n\treadonly requestRender?: () => void;\n\treadonly resources?: StartupResources;\n\treadonly extensionStatusProvider?: () => readonly import(\"../domain/status.js\").ExtensionStatus[] | undefined;\n\treadonly gitRunner?: GitCommandRunner;\n\tgetContextUsage?:\n\t\t| (() => { tokens: number | null; contextWindow: number; percent: number | null } | undefined)\n\t\t| undefined;\n}\n\nexport function createPiStyleRuntime(\n\thost: RuntimeHost,\n\tgeneration: number,\n\trequestRender: () => void = () => {},\n): PiStyleRuntime {\n\tlet disposed = false;\n\tconst extensionStatuses = (): readonly import(\"../domain/status.js\").ExtensionStatus[] | undefined => {\n\t\tif (!host.extensionStatusProvider) return undefined;\n\t\ttry {\n\t\t\treturn host.extensionStatusProvider();\n\t\t} catch {\n\t\t\thost.ui?.notify?.(\"pi-style extension statuses unavailable; provider recovery required\", \"warning\");\n\t\t\treturn [];\n\t\t}\n\t};\n\tlet currentConfig = host.config;\n\tconst disposables = new DisposableStore();\n\tconst scheduler = new RenderScheduler({ requestRender }, generation, () => !disposed);\n\tconst git = new CachedGitProvider(host.gitRunner);\n\tconst contextProvider = new InMemoryContextProvider();\n\tconst usageProvider = new InMemoryUsageProvider();\n\tconst usage = host.getContextUsage?.();\n\tconst initialStatuses = extensionStatuses();\n\tconst initialValues = {\n\t\t...(initialStatuses ? { extensionStatuses: initialStatuses } : {}),\n\t\t...(host.model?.name || host.model?.id ? { model: host.model.name ?? host.model.id } : {}),\n\t\t...(host.model?.provider ? { provider: host.model.provider } : {}),\n\t\t...(host.model?.reasoning !== undefined ? { reasoning: host.model.reasoning } : {}),\n\t\t...(host.thinkingLevel ? { thinkingLevel: normalizeThinkingLevel(host.thinkingLevel) } : {}),\n\t\t...(host.cwd ? { cwd: host.cwd } : {}),\n\t\t...(usage\n\t\t\t? {\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\t...(usage.tokens !== null ? { currentTokens: usage.tokens } : {}),\n\t\t\t\t\t\twindowTokens: usage.contextWindow,\n\t\t\t\t\t\t...(usage.percent !== null ? { percent: usage.percent } : {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\tlet currentSnapshot = createSnapshot(generation, 0, initialValues);\n\tlet statusLine: ReturnType<typeof installStatusLine> | undefined;\n\tlet editor: ReturnType<typeof installEditor> | undefined;\n\tlet startup: ReturnType<typeof installStartup> | undefined;\n\tlet installationState: RuntimeInstallationState = {\n\t\tstatus: \"disabled\",\n\t\teditor: \"disabled\",\n\t\tstartup: \"disabled\",\n\t};\n\tconst startupSnapshot = (config: NormalizedPiStyleConfig): StartupSnapshot => ({\n\t\t...currentSnapshot,\n\t\treason: host.startupReason ?? \"startup\",\n\t\t...(host.provider ? { startupProvider: host.provider } : {}),\n\t\t...(host.cwd ? { project: host.cwd.split(/[\\\\/]/).filter(Boolean).at(-1) } : {}),\n\t\tpreset: config.preset,\n\t\t...(host.resources ? { resources: host.resources } : {}),\n\t});\n\tconst installStatus = () => {\n\t\tif (!host.hasUI || host.mode !== \"tui\" || !host.ui || !currentConfig.enabled || !currentConfig.statusLine.enabled) {\n\t\t\tinstallationState = { ...installationState, status: \"disabled\" };\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tstatusLine = installStatusLine({\n\t\t\t\thost: host.ui,\n\t\t\t\tconfig: currentConfig,\n\t\t\t\tgeneration,\n\t\t\t\tinitialSnapshot: currentSnapshot,\n\t\t\t\tisCurrent: () => !disposed,\n\t\t\t\tclearOnStartup: host.startupReason === \"startup\",\n\t\t\t});\n\t\t\tif (statusLine) {\n\t\t\t\tdisposables.add(statusLine);\n\t\t\t\tinstallationState = { ...installationState, status: \"installed\" };\n\t\t\t} else installationState = { ...installationState, status: \"failed\" };\n\t\t} catch (error) {\n\t\t\thost.ui.notify?.(\n\t\t\t\t`pi-style status unavailable: ${error instanceof Error ? error.message : \"installation failed\"}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\tstatusLine = undefined;\n\t\t\tinstallationState = { ...installationState, status: \"failed\" };\n\t\t}\n\t};\n\tconst installEditorFeature = () => {\n\t\tif (!host.hasUI || host.mode !== \"tui\" || !host.ui || !currentConfig.enabled || !currentConfig.editor.enabled) {\n\t\t\tinstallationState = { ...installationState, editor: \"disabled\" };\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\teditor = installEditor({\n\t\t\t\thost: host.ui,\n\t\t\t\tconfig: currentConfig,\n\t\t\t\tgeneration,\n\t\t\t\tinitialSnapshot: currentSnapshot,\n\t\t\t\tisCurrent: () => !disposed,\n\t\t\t});\n\t\t\tif (editor) {\n\t\t\t\tdisposables.add(editor);\n\t\t\t\tinstallationState = { ...installationState, editor: editor.preservedPrevious ? \"preserved\" : \"installed\" };\n\t\t\t} else installationState = { ...installationState, editor: \"failed\" };\n\t\t} catch (error) {\n\t\t\thost.ui.notify?.(\n\t\t\t\t`pi-style editor unavailable: ${error instanceof Error ? error.message : \"installation failed\"}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\teditor = undefined;\n\t\t\tinstallationState = { ...installationState, editor: \"failed\" };\n\t\t}\n\t};\n\tconst installStartupFeature = () => {\n\t\tif (\n\t\t\t!host.hasUI ||\n\t\t\thost.mode !== \"tui\" ||\n\t\t\t!host.ui ||\n\t\t\t!currentConfig.enabled ||\n\t\t\tcurrentConfig.startup.mode === \"off\"\n\t\t) {\n\t\t\tinstallationState = { ...installationState, startup: \"disabled\" };\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tstartup = installStartup({\n\t\t\t\thost: { ...(host.ui as unknown as StartupHost), mode: host.mode, hasUI: host.hasUI },\n\t\t\t\tconfig: currentConfig,\n\t\t\t\tsnapshot: startupSnapshot(currentConfig),\n\t\t\t\tgeneration,\n\t\t\t\trequestRender,\n\t\t\t\ttimeoutMs: 3000,\n\t\t\t\tisCurrent: () => !disposed,\n\t\t\t});\n\t\t\tif (startup) {\n\t\t\t\tdisposables.add(startup);\n\t\t\t\tinstallationState = { ...installationState, startup: \"installed\" };\n\t\t\t} else installationState = { ...installationState, startup: \"failed\" };\n\t\t} catch (error) {\n\t\t\thost.ui.notify?.(\n\t\t\t\t`pi-style startup unavailable: ${error instanceof Error ? error.message : \"installation failed\"}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\tstartup = undefined;\n\t\t\tinstallationState = { ...installationState, startup: \"failed\" };\n\t\t}\n\t};\n\tconst disposeFeature = (label: string, dispose: (() => void) | undefined): void => {\n\t\tif (!dispose) return;\n\t\ttry {\n\t\t\tdispose();\n\t\t} catch (error) {\n\t\t\thost.ui?.notify?.(`pi-style ${label} cleanup failed; preserving the current owner`, \"warning\");\n\t\t\tvoid error;\n\t\t}\n\t};\n\tconst disposeStatus = () => {\n\t\tdisposeFeature(\"status\", statusLine?.dispose);\n\t\tstatusLine = undefined;\n\t\tinstallationState = { ...installationState, status: \"disabled\" };\n\t};\n\tconst disposeEditor = () => {\n\t\tdisposeFeature(\"editor\", editor?.dispose);\n\t\teditor = undefined;\n\t\tinstallationState = { ...installationState, editor: \"disabled\" };\n\t};\n\tconst disposeStartup = () => {\n\t\tdisposeFeature(\"startup\", startup?.dispose);\n\t\tstartup = undefined;\n\t\tinstallationState = { ...installationState, startup: \"disabled\" };\n\t};\n\tinstallStatus();\n\tinstallEditorFeature();\n\tinstallStartupFeature();\n\tif (host.cwd && currentConfig.enabled && currentConfig.statusLine.enabled) {\n\t\tvoid git.get(host.cwd).then((value) => {\n\t\t\tif (disposed) return;\n\t\t\tcurrentSnapshot = replaceSnapshot(currentSnapshot, generation, { ...currentSnapshot, git: value });\n\t\t\tstatusLine?.update(currentSnapshot);\n\t\t\teditor?.update(currentSnapshot);\n\t\t\tstartup?.update({\n\t\t\t\t...currentSnapshot,\n\t\t\t\treason: host.startupReason ?? \"startup\",\n\t\t\t\t...(host.provider ? { startupProvider: host.provider } : {}),\n\t\t\t\t...(host.cwd ? { project: host.cwd.split(/[\\\\/]/).filter(Boolean).at(-1) } : {}),\n\t\t\t\tpreset: currentConfig.preset,\n\t\t\t\t...(host.resources ? { resources: host.resources } : {}),\n\t\t\t});\n\t\t\trequestRender();\n\t\t});\n\t}\n\tif (usage) {\n\t\tcontextProvider.set(\"active\", {\n\t\t\t...(usage.tokens !== null ? { currentTokens: usage.tokens } : {}),\n\t\t\twindowTokens: usage.contextWindow,\n\t\t\t...(usage.percent !== null ? { percent: usage.percent } : {}),\n\t\t});\n\t}\n\treturn {\n\t\tgeneration,\n\t\tproviderIdentity: { git, context: contextProvider, usage: usageProvider },\n\t\tget installationState() {\n\t\t\treturn installationState;\n\t\t},\n\t\tmode: host.mode,\n\t\thasUI: host.hasUI,\n\t\tsnapshot: currentSnapshot,\n\t\tdisposables,\n\t\tscheduler,\n\t\tupdateStartupResources(resources) {\n\t\t\tif (disposed) return;\n\t\t\tstartup?.update({\n\t\t\t\t...currentSnapshot,\n\t\t\t\treason: host.startupReason ?? \"startup\",\n\t\t\t\t...(host.provider ? { startupProvider: host.provider } : {}),\n\t\t\t\t...(host.cwd ? { project: host.cwd.split(/[\\\\/]/).filter(Boolean).at(-1) } : {}),\n\t\t\t\tpreset: currentConfig.preset,\n\t\t\t\tresources,\n\t\t\t});\n\t\t\trequestRender();\n\t\t},\n\t\tdismissStartup() {\n\t\t\tstartup?.dismiss();\n\t\t},\n\t\tupdate(values) {\n\t\t\tif (disposed) return;\n\t\t\tconst liveUsage = host.getContextUsage?.();\n\t\t\tconst context = liveUsage\n\t\t\t\t? {\n\t\t\t\t\t\t...(liveUsage.tokens !== null ? { currentTokens: liveUsage.tokens } : {}),\n\t\t\t\t\t\twindowTokens: liveUsage.contextWindow,\n\t\t\t\t\t\t...(liveUsage.percent !== null ? { percent: liveUsage.percent } : {}),\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\tconst statuses = extensionStatuses();\n\t\t\tcurrentSnapshot = replaceSnapshot(currentSnapshot, generation, {\n\t\t\t\t...currentSnapshot,\n\t\t\t\t...values,\n\t\t\t\t...(context ? { context } : {}),\n\t\t\t\t...(statuses ? { extensionStatuses: statuses } : {}),\n\t\t\t});\n\t\t\tstatusLine?.update(currentSnapshot);\n\t\t\teditor?.update(currentSnapshot);\n\t\t\tstartup?.update({\n\t\t\t\t...currentSnapshot,\n\t\t\t\treason: host.startupReason ?? \"startup\",\n\t\t\t\t...(host.provider ? { startupProvider: host.provider } : {}),\n\t\t\t\t...(host.cwd ? { project: host.cwd.split(/[\\\\/]/).filter(Boolean).at(-1) } : {}),\n\t\t\t\tpreset: currentConfig.preset,\n\t\t\t\t...(host.resources ? { resources: host.resources } : {}),\n\t\t\t});\n\t\t},\n\t\tconfigure(nextConfig) {\n\t\t\tif (disposed) return;\n\t\t\tconst previous = currentConfig;\n\t\t\tconst impactPlan = diffConfig(previous, nextConfig);\n\t\t\tif (impactPlan.impacts.length === 0) return;\n\t\t\tcurrentConfig = nextConfig;\n\t\t\tconst statusChanged =\n\t\t\t\tJSON.stringify(previous.statusLine) !== JSON.stringify(nextConfig.statusLine) ||\n\t\t\t\tprevious.placement !== nextConfig.placement ||\n\t\t\t\tprevious.enabled !== nextConfig.enabled;\n\t\t\tconst editorChanged =\n\t\t\t\tJSON.stringify(previous.editor) !== JSON.stringify(nextConfig.editor) ||\n\t\t\t\tprevious.enabled !== nextConfig.enabled;\n\t\t\tconst startupChanged =\n\t\t\t\tJSON.stringify(previous.startup) !== JSON.stringify(nextConfig.startup) ||\n\t\t\t\tprevious.enabled !== nextConfig.enabled;\n\t\t\tif (statusChanged) {\n\t\t\t\tdisposeStatus();\n\t\t\t\tcurrentConfig = nextConfig;\n\t\t\t\tinstallStatus();\n\t\t\t}\n\t\t\tif (editorChanged) {\n\t\t\t\tdisposeEditor();\n\t\t\t\tcurrentConfig = nextConfig;\n\t\t\t\tinstallEditorFeature();\n\t\t\t}\n\t\t\tif (startupChanged) {\n\t\t\t\tdisposeStartup();\n\t\t\t\tcurrentConfig = nextConfig;\n\t\t\t\tinstallStartupFeature();\n\t\t\t}\n\t\t\tstatusLine?.configure(nextConfig);\n\t\t\teditor?.configure(nextConfig);\n\t\t\tstartup?.configure(nextConfig);\n\t\t},\n\t\tinvalidateGit() {\n\t\t\tif (disposed || !host.cwd || !currentConfig.enabled || !currentConfig.statusLine.enabled) return;\n\t\t\tgit.invalidate(host.cwd);\n\t\t\tvoid git.get(host.cwd).then((value) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tcurrentSnapshot = replaceSnapshot(currentSnapshot, generation, { ...currentSnapshot, git: value });\n\t\t\t\tstatusLine?.update(currentSnapshot);\n\t\t\t\teditor?.update(currentSnapshot);\n\t\t\t\tstartup?.update({\n\t\t\t\t\t...currentSnapshot,\n\t\t\t\t\treason: host.startupReason ?? \"startup\",\n\t\t\t\t\t...(host.provider ? { startupProvider: host.provider } : {}),\n\t\t\t\t\t...(host.cwd ? { project: host.cwd.split(/[\\\\/]/).filter(Boolean).at(-1) } : {}),\n\t\t\t\t\tpreset: currentConfig.preset,\n\t\t\t\t});\n\t\t\t\trequestRender();\n\t\t\t});\n\t\t},\n\t\tget disposed() {\n\t\t\treturn disposed;\n\t\t},\n\t\tdispose() {\n\t\t\tif (disposed) return;\n\t\t\tdisposed = true;\n\t\t\tscheduler.cancel();\n\t\t\t// UI surfaces are restored synchronously so teardown is deterministic;\n\t\t\t// the store then disposes the (already disposed) feature instances idempotently.\n\t\t\tdisposeStatus();\n\t\t\tdisposeEditor();\n\t\t\tdisposeStartup();\n\t\t\tgit.dispose();\n\t\t\tcontextProvider.clear();\n\t\t\tusageProvider.reset();\n\t\t\tvoid disposables.dispose();\n\t\t},\n\t};\n}\n\nexport class PiStyleRuntimeController {\n\tprivate activeRuntime: PiStyleRuntime | undefined;\n\tprivate nextGeneration = 0;\n\n\tstart(ctx: RuntimeHost): PiStyleRuntime {\n\t\tthis.stop();\n\t\tthis.activeRuntime = createPiStyleRuntime(ctx, ++this.nextGeneration);\n\t\treturn this.activeRuntime;\n\t}\n\n\tstop(): void {\n\t\tthis.activeRuntime?.dispose();\n\t\tthis.activeRuntime = undefined;\n\t}\n\n\tget current(): PiStyleRuntime | undefined {\n\t\treturn this.activeRuntime;\n\t}\n}\n","import { boundedDiagnostics } from \"../domain/config-diagnostics.js\";\nimport { DEFAULT_CONFIG, normalizeConfig, resolveConfigDetailed } from \"../domain/config-normalization.js\";\nimport type { NormalizedPiStyleConfig } from \"../domain/config-types.js\";\nimport type { StartupDetailItem, StartupReason } from \"../features/startup/index.js\";\nimport { createDoctor, type DoctorOperationalState } from \"./doctor.js\";\nimport { PiStyleRuntimeController } from \"./runtime.js\";\n\nexport interface StartupResourceDiscovery {\n\treadonly skillPaths?: readonly string[];\n\treadonly promptPaths?: readonly string[];\n\treadonly themePaths?: readonly string[];\n\t/** Raw system prompt text; word/line counts are computed outside render. */\n\treadonly systemPrompt?: string;\n\t/** Context files with pre-computed word/line counts (discovery outside render). */\n\treadonly contextDetails?: readonly { path: string; words: number; lines: number }[];\n\t/** Active tools with compact source labels (discovery outside render). */\n\treadonly toolDetails?: readonly { source: string; name: string }[];\n\treadonly models?: number;\n}\n\nfunction countWords(text: string): number {\n\treturn text.match(/[\\p{L}\\p{N}_]+/gu)?.length ?? 0;\n}\n\nfunction countLines(text: string): number {\n\tif (text.length === 0) return 0;\n\tconst lines = text.split(/\\r\\n|\\r|\\n/).length;\n\treturn /\\r\\n$|\\r$|\\n$/.test(text) ? lines - 1 : lines;\n}\n\nfunction toStartupResources(resources: StartupResourceDiscovery) {\n\tconst details: StartupDetailItem[] = [];\n\tif (resources.systemPrompt) {\n\t\tconst words = countWords(resources.systemPrompt);\n\t\tconst lines = countLines(resources.systemPrompt);\n\t\tif (words > 0 && lines > 0) details.push({ kind: \"system\", path: \"system prompt\", words, lines });\n\t}\n\tfor (const file of resources.contextDetails ?? []) {\n\t\tif (file.words > 0 && file.lines > 0) {\n\t\t\tdetails.push({ kind: \"context\", path: file.path, words: file.words, lines: file.lines });\n\t\t}\n\t}\n\treturn {\n\t\t...(resources.promptPaths ? { contextFiles: resources.promptPaths.length } : {}),\n\t\t...(resources.themePaths ? { extensions: resources.themePaths.length } : {}),\n\t\t...(resources.skillPaths ? { skills: resources.skillPaths.length } : {}),\n\t\t...(resources.models !== undefined ? { models: resources.models } : {}),\n\t\t...(resources.toolDetails && resources.toolDetails.length > 0\n\t\t\t? { tools: resources.toolDetails.length, toolDetails: resources.toolDetails }\n\t\t\t: {}),\n\t\t...(details.length > 0 ? { details } : {}),\n\t};\n}\n\nexport interface ConfigReloadPort {\n\tload(trusted: boolean): Promise<{\n\t\treadonly config?: unknown;\n\t\treadonly diagnostics?: readonly import(\"../domain/config-diagnostics.js\").ConfigDiagnostic[];\n\t\treadonly sources?: Readonly<Record<string, string>>;\n\t\treadonly rawSources?: {\n\t\t\tdefaults?: unknown;\n\t\t\tglobal?: unknown;\n\t\t\tproject?: unknown;\n\t\t\tenvironment?: Record<string, string | undefined>;\n\t\t};\n\t\treadonly productPolicy?: { corePatchGate: \"omitted\" | \"allow\" | \"deny\" };\n\t}>;\n}\n\nexport interface AppHost {\n\treadonly mode: \"tui\" | \"rpc\" | \"json\" | \"print\";\n\treadonly hasUI: boolean;\n\treadonly ui?: Parameters<PiStyleRuntimeController[\"start\"]>[0][\"ui\"];\n\treadonly cwd?: string;\n\treadonly model?: { id?: string; name?: string; provider?: string; reasoning?: boolean };\n\treadonly thinkingLevel?: string;\n\treadonly getContextUsage?: () => { tokens: number | null; contextWindow: number; percent: number | null } | undefined;\n\treadonly projectTrusted?: boolean;\n\treadonly extensionStatusProvider?: () => readonly import(\"../domain/status.js\").ExtensionStatus[] | undefined;\n\treadonly gitRunner?: import(\"../domain/providers.js\").GitCommandRunner;\n}\n\nexport interface PiStyleApp {\n\treadonly runtime: PiStyleRuntimeController;\n\treadonly config: NormalizedPiStyleConfig;\n\treadonly productPolicy: { corePatchGate: \"omitted\" | \"allow\" | \"deny\" };\n\tsessionStart(ctx: AppHost, reason?: StartupReason, resources?: StartupResourceDiscovery): void;\n\tsetResources(resources: StartupResourceDiscovery): void;\n\tapplySession(patch: unknown): void;\n\tsetProjectTrusted(trusted: boolean): void;\n\tsetOperationalState(state: DoctorOperationalState): void;\n\tsetProductPolicy(policy: { corePatchGate: \"omitted\" | \"allow\" | \"deny\" }): void;\n\treload(): Promise<void>;\n\tdoctor(): Readonly<Record<string, unknown>>;\n\tsessionShutdown(): void;\n\tupdate(\n\t\tvalues: import(\"../domain/status.js\").StatusSnapshot,\n\t\tkind?: import(\"./render-scheduler.js\").UpdateClass,\n\t): void;\n}\n\nfunction submittedSessionPaths(value: unknown, prefix = \"\"): readonly string[] {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\n\treturn Object.entries(value).flatMap(([key, nested]) => {\n\t\tconst path = prefix ? `${prefix}.${key}` : key;\n\t\treturn [path, ...submittedSessionPaths(nested, path)];\n\t});\n}\nfunction composeSources(\n\tdurable: Readonly<Record<string, string>>,\n\tresolved: Readonly<Record<string, string>>,\n\tsession: unknown,\n): Readonly<Record<string, string>> {\n\tconst next = { ...durable, ...resolved };\n\tfor (const path of submittedSessionPaths(session)) {\n\t\tconst effectiveSource = resolved[path];\n\t\tif (effectiveSource === undefined) delete next[path];\n\t\telse next[path] = effectiveSource;\n\t}\n\treturn next;\n}\n\nfunction mergePatch(base: unknown, patch: unknown): unknown {\n\tif (patch === undefined) return base;\n\tif (\n\t\ttypeof base !== \"object\" ||\n\t\tbase === null ||\n\t\tArray.isArray(base) ||\n\t\ttypeof patch !== \"object\" ||\n\t\tpatch === null ||\n\t\tArray.isArray(patch)\n\t)\n\t\treturn patch;\n\tconst result: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n\tfor (const [key, value] of Object.entries(patch as Record<string, unknown>))\n\t\tresult[key] = mergePatch(result[key], value);\n\treturn result;\n}\n\nexport function createPiStyleApp(\n\tinitialConfig?: unknown,\n\treloadPort?: ConfigReloadPort,\n\tonConfigChange?: (config: NormalizedPiStyleConfig) => void,\n): PiStyleApp {\n\tconst runtime = new PiStyleRuntimeController();\n\tlet config = initialConfig === undefined ? DEFAULT_CONFIG : normalizeConfig(initialConfig);\n\tlet diagnostics: readonly import(\"../domain/config-diagnostics.js\").ConfigDiagnostic[] = [];\n\tlet durableDiagnostics: readonly import(\"../domain/config-diagnostics.js\").ConfigDiagnostic[] = [];\n\tlet durableSources: Readonly<Record<string, string>> = {};\n\tlet sources: Readonly<Record<string, string>> = {};\n\tlet trusted = true;\n\tlet resources: StartupResourceDiscovery | undefined;\n\tlet operational: DoctorOperationalState = {};\n\tlet sessionPatch: unknown;\n\tlet rawSources: {\n\t\tdefaults?: unknown;\n\t\tglobal?: unknown;\n\t\tproject?: unknown;\n\t\tenvironment?: Record<string, string | undefined>;\n\t} = { defaults: initialConfig ?? DEFAULT_CONFIG };\n\tlet productPolicy: { corePatchGate: \"omitted\" | \"allow\" | \"deny\" } = { corePatchGate: \"omitted\" };\n\tconst resolveAll = () => resolveConfigDetailed({ ...rawSources, session: sessionPatch, projectTrusted: trusted });\n\tconst resolveProductPolicy = () => {\n\t\tconst values = [rawSources.global, trusted ? rawSources.project : undefined, sessionPatch];\n\t\tfor (const value of values) {\n\t\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) continue;\n\t\t\tconst compatibility = (value as Record<string, unknown>).compatibility;\n\t\t\tif (\n\t\t\t\tcompatibility &&\n\t\t\t\ttypeof compatibility === \"object\" &&\n\t\t\t\t!Array.isArray(compatibility) &&\n\t\t\t\tObject.hasOwn(compatibility, \"allowCorePatches\") &&\n\t\t\t\t(compatibility as Record<string, unknown>).allowCorePatches === false\n\t\t\t)\n\t\t\t\treturn { corePatchGate: \"deny\" as const };\n\t\t}\n\t\treturn { corePatchGate: \"omitted\" as const };\n\t};\n\treturn {\n\t\truntime,\n\t\tget config() {\n\t\t\treturn config;\n\t\t},\n\t\tget productPolicy() {\n\t\t\treturn productPolicy;\n\t\t},\n\t\tsessionStart(ctx, reason = \"startup\", discoveredResources) {\n\t\t\ttrusted = ctx.projectTrusted ?? true;\n\t\t\tresources = discoveredResources;\n\t\t\toperational = {\n\t\t\t\t...operational,\n\t\t\t\tprovider: ctx.extensionStatusProvider\n\t\t\t\t\t? { status: \"configured\", recovery: \"provider will be checked on first snapshot\" }\n\t\t\t\t\t: { status: \"unavailable\", recovery: \"inject a capability-safe provider\" },\n\t\t\t\tinstallations: {\n\t\t\t\t\tstatus: config.enabled && config.statusLine.enabled ? \"active\" : \"disabled\",\n\t\t\t\t\teditor: config.enabled && config.editor.enabled ? \"active\" : \"disabled\",\n\t\t\t\t\tstartup: config.enabled && config.startup.mode !== \"off\" ? \"active\" : \"disabled\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst statusProvider = ctx.extensionStatusProvider\n\t\t\t\t? () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = ctx.extensionStatusProvider?.();\n\t\t\t\t\t\t\toperational = { ...operational, provider: { status: \"available\" } };\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\toperational = {\n\t\t\t\t\t\t\t\t...operational,\n\t\t\t\t\t\t\t\tprovider: { status: \"unavailable\", recovery: \"provider threw; retry after recovery\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tctx.ui?.notify?.(\"pi-style extension statuses unavailable; provider recovery required\", \"warning\");\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\truntime.start({\n\t\t\t\tmode: ctx.mode,\n\t\t\t\thasUI: ctx.hasUI,\n\t\t\t\t...(ctx.ui ? { ui: ctx.ui } : {}),\n\t\t\t\t...(ctx.cwd ? { cwd: ctx.cwd } : {}),\n\t\t\t\t...(ctx.model ? { model: ctx.model } : {}),\n\t\t\t\t...(ctx.thinkingLevel ? { thinkingLevel: ctx.thinkingLevel } : {}),\n\t\t\t\tconfig,\n\t\t\t\tstartupReason: reason,\n\t\t\t\t...(resources ? { resources: toStartupResources(resources) } : {}),\n\t\t\t\t...(ctx.getContextUsage ? { getContextUsage: ctx.getContextUsage } : {}),\n\t\t\t\t...(ctx.projectTrusted !== undefined ? { projectTrusted: ctx.projectTrusted } : {}),\n\t\t\t\t...(ctx.gitRunner ? { gitRunner: ctx.gitRunner } : {}),\n\t\t\t\t...(statusProvider ? { extensionStatusProvider: statusProvider } : {}),\n\t\t\t});\n\t\t},\n\t\tsetResources(next) {\n\t\t\tresources = next;\n\t\t\truntime.current?.updateStartupResources(toStartupResources(next));\n\t\t},\n\t\tapplySession(patch) {\n\t\t\tsessionPatch = mergePatch(sessionPatch, patch);\n\t\t\tconst resolved = resolveAll();\n\t\t\tconfig = resolved.config;\n\t\t\tdiagnostics = boundedDiagnostics([...durableDiagnostics, ...resolved.diagnostics]);\n\t\t\tsources = composeSources(durableSources, resolved.sources, sessionPatch);\n\t\t\tproductPolicy = resolveProductPolicy();\n\t\t\toperational = {\n\t\t\t\t...operational,\n\t\t\t\tauthorization: { ...(operational.authorization ?? {}), productCorePatchGate: productPolicy.corePatchGate },\n\t\t\t};\n\t\t\truntime.current?.configure(config);\n\t\t\toperational = {\n\t\t\t\t...operational,\n\t\t\t\tinstallations: { ...(operational.installations ?? {}), configChange: \"reconciled\" },\n\t\t\t};\n\t\t\tonConfigChange?.(config);\n\t\t},\n\t\tsetProjectTrusted(nextTrusted) {\n\t\t\ttrusted = nextTrusted;\n\t\t},\n\t\tsetOperationalState(state) {\n\t\t\toperational = { ...operational, ...state };\n\t\t},\n\t\tsetProductPolicy(policy) {\n\t\t\tproductPolicy = policy;\n\t\t\toperational = {\n\t\t\t\t...operational,\n\t\t\t\tauthorization: { ...(operational.authorization ?? {}), productCorePatchGate: policy.corePatchGate },\n\t\t\t};\n\t\t},\n\t\tsessionShutdown() {\n\t\t\truntime.stop();\n\t\t},\n\t\tupdate(values, kind = \"coalesced\") {\n\t\t\tconst active = runtime.current;\n\t\t\tif (!active) return;\n\t\t\tactive.update(values);\n\t\t\tactive.scheduler.schedule(kind);\n\t\t},\n\t\treload() {\n\t\t\tif (!reloadPort) {\n\t\t\t\truntime.current?.configure(config);\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\t\t\treturn reloadPort.load(trusted).then((result) => {\n\t\t\t\tdurableDiagnostics = boundedDiagnostics(result.diagnostics ?? []);\n\t\t\t\tdurableSources = result.sources ?? {};\n\t\t\t\tdiagnostics = durableDiagnostics;\n\t\t\t\tsources = durableSources;\n\t\t\t\tif (result.config !== undefined) {\n\t\t\t\t\trawSources = result.rawSources ?? { defaults: result.config };\n\t\t\t\t\tproductPolicy = resolveProductPolicy();\n\t\t\t\t\tconst resolved = resolveAll();\n\t\t\t\t\tconfig = resolved.config;\n\t\t\t\t\tdiagnostics = boundedDiagnostics([...durableDiagnostics, ...resolved.diagnostics]);\n\t\t\t\t\tsources = composeSources(durableSources, resolved.sources, sessionPatch);\n\t\t\t\t\tonConfigChange?.(config);\n\t\t\t\t\toperational = {\n\t\t\t\t\t\t...operational,\n\t\t\t\t\t\tauthorization: { ...(operational.authorization ?? {}), productCorePatchGate: productPolicy.corePatchGate },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\truntime.current?.configure(config);\n\t\t\t\tonConfigChange?.(config);\n\t\t\t});\n\t\t},\n\t\tdoctor() {\n\t\t\treturn createDoctor({\n\t\t\t\tconfig,\n\t\t\t\toperational,\n\t\t\t\tdiagnostics,\n\t\t\t\tsources,\n\t\t\t\tsurfaces: {\n\t\t\t\t\tstatus: operational.installations?.status ?? \"unknown\",\n\t\t\t\t\teditor: operational.installations?.editor ?? \"unknown\",\n\t\t\t\t\tstartup: operational.installations?.startup ?? \"unknown\",\n\t\t\t\t\tuserMessage: operational.compatibility?.userMessage ?? \"unknown\",\n\t\t\t\t\tassistantMessage: operational.compatibility?.assistantMessage ?? \"unknown\",\n\t\t\t\t\tspecialBlocks: operational.compatibility?.specialBlocks ?? \"unknown\",\n\t\t\t\t\ttools: operational.compatibility?.tools ?? \"unknown\",\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t};\n}\n","// Special message-block presentation: compaction, skill invocation, branch\n// summary, and extension custom (MCP) messages, rendered as boxed blocks.\n//\n// These patches are pure delegates: the compatibility probe installs them\n// through its reversible, generation-tracked wrapper and restores the native\n// identity on shutdown. The delegate receives the native method and falls back\n// to it whenever the theme or component shape is unavailable.\n\nimport { keyText } from \"@earendil-works/pi-coding-agent\";\nimport { Markdown, type MarkdownTheme } from \"@earendil-works/pi-tui\";\nimport type { BoxTheme } from \"../../shared/box.js\";\nimport { setFullTheme } from \"../../shared/theme-extras.js\";\nimport { renderBoxedMessageBlock } from \"./boxed-block.js\";\n\nlet cachedTheme: BoxTheme | undefined;\n\nexport function setSpecialBlockTheme(theme: BoxTheme | undefined): void {\n\tcachedTheme = theme;\n\tif (theme) setFullTheme(theme);\n}\n\nexport type SpecialBlockSubtype =\n\t| \"native-compaction-message\"\n\t| \"native-branch-message\"\n\t| \"native-skill-message\"\n\t| \"native-custom-message\";\n\nexport type SpecialBlockCtor = { prototype?: unknown };\n\nexport interface SpecialBlockCtors {\n\tCompactionSummaryMessageComponent?: SpecialBlockCtor;\n\tSkillInvocationMessageComponent?: SpecialBlockCtor;\n\tBranchSummaryMessageComponent?: SpecialBlockCtor;\n\tCustomMessageComponent?: SpecialBlockCtor;\n}\n\n/** Structural view of the native message components as used by the patches. */\ninterface MessageBlockInstance {\n\tmessage?: {\n\t\ttokensBefore?: unknown;\n\t\tsummary?: unknown;\n\t\tcustomType?: unknown;\n\t\tcontent?: unknown;\n\t};\n\tskillBlock?: { name?: unknown; content?: unknown };\n\texpanded?: unknown;\n\t_expanded?: unknown;\n\tmarkdownTheme?: unknown;\n\tbox?: { clear(): void; addChild(child: unknown): void; setBgFn?(fn: (text: string) => string): void };\n\tcustomComponent?: unknown;\n\tcustomRenderer?: unknown;\n\tclear?(): void;\n\taddChild(child: unknown): void;\n\tremoveChild(child: unknown): void;\n\tsetBgFn?(fn: (text: string) => string): void;\n}\n\nconst EXPAND_HINT = \"Ctrl+O to expand\";\n\nfunction expandHint(): string {\n\ttry {\n\t\tconst text = keyText(\"app.tools.expand\");\n\t\treturn text ? `${text} to expand` : EXPAND_HINT;\n\t} catch {\n\t\treturn EXPAND_HINT;\n\t}\n}\n\nfunction createMarkdownBody(\n\ttext: string,\n\tmarkdownTheme: MarkdownTheme | undefined,\n\ttheme: BoxTheme,\n): (contentWidth: number) => string[] {\n\tconst md = new Markdown(text || \"\", 0, 0, markdownTheme as MarkdownTheme, {\n\t\tcolor: (t: string) => theme.fg(\"customMessageText\", t),\n\t});\n\treturn (contentWidth: number) => md.render(contentWidth);\n}\n\n/**\n * Neutralize the native customMessageBg fill for boxed blocks: the boxed block\n * owns its visual boundary, so the parent background is removed (the box sits\n * directly on the terminal/page background).\n */\nfunction neutralizeMessageBlockBackground(target: { setBgFn?(fn: (text: string) => string): void } | undefined): void {\n\tif (!target) return;\n\tif (typeof target.setBgFn === \"function\") target.setBgFn((text) => text);\n}\n\nfunction patchCompaction(instance: MessageBlockInstance, _original: () => void, theme: BoxTheme): boolean {\n\tconst tokensBefore = instance.message?.tokensBefore;\n\tif (tokensBefore == null) return false;\n\n\tif (typeof instance.clear === \"function\") instance.clear();\n\n\tconst expanded = Boolean(instance.expanded);\n\tconst summary = typeof instance.message?.summary === \"string\" ? instance.message.summary : \"\";\n\tconst markdownTheme = instance.markdownTheme as MarkdownTheme | undefined;\n\n\tneutralizeMessageBlockBackground(instance as { setBgFn?(fn: (text: string) => string): void });\n\n\tconst body = expanded && summary && markdownTheme ? createMarkdownBody(summary, markdownTheme, theme) : () => [];\n\n\tconst tokenStr = Number(tokensBefore).toLocaleString();\n\tneutralizeMessageBlockBackground(instance as { setBgFn?(fn: (text: string) => string): void });\n\tconst block = renderBoxedMessageBlock(theme, {\n\t\tkind: \"Compaction\",\n\t\ttitle: `${tokenStr} tokens`,\n\t\t...(expanded ? {} : { right: `(${expandHint()})` }),\n\t\tbody,\n\t\ticon: \"⊟\",\n\t\thasDivider: expanded,\n\t});\n\tinstance.addChild(block);\n\treturn true;\n}\n\nfunction patchSkill(instance: MessageBlockInstance, _original: () => void, theme: BoxTheme): boolean {\n\tconst skillName = instance.skillBlock?.name;\n\tif (typeof skillName !== \"string\" || !skillName) return false;\n\n\tif (typeof instance.clear === \"function\") instance.clear();\n\n\tconst expanded = Boolean(instance.expanded);\n\tconst content = typeof instance.skillBlock?.content === \"string\" ? instance.skillBlock.content : \"\";\n\tconst markdownTheme = instance.markdownTheme as MarkdownTheme | undefined;\n\n\tneutralizeMessageBlockBackground(instance as { setBgFn?(fn: (text: string) => string): void });\n\n\tconst body = expanded && content && markdownTheme ? createMarkdownBody(content, markdownTheme, theme) : () => [];\n\n\tconst block = renderBoxedMessageBlock(theme, {\n\t\tkind: \"Skill\",\n\t\ttitle: skillName,\n\t\t...(expanded ? {} : { right: `(${expandHint()})` }),\n\t\tbody,\n\t\ticon: \"⊟\",\n\t\thasDivider: expanded,\n\t});\n\tinstance.addChild(block);\n\treturn true;\n}\n\nfunction patchBranch(instance: MessageBlockInstance, _original: () => void, theme: BoxTheme): boolean {\n\tif (instance.message == null) return false;\n\n\tif (typeof instance.clear === \"function\") instance.clear();\n\n\tconst expanded = Boolean(instance.expanded);\n\tconst summary = typeof instance.message?.summary === \"string\" ? instance.message.summary : \"\";\n\tconst markdownTheme = instance.markdownTheme as MarkdownTheme | undefined;\n\n\tneutralizeMessageBlockBackground(instance as { setBgFn?(fn: (text: string) => string): void });\n\n\tconst body = expanded && summary && markdownTheme ? createMarkdownBody(summary, markdownTheme, theme) : () => [];\n\n\tconst block = renderBoxedMessageBlock(theme, {\n\t\tkind: \"Branch\",\n\t\t...(expanded ? {} : { right: `(${expandHint()})` }),\n\t\tbody,\n\t\ticon: \"⊟\",\n\t\thasDivider: expanded,\n\t});\n\tinstance.addChild(block);\n\treturn true;\n}\n\nfunction attachCustomMessageBlock(instance: MessageBlockInstance, block: unknown): boolean {\n\tif (instance.box && typeof instance.box.clear === \"function\" && typeof instance.box.addChild === \"function\") {\n\t\tinstance.addChild(instance.box);\n\t\tinstance.box.clear();\n\t\tinstance.box.addChild(block);\n\t\treturn true;\n\t}\n\tinstance.customComponent = block;\n\tinstance.addChild(instance.customComponent);\n\treturn true;\n}\n\nfunction patchCustomMessage(instance: MessageBlockInstance, _original: () => void, theme: BoxTheme): boolean {\n\t// Remove previous content component\n\tif (instance.customComponent) {\n\t\tinstance.removeChild(instance.customComponent);\n\t\tinstance.customComponent = undefined;\n\t}\n\tif (instance.box) instance.removeChild(instance.box);\n\n\t// The boxed shell owns its boundary; drop the native customMessageBg fill.\n\tneutralizeMessageBlockBackground(instance.box);\n\tneutralizeMessageBlockBackground(instance as { setBgFn?(fn: (text: string) => string): void });\n\n\tconst rawCustomType = instance.message?.customType;\n\tconst customType = typeof rawCustomType === \"string\" ? rawCustomType : \"Custom\";\n\n\t// Try custom renderer first, but keep the special block shell/background owned here.\n\tif (typeof instance.customRenderer === \"function\") {\n\t\ttry {\n\t\t\tconst component = (instance.customRenderer as (message: unknown, options: object, theme: unknown) => unknown)(\n\t\t\t\tinstance.message,\n\t\t\t\t{ expanded: instance._expanded },\n\t\t\t\ttheme,\n\t\t\t);\n\t\t\tif (component && typeof (component as { render?: unknown }).render === \"function\") {\n\t\t\t\tconst block = renderBoxedMessageBlock(theme, {\n\t\t\t\t\tkind: \"Custom\",\n\t\t\t\t\ttitle: customType,\n\t\t\t\t\tbody: (contentWidth) => (component as { render(width: number): string[] }).render(contentWidth),\n\t\t\t\t\ticon: \"⊟\",\n\t\t\t\t\thasDivider: \"auto\",\n\t\t\t\t\tcache: false,\n\t\t\t\t});\n\t\t\t\tattachCustomMessageBlock(instance, block);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to default rendering\n\t\t}\n\t}\n\n\t// Default rendering: use boxed message block\n\n\t// Extract text content\n\tconst rawContent = instance.message?.content;\n\tlet text: string;\n\tif (typeof rawContent === \"string\") {\n\t\ttext = rawContent;\n\t} else if (Array.isArray(rawContent)) {\n\t\ttext = rawContent\n\t\t\t.filter((c: unknown) => {\n\t\t\t\tif (!c || typeof c !== \"object\") return false;\n\t\t\t\treturn (c as { type?: unknown }).type === \"text\";\n\t\t\t})\n\t\t\t.map((c) => String((c as { text?: unknown }).text ?? \"\"))\n\t\t\t.join(\"\\n\");\n\t} else {\n\t\ttext = \"\";\n\t}\n\n\tconst markdownTheme = instance.markdownTheme as MarkdownTheme | undefined;\n\n\tconst body = text && markdownTheme ? createMarkdownBody(text, markdownTheme, theme) : () => [];\n\n\tconst block = renderBoxedMessageBlock(theme, {\n\t\tkind: \"Custom\",\n\t\ttitle: customType,\n\t\tbody,\n\t\ticon: \"⊟\",\n\t\thasDivider: Boolean(text),\n\t});\n\n\tattachCustomMessageBlock(instance, block);\n\treturn true;\n}\n\n/**\n * Delegate invoked by the compatibility probe's wrapper for each special block\n * method. Falls back to the native implementation when the theme cache is\n * empty or the component shape is unsupported.\n */\nexport function renderSpecialMessageBlock(\n\tsubtype: SpecialBlockSubtype,\n\toriginal: unknown,\n\tthisArg: object,\n\targs: unknown[],\n): unknown {\n\tconst instance = thisArg as unknown as MessageBlockInstance;\n\tconst base = original as (this: object, ...rest: unknown[]) => unknown;\n\tconst applyBase = () => base.apply(thisArg, args);\n\tconst theme = cachedTheme;\n\tif (!theme) return applyBase();\n\ttry {\n\t\tlet handled = false;\n\t\tif (subtype === \"native-compaction-message\") handled = patchCompaction(instance, applyBase, theme);\n\t\telse if (subtype === \"native-skill-message\") handled = patchSkill(instance, applyBase, theme);\n\t\telse if (subtype === \"native-branch-message\") handled = patchBranch(instance, applyBase, theme);\n\t\telse if (subtype === \"native-custom-message\") handled = patchCustomMessage(instance, applyBase, theme);\n\t\treturn handled ? undefined : applyBase();\n\t} catch {\n\t\treturn applyBase();\n\t}\n}\n","// Theme extras reader.\n//\n// Reads extension-specific \"extras\" plus raw theme vars/export values from the\n// active theme's JSON file on disk. Pi does not expose all of these raw values\n// through the theme object, so we locate and parse the file directly.\n//\n// pi-style constraint: no filesystem I/O inside render. The cache is populated\n// by `syncThemeExtras(theme, force)` at session start and on theme change; the\n// render-facing `getThemeExtra`/`getThemePageBackground`/`getThemeVarBackground`\n// read cached values only and return \"\" (graceful fallback) when unavailable.\n\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { isHexColor } from \"../shared/ansi.js\";\n\nconst extensionDir = dirname(fileURLToPath(import.meta.url));\n\nexport const THEME_EXTRA_DEFAULTS: Readonly<Record<string, string>> = Object.freeze({\n\tassistantPrefix: \"•\",\n\tassistantPrefixColor: \"\",\n\tuserPrefix: \"❯\",\n\tuserPrefixColor: \"accent\",\n\tdividerChar: \"─\",\n\tdividerColor: \"\",\n\tshowDivider: \"true\",\n\tquoteStyle: \"false\",\n\tquoteChar: \"┆\",\n\tquoteColor: \"\",\n\tinputBorderColor: \"\",\n\tbashPromptColor: \"\",\n\ttagBgColor: \"\",\n\tparensTextColor: \"\",\n\tparensBracketColor: \"\",\n\tslashSelectedColor: \"\",\n\tslashCommandColor: \"\",\n\tslashDescriptionColor: \"\",\n\tslashHintColor: \"\",\n\tuserBoxBorderColor: \"\",\n\tgitInsertionColor: \"#2ea043\",\n\tgitDeletionColor: \"#f85149\",\n});\n\nlet cachedExtras: Record<string, string | boolean> | null = null;\nlet cachedVars: Record<string, string> | null = null;\nlet cachedColors: Record<string, string> | null = null;\nlet cachedThemeExport: Record<string, string> | null = null;\nlet cachedThemeName: string | null = null;\n\ntype ThemeDiscovery = {\n\textras: Record<string, string | boolean> | null;\n\tvars: Record<string, string> | null;\n\tcolors: Record<string, string> | null;\n\tthemeExport: Record<string, string> | null;\n};\n\nfunction themeDiscoveryFromContent(content: unknown): ThemeDiscovery | null {\n\tif (!content || typeof content !== \"object\") return null;\n\tconst record = content as Record<string, unknown>;\n\tconst extras =\n\t\trecord.extras && typeof record.extras === \"object\" ? (record.extras as Record<string, string | boolean>) : null;\n\tconst vars = record.vars && typeof record.vars === \"object\" ? (record.vars as Record<string, string>) : null;\n\tconst colors = record.colors && typeof record.colors === \"object\" ? (record.colors as Record<string, string>) : null;\n\tconst themeExport =\n\t\trecord.export && typeof record.export === \"object\" ? (record.export as Record<string, string>) : null;\n\treturn extras || vars || colors || themeExport ? { extras, vars, colors, themeExport } : null;\n}\n\nfunction readThemeDiscoveryFromPath(filePath: string): ThemeDiscovery | null {\n\ttry {\n\t\tif (!filePath || !existsSync(filePath)) return null;\n\t\tconst content = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown;\n\t\treturn themeDiscoveryFromContent(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction resolveThemeSourcePath(theme: unknown): string {\n\tif (!theme || typeof theme !== \"object\") return \"\";\n\tconst record = theme as Record<string, unknown>;\n\tif (typeof record.sourcePath === \"string\") return record.sourcePath;\n\tconst definition =\n\t\trecord.definition && typeof record.definition === \"object\"\n\t\t\t? (record.definition as Record<string, unknown>)\n\t\t\t: undefined;\n\treturn typeof definition?.sourcePath === \"string\" ? definition.sourcePath : \"\";\n}\n\nfunction addThemeDir(searchDirs: Set<string>, dir: string): void {\n\tif (existsSync(dir)) searchDirs.add(dir);\n}\n\nfunction addBundledThemeDirs(searchDirs: Set<string>): void {\n\tfor (const root of [extensionDir, process.cwd()]) {\n\t\tfor (const scope of [\"@earendil-works\", \"@mariozechner\"]) {\n\t\t\taddThemeDir(\n\t\t\t\tsearchDirs,\n\t\t\t\tresolve(root, \"node_modules\", scope, \"pi-coding-agent\", \"dist\", \"modes\", \"interactive\", \"theme\"),\n\t\t\t);\n\t\t\taddThemeDir(searchDirs, resolve(root, \"node_modules\", scope, \"pi-coding-agent\", \"dist\", \"theme\"));\n\t\t}\n\t}\n}\n\nfunction collectThemeDirs(root: string, searchDirs: Set<string>, maxDepth = 4): void {\n\tif (maxDepth < 0 || !existsSync(root)) return;\n\ttry {\n\t\tfor (const entry of readdirSync(root, { withFileTypes: true })) {\n\t\t\tif (!entry.isDirectory() || entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\t\tconst dir = join(root, entry.name);\n\t\t\tif (entry.name === \"themes\") {\n\t\t\t\tsearchDirs.add(dir);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcollectThemeDirs(dir, searchDirs, maxDepth - 1);\n\t\t}\n\t} catch {\n\t\t// best effort discovery only\n\t}\n}\n\nfunction readSettingsPackagePaths(settingsPath: string): string[] {\n\tif (!existsSync(settingsPath)) return [];\n\ttry {\n\t\tconst settings = JSON.parse(readFileSync(settingsPath, \"utf-8\")) as Record<string, unknown>;\n\t\tconst entries = [\n\t\t\t...(Array.isArray(settings.packages) ? settings.packages : []),\n\t\t\t...(Array.isArray(settings.extensions) ? settings.extensions : []),\n\t\t];\n\t\treturn entries\n\t\t\t.map((entry) =>\n\t\t\t\ttypeof entry === \"string\"\n\t\t\t\t\t? entry\n\t\t\t\t\t: entry && typeof entry === \"object\"\n\t\t\t\t\t\t? String((entry as Record<string, unknown>).source ?? \"\")\n\t\t\t\t\t\t: \"\",\n\t\t\t)\n\t\t\t.filter((entry) => entry && !entry.startsWith(\"npm:\") && !entry.startsWith(\"git:\"));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/** Scan known theme directories for a JSON file whose \"name\" matches themeName. */\nfunction discoverThemeExtras(themeName: string): ThemeDiscovery | null {\n\tconst searchDirs = new Set<string>();\n\n\taddThemeDir(searchDirs, join(homedir(), \".pi\", \"agent\", \"themes\"));\n\taddThemeDir(searchDirs, resolve(process.cwd(), \".pi\", \"themes\"));\n\taddBundledThemeDirs(searchDirs);\n\tcollectThemeDirs(join(homedir(), \".pi\", \"agent\", \"git\"), searchDirs);\n\tcollectThemeDirs(resolve(process.cwd(), \".pi\", \"git\"), searchDirs);\n\n\tconst localPackagePaths = [\n\t\t...readSettingsPackagePaths(join(homedir(), \".pi\", \"agent\", \"settings.json\")),\n\t\t...readSettingsPackagePaths(resolve(process.cwd(), \".pi\", \"settings.json\")),\n\t];\n\tfor (const packagePath of localPackagePaths) {\n\t\taddThemeDir(searchDirs, resolve(process.cwd(), packagePath, \"themes\"));\n\t}\n\n\tfor (const dir of searchDirs) {\n\t\ttry {\n\t\t\tfor (const file of readdirSync(dir)) {\n\t\t\t\tif (!file.endsWith(\".json\")) continue;\n\t\t\t\tconst filePath = join(dir, file);\n\t\t\t\ttry {\n\t\t\t\t\tconst content = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n\t\t\t\t\tif (content?.name === themeName) {\n\t\t\t\t\t\tconst result = themeDiscoveryFromContent(content);\n\t\t\t\t\t\tif (result) return result;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// skip unparsable theme files\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// skip unreadable directories\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction resolveThemeName(theme: unknown): string | null {\n\tif (!theme || typeof theme !== \"object\") return null;\n\tconst record = theme as Record<string, unknown>;\n\tconst definition =\n\t\trecord.definition && typeof record.definition === \"object\"\n\t\t\t? (record.definition as Record<string, unknown>)\n\t\t\t: undefined;\n\tif (typeof definition?.name === \"string\") return definition.name;\n\tif (typeof record.name === \"string\") return record.name;\n\ttry {\n\t\tconst settingsPath = join(homedir(), \".pi\", \"agent\", \"settings.json\");\n\t\tif (existsSync(settingsPath)) {\n\t\t\tconst settings = JSON.parse(readFileSync(settingsPath, \"utf-8\")) as Record<string, unknown>;\n\t\t\tif (typeof settings.theme === \"string\") return settings.theme;\n\t\t}\n\t} catch {\n\t\t// fall through\n\t}\n\treturn null;\n}\n\nfunction readThemeToken(name: string): string {\n\tconst varValue = cachedVars && typeof cachedVars[name] === \"string\" ? cachedVars[name] : \"\";\n\tif (varValue) return varValue;\n\treturn cachedColors && typeof cachedColors[name] === \"string\" ? cachedColors[name] : \"\";\n}\n\nfunction resolveThemeColorToken(value: string): string {\n\tlet resolved = value;\n\tconst seen = new Set<string>();\n\tfor (let depth = 0; depth < 8; depth++) {\n\t\tif (!resolved) return \"\";\n\t\tif (isHexColor(resolved)) return resolved;\n\t\tif (seen.has(resolved)) return \"\";\n\t\tseen.add(resolved);\n\n\t\tconst next = readThemeToken(resolved);\n\t\tif (!next) return \"\";\n\t\tresolved = next;\n\t}\n\treturn \"\";\n}\n\nfunction resolveThemeExtraValue(key: string, value: string): string {\n\tif (!key.endsWith(\"Color\")) return value;\n\treturn resolveThemeColorToken(value) || value;\n}\n\nfunction resolveThemeExportColor(key: string): string {\n\tif (!cachedThemeExport) return \"\";\n\tconst value = cachedThemeExport[key];\n\tif (typeof value !== \"string\" || !value) return \"\";\n\tconst resolved = cachedVars && typeof cachedVars[value] === \"string\" ? cachedVars[value] : value;\n\treturn isHexColor(resolved) ? resolved : \"\";\n}\n\n/** Populate the extras cache from a theme (session start / theme change only). */\nexport function setFullTheme(theme: unknown, force = false): void {\n\tconst themeName = resolveThemeName(theme);\n\tconst sourcePath = resolveThemeSourcePath(theme);\n\tif (!themeName && !sourcePath) return;\n\n\tconst cacheKey = sourcePath || themeName;\n\tif (\n\t\t!force &&\n\t\tcacheKey === cachedThemeName &&\n\t\t(cachedExtras !== null || cachedVars !== null || cachedColors !== null || cachedThemeExport !== null)\n\t)\n\t\treturn;\n\n\tcachedThemeName = cacheKey;\n\tconst result = readThemeDiscoveryFromPath(sourcePath) ?? (themeName ? discoverThemeExtras(themeName) : null);\n\tcachedExtras = result?.extras ?? null;\n\tcachedVars = result?.vars ?? null;\n\tcachedColors = result?.colors ?? null;\n\tcachedThemeExport = result?.themeExport ?? null;\n}\n\nexport function resetThemeExtrasCache(): void {\n\tcachedExtras = null;\n\tcachedVars = null;\n\tcachedColors = null;\n\tcachedThemeExport = null;\n\tcachedThemeName = null;\n}\n\n/** Resolve a theme-extra key from the cache; \"\" when unavailable (graceful fallback). */\nexport function getThemeExtra(_theme: unknown, key: string): string {\n\tconst extraValue = cachedExtras?.[key];\n\tif (typeof extraValue === \"string\" || typeof extraValue === \"boolean\") {\n\t\treturn resolveThemeExtraValue(key, String(extraValue));\n\t}\n\treturn resolveThemeExtraValue(key, THEME_EXTRA_DEFAULTS[key] ?? \"\");\n}\n\nexport function getThemePageBackground(_theme: unknown): string {\n\tconst directBg = cachedVars && typeof cachedVars.bg === \"string\" ? cachedVars.bg : \"\";\n\tif (isHexColor(directBg)) return directBg;\n\treturn resolveThemeExportColor(\"pageBg\");\n}\n\nexport function getThemeVarBackground(_theme: unknown, varName: string): string {\n\tconst value = cachedVars && typeof cachedVars[varName] === \"string\" ? cachedVars[varName] : \"\";\n\tconst resolved = cachedVars && value && typeof cachedVars[value] === \"string\" ? cachedVars[value] : value;\n\treturn isHexColor(resolved) ? resolved : \"\";\n}\n","// Boxed tool-call/result rendering primitives.\n//\n// Two deliberate design points:\n//\n// 1. Background painting is removed. Boxed lines are foreground-only; the\n// enclosing native ToolExecutionComponent container applies the semantic\n// status background (toolPendingBg / toolErrorBg / toolSuccessBg), and the\n// message-block Box applies customMessageBg. This avoids double-background\n// conflicts and keeps pi-style's patches renderer-scoped.\n//\n// 2. Theme functions are accessed through a minimal structural interface\n// (BoxTheme) instead of `any`.\n\nimport { homedir } from \"node:os\";\nimport { relative, resolve } from \"node:path\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport { fgHex, isHexColor, stripAnsi } from \"./ansi.js\";\nimport { formatToolMetrics, getElapsedMs, type MetricResultLike } from \"./elapsed.js\";\nimport {\n\tboxedResultRenderBudget,\n\tclampRenderLine,\n\tDEFAULT_COLLAPSED_RENDER_LINES,\n\tfastBoxLineContent,\n\tsafeTruncateToWidth,\n\tsafeVisibleWidth,\n\tsafeWrapTextWithAnsi,\n} from \"./render-budget.js\";\nimport { getThemeExtra } from \"./theme-extras.js\";\n\n/** Minimal structural view of Pi's Theme as used by the boxed renderers. */\nexport interface BoxTheme {\n\tfg(color: string, text: string): string;\n\tbold?(text: string): string;\n\titalic?(text: string): string;\n\tinverse?(text: string): string;\n\tgetColorMode?(): string;\n}\n\nexport interface BoxedRenderOptions {\n\twidthKey?: string;\n\tisError?: boolean;\n\tisPartial?: boolean;\n\tisPending?: boolean;\n\tpendingText?: string;\n\tstate?: Record<string, unknown>;\n\t/** Wall-clock elapsed override (used when metrics are not in result.details). */\n\telapsedMs?: number;\n}\n\nexport function isExpanded(options: { expanded?: boolean } | undefined): boolean {\n\treturn typeof options?.expanded === \"boolean\" ? options.expanded : false;\n}\n\nexport function shortenPath(path: string): string {\n\tconst home = homedir();\n\tif (path.startsWith(home)) return `~${path.slice(home.length)}`;\n\treturn path;\n}\n\nexport function resolveAbsolutePath(rawPath: string, cwd: string): string {\n\tconst path = rawPath.trim();\n\tif (!path) return \"\";\n\n\tconst home = process.env.HOME;\n\tif (home && (path === \"~\" || path.startsWith(\"~/\"))) {\n\t\treturn path === \"~\" ? home : resolve(home, path.slice(2));\n\t}\n\n\treturn resolve(cwd, path);\n}\n\nexport function resolveRelativePath(rawPath: string, cwd: string): string {\n\tconst absPath = resolveAbsolutePath(rawPath, cwd);\n\tif (!absPath) return \"(unknown)\";\n\tconst relPath = relative(cwd, absPath).replace(/\\\\/g, \"/\");\n\treturn relPath || \".\";\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function getTextOutput(result: MetricResultLike | undefined): string {\n\tif (!result?.content) return \"\";\n\tconst textBlocks = result.content.filter((contentBlock) => {\n\t\tif (!contentBlock || typeof contentBlock !== \"object\") return false;\n\t\treturn (contentBlock as { type?: unknown }).type === \"text\";\n\t});\n\treturn textBlocks\n\t\t.map((contentBlock) => String((contentBlock as { text?: unknown }).text ?? \"\"))\n\t\t.join(\"\\n\")\n\t\t.replace(/\\r/g, \"\");\n}\n\nexport function stripTrailingNotice(text: string): string {\n\tconst normalized = (text ?? \"\").replace(/\\r/g, \"\").trimEnd();\n\tif (!normalized) return \"\";\n\tif (normalized.startsWith(\"[\") && normalized.endsWith(\"]\")) return \"\";\n\tconst noticeStart = normalized.lastIndexOf(\"\\n\\n[\");\n\tif (noticeStart >= 0 && normalized.endsWith(\"]\")) {\n\t\treturn normalized.slice(0, noticeStart).trimEnd();\n\t}\n\treturn normalized;\n}\n\nexport function extractTrailingNotice(text: string): string | null {\n\tconst normalized = (text ?? \"\").replace(/\\r/g, \"\").trimEnd();\n\tif (!normalized) return null;\n\tif (normalized.startsWith(\"[\") && normalized.endsWith(\"]\")) return normalized;\n\tconst noticeStart = normalized.lastIndexOf(\"\\n\\n[\");\n\tif (noticeStart >= 0 && normalized.endsWith(\"]\")) {\n\t\treturn normalized.slice(noticeStart + 2).trimEnd();\n\t}\n\treturn null;\n}\n\nexport function countLines(text: string): number {\n\tconst normalized = (text ?? \"\").replace(/\\r/g, \"\").replace(/\\n+$/g, \"\");\n\tif (!normalized) return 0;\n\treturn normalized.split(\"\\n\").length;\n}\n\nexport function countWords(text: string): number {\n\tlet count = 0;\n\tlet inWord = false;\n\tfor (const char of text) {\n\t\tconst isWord = /[\\p{L}\\p{N}_'-]/u.test(char);\n\t\tif (isWord && !inWord) count++;\n\t\tinWord = isWord;\n\t}\n\treturn count;\n}\n\nfunction formatCompactCount(value: number): string {\n\tif (value < 1000) return `${Math.round(value)}`;\n\tif (value < 10000) return `${(value / 1000).toFixed(1)}k`;\n\tif (value < 1000000) return `${Math.round(value / 1000)}k`;\n\tif (value < 10000000) return `${(value / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(value / 1000000)}M`;\n}\n\nexport function formatBoxedWords(text: string): string {\n\treturn `✎ ~${formatCompactCount(countWords(text))} words`;\n}\n\nexport function badge(theme: BoxTheme, label: string): string {\n\tconst tagBg = getThemeExtra(theme, \"tagBgColor\");\n\tif (tagBg && isHexColor(tagBg)) {\n\t\treturn theme.inverse\n\t\t\t? theme.inverse(fgHex(theme, tagBg, theme.bold ? theme.bold(` ${label} `) : ` ${label} `))\n\t\t\t: fgHex(theme, tagBg, theme.bold ? theme.bold(` ${label} `) : ` ${label} `);\n\t}\n\treturn theme.inverse ? theme.inverse(theme.bold ? theme.bold(` ${label} `) : ` ${label} `) : ` ${label} `;\n}\n\nexport function parens(theme: BoxTheme, text: string, skipTextColor?: boolean): string {\n\tconst bracketColor = getThemeExtra(theme, \"parensBracketColor\");\n\tconst openParen = bracketColor && isHexColor(bracketColor) ? fgHex(theme, bracketColor, \"(\") : \"(\";\n\tconst closeParen = bracketColor && isHexColor(bracketColor) ? fgHex(theme, bracketColor, \")\") : \")\";\n\tlet innerBase: string;\n\tif (skipTextColor) {\n\t\tinnerBase = text;\n\t} else {\n\t\tconst textColor = getThemeExtra(theme, \"parensTextColor\");\n\t\tinnerBase = textColor && isHexColor(textColor) ? fgHex(theme, textColor, text) : text;\n\t}\n\tconst inner = typeof theme?.bold === \"function\" ? theme.bold(innerBase) : `\\x1b[1m${innerBase}\\x1b[22m`;\n\treturn `${openParen}${inner}${closeParen}`;\n}\n\nconst BOX_HORIZONTAL = \"─\";\nconst BOX_VERTICAL = \"│\";\nconst BOX_SIDE_PADDING = 2;\nconst BOX_MIN_WIDTH = 12;\nconst BOX_WIDTH_CACHE = new Map<string, number>();\nconst COMPACT_TOOL_NAME_WIDTH = safeVisibleWidth(\"Search\");\nconst COMPACT_FOOTER_ELAPSED_WIDTH = 8;\nconst COMPACT_FOOTER_EXTRA_WIDTH = 8;\nconst COMPACT_FOOTER_WORDS_WIDTH = safeVisibleWidth(\"✎ ~1.2k words\");\n\nexport function boxWidth(width: number): number {\n\treturn Math.max(BOX_MIN_WIDTH, width);\n}\n\nexport function boxInnerWidth(width: number): number {\n\treturn Math.max(1, boxWidth(width) - 2 - BOX_SIDE_PADDING * 2);\n}\n\nfunction _tightBoxWidth(\n\tavailableWidth: number,\n\tcontentLines: string[],\n\tlabelWidths: number[] = [],\n\twidthKey?: string,\n): number {\n\tconst contentWidth = contentLines.reduce((max, line) => Math.max(max, safeVisibleWidth(line)), 0);\n\tconst labelWidth = labelWidths.reduce((max, width) => Math.max(max, width), 0);\n\tconst neededWidth = Math.max(\n\t\tBOX_MIN_WIDTH,\n\t\tcontentWidth + 2 + BOX_SIDE_PADDING * 2,\n\t\tlabelWidth + 2 + BOX_SIDE_PADDING * 2,\n\t);\n\tconst measuredWidth = Math.min(boxWidth(availableWidth), neededWidth);\n\tif (!widthKey) return measuredWidth;\n\tconst cachedWidth = BOX_WIDTH_CACHE.get(widthKey) ?? 0;\n\tconst nextWidth = Math.min(boxWidth(availableWidth), Math.max(cachedWidth, measuredWidth));\n\tBOX_WIDTH_CACHE.set(widthKey, nextWidth);\n\treturn nextWidth;\n}\n\nexport function boxedToolWidthKey(toolName: string, detail: string): string {\n\treturn `${toolName}:${detail}`;\n}\n\nexport function formatToolName(toolName: string): string {\n\tconst spaced = toolName\n\t\t.replace(/[_-]+/g, \" \")\n\t\t.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n\t\t.trim();\n\treturn spaced.replace(/\\b\\w/g, (char) => char.toUpperCase()) || toolName;\n}\n\nfunction formatToolParamName(name: string): string {\n\tconst spaced = name\n\t\t.replace(/[_-]+/g, \" \")\n\t\t.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n\t\t.trim();\n\treturn spaced ? spaced[0]?.toUpperCase() + spaced.slice(1) : name;\n}\n\nconst MAX_PARAM_VALUE_LENGTH = 120;\n\nfunction formatOperationSummary(value: unknown): string | undefined {\n\tif (!Array.isArray(value) || value.length === 0) return undefined;\n\tif (!value.every((item) => item && typeof item === \"object\" && !Array.isArray(item))) return undefined;\n\tconst types = Array.from(new Set(value.map((item) => String((item as { type?: unknown }).type ?? \"operation\"))));\n\tconst typeSummary =\n\t\ttypes.length === 1\n\t\t\t? ` (${types[0]})`\n\t\t\t: types.length > 1\n\t\t\t\t? ` (${types.slice(0, 3).join(\", \")}${types.length > 3 ? \", …\" : \"\"})`\n\t\t\t\t: \"\";\n\treturn `${value.length} ${value.length === 1 ? \"operation\" : \"operations\"}${typeSummary}`;\n}\n\nfunction formatToolParamValue(value: unknown): string {\n\tif (value === undefined) return \"\";\n\tif (value === null) return \"null\";\n\tif (typeof value === \"string\") {\n\t\tif (value.length <= MAX_PARAM_VALUE_LENGTH) return value;\n\t\treturn `${value.slice(0, MAX_PARAM_VALUE_LENGTH)}…`;\n\t}\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value);\n\tif (Array.isArray(value)) {\n\t\tif (value.length === 0) return \"[]\";\n\t\treturn formatOperationSummary(value) ?? `${value.length} ${value.length === 1 ? \"item\" : \"items\"}`;\n\t}\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst keys = Object.keys(value);\n\t\tif (keys.length === 0) return \"{}\";\n\t\treturn `{${keys.length} ${keys.length === 1 ? \"key\" : \"keys\"}}`;\n\t}\n\ttry {\n\t\tconst json = JSON.stringify(value);\n\t\tif (json.length <= MAX_PARAM_VALUE_LENGTH) return json;\n\t\treturn `${json.slice(0, MAX_PARAM_VALUE_LENGTH)}…`;\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nexport function formatToolParamLines(args: unknown, theme?: BoxTheme): string[] {\n\tif (args === undefined || args === null) return [];\n\tif (typeof args !== \"object\" || Array.isArray(args)) {\n\t\tconst value = formatToolParamValue(args);\n\t\treturn value ? [`Params: ${value}`] : [];\n\t}\n\n\tconst entries = Object.entries(args as Record<string, unknown>).filter(([, value]) => value !== undefined);\n\tif (entries.length === 0) return [];\n\n\tconst lines: string[] = [];\n\tfor (const [key, value] of entries) {\n\t\tconst formattedValue = formatToolParamValue(value);\n\t\tif (!formattedValue) continue;\n\t\tconst [firstLine = \"\", ...restLines] = formattedValue.replace(/\\r/g, \"\").split(\"\\n\");\n\t\tconst keyLabel = formatToolParamName(key);\n\t\tif (theme) {\n\t\t\tlines.push(`${theme.fg(\"dim\", `${keyLabel}:`)} ${theme.fg(\"text\", firstLine)}`);\n\t\t\tlines.push(...restLines.map((line) => ` ${theme.fg(\"text\", line)}`));\n\t\t} else {\n\t\t\tlines.push(`${keyLabel}: ${firstLine}`);\n\t\t\tlines.push(...restLines.map((line) => ` ${line}`));\n\t\t}\n\t}\n\treturn lines;\n}\n\nconst RESET_INTENSITY = \"\\x1b[22m\";\n\nfunction colorFromExtra(theme: BoxTheme, extraKey: string, fallbackColor: string, text: string): string {\n\tconst color = getThemeExtra(theme, extraKey);\n\tif (color) {\n\t\tif (isHexColor(color)) return fgHex(theme, color, text);\n\t\ttry {\n\t\t\treturn theme.fg(color, text);\n\t\t} catch {\n\t\t\t// Fall back to semantic theme color below.\n\t\t}\n\t}\n\treturn theme.fg(fallbackColor, text);\n}\n\nfunction formatBoxedStatusIcon(theme: BoxTheme, isError?: boolean): string {\n\tconst icon = isError ? \"✗\" : \"✓\";\n\treturn theme.fg(isError ? \"error\" : \"success\", icon);\n}\n\nexport function formatBoxedToolTitle(theme: BoxTheme, name: string, isError?: boolean): string {\n\tconst rawTitle = `➔ ${name}`;\n\tconst coloredTitle = `${colorFromExtra(theme, \"bashPromptColor\", \"bashMode\", rawTitle)} ${formatBoxedStatusIcon(theme, isError)}`;\n\tconst title = typeof theme?.bold === \"function\" ? theme.bold(coloredTitle) : coloredTitle;\n\treturn `${title} ${boxText(theme, \"|\")}`;\n}\n\nfunction formatCompactBoxedToolTitle(theme: BoxTheme, name: string, isError?: boolean): string {\n\tconst paddedName = padVisibleRight(name, COMPACT_TOOL_NAME_WIDTH);\n\tconst rawTitle = `➔ ${paddedName}`;\n\tconst coloredTitle = `${colorFromExtra(theme, \"bashPromptColor\", \"bashMode\", rawTitle)} ${formatBoxedStatusIcon(theme, isError)}`;\n\tconst title = typeof theme?.bold === \"function\" ? theme.bold(coloredTitle) : coloredTitle;\n\treturn `${title} ${boxText(theme, \"|\")}`;\n}\n\nfunction boxText(theme: BoxTheme, text: string): string {\n\treturn `${RESET_INTENSITY}${theme.fg(\"borderMuted\", text)}`;\n}\nfunction boxFrameText(theme: BoxTheme, text: string): string {\n\treturn `${RESET_INTENSITY}${theme.fg(\"border\", text)}`;\n}\n\nexport function boxedToolBgName(isError?: boolean, isPartial?: boolean): string {\n\treturn isPartial ? \"toolPendingBg\" : isError ? \"toolErrorBg\" : \"toolSuccessBg\";\n}\n\nexport function boxBorder(theme: BoxTheme, left: string, right: string, width: number): string {\n\tconst renderedWidth = boxWidth(width);\n\tconst innerWidth = renderedWidth - 2;\n\treturn boxFrameText(theme, `${left}${BOX_HORIZONTAL.repeat(innerWidth)}${right}`);\n}\n\nfunction padVisibleRight(text: string, width: number): string {\n\treturn `${text}${\" \".repeat(Math.max(0, width - safeVisibleWidth(text)))}`;\n}\n\nexport function boxLineWithRight(theme: BoxTheme, left: string, right: string, width: number): string {\n\tconst renderedWidth = boxWidth(width);\n\tconst contentWidth = boxInnerWidth(renderedWidth);\n\tconst divider = ` ${boxText(theme, \"|\")} `;\n\tconst dividerWidth = safeVisibleWidth(divider);\n\tconst rightWidth = safeVisibleWidth(right);\n\tconst sidePad = \" \".repeat(BOX_SIDE_PADDING);\n\n\tif (!right || rightWidth + dividerWidth >= contentWidth) {\n\t\treturn boxLine(theme, right || left, renderedWidth);\n\t}\n\n\tconst maxLeftWidth = Math.max(1, contentWidth - dividerWidth - rightWidth - 1);\n\tconst truncatedLeft = safeTruncateToWidth(left, maxLeftWidth, \"…\");\n\tconst gap = \" \".repeat(Math.max(1, contentWidth - safeVisibleWidth(truncatedLeft) - dividerWidth - rightWidth));\n\treturn `${boxFrameText(theme, BOX_VERTICAL)}${sidePad}${truncatedLeft}${gap}${divider}${right}${sidePad}${boxFrameText(theme, BOX_VERTICAL)}`;\n}\n\nexport function boxLine(theme: BoxTheme, content: string, width: number): string {\n\tconst renderedWidth = boxWidth(width);\n\tconst contentWidth = boxInnerWidth(renderedWidth);\n\tconst fastContent = fastBoxLineContent(content, contentWidth);\n\tconst sidePad = \" \".repeat(BOX_SIDE_PADDING);\n\tif (fastContent) {\n\t\tconst fill = \" \".repeat(Math.max(0, contentWidth - fastContent.visibleWidth));\n\t\treturn `${boxFrameText(theme, BOX_VERTICAL)}${sidePad}${fastContent.text}${fill}${sidePad}${boxFrameText(theme, BOX_VERTICAL)}`;\n\t}\n\n\tconst truncated = safeTruncateToWidth(content, contentWidth, \"…\");\n\tconst fill = \" \".repeat(Math.max(0, contentWidth - safeVisibleWidth(truncated)));\n\treturn `${boxFrameText(theme, BOX_VERTICAL)}${sidePad}${truncated}${fill}${sidePad}${boxFrameText(theme, BOX_VERTICAL)}`;\n}\n\nexport function boxInsetDivider(theme: BoxTheme, width: number): string {\n\tconst renderedWidth = boxWidth(width);\n\tconst lineWidth = boxInnerWidth(renderedWidth);\n\tconst sidePad = \" \".repeat(BOX_SIDE_PADDING);\n\treturn `${boxFrameText(theme, BOX_VERTICAL)}${sidePad}${boxText(theme, BOX_HORIZONTAL.repeat(lineWidth))}${sidePad}${boxFrameText(theme, BOX_VERTICAL)}`;\n}\n\nexport function boxedWrappedLines(theme: BoxTheme, content: string, width: number): string[] {\n\treturn safeWrapTextWithAnsi(content, boxInnerWidth(width)).map((line) => boxLine(theme, line, width));\n}\n\nfunction boxedTruncatedLine(theme: BoxTheme, content: string, width: number): string {\n\treturn boxLine(theme, safeTruncateToWidth(content, boxInnerWidth(width), \"…\"), width);\n}\n\ntype RenderLinesCache = {\n\twidth: number;\n\tlines: string[];\n};\n\nfunction pushBoundedLines(target: string[], lines: string[], maxLines: number): boolean {\n\tconst slots = maxLines - target.length;\n\tif (slots <= 0) return false;\n\tif (lines.length > slots) {\n\t\ttarget.push(...lines.slice(0, slots));\n\t\treturn false;\n\t}\n\ttarget.push(...lines);\n\treturn true;\n}\n\nfunction renderBoxedOutputLines(\n\ttheme: BoxTheme,\n\toutputLines: string[],\n\twidth: number,\n\trawLineBudget = DEFAULT_COLLAPSED_RENDER_LINES,\n): string[] {\n\tconst budget = boxedResultRenderBudget(rawLineBudget);\n\tconst headLimit = Math.max(0, Math.min(budget.headLines, budget.maxRenderedLines));\n\tconst tailLimit = Math.max(0, Math.min(budget.tailLines, Math.max(0, budget.maxRenderedLines - headLimit - 1)));\n\tconst head: string[] = [];\n\tlet nextInputIndex = 0;\n\tlet truncated = false;\n\n\tfor (; nextInputIndex < outputLines.length; nextInputIndex++) {\n\t\tconst line = boxedTruncatedLine(theme, outputLines[nextInputIndex] ?? \"\", width);\n\t\tif (!pushBoundedLines(head, [line], headLimit)) {\n\t\t\ttruncated = true;\n\t\t\tnextInputIndex++;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!truncated && nextInputIndex >= outputLines.length) return head;\n\n\tconst tail: string[] = [];\n\tconst tailStart = Math.max(nextInputIndex, outputLines.length - tailLimit);\n\tfor (let i = tailStart; i < outputLines.length; i++) {\n\t\tconst line = boxedTruncatedLine(theme, outputLines[i] ?? \"\", width);\n\t\ttail.push(line);\n\t\tif (tail.length > tailLimit) tail.splice(0, tail.length - tailLimit);\n\t}\n\n\tconst skippedInputLines = Math.max(0, tailStart - nextInputIndex);\n\tconst skippedText =\n\t\tskippedInputLines > 0\n\t\t\t? `… rendered output truncated; ${skippedInputLines} input lines skipped before tail`\n\t\t\t: \"… rendered output truncated\";\n\treturn [...head, boxLine(theme, theme.fg(\"muted\", skippedText), width), ...tail];\n}\n\nexport function renderBoxedToolCall(\n\ttheme: BoxTheme,\n\ttoolName: string,\n\tdetailLines: string[],\n\toptions: BoxedRenderOptions = {},\n): Component {\n\tlet cache: RenderLinesCache | null = null;\n\treturn {\n\t\tinvalidate() {\n\t\t\tcache = null;\n\t\t},\n\t\trender(width: number): string[] {\n\t\t\tif (cache?.width === width) return cache.lines;\n\t\t\tconst title = formatBoxedToolTitle(theme, toolName, options.isError);\n\t\t\tconst renderedWidth = boxWidth(width);\n\t\t\tconst lines = [\n\t\t\t\tboxBorder(theme, \"┌\", \"┐\", renderedWidth),\n\t\t\t\tboxLine(theme, title, renderedWidth),\n\t\t\t\tboxInsetDivider(theme, renderedWidth),\n\t\t\t\t...detailLines.flatMap((line) => boxedWrappedLines(theme, line, renderedWidth)),\n\t\t\t];\n\t\t\tif (options.isPending) {\n\t\t\t\tconst pendingText = options.pendingText ?? \"Waiting for output…\";\n\t\t\t\tlines.push(\n\t\t\t\t\tboxInsetDivider(theme, renderedWidth),\n\t\t\t\t\t...boxedWrappedLines(theme, `${theme.fg(\"muted\", \"…\")} ${theme.fg(\"dim\", pendingText)}`, renderedWidth),\n\t\t\t\t\tboxBorder(theme, \"└\", \"┘\", renderedWidth),\n\t\t\t\t);\n\t\t\t}\n\t\t\tcache = { width, lines };\n\t\t\treturn lines;\n\t\t},\n\t};\n}\n\nconst COMPACT_FOOTER_KEY = \"__piStyleCompactFooter\";\nconst COMPACT_FOOTER_ERROR_KEY = \"__piStyleCompactFooterError\";\nconst COMPACT_FOOTER_PARTIAL_KEY = \"__piStyleCompactFooterPartial\";\n\nexport function clearCompactBoxedFooter(state: Record<string, unknown> | undefined): void {\n\tif (!state || typeof state !== \"object\") return;\n\tdelete state[COMPACT_FOOTER_KEY];\n\tdelete state[COMPACT_FOOTER_ERROR_KEY];\n\tdelete state[COMPACT_FOOTER_PARTIAL_KEY];\n}\n\nexport function renderCompactBoxedToolCall(\n\ttheme: BoxTheme,\n\ttoolName: string,\n\tdetailLine: string,\n\toptions: BoxedRenderOptions = {},\n): Component {\n\treturn {\n\t\tinvalidate() {},\n\t\trender(width: number): string[] {\n\t\t\tconst renderedWidth = boxWidth(width);\n\t\t\tconst title = `${formatCompactBoxedToolTitle(theme, toolName, options.isError)} ${detailLine}`;\n\t\t\tconst compactFooter =\n\t\t\t\ttypeof options.state?.[COMPACT_FOOTER_KEY] === \"string\" ? options.state[COMPACT_FOOTER_KEY] : \"\";\n\t\t\tconst _footerIsError = Boolean(options.state?.[COMPACT_FOOTER_ERROR_KEY]);\n\t\t\tconst _footerIsPartial = Boolean(options.state?.[COMPACT_FOOTER_PARTIAL_KEY]);\n\t\t\tif (compactFooter) {\n\t\t\t\treturn [\n\t\t\t\t\tboxBorder(theme, \"┌\", \"┐\", renderedWidth),\n\t\t\t\t\tboxLineWithRight(theme, title, compactFooter, renderedWidth),\n\t\t\t\t\tboxBorder(theme, \"└\", \"┘\", renderedWidth),\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst lines = [boxBorder(theme, \"┌\", \"┐\", renderedWidth), boxLine(theme, title, renderedWidth)];\n\t\t\tif (options.isPending) {\n\t\t\t\tconst pendingText = options.pendingText ?? \"Waiting for output…\";\n\t\t\t\tlines.push(\n\t\t\t\t\tboxInsetDivider(theme, renderedWidth),\n\t\t\t\t\t...boxedWrappedLines(theme, `${theme.fg(\"muted\", \"…\")} ${theme.fg(\"dim\", pendingText)}`, renderedWidth),\n\t\t\t\t\tboxBorder(theme, \"└\", \"┘\", renderedWidth),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn lines;\n\t\t},\n\t};\n}\n\ntype BoxedResultBody = Component | ((contentWidth: number) => string[]);\n\nexport function renderBoxedToolResult(\n\ttheme: BoxTheme,\n\tbody: BoxedResultBody,\n\toptions: {\n\t\toutputLabel?: string;\n\t\tfooterLines?: string[];\n\t\temptyText?: string;\n\t\twidthKey?: string;\n\t\treferenceLines?: string[];\n\t\trenderLineBudget?: number;\n\t\tisError?: boolean;\n\t\tisPartial?: boolean;\n\t} = {},\n): Component {\n\tlet cache: RenderLinesCache | null = null;\n\treturn {\n\t\tinvalidate() {\n\t\t\tcache = null;\n\t\t\tif (typeof body !== \"function\") body.invalidate();\n\t\t},\n\t\trender(width: number): string[] {\n\t\t\tif (cache?.width === width) return cache.lines;\n\t\t\tconst renderedWidth = boxWidth(width);\n\t\t\tconst maxContentWidth = boxInnerWidth(renderedWidth);\n\t\t\tconst bodyLines = typeof body === \"function\" ? body(maxContentWidth) : body.render(maxContentWidth);\n\t\t\tconst errorPrefix = options.isError ? [theme.fg(\"error\", \"✗ Error\")] : [];\n\t\t\tconst outputLines =\n\t\t\t\tbodyLines.length > 0\n\t\t\t\t\t? [...errorPrefix, ...bodyLines]\n\t\t\t\t\t: [theme.fg(\"muted\", `∅ ${options.emptyText ?? \"(no output)\"}`)];\n\t\t\tconst footerLines = options.footerLines ?? [];\n\t\t\tconst renderedFooterLines =\n\t\t\t\tfooterLines.length > 0\n\t\t\t\t\t? [boxInsetDivider(theme, renderedWidth), ...footerLines.map((line) => boxLine(theme, line, renderedWidth))]\n\t\t\t\t\t: [];\n\t\t\tconst rendered = [\n\t\t\t\tboxInsetDivider(theme, renderedWidth),\n\t\t\t\t...renderBoxedOutputLines(theme, outputLines, renderedWidth, options.renderLineBudget ?? outputLines.length),\n\t\t\t\t...renderedFooterLines,\n\t\t\t\tboxBorder(theme, \"└\", \"┘\", renderedWidth),\n\t\t\t];\n\t\t\tcache = { width, lines: rendered };\n\t\t\treturn rendered;\n\t\t},\n\t};\n}\n\nexport function formatBoxedWallTime(result: MetricResultLike | undefined): string {\n\tconst elapsedMs = getElapsedMs(result);\n\tif (elapsedMs === undefined) return \"--\";\n\treturn `${(elapsedMs / 1000).toFixed(2)}s`;\n}\n\nexport function formatBoxedFooterFromValues(\n\ttheme: BoxTheme,\n\telapsedMs: number | undefined,\n\toutput: string,\n\textraParts: string[] = [],\n\tfixedColumns = false,\n): string {\n\tconst wall = elapsedMs === undefined ? \"--\" : `${(elapsedMs / 1000).toFixed(2)}s`;\n\tconst elapsedPart = `${theme.fg(\"text\", \"◷\")} ${theme.fg(\"dim\", wall)}`;\n\tconst extraPartList = extraParts.filter(Boolean).map((part) => theme.fg(\"dim\", part));\n\tconst wordsPart = theme.fg(\"dim\", formatBoxedWords(output));\n\tconst parts = fixedColumns\n\t\t? [\n\t\t\t\tpadVisibleRight(elapsedPart, COMPACT_FOOTER_ELAPSED_WIDTH),\n\t\t\t\t...extraPartList.map((part) => padVisibleRight(part, COMPACT_FOOTER_EXTRA_WIDTH)),\n\t\t\t\tpadVisibleRight(wordsPart, COMPACT_FOOTER_WORDS_WIDTH),\n\t\t\t]\n\t\t: [elapsedPart, ...extraPartList, wordsPart];\n\treturn parts.join(theme.fg(\"dim\", \" · \"));\n}\n\nfunction formatBoxedFooterParts(\n\ttheme: BoxTheme,\n\tresult: MetricResultLike | undefined,\n\textraParts: string[] = [],\n\tfixedColumns = false,\n\telapsedMs?: number,\n): string {\n\treturn formatBoxedFooterFromValues(\n\t\ttheme,\n\t\telapsedMs ?? getElapsedMs(result),\n\t\tgetTextOutput(result),\n\t\textraParts,\n\t\tfixedColumns,\n\t);\n}\n\nexport function formatBoxedFooter(\n\ttheme: BoxTheme,\n\tresult: MetricResultLike | undefined,\n\textraParts: string[] = [],\n\telapsedMs?: number,\n): string {\n\treturn formatBoxedFooterParts(theme, result, extraParts, false, elapsedMs);\n}\n\nexport function renderCompactBoxedFooter(\n\ttheme: BoxTheme,\n\tresult: MetricResultLike | undefined,\n\toptions: BoxedRenderOptions = {},\n): Component {\n\tif (options.state && typeof options.state === \"object\") {\n\t\toptions.state[COMPACT_FOOTER_KEY] = formatBoxedFooterParts(theme, result, [], true, options.elapsedMs);\n\t\toptions.state[COMPACT_FOOTER_ERROR_KEY] = Boolean(options.isError);\n\t\toptions.state[COMPACT_FOOTER_PARTIAL_KEY] = Boolean(options.isPartial);\n\t\treturn { invalidate() {}, render: () => [] };\n\t}\n\n\treturn {\n\t\tinvalidate() {},\n\t\trender(width: number): string[] {\n\t\t\tconst renderedWidth = boxWidth(width);\n\t\t\treturn [\n\t\t\t\tboxLine(theme, formatBoxedFooterParts(theme, result, [], false, options.elapsedMs), renderedWidth),\n\t\t\t\tboxBorder(theme, \"└\", \"┘\", renderedWidth),\n\t\t\t];\n\t\t},\n\t};\n}\n\nconst TOOL_BODY_INDENT = 2;\nconst TOOL_RIGHT_MARGIN = 1;\n\nexport function renderToolCallHeader(\n\ttheme: BoxTheme,\n\tlabel: string,\n\tdetail: string,\n\tskipTextColor?: boolean,\n): Component {\n\treturn renderToolCallHeaderLines(theme, label, [parens(theme, detail, skipTextColor)]);\n}\n\nexport function getToolBodyWidth(width: number, spaces = TOOL_BODY_INDENT): number {\n\treturn Math.max(1, width - spaces - TOOL_RIGHT_MARGIN);\n}\n\nexport function renderToolCallHeaderLines(theme: BoxTheme, label: string, detailLines: string[]): Component {\n\tconst prefix = `${badge(theme, label)} `;\n\tconst indent = \" \".repeat(safeVisibleWidth(prefix));\n\treturn {\n\t\tinvalidate() {},\n\t\trender(width: number): string[] {\n\t\t\tconst bodyWidth = Math.max(1, width - safeVisibleWidth(prefix) - TOOL_RIGHT_MARGIN);\n\t\t\tconst output: string[] = [];\n\t\t\tfor (let i = 0; i < detailLines.length; i++) {\n\t\t\t\tconst wrapped = safeWrapTextWithAnsi(detailLines[i] ?? \"\", bodyWidth);\n\t\t\t\tif (i === 0) {\n\t\t\t\t\toutput.push(`${prefix}${wrapped[0] ?? \"\"}`);\n\t\t\t\t\toutput.push(...wrapped.slice(1).map((line) => `${indent}${line}`));\n\t\t\t\t} else {\n\t\t\t\t\toutput.push(...wrapped.map((line) => `${indent}${line}`));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn output.length > 0 ? output : [prefix.trimEnd()];\n\t\t},\n\t};\n}\n\nexport function indentToolBody(text: string, spaces = TOOL_BODY_INDENT): string {\n\tconst indent = \" \".repeat(spaces);\n\treturn text\n\t\t.split(\"\\n\")\n\t\t.map((line) => (line.length === 0 ? line : `${indent}${line}`))\n\t\t.join(\"\\n\");\n}\n\nexport function indentToolBodyLines(lines: string[], spaces = TOOL_BODY_INDENT): string[] {\n\tconst indent = \" \".repeat(spaces);\n\treturn lines.map((line) => (line.length === 0 ? line : `${indent}${line}`));\n}\n\nexport function formatToolOutputLine(\n\ttheme: BoxTheme,\n\tline: string,\n\tcolor: \"toolOutput\" | \"error\" | \"text\" = \"toolOutput\",\n): string {\n\tif (color === \"error\") return theme.fg(\"error\", line);\n\n\tconst clean = stripAnsi(line);\n\tif (/^##\\s/.test(clean)) return theme.fg(\"muted\", line);\n\tif (/^\\?\\?\\s/.test(clean))\n\t\treturn theme.bold ? theme.bold(theme.fg(\"syntaxVariable\", line)) : theme.fg(\"syntaxVariable\", line);\n\n\treturn theme.fg(color, line);\n}\n\nfunction selectRenderLines(text: string, maxLines: number, tail = false): { lines: string[]; omitted: number } {\n\tconst source = text ?? \"\";\n\tif (!source) return { lines: [], omitted: 0 };\n\tconst limit = Math.max(0, maxLines);\n\tconst selected: string[] = [];\n\tlet lineCount = 0;\n\tlet lineStart = 0;\n\n\tfor (let i = 0; i <= source.length; i++) {\n\t\tif (i < source.length && source[i] !== \"\\n\") continue;\n\t\tconst rawLine = source.slice(lineStart, i).replace(/\\r/g, \"\");\n\t\tlineCount++;\n\t\tif (limit > 0) {\n\t\t\tconst line = clampRenderLine(rawLine);\n\t\t\tif (tail) {\n\t\t\t\tselected.push(line);\n\t\t\t\tif (selected.length > limit) selected.shift();\n\t\t\t} else if (selected.length < limit) {\n\t\t\t\tselected.push(line);\n\t\t\t}\n\t\t}\n\t\tlineStart = i + 1;\n\t}\n\n\tif (selected.length === 1 && selected[0] === \"\") return { lines: [], omitted: 0 };\n\treturn { lines: selected, omitted: Math.max(0, lineCount - selected.length) };\n}\n\nexport function renderLines(\n\ttheme: BoxTheme,\n\ttext: string,\n\toptions: { expanded?: boolean },\n\tcfg: { maxLines: number; tail?: boolean; color?: \"toolOutput\" | \"error\"; width?: number } = { maxLines: 10 },\n): string {\n\tconst color = cfg.color ?? \"toolOutput\";\n\tconst { lines, omitted } = selectRenderLines(text, cfg.maxLines, cfg.tail);\n\tconst renderWidth = cfg.width ? getToolBodyWidth(cfg.width) : undefined;\n\tconst renderLine = (line: string) => {\n\t\tconst rendered = renderWidth ? safeTruncateToWidth(line, renderWidth, \"…\") : line;\n\t\treturn formatToolOutputLine(theme, rendered, color);\n\t};\n\n\tif (lines.length === 0) return \"\";\n\n\tlet output = lines.map(renderLine).join(\"\\n\");\n\tif (omitted <= 0) return output;\n\n\tconst hintText = isExpanded(options)\n\t\t? `... ${omitted} more lines omitted by render budget`\n\t\t: `... ${omitted} more lines, press Ctrl+o to expand`;\n\tconst hint = cfg.width ? safeTruncateToWidth(hintText, Math.max(1, cfg.width - 1), \"…\") : hintText;\n\toutput += theme.fg(\"muted\", `\\n\\n${hint}`);\n\n\treturn output;\n}\n\nexport function dimWithElapsed(theme: BoxTheme, summary: string, result: MetricResultLike | undefined): string {\n\tconst metrics = formatToolMetrics(result);\n\treturn metrics\n\t\t? `${theme.fg(\"dim\", summary)} ${theme.fg(\"dim\", \"–\")} ${theme.italic ? theme.italic(theme.fg(\"muted\", metrics)) : theme.fg(\"muted\", metrics)}`\n\t\t: theme.fg(\"dim\", summary);\n}\n\nexport function renderToolMetricsFooter(theme: BoxTheme, _width: number, metrics: string): string[] {\n\treturn metrics\n\t\t? [theme.italic ? theme.italic(theme.fg(\"muted\", `↳ ${metrics}`)) : theme.fg(\"muted\", `↳ ${metrics}`)]\n\t\t: [];\n}\n\nexport type { MetricResultLike };\n// Re-exported metric helpers so renderers import from a single box module.\nexport { getElapsedMs };\n","// Tool metrics: elapsed wall time + output size formatting and annotation.\n\nconst ELAPSED_KEY = \"__elapsedMs\";\nconst OUTPUT_CHARS_KEY = \"__outputChars\";\n\nexport interface MetricResultLike {\n\treadonly content?: readonly unknown[];\n\treadonly details?: unknown;\n}\n\nfunction getTextOutputLength(result: MetricResultLike): number {\n\tif (!Array.isArray(result.content)) return 0;\n\tlet length = 0;\n\tlet seenText = false;\n\tfor (const contentBlock of result.content) {\n\t\tif (!contentBlock || typeof contentBlock !== \"object\") continue;\n\t\tconst block = contentBlock as { type?: unknown; text?: unknown };\n\t\tif (block.type !== \"text\") continue;\n\t\tif (seenText) length += 1; // matches getTextOutput() joining text blocks with newlines\n\t\tlength += String(block.text ?? \"\").replace(/\\r/g, \"\").length;\n\t\tseenText = true;\n\t}\n\treturn length;\n}\n\nfunction formatCompactCount(value: number): string {\n\tif (value < 1000) return `${Math.round(value)}`;\n\tif (value < 10000) return `${(value / 1000).toFixed(1)}k`;\n\tif (value < 1000000) return `${Math.round(value / 1000)}k`;\n\tif (value < 10000000) return `${(value / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(value / 1000000)}M`;\n}\n\nexport function formatElapsedMs(ms: number | undefined): string {\n\tif (typeof ms !== \"number\" || !Number.isFinite(ms)) return \"\";\n\tif (ms < 1000) return `${Math.round(ms)}ms`;\n\tconst s = ms / 1000;\n\treturn s < 10 ? `${s.toFixed(1)}s` : `${Math.round(s)}s`;\n}\n\nexport function formatOutputChars(chars: number | undefined): string {\n\tif (typeof chars !== \"number\" || !Number.isFinite(chars) || chars <= 0) return \"\";\n\treturn `${formatCompactCount(chars)} ${chars === 1 ? \"char\" : \"chars\"}`;\n}\n\nexport function formatToolMetricsFromValues(elapsedMs: number | undefined, outputChars: number | undefined): string {\n\treturn [formatElapsedMs(elapsedMs), formatOutputChars(outputChars)].filter(Boolean).join(\" · \");\n}\n\nexport function getElapsedMs(result: MetricResultLike | undefined): number | undefined {\n\tif (!result || typeof result.details !== \"object\" || result.details === null) return undefined;\n\tconst elapsed = (result.details as Record<string, unknown>)[ELAPSED_KEY];\n\treturn typeof elapsed === \"number\" && Number.isFinite(elapsed) ? elapsed : undefined;\n}\n\nexport function formatElapsed(result: MetricResultLike | undefined): string {\n\treturn formatElapsedMs(getElapsedMs(result));\n}\n\nexport function formatOutputSize(result: MetricResultLike | undefined): string {\n\treturn formatOutputChars(\n\t\t(result?.details as Record<string, unknown> | undefined)?.[OUTPUT_CHARS_KEY] as number | undefined,\n\t);\n}\n\nexport function formatToolMetrics(result: MetricResultLike | undefined): string {\n\treturn [formatElapsed(result), formatOutputSize(result)].filter(Boolean).join(\" · \");\n}\n\n/** Annotate elapsed/output metrics into a result's details (only when absent). */\nexport function annotateToolResultMetrics(result: MetricResultLike | undefined, elapsedMs?: number): void {\n\tif (!result || typeof result !== \"object\") return;\n\tif (!result.details || typeof result.details !== \"object\") {\n\t\t(result as { details?: unknown }).details = {};\n\t}\n\tconst details = result.details as Record<string, unknown>;\n\tconst existingElapsed = details[ELAPSED_KEY];\n\tif (\n\t\ttypeof elapsedMs === \"number\" &&\n\t\tNumber.isFinite(elapsedMs) &&\n\t\t(typeof existingElapsed !== \"number\" || !Number.isFinite(existingElapsed))\n\t) {\n\t\tdetails[ELAPSED_KEY] = elapsedMs;\n\t}\n\tif (typeof details[OUTPUT_CHARS_KEY] !== \"number\" || !Number.isFinite(details[OUTPUT_CHARS_KEY])) {\n\t\tdetails[OUTPUT_CHARS_KEY] = getTextOutputLength(result);\n\t}\n}\n","// Render budget + ANSI-safe width/truncation/wrapping helpers for boxed tool\n// presentation.\n\nimport {\n\ttruncateToWidth as tuiTruncateToWidth,\n\tvisibleWidth as tuiVisibleWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\n\nexport const MAX_RENDER_LINE_CHARS = 2000;\nexport const DEFAULT_COLLAPSED_RENDER_LINES = 10;\nexport const MAX_BOXED_RESULT_RENDERED_HEAD_LINES = 40;\nexport const MAX_BOXED_RESULT_RENDERED_TAIL_LINES = 8;\nexport const MAX_BOXED_RESULT_RENDERED_LINES = 160;\n\nconst RENDER_TRUNCATION_SUFFIX = \"… (truncated)\";\nconst TRUNCATE_ELLIPSIS = \"…\";\nconst ANSI_RESET = \"\\x1b[0m\";\nconst ESC = \"\\x1b\";\nconst SGR_PREFIX_PATTERN = new RegExp(`^(?:${ESC}\\\\[[0-9;]*m)+`);\nconst SGR_SUFFIX_PATTERN = new RegExp(`(?:${ESC}\\\\[[0-9;]*m)+$`);\n\ntype SimpleSgrWrappedText = {\n\tprefix: string;\n\tbody: string;\n\tsuffix: string;\n\tkind: \"sgrAscii\" | \"sgrSimple\";\n};\n\ntype FastTextKind = \"ascii\" | \"sgrAscii\" | \"simple\" | \"sgrSimple\";\n\ntype FastTextWidth = {\n\tvisibleWidth: number;\n\tkind: FastTextKind;\n};\n\ntype FastTruncateResult = {\n\ttext: string;\n\tvisibleWidth: number;\n\tkind: FastTextKind;\n};\n\nexport type FastBoxLineContent = {\n\ttext: string;\n\tvisibleWidth: number;\n\tkind: FastTextKind;\n};\n\nexport type BoxedResultRenderBudget = {\n\theadLines: number;\n\ttailLines: number;\n\tmaxRenderedLines: number;\n};\n\n/**\n * Cut a string to a maximum UTF-16 length without splitting a surrogate pair\n * (emoji / supplementary-plane characters). A plain `slice` on a non-ASCII\n * boundary produces a lone surrogate that renders as the U+FFFD replacement\n * character (�).\n */\nexport function truncateAtCodePointBoundary(text: string, maxChars: number): string {\n\tif (text.length <= maxChars) return text;\n\tconst code = text.charCodeAt(maxChars);\n\tconst end = code >= 0xdc00 && code <= 0xdfff ? maxChars - 1 : maxChars;\n\treturn text.slice(0, end);\n}\n\nexport function clampRenderLine(line: string, maxChars = MAX_RENDER_LINE_CHARS): string {\n\tif (line.length <= maxChars) return line;\n\treturn truncateAtCodePointBoundary(line, maxChars) + RENDER_TRUNCATION_SUFFIX;\n}\n\nfunction isPrintableAsciiCode(code: number): boolean {\n\treturn code >= 0x20 && code <= 0x7e;\n}\n\nfunction isSimpleWidthOneGlyphCode(code: number): boolean {\n\tif (code >= 0x2500 && code <= 0x257f) return true; // box drawing\n\tif (code >= 0x2580 && code <= 0x259f) return true; // block elements\n\tif (code >= 0x25a0 && code <= 0x25ff) return true; // geometric shapes used by UI status marks\n\tif (code >= 0x2800 && code <= 0x28ff) return true; // braille loader frames\n\treturn (\n\t\tcode === 0x00b2 || // ²\n\t\tcode === 0x00b7 || // ·\n\t\tcode === 0x03c0 || // π\n\t\tcode === 0x2013 || // –\n\t\tcode === 0x2014 || // —\n\t\tcode === 0x2022 || // •\n\t\tcode === 0x2026 || // …\n\t\tcode === 0x2191 || // ↑\n\t\tcode === 0x2192 || // →\n\t\tcode === 0x2193 || // ↓\n\t\tcode === 0x21b3 || // ↳\n\t\tcode === 0x2205 || // ∅\n\t\tcode === 0x2248 || // ≈\n\t\tcode === 0x22ef || // ⋯\n\t\tcode === 0x2387 || // ⎇\n\t\tcode === 0x23f9 || // ⏹\n\t\tcode === 0x270e || // ✎\n\t\tcode === 0x2713 || // ✓\n\t\tcode === 0x2717 || // ✗\n\t\tcode === 0x276f || // ❯\n\t\tcode === 0x2794 // ➔\n\t);\n}\n\nfunction isSimpleWidthOneCode(code: number): boolean {\n\treturn isPrintableAsciiCode(code) || isSimpleWidthOneGlyphCode(code);\n}\n\nfunction breakLongAsciiWord(word: string, width: number): string[] {\n\tconst lines: string[] = [];\n\tfor (let i = 0; i < word.length; i += width) {\n\t\tlines.push(word.slice(i, i + width));\n\t}\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\nfunction wrapPrintableAsciiLine(line: string, width: number): string[] {\n\tif (!line) return [\"\"];\n\tif (line.length <= width) return [line];\n\n\tconst wrapped: string[] = [];\n\tlet currentLine = \"\";\n\tlet currentVisibleLength = 0;\n\tlet tokenStart = 0;\n\n\twhile (tokenStart < line.length) {\n\t\tconst tokenIsSpace = line[tokenStart] === \" \";\n\t\tlet tokenEnd = tokenStart + 1;\n\t\twhile (tokenEnd < line.length && (line[tokenEnd] === \" \") === tokenIsSpace) tokenEnd++;\n\n\t\tconst token = line.slice(tokenStart, tokenEnd);\n\t\tconst tokenVisibleLength = token.length;\n\t\tif (tokenVisibleLength > width && !tokenIsSpace) {\n\t\t\tif (currentLine) {\n\t\t\t\twrapped.push(currentLine.trimEnd());\n\t\t\t\tcurrentLine = \"\";\n\t\t\t\tcurrentVisibleLength = 0;\n\t\t\t}\n\t\t\tconst broken = breakLongAsciiWord(token, width);\n\t\t\twrapped.push(...broken.slice(0, -1));\n\t\t\tcurrentLine = broken[broken.length - 1] ?? \"\";\n\t\t\tcurrentVisibleLength = currentLine.length;\n\t\t\ttokenStart = tokenEnd;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst totalNeeded = currentVisibleLength + tokenVisibleLength;\n\t\tif (totalNeeded > width && currentVisibleLength > 0) {\n\t\t\twrapped.push(currentLine.trimEnd());\n\t\t\tif (tokenIsSpace) {\n\t\t\t\tcurrentLine = \"\";\n\t\t\t\tcurrentVisibleLength = 0;\n\t\t\t} else {\n\t\t\t\tcurrentLine = token;\n\t\t\t\tcurrentVisibleLength = tokenVisibleLength;\n\t\t\t}\n\t\t} else {\n\t\t\tcurrentLine += token;\n\t\t\tcurrentVisibleLength += tokenVisibleLength;\n\t\t}\n\n\t\ttokenStart = tokenEnd;\n\t}\n\n\tif (currentLine) wrapped.push(currentLine);\n\treturn wrapped.length > 0 ? wrapped.map((wrappedLine) => wrappedLine.trimEnd()) : [\"\"];\n}\n\nfunction matchSimpleSgrWrappedText(text: string): SimpleSgrWrappedText | null {\n\tconst prefixMatch = SGR_PREFIX_PATTERN.exec(text);\n\tconst suffixMatch = SGR_SUFFIX_PATTERN.exec(text);\n\tif (!prefixMatch || !suffixMatch) return null;\n\tconst prefix = prefixMatch[0];\n\tconst suffix = suffixMatch[0];\n\tconst bodyStart = prefix.length;\n\tconst bodyEnd = suffixMatch.index;\n\tif (bodyEnd < bodyStart) return null;\n\n\tconst body = text.slice(bodyStart, bodyEnd);\n\tconst bodyWidth = knownVisibleWidth(body);\n\tif (!bodyWidth || bodyWidth.kind === \"sgrAscii\" || bodyWidth.kind === \"sgrSimple\") return null;\n\treturn { prefix, body, suffix, kind: bodyWidth.kind === \"ascii\" ? \"sgrAscii\" : \"sgrSimple\" };\n}\n\nfunction wrapSimpleSgrWrappedText(\n\ttext: string,\n\twidth: number,\n): { lines: string[]; kind: \"sgrAscii\" | \"sgrSimple\" } | null {\n\tconst match = matchSimpleSgrWrappedText(text);\n\tif (!match) return null;\n\treturn {\n\t\tlines: wrapPrintableAsciiLine(match.body, width).map((line) => `${match.prefix}${line}${match.suffix}`),\n\t\tkind: match.kind,\n\t};\n}\n\nfunction readSgrSequenceEnd(text: string, offset: number): number {\n\tif (text.charCodeAt(offset) !== 0x1b || text[offset + 1] !== \"[\") return -1;\n\tlet cursor = offset + 2;\n\twhile (cursor < text.length) {\n\t\tconst code = text.charCodeAt(cursor);\n\t\tif (code === 0x6d) return cursor + 1; // m\n\t\tif (code !== 0x3b && (code < 0x30 || code > 0x39)) return -1; // ; or 0-9\n\t\tcursor++;\n\t}\n\treturn -1;\n}\n\nfunction knownVisibleWidth(text: string): FastTextWidth | null {\n\tlet width = 0;\n\tlet sawSgr = false;\n\tlet sawSimpleGlyph = false;\n\tfor (let i = 0; i < text.length; ) {\n\t\tconst sgrEnd = readSgrSequenceEnd(text, i);\n\t\tif (sgrEnd > i) {\n\t\t\tsawSgr = true;\n\t\t\ti = sgrEnd;\n\t\t\tcontinue;\n\t\t}\n\t\tconst code = text.charCodeAt(i);\n\t\tif (!isSimpleWidthOneCode(code)) return null;\n\t\tif (!isPrintableAsciiCode(code)) sawSimpleGlyph = true;\n\t\twidth++;\n\t\ti++;\n\t}\n\tif (sawSgr) return { visibleWidth: width, kind: sawSimpleGlyph ? \"sgrSimple\" : \"sgrAscii\" };\n\treturn { visibleWidth: width, kind: sawSimpleGlyph ? \"simple\" : \"ascii\" };\n}\n\nfunction knownEllipsisWidth(text: string): number | null {\n\tif (text === TRUNCATE_ELLIPSIS) return 1;\n\treturn knownVisibleWidth(text)?.visibleWidth ?? null;\n}\n\nfunction truncatePrintableAscii(\n\ttext: string,\n\twidth: number,\n\tellipsis = TRUNCATE_ELLIPSIS,\n): { text: string; visibleWidth: number } {\n\tif (width <= 0) return { text: \"\", visibleWidth: 0 };\n\tif (text.length <= width) return { text, visibleWidth: text.length };\n\tconst ellipsisWidth = knownEllipsisWidth(ellipsis);\n\tif (ellipsisWidth === null) return { text: text.slice(0, width), visibleWidth: width };\n\tif (ellipsisWidth >= width) {\n\t\tif (ellipsis === TRUNCATE_ELLIPSIS) return { text: TRUNCATE_ELLIPSIS, visibleWidth: 1 };\n\t\treturn { text: ellipsis.slice(0, width), visibleWidth: Math.min(width, ellipsis.length) };\n\t}\n\tconst targetWidth = Math.max(0, width - ellipsisWidth);\n\treturn { text: `${text.slice(0, targetWidth)}${ellipsis}`, visibleWidth: targetWidth + ellipsisWidth };\n}\n\nfunction truncateSgrAscii(\n\ttext: string,\n\twidth: number,\n\tellipsis: string,\n\tvisibleWidth: number,\n): { text: string; visibleWidth: number } | null {\n\tif (visibleWidth <= width) return { text, visibleWidth };\n\tconst ellipsisWidth = knownEllipsisWidth(ellipsis);\n\tif (ellipsisWidth === null) return null;\n\tif (ellipsisWidth >= width) return truncatePrintableAscii(ellipsis, width, \"\");\n\n\tconst targetWidth = Math.max(0, width - ellipsisWidth);\n\tlet keptWidth = 0;\n\tlet output = \"\";\n\tfor (let i = 0; i < text.length && keptWidth < targetWidth; ) {\n\t\tconst sgrEnd = readSgrSequenceEnd(text, i);\n\t\tif (sgrEnd > i) {\n\t\t\toutput += text.slice(i, sgrEnd);\n\t\t\ti = sgrEnd;\n\t\t\tcontinue;\n\t\t}\n\t\tconst code = text.charCodeAt(i);\n\t\tif (!isSimpleWidthOneCode(code)) return null;\n\t\toutput += text[i] ?? \"\";\n\t\tkeptWidth++;\n\t\ti++;\n\t}\n\treturn { text: `${output}${ANSI_RESET}${ellipsis}${ANSI_RESET}`, visibleWidth: keptWidth + ellipsisWidth };\n}\n\nfunction fastTruncateText(text: string, width: number, ellipsis = TRUNCATE_ELLIPSIS): FastTruncateResult | null {\n\tconst knownWidth = knownVisibleWidth(text);\n\tif (!knownWidth) return null;\n\tif (knownWidth.kind === \"ascii\" || knownWidth.kind === \"simple\")\n\t\treturn { ...truncatePrintableAscii(text, width, ellipsis), kind: knownWidth.kind };\n\n\tconst simple = matchSimpleSgrWrappedText(text);\n\tif (simple) {\n\t\tconst truncated = truncatePrintableAscii(simple.body, width, ellipsis);\n\t\treturn {\n\t\t\ttext: `${simple.prefix}${truncated.text}${simple.suffix}`,\n\t\t\tvisibleWidth: truncated.visibleWidth,\n\t\t\tkind: simple.kind,\n\t\t};\n\t}\n\n\tconst truncated = truncateSgrAscii(text, width, ellipsis, knownWidth.visibleWidth);\n\treturn truncated ? { ...truncated, kind: knownWidth.kind } : null;\n}\n\nexport function safeVisibleWidth(text: string): number {\n\tconst fastWidth = knownVisibleWidth(text);\n\tif (fastWidth) return fastWidth.visibleWidth;\n\tif (text === TRUNCATE_ELLIPSIS) return 1;\n\treturn tuiVisibleWidth(text);\n}\n\nexport function safeTruncateToWidth(text: string, maxWidth: number, ellipsis = \"...\", pad = false): string {\n\tconst width = Math.floor(maxWidth);\n\tif (!Number.isFinite(width) || width <= 0) return \"\";\n\tif (text.length === 0) return pad ? \" \".repeat(width) : \"\";\n\n\tconst truncated = fastTruncateText(text, width, ellipsis);\n\tif (truncated)\n\t\treturn pad ? `${truncated.text}${\" \".repeat(Math.max(0, width - truncated.visibleWidth))}` : truncated.text;\n\n\treturn tuiTruncateToWidth(text, maxWidth, ellipsis, pad);\n}\n\nexport function fastBoxLineContent(content: string, width: number): FastBoxLineContent | null {\n\tconst contentWidth = Math.floor(width);\n\tif (!Number.isFinite(contentWidth) || contentWidth <= 0) return null;\n\n\treturn fastTruncateText(content, contentWidth);\n}\n\nexport function safeWrapTextWithAnsi(text: string, width: number, maxChars = MAX_RENDER_LINE_CHARS): string[] {\n\tconst clamped = clampRenderLine(text, maxChars);\n\tconst wrapWidth = Math.floor(width);\n\tif (!Number.isFinite(wrapWidth) || wrapWidth <= 0) {\n\t\treturn wrapTextWithAnsi(clamped, width);\n\t}\n\tconst clampedWidth = knownVisibleWidth(clamped);\n\tif (clampedWidth?.kind === \"ascii\" || clampedWidth?.kind === \"simple\") {\n\t\treturn wrapPrintableAsciiLine(clamped, wrapWidth);\n\t}\n\tconst simpleSgrWrapped = wrapSimpleSgrWrappedText(clamped, wrapWidth);\n\tif (simpleSgrWrapped) {\n\t\treturn simpleSgrWrapped.lines;\n\t}\n\treturn wrapTextWithAnsi(clamped, width);\n}\n\nexport function boxedResultRenderBudget(\n\trawLineBudget: number = DEFAULT_COLLAPSED_RENDER_LINES,\n): BoxedResultRenderBudget {\n\tconst rawLines = Math.max(\n\t\t0,\n\t\tMath.floor(Number.isFinite(rawLineBudget) ? rawLineBudget : DEFAULT_COLLAPSED_RENDER_LINES),\n\t);\n\tconst maxRenderedLines = Math.max(1, Math.min(rawLines * 3, MAX_BOXED_RESULT_RENDERED_LINES));\n\tconst tailLines = Math.min(\n\t\tMath.ceil(rawLines * 0.15),\n\t\tMAX_BOXED_RESULT_RENDERED_TAIL_LINES,\n\t\tMath.max(0, maxRenderedLines - 1),\n\t);\n\tconst headLines = Math.min(\n\t\trawLines,\n\t\tMAX_BOXED_RESULT_RENDERED_HEAD_LINES,\n\t\tMath.max(1, maxRenderedLines - tailLines - 1),\n\t);\n\n\treturn { headLines, tailLines, maxRenderedLines };\n}\n","// Boxed message-block shell (skill/compaction/branch/custom/MCP blocks).\n// Returns only border/content lines with foreground styling; the parent Box\n// applies the customMessageBg background (the native components already set\n// that bgFn).\n\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { BoxTheme } from \"../../shared/box.js\";\nimport { boxBorder, boxInnerWidth, boxInsetDivider, boxLine, boxLineWithRight, boxWidth } from \"../../shared/box.js\";\n\nexport type MessageBlockOptions = {\n\tkind: string;\n\ttitle?: string;\n\tright?: string;\n\tbody: (contentWidth: number) => string[];\n\thasDivider?: boolean | \"auto\";\n\ticon?: string;\n\tcache?: boolean;\n};\n\nfunction formatMessageBlockTitle(theme: BoxTheme, kind: string, title?: string, icon = \"➔\"): string {\n\tconst rawTitle = title ? `${icon} ${kind} | ${title}` : `${icon} ${kind}`;\n\tconst coloredTitle = theme.fg(\"accent\", rawTitle);\n\treturn typeof theme?.bold === \"function\" ? theme.bold(coloredTitle) : coloredTitle;\n}\n\n/**\n * Render a boxed message block.\n *\n * Returns only border/content lines with foreground styling. Background is\n * applied by the parent Box (all patched components extend Box with a\n * customMessageBg bgFn), so this helper must NOT apply background itself —\n * that would create a double-background conflict.\n */\nexport function renderBoxedMessageBlock(theme: BoxTheme, options: MessageBlockOptions): Component {\n\tconst { kind, title, right, body, icon = \"➔\", hasDivider = true, cache: shouldCache = true } = options;\n\tlet cache: { width: number; lines: string[] } | null = null;\n\n\treturn {\n\t\tinvalidate() {\n\t\t\tcache = null;\n\t\t},\n\t\trender(width: number): string[] {\n\t\t\tif (shouldCache && cache?.width === width) return cache.lines;\n\n\t\t\tconst renderedWidth = boxWidth(width);\n\t\t\tconst contentWidth = boxInnerWidth(renderedWidth);\n\t\t\tconst titleLine = formatMessageBlockTitle(theme, kind, title, icon);\n\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(boxBorder(theme, \"┌\", \"┐\", renderedWidth));\n\n\t\t\tif (right) {\n\t\t\t\tconst rightStyled = theme.fg(\"dim\", right);\n\t\t\t\tlines.push(boxLineWithRight(theme, titleLine, rightStyled, renderedWidth));\n\t\t\t} else {\n\t\t\t\tlines.push(boxLine(theme, titleLine, renderedWidth));\n\t\t\t}\n\n\t\t\tconst bodyLines = body(contentWidth);\n\t\t\tconst showDivider = hasDivider === \"auto\" ? bodyLines.length > 0 : hasDivider;\n\t\t\tif (showDivider) {\n\t\t\t\tlines.push(boxInsetDivider(theme, renderedWidth));\n\t\t\t}\n\t\t\tfor (const line of bodyLines) {\n\t\t\t\tlines.push(boxLine(theme, line, renderedWidth));\n\t\t\t}\n\n\t\t\tlines.push(boxBorder(theme, \"└\", \"┘\", renderedWidth));\n\n\t\t\tif (shouldCache) cache = { width, lines };\n\t\t\treturn lines;\n\t\t},\n\t};\n}\n","// Per-session render configuration for boxed tool presentation.\n//\n// Set once per session by the compatibility coordinator; read inside renderers.\n// Kept out of the render path (no filesystem/config reads during render).\n\nexport interface ToolsRenderConfig {\n\tmaxCollapsedLines: number;\n\tmaxExpandedLines: number;\n\tdimOutput: boolean;\n\tshowElapsed: boolean;\n}\n\nlet sessionToolsConfig: ToolsRenderConfig = {\n\tmaxCollapsedLines: 10,\n\tmaxExpandedLines: 50,\n\tdimOutput: false,\n\tshowElapsed: true,\n};\n\nexport function setToolsRenderConfig(config: Partial<ToolsRenderConfig>): void {\n\tsessionToolsConfig = { ...sessionToolsConfig, ...config };\n}\n\nexport function getToolsRenderConfig(): ToolsRenderConfig {\n\treturn sessionToolsConfig;\n}\n\n// Wall-clock elapsed tracking through the renderer context state (no tool\n// re-registration, so result.details has no execution timing).\n\nconst STARTED_AT_KEY = \"__piStyleStartedAt\";\nconst ELAPSED_MS_KEY = \"__piStyleElapsedMs\";\n\nexport function recordExecutionStarted(state: Record<string, unknown> | undefined, executionStarted: boolean): void {\n\tif (!executionStarted || !state || typeof state !== \"object\") return;\n\tif (typeof state[STARTED_AT_KEY] !== \"number\") state[STARTED_AT_KEY] = performance.now();\n}\n\nexport function getStateElapsedMs(state: Record<string, unknown> | undefined): number | undefined {\n\tif (!state || typeof state !== \"object\") return undefined;\n\tif (typeof state[ELAPSED_MS_KEY] !== \"number\" && typeof state[STARTED_AT_KEY] === \"number\") {\n\t\tstate[ELAPSED_MS_KEY] = performance.now() - state[STARTED_AT_KEY];\n\t}\n\treturn typeof state[ELAPSED_MS_KEY] === \"number\" ? state[ELAPSED_MS_KEY] : undefined;\n}\n","import type { NormalizedPiStyleConfig } from \"./config-types.js\";\n\nexport interface TierCAuthorizationInput {\n\treadonly certifiedHost: boolean;\n\treadonly coreFlag: boolean;\n\treadonly surfaceFlag: boolean;\n\treadonly surface: \"messages\" | \"tools\" | \"userMessage\" | \"assistantMessage\" | \"specialBlocks\";\n\treadonly config: NormalizedPiStyleConfig;\n}\n\n/** Persisted and ordinary command state is intentionally not an input: authorization is session-bound. */\nexport function isTierCAuthorized(input: TierCAuthorizationInput): boolean {\n\tif (!input.certifiedHost || !input.coreFlag || !input.surfaceFlag || !input.config.enabled) return false;\n\tif (input.surface === \"tools\") return input.config.tools.enabled;\n\tif (input.surface === \"userMessage\") return input.config.messages.enabled && input.config.messages.userPrefix;\n\tif (input.surface === \"assistantMessage\")\n\t\treturn input.config.messages.enabled && input.config.messages.assistantPrefix;\n\tif (input.surface === \"specialBlocks\") return input.config.messages.enabled && input.config.messages.specialBlocks;\n\treturn input.config.messages.enabled;\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n\tAssistantMessageComponent,\n\tBranchSummaryMessageComponent,\n\tCompactionSummaryMessageComponent,\n\tCustomMessageComponent,\n\tSkillInvocationMessageComponent,\n\tToolExecutionComponent,\n\tUserMessageComponent,\n} from \"@earendil-works/pi-coding-agent\";\nimport { decorateMessageRender, type MessageDecorationSnapshot } from \"../features/messages/index.js\";\nimport { renderSpecialMessageBlock, type SpecialBlockSubtype } from \"../features/messages/special-blocks.js\";\nimport { createToolDecorationOwner } from \"../features/tools/index.js\";\nimport {\n\ttype CompatibilityRecord,\n\tcurrentGeneration,\n\tinstallDelegatingPatch,\n\tnextGeneration,\n} from \"./compatibility-registry.js\";\n\nconst PI_VERSION_RANGE = \">=0.83.0 <0.84.0\";\nconst TRUSTED_PI_VERSION = \"0.83.0\";\nconst reportStates = new WeakMap<\n\tobject,\n\t{ records: CompatibilityRecord[]; toolOwner: ReturnType<typeof createToolDecorationOwner> | undefined }\n>();\n// These fingerprints are coupled to the installed 0.83.0 package source. A matching\n// name/arity/hash is evidence of the shipped native method, not a cryptographic proof:\n// code loaded before this module could spoof the same function source. We therefore\n// fail closed on every unrecorded Pi build and never use module-load capture as trust.\nexport const TRUSTED_NATIVE_FINGERPRINTS: Readonly<Record<string, string>> = Object.freeze({\n\t\"native-user-message:render\": \"b442a17c\",\n\t\"native-assistant-message:render\": \"2a39243f\",\n\t\"native-compaction-message:updateDisplay\": \"f8c44e78\",\n\t\"native-branch-message:updateDisplay\": \"415d57b7\",\n\t\"native-skill-message:updateDisplay\": \"48099ea6\",\n\t\"native-custom-message:rebuild\": \"76ae2e3a\",\n\t\"tool-call-renderer:getCallRenderer\": \"951ea0e0\",\n\t\"tool-result-renderer:getResultRenderer\": \"8a25cd71\",\n});\n\nexport const CERTIFICATION_TABLE = Object.freeze({\n\t\"0.83.0\": Object.freeze({\n\t\t\"native-user-message:render\": Object.freeze({\n\t\t\tfeature: \"messages\",\n\t\t\tsubtype: \"native-user-message\",\n\t\t\ttarget: UserMessageComponent.prototype,\n\t\t\tmethod: \"render\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tname: \"render\",\n\t\t\tarity: 1,\n\t\t\tfingerprint: TRUSTED_NATIVE_FINGERPRINTS[\"native-user-message:render\"],\n\t\t\tadapterId: \"message-prefix-osc133-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"native-assistant-message:render\": Object.freeze({\n\t\t\tfeature: \"messages\",\n\t\t\tsubtype: \"native-assistant-message\",\n\t\t\ttarget: AssistantMessageComponent.prototype,\n\t\t\tmethod: \"render\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tname: \"render\",\n\t\t\tarity: 1,\n\t\t\tfingerprint: TRUSTED_NATIVE_FINGERPRINTS[\"native-assistant-message:render\"],\n\t\t\tadapterId: \"message-prefix-osc133-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"tool-call-renderer:getCallRenderer\": Object.freeze({\n\t\t\tfeature: \"tools\",\n\t\t\tsubtype: \"tool-call-renderer\",\n\t\t\ttarget: ToolExecutionComponent.prototype,\n\t\t\tmethod: \"getCallRenderer\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tname: \"getCallRenderer\",\n\t\t\tarity: 0,\n\t\t\tfingerprint: TRUSTED_NATIVE_FINGERPRINTS[\"tool-call-renderer:getCallRenderer\"],\n\t\t\tadapterId: \"tool-renderer-component-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"tool-result-renderer:getResultRenderer\": Object.freeze({\n\t\t\tfeature: \"tools\",\n\t\t\tsubtype: \"tool-result-renderer\",\n\t\t\ttarget: ToolExecutionComponent.prototype,\n\t\t\tmethod: \"getResultRenderer\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tname: \"getResultRenderer\",\n\t\t\tarity: 0,\n\t\t\tfingerprint: TRUSTED_NATIVE_FINGERPRINTS[\"tool-result-renderer:getResultRenderer\"],\n\t\t\tadapterId: \"tool-renderer-component-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"native-compaction-message:updateDisplay\": Object.freeze({\n\t\t\tfeature: \"messages\",\n\t\t\tsubtype: \"native-compaction-message\",\n\t\t\ttarget: CompactionSummaryMessageComponent.prototype,\n\t\t\tmethod: \"updateDisplay\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tadapterId: \"message-block-boxed-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"native-branch-message:updateDisplay\": Object.freeze({\n\t\t\tfeature: \"messages\",\n\t\t\tsubtype: \"native-branch-message\",\n\t\t\ttarget: BranchSummaryMessageComponent.prototype,\n\t\t\tmethod: \"updateDisplay\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tadapterId: \"message-block-boxed-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"native-skill-message:updateDisplay\": Object.freeze({\n\t\t\tfeature: \"messages\",\n\t\t\tsubtype: \"native-skill-message\",\n\t\t\ttarget: SkillInvocationMessageComponent.prototype,\n\t\t\tmethod: \"updateDisplay\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tadapterId: \"message-block-boxed-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t\t\"native-custom-message:rebuild\": Object.freeze({\n\t\t\tfeature: \"messages\",\n\t\t\tsubtype: \"native-custom-message\",\n\t\t\ttarget: CustomMessageComponent.prototype,\n\t\t\tmethod: \"rebuild\",\n\t\t\twritable: true,\n\t\t\tconfigurable: true,\n\t\t\tadapterId: \"message-block-boxed-v1\",\n\t\t\tstatus: \"certified\" as const,\n\t\t}),\n\t}),\n});\n\nexport interface CompatibilityDescriptorSnapshot {\n\treadonly kind: \"data\" | \"accessor\";\n\treadonly value?: unknown;\n\treadonly get?: unknown;\n\treadonly set?: unknown;\n\treadonly writable?: boolean;\n\treadonly enumerable: boolean;\n\treadonly configurable: boolean;\n}\n\nexport interface CompatibilityRecordSnapshot {\n\treadonly feature: CompatibilityRecord[\"feature\"];\n\treadonly subtype: CompatibilityRecord[\"subtype\"];\n\treadonly method: PropertyKey;\n\treadonly shape: string;\n\treadonly piVersion: string;\n\treadonly versionRange: string;\n\treadonly generation: number;\n\treadonly disposed: boolean;\n\treadonly diagnostic: string | undefined;\n}\n\nexport interface CompatibilityProbeReport {\n\tattemptedVersion: string;\n\tmatchedCertifiedVersion: string | undefined;\n\tcertificationTable: typeof CERTIFICATION_TABLE;\n\tpiVersion: string;\n\tversionRange: string;\n\tgeneration: number;\n\trecordSnapshots: readonly CompatibilityRecordSnapshot[];\n\tunsupported: ReadonlyArray<{ subtype: string; method: PropertyKey; reason: string }>;\n\tdelegationMarkers: readonly string[];\n\tcertification: readonly {\n\t\treadonly version: string;\n\t\treadonly attemptedVersion: string;\n\t\treadonly matchedCertifiedVersion: string | undefined;\n\t\treadonly expected: unknown;\n\t\treadonly actualPreinstall: CompatibilityDescriptorSnapshot | undefined;\n\t\treadonly feature: CompatibilityRecord[\"feature\"];\n\t\treadonly subtype: CompatibilityRecord[\"subtype\"];\n\t\treadonly target: object;\n\t\treadonly method: string;\n\t\treadonly descriptor: CompatibilityDescriptorSnapshot | undefined;\n\t\treadonly name: string | undefined;\n\t\treadonly arity: number | undefined;\n\t\treadonly fingerprint: string | undefined;\n\t\treadonly adapterId: string | undefined;\n\t\treadonly status: \"certified\" | \"native-fallback\";\n\t\treadonly fallbackReason?: string;\n\t}[];\n\tgetRuntimeDiagnostics: () => ReadonlyMap<string, number>;\n\tgetFinalDiagnostics: () => Readonly<import(\"../features/tools/index.js\").ToolDiagnosticArchive> | undefined;\n\tgetActiveToolRecordCount: () => number;\n\tdisposeOwner: () => void;\n}\n\nexport interface TargetSpec {\n\tfeature: CompatibilityRecord[\"feature\"];\n\tsubtype: CompatibilityRecord[\"subtype\"];\n\ttarget: object;\n\tmethod: string;\n\tadapterId: string | undefined;\n\tstatus: \"certified\" | \"native-fallback\";\n\tfallbackReason?: string;\n}\n\nexport function fingerprint(value: unknown): string | undefined {\n\tif (typeof value !== \"function\") return undefined;\n\tlet hash = 2166136261;\n\tfor (const character of Function.prototype.toString.call(value)) {\n\t\thash ^= character.charCodeAt(0);\n\t\thash = Math.imul(hash, 16777619) >>> 0;\n\t}\n\treturn hash.toString(16).padStart(8, \"0\");\n}\n\nfunction trustedNativeIdentity(spec: TargetSpec, piVersion: string | undefined): unknown {\n\tif (piVersion !== TRUSTED_PI_VERSION) return undefined;\n\tconst descriptor = Object.getOwnPropertyDescriptor(spec.target, spec.method);\n\tconst value = descriptor?.value;\n\tconst key = `${spec.subtype}:${spec.method}`;\n\tif (\n\t\tdescriptor?.writable !== true ||\n\t\tdescriptor.configurable !== true ||\n\t\ttypeof value !== \"function\" ||\n\t\tvalue.name !== spec.method ||\n\t\tvalue.length !== (spec.method === \"render\" ? 1 : 0) ||\n\t\tfingerprint(value) !== TRUSTED_NATIVE_FINGERPRINTS[key]\n\t)\n\t\treturn undefined;\n\treturn value;\n}\n\nexport const targetSpecs: readonly TargetSpec[] = [\n\t{\n\t\tfeature: \"messages\",\n\t\tsubtype: \"native-user-message\",\n\t\ttarget: UserMessageComponent.prototype,\n\t\tmethod: \"render\",\n\t\tadapterId: \"message-prefix-osc133-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"messages\",\n\t\tsubtype: \"native-assistant-message\",\n\t\ttarget: AssistantMessageComponent.prototype,\n\t\tmethod: \"render\",\n\t\tadapterId: \"message-prefix-osc133-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"messages\",\n\t\tsubtype: \"native-compaction-message\",\n\t\ttarget: CompactionSummaryMessageComponent.prototype,\n\t\tmethod: \"updateDisplay\",\n\t\tadapterId: \"message-block-boxed-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"messages\",\n\t\tsubtype: \"native-branch-message\",\n\t\ttarget: BranchSummaryMessageComponent.prototype,\n\t\tmethod: \"updateDisplay\",\n\t\tadapterId: \"message-block-boxed-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"messages\",\n\t\tsubtype: \"native-skill-message\",\n\t\ttarget: SkillInvocationMessageComponent.prototype,\n\t\tmethod: \"updateDisplay\",\n\t\tadapterId: \"message-block-boxed-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"messages\",\n\t\tsubtype: \"native-custom-message\",\n\t\ttarget: CustomMessageComponent.prototype,\n\t\tmethod: \"rebuild\",\n\t\tadapterId: \"message-block-boxed-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"tools\",\n\t\tsubtype: \"tool-call-renderer\",\n\t\ttarget: ToolExecutionComponent.prototype,\n\t\tmethod: \"getCallRenderer\",\n\t\tadapterId: \"tool-renderer-component-v1\",\n\t\tstatus: \"certified\",\n\t},\n\t{\n\t\tfeature: \"tools\",\n\t\tsubtype: \"tool-result-renderer\",\n\t\ttarget: ToolExecutionComponent.prototype,\n\t\tmethod: \"getResultRenderer\",\n\t\tadapterId: \"tool-renderer-component-v1\",\n\t\tstatus: \"certified\",\n\t},\n];\n\nexport interface PiVersionResolution {\n\tresolvePackageEntry?: (packageName: string) => string;\n\treadFile?: (path: string) => string;\n}\n\nexport function detectPiVersion(resolution: PiVersionResolution = {}): {\n\tversion: string | undefined;\n\tdiagnostic?: string;\n} {\n\tconst resolvePackageEntry =\n\t\tresolution.resolvePackageEntry ??\n\t\t((name: string) => {\n\t\t\ttry {\n\t\t\t\treturn fileURLToPath(new URL(import.meta.resolve(name)));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`public package entry resolution failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\tconst readFile = resolution.readFile ?? ((path: string) => readFileSync(path, \"utf8\"));\n\ttry {\n\t\tconst entry = resolvePackageEntry(\"@earendil-works/pi-coding-agent\");\n\t\tlet directory = dirname(entry);\n\t\tfor (;;) {\n\t\t\tconst packagePath = join(directory, \"package.json\");\n\t\t\ttry {\n\t\t\t\tconst packageJson = JSON.parse(readFile(packagePath)) as { name?: string; version?: string };\n\t\t\t\tif (packageJson.name === \"@earendil-works/pi-coding-agent\" && typeof packageJson.version === \"string\")\n\t\t\t\t\treturn { version: packageJson.version };\n\t\t\t} catch {\n\t\t\t\t// Walk upward only; package exports may place the entry below the package root.\n\t\t\t}\n\t\t\tconst parent = dirname(directory);\n\t\t\tif (parent === directory) break;\n\t\t\tdirectory = parent;\n\t\t}\n\t\treturn { version: undefined, diagnostic: \"Pi package version was not found\" };\n\t} catch (error) {\n\t\treturn {\n\t\t\tversion: undefined,\n\t\t\tdiagnostic: `Pi package version detection failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t};\n\t}\n}\n\nfunction descriptorSnapshot(descriptor: PropertyDescriptor | undefined): CompatibilityDescriptorSnapshot | undefined {\n\tif (!descriptor) return undefined;\n\treturn Object.freeze(\n\t\t\"value\" in descriptor\n\t\t\t? {\n\t\t\t\t\tkind: \"data\",\n\t\t\t\t\tvalue: descriptor.value,\n\t\t\t\t\twritable: descriptor.writable === true,\n\t\t\t\t\tenumerable: descriptor.enumerable === true,\n\t\t\t\t\tconfigurable: descriptor.configurable === true,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tkind: \"accessor\",\n\t\t\t\t\tget: descriptor.get,\n\t\t\t\t\tset: descriptor.set,\n\t\t\t\t\tenumerable: descriptor.enumerable === true,\n\t\t\t\t\tconfigurable: descriptor.configurable === true,\n\t\t\t\t},\n\t);\n}\n\nfunction certificationRecord(\n\tspec: TargetSpec,\n\tattemptedVersion: string | undefined,\n\tevidence = Object.getOwnPropertyDescriptor(spec.target, spec.method),\n) {\n\tconst descriptor = evidence;\n\tconst value = descriptor?.value;\n\treturn {\n\t\tversion: attemptedVersion ?? \"unknown\",\n\t\tattemptedVersion: attemptedVersion ?? \"unknown\",\n\t\tmatchedCertifiedVersion: attemptedVersion === TRUSTED_PI_VERSION ? TRUSTED_PI_VERSION : undefined,\n\t\texpected: undefined,\n\t\tactualPreinstall: descriptorSnapshot(descriptor),\n\t\tfeature: spec.feature,\n\t\tsubtype: spec.subtype,\n\t\ttarget: spec.target,\n\t\tmethod: spec.method,\n\t\tdescriptor: descriptorSnapshot(descriptor),\n\t\tname: typeof value === \"function\" ? value.name : undefined,\n\t\tarity: typeof value === \"function\" ? value.length : undefined,\n\t\tfingerprint: fingerprint(value),\n\t\tadapterId: spec.adapterId,\n\t\tstatus: spec.status,\n\t\t...(spec.fallbackReason ? { fallbackReason: spec.fallbackReason } : {}),\n\t};\n}\n\nfunction versionInRange(version: string | undefined): boolean {\n\treturn version === TRUSTED_PI_VERSION;\n}\n\nfunction shape(target: object, method: string): boolean {\n\tconst descriptor = Object.getOwnPropertyDescriptor(target, method);\n\treturn typeof descriptor?.value === \"function\" && descriptor.writable === true && descriptor.configurable === true;\n}\n\nexport interface CompatibilityProbeOptions {\n\tmarkers?: Set<string>;\n\tconfig?: Readonly<{\n\t\tmessages: { enabled: boolean; userPrefix: boolean; assistantPrefix: boolean; specialBlocks: boolean };\n\t\ttools: { enabled: boolean; style: string; maxCollapsedLines: number; maxExpandedLines: number; dimOutput: boolean };\n\t\tpreset: string;\n\t}>;\n\ttoolSnapshot?: Readonly<{ callMarker?: string; resultMarker?: string; style?: \"marker\" | \"compact-box\" }>;\n\tmessageSnapshot?: MessageDecorationSnapshot;\n}\n\nfunction isSpecialBlock(spec: TargetSpec): boolean {\n\treturn spec.feature === \"messages\" && spec.status === \"certified\" && spec.adapterId === \"message-block-boxed-v1\";\n}\n\nfunction createFallbackRecord(\n\tspec: TargetSpec,\n\tpiVersion: string | undefined,\n\tgeneration: number,\n\treason: string,\n): CompatibilityRecord {\n\treturn {\n\t\tfeature: spec.feature,\n\t\tsubtype: spec.subtype,\n\t\ttarget: spec.target,\n\t\towner: spec.target,\n\t\tmethod: spec.method,\n\t\toriginalIdentity: Reflect.get(spec.target, spec.method),\n\t\tpiVersion: piVersion ?? \"unknown\",\n\t\tversionRange: PI_VERSION_RANGE,\n\t\tshape: \"unsupported\",\n\t\tdiagnostic: reason,\n\t\tgeneration,\n\t\tdisposed: true,\n\t\tdisposer: () => {},\n\t};\n}\n\nfunction probeDiagnostic(spec: TargetSpec, piVersion: string | undefined, identity: unknown): string {\n\tif (!versionInRange(piVersion)) return \"Pi version is unknown or outside the recorded 0.83.0 support build\";\n\tif (!shape(spec.target, spec.method)) return \"target method shape is not an own writable/configurable function\";\n\tif (identity === undefined) return \"recorded 0.83.0 native fingerprint, name, or arity did not match\";\n\treturn \"exact native identity verified; certified guarded decoration enabled\";\n}\n\nfunction surfaceDisabled(spec: TargetSpec, config: CompatibilityProbeOptions[\"config\"]): boolean {\n\tif (!config) return false;\n\tif (spec.feature === \"tools\") return !config.tools.enabled;\n\tif (!config.messages.enabled) return true;\n\tif (spec.subtype === \"native-user-message\") return !config.messages.userPrefix;\n\tif (spec.subtype === \"native-assistant-message\") return !config.messages.assistantPrefix;\n\tif (isSpecialBlock(spec)) return !config.messages.specialBlocks;\n\treturn true;\n}\n\nfunction probeSpec(options: {\n\tspec: TargetSpec;\n\tpiVersion: string | undefined;\n\tgeneration: number;\n\tmarkers: Set<string>;\n\tconfig?: CompatibilityProbeOptions[\"config\"];\n\tmessageSnapshot: MessageDecorationSnapshot | undefined;\n\ttoolOwner: ReturnType<typeof createToolDecorationOwner> | undefined;\n}) {\n\tconst { spec, piVersion, generation, markers, config, toolOwner, messageSnapshot } = options;\n\tconst identity = trustedNativeIdentity(spec, piVersion);\n\tconst diagnostic = probeDiagnostic(spec, piVersion, identity);\n\tconst disabled = surfaceDisabled(spec, config);\n\tif (disabled) {\n\t\tconst reason = \"native fallback: surface disabled by normalized configuration\";\n\t\treturn { record: createFallbackRecord(spec, piVersion, generation, reason), reason, fallback: true };\n\t}\n\tconst result = installDelegatingPatch({\n\t\tfeature: spec.feature,\n\t\tsubtype: spec.subtype,\n\t\ttarget: spec.target,\n\t\tmethod: spec.method,\n\t\tpiVersion: piVersion ?? \"unknown\",\n\t\tversionRange: PI_VERSION_RANGE,\n\t\tshape: identity !== undefined && versionInRange(piVersion) && shape(spec.target, spec.method),\n\t\tgeneration,\n\t\texpectedIdentity: identity,\n\t\thasExpectedIdentity: true,\n\t\tdiagnostic,\n\t\tdelegate: (original, target, args) => {\n\t\t\tmarkers.add(`${spec.subtype}:delegated`);\n\t\t\tif (spec.feature === \"tools\")\n\t\t\t\treturn (\n\t\t\t\t\ttoolOwner?.decorateToolRendererSelection(\n\t\t\t\t\t\tspec.subtype as \"tool-call-renderer\" | \"tool-result-renderer\",\n\t\t\t\t\t\toriginal,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\targs,\n\t\t\t\t\t) ?? Reflect.apply(original as (...values: unknown[]) => unknown, target, args)\n\t\t\t\t);\n\t\t\tif (spec.subtype === \"native-user-message\" || spec.subtype === \"native-assistant-message\")\n\t\t\t\treturn decorateMessageRender(\n\t\t\t\t\tspec.subtype as \"native-user-message\" | \"native-assistant-message\",\n\t\t\t\t\toriginal,\n\t\t\t\t\ttarget,\n\t\t\t\t\targs,\n\t\t\t\t\tmessageSnapshot,\n\t\t\t\t);\n\t\t\treturn renderSpecialMessageBlock(spec.subtype as SpecialBlockSubtype, original, target, args);\n\t\t},\n\t});\n\treturn {\n\t\trecord: result.record,\n\t\treason: result.reason ?? result.record.diagnostic ?? \"skipped\",\n\t\tfallback: result.status === \"skipped\",\n\t};\n}\n\nexport function probePiCompatibility(\n\tpiVersion: string | undefined,\n\toptions: Set<string> | CompatibilityProbeOptions = new Set(),\n): CompatibilityProbeReport {\n\tconst markers = options instanceof Set ? options : (options.markers ?? new Set<string>());\n\tconst generation = nextGeneration();\n\tconst toolSpecs = targetSpecs.filter((spec) => spec.feature === \"tools\");\n\tlet toolOwner: ReturnType<typeof createToolDecorationOwner> | undefined;\n\tif (\n\t\ttoolSpecs.some((spec) => trustedNativeIdentity(spec, piVersion) !== undefined) &&\n\t\t(options instanceof Set || options.config?.tools.enabled !== false)\n\t) {\n\t\ttoolOwner = createToolDecorationOwner(options instanceof Set ? {} : options.toolSnapshot);\n\t}\n\tconst evidence = Object.freeze(\n\t\ttargetSpecs.map((spec) =>\n\t\t\tObject.freeze({\n\t\t\t\tsubtype: spec.subtype,\n\t\t\t\tmethod: spec.method,\n\t\t\t\ttarget: spec.target,\n\t\t\t\tdescriptor: Object.getOwnPropertyDescriptor(spec.target, spec.method),\n\t\t\t\tvalue: Object.getOwnPropertyDescriptor(spec.target, spec.method)?.value,\n\t\t\t}),\n\t\t),\n\t);\n\tconst evidenceByKey = new Map(evidence.map((item) => [`${item.subtype}:${String(item.method)}`, item]));\n\tconst records: CompatibilityRecord[] = [];\n\tconst unsupported: Array<{ subtype: string; method: PropertyKey; reason: string }> = [];\n\tconst certification: NonNullable<CompatibilityProbeReport[\"certification\"]>[number][] = [];\n\tfor (const spec of targetSpecs) {\n\t\tconst captured = evidenceByKey.get(`${spec.subtype}:${String(spec.method)}`);\n\t\tconst preinstallDescriptor = captured?.descriptor;\n\t\tconst result = probeSpec({\n\t\t\tmessageSnapshot: options instanceof Set ? undefined : options.messageSnapshot,\n\t\t\tspec,\n\t\t\tpiVersion,\n\t\t\tgeneration,\n\t\t\tmarkers,\n\t\t\tconfig: options instanceof Set ? undefined : options.config,\n\t\t\ttoolOwner,\n\t\t});\n\t\trecords.push(result.record);\n\t\tconst certificate = certificationRecord(spec, piVersion, preinstallDescriptor);\n\t\tcertification.push({\n\t\t\t...certificate,\n\t\t\tattemptedVersion: piVersion ?? \"unknown\",\n\t\t\tmatchedCertifiedVersion: piVersion === TRUSTED_PI_VERSION ? TRUSTED_PI_VERSION : undefined,\n\t\t\texpected:\n\t\t\t\tCERTIFICATION_TABLE[TRUSTED_PI_VERSION][\n\t\t\t\t\t`${spec.subtype}:${spec.method}` as keyof (typeof CERTIFICATION_TABLE)[\"0.83.0\"]\n\t\t\t\t],\n\t\t\tactualPreinstall: descriptorSnapshot(preinstallDescriptor),\n\t\t\tstatus: result.fallback ? \"native-fallback\" : \"certified\",\n\t\t\t...(result.fallback ? { fallbackReason: result.reason } : {}),\n\t\t});\n\t\tif (result.fallback) unsupported.push({ subtype: spec.subtype, method: spec.method, reason: result.reason });\n\t}\n\tconst report: CompatibilityProbeReport = {\n\t\tattemptedVersion: piVersion ?? \"unknown\",\n\t\tmatchedCertifiedVersion: piVersion === TRUSTED_PI_VERSION ? TRUSTED_PI_VERSION : undefined,\n\t\tcertificationTable: CERTIFICATION_TABLE,\n\t\tpiVersion: piVersion ?? \"unknown\",\n\t\tversionRange: PI_VERSION_RANGE,\n\t\tgeneration: currentGeneration(),\n\t\trecordSnapshots: Object.freeze(\n\t\t\trecords.map((record) =>\n\t\t\t\tObject.freeze({\n\t\t\t\t\tfeature: record.feature,\n\t\t\t\t\tsubtype: record.subtype,\n\t\t\t\t\tmethod: record.method,\n\t\t\t\t\tshape: record.shape,\n\t\t\t\t\tpiVersion: record.piVersion,\n\t\t\t\t\tversionRange: record.versionRange,\n\t\t\t\t\tgeneration: record.generation,\n\t\t\t\t\tdisposed: record.disposed,\n\t\t\t\t\tdiagnostic: record.diagnostic,\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tunsupported: Object.freeze(unsupported.map((item) => Object.freeze({ ...item }))),\n\t\tdelegationMarkers: Object.freeze([...markers]),\n\t\tcertification: Object.freeze(\n\t\t\tcertification.map((item) =>\n\t\t\t\tObject.freeze({\n\t\t\t\t\t...item,\n\t\t\t\t\tactualPreinstall: item.actualPreinstall,\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tgetRuntimeDiagnostics: () => toolOwner?.getDiagnostics() ?? new Map(),\n\t\tgetFinalDiagnostics: () => toolOwner?.getFinalArchive(),\n\t\tgetActiveToolRecordCount: () => toolOwner?.getActiveRecordCount() ?? 0,\n\t\tdisposeOwner: () => {\n\t\t\ttoolOwner?.dispose();\n\t\t},\n\t};\n\tObject.freeze(report);\n\treportStates.set(report, { records, toolOwner });\n\treturn report;\n}\n\nexport type CompatibilityCleanupResult = Readonly<{\n\tcomplete: boolean;\n\tretryablePrototypeRecords: number;\n\tretryableToolRecords: number;\n\tfinalDiagnostics?: Readonly<import(\"../features/tools/index.js\").ToolDiagnosticArchive>;\n}>;\n\nexport function disposePiCompatibilityProbe(report: CompatibilityProbeReport): CompatibilityCleanupResult {\n\tconst state = reportStates.get(report);\n\tif (!state) return { complete: true, retryablePrototypeRecords: 0, retryableToolRecords: 0 };\n\tfor (const record of state.records) record.disposer();\n\treport.disposeOwner();\n\tconst retryablePrototypeRecords = state.records.filter((record) => !record.disposed).length;\n\tconst finalDiagnostics = report.getFinalDiagnostics();\n\tconst retryableToolRecords = report.getActiveToolRecordCount();\n\tconst toolOwnerWasCreated = report.recordSnapshots.some(\n\t\t(record) => record.feature === \"tools\" && record.shape === \"installed\",\n\t);\n\treturn {\n\t\tcomplete:\n\t\t\tretryablePrototypeRecords === 0 &&\n\t\t\tretryableToolRecords === 0 &&\n\t\t\t(!toolOwnerWasCreated || finalDiagnostics !== undefined),\n\t\tretryablePrototypeRecords,\n\t\tretryableToolRecords,\n\t\t...(finalDiagnostics ? { finalDiagnostics } : {}),\n\t};\n}\n","import { visibleWidth } from \"@earendil-works/pi-tui\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\nconst OSC133_ZONE_FINAL = \"\\x1b]133;C\\x07\";\ntype OscParts = { start: string; body: string; end: string };\n\nfunction extractOscEnvelope(line: string): OscParts | undefined {\n\tif (!line.startsWith(OSC133_ZONE_START)) return undefined;\n\tconst bodyEnd = line.indexOf(OSC133_ZONE_END, OSC133_ZONE_START.length);\n\tif (bodyEnd < 0 || !line.endsWith(OSC133_ZONE_FINAL)) return undefined;\n\treturn { start: OSC133_ZONE_START, body: line.slice(OSC133_ZONE_START.length, bodyEnd), end: line.slice(bodyEnd) };\n}\n\nfunction prefixAtFirstContent(line: string, prefix: string): string {\n\tlet index = 0;\n\twhile (index < line.length) {\n\t\tif (line[index] === \"\\x1b\" && line[index + 1] === \"[\") {\n\t\t\tindex += 2;\n\t\t\twhile (index < line.length && (line.charCodeAt(index) < 64 || line.charCodeAt(index) > 126)) index++;\n\t\t\tif (index < line.length) index++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/u.test(line[index] ?? \"\")) {\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\treturn `${line.slice(0, index)}${prefix}${line.slice(index)}`;\n}\n\nfunction decorateMessageLine(\n\tline: string,\n\tindex: number,\n\tlastIndex: number,\n\tcontentIndex: number,\n\toptions: {\n\t\tfirstEnvelope: OscParts | undefined;\n\t\tfirstHasStart: boolean;\n\t\tmultilineEnvelope: boolean;\n\t\tprefix: string;\n\t},\n): string {\n\tconst { firstEnvelope, firstHasStart, multilineEnvelope, prefix } = options;\n\tconst prefixWidth = visibleWidth(prefix);\n\tif (index === contentIndex && firstEnvelope)\n\t\treturn `${firstEnvelope.start}${prefixAtFirstContent(firstEnvelope.body, prefix)}${firstEnvelope.end}`;\n\tif (index === contentIndex && firstHasStart)\n\t\treturn `${OSC133_ZONE_START}${prefix}${line.slice(OSC133_ZONE_START.length)}`;\n\tif (index === lastIndex && multilineEnvelope && index !== contentIndex)\n\t\treturn `${OSC133_ZONE_END}${OSC133_ZONE_FINAL}${line.slice((OSC133_ZONE_END + OSC133_ZONE_FINAL).length)}`;\n\tif (index === contentIndex) return `${prefix}${line}`;\n\treturn index > contentIndex ? `${\" \".repeat(prefixWidth)}${line}` : line;\n}\n\nfunction contentText(line: string): string {\n\tlet output = \"\";\n\tfor (let index = 0; index < line.length; index++) {\n\t\tif (line.charCodeAt(index) !== 27) {\n\t\t\toutput += line[index];\n\t\t\tcontinue;\n\t\t}\n\t\tconst next = line[index + 1];\n\t\tif (next === \"]\") {\n\t\t\tindex += 2;\n\t\t\twhile (index < line.length && line.charCodeAt(index) !== 7) index++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (next === \"[\") {\n\t\t\tindex += 2;\n\t\t\twhile (index < line.length && (line.charCodeAt(index) < 64 || line.charCodeAt(index) > 126)) index++;\n\t\t}\n\t}\n\treturn output.replaceAll(OSC133_ZONE_START, \"\").replaceAll(OSC133_ZONE_END, \"\").replaceAll(OSC133_ZONE_FINAL, \"\");\n}\n\nfunction hasContent(line: string): boolean {\n\treturn [...contentText(line)].some((character) => !/\\s/u.test(character));\n}\n\nfunction prefixNative(lines: unknown, width: number, prefix: string): string[] | undefined {\n\tif (!Array.isArray(lines) || lines.length === 0 || !lines.every((line) => typeof line === \"string\")) return undefined;\n\tconst nativeLines = lines as string[];\n\tconst prefixWidth = visibleWidth(prefix);\n\tif (width <= prefixWidth) return undefined;\n\tconst bodyWidth = width - prefixWidth;\n\tconst first = nativeLines[0] ?? \"\";\n\tconst last = nativeLines.at(-1) ?? \"\";\n\tconst multilineEnvelope = nativeLines.length > 1 && last.startsWith(OSC133_ZONE_END + OSC133_ZONE_FINAL);\n\tconst firstContentIndex = nativeLines.findIndex((line, index) =>\n\t\tindex !== nativeLines.length - 1 || !multilineEnvelope ? hasContent(line) : false,\n\t);\n\tif (firstContentIndex < 0) return nativeLines;\n\tconst firstEnvelope = firstContentIndex === 0 ? extractOscEnvelope(first) : undefined;\n\tconst firstHasStart = firstContentIndex === 0 && first.startsWith(OSC133_ZONE_START);\n\tconst decorated = nativeLines.map((line, index) => {\n\t\tif (index === firstContentIndex)\n\t\t\treturn decorateMessageLine(line, index, nativeLines.length - 1, firstContentIndex, {\n\t\t\t\tfirstEnvelope,\n\t\t\t\tfirstHasStart,\n\t\t\t\tmultilineEnvelope,\n\t\t\t\tprefix,\n\t\t\t});\n\t\tif (index > firstContentIndex && hasContent(line)) return `${\" \".repeat(prefixWidth)}${line}`;\n\t\treturn line;\n\t});\n\tif (!decorated.every((line) => visibleWidth(line) <= width)) return undefined;\n\tif (!nativeLines.every((line) => visibleWidth(line) <= bodyWidth)) return undefined;\n\treturn decorated;\n}\n\nexport type MessageDecorationSnapshot = Readonly<{\n\tuserPrefix: string;\n\tassistantPrefix: string;\n\tuserEnabled: boolean;\n\tassistantEnabled: boolean;\n}>;\n\nexport function decorateMessageRender(\n\tsubtype: \"native-user-message\" | \"native-assistant-message\",\n\toriginal: unknown,\n\tinstance: object,\n\targs: unknown[],\n\tsnapshot: MessageDecorationSnapshot = {\n\t\tuserPrefix: \"❯ \",\n\t\tassistantPrefix: \"│ \",\n\t\tuserEnabled: true,\n\t\tassistantEnabled: true,\n\t},\n): unknown {\n\tif (typeof original !== \"function\") return undefined;\n\tconst width = typeof args[0] === \"number\" ? args[0] : 0;\n\tconst enabled = subtype === \"native-user-message\" ? snapshot.userEnabled : snapshot.assistantEnabled;\n\tconst prefix = subtype === \"native-user-message\" ? snapshot.userPrefix : snapshot.assistantPrefix;\n\tif (!enabled) return Reflect.apply(original, instance, args);\n\tif (width <= visibleWidth(prefix)) return Reflect.apply(original, instance, args);\n\t// Exactly one native invocation. If the reduced render cannot be certified, the\n\t// already-obtained result is the only safe fallback; retrying can mutate state.\n\tconst reducedWidth = width - visibleWidth(prefix);\n\tconst native = Reflect.apply(original, instance, [reducedWidth, ...args.slice(1)]);\n\treturn prefixNative(native, width, prefix) ?? native;\n}\n\n// Special private layouts are intentionally not installed; their prototypes remain native.\n","import { visibleWidth } from \"@earendil-works/pi-tui\";\nimport { renderBoxedToolCall, renderBoxedToolResult } from \"./boxed/index.js\";\n\n/**\n * Neutralize the native ToolExecutionComponent status background for boxed\n * rendering: Pi's updateDisplay sets contentBox/selfRenderContainer bgFn to\n * toolPendingBg/toolErrorBg/toolSuccessBg before invoking the renderers. The\n * boxed renderers own their visual boundary (borders + ✓/✗ state marks), so the\n * container fill is removed (no background slab).\n * Runs on every boxed dispatch; updateDisplay re-applies the bgFn on the next\n * pass and this wrapper re-neutralizes it.\n */\nfunction neutralizeToolContainerBackground(instance: object): void {\n\tconst host = instance as {\n\t\tgetRenderShell?(): string;\n\t\tselfRenderContainer?: { setBgFn?(fn: (text: string) => string): void; paddingX?: number; paddingY?: number };\n\t\tcontentBox?: { setBgFn?(fn: (text: string) => string): void; paddingX?: number; paddingY?: number };\n\t};\n\tconst container =\n\t\ttypeof host.getRenderShell === \"function\" && host.getRenderShell() === \"self\"\n\t\t\t? host.selfRenderContainer\n\t\t\t: host.contentBox;\n\tif (!container) return;\n\tcontainer.paddingX = 0;\n\tcontainer.paddingY = 0;\n\tif (typeof container.setBgFn === \"function\") container.setBgFn((text) => text);\n}\n\ntype RenderFunction = (this: object, ...args: unknown[]) => unknown;\ntype RendererSubtype = \"tool-call-renderer\" | \"tool-result-renderer\";\ntype RendererKind = \"call\" | \"result\";\ntype TransactionState = \"never-written\" | \"installed-owned\" | \"owner-changed\" | \"rollback-restored\" | \"rollback-failed\";\ntype ToolRenderContext = {\n\targs: object;\n\ttoolCallId: string;\n\tinvalidate: () => void;\n\tlastComponent: object | undefined;\n\tstate: object;\n\tcwd: string;\n\texecutionStarted: boolean;\n\targsComplete: boolean;\n\tisPartial: boolean;\n\texpanded: boolean;\n\tshowImages: boolean;\n\tisError: boolean;\n};\ntype ToolDecorationSnapshot = Readonly<{\n\tcallMarker: string;\n\tresultMarker: string;\n\t/** marker = prefix lines; compact-box = boxed tool call/result rendering. */\n\tstyle?: \"marker\" | \"compact-box\";\n}>;\ntype DescriptorView = Readonly<{\n\tkind: \"data\" | \"accessor\";\n\tvalue?: unknown;\n\tget?: unknown;\n\tset?: unknown;\n\twritable?: boolean;\n\tenumerable: boolean;\n\tconfigurable: boolean;\n}>;\ntype FailureEntry = Readonly<{ reason: string; transaction: TransactionState }>;\nexport type ToolDiagnosticArchive = Readonly<{\n\towner: string;\n\tgeneration: number;\n\treasons: Readonly<Record<string, number>>;\n\trestored: number;\n\tfailed: number;\n\tlaterOwner: number;\n\tfailures: readonly FailureEntry[];\n}>;\ntype CleanupOutcome = \"restored\" | \"later-owner\" | \"retry\";\ntype DecorationRecord = {\n\tcomponent: object;\n\tnativeRender: RenderFunction;\n\twrappedRender: RenderFunction;\n\tattemptedDescriptor: PropertyDescriptor;\n\toriginalOwnDescriptor?: PropertyDescriptor;\n\tinheritedDescriptor?: PropertyDescriptor;\n\tcontext: ToolRenderContext;\n\ttransaction: TransactionState;\n\tlastFailureSignature?: string;\n};\ntype DecorationState = {\n\tsnapshot: ToolDecorationSnapshot;\n\tdecorated: WeakMap<object, DecorationRecord>;\n\tactive: Set<DecorationRecord>;\n\tdiagnostics: Map<string, number>;\n\tfailures: FailureEntry[];\n\tarchive?: ToolDiagnosticArchive;\n\trestored: number;\n\tfailed: number;\n\tlaterOwner: number;\n\tgeneration: number;\n};\nconst DEFAULT_SNAPSHOT: ToolDecorationSnapshot = Object.freeze({\n\tcallMarker: \"[tool] \",\n\tresultMarker: \"[tool:result] \",\n\tstyle: \"marker\",\n});\nlet ownerGeneration = 0;\nconst piStyleWrappers = new WeakSet<RenderFunction>();\nlet toolTestHooks: { defineProperty?: typeof Reflect.defineProperty; deleteProperty?: typeof Reflect.deleteProperty } =\n\t{};\nexport function __setToolDecorationTestHooks(hooks: typeof toolTestHooks): () => void {\n\tconst previous = toolTestHooks;\n\ttoolTestHooks = hooks;\n\treturn () => {\n\t\ttoolTestHooks = previous;\n\t};\n}\n\nfunction note(state: DecorationState, reason: string, transaction: TransactionState = \"never-written\"): void {\n\tstate.diagnostics.set(reason, (state.diagnostics.get(reason) ?? 0) + 1);\n\tif (state.failures.length < 32) state.failures.push(Object.freeze({ reason, transaction }));\n}\nfunction isObject(value: unknown): value is object {\n\treturn typeof value === \"object\" && value !== null;\n}\nfunction ownData(object: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\treturn descriptor && \"value\" in descriptor ? descriptor.value : undefined;\n}\nfunction hasOwnData(object: object, key: string): boolean {\n\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\treturn descriptor !== undefined && \"value\" in descriptor;\n}\nfunction validContext(value: unknown): value is ToolRenderContext {\n\tif (!isObject(value)) return false;\n\tconst booleans = [\"isPartial\", \"expanded\", \"isError\", \"executionStarted\", \"argsComplete\", \"showImages\"] as const;\n\treturn (\n\t\tisObject(ownData(value, \"args\")) &&\n\t\ttypeof ownData(value, \"toolCallId\") === \"string\" &&\n\t\ttypeof ownData(value, \"invalidate\") === \"function\" &&\n\t\tisObject(ownData(value, \"state\")) &&\n\t\ttypeof ownData(value, \"cwd\") === \"string\" &&\n\t\tbooleans.every((key) => typeof ownData(value, key) === \"boolean\") &&\n\t\thasOwnData(value, \"lastComponent\") &&\n\t\t(ownData(value, \"lastComponent\") === undefined || isObject(ownData(value, \"lastComponent\")))\n\t);\n}\nfunction validCallArgs(args: unknown[]): args is [object, object, ToolRenderContext] {\n\treturn args.length === 3 && isObject(args[0]) && isObject(args[1]) && validContext(args[2]);\n}\nfunction validResultArgs(args: unknown[]): args is [object, object, object, ToolRenderContext] {\n\tconst [result, options, theme, context] = args;\n\treturn (\n\t\tisObject(result) &&\n\t\thasOwnData(result, \"content\") &&\n\t\tArray.isArray(ownData(result, \"content\")) &&\n\t\thasOwnData(result, \"details\") &&\n\t\tisObject(options) &&\n\t\ttypeof ownData(options, \"expanded\") === \"boolean\" &&\n\t\ttypeof ownData(options, \"isPartial\") === \"boolean\" &&\n\t\tisObject(theme) &&\n\t\tvalidContext(context)\n\t);\n}\nfunction descriptorView(descriptor: PropertyDescriptor | undefined): DescriptorView | undefined {\n\tif (!descriptor) return undefined;\n\tif (\"value\" in descriptor)\n\t\treturn Object.freeze({\n\t\t\tkind: \"data\",\n\t\t\tvalue: descriptor.value,\n\t\t\twritable: descriptor.writable === true,\n\t\t\tenumerable: descriptor.enumerable === true,\n\t\t\tconfigurable: descriptor.configurable === true,\n\t\t});\n\treturn Object.freeze({\n\t\tkind: \"accessor\",\n\t\tget: descriptor.get,\n\t\tset: descriptor.set,\n\t\tenumerable: descriptor.enumerable === true,\n\t\tconfigurable: descriptor.configurable === true,\n\t});\n}\nfunction descriptorEqual(actual: PropertyDescriptor | undefined, expected: PropertyDescriptor | undefined): boolean {\n\tconst a = descriptorView(actual),\n\t\te = descriptorView(expected);\n\treturn (\n\t\ta?.kind === e?.kind &&\n\t\ta?.value === e?.value &&\n\t\ta?.get === e?.get &&\n\t\ta?.set === e?.set &&\n\t\ta?.writable === e?.writable &&\n\t\ta?.enumerable === e?.enumerable &&\n\t\ta?.configurable === e?.configurable\n\t);\n}\nfunction renderDescriptor(\n\tcomponent: object,\n): { own?: PropertyDescriptor; inherited?: PropertyDescriptor; native?: RenderFunction } | false {\n\tconst own = Object.getOwnPropertyDescriptor(component, \"render\");\n\tif (own && !(\"value\" in own && typeof own.value === \"function\" && own.writable === true && own.configurable === true))\n\t\treturn false;\n\tlet cursor = Object.getPrototypeOf(component);\n\tlet inherited: PropertyDescriptor | undefined;\n\twhile (cursor && !inherited) {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(cursor, \"render\");\n\t\tif (descriptor) inherited = descriptor;\n\t\tcursor = Object.getPrototypeOf(cursor);\n\t}\n\tif (!own && inherited && !(\"value\" in inherited && typeof inherited.value === \"function\")) return false;\n\tconst native = own?.value ?? (inherited && \"value\" in inherited ? inherited.value : undefined);\n\treturn typeof native === \"function\"\n\t\t? { ...(own ? { own } : {}), ...(inherited ? { inherited } : {}), native }\n\t\t: false;\n}\nfunction marker(state: DecorationState, context: ToolRenderContext, kind: RendererKind): string {\n\tif (context.isError) return \"[tool:error] \";\n\tif (context.isPartial) return context.executionStarted ? \"[tool:running] \" : \"[tool:pending] \";\n\treturn kind === \"call\" ? state.snapshot.callMarker : state.snapshot.resultMarker;\n}\nfunction decorateLines(state: DecorationState, value: unknown, width: unknown, prefix: string): unknown {\n\tif (!Array.isArray(value) || !value.every((line) => typeof line === \"string\")) {\n\t\tnote(state, \"malformed-render\");\n\t\treturn value;\n\t}\n\tif (typeof width !== \"number\" || !Number.isFinite(width) || width < 0) {\n\t\tnote(state, \"invalid-width\");\n\t\treturn value;\n\t}\n\tconst lines = value as string[],\n\t\tprefixWidth = visibleWidth(prefix),\n\t\tbodyWidth = width - prefixWidth;\n\tif (width <= prefixWidth || !lines.every((line) => visibleWidth(line) <= bodyWidth)) {\n\t\tnote(state, \"reduced-native-fallback\");\n\t\treturn value;\n\t}\n\tconst output =\n\t\tlines.length === 0 ? [prefix.trimEnd()] : lines.map((line, index) => (index === 0 ? `${prefix}${line}` : line));\n\tif (output.every((line) => visibleWidth(line) <= width)) return output;\n\tnote(state, \"overwide-decoration\");\n\treturn value;\n}\nfunction createRecord(\n\tstate: DecorationState,\n\tcomponent: object,\n\tnativeRender: RenderFunction,\n\tcontext: ToolRenderContext,\n\tkind: RendererKind,\n\tdescriptors: { own?: PropertyDescriptor; inherited?: PropertyDescriptor },\n): DecorationRecord {\n\tconst attemptedDescriptor = descriptors.own\n\t\t? { ...descriptors.own, value: undefined as unknown as RenderFunction }\n\t\t: { value: undefined as unknown as RenderFunction, writable: true, enumerable: false, configurable: true };\n\tconst record = {\n\t\tcomponent,\n\t\tnativeRender,\n\t\twrappedRender: undefined as unknown as RenderFunction,\n\t\tattemptedDescriptor,\n\t\t...(descriptors.own ? { originalOwnDescriptor: descriptors.own } : {}),\n\t\t...(descriptors.inherited ? { inheritedDescriptor: descriptors.inherited } : {}),\n\t\tcontext,\n\t\ttransaction: \"never-written\" as TransactionState,\n\t};\n\trecord.wrappedRender = function (this: object, ...renderArgs: unknown[]): unknown {\n\t\tconst width = renderArgs[0],\n\t\t\tprefix = marker(state, record.context, kind);\n\t\tconst nativeArgs =\n\t\t\ttypeof width === \"number\" && width > visibleWidth(prefix)\n\t\t\t\t? [width - visibleWidth(prefix), ...renderArgs.slice(1)]\n\t\t\t\t: renderArgs;\n\t\treturn decorateLines(state, Reflect.apply(record.nativeRender, this, nativeArgs), width, prefix);\n\t};\n\tpiStyleWrappers.add(record.wrappedRender);\n\treturn record;\n}\nfunction installDecoration(state: DecorationState, record: DecorationRecord): void {\n\trecord.attemptedDescriptor.value = record.wrappedRender;\n\tlet wrote = false;\n\ttry {\n\t\twrote = Reflect.defineProperty(record.component, \"render\", record.attemptedDescriptor);\n\t} catch (error) {\n\t\tnote(state, `render-install-threw: ${error instanceof Error ? error.message : String(error)}`, \"never-written\");\n\t\treturn;\n\t}\n\tif (!wrote) {\n\t\tnote(state, \"render-install-rejected\", \"never-written\");\n\t\treturn;\n\t}\n\tconst current = Object.getOwnPropertyDescriptor(record.component, \"render\");\n\tif (!descriptorEqual(current, record.attemptedDescriptor)) {\n\t\tif (current?.value === record.wrappedRender) {\n\t\t\tconst restored = record.originalOwnDescriptor\n\t\t\t\t? (toolTestHooks.defineProperty ?? Reflect.defineProperty)(\n\t\t\t\t\t\trecord.component,\n\t\t\t\t\t\t\"render\",\n\t\t\t\t\t\trecord.originalOwnDescriptor,\n\t\t\t\t\t)\n\t\t\t\t: (toolTestHooks.deleteProperty ?? Reflect.deleteProperty)(record.component, \"render\");\n\t\t\tconst after = Object.getOwnPropertyDescriptor(record.component, \"render\");\n\t\t\tif (\n\t\t\t\trestored &&\n\t\t\t\t(record.originalOwnDescriptor ? descriptorEqual(after, record.originalOwnDescriptor) : after === undefined)\n\t\t\t) {\n\t\t\t\trecord.transaction = \"rollback-restored\";\n\t\t\t\tnote(state, \"render-install-flags-mismatch-rolled-back\", record.transaction);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trecord.transaction = \"rollback-failed\";\n\t\t\tstate.decorated.set(record.component, record);\n\t\t\tstate.active.add(record);\n\t\t\tnote(state, \"render-install-rollback-failed\", record.transaction);\n\t\t\treturn;\n\t\t}\n\t\trecord.transaction = \"owner-changed\";\n\t\tnote(state, \"render-owner-changed-during-install\", record.transaction);\n\t\treturn;\n\t}\n\trecord.transaction = \"installed-owned\";\n\tstate.decorated.set(record.component, record);\n\tstate.active.add(record);\n}\nfunction restoreDecoration(state: DecorationState, record: DecorationRecord): CleanupOutcome {\n\tconst current = Object.getOwnPropertyDescriptor(record.component, \"render\");\n\tif (!descriptorEqual(current, record.attemptedDescriptor)) {\n\t\trecord.transaction = \"owner-changed\";\n\t\tstate.laterOwner++;\n\t\tnote(state, \"render-owner-changed\", record.transaction);\n\t\treturn \"later-owner\";\n\t}\n\tconst restored = record.originalOwnDescriptor\n\t\t? (toolTestHooks.defineProperty ?? Reflect.defineProperty)(record.component, \"render\", record.originalOwnDescriptor)\n\t\t: (toolTestHooks.deleteProperty ?? Reflect.deleteProperty)(record.component, \"render\");\n\tconst after = Object.getOwnPropertyDescriptor(record.component, \"render\");\n\tconst ok = record.originalOwnDescriptor ? descriptorEqual(after, record.originalOwnDescriptor) : after === undefined;\n\tif (!restored || !ok) {\n\t\trecord.transaction = \"rollback-failed\";\n\t\tconst signature = JSON.stringify(descriptorView(after));\n\t\tif (record.lastFailureSignature !== signature) {\n\t\t\trecord.lastFailureSignature = signature;\n\t\t\tnote(state, \"render-restore-failed\", record.transaction);\n\t\t}\n\t\treturn \"retry\";\n\t}\n\trecord.transaction = \"rollback-restored\";\n\treturn \"restored\";\n}\nfunction finalize(state: DecorationState): ToolDiagnosticArchive {\n\tif (state.archive) return state.archive;\n\tconst reasons = Object.freeze(Object.fromEntries(state.diagnostics));\n\tstate.archive = Object.freeze({\n\t\towner: `tool-owner-${state.generation}`,\n\t\tgeneration: state.generation,\n\t\treasons,\n\t\trestored: state.restored,\n\t\tfailed: state.failed,\n\t\tlaterOwner: state.laterOwner,\n\t\tfailures: Object.freeze(state.failures.slice(0, 32)),\n\t});\n\treturn state.archive;\n}\nexport function createToolDecorationOwner(snapshot: Partial<ToolDecorationSnapshot> = {}) {\n\tconst state: DecorationState = {\n\t\tsnapshot: Object.freeze({ ...DEFAULT_SNAPSHOT, ...snapshot }),\n\t\tdecorated: new WeakMap(),\n\t\tactive: new Set(),\n\t\tdiagnostics: new Map(),\n\t\tfailures: [],\n\t\trestored: 0,\n\t\tfailed: 0,\n\t\tlaterOwner: 0,\n\t\tgeneration: ++ownerGeneration,\n\t};\n\tconst dispose = () => {\n\t\tif (state.archive)\n\t\t\treturn {\n\t\t\t\trestored: state.restored,\n\t\t\t\tfailed: state.failed,\n\t\t\t\tdiagnostics: new Map(state.diagnostics),\n\t\t\t\tarchive: state.archive,\n\t\t\t};\n\t\tfor (const record of [...state.active]) {\n\t\t\tconst outcome = restoreDecoration(state, record);\n\t\t\tif (outcome === \"restored\") {\n\t\t\t\tstate.restored++;\n\t\t\t\tstate.active.delete(record);\n\t\t\t} else if (outcome === \"later-owner\") state.active.delete(record);\n\t\t\telse state.failed++;\n\t\t}\n\t\tconst archive = state.active.size === 0 ? finalize(state) : undefined;\n\t\treturn { restored: state.restored, failed: state.failed, diagnostics: new Map(state.diagnostics), archive };\n\t};\n\treturn Object.freeze({\n\t\tdecorateToolRendererSelection(subtype: RendererSubtype, original: unknown, instance: object, args: unknown[]) {\n\t\t\tif (typeof original !== \"function\") return undefined;\n\t\t\tconst renderer = Reflect.apply(original, instance, args);\n\t\t\tif (state.snapshot.style === \"compact-box\") {\n\t\t\t\tconst toolName = (instance as { toolName?: unknown }).toolName;\n\t\t\t\t// Tools without a native renderCall/renderResult (e.g. extension tools\n\t\t\t\t// like TaskUpdate/TaskList) still get boxed presentation through a\n\t\t\t\t// fallback renderer, mirroring the generic boxed fallback used for\n\t\t\t\t// unknown tool names.\n\t\t\t\tif (typeof renderer !== \"function\") {\n\t\t\t\t\tneutralizeToolContainerBackground(instance);\n\t\t\t\t\tif (subtype === \"tool-call-renderer\")\n\t\t\t\t\t\treturn (callArgs: unknown, theme: unknown, context: unknown) =>\n\t\t\t\t\t\t\trenderBoxedToolCall(toolName, callArgs as Record<string, unknown>, theme as never, context as never);\n\t\t\t\t\treturn (result: unknown, options: unknown, theme: unknown, context: unknown) =>\n\t\t\t\t\t\trenderBoxedToolResult(\n\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\tresult as { content?: readonly unknown[]; details?: unknown },\n\t\t\t\t\t\t\toptions as { expanded: boolean; isPartial: boolean },\n\t\t\t\t\t\t\ttheme as never,\n\t\t\t\t\t\t\tcontext as never,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn function (this: unknown, ...rendererArgs: unknown[]) {\n\t\t\t\t\tconst valid = subtype === \"tool-call-renderer\" ? validCallArgs(rendererArgs) : validResultArgs(rendererArgs);\n\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\tnote(state, `${subtype}-malformed-context`);\n\t\t\t\t\t\treturn Reflect.apply(renderer, this, rendererArgs);\n\t\t\t\t\t}\n\t\t\t\t\tconst component =\n\t\t\t\t\t\tsubtype === \"tool-call-renderer\"\n\t\t\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\t\t\tconst [args, theme, context] = rendererArgs as [object, object, ToolRenderContext];\n\t\t\t\t\t\t\t\t\treturn renderBoxedToolCall(\n\t\t\t\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\t\t\t\targs as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t\ttheme as never,\n\t\t\t\t\t\t\t\t\t\tcontext as never,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})()\n\t\t\t\t\t\t\t: (() => {\n\t\t\t\t\t\t\t\t\tconst [result, options, theme, context] = rendererArgs as [object, object, object, ToolRenderContext];\n\t\t\t\t\t\t\t\t\treturn renderBoxedToolResult(\n\t\t\t\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\t\t\t\tresult as { content?: readonly unknown[]; details?: unknown },\n\t\t\t\t\t\t\t\t\t\toptions as { expanded: boolean; isPartial: boolean },\n\t\t\t\t\t\t\t\t\t\ttheme as never,\n\t\t\t\t\t\t\t\t\t\tcontext as never,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})();\n\t\t\t\t\tneutralizeToolContainerBackground(instance);\n\t\t\t\t\treturn component;\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (typeof renderer !== \"function\") return renderer;\n\t\t\treturn function (this: unknown, ...rendererArgs: unknown[]) {\n\t\t\t\tconst valid = subtype === \"tool-call-renderer\" ? validCallArgs(rendererArgs) : validResultArgs(rendererArgs);\n\t\t\t\tif (!valid) {\n\t\t\t\t\tnote(state, `${subtype}-malformed-context`);\n\t\t\t\t\treturn Reflect.apply(renderer, this, rendererArgs);\n\t\t\t\t}\n\t\t\t\tconst component = Reflect.apply(renderer, this, rendererArgs);\n\t\t\t\tif (!isObject(component)) return component;\n\t\t\t\tconst descriptors = renderDescriptor(component);\n\t\t\t\tif (descriptors !== false && descriptors.native && piStyleWrappers.has(descriptors.native)) {\n\t\t\t\t\tnote(state, `${subtype}-owner-conflict`);\n\t\t\t\t\treturn component;\n\t\t\t\t}\n\t\t\t\tif (!descriptors) {\n\t\t\t\t\tnote(state, `${subtype}-unsafe-render-descriptor`);\n\t\t\t\t\treturn component;\n\t\t\t\t}\n\t\t\t\tconst record = state.decorated.get(component);\n\t\t\t\tif (record) {\n\t\t\t\t\trecord.context = rendererArgs.at(-1) as ToolRenderContext;\n\t\t\t\t\treturn component;\n\t\t\t\t}\n\t\t\t\tconst next = createRecord(\n\t\t\t\t\tstate,\n\t\t\t\t\tcomponent,\n\t\t\t\t\tdescriptors.native as RenderFunction,\n\t\t\t\t\trendererArgs.at(-1) as ToolRenderContext,\n\t\t\t\t\tsubtype === \"tool-call-renderer\" ? \"call\" : \"result\",\n\t\t\t\t\tdescriptors,\n\t\t\t\t);\n\t\t\t\tinstallDecoration(state, next);\n\t\t\t\treturn component;\n\t\t\t};\n\t\t},\n\t\tgetDiagnostics: () => new Map(state.diagnostics),\n\t\tgetFinalArchive: () => state.archive,\n\t\tgetActiveRecordCount: () => state.active.size,\n\t\tdispose,\n\t});\n}\n","// Boxed bash tool renderer\n// (renderCall/renderResult only).\n\nimport { highlightCode } from \"@earendil-works/pi-coding-agent\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport type { BoxTheme } from \"../../../shared/box.js\";\nimport {\n\tboxedToolWidthKey,\n\tformatBoxedFooter,\n\tformatToolOutputLine,\n\tgetTextOutput,\n\trenderBoxedToolCall,\n\trenderBoxedToolResult,\n\treplaceTabs,\n} from \"../../../shared/box.js\";\nimport { safeTruncateToWidth, truncateAtCodePointBoundary } from \"../../../shared/render-budget.js\";\nimport { getStateElapsedMs, getToolsRenderConfig } from \"./session-config.js\";\nimport { type BoxedToolContext, type BoxedToolDefinition, noteExecutionStart } from \"./shared.js\";\n\nconst MAX_BASH_PREVIEW_LINES = 5;\nconst MAX_LINE_CHARS = 2000;\nconst ESC = \"\\x1b\";\nconst BASH_TOOL_NOTICE_PATTERN = /^\\[Showing (?:last|lines)\\b.*\\. Full output: .+\\]$/;\nconst BG_ANSI_PATTERN = new RegExp(`${ESC}\\\\[4[0-9;]*m`, \"g\");\nconst SHELL_VAR_PATTERN = /\\$\\{?[A-Za-z_][A-Za-z0-9_]*\\}?/;\nconst SHELL_OP_PATTERN = /^(?:&&|\\|\\||>>|>&|\\|&|[|&;()<>])$/;\n\nfunction highlightBashFallback(line: string): string {\n\ttry {\n\t\tconst highlighted = highlightCode(line, \"bash\")[0] ?? line;\n\t\t// Strip background colors to avoid clashing with badge/parens styling\n\t\treturn highlighted.replace(BG_ANSI_PATTERN, \"\");\n\t} catch {\n\t\treturn line;\n\t}\n}\n\nfunction normalizeShellWord(word: string): string {\n\treturn word.replace(/^(['\"])(.*)\\1$/, \"$2\");\n}\n\nfunction colorShellWord(theme: BoxTheme, word: string, commandExpected: boolean): string {\n\tconst normalized = normalizeShellWord(word);\n\tif (/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(normalized)) return theme.fg(\"syntaxVariable\", word);\n\tif (normalized.startsWith(\"-\")) return theme.fg(\"syntaxKeyword\", word);\n\tif (normalized.includes(\"/\") || /^\\.{1,2}(?:\\/|$)/.test(normalized)) return theme.fg(\"syntaxVariable\", word);\n\tif (SHELL_VAR_PATTERN.test(normalized)) return theme.fg(\"syntaxVariable\", word);\n\treturn commandExpected ? theme.fg(\"syntaxFunction\", word) : theme.fg(\"syntaxString\", word);\n}\n\nfunction tokenizeShellLinePreservingText(line: string): string[] | undefined {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet quote: string | null = null;\n\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst char = line[i] ?? \"\";\n\t\tconst next = line[i + 1] ?? \"\";\n\n\t\tif (quote) {\n\t\t\tcurrent += char;\n\t\t\tif (char === \"\\\\\" && next) current += line[++i] ?? \"\";\n\t\t\telse if (char === quote) quote = null;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"'\" || char === '\"') {\n\t\t\tquote = char;\n\t\t\tcurrent += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (/\\s/.test(char)) {\n\t\t\tif (current) tokens.push(current);\n\t\t\tcurrent = \"\";\n\t\t\ttokens.push(char);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"#\" && !current) {\n\t\t\tif (current) tokens.push(current);\n\t\t\ttokens.push(line.slice(i));\n\t\t\treturn tokens;\n\t\t}\n\n\t\tconst two = `${char}${next}`;\n\t\tif (SHELL_OP_PATTERN.test(two) || SHELL_OP_PATTERN.test(char)) {\n\t\t\tif (current) tokens.push(current);\n\t\t\tcurrent = \"\";\n\t\t\tif (SHELL_OP_PATTERN.test(two)) {\n\t\t\t\ttokens.push(two);\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\ttokens.push(char);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += char;\n\t}\n\n\tif (quote) return undefined;\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n\nfunction highlightBashLine(line: string, theme: BoxTheme): string {\n\tconst tokens = tokenizeShellLinePreservingText(line);\n\tif (!tokens) return highlightBashFallback(line);\n\tlet commandExpected = true;\n\treturn tokens\n\t\t.map((token) => {\n\t\t\tif (/^\\s+$/.test(token)) return token;\n\t\t\tif (token.startsWith(\"#\")) return theme.fg(\"syntaxComment\", token);\n\t\t\tif (SHELL_OP_PATTERN.test(token)) {\n\t\t\t\tcommandExpected = token === \"|\" || token === \"||\" || token === \"&&\" || token === \";\" || token === \"&\";\n\t\t\t\treturn theme.fg(\"syntaxOperator\", token);\n\t\t\t}\n\t\t\tconst styled = colorShellWord(theme, token, commandExpected);\n\t\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(normalizeShellWord(token))) commandExpected = false;\n\t\t\treturn styled;\n\t\t})\n\t\t.join(\"\");\n}\n\nfunction clampLineLength(line: string, max: number = MAX_LINE_CHARS): string {\n\tif (line.length <= max) return line;\n\treturn `${truncateAtCodePointBoundary(line, max)}… (truncated)`;\n}\n\nfunction countNewlines(text: string, from: number, to: number): number {\n\tlet count = 0;\n\tfor (let i = from; i < to; i++) {\n\t\tif (text.charCodeAt(i) === 10) count++;\n\t}\n\treturn count;\n}\n\nfunction stripBashToolNoticeLines(text: string): string {\n\tconst filteredLines = text\n\t\t.replace(/\\r/g, \"\")\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !BASH_TOOL_NOTICE_PATTERN.test(line.trim()));\n\treturn filteredLines\n\t\t.join(\"\\n\")\n\t\t.replace(/\\n{3,}/g, \"\\n\\n\")\n\t\t.trimEnd();\n}\n\nfunction bashWidthKey(rawCommand: string, timeout: unknown): string {\n\treturn boxedToolWidthKey(\"Bash\", `${rawCommand}|${timeout ?? \"\"}`);\n}\n\nfunction renderBoxedBashCall(\n\ttheme: BoxTheme,\n\tcommandLines: string[],\n\tcontext: BoxedToolContext,\n\twidthKey: string,\n): Component {\n\tconst maxCommandLines = 5;\n\tconst shownCount = Math.min(commandLines.length, maxCommandLines + 1);\n\tconst detailLines: string[] = [];\n\tfor (let i = 0; i < shownCount; i++) {\n\t\tconst prefix = i === 0 ? theme.fg(\"dim\", \"$ \") : theme.fg(\"dim\", \"> \");\n\t\tdetailLines.push(`${prefix}${highlightBashLine(commandLines[i] ?? \"\", theme)}`);\n\t}\n\tif (commandLines.length > maxCommandLines + 1) {\n\t\tdetailLines.push(theme.fg(\"muted\", `... ${commandLines.length - maxCommandLines - 1} more lines`));\n\t}\n\treturn renderBoxedToolCall(theme, \"Bash\", detailLines, {\n\t\twidthKey,\n\t\tisError: Boolean(context.isError),\n\t\tisPartial: Boolean(context.isPartial),\n\t\tisPending: Boolean(context.isPartial),\n\t});\n}\n\nfunction formatTimeout(context: BoxedToolContext): string {\n\tconst timeout = context?.args?.timeout ?? 300;\n\treturn `${timeout}s`;\n}\n\nfunction renderBoxedBashResult(\n\ttheme: BoxTheme,\n\tinner: Component,\n\tresult: unknown,\n\tcontext: BoxedToolContext,\n): Component {\n\tconst rawCommand = String(context?.args?.command ?? \"...\");\n\tconst referenceLines = rawCommand.split(\"\\n\").map((line, index) => `${index === 0 ? \"$ \" : \"> \"}${line}`);\n\treturn renderBoxedToolResult(theme, inner, {\n\t\twidthKey: bashWidthKey(rawCommand, context?.args?.timeout),\n\t\treferenceLines,\n\t\tfooterLines: [formatBoxedFooter(theme, result as never, [`⏹ ${formatTimeout(context)}`], getElapsed(context))],\n\t\tisError: context.isError,\n\t\tisPartial: Boolean(context.isPartial),\n\t});\n}\n\nfunction getElapsed(context: BoxedToolContext): number | undefined {\n\treturn getStateElapsedMs(context.state);\n}\n\nfunction createBashResultPreview(\n\ttheme: BoxTheme,\n\ttext: string,\n\toptions: { expanded: boolean },\n\tcolor: \"toolOutput\" | \"error\",\n\textraLinesBefore: number = 0,\n): Component {\n\tlet cacheKey = \"\";\n\tlet cacheLines: string[] | null = null;\n\n\treturn {\n\t\tinvalidate() {\n\t\t\tcacheKey = \"\";\n\t\t\tcacheLines = null;\n\t\t},\n\t\trender(width: number): string[] {\n\t\t\tconst bodyWidth = Math.max(1, width);\n\t\t\tconst cfg = getToolsRenderConfig();\n\t\t\tconst expanded = Boolean(options.expanded);\n\t\t\tconst cacheId = `${bodyWidth}|${expanded ? 1 : 0}|${cfg.maxExpandedLines}|${cfg.dimOutput ? 1 : 0}`;\n\t\t\tif (cacheLines && cacheKey === cacheId) return cacheLines;\n\n\t\t\tif (!expanded) {\n\t\t\t\t// Collapsed: only process the tail of the output\n\t\t\t\tconst needed = MAX_BASH_PREVIEW_LINES;\n\t\t\t\tlet totalNewlines = 0;\n\t\t\t\tlet scanFrom = 0; // default: take full text if fewer than needed newlines\n\t\t\t\tfor (let i = text.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (text.charCodeAt(i) === 10) {\n\t\t\t\t\t\ttotalNewlines++;\n\t\t\t\t\t\tif (totalNewlines === needed) {\n\t\t\t\t\t\t\tscanFrom = i + 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (text.length === 0) {\n\t\t\t\t\tcacheKey = cacheId;\n\t\t\t\t\tcacheLines = [];\n\t\t\t\t\treturn cacheLines;\n\t\t\t\t}\n\n\t\t\t\tconst tail = replaceTabs(text.slice(scanFrom)).replace(/\\r/g, \"\");\n\t\t\t\tconst shownLines = tail ? tail.split(\"\\n\").map((l) => clampLineLength(l)) : [];\n\n\t\t\t\tif (shownLines.length === 0) {\n\t\t\t\t\tcacheKey = cacheId;\n\t\t\t\t\tcacheLines = [];\n\t\t\t\t\treturn cacheLines;\n\t\t\t\t}\n\n\t\t\t\tconst truncatedShown = shownLines.map((line) => {\n\t\t\t\t\tconst truncated = safeTruncateToWidth(line, bodyWidth, \"…\");\n\t\t\t\t\tif (color === \"error\") return formatToolOutputLine(theme, truncated, \"error\");\n\t\t\t\t\treturn cfg.dimOutput\n\t\t\t\t\t\t? formatToolOutputLine(theme, truncated)\n\t\t\t\t\t\t: formatToolOutputLine(theme, truncated, \"text\");\n\t\t\t\t});\n\n\t\t\t\t// Count remaining lines (lines before scanFrom)\n\t\t\t\tconst remaining = extraLinesBefore + (scanFrom > 0 ? countNewlines(text, 0, scanFrom) : 0);\n\n\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\tcacheKey = cacheId;\n\t\t\t\t\tcacheLines = truncatedShown;\n\t\t\t\t\treturn cacheLines;\n\t\t\t\t}\n\n\t\t\t\tconst hint = safeTruncateToWidth(`... ${remaining} more lines, press Ctrl+o to expand`, bodyWidth, \"…\");\n\t\t\t\tcacheKey = cacheId;\n\t\t\t\tcacheLines = [...truncatedShown, \"\", theme.fg(\"muted\", hint)];\n\t\t\t\treturn cacheLines;\n\t\t\t}\n\n\t\t\t// Expanded: process all lines\n\t\t\tconst normalized = replaceTabs(text);\n\t\t\tconst logicalLines = normalized.split(\"\\n\").map((l) => clampLineLength(l));\n\t\t\tconst hasOutput = !(logicalLines.length === 1 && logicalLines[0] === \"\");\n\n\t\t\tif (!hasOutput) {\n\t\t\t\tcacheKey = cacheId;\n\t\t\t\tcacheLines = [];\n\t\t\t\treturn cacheLines;\n\t\t\t}\n\n\t\t\tconst truncatedLines = logicalLines.map((line) => safeTruncateToWidth(line, bodyWidth, \"…\"));\n\t\t\tconst expandedLines = truncatedLines.length === 1 && truncatedLines[0] === \"\" ? [] : truncatedLines;\n\t\t\tconst applyColor = (l: string) =>\n\t\t\t\tcolor === \"error\"\n\t\t\t\t\t? formatToolOutputLine(theme, l, \"error\")\n\t\t\t\t\t: cfg.dimOutput\n\t\t\t\t\t\t? formatToolOutputLine(theme, l)\n\t\t\t\t\t\t: formatToolOutputLine(theme, l, \"text\");\n\t\t\tif (cfg.maxExpandedLines > 0 && expandedLines.length > cfg.maxExpandedLines) {\n\t\t\t\tconst truncated = expandedLines.slice(-cfg.maxExpandedLines).map(applyColor);\n\t\t\t\tconst remaining = expandedLines.length - cfg.maxExpandedLines;\n\t\t\t\ttruncated.unshift(theme.fg(\"dim\", `… ${remaining} earlier lines`));\n\t\t\t\tcacheKey = cacheId;\n\t\t\t\tcacheLines = truncated;\n\t\t\t\treturn cacheLines;\n\t\t\t}\n\n\t\t\tcacheKey = cacheId;\n\t\t\tcacheLines = expandedLines.map(applyColor);\n\t\t\treturn cacheLines;\n\t\t},\n\t};\n}\n\nexport const bashTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst rawCommand = String(args?.command ?? \"...\");\n\t\treturn renderBoxedBashCall(theme, rawCommand.split(\"\\n\"), context, bashWidthKey(rawCommand, args?.timeout));\n\t},\n\tresult(result, options, theme, context) {\n\t\tconst raw = getTextOutput(result);\n\t\tconst outputColor = context.isError ? \"error\" : \"toolOutput\";\n\n\t\tif (!options.expanded) {\n\t\t\tconst scanLines = MAX_BASH_PREVIEW_LINES + 10;\n\t\t\tlet nlCount = 0;\n\t\t\tlet tailStart = 0;\n\t\t\tfor (let i = raw.length - 1; i >= 0; i--) {\n\t\t\t\tif (raw.charCodeAt(i) === 10) {\n\t\t\t\t\tnlCount++;\n\t\t\t\t\tif (nlCount >= scanLines) {\n\t\t\t\t\t\ttailStart = i + 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst tail = stripBashToolNoticeLines(stripAnsi(raw.slice(tailStart)));\n\t\t\tconst totalLinesBefore = tailStart > 0 ? countNewlines(raw, 0, tailStart) : 0;\n\t\t\tconst inner = createBashResultPreview(theme, tail, options, outputColor, totalLinesBefore);\n\t\t\treturn renderBoxedBashResult(theme, inner, result, context);\n\t\t}\n\t\tconst output = stripBashToolNoticeLines(stripAnsi(raw));\n\t\tconst inner = createBashResultPreview(theme, output, options, outputColor, 0);\n\t\treturn renderBoxedBashResult(theme, inner, result, context);\n\t},\n};\n","// Shared context/view types + common helpers for the boxed tool renderers.\n\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { BoxTheme } from \"../../../shared/box.js\";\nimport {\n\tboxedToolWidthKey,\n\tclearCompactBoxedFooter,\n\tformatBoxedFooter,\n\tformatBoxedFooterFromValues,\n\tgetTextOutput,\n\trenderCompactBoxedFooter,\n\trenderCompactBoxedToolCall,\n\tresolveRelativePath,\n\tshortenPath,\n} from \"../../../shared/box.js\";\nimport { getStateElapsedMs, recordExecutionStarted } from \"./session-config.js\";\n\n/** Renderer context delivered by Pi's ToolExecutionComponent (getRenderContext). */\nexport interface BoxedToolContext {\n\treadonly args: Record<string, unknown>;\n\treadonly toolCallId: string;\n\treadonly state: Record<string, unknown>;\n\treadonly cwd: string;\n\treadonly executionStarted: boolean;\n\treadonly argsComplete: boolean;\n\treadonly isPartial: boolean;\n\treadonly expanded: boolean;\n\treadonly showImages: boolean;\n\treadonly isError: boolean;\n\treadonly lastComponent?: unknown;\n}\n\n/** Result view delivered to result renderers: { content, details }. */\nexport interface BoxedToolResult {\n\treadonly content?: readonly unknown[];\n\treadonly details?: unknown;\n}\n\nexport type BoxedCallRenderer = (\n\targs: Record<string, unknown>,\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n) => Component;\nexport type BoxedResultRenderer = (\n\tresult: BoxedToolResult,\n\toptions: { expanded: boolean; isPartial: boolean },\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n) => Component;\n\nexport interface BoxedToolDefinition {\n\treadonly call: BoxedCallRenderer;\n\treadonly result: BoxedResultRenderer;\n}\n\nexport function pendingFlag(context: BoxedToolContext): boolean {\n\treturn Boolean(context.isPartial);\n}\n\n/** Normalized display path: shortens HOME and resolves relative to the session cwd. */\nexport function displayPath(rawPath: string, context: BoxedToolContext): string {\n\tconst path = String(rawPath ?? \"\");\n\tif (!path) return \"(unknown)\";\n\treturn shortenPath(resolveRelativePath(path, context.cwd));\n}\n\nexport function pathRangeDetail(rawPath: string, offset: unknown, limit: unknown, context: BoxedToolContext): string {\n\tconst path = displayPath(rawPath, context);\n\tlet range = \"\";\n\tif (offset !== undefined || limit !== undefined) {\n\t\tconst start = offset ?? 1;\n\t\tconst end = limit !== undefined ? Number(start) + Number(limit) - 1 : \"\";\n\t\trange = `:${start}${end ? `-${end}` : \"\"}`;\n\t}\n\treturn path ? `${path}${range}` : \"(unknown)\";\n}\n\n/** Compact boxed call header for summary-style tools (read/write/ls/find/grep). */\nexport function compactCall(\n\ttheme: BoxTheme,\n\ttoolName: string,\n\tdetailLine: string,\n\toptions: { detailKey: string; context: BoxedToolContext },\n): Component {\n\treturn renderCompactBoxedToolCall(theme, toolName, detailLine, {\n\t\twidthKey: boxedToolWidthKey(toolName, options.detailKey),\n\t\tstate: options.context.state,\n\t\tisError: Boolean(options.context.isError),\n\t\tisPartial: Boolean(options.context.isPartial),\n\t\tisPending: pendingFlag(options.context),\n\t});\n}\n\n/** Record wall-clock start when execution begins (first render with executionStarted). */\nexport function noteExecutionStart(context: BoxedToolContext): void {\n\trecordExecutionStarted(context.state, context.executionStarted);\n}\n\nexport function stateElapsedMs(context: BoxedToolContext): number | undefined {\n\treturn getStateElapsedMs(context.state);\n}\n\n/** Footer parts with state-based elapsed when result.details lacks timing. */\nexport function boxedFooterWithState(\n\ttheme: BoxTheme,\n\tresult: BoxedToolResult | undefined,\n\tcontext: BoxedToolContext,\n\textraParts: string[] = [],\n): string {\n\treturn formatBoxedFooterFromValues(theme, stateElapsedMs(context), getTextOutput(result), extraParts);\n}\n\nexport function compactFooterWithState(\n\ttheme: BoxTheme,\n\tresult: BoxedToolResult,\n\tcontext: BoxedToolContext,\n\toptions: { isError?: boolean; isPartial?: boolean } = {},\n): Component {\n\tconst elapsedMs = stateElapsedMs(context);\n\treturn renderCompactBoxedFooter(theme, result, {\n\t\tstate: context.state,\n\t\tisError: Boolean(options.isError ?? context.isError),\n\t\tisPartial: Boolean(options.isPartial ?? context.isPartial),\n\t\t...(elapsedMs === undefined ? {} : { elapsedMs }),\n\t});\n}\n\nexport function resultFooterLines(\n\ttheme: BoxTheme,\n\tresult: BoxedToolResult,\n\tcontext: BoxedToolContext,\n\textraParts: string[] = [],\n): string[] {\n\treturn [formatBoxedFooter(theme, result, extraParts, stateElapsedMs(context))];\n}\n\nexport function clearFooterState(context: BoxedToolContext): void {\n\tclearCompactBoxedFooter(context.state);\n}\n\n/** Result-details truncation line count when the native tool truncated output. */\nexport function truncationOutputLines(result: BoxedToolResult | undefined): number | undefined {\n\tif (!result) return undefined;\n\tconst details = result.details as { truncation?: { outputLines?: number } } | undefined;\n\tconst value = details?.truncation?.outputLines;\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\n/** Result-details grep match-limit reached counter. */\nexport function matchLimitReached(result: BoxedToolResult | undefined): number | undefined {\n\tif (!result) return undefined;\n\tconst details = result.details as { matchLimitReached?: number } | undefined;\n\tconst value = details?.matchLimitReached;\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport { boxedToolWidthKey, getTextOutput, resolveRelativePath, shortenPath };\n","// Boxed edit tool renderer\n// (renderCall/renderResult only; no edit-core re-registration).\n\nimport { getLanguageFromPath } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport { getTextOutput, renderBoxedToolCall, renderBoxedToolResult } from \"../../../shared/box.js\";\nimport {\n\tbuildSplitRows,\n\tcountDiffStats,\n\textractEditedPath,\n\tfirstText,\n\trenderDiffMeter,\n\tSplitDiffComponent,\n} from \"../../../shared/split-diff.js\";\nimport {\n\ttype BoxedToolContext,\n\ttype BoxedToolDefinition,\n\tdisplayPath,\n\tnoteExecutionStart,\n\tresultFooterLines,\n} from \"./shared.js\";\n\nconst MAX_HIGHLIGHT_DIFF_CHARS = 12000;\nconst MAX_HIGHLIGHT_DIFF_ROWS = 120;\n\ntype EditResultDetails = { diff?: string; path?: string } | undefined;\n\nexport const editTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst detail = displayPath(String(args?.path ?? args?.file_path ?? \"\"), context);\n\t\treturn renderBoxedToolCall(theme, \"Edit\", [`${theme.fg(\"dim\", \"Path: \")}${detail}`], {\n\t\t\tisError: Boolean(context.isError),\n\t\t\tisPartial: Boolean(context.isPartial),\n\t\t\tisPending: Boolean(context.isPartial),\n\t\t});\n\t},\n\tresult(result, options, theme, context) {\n\t\t// Handle partial/streaming state\n\t\tif (options.isPartial) {\n\t\t\treturn renderBoxedToolResult(theme, () => [`${theme.fg(\"dim\", \"↳\")} ${theme.fg(\"muted\", \"Applying edit...\")}`], {\n\t\t\t\tisPartial: true,\n\t\t\t});\n\t\t}\n\n\t\t// Handle errors\n\t\tif (context.isError) {\n\t\t\tconst output = getTextOutput(result);\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"error\", stripAnsi(output).trim() || \"Error\")], {\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t\tisError: true,\n\t\t\t});\n\t\t}\n\n\t\t// Extract diff from result details\n\t\tconst details = result.details as EditResultDetails;\n\t\tconst diff = details?.diff as string | undefined;\n\n\t\tif (!diff) {\n\t\t\tconst output = stripAnsi(getTextOutput(result)).trim();\n\t\t\tconst fallback = `↳ ${output || \"Edit applied\"}`;\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", fallback)], {\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t});\n\t\t}\n\n\t\t// Resolve language for syntax highlighting\n\t\tconst message = firstText(result.content as Array<{ type: string; text?: string }>);\n\t\tconst argPath = String(context?.args?.path ?? context?.args?.file_path ?? \"\");\n\t\tconst sourcePath = details?.path ?? (argPath || extractEditedPath(message));\n\t\tconst language = sourcePath ? getLanguageFromPath(sourcePath) : undefined;\n\n\t\t// Build split-diff rows\n\t\tconst rows = buildSplitRows(diff);\n\t\tconst expanded = options.expanded;\n\t\tconst shouldHighlight =\n\t\t\tBoolean(language) && diff.length <= MAX_HIGHLIGHT_DIFF_CHARS && rows.length <= MAX_HIGHLIGHT_DIFF_ROWS;\n\n\t\t// Build summary header with diff stats and meter\n\t\tconst { additions, removals } = countDiffStats(diff);\n\t\tconst meter = renderDiffMeter(theme, additions, removals);\n\t\tconst summary =\n\t\t\t`${theme.fg(\"dim\", \"↳\")} ${theme.fg(\"muted\", \"diff\")}` +\n\t\t\t` ${theme.fg(\"toolDiffAdded\", `+${additions}`)}` +\n\t\t\t` ${theme.fg(\"toolDiffRemoved\", `-${removals}`)}` +\n\t\t\t` ${theme.fg(\"muted\", \"split\")}` +\n\t\t\t(meter ? ` ${meter}` : \"\");\n\n\t\t// Render split-diff with syntax colors for small outputs.\n\t\tconst maxRows = expanded ? 160 : 36;\n\t\tconst split = new SplitDiffComponent(theme, rows, maxRows, shouldHighlight ? language : undefined);\n\n\t\treturn renderBoxedToolResult(\n\t\t\ttheme,\n\t\t\t{\n\t\t\t\trender(width: number): string[] {\n\t\t\t\t\tconst safeWidth = Math.max(20, width);\n\t\t\t\t\tconst headerLines = new Text(summary, 0, 0).render(safeWidth);\n\t\t\t\t\treturn [...headerLines, ...split.render(safeWidth)];\n\t\t\t\t},\n\t\t\t\tinvalidate(): void {\n\t\t\t\t\tsplit.invalidate();\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t},\n\t\t);\n\t},\n};\n\nexport type { BoxedToolContext };\n","// Split-diff renderer — side-by-side diff view with syntax highlighting and\n// inline emphasis.\n\nimport { highlightCode } from \"@earendil-works/pi-coding-agent\";\nimport type { Component } from \"@earendil-works/pi-tui\";\n\nimport { stripAnsi } from \"./ansi.js\";\nimport { safeTruncateToWidth, safeVisibleWidth } from \"./render-budget.js\";\n\n// ── Types ──────────────────────────────────────────────────────────\n\ntype DiffLine = {\n\tprefix: \"+\" | \"-\" | \" \";\n\tline: string;\n\tlineNumber: string;\n};\n\ntype SplitDiffRow = {\n\tkind: \"context\" | \"changed\" | \"added\" | \"removed\";\n\tleft?: DiffLine;\n\tright?: DiffLine;\n};\n\ntype CellLineKind = \"add\" | \"remove\" | \"context\";\n\ntype DiffSpan = { start: number; end: number };\n\ntype RgbColor = { r: number; g: number; b: number };\n\n/** Structural view of the theme as used by the split-diff renderer. */\nexport interface SplitDiffTheme {\n\tfg(color: string, text: string): string;\n\tgetBgAnsi?(color: string): string;\n\tgetFgAnsi?(color: string): string;\n}\n\ntype DiffPalette = {\n\taddRowBgAnsi: string;\n\tremoveRowBgAnsi: string;\n\taddEmphasisBgAnsi: string;\n\tremoveEmphasisBgAnsi: string;\n};\n\n// ── Constants ──────────────────────────────────────────────────────\n\nconst ESC = \"\\x1b\";\nconst BG_ANSI_PATTERN = new RegExp(`${ESC}\\\\[(?:4\\\\d|10\\\\d|48;5;\\\\d{1,3}|48;2;\\\\d{1,3};\\\\d{1,3};\\\\d{1,3}|49)m`, \"g\");\nconst CONTROL_CHARS = \"\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F\";\n\nconst ADD_ROW_BACKGROUND_MIX_RATIO = 0.24;\nconst REMOVE_ROW_BACKGROUND_MIX_RATIO = 0.12;\nconst ADD_INLINE_EMPHASIS_MIX_RATIO = 0.44;\nconst REMOVE_INLINE_EMPHASIS_MIX_RATIO = 0.26;\n\n// ── ANSI color utilities (diff-specific) ───────────────────────────\n\nfunction ansi256ToRgb(code: number): RgbColor {\n\tif (code <= 15) {\n\t\tconst base16: RgbColor[] = [\n\t\t\t{ r: 0, g: 0, b: 0 },\n\t\t\t{ r: 128, g: 0, b: 0 },\n\t\t\t{ r: 0, g: 128, b: 0 },\n\t\t\t{ r: 128, g: 128, b: 0 },\n\t\t\t{ r: 0, g: 0, b: 128 },\n\t\t\t{ r: 128, g: 0, b: 128 },\n\t\t\t{ r: 0, g: 128, b: 128 },\n\t\t\t{ r: 192, g: 192, b: 192 },\n\t\t\t{ r: 128, g: 128, b: 128 },\n\t\t\t{ r: 255, g: 0, b: 0 },\n\t\t\t{ r: 0, g: 255, b: 0 },\n\t\t\t{ r: 255, g: 255, b: 0 },\n\t\t\t{ r: 0, g: 0, b: 255 },\n\t\t\t{ r: 255, g: 0, b: 255 },\n\t\t\t{ r: 0, g: 255, b: 255 },\n\t\t\t{ r: 255, g: 255, b: 255 },\n\t\t];\n\t\treturn base16[code] ?? { r: 255, g: 255, b: 255 };\n\t}\n\tif (code >= 232) {\n\t\tconst value = Math.max(0, Math.min(255, 8 + (code - 232) * 10));\n\t\treturn { r: value, g: value, b: value };\n\t}\n\tconst cube = code - 16;\n\tconst levels = [0, 95, 135, 175, 215, 255];\n\tconst blue = cube % 6;\n\tconst green = Math.floor(cube / 6) % 6;\n\tconst red = Math.floor(cube / 36) % 6;\n\treturn {\n\t\tr: levels[red] ?? 0,\n\t\tg: levels[green] ?? 0,\n\t\tb: levels[blue] ?? 0,\n\t};\n}\n\nfunction parseAnsiColorCode(ansi: string | undefined): RgbColor | null {\n\tif (!ansi) return null;\n\tconst rgbMatch = new RegExp(`${ESC}\\\\[(?:3|4)8;2;(\\\\d{1,3});(\\\\d{1,3});(\\\\d{1,3})m`).exec(ansi);\n\tif (rgbMatch) {\n\t\tconst r = Number.parseInt(rgbMatch[1] ?? \"0\", 10);\n\t\tconst g = Number.parseInt(rgbMatch[2] ?? \"0\", 10);\n\t\tconst b = Number.parseInt(rgbMatch[3] ?? \"0\", 10);\n\t\treturn { r, g, b };\n\t}\n\tconst bitMatch = new RegExp(`${ESC}\\\\[(?:3|4)8;5;(\\\\d{1,3})m`).exec(ansi);\n\tif (bitMatch) {\n\t\tconst code = Number.parseInt(bitMatch[1] ?? \"0\", 10);\n\t\treturn ansi256ToRgb(code);\n\t}\n\treturn null;\n}\n\nfunction rgbToBgAnsi(color: RgbColor): string {\n\tconst r = Math.max(0, Math.min(255, Math.round(color.r)));\n\tconst g = Math.max(0, Math.min(255, Math.round(color.g)));\n\tconst b = Math.max(0, Math.min(255, Math.round(color.b)));\n\treturn `\\x1b[48;2;${r};${g};${b}m`;\n}\n\nfunction mixRgb(base: RgbColor, tint: RgbColor, ratio: number): RgbColor {\n\tconst clamped = Math.max(0, Math.min(1, ratio));\n\treturn {\n\t\tr: base.r * (1 - clamped) + tint.r * clamped,\n\t\tg: base.g * (1 - clamped) + tint.g * clamped,\n\t\tb: base.b * (1 - clamped) + tint.b * clamped,\n\t};\n}\n\nfunction resolveDiffPalette(theme: SplitDiffTheme): DiffPalette {\n\tconst baseBg = parseAnsiColorCode(theme.getBgAnsi?.(\"toolSuccessBg\")) ??\n\t\tparseAnsiColorCode(theme.getBgAnsi?.(\"toolPendingBg\")) ?? { r: 32, g: 35, b: 42 };\n\tconst addFg = parseAnsiColorCode(theme.getFgAnsi?.(\"toolDiffAdded\")) ?? { r: 88, g: 173, b: 88 };\n\tconst removeFg = parseAnsiColorCode(theme.getFgAnsi?.(\"toolDiffRemoved\")) ?? { r: 196, g: 98, b: 98 };\n\n\tconst addRowBg = mixRgb(baseBg, addFg, ADD_ROW_BACKGROUND_MIX_RATIO);\n\tconst removeRowBg = mixRgb(baseBg, removeFg, REMOVE_ROW_BACKGROUND_MIX_RATIO);\n\tconst addEmphasisBg = mixRgb(baseBg, addFg, ADD_INLINE_EMPHASIS_MIX_RATIO);\n\tconst removeEmphasisBg = mixRgb(baseBg, removeFg, REMOVE_INLINE_EMPHASIS_MIX_RATIO);\n\n\treturn {\n\t\taddRowBgAnsi: rgbToBgAnsi(addRowBg),\n\t\tremoveRowBgAnsi: rgbToBgAnsi(removeRowBg),\n\t\taddEmphasisBgAnsi: rgbToBgAnsi(addEmphasisBg),\n\t\tremoveEmphasisBgAnsi: rgbToBgAnsi(removeEmphasisBg),\n\t};\n}\n\n// ── ANSI background helpers ────────────────────────────────────────\n\nfunction keepBackgroundAcrossResets(text: string, rowBgAnsi: string): string {\n\tif (!text) return text;\n\n\treturn text.replace(new RegExp(`${ESC}\\\\[([0-9;]*)m`, \"g\"), (sequence, rawCodes) => {\n\t\tconst split = String(rawCodes ?? \"\")\n\t\t\t.split(\";\")\n\t\t\t.filter(Boolean);\n\t\tconst codes = split.length > 0 ? split : [\"0\"]; // ESC[m == reset\n\t\tconst hasGlobalReset = codes.includes(\"0\");\n\t\tconst hasBgReset = codes.includes(\"49\");\n\t\tif (!hasGlobalReset && !hasBgReset) return sequence;\n\n\t\tconst rebuiltCodes = codes.filter((code: string) => code !== \"49\");\n\t\tconst rebuilt = rebuiltCodes.length > 0 ? `\\x1b[${rebuiltCodes.join(\";\")}m` : \"\";\n\t\treturn `${rebuilt}${rowBgAnsi}`;\n\t});\n}\n\nfunction applyBackgroundToVisibleRange(\n\tansiText: string,\n\tstart: number,\n\tend: number,\n\tbackgroundAnsi: string,\n\trestoreBackgroundAnsi: string,\n): string {\n\tif (!ansiText || start >= end || end <= 0) return ansiText;\n\n\tlet output = \"\";\n\tlet visibleIndex = 0;\n\tlet index = 0;\n\tlet inRange = false;\n\n\twhile (index < ansiText.length) {\n\t\tif (ansiText[index] === \"\\x1b\") {\n\t\t\tconst sequenceEnd = ansiText.indexOf(\"m\", index);\n\t\t\tif (sequenceEnd !== -1) {\n\t\t\t\toutput += ansiText.slice(index, sequenceEnd + 1);\n\t\t\t\tindex = sequenceEnd + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (visibleIndex === start && !inRange) {\n\t\t\toutput += backgroundAnsi;\n\t\t\tinRange = true;\n\t\t}\n\t\tif (visibleIndex === end && inRange) {\n\t\t\toutput += restoreBackgroundAnsi;\n\t\t\tinRange = false;\n\t\t}\n\n\t\toutput += ansiText[index] ?? \"\";\n\t\tvisibleIndex++;\n\t\tindex++;\n\t}\n\n\tif (inRange) output += restoreBackgroundAnsi;\n\treturn output;\n}\n\n// ── Text utilities ─────────────────────────────────────────────────\n\nfunction sanitizeSingleLineText(value: string): string {\n\treturn value\n\t\t.replace(/\\r/g, \"\")\n\t\t.replace(/\\n/g, \"\")\n\t\t.replace(new RegExp(`[${CONTROL_CHARS}]`, \"g\"), \"\");\n}\n\nfunction stripInlineBreaksPreserveAnsi(value: string): string {\n\treturn value.replace(/\\r/g, \"\").replace(/\\n/g, \"\");\n}\n\nfunction padRight(value: string, width: number): string {\n\tconst visual = safeVisibleWidth(stripAnsi(value));\n\tif (visual >= width) return value;\n\treturn value + \" \".repeat(width - visual);\n}\n\nfunction fitToWidth(value: string, width: number): string {\n\treturn padRight(safeTruncateToWidth(value, width), width);\n}\n\nfunction padRenderedLineWidth(line: string, width: number): string {\n\tconst safeWidth = Math.max(1, width);\n\tconst current = safeVisibleWidth(stripAnsi(line));\n\tif (current >= safeWidth) return line;\n\treturn line + \" \".repeat(safeWidth - current);\n}\n\nfunction wrapPlainText(text: string, width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tconst safeText = sanitizeSingleLineText(text);\n\tif (!safeText) return [\"\"];\n\n\tconst lines: string[] = [];\n\tlet cursor = 0;\n\n\twhile (cursor < safeText.length) {\n\t\tconst remaining = safeText.length - cursor;\n\t\tif (remaining <= safeWidth) {\n\t\t\tlines.push(safeText.slice(cursor));\n\t\t\tbreak;\n\t\t}\n\n\t\tconst window = safeText.slice(cursor, cursor + safeWidth);\n\t\tconst breakOnSpace = window.lastIndexOf(\" \");\n\n\t\tif (breakOnSpace > 0) {\n\t\t\tconst next = breakOnSpace + 1; // keep the space so offsets stay stable for inline diff spans\n\t\t\tlines.push(safeText.slice(cursor, cursor + next));\n\t\t\tcursor += next;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Fallback for long uninterrupted tokens (paths, hashes, etc.)\n\t\tlines.push(window);\n\t\tcursor += safeWidth;\n\t}\n\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\n// ── Diff parsing ───────────────────────────────────────────────────\n\nfunction parseLineNumber(value: string): number | undefined {\n\tconst trimmed = value.trim();\n\tif (!/^\\d+$/.test(trimmed)) return undefined;\n\tconst parsed = Number.parseInt(trimmed, 10);\n\treturn Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction makeDiffLine(prefix: \"+\" | \"-\" | \" \", lineNumber: string | number | undefined, line: string): DiffLine {\n\treturn {\n\t\tprefix,\n\t\tlineNumber: lineNumber === undefined ? \"\" : String(lineNumber),\n\t\tline,\n\t};\n}\n\nfunction parseDiffLine(rawLine: string): DiffLine | undefined {\n\tconst match = rawLine.match(/^([+\\- ])\\s?(.*)$/);\n\tif (!match) return undefined;\n\tconst [, prefix, rest = \"\"] = match;\n\tif (prefix !== \"+\" && prefix !== \"-\" && prefix !== \" \") return undefined;\n\n\tconst gutterMatch = rest.match(/^(\\d+)\\s(.*)$/);\n\tconst lineNumber = gutterMatch?.[1] ?? \"\";\n\tconst line = gutterMatch?.[2] ?? rest;\n\tconst cleanLineNumber = sanitizeSingleLineText(lineNumber);\n\tconst cleanLine = sanitizeSingleLineText(line).replace(/\\t/g, \" \");\n\treturn { prefix, lineNumber: cleanLineNumber, line: cleanLine };\n}\n\nfunction computeInlineDiffSpans(leftLine: string, rightLine: string): { left: DiffSpan[]; right: DiffSpan[] } {\n\tif (leftLine === rightLine) return { left: [], right: [] };\n\tlet start = 0;\n\tconst minLen = Math.min(leftLine.length, rightLine.length);\n\twhile (start < minLen && leftLine[start] === rightLine[start]) start++;\n\n\tlet leftEnd = leftLine.length;\n\tlet rightEnd = rightLine.length;\n\twhile (leftEnd > start && rightEnd > start && leftLine[leftEnd - 1] === rightLine[rightEnd - 1]) {\n\t\tleftEnd--;\n\t\trightEnd--;\n\t}\n\n\tconst leftSpan = leftEnd > start ? [{ start, end: leftEnd }] : [];\n\tconst rightSpan = rightEnd > start ? [{ start, end: rightEnd }] : [];\n\treturn { left: leftSpan, right: rightSpan };\n}\n\n// ── Exported helpers ───────────────────────────────────────────────\n\nexport function buildSplitRows(diff: string): SplitDiffRow[] {\n\tconst rows: SplitDiffRow[] = [];\n\tconst pendingLeft: DiffLine[] = [];\n\tconst pendingRight: DiffLine[] = [];\n\tlet oldCursor: number | undefined;\n\tlet newCursor: number | undefined;\n\n\tconst flushPending = () => {\n\t\twhile (pendingLeft.length > 0 || pendingRight.length > 0) {\n\t\t\tconst left = pendingLeft.shift();\n\t\t\tconst right = pendingRight.shift();\n\t\t\tif (left && right) rows.push({ kind: \"changed\", left, right });\n\t\t\telse if (left) rows.push({ kind: \"removed\", left });\n\t\t\telse if (right) rows.push({ kind: \"added\", right });\n\t\t}\n\t};\n\n\tfor (const rawLine of diff.split(\"\\n\")) {\n\t\tconst parsed = parseDiffLine(rawLine);\n\t\tif (!parsed) continue;\n\n\t\tconst parsedNum = parseLineNumber(parsed.lineNumber);\n\t\tif (parsed.prefix === \"-\") {\n\t\t\tconst oldNum = parsedNum ?? oldCursor;\n\t\t\tif (oldNum !== undefined) oldCursor = oldNum + 1;\n\t\t\tpendingLeft.push(makeDiffLine(\"-\", oldNum, parsed.line));\n\t\t\tcontinue;\n\t\t}\n\t\tif (parsed.prefix === \"+\") {\n\t\t\tconst newNum = parsedNum ?? newCursor;\n\t\t\tif (newNum !== undefined) newCursor = newNum + 1;\n\t\t\tpendingRight.push(makeDiffLine(\"+\", newNum, parsed.line));\n\t\t\tcontinue;\n\t\t}\n\n\t\tflushPending();\n\n\t\tconst oldNum = parsedNum ?? oldCursor;\n\t\tconst newNum = newCursor ?? oldNum;\n\t\tif (oldNum !== undefined) oldCursor = oldNum + 1;\n\t\tif (newNum !== undefined) newCursor = newNum + 1;\n\n\t\trows.push({\n\t\t\tkind: \"context\",\n\t\t\tleft: makeDiffLine(\" \", oldNum, parsed.line),\n\t\t\tright: makeDiffLine(\" \", newNum, parsed.line),\n\t\t});\n\t}\n\n\tflushPending();\n\treturn rows;\n}\n\nexport function countDiffStats(diff: string): { additions: number; removals: number } {\n\tlet additions = 0;\n\tlet removals = 0;\n\tfor (const line of diff.split(\"\\n\")) {\n\t\tif (line.startsWith(\"+++\") || line.startsWith(\"---\")) continue;\n\t\tif (line.startsWith(\"+\")) additions += 1;\n\t\tif (line.startsWith(\"-\")) removals += 1;\n\t}\n\treturn { additions, removals };\n}\n\nexport function renderDiffMeter(theme: SplitDiffTheme, additions: number, removals: number, width = 20): string {\n\tconst total = additions + removals;\n\tif (total <= 0) return \"\";\n\n\tconst addBlocks = Math.round((additions / total) * width);\n\tconst removeBlocks = Math.max(0, width - addBlocks);\n\tconst addBar = addBlocks > 0 ? theme.fg(\"toolDiffAdded\", \"━\".repeat(addBlocks)) : \"\";\n\tconst removeBar = removeBlocks > 0 ? theme.fg(\"toolDiffRemoved\", \"━\".repeat(removeBlocks)) : \"\";\n\treturn `${theme.fg(\"dim\", \"[\")}${addBar}${removeBar}${theme.fg(\"dim\", \"]\")}`;\n}\n\nexport function extractEditedPath(message: string): string | undefined {\n\tconst m = message.match(/Successfully replaced (?:text|\\d+ block\\(s\\)|lines L\\d+-\\d+) in (.+)\\.$/);\n\treturn m?.[1];\n}\n\nexport function firstText(content: Array<{ type: string; text?: string }>): string {\n\tfor (const part of content) {\n\t\tif (part.type === \"text\" && typeof part.text === \"string\") {\n\t\t\treturn part.text;\n\t\t}\n\t}\n\treturn \"\";\n}\n\n// ── SplitDiffComponent ─────────────────────────────────────────────\n\nexport class SplitDiffComponent implements Component {\n\tprivate cacheWidth: number | undefined;\n\tprivate cacheLines: string[] | undefined;\n\tprivate readonly lineNumberWidth: number;\n\tprivate readonly highlightCache = new Map<string, string>();\n\tprivate readonly inlineHighlights = new WeakMap<DiffLine, DiffSpan[]>();\n\tprivate readonly palette: DiffPalette;\n\tprivate readonly containerBgAnsi: string;\n\n\tconstructor(\n\t\tprivate readonly theme: SplitDiffTheme,\n\t\tprivate readonly rows: SplitDiffRow[],\n\t\tprivate readonly maxRows: number,\n\t\tprivate readonly language?: string,\n\t) {\n\t\tlet maxDigits = 3;\n\t\tfor (const row of rows) {\n\t\t\tconst leftDigits = row.left?.lineNumber.trim().length ?? 0;\n\t\t\tconst rightDigits = row.right?.lineNumber.trim().length ?? 0;\n\t\t\tmaxDigits = Math.max(maxDigits, leftDigits, rightDigits);\n\n\t\t\tif (row.kind === \"changed\" && row.left && row.right) {\n\t\t\t\tconst spans = computeInlineDiffSpans(row.left.line, row.right.line);\n\t\t\t\tif (spans.left.length > 0) this.inlineHighlights.set(row.left, spans.left);\n\t\t\t\tif (spans.right.length > 0) this.inlineHighlights.set(row.right, spans.right);\n\t\t\t}\n\t\t}\n\t\tthis.lineNumberWidth = maxDigits;\n\t\tthis.palette = resolveDiffPalette(theme);\n\t\tthis.containerBgAnsi = theme.getBgAnsi?.(\"toolSuccessBg\") ?? \"\";\n\t}\n\n\tprivate getCellLineKind(kind: SplitDiffRow[\"kind\"], side: \"left\" | \"right\"): CellLineKind {\n\t\tif (kind === \"changed\") return side === \"left\" ? \"remove\" : \"add\";\n\t\tif (kind === \"removed\" && side === \"left\") return \"remove\";\n\t\tif (kind === \"added\" && side === \"right\") return \"add\";\n\t\treturn \"context\";\n\t}\n\n\tprivate getVisualLineKind(kind: SplitDiffRow[\"kind\"], side: \"left\" | \"right\", line?: DiffLine): CellLineKind {\n\t\tconst base = this.getCellLineKind(kind, side);\n\t\tif ((kind === \"added\" || kind === \"removed\") && (line?.line ?? \"\") === \"\") {\n\t\t\treturn \"context\";\n\t\t}\n\t\treturn base;\n\t}\n\n\tprivate getNumberColor(lineKind: CellLineKind): \"toolDiffRemoved\" | \"toolDiffAdded\" | \"dim\" {\n\t\tif (lineKind === \"remove\") return \"toolDiffRemoved\";\n\t\tif (lineKind === \"add\") return \"toolDiffAdded\";\n\t\treturn \"dim\";\n\t}\n\n\tprivate getRowBackground(lineKind: CellLineKind): string | undefined {\n\t\tif (lineKind === \"add\") return this.palette.addRowBgAnsi;\n\t\tif (lineKind === \"remove\") return this.palette.removeRowBgAnsi;\n\t\treturn undefined;\n\t}\n\n\tprivate getEmphasisBackground(lineKind: CellLineKind): string | undefined {\n\t\tif (lineKind === \"add\") return this.palette.addEmphasisBgAnsi;\n\t\tif (lineKind === \"remove\") return this.palette.removeEmphasisBgAnsi;\n\t\treturn undefined;\n\t}\n\n\tprivate getCellFillBackground(kind: SplitDiffRow[\"kind\"], side: \"left\" | \"right\"): string | undefined {\n\t\tswitch (kind) {\n\t\t\tcase \"changed\":\n\t\t\t\treturn side === \"left\" ? this.palette.removeRowBgAnsi : this.palette.addRowBgAnsi;\n\t\t\tcase \"removed\":\n\t\t\t\treturn side === \"left\" ? this.palette.removeRowBgAnsi : undefined;\n\t\t\tcase \"added\":\n\t\t\t\treturn side === \"right\" ? this.palette.addRowBgAnsi : undefined;\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate blankCell(kind: SplitDiffRow[\"kind\"], side: \"left\" | \"right\", columnWidth: number): string {\n\t\tconst lineKind = this.getCellLineKind(kind, side);\n\t\tconst markerChar = lineKind === \"add\" || lineKind === \"remove\" ? \"▌\" : \" \";\n\t\tconst markerColor =\n\t\t\tlineKind === \"add\" ? \"toolDiffAdded\" : lineKind === \"remove\" ? \"toolDiffRemoved\" : \"borderMuted\";\n\t\tconst marker = this.theme.fg(markerColor, markerChar);\n\t\tconst lineNumber = this.theme.fg(\"dim\", \" \".repeat(this.lineNumberWidth));\n\t\tconst divider = this.theme.fg(\"borderMuted\", \" │ \");\n\t\tconst prefix = `${marker} ${lineNumber}${divider}`;\n\t\tconst prefixPlain = `${markerChar} ${\" \".repeat(this.lineNumberWidth)} │ `;\n\t\tconst tailWidth = Math.max(0, columnWidth - safeVisibleWidth(prefixPlain));\n\t\tlet rendered = prefix + \" \".repeat(tailWidth);\n\n\t\tconst bg = this.getCellFillBackground(kind, side);\n\t\tif (!bg) return padRenderedLineWidth(rendered, columnWidth);\n\t\trendered = `${bg}${keepBackgroundAcrossResets(rendered, bg)}${this.containerBgAnsi}`;\n\t\treturn padRenderedLineWidth(rendered, columnWidth);\n\t}\n\n\tprivate syntaxHighlight(line: string): string {\n\t\tif (!this.language) return stripInlineBreaksPreserveAnsi(line);\n\t\tconst safeLine = sanitizeSingleLineText(line);\n\t\tconst key = `${this.language}\\n${safeLine}`;\n\t\tconst cached = this.highlightCache.get(key);\n\t\tif (cached) return cached;\n\n\t\tlet highlighted = safeLine;\n\t\ttry {\n\t\t\thighlighted = highlightCode(safeLine, this.language)[0] ?? safeLine;\n\t\t\thighlighted = stripInlineBreaksPreserveAnsi(highlighted).replace(BG_ANSI_PATTERN, \"\");\n\t\t} catch {\n\t\t\thighlighted = safeLine;\n\t\t}\n\t\tthis.highlightCache.set(key, highlighted);\n\t\treturn highlighted;\n\t}\n\n\tprivate formatCellLines(\n\t\tkind: SplitDiffRow[\"kind\"],\n\t\tside: \"left\" | \"right\",\n\t\tline: DiffLine | undefined,\n\t\tcolumnWidth: number,\n\t): string[] {\n\t\tif (!line) return [this.blankCell(kind, side, columnWidth)];\n\n\t\tconst lineKind = this.getVisualLineKind(kind, side, line);\n\t\tconst markerChar = lineKind === \"add\" || lineKind === \"remove\" ? \"▌\" : \" \";\n\t\tconst markerColor =\n\t\t\tlineKind === \"add\" ? \"toolDiffAdded\" : lineKind === \"remove\" ? \"toolDiffRemoved\" : \"borderMuted\";\n\t\tconst lineNumber = line.lineNumber.trim().padStart(this.lineNumberWidth, \" \");\n\n\t\tconst firstPrefixAnsi =\n\t\t\tthis.theme.fg(markerColor, markerChar) +\n\t\t\t\" \" +\n\t\t\tthis.theme.fg(this.getNumberColor(lineKind), lineNumber) +\n\t\t\tthis.theme.fg(\"borderMuted\", \" │ \");\n\t\tconst firstPrefixPlain = `${markerChar} ${lineNumber} │ `;\n\n\t\tconst contPrefixAnsi =\n\t\t\tthis.theme.fg(markerColor, markerChar) +\n\t\t\t\" \" +\n\t\t\tthis.theme.fg(\"dim\", \" \".repeat(this.lineNumberWidth)) +\n\t\t\tthis.theme.fg(\"borderMuted\", \" │ \");\n\t\tconst contPrefixPlain = `${markerChar} ${\" \".repeat(this.lineNumberWidth)} │ `;\n\n\t\tconst codeWidth = Math.max(1, columnWidth - safeVisibleWidth(firstPrefixPlain));\n\t\tconst rowBg = this.getRowBackground(lineKind);\n\t\tconst emphasisBg = this.getEmphasisBackground(lineKind);\n\n\t\tconst plainSegments = wrapPlainText(line.line, codeWidth);\n\t\tconst lines: string[] = [];\n\t\tconst spans = this.inlineHighlights.get(line) ?? [];\n\n\t\tlet consumed = 0;\n\t\tfor (let i = 0; i < plainSegments.length; i++) {\n\t\t\tconst prefixAnsi = i === 0 ? firstPrefixAnsi : contPrefixAnsi;\n\t\t\tconst prefixPlain = i === 0 ? firstPrefixPlain : contPrefixPlain;\n\t\t\tconst plainSegment = plainSegments[i] ?? \"\";\n\t\t\tlet segment = this.syntaxHighlight(plainSegment);\n\n\t\t\tif (spans.length > 0 && emphasisBg) {\n\t\t\t\tconst segmentStart = consumed;\n\t\t\t\tfor (let si = spans.length - 1; si >= 0; si--) {\n\t\t\t\t\tconst span = spans[si];\n\t\t\t\t\tif (!span) continue;\n\t\t\t\t\tconst localStart = Math.max(0, span.start - segmentStart);\n\t\t\t\t\tconst localEnd = Math.min(plainSegment.length, span.end - segmentStart);\n\t\t\t\t\tif (localEnd > localStart) {\n\t\t\t\t\t\tsegment = applyBackgroundToVisibleRange(\n\t\t\t\t\t\t\tsegment,\n\t\t\t\t\t\t\tlocalStart,\n\t\t\t\t\t\t\tlocalEnd,\n\t\t\t\t\t\t\temphasisBg,\n\t\t\t\t\t\t\trowBg ?? this.containerBgAnsi,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsegment = fitToWidth(segment, codeWidth);\n\t\t\tlet rendered = prefixAnsi + segment;\n\n\t\t\t// Defensive pad if prefix widths diverge because of unicode widths\n\t\t\tconst expectedWidth = safeVisibleWidth(prefixPlain) + codeWidth;\n\t\t\tconst currentWidth = safeVisibleWidth(stripAnsi(rendered));\n\t\t\tif (currentWidth < expectedWidth) {\n\t\t\t\trendered += \" \".repeat(expectedWidth - currentWidth);\n\t\t\t}\n\n\t\t\tif (rowBg) {\n\t\t\t\trendered = `${rowBg}${keepBackgroundAcrossResets(rendered, rowBg)}${this.containerBgAnsi}`;\n\t\t\t}\n\t\t\tlines.push(padRenderedLineWidth(rendered, columnWidth));\n\t\t\tconsumed += plainSegment.length;\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (this.cacheWidth === width && this.cacheLines) return this.cacheLines;\n\n\t\tconst safeWidth = Math.max(20, width);\n\t\tconst columnSeparator = this.theme.fg(\"borderMuted\", \" │ \");\n\t\tconst separatorWidth = safeVisibleWidth(stripAnsi(columnSeparator));\n\t\tconst leftWidth = Math.max(20, Math.floor((safeWidth - separatorWidth) / 2));\n\t\tconst rightWidth = Math.max(20, safeWidth - separatorWidth - leftWidth);\n\n\t\tconst formatBorderCell = (columnWidth: number, junction: string): string => {\n\t\t\tconst safeColumnWidth = Math.max(1, columnWidth);\n\t\t\tconst chars = \"─\".repeat(safeColumnWidth).split(\"\");\n\t\t\tconst dividerIndex = this.lineNumberWidth + 3;\n\t\t\tif (dividerIndex >= 0 && dividerIndex < chars.length) {\n\t\t\t\tchars[dividerIndex] = junction;\n\t\t\t}\n\t\t\treturn this.theme.fg(\"borderMuted\", chars.join(\"\"));\n\t\t};\n\n\t\tconst formatHeaderCell = (label: string, columnWidth: number): string => {\n\t\t\t// Keep marker+space columns, then place label inside the line-number column.\n\t\t\tconst markerPad = \" \";\n\t\t\tconst lineNumberLabel = fitToWidth(label, this.lineNumberWidth);\n\t\t\tconst prefixAnsi =\n\t\t\t\tthis.theme.fg(\"borderMuted\", markerPad) +\n\t\t\t\tthis.theme.fg(\"dim\", lineNumberLabel) +\n\t\t\t\tthis.theme.fg(\"borderMuted\", \" │ \");\n\t\t\tconst prefixPlain = `${markerPad}${stripAnsi(lineNumberLabel)} │ `;\n\t\t\tconst codeWidth = Math.max(0, columnWidth - safeVisibleWidth(prefixPlain));\n\t\t\treturn padRenderedLineWidth(prefixAnsi + \" \".repeat(codeWidth), columnWidth);\n\t\t};\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(\n\t\t\tpadRenderedLineWidth(\n\t\t\t\tformatBorderCell(leftWidth, \"┬\") + this.theme.fg(\"borderMuted\", \"─┬─\") + formatBorderCell(rightWidth, \"┬\"),\n\t\t\t\tsafeWidth,\n\t\t\t),\n\t\t);\n\t\tlines.push(\n\t\t\tpadRenderedLineWidth(\n\t\t\t\tformatHeaderCell(\"old\", leftWidth) + columnSeparator + formatHeaderCell(\"new\", rightWidth),\n\t\t\t\tsafeWidth,\n\t\t\t),\n\t\t);\n\n\t\tfor (const row of this.rows.slice(0, this.maxRows)) {\n\t\t\tconst leftCellLines = this.formatCellLines(row.kind, \"left\", row.left, leftWidth);\n\t\t\tconst rightCellLines = this.formatCellLines(row.kind, \"right\", row.right, rightWidth);\n\t\t\tconst rowHeight = Math.max(leftCellLines.length, rightCellLines.length);\n\n\t\t\tfor (let i = 0; i < rowHeight; i++) {\n\t\t\t\tconst leftFallbackKind: SplitDiffRow[\"kind\"] = row.kind === \"changed\" ? \"context\" : row.kind;\n\t\t\t\tconst rightFallbackKind: SplitDiffRow[\"kind\"] = row.kind === \"changed\" ? \"context\" : row.kind;\n\t\t\t\tconst leftCell = leftCellLines[i] ?? this.blankCell(leftFallbackKind, \"left\", leftWidth);\n\t\t\t\tconst rightCell = rightCellLines[i] ?? this.blankCell(rightFallbackKind, \"right\", rightWidth);\n\t\t\t\tconst joined = padRenderedLineWidth(leftCell + columnSeparator + rightCell, safeWidth);\n\t\t\t\tlines.push(joined);\n\t\t\t}\n\t\t}\n\n\t\tif (this.rows.length > this.maxRows) {\n\t\t\tlines.push(this.theme.fg(\"muted\", `... ${this.rows.length - this.maxRows} more rows`));\n\t\t}\n\n\t\tlines.push(\n\t\t\tpadRenderedLineWidth(\n\t\t\t\tformatBorderCell(leftWidth, \"┴\") + this.theme.fg(\"borderMuted\", \"─┴─\") + formatBorderCell(rightWidth, \"┴\"),\n\t\t\t\tsafeWidth,\n\t\t\t),\n\t\t);\n\t\tthis.cacheWidth = width;\n\t\tthis.cacheLines = lines;\n\t\treturn lines;\n\t}\n\n\tinvalidate(): void {\n\t\tthis.cacheWidth = undefined;\n\t\tthis.cacheLines = undefined;\n\t\tthis.highlightCache.clear();\n\t}\n}\n","// Boxed fallback for tools without a dedicated renderer.\n// (component side only; no ToolExecutionComponent prototype patching).\n\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { BoxTheme, MetricResultLike } from \"../../../shared/box.js\";\nimport {\n\tformatBoxedFooter,\n\tformatToolName,\n\tformatToolParamLines,\n\tgetTextOutput,\n\trenderBoxedToolCall,\n\trenderBoxedToolResult,\n\trenderLines,\n} from \"../../../shared/box.js\";\nimport { getStateElapsedMs, getToolsRenderConfig } from \"./session-config.js\";\nimport { type BoxedToolContext, noteExecutionStart } from \"./shared.js\";\n\nconst MAX_FALLBACK_PREVIEW_LINES = 10;\n\nexport function renderFallbackCall(\n\ttoolName: unknown,\n\targs: Record<string, unknown>,\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n): Component {\n\tnoteExecutionStart(context);\n\treturn renderBoxedToolCall(theme, formatToolName(String(toolName ?? \"Tool\")), formatToolParamLines(args, theme), {\n\t\tisError: Boolean(context.isError),\n\t\tisPartial: Boolean(context.isPartial),\n\t\tisPending: Boolean(context.isPartial),\n\t});\n}\n\nexport function renderFallbackResult(\n\t_toolName: unknown,\n\tresult: MetricResultLike,\n\toptions: { expanded: boolean; isPartial: boolean },\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n): Component {\n\tconst isError = Boolean(context.isError);\n\tconst expanded = Boolean(options.expanded);\n\tconst maxLines = expanded ? getToolsRenderConfig().maxExpandedLines : MAX_FALLBACK_PREVIEW_LINES;\n\tconst output = getTextOutput(result);\n\tconst elapsedMs = getStateElapsedMs(context.state);\n\n\treturn renderBoxedToolResult(\n\t\ttheme,\n\t\t(contentWidth) => {\n\t\t\tconst body = renderLines(theme, output, options, {\n\t\t\t\tmaxLines,\n\t\t\t\tcolor: isError ? \"error\" : \"toolOutput\",\n\t\t\t\twidth: contentWidth,\n\t\t\t});\n\t\t\treturn body ? body.split(\"\\n\") : [];\n\t\t},\n\t\t{\n\t\t\tfooterLines: [formatBoxedFooter(theme, result, [], elapsedMs)],\n\t\t\trenderLineBudget: maxLines,\n\t\t\tisError,\n\t\t\tisPartial: Boolean(options.isPartial),\n\t\t},\n\t);\n}\n\n// Re-exported for callers that need the tool-name label normalization.\nexport { formatToolName };\n","// Boxed find tool renderer.\n\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport {\n\tboxedToolWidthKey,\n\tcountLines,\n\tgetTextOutput,\n\trenderBoxedToolResult,\n\tshortenPath,\n\tstripTrailingNotice,\n} from \"../../../shared/box.js\";\nimport {\n\ttype BoxedToolDefinition,\n\tclearFooterState,\n\tcompactCall,\n\tcompactFooterWithState,\n\tnoteExecutionStart,\n\tresultFooterLines,\n\ttruncationOutputLines,\n} from \"./shared.js\";\n\nfunction queryDetail(pattern: string, rawPath: string): string {\n\tconst displayPath = String(rawPath ?? \".\");\n\tconst path = displayPath === \".\" || displayPath === \"\" ? \"current directory\" : shortenPath(displayPath);\n\treturn pattern ? `${pattern} in ${path}` : path;\n}\n\nexport const findTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst detail = queryDetail(String(args?.pattern ?? \"\"), String(args?.path ?? \".\"));\n\t\treturn compactCall(theme, \"Find\", `${theme.fg(\"dim\", \"Query: \")}${detail}`, {\n\t\t\tdetailKey: detail,\n\t\t\tcontext,\n\t\t});\n\t},\n\tresult(result, options, theme, context) {\n\t\tclearFooterState(context);\n\t\tconst output = stripAnsi(getTextOutput(result)).trimEnd();\n\t\tconst detail = queryDetail(String(context?.args?.pattern ?? \"\"), String(context?.args?.path ?? \".\"));\n\t\tconst widthKey = boxedToolWidthKey(\"Find\", detail);\n\n\t\tif (context.isError) {\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"error\", output || \"Error\")], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t\tisError: true,\n\t\t\t});\n\t\t}\n\n\t\tif (!options.expanded) return compactFooterWithState(theme, result, context);\n\n\t\tlet fileCount = 0;\n\t\tif (output && output !== \"No files found matching pattern\") {\n\t\t\tconst stripped = stripTrailingNotice(output);\n\t\t\tfileCount = truncationOutputLines(result) ?? countLines(stripped);\n\t\t}\n\n\t\tconst summary = `↳ Found ${fileCount} ${fileCount === 1 ? \"file\" : \"files\"}.`;\n\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", summary)], {\n\t\t\twidthKey,\n\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t});\n\t},\n};\n","// Boxed grep/search tool renderer.\n\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport {\n\tboxedToolWidthKey,\n\tcountLines,\n\tgetTextOutput,\n\trenderBoxedToolResult,\n\trenderLines,\n\tshortenPath,\n\tstripTrailingNotice,\n} from \"../../../shared/box.js\";\nimport { getToolsRenderConfig } from \"./session-config.js\";\nimport {\n\ttype BoxedToolDefinition,\n\tclearFooterState,\n\tcompactCall,\n\tcompactFooterWithState,\n\tmatchLimitReached,\n\tnoteExecutionStart,\n\tresultFooterLines,\n} from \"./shared.js\";\n\nconst MAX_GREP_PREVIEW_LINES = 10;\n\nfunction queryDetail(pattern: string, rawPath: string): string {\n\tconst displayPath = String(rawPath ?? \".\");\n\tconst path = displayPath === \".\" || displayPath === \"\" ? \"current directory\" : shortenPath(displayPath);\n\treturn pattern ? `/${pattern}/ in ${path}` : path;\n}\n\nexport const grepTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst detail = queryDetail(String(args?.pattern ?? \"\"), String(args?.path ?? \".\"));\n\t\treturn compactCall(theme, \"Search\", `${theme.fg(\"dim\", \"Query: \")}${detail}`, {\n\t\t\tdetailKey: detail,\n\t\t\tcontext,\n\t\t});\n\t},\n\tresult(result, options, theme, context) {\n\t\tclearFooterState(context);\n\t\tconst output = stripAnsi(getTextOutput(result)).trimEnd();\n\t\tconst stripped = stripTrailingNotice(output);\n\t\tconst detail = queryDetail(String(context?.args?.pattern ?? \"\"), String(context?.args?.path ?? \".\"));\n\t\tconst widthKey = boxedToolWidthKey(\"Search\", detail);\n\t\tconst cfg = getToolsRenderConfig();\n\n\t\tif (context.isError) {\n\t\t\treturn renderBoxedToolResult(\n\t\t\t\ttheme,\n\t\t\t\t(width) => {\n\t\t\t\t\tconst body = renderLines(theme, stripped || output || \"Error\", options, {\n\t\t\t\t\t\tmaxLines: MAX_GREP_PREVIEW_LINES,\n\t\t\t\t\t\tcolor: \"error\",\n\t\t\t\t\t\twidth,\n\t\t\t\t\t});\n\t\t\t\t\treturn body ? body.split(\"\\n\") : [];\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\twidthKey,\n\t\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t\t\tisError: true,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (!options.expanded) return compactFooterWithState(theme, result, context);\n\n\t\tlet matchCount = 0;\n\t\tif (stripped && stripped !== \"No matches found\") {\n\t\t\tconst lines = stripped.split(\"\\n\");\n\t\t\tmatchCount = lines.filter((line) => /:\\d+:/.test(line)).length;\n\n\t\t\tif (matchCount === 0) {\n\t\t\t\tmatchCount = countLines(stripped);\n\t\t\t}\n\n\t\t\tif (matchLimitReached(result) !== undefined) {\n\t\t\t\tmatchCount = Math.max(matchCount, matchLimitReached(result) as number);\n\t\t\t}\n\t\t}\n\n\t\tconst summary = theme.fg(\"dim\", `↳ Found ${matchCount} ${matchCount === 1 ? \"match\" : \"matches\"}.`);\n\t\tif (!stripped || stripped === \"No matches found\") {\n\t\t\treturn renderBoxedToolResult(theme, () => [summary], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t});\n\t\t}\n\n\t\treturn renderBoxedToolResult(\n\t\t\ttheme,\n\t\t\t(width) => {\n\t\t\t\tconst body = renderLines(theme, stripped, options, {\n\t\t\t\t\tmaxLines: options.expanded ? cfg.maxExpandedLines : MAX_GREP_PREVIEW_LINES,\n\t\t\t\t\tcolor: \"toolOutput\",\n\t\t\t\t\twidth,\n\t\t\t\t});\n\t\t\t\treturn [summary, ...(body ? body.split(\"\\n\") : [])];\n\t\t\t},\n\t\t\t{\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t},\n\t\t);\n\t},\n};\n","// Boxed ls tool renderer.\n\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport {\n\tboxedToolWidthKey,\n\tcountLines,\n\tgetTextOutput,\n\trenderBoxedToolResult,\n\tshortenPath,\n\tstripTrailingNotice,\n} from \"../../../shared/box.js\";\nimport {\n\ttype BoxedToolDefinition,\n\tclearFooterState,\n\tcompactCall,\n\tcompactFooterWithState,\n\tnoteExecutionStart,\n\tresultFooterLines,\n\ttruncationOutputLines,\n} from \"./shared.js\";\n\nfunction displayPath(rawPath: string): string {\n\tconst path = String(rawPath ?? \".\");\n\tif (path === \".\" || path === \"\") return \"current directory\";\n\treturn shortenPath(path);\n}\n\nexport const lsTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst detail = displayPath(String(args?.path ?? \".\"));\n\t\treturn compactCall(theme, \"List\", `${theme.fg(\"dim\", \"Path: \")}${detail}`, {\n\t\t\tdetailKey: detail,\n\t\t\tcontext,\n\t\t});\n\t},\n\tresult(result, options, theme, context) {\n\t\tclearFooterState(context);\n\t\tconst output = stripAnsi(getTextOutput(result)).trimEnd();\n\t\tconst detail = displayPath(String(context?.args?.path ?? \".\"));\n\t\tconst widthKey = boxedToolWidthKey(\"List\", detail);\n\n\t\tif (context.isError) {\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"error\", output || \"Error\")], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t\tisError: true,\n\t\t\t});\n\t\t}\n\n\t\tif (!options.expanded) return compactFooterWithState(theme, result, context);\n\n\t\tlet itemCount = 0;\n\t\tif (output && output !== \"(empty directory)\") {\n\t\t\tconst stripped = stripTrailingNotice(output);\n\t\t\titemCount = truncationOutputLines(result) ?? countLines(stripped);\n\t\t}\n\n\t\tconst summary = `↳ Listed ${itemCount} ${itemCount === 1 ? \"item\" : \"items\"}.`;\n\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", summary)], {\n\t\t\twidthKey,\n\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t});\n\t},\n};\n","// Boxed quick-edit / substitute-edit / target-edit renderer.\n\nimport { getLanguageFromPath } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport type { BoxTheme } from \"../../../shared/box.js\";\nimport {\n\tformatBoxedFooterFromValues,\n\tgetTextOutput,\n\trenderBoxedToolCall,\n\trenderBoxedToolResult,\n} from \"../../../shared/box.js\";\nimport { buildSplitRows, countDiffStats, renderDiffMeter, SplitDiffComponent } from \"../../../shared/split-diff.js\";\nimport { getStateElapsedMs } from \"./session-config.js\";\nimport { type BoxedToolContext, type BoxedToolDefinition, displayPath, noteExecutionStart } from \"./shared.js\";\n\nconst MAX_HIGHLIGHT_DIFF_CHARS = 12000;\nconst MAX_HIGHLIGHT_DIFF_ROWS = 120;\n\ninterface QuickEditToolConfig {\n\ttoolLabel: string;\n\tapplyingLabel: string;\n\tfallbackLabel: string;\n}\n\nconst QUICK_EDIT_TOOLS: Readonly<Record<string, QuickEditToolConfig>> = {\n\tquick_edit: {\n\t\ttoolLabel: \"Quick Edit\",\n\t\tapplyingLabel: \"quick-edit\",\n\t\tfallbackLabel: \"Quick edit applied\",\n\t},\n\tsubstitute_edit: {\n\t\ttoolLabel: \"Substitute Edit\",\n\t\tapplyingLabel: \"substitute-edit\",\n\t\tfallbackLabel: \"Substitute edit applied\",\n\t},\n\ttarget_edit: {\n\t\ttoolLabel: \"Target Edit\",\n\t\tapplyingLabel: \"target-edit\",\n\t\tfallbackLabel: \"Target edit applied\",\n\t},\n};\n\nexport function getQuickEditToolConfig(toolName: unknown): QuickEditToolConfig | undefined {\n\treturn typeof toolName === \"string\" ? QUICK_EDIT_TOOLS[toolName] : undefined;\n}\n\nfunction extractQuickEditDiff(text: string): string | undefined {\n\tconst lines = stripAnsi(text).replace(/\\r/g, \"\").split(\"\\n\");\n\tconst start = lines.indexOf(\"── diff ──\");\n\tif (start < 0) return undefined;\n\n\tconst diffLines: string[] = [];\n\tlet cumulativeDelta = 0;\n\tlet oldLine: number | undefined;\n\tlet newLine: number | undefined;\n\tlet chunkAdditions = 0;\n\tlet chunkRemovals = 0;\n\n\tconst finishChunk = () => {\n\t\tcumulativeDelta += chunkAdditions - chunkRemovals;\n\t\toldLine = undefined;\n\t\tnewLine = undefined;\n\t\tchunkAdditions = 0;\n\t\tchunkRemovals = 0;\n\t};\n\n\tfor (const line of lines.slice(start + 1)) {\n\t\tif (line === \"\") {\n\t\t\tfinishChunk();\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst headerMatch = line.match(/^:(\\d+)(?:-\\d+)?$/);\n\t\tif (headerMatch) {\n\t\t\tfinishChunk();\n\t\t\tconst startLine = Number.parseInt(headerMatch[1] ?? \"\", 10);\n\t\t\toldLine = startLine;\n\t\t\tnewLine = startLine + cumulativeDelta;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst match = line.match(/^([+-]) (.*)$/);\n\t\tif (match) {\n\t\t\tconst [, sign, content = \"\"] = match;\n\t\t\tlet gutter = \"\";\n\t\t\tif (sign === \"-\" && oldLine !== undefined) gutter = String(oldLine++);\n\t\t\tif (sign === \"+\" && newLine !== undefined) gutter = String(newLine++);\n\t\t\tif (!gutter) continue;\n\t\t\tif (sign === \"-\") chunkRemovals++;\n\t\t\tif (sign === \"+\") chunkAdditions++;\n\t\t\tdiffLines.push(`${sign} ${gutter} ${content}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line === \"---\") break;\n\t}\n\n\treturn diffLines.length > 0 ? diffLines.join(\"\\n\") : undefined;\n}\n\nfunction quickEditFooter(theme: BoxTheme, context: BoxedToolContext, output = \"\"): string {\n\treturn formatBoxedFooterFromValues(theme, getStateElapsedMs(context.state), output);\n}\n\nfunction renderQuickEditResult(\n\t_toolName: string,\n\tresult: { content?: readonly unknown[]; details?: unknown },\n\toptions: { expanded: boolean; isPartial: boolean },\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n\tconfig: QuickEditToolConfig,\n) {\n\tif (options.isPartial) {\n\t\treturn renderBoxedToolResult(\n\t\t\ttheme,\n\t\t\t() => [`${theme.fg(\"dim\", \"↳\")} ${theme.fg(\"muted\", `Applying ${config.applyingLabel}...`)}`],\n\t\t\t{ isPartial: true },\n\t\t);\n\t}\n\n\tconst output = getTextOutput(result);\n\tif (context.isError) {\n\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"error\", stripAnsi(output).trim() || \"Error\")], {\n\t\t\tfooterLines: [quickEditFooter(theme, context, output)],\n\t\t\tisError: true,\n\t\t});\n\t}\n\n\tconst diff = extractQuickEditDiff(output);\n\tif (!diff) {\n\t\tconst fallback = stripAnsi(output).trim() || config.fallbackLabel;\n\t\treturn renderBoxedToolResult(theme, () => [`${theme.fg(\"dim\", \"↳\")} ${theme.fg(\"muted\", fallback)}`], {\n\t\t\tfooterLines: [quickEditFooter(theme, context, output)],\n\t\t});\n\t}\n\n\tconst rows = buildSplitRows(diff);\n\tconst expanded = options.expanded;\n\tconst argPath = String(context?.args?.path ?? \"\");\n\tconst language = argPath ? getLanguageFromPath(argPath) : undefined;\n\tconst shouldHighlight =\n\t\tBoolean(language) && diff.length <= MAX_HIGHLIGHT_DIFF_CHARS && rows.length <= MAX_HIGHLIGHT_DIFF_ROWS;\n\n\tconst { additions, removals } = countDiffStats(diff);\n\tconst meter = renderDiffMeter(theme, additions, removals);\n\tconst summary =\n\t\t`${theme.fg(\"dim\", \"↳\")} ${theme.fg(\"muted\", \"diff\")}` +\n\t\t` ${theme.fg(\"toolDiffAdded\", `+${additions}`)}` +\n\t\t` ${theme.fg(\"toolDiffRemoved\", `-${removals}`)}` +\n\t\t` ${theme.fg(\"muted\", \"split\")}` +\n\t\t(meter ? ` ${meter}` : \"\");\n\n\tconst maxRows = expanded ? 160 : 36;\n\tconst split = new SplitDiffComponent(theme, rows, maxRows, shouldHighlight ? language : undefined);\n\n\treturn renderBoxedToolResult(\n\t\ttheme,\n\t\t{\n\t\t\trender(width: number): string[] {\n\t\t\t\tconst safeWidth = Math.max(20, width);\n\t\t\t\tconst headerLines = new Text(summary, 0, 0).render(safeWidth);\n\t\t\t\treturn [...headerLines, ...split.render(safeWidth)];\n\t\t\t},\n\t\t\tinvalidate(): void {\n\t\t\t\tsplit.invalidate();\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfooterLines: [quickEditFooter(theme, context, output)],\n\t\t},\n\t);\n}\n\nexport function quickEditTool(config: QuickEditToolConfig): BoxedToolDefinition {\n\treturn {\n\t\tcall(args, theme, context) {\n\t\t\tnoteExecutionStart(context);\n\t\t\tconst detail = displayPath(String(args?.path ?? \"\"), context);\n\t\t\treturn renderBoxedToolCall(theme, config.toolLabel, [`${theme.fg(\"dim\", \"Path: \")}${detail}`], {\n\t\t\t\tisError: Boolean(context.isError),\n\t\t\t\tisPartial: Boolean(context.isPartial),\n\t\t\t\tisPending: Boolean(context.isPartial),\n\t\t\t});\n\t\t},\n\t\tresult(result, options, theme, context) {\n\t\t\treturn renderQuickEditResult(config.toolLabel, result, options, theme, context, config);\n\t\t},\n\t};\n}\n","// Boxed read tool renderer\n// (renderCall/renderResult only; no tool re-registration).\n\nimport { getLanguageFromPath, highlightCode } from \"@earendil-works/pi-coding-agent\";\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport type { BoxTheme } from \"../../../shared/box.js\";\nimport {\n\tboxedToolWidthKey,\n\tcountLines,\n\textractTrailingNotice,\n\tgetTextOutput,\n\trenderBoxedToolResult,\n\tstripTrailingNotice,\n} from \"../../../shared/box.js\";\nimport { safeTruncateToWidth } from \"../../../shared/render-budget.js\";\nimport { getToolsRenderConfig } from \"./session-config.js\";\nimport {\n\ttype BoxedToolDefinition,\n\tclearFooterState,\n\tcompactCall,\n\tcompactFooterWithState,\n\tnoteExecutionStart,\n\tpathRangeDetail,\n\tresultFooterLines,\n\ttruncationOutputLines,\n} from \"./shared.js\";\n\nconst MAX_HIGHLIGHT_OUTPUT_CHARS = 12000;\nconst MAX_HIGHLIGHT_OUTPUT_LINES = 300;\n\ntype NumberedReadLine = {\n\tlineNumber: string;\n\tcontent: string;\n};\n\ntype ParsedReadOutput = {\n\tfileHash: string | undefined;\n\tnumberedLines?: NumberedReadLine[];\n\tbody: string;\n};\n\nfunction parseReadOutput(text: string): ParsedReadOutput {\n\tconst fileHashMatch = text.match(/^fileHash: ([^\\n]+)\\n\\n/);\n\tconst body = fileHashMatch ? text.slice(fileHashMatch[0].length) : text;\n\tconst rawLines = body ? body.split(\"\\n\") : [];\n\tconst numberedLines = rawLines.map((line) => line.match(/^\\s*(\\d+)\\| ?(.*)$/));\n\n\tif (numberedLines.length > 0 && numberedLines.every(Boolean)) {\n\t\treturn {\n\t\t\tfileHash: fileHashMatch?.[1],\n\t\t\tbody: numberedLines.map((match) => match?.[2] ?? \"\").join(\"\\n\"),\n\t\t\tnumberedLines: numberedLines.map((match) => ({\n\t\t\t\tlineNumber: match?.[1] ?? \"\",\n\t\t\t\tcontent: match?.[2] ?? \"\",\n\t\t\t})),\n\t\t};\n\t}\n\n\treturn { fileHash: fileHashMatch?.[1], body };\n}\n\nfunction renderReadBody(\n\ttheme: BoxTheme,\n\toptions: { expanded: boolean },\n\tparsed: ParsedReadOutput,\n\toutput: string,\n\ttruncationNotice: string | null,\n): { render(width: number): string[]; invalidate(): void } {\n\tlet cacheKey = \"\";\n\tlet cacheLines: string[] | null = null;\n\treturn {\n\t\tinvalidate() {\n\t\t\tcacheKey = \"\";\n\t\t\tcacheLines = null;\n\t\t},\n\t\trender(width: number): string[] {\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tconst cfg = getToolsRenderConfig();\n\t\t\tconst maxLines = cfg.maxExpandedLines;\n\t\t\tconst expanded = Boolean(options.expanded);\n\t\t\tconst cacheId = `${renderWidth}|${expanded ? 1 : 0}|${maxLines}|${cfg.dimOutput ? 1 : 0}`;\n\t\t\tif (cacheLines && cacheKey === cacheId) return cacheLines;\n\n\t\t\tconst linesRead = parsed.numberedLines?.length ?? countLines(parsed.body);\n\t\t\tconst summary = theme.fg(\"dim\", `↳ Read ${linesRead} ${linesRead === 1 ? \"line\" : \"lines\"}.`);\n\t\t\tconst footer: string[] = [];\n\t\t\tif (truncationNotice) footer.push(theme.fg(\"warning\", truncationNotice));\n\t\t\tfooter.push(\"\", summary);\n\t\t\tconst budget = maxLines > 0 ? maxLines - footer.length : 0;\n\t\t\tconst renderPlain = (text: string): string[] => {\n\t\t\t\tconst out: string[] = [];\n\t\t\t\tfor (const line of text.split(\"\\n\")) {\n\t\t\t\t\tout.push(safeTruncateToWidth(theme.fg(\"toolOutput\", line), renderWidth, \"…\"));\n\t\t\t\t}\n\t\t\t\treturn out;\n\t\t\t};\n\t\t\tconst lineCount = parsed.numberedLines?.length ?? countLines(parsed.body);\n\t\t\tconst shouldHighlight =\n\t\t\t\texpanded &&\n\t\t\t\tBoolean(getLanguageFromPath(output)) &&\n\t\t\t\tparsed.body.length <= MAX_HIGHLIGHT_OUTPUT_CHARS &&\n\t\t\t\tlineCount <= MAX_HIGHLIGHT_OUTPUT_LINES;\n\n\t\t\tconst renderBody = (): string[] => {\n\t\t\t\tif (!parsed.numberedLines)\n\t\t\t\t\treturn renderPlain(parsed.fileHash ? `fileHash: ${parsed.fileHash}\\n\\n${parsed.body}` : parsed.body);\n\n\t\t\t\tlet bodyLines = parsed.body.split(\"\\n\").map((line) => theme.fg(\"toolOutput\", line));\n\t\t\t\tconst lang = getLanguageFromPath(output);\n\t\t\t\tif (shouldHighlight && lang) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tbodyLines = highlightCode(parsed.body, lang);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tbodyLines = parsed.body.split(\"\\n\").map((line) => theme.fg(\"toolOutput\", line));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst out: string[] = [];\n\t\t\t\tif (parsed.fileHash) out.push(theme.fg(\"muted\", `fileHash: ${parsed.fileHash}`), \"\");\n\n\t\t\t\tconst numberWidth = Math.max(...parsed.numberedLines.map((line) => line.lineNumber.length));\n\t\t\t\tconst gutterWidth = numberWidth + 3;\n\t\t\t\tconst contentWidth = Math.max(1, renderWidth - gutterWidth);\n\t\t\t\tfor (let i = 0; i < parsed.numberedLines.length; i++) {\n\t\t\t\t\tconst numberedLine = parsed.numberedLines[i] ?? { lineNumber: \"\", content: \"\" };\n\t\t\t\t\tconst bodyLine = safeTruncateToWidth(bodyLines[i] ?? \"\", contentWidth, \"…\");\n\t\t\t\t\tconst gutter = theme.fg(\"dim\", `${numberedLine.lineNumber.padStart(numberWidth)} │ `);\n\t\t\t\t\tout.push(`${gutter}${bodyLine}`);\n\t\t\t\t}\n\t\t\t\treturn out;\n\t\t\t};\n\n\t\t\tconst highlighted = renderBody();\n\t\t\tif (maxLines > 0 && highlighted.length > budget) {\n\t\t\t\tconst truncated = highlighted.slice(0, budget);\n\t\t\t\tconst remaining = highlighted.length - budget;\n\t\t\t\ttruncated.push(theme.fg(\"dim\", `… ${remaining} more lines`));\n\t\t\t\ttruncated.push(...footer);\n\t\t\t\tcacheKey = cacheId;\n\t\t\t\tcacheLines = truncated;\n\t\t\t\treturn cacheLines;\n\t\t\t}\n\t\t\thighlighted.push(...footer);\n\t\t\tcacheKey = cacheId;\n\t\t\tcacheLines = highlighted;\n\t\t\treturn cacheLines;\n\t\t},\n\t};\n}\n\nexport const readTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst rawPath = String(args?.path ?? args?.file_path ?? \"\");\n\t\tconst detail = pathRangeDetail(rawPath, args?.offset, args?.limit, context);\n\t\treturn compactCall(theme, \"Read\", `${theme.fg(\"dim\", \"Path: \")}${detail}`, {\n\t\t\tdetailKey: detail,\n\t\t\tcontext,\n\t\t});\n\t},\n\tresult(result, options, theme, context) {\n\t\tclearFooterState(context);\n\t\tconst output = stripAnsi(getTextOutput(result)).trimEnd();\n\t\tconst rawPath = String(context?.args?.path ?? context?.args?.file_path ?? \"\");\n\t\tconst detail = pathRangeDetail(rawPath, context?.args?.offset, context?.args?.limit, context);\n\t\tconst widthKey = boxedToolWidthKey(\"Read\", detail);\n\n\t\tif (context.isError) {\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"error\", output || \"Error\")], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t\tisError: true,\n\t\t\t});\n\t\t}\n\n\t\tconst imageCount = Array.isArray(result.content)\n\t\t\t? result.content.filter((contentBlock) => {\n\t\t\t\t\tif (!contentBlock || typeof contentBlock !== \"object\") return false;\n\t\t\t\t\treturn (contentBlock as { type?: unknown }).type === \"image\";\n\t\t\t\t}).length\n\t\t\t: 0;\n\t\tif (imageCount > 0) {\n\t\t\tif (!options.expanded) return compactFooterWithState(theme, result, context);\n\t\t\tconst summary = `↳ Read ${imageCount} ${imageCount === 1 ? \"image\" : \"images\"}.`;\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", summary)], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t});\n\t\t}\n\n\t\tconst stripped = stripTrailingNotice(output);\n\t\tconst parsed = parseReadOutput(stripped);\n\t\tconst truncationNotice = extractTrailingNotice(output);\n\t\tconst _linesRead = truncationOutputLines(result) ?? parsed.numberedLines?.length ?? countLines(parsed.body);\n\n\t\tif (!options.expanded) return compactFooterWithState(theme, result, context);\n\n\t\tconst body = renderReadBody(theme, options, parsed, output, truncationNotice);\n\t\treturn renderBoxedToolResult(theme, body, {\n\t\t\twidthKey,\n\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t});\n\t},\n};\n","// Boxed write tool renderer\n// (renderCall/renderResult only).\n\nimport { stripAnsi } from \"../../../shared/ansi.js\";\nimport { boxedToolWidthKey, getTextOutput, renderBoxedToolResult, stripTrailingNotice } from \"../../../shared/box.js\";\nimport {\n\ttype BoxedToolDefinition,\n\tclearFooterState,\n\tcompactCall,\n\tcompactFooterWithState,\n\tdisplayPath,\n\tnoteExecutionStart,\n\tresultFooterLines,\n} from \"./shared.js\";\n\nfunction parseWriteSummary(output: string): string | undefined {\n\tconst normalized = stripTrailingNotice(stripAnsi(output ?? \"\")).trim();\n\tif (!normalized) return undefined;\n\n\tconst byteMatch = normalized.match(/\\bwrote\\s+(\\d+)\\s+bytes?\\b/i);\n\tif (byteMatch) {\n\t\tconst bytes = Number(byteMatch[1]);\n\t\tif (Number.isFinite(bytes)) {\n\t\t\treturn `↳ Wrote ${bytes} ${bytes === 1 ? \"byte\" : \"bytes\"}.`;\n\t\t}\n\t}\n\n\tconst lineMatch = normalized.match(/\\bwrote\\s+(\\d+)\\s+lines?\\b/i);\n\tif (lineMatch) {\n\t\tconst count = Number(lineMatch[1]);\n\t\tif (Number.isFinite(count)) {\n\t\t\treturn `↳ Wrote ${count} ${count === 1 ? \"line\" : \"lines\"}.`;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nexport const writeTool: BoxedToolDefinition = {\n\tcall(args, theme, context) {\n\t\tnoteExecutionStart(context);\n\t\tconst detail = displayPath(String(args?.path ?? args?.file_path ?? \"\"), context);\n\t\treturn compactCall(theme, \"Write\", `${theme.fg(\"dim\", \"Path: \")}${detail}`, {\n\t\t\tdetailKey: detail,\n\t\t\tcontext,\n\t\t});\n\t},\n\tresult(result, options, theme, context) {\n\t\tclearFooterState(context);\n\t\tconst output = getTextOutput(result);\n\t\tconst detail = displayPath(String(context?.args?.path ?? context?.args?.file_path ?? \"\"), context);\n\t\tconst widthKey = boxedToolWidthKey(\"Write\", detail);\n\n\t\tif (context.isError) {\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"error\", stripAnsi(output).trim() || \"Error\")], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t\tisError: true,\n\t\t\t});\n\t\t}\n\n\t\tif (!options.expanded) return compactFooterWithState(theme, result, context);\n\n\t\tconst content = String(context?.args?.content ?? \"\");\n\t\tconst lineCount = content ? content.split(\"\\n\").length : 0;\n\t\tif (lineCount > 0) {\n\t\t\tconst summary = `↳ Wrote ${lineCount} ${lineCount === 1 ? \"line\" : \"lines\"}.`;\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", summary)], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t});\n\t\t}\n\n\t\tconst summary = parseWriteSummary(output);\n\t\tif (summary) {\n\t\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", summary)], {\n\t\t\t\twidthKey,\n\t\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t\t});\n\t\t}\n\n\t\tconst normalized = stripTrailingNotice(stripAnsi(output)).trim();\n\t\tconst fallback = normalized ? `↳ ${normalized}` : \"↳ Wrote file.\";\n\t\treturn renderBoxedToolResult(theme, () => [theme.fg(\"dim\", fallback)], {\n\t\t\twidthKey,\n\t\t\tfooterLines: resultFooterLines(theme, result, context),\n\t\t});\n\t},\n};\n","// Boxed tool renderer dispatcher.\n//\n// Maps Pi tool names to their boxed call/result renderers and falls back to a\n// boxed generic renderer for unknown tools. The dispatcher is invoked from the\n// tool decoration owner when tools.style === \"compact-box\".\n\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { BoxTheme } from \"../../../shared/box.js\";\nimport { bashTool } from \"./bash.js\";\nimport { editTool } from \"./edit.js\";\nimport { renderFallbackCall, renderFallbackResult } from \"./fallback.js\";\nimport { findTool } from \"./find.js\";\nimport { grepTool } from \"./grep.js\";\nimport { lsTool } from \"./ls.js\";\nimport { getQuickEditToolConfig, quickEditTool } from \"./quick-edit.js\";\nimport { readTool } from \"./read.js\";\nimport type { BoxedToolContext, BoxedToolDefinition } from \"./shared.js\";\nimport { writeTool } from \"./write.js\";\n\nfunction quickEditToolFor(toolName: string): BoxedToolDefinition {\n\tconst config = getQuickEditToolConfig(toolName);\n\tif (!config) throw new Error(`missing quick-edit config for ${toolName}`);\n\treturn quickEditTool(config);\n}\n\nconst REGISTRY: Readonly<Record<string, BoxedToolDefinition>> = {\n\tread: readTool,\n\twrite: writeTool,\n\tedit: editTool,\n\tbash: bashTool,\n\tls: lsTool,\n\tfind: findTool,\n\tgrep: grepTool,\n\tquick_edit: quickEditToolFor(\"quick_edit\"),\n\tsubstitute_edit: quickEditToolFor(\"substitute_edit\"),\n\ttarget_edit: quickEditToolFor(\"target_edit\"),\n};\n\nexport function hasBoxedRenderer(toolName: unknown): boolean {\n\treturn typeof toolName === \"string\" && Object.hasOwn(REGISTRY, toolName);\n}\n\nexport function renderBoxedToolCall(\n\ttoolName: unknown,\n\targs: Record<string, unknown>,\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n): Component {\n\tconst tool = typeof toolName === \"string\" ? REGISTRY[toolName] : undefined;\n\tif (tool) return tool.call(args, theme, context);\n\treturn renderFallbackCall(toolName, args, theme, context);\n}\n\nexport function renderBoxedToolResult(\n\ttoolName: unknown,\n\tresult: { content?: readonly unknown[]; details?: unknown },\n\toptions: { expanded: boolean; isPartial: boolean },\n\ttheme: BoxTheme,\n\tcontext: BoxedToolContext,\n): Component {\n\tconst tool = typeof toolName === \"string\" ? REGISTRY[toolName] : undefined;\n\tif (tool) return tool.result(result, options, theme, context);\n\treturn renderFallbackResult(toolName, result, options, theme, context);\n}\n","export type CompatibilitySubtype =\n\t| \"native-user-message\"\n\t| \"native-assistant-message\"\n\t| \"native-compaction-message\"\n\t| \"native-branch-message\"\n\t| \"native-skill-message\"\n\t| \"native-custom-message\"\n\t| \"tool-call-renderer\"\n\t| \"tool-result-renderer\";\n\ntype CompatibilityShape = \"supported\" | \"unsupported\" | \"conflict\" | \"installed\" | \"skipped\";\n\nexport interface CompatibilityRecord {\n\tfeature: \"messages\" | \"tools\";\n\tsubtype: CompatibilitySubtype;\n\ttarget: object;\n\towner: object;\n\tmethod: PropertyKey;\n\toriginalIdentity: unknown;\n\toriginalDescriptor?: PropertyDescriptor;\n\tinstalledIdentity?: unknown;\n\tpiVersion: string;\n\tversionRange: string;\n\tshape: CompatibilityShape;\n\tdiagnostic?: string | undefined;\n\tgeneration: number;\n\tdisposed: boolean;\n\tdisposer: () => void;\n}\n\nexport interface InstallResult {\n\tstatus: \"installed\" | \"already-installed\" | \"skipped\";\n\trecord: CompatibilityRecord;\n\treason?: string | undefined;\n}\n\nconst recordsByOwner = new WeakMap<object, Map<PropertyKey, CompatibilityRecord>>();\nlet generation = 0;\nlet registryTestHooks: {\n\tafterWrite?: () => void;\n\tdefineProperty?: (target: object, key: PropertyKey, descriptor: PropertyDescriptor) => boolean;\n} = {};\nexport function __setCompatibilityRegistryTestHooks(hooks: typeof registryTestHooks): () => void {\n\tconst previous = registryTestHooks;\n\tregistryTestHooks = hooks;\n\treturn () => {\n\t\tregistryTestHooks = previous;\n\t};\n}\n\nfunction ownerRecords(owner: object): Map<PropertyKey, CompatibilityRecord> {\n\tlet records = recordsByOwner.get(owner);\n\tif (!records) {\n\t\trecords = new Map();\n\t\trecordsByOwner.set(owner, records);\n\t}\n\treturn records;\n}\n\nexport function currentGeneration(): number {\n\treturn generation;\n}\nexport function nextGeneration(): number {\n\treturn ++generation;\n}\nexport function getCompatibilityRecords(owner: object): readonly CompatibilityRecord[] {\n\treturn [...(recordsByOwner.get(owner)?.values() ?? [])];\n}\n\nfunction safeRead(target: object, method: PropertyKey): unknown {\n\ttry {\n\t\treturn Reflect.get(target, method);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction skippedRecord(options: {\n\tfeature: CompatibilityRecord[\"feature\"];\n\tsubtype: CompatibilitySubtype;\n\ttarget: object;\n\tmethod: PropertyKey;\n\tpiVersion: string;\n\tversionRange: string;\n\tshape: CompatibilityShape;\n\tdiagnostic: string;\n\tgeneration: number;\n\toriginalIdentity?: unknown;\n}): CompatibilityRecord {\n\treturn {\n\t\t...options,\n\t\towner: options.target,\n\t\toriginalIdentity: Object.hasOwn(options, \"originalIdentity\")\n\t\t\t? options.originalIdentity\n\t\t\t: safeRead(options.target, options.method),\n\t\tdisposed: true,\n\t\tdisposer: () => {},\n\t};\n}\n\nfunction descriptorMatches(actual: PropertyDescriptor | undefined, expected: PropertyDescriptor | undefined): boolean {\n\tif (!actual || !expected) return actual === expected;\n\treturn (\n\t\tactual.value === expected.value &&\n\t\tactual.get === expected.get &&\n\t\tactual.set === expected.set &&\n\t\tactual.writable === expected.writable &&\n\t\tactual.enumerable === expected.enumerable &&\n\t\tactual.configurable === expected.configurable\n\t);\n}\n\nfunction restoreExact(record: CompatibilityRecord): { ok: boolean; diagnostic?: string } {\n\ttry {\n\t\tconst current = Object.getOwnPropertyDescriptor(record.target, record.method);\n\t\tconst installed = current?.value === record.installedIdentity;\n\t\tif (!installed) return { ok: false, diagnostic: \"current owner changed; native/later owner preserved\" };\n\t\tconst defineProperty = registryTestHooks.defineProperty ?? Reflect.defineProperty;\n\t\tconst wrote = record.originalDescriptor\n\t\t\t? defineProperty(record.target, record.method, record.originalDescriptor)\n\t\t\t: Reflect.deleteProperty(record.target, record.method);\n\t\tif (!wrote) return { ok: false, diagnostic: \"exact descriptor restoration was rejected\" };\n\t\tif (!descriptorMatches(Object.getOwnPropertyDescriptor(record.target, record.method), record.originalDescriptor))\n\t\t\treturn { ok: false, diagnostic: \"post-restore descriptor validation failed\" };\n\t\treturn { ok: true };\n\t} catch (error) {\n\t\treturn { ok: false, diagnostic: `restore failed: ${error instanceof Error ? error.message : String(error)}` };\n\t}\n}\n\nfunction inspectCurrent(\n\ttarget: object,\n\tmethod: PropertyKey,\n): { current?: unknown; descriptor?: PropertyDescriptor; error?: string } {\n\ttry {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(target, method);\n\t\treturn {\n\t\t\tcurrent: descriptor && \"value\" in descriptor ? descriptor.value : undefined,\n\t\t\t...(descriptor ? { descriptor } : {}),\n\t\t};\n\t} catch (error) {\n\t\treturn { error: `cannot inspect target: ${error instanceof Error ? error.message : String(error)}` };\n\t}\n}\n\nfunction skippedResult(\n\toptions: Parameters<typeof installDelegatingPatch>[0],\n\tshape: CompatibilityShape,\n\treason: string,\n\toriginalIdentity?: unknown,\n): InstallResult {\n\treturn {\n\t\tstatus: \"skipped\",\n\t\treason,\n\t\trecord: skippedRecord({ ...options, shape, diagnostic: reason, originalIdentity }),\n\t};\n}\n\nfunction expectedIdentityMatches(options: Parameters<typeof installDelegatingPatch>[0], current: unknown): boolean {\n\tconst expected =\n\t\toptions.hasExpectedIdentity === true ||\n\t\t(options.hasExpectedIdentity === undefined && options.expectedIdentity !== undefined);\n\treturn !expected || current === options.expectedIdentity;\n}\n\nfunction validateInstall(\n\toptions: Parameters<typeof installDelegatingPatch>[0],\n\tcurrent: unknown,\n\texisting: CompatibilityRecord | undefined,\n\townDescriptor: PropertyDescriptor | undefined,\n): InstallResult | undefined {\n\tif (!options.shape) return skippedResult(options, \"unsupported\", options.diagnostic ?? \"unsupported shape\", current);\n\tconst conflict = existing && activeConflict(existing, current, options.generation);\n\tif (conflict) return conflict;\n\tif (typeof current !== \"function\")\n\t\treturn skippedResult(\n\t\t\toptions,\n\t\t\townDescriptor ? \"unsupported\" : \"skipped\",\n\t\t\t\"target property is not callable\",\n\t\t\tcurrent,\n\t\t);\n\tif (!expectedIdentityMatches(options, current))\n\t\treturn skippedResult(options, \"conflict\", \"current owner is not the captured pristine native identity\", current);\n\treturn undefined;\n}\n\nfunction activeConflict(\n\texisting: CompatibilityRecord,\n\tcurrent: unknown,\n\tgeneration: number,\n): InstallResult | undefined {\n\tif (existing.disposed) return undefined;\n\tif (existing.installedIdentity === current && existing.generation === generation)\n\t\treturn { status: \"already-installed\", record: existing };\n\tconst reason =\n\t\texisting.installedIdentity === current\n\t\t\t? \"active wrapper belongs to a different generation\"\n\t\t\t: \"owner changed after pi-style installation\";\n\treturn {\n\t\tstatus: \"skipped\",\n\t\treason,\n\t\trecord: skippedRecord({\n\t\t\tfeature: existing.feature,\n\t\t\tsubtype: existing.subtype,\n\t\t\ttarget: existing.target,\n\t\t\tmethod: existing.method,\n\t\t\tpiVersion: existing.piVersion,\n\t\t\tversionRange: existing.versionRange,\n\t\t\tshape: \"conflict\",\n\t\t\tdiagnostic: reason,\n\t\t\tgeneration,\n\t\t\toriginalIdentity: current,\n\t\t}),\n\t};\n}\n\nexport function installDelegatingPatch(options: {\n\tfeature: CompatibilityRecord[\"feature\"];\n\tsubtype: CompatibilitySubtype;\n\ttarget: object;\n\tmethod: PropertyKey;\n\tpiVersion: string;\n\tversionRange: string;\n\tshape: boolean;\n\tgeneration: number;\n\texpectedIdentity?: unknown;\n\thasExpectedIdentity?: boolean;\n\tdiagnostic?: string | undefined;\n\tdelegate: (original: unknown, thisArg: object, args: unknown[]) => unknown;\n}): InstallResult {\n\tconst { target, method } = options;\n\tconst inspection = inspectCurrent(target, method);\n\tif (inspection.error) return skippedResult(options, \"skipped\", inspection.error);\n\tconst current = inspection.current;\n\tconst records = ownerRecords(target);\n\tconst validation = validateInstall(options, current, records.get(method), inspection.descriptor);\n\tif (validation) return validation;\n\tconst originalDescriptor = Object.getOwnPropertyDescriptor(target, method);\n\tconst originalIdentity = current;\n\tlet active = true;\n\tconst installed = function (this: object, ...args: unknown[]): unknown {\n\t\tif (!active) return Reflect.apply(originalIdentity as (...values: unknown[]) => unknown, this, args);\n\t\treturn options.delegate(originalIdentity, this, args);\n\t};\n\tconst record: CompatibilityRecord = {\n\t\tfeature: options.feature,\n\t\tsubtype: options.subtype,\n\t\ttarget,\n\t\towner: target,\n\t\tmethod,\n\t\toriginalIdentity,\n\t\t...(originalDescriptor ? { originalDescriptor } : {}),\n\t\tinstalledIdentity: installed,\n\t\tpiVersion: options.piVersion,\n\t\tversionRange: options.versionRange,\n\t\tshape: \"installed\",\n\t\tdiagnostic: options.diagnostic,\n\t\tgeneration: options.generation,\n\t\tdisposed: false,\n\t\tdisposer: () => {},\n\t};\n\ttry {\n\t\tObject.defineProperty(installed, \"__piStyleCompatibilityRecord\", { value: record, configurable: false });\n\t\tconst descriptor = { ...originalDescriptor, value: installed };\n\t\tconst wrote = Reflect.defineProperty(target, method, descriptor);\n\t\tregistryTestHooks.afterWrite?.();\n\t\tconst currentDescriptor = Object.getOwnPropertyDescriptor(target, method);\n\t\tif (!wrote) return skippedResult(options, \"skipped\", \"installation write was rejected\");\n\t\tif (!descriptorMatches(currentDescriptor, descriptor)) {\n\t\t\tif (currentDescriptor?.value === installed) {\n\t\t\t\tconst rollback = restoreExact({ ...record, installedIdentity: installed });\n\t\t\t\tif (!rollback.ok) {\n\t\t\t\t\trecord.diagnostic = rollback.diagnostic;\n\t\t\t\t\trecords.set(method, record);\n\t\t\t\t\treturn { status: \"skipped\", reason: rollback.diagnostic, record };\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst reason =\n\t\t\t\tcurrentDescriptor?.value === installed\n\t\t\t\t\t? \"wrapper-owned descriptor mismatch rolled back\"\n\t\t\t\t\t: \"later owner preserved after post-write mismatch\";\n\t\t\treturn {\n\t\t\t\tstatus: \"skipped\",\n\t\t\t\treason,\n\t\t\t\trecord: skippedRecord({\n\t\t\t\t\t...options,\n\t\t\t\t\tshape: \"conflict\",\n\t\t\t\t\tdiagnostic: reason,\n\t\t\t\t\toriginalIdentity: currentDescriptor?.value,\n\t\t\t\t}),\n\t\t\t};\n\t\t}\n\t\trecords.set(method, record);\n\t\trecord.disposer = () => {\n\t\t\tif (record.disposed) return;\n\t\t\tconst restored = restoreExact(record);\n\t\t\tif (!restored.ok) {\n\t\t\t\trecord.diagnostic = restored.diagnostic;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactive = false;\n\t\t\trecord.disposed = true;\n\t\t\trecords.delete(method);\n\t\t};\n\t\treturn { status: \"installed\", record };\n\t} catch (error) {\n\t\tconst currentDescriptor = Object.getOwnPropertyDescriptor(target, method);\n\t\tconst rollback =\n\t\t\tcurrentDescriptor?.value === installed ? restoreExact({ ...record, installedIdentity: installed }) : { ok: true };\n\t\tconst reason = `installation rolled back (${rollback.diagnostic ?? \"ok\"}): ${error instanceof Error ? error.message : String(error)}`;\n\t\tif (currentDescriptor?.value === installed && !rollback.ok) {\n\t\t\trecord.diagnostic = reason;\n\t\t\trecords.set(method, record);\n\t\t\trecord.disposer = () => {\n\t\t\t\tif (record.disposed) return;\n\t\t\t\tconst retry = restoreExact(record);\n\t\t\t\tif (!retry.ok) {\n\t\t\t\t\trecord.diagnostic = retry.diagnostic;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tactive = false;\n\t\t\t\trecord.disposed = true;\n\t\t\t\trecords.delete(method);\n\t\t\t};\n\t\t\treturn { status: \"installed\", reason, record };\n\t\t}\n\t\treturn { status: \"skipped\", reason, record: skippedRecord({ ...options, shape: \"skipped\", diagnostic: reason }) };\n\t}\n}\n","import { isTierCAuthorized } from \"../domain/config-authorization.js\";\nimport type { NormalizedPiStyleConfig } from \"../domain/config-types.js\";\nimport {\n\ttype CompatibilityCleanupResult,\n\ttype CompatibilityProbeReport,\n\tdetectPiVersion,\n\tdisposePiCompatibilityProbe,\n\tprobePiCompatibility,\n} from \"./compatibility-probe.js\";\n\nexport interface CompatibilityCoordinator {\n\tcaptureAuthorization(\n\t\tcoreFlag: boolean,\n\t\tuserFlag: boolean,\n\t\tassistantFlag: boolean,\n\t\tspecialBlocksFlag: boolean,\n\t\ttoolsFlag: boolean,\n\t\tasciiFlag: boolean,\n\t): void;\n\tstate(config: NormalizedPiStyleConfig): Readonly<Record<string, unknown>>;\n\tinstall(\n\t\tconfig: NormalizedPiStyleConfig,\n\t\ttui: boolean,\n\t\tproductGate?: \"omitted\" | \"allow\" | \"deny\",\n\t): CompatibilityProbeReport | undefined;\n\tdispose(): CompatibilityCleanupResult;\n\treadonly report: CompatibilityProbeReport | undefined;\n}\n\nexport function createCompatibilityCoordinator(dispose = disposePiCompatibilityProbe): CompatibilityCoordinator {\n\tlet report: CompatibilityProbeReport | undefined;\n\tlet cleanupPending = false;\n\tlet authorization:\n\t\t| {\n\t\t\t\tcore: boolean;\n\t\t\t\tuser: boolean;\n\t\t\t\tassistant: boolean;\n\t\t\t\tspecialBlocks: boolean;\n\t\t\t\ttools: boolean;\n\t\t\t\tascii: boolean;\n\t\t }\n\t\t| undefined;\n\treturn {\n\t\tget report() {\n\t\t\treturn report;\n\t\t},\n\t\tcaptureAuthorization(core, user, assistant, specialBlocks, tools, ascii) {\n\t\t\tauthorization = { core, user, assistant, specialBlocks, tools, ascii };\n\t\t},\n\t\tstate(config) {\n\t\t\tconst version = detectPiVersion();\n\t\t\tconst messagesConfigured =\n\t\t\t\tconfig.enabled &&\n\t\t\t\tconfig.messages.enabled &&\n\t\t\t\t(config.messages.userPrefix || config.messages.assistantPrefix || config.messages.specialBlocks);\n\t\t\tconst toolsConfigured = config.enabled && config.tools.enabled;\n\t\t\tconst surface = (\n\t\t\t\tfeature: \"messages\" | \"tools\",\n\t\t\t\tconfigured: boolean,\n\t\t\t\tsurfaceAuthorized: boolean,\n\t\t\t\tsubtype?: string,\n\t\t\t) => {\n\t\t\t\tconst records =\n\t\t\t\t\treport?.unsupported.filter((item) =>\n\t\t\t\t\t\tfeature === \"messages\" ? item.subtype.includes(\"message\") : item.subtype.includes(\"tool\"),\n\t\t\t\t\t) ?? [];\n\t\t\t\tconst failed = records.some((item) => /identity|failed|unsupported shape/i.test(item.reason));\n\t\t\t\tconst fallback = records.some((item) => /fallback|authorization|disabled/i.test(item.reason));\n\t\t\t\tconst authorized = Boolean(authorization?.core && surfaceAuthorized);\n\t\t\t\tconst installedRecord = report?.recordSnapshots.some(\n\t\t\t\t\t(item) => item.feature === feature && !item.disposed && (subtype === undefined || item.subtype === subtype),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tconfigured,\n\t\t\t\t\tauthorized,\n\t\t\t\t\tinstalled: Boolean(installedRecord && !failed && authorized && configured),\n\t\t\t\t\tconflicted: records.some((item) => item.reason.includes(\"owner\")),\n\t\t\t\t\tfailed,\n\t\t\t\t\tcleanupPending,\n\t\t\t\t\tnativeFallback: fallback,\n\t\t\t\t\t...(authorized ? {} : { awaitingAuthorization: true }),\n\t\t\t\t};\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tconfigured: messagesConfigured || toolsConfigured,\n\t\t\t\tauthorized: authorization?.core ?? false,\n\t\t\t\tinstalled: report !== undefined,\n\t\t\t\tconflicted: report?.unsupported.some((item) => item.reason.includes(\"identity\")) ?? false,\n\t\t\t\tfailed: report?.unsupported.some((item) => item.reason.includes(\"failed\")) ?? false,\n\t\t\t\tcleanupPending,\n\t\t\t\tnativeFallbacks: report?.unsupported.filter((item) => item.reason.includes(\"fallback\")).length ?? 0,\n\t\t\t\tpiVersion: version.version ?? report?.piVersion ?? \"unknown\",\n\t\t\t\tversionRange: report?.versionRange ?? \">=0.83.0 <0.84.0\",\n\t\t\t\tuserMessage: surface(\n\t\t\t\t\t\"messages\",\n\t\t\t\t\tconfig.enabled && config.messages.enabled && config.messages.userPrefix,\n\t\t\t\t\tBoolean(authorization?.user),\n\t\t\t\t\t\"native-user-message\",\n\t\t\t\t),\n\t\t\t\tassistantMessage: surface(\n\t\t\t\t\t\"messages\",\n\t\t\t\t\tconfig.enabled && config.messages.enabled && config.messages.assistantPrefix,\n\t\t\t\t\tBoolean(authorization?.assistant),\n\t\t\t\t\t\"native-assistant-message\",\n\t\t\t\t),\n\t\t\t\ttools: surface(\"tools\", config.enabled && config.tools.enabled, Boolean(authorization?.tools)),\n\t\t\t\tspecialBlocks: surface(\n\t\t\t\t\t\"messages\",\n\t\t\t\t\tconfig.enabled && config.messages.enabled && config.messages.specialBlocks,\n\t\t\t\t\tBoolean(authorization?.core),\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\tinstall(config, tui, productGate = \"omitted\") {\n\t\t\tconst productDenied = productGate === \"deny\";\n\t\t\tif (cleanupPending && !report) cleanupPending = false;\n\t\t\tif (cleanupPending || !tui || !config.enabled || !authorization?.core || productDenied) return undefined;\n\t\t\tconst certifiedHost = detectPiVersion().version === \"0.83.0\";\n\t\t\tconst userEnabled =\n\t\t\t\tauthorization.user &&\n\t\t\t\tisTierCAuthorized({\n\t\t\t\t\tcertifiedHost,\n\t\t\t\t\tcoreFlag: authorization.core,\n\t\t\t\t\tsurfaceFlag: true,\n\t\t\t\t\tsurface: \"userMessage\",\n\t\t\t\t\tconfig,\n\t\t\t\t});\n\t\t\tconst assistantEnabled =\n\t\t\t\tauthorization.assistant &&\n\t\t\t\tisTierCAuthorized({\n\t\t\t\t\tcertifiedHost,\n\t\t\t\t\tcoreFlag: authorization.core,\n\t\t\t\t\tsurfaceFlag: true,\n\t\t\t\t\tsurface: \"assistantMessage\",\n\t\t\t\t\tconfig,\n\t\t\t\t});\n\t\t\tconst specialBlocksEnabled =\n\t\t\t\tauthorization.specialBlocks &&\n\t\t\t\tisTierCAuthorized({\n\t\t\t\t\tcertifiedHost,\n\t\t\t\t\tcoreFlag: authorization.core,\n\t\t\t\t\tsurfaceFlag: true,\n\t\t\t\t\tsurface: \"specialBlocks\",\n\t\t\t\t\tconfig,\n\t\t\t\t});\n\t\t\tconst messagesEnabled = (userEnabled || assistantEnabled || specialBlocksEnabled) && config.messages.enabled;\n\t\t\tconst toolsEnabled =\n\t\t\t\tauthorization.tools &&\n\t\t\t\tisTierCAuthorized({ certifiedHost, coreFlag: authorization.core, surfaceFlag: true, surface: \"tools\", config });\n\t\t\tif (!messagesEnabled && !toolsEnabled) return undefined;\n\t\t\tconst detected = detectPiVersion();\n\t\t\treport = probePiCompatibility(detected.version, {\n\t\t\t\tconfig: {\n\t\t\t\t\t...config,\n\t\t\t\t\tmessages: {\n\t\t\t\t\t\t...config.messages,\n\t\t\t\t\t\tenabled: messagesEnabled,\n\t\t\t\t\t\tuserPrefix: userEnabled,\n\t\t\t\t\t\tassistantPrefix: assistantEnabled,\n\t\t\t\t\t\tspecialBlocks: messagesEnabled && config.messages.specialBlocks && specialBlocksEnabled,\n\t\t\t\t\t},\n\t\t\t\t\ttools: {\n\t\t\t\t\t\t...config.tools,\n\t\t\t\t\t\tenabled: toolsEnabled,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmessageSnapshot: {\n\t\t\t\t\tuserPrefix: authorization.ascii ? \"[user] \" : \"❯ \",\n\t\t\t\t\tassistantPrefix: authorization.ascii ? \"[assistant] \" : \"│ \",\n\t\t\t\t\tuserEnabled,\n\t\t\t\t\tassistantEnabled,\n\t\t\t\t},\n\t\t\t\ttoolSnapshot: {\n\t\t\t\t\tcallMarker: authorization.ascii ? \"[tool] \" : \"[tool] \",\n\t\t\t\t\tresultMarker: authorization.ascii ? \"[result] \" : \"[tool:result] \",\n\t\t\t\t\tstyle: config.tools.style === \"compact-box\" ? \"compact-box\" : \"marker\",\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn report;\n\t\t},\n\t\tdispose() {\n\t\t\tif (!report) {\n\t\t\t\tcleanupPending = false;\n\t\t\t\treturn { complete: true, retryablePrototypeRecords: 0, retryableToolRecords: 0 };\n\t\t\t}\n\t\t\tconst result = dispose(report);\n\t\t\tcleanupPending = !result.complete;\n\t\t\tif (result.complete) {\n\t\t\t\treport = undefined;\n\t\t\t\tcleanupPending = false;\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t};\n}\n","import type { ConfigFilePort } from \"../app/config-storage.js\";\nimport { readScopedConfig } from \"../app/config-storage.js\";\nimport type { ConfigDiagnostic } from \"../domain/config-diagnostics.js\";\nimport { resolveConfigDetailed } from \"../domain/config-normalization.js\";\n\nexport interface SessionFlagReader {\n\tgetFlag(name: string): unknown;\n}\nexport interface SessionAuthorization {\n\tcore: boolean;\n\tuser: boolean;\n\tassistant: boolean;\n\tspecialBlocks: boolean;\n\ttools: boolean;\n\tascii: boolean;\n}\nexport interface ProductPolicy {\n\treadonly corePatchGate: \"omitted\" | \"allow\" | \"deny\";\n}\nexport interface ConfigSourceAdapter {\n\tsetSession(cwd: string, trusted: boolean): void;\n\tload(): Promise<{\n\t\tconfig: unknown;\n\t\tdiagnostics: readonly ConfigDiagnostic[];\n\t\tsources: Readonly<Record<string, string>>;\n\t\trawSources?: {\n\t\t\tdefaults?: unknown;\n\t\t\tglobal?: unknown;\n\t\t\tproject?: unknown;\n\t\t\tenvironment?: Record<string, string | undefined>;\n\t\t};\n\t\tproductPolicy?: ProductPolicy;\n\t}>;\n}\n\nfunction sessionOverrides(_pi: SessionFlagReader): Record<string, unknown> {\n\treturn {};\n}\n\n/** Product policy is deny-only: any explicit false wins; true never grants Tier C. */\nexport function resolveProductGate(\n\tglobal: unknown,\n\tproject: unknown,\n\tsession: unknown,\n\tprojectTrusted: boolean,\n): ProductPolicy {\n\tconst values = [global, projectTrusted ? project : undefined, session];\n\tfor (const value of values) {\n\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) continue;\n\t\tconst compatibility = (value as Record<string, unknown>).compatibility;\n\t\tif (!compatibility || typeof compatibility !== \"object\" || Array.isArray(compatibility)) continue;\n\t\tif (!Object.hasOwn(compatibility, \"allowCorePatches\")) continue;\n\t\tconst leaf = (compatibility as Record<string, unknown>).allowCorePatches;\n\t\tif (leaf === false) return { corePatchGate: \"deny\" };\n\t}\n\treturn { corePatchGate: \"omitted\" };\n}\n\nexport function readSessionAuthorization(pi: SessionFlagReader): SessionAuthorization {\n\treturn {\n\t\tcore: pi.getFlag(\"pi-style-core-patches\") === true,\n\t\tuser: pi.getFlag(\"pi-style-message-user\") === true,\n\t\tassistant: pi.getFlag(\"pi-style-message-assistant\") === true,\n\t\tspecialBlocks: pi.getFlag(\"pi-style-message-special-blocks\") === true,\n\t\ttools: pi.getFlag(\"pi-style-tools\") === true,\n\t\tascii: pi.getFlag(\"pi-style-ascii\") === true,\n\t};\n}\n\nexport function createConfigSourceAdapter(\n\tpi: SessionFlagReader,\n\tport: ConfigFilePort,\n\tpaths: (cwd: string) => { globalPath: string; projectPath: string },\n): ConfigSourceAdapter {\n\tlet trusted = true;\n\tlet currentCwd = process.cwd();\n\treturn {\n\t\tsetSession(nextCwd, nextTrusted) {\n\t\t\tcurrentCwd = nextCwd;\n\t\t\ttrusted = nextTrusted;\n\t\t},\n\t\tasync load() {\n\t\t\tconst storage = paths(currentCwd);\n\t\t\tconst global = await readScopedConfig(port, storage.globalPath);\n\t\t\tconst project = trusted ? await readScopedConfig(port, storage.projectPath) : undefined;\n\t\t\tconst resolved = resolveConfigDetailed({\n\t\t\t\tglobal: global.value,\n\t\t\t\tproject: project?.value,\n\t\t\t\tprojectTrusted: trusted,\n\t\t\t\tenvironment: process.env,\n\t\t\t\tsession: sessionOverrides(pi),\n\t\t\t});\n\t\t\tconst productPolicy = resolveProductGate(global.value, project?.value, sessionOverrides(pi), trusted);\n\t\t\treturn {\n\t\t\t\tconfig: resolved.config,\n\t\t\t\tdiagnostics: [...global.diagnostics, ...(project?.diagnostics ?? []), ...resolved.diagnostics],\n\t\t\t\tsources: resolved.sources,\n\t\t\t\trawSources: { global: global.value, project: project?.value, environment: process.env },\n\t\t\t\tproductPolicy,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport { sessionOverrides };\n","import type { RuntimeInstallationState } from \"../app/runtime.js\";\nimport type { NormalizedPiStyleConfig } from \"../domain/config-types.js\";\nimport type { CompatibilityCoordinator } from \"./compatibility-coordinator.js\";\n\nexport function buildOperationalState(\n\tconfig: NormalizedPiStyleConfig,\n\tauthorization: { core: boolean; productCorePatchGate?: string },\n\tcompatibility: CompatibilityCoordinator,\n\tinstallationState?: RuntimeInstallationState,\n\tproductCorePatchGate?: string,\n): Readonly<Record<string, unknown>> {\n\treturn {\n\t\tcompatibility: {\n\t\t\t...compatibility.state(config),\n\t\t\tconfiguredByProduct: config.messages.enabled || config.tools.enabled,\n\t\t},\n\t\tinstallations: installationState ?? {\n\t\t\tstatus: config.enabled && config.statusLine.enabled ? \"active\" : \"disabled\",\n\t\t\teditor: config.enabled && config.editor.enabled ? \"active\" : \"disabled\",\n\t\t\tstartup: config.enabled && config.startup.mode !== \"off\" ? \"active\" : \"disabled\",\n\t\t},\n\t\tprovider: { status: \"unavailable\", recovery: \"inject a capability-safe provider\" },\n\t\tauthorization: {\n\t\t\tcore: authorization.core,\n\t\t\t...(authorization.productCorePatchGate ? { productCorePatchGate: authorization.productCorePatchGate } : {}),\n\t\t\t...(productCorePatchGate ? { productCorePatchGate } : {}),\n\t\t},\n\t};\n}\n","import type { SourceInfo, ToolInfo } from \"@earendil-works/pi-coding-agent\";\n\n/**\n * Startup resource collection for the pi/ adapter layer. Runs once at session\n * start, outside any render path, and produces the bounded tool details that\n * the startup surface renders.\n */\n\nconst CORE_TOOL_SOURCE_LABEL = \"core\";\n\nfunction stripKnownExtension(name: string): string {\n\treturn name.replace(/\\.(?:mjs|cjs|js|jsx|ts|tsx)$/i, \"\");\n}\n\nfunction compactSourcePathLabel(path: string): string {\n\tconst trimmed = path.trim();\n\tif (!trimmed) return \"\";\n\tconst synthetic = /^<([^:>]+)(?::[^>]*)?>$/.exec(trimmed);\n\tif (synthetic?.[1]) return synthetic[1];\n\tconst segments = trimmed\n\t\t.replace(/\\\\/g, \"/\")\n\t\t.split(\"/\")\n\t\t.filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"~\");\n\tconst last = segments.at(-1) ?? trimmed;\n\tif (/^index\\.(?:mjs|cjs|js|jsx|ts|tsx)$/i.test(last) && segments.length > 1) {\n\t\treturn segments[segments.length - 2] ?? last;\n\t}\n\treturn stripKnownExtension(last);\n}\n\nfunction compactPackageSourceLabel(source: string): string {\n\tif (source.startsWith(\"npm:\")) return source.slice(\"npm:\".length) || source;\n\tif (source.startsWith(\"git:\")) return compactSourcePathLabel(source.replace(/\\.git(?:#.*)?$/i, \"\")) || source;\n\treturn source;\n}\n\n/** Compact display label for a tool's source. */\nexport function toolSourceLabel(sourceInfo: SourceInfo | undefined): string {\n\tif (!sourceInfo || typeof sourceInfo !== \"object\") return CORE_TOOL_SOURCE_LABEL;\n\tconst source = typeof sourceInfo.source === \"string\" ? sourceInfo.source : \"\";\n\tif (source === \"builtin\") return CORE_TOOL_SOURCE_LABEL;\n\tif (source === \"sdk\") return \"sdk\";\n\tif (source.startsWith(\"npm:\") || source.startsWith(\"git:\")) return compactPackageSourceLabel(source);\n\tconst baseDir = typeof sourceInfo.baseDir === \"string\" ? sourceInfo.baseDir : \"\";\n\tif (baseDir) return compactSourcePathLabel(baseDir) || source || \"extension\";\n\tconst path = typeof sourceInfo.path === \"string\" ? sourceInfo.path : \"\";\n\tif (path) return compactSourcePathLabel(path) || source || \"extension\";\n\treturn source || \"extension\";\n}\n\n/**\n * Map registered tools to the bounded `{ source, name }` shape used by the\n * startup tools panel. When Pi reports active tool names, only those are kept;\n * an empty/absent active list keeps all registered tools so the panel is not\n * silently empty. Returns undefined when there is nothing to show.\n */\nexport function collectToolDetails(\n\tactiveNames: readonly string[] | undefined,\n\ttools: readonly ToolInfo[] | undefined,\n): { source: string; name: string }[] | undefined {\n\tif (!tools || tools.length === 0) return undefined;\n\tconst activeSet = activeNames && activeNames.length > 0 ? new Set(activeNames) : undefined;\n\tconst details: { source: string; name: string }[] = [];\n\tfor (const tool of tools) {\n\t\tif (typeof tool?.name !== \"string\" || tool.name.trim().length === 0) continue;\n\t\tif (activeSet && !activeSet.has(tool.name)) continue;\n\t\tdetails.push({ source: toolSourceLabel(tool.sourceInfo), name: tool.name.trim() });\n\t}\n\treturn details.length > 0 ? details : undefined;\n}\n","import type { SessionEntry } from \"@earendil-works/pi-coding-agent\";\nimport type { UsageSnapshot } from \"../domain/status.js\";\n\n/**\n * Minimal structural view of Pi's session manager: only the entry iteration\n * needed to aggregate cumulative usage. `ExtensionContext.sessionManager`\n * satisfies this shape.\n */\nexport interface SessionUsageSource {\n\tgetEntries(): readonly SessionEntry[];\n}\n\ninterface UsageTotals {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n}\n\n/**\n * Aggregate cumulative token/cost usage from all session entries, mirroring\n * Pi's native footer: assistant messages always carry usage, tool results and\n * compaction/branch summaries carry it when available.\n */\nexport function usageFromSession(session: SessionUsageSource): UsageSnapshot | undefined {\n\tconst totals: UsageTotals = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\n\tlet sawUsage = false;\n\tfor (const entry of session.getEntries()) {\n\t\tif (entry.type === \"message\") {\n\t\t\tif (entry.message.role !== \"assistant\" && entry.message.role !== \"toolResult\") continue;\n\t\t\tconst usage = \"usage\" in entry.message ? entry.message.usage : undefined;\n\t\t\tif (!usage) continue;\n\t\t\taddUsage(totals, usage);\n\t\t\tsawUsage = true;\n\t\t} else if ((entry.type === \"branch_summary\" || entry.type === \"compaction\") && entry.usage) {\n\t\t\taddUsage(totals, entry.usage);\n\t\t\tsawUsage = true;\n\t\t}\n\t}\n\tif (!sawUsage) return undefined;\n\treturn {\n\t\tinputTokens: totals.input,\n\t\toutputTokens: totals.output,\n\t\tcacheReadTokens: totals.cacheRead,\n\t\tcacheWriteTokens: totals.cacheWrite,\n\t\tcost: totals.cost,\n\t\tsubscriptionMode: \"unknown\",\n\t\tstreaming: false,\n\t};\n}\n\nfunction addUsage(\n\ttotals: UsageTotals,\n\tusage: { input: number; output: number; cacheRead: number; cacheWrite: number; cost: { total: number } },\n): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.cost += usage.cost.total;\n}\n","import type { ExtensionAPI, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { StatusSnapshot } from \"../domain/status.js\";\nimport { registerPiStyleCommand } from \"./commands.js\";\nimport { type CompatibilityTestHooks, createPiStyleSessionCoordinator } from \"./session-coordinator.js\";\nimport { usageFromSession } from \"./session-usage.js\";\n\n/** Usage patch that omits the key when no session usage exists (exact optional types). */\nfunction usagePatch(ctx: ExtensionContext): StatusSnapshot {\n\tconst usage = usageFromSession(ctx.sessionManager);\n\treturn usage ? { usage } : {};\n}\n\nlet compatibilityTestHooks: CompatibilityTestHooks = {};\nexport function __setCompatibilityTestHooks(hooks: CompatibilityTestHooks): () => void {\n\tconst previous = compatibilityTestHooks;\n\tcompatibilityTestHooks = hooks;\n\treturn () => {\n\t\tcompatibilityTestHooks = previous;\n\t};\n}\n\n/** Thin Pi adapter: register flags, commands, and forward lifecycle events. */\nexport default function piStyleExtension(pi: ExtensionAPI): void {\n\t// The core/message/tool surfaces are default-on (safe: fingerprint-certified against\n\t// exact Pi 0.83.0, fail-closed elsewhere, conflict-preserving). The OFF switch is the\n\t// product gate `compatibility.allowCorePatches: false` (or `enabled: false`) in config.\n\tfor (const [name, description] of [\n\t\t[\"pi-style-core-patches\", \"Enable pi-style message/tool core patches\"],\n\t\t[\"pi-style-message-user\", \"Enable pi-style user message prefix\"],\n\t\t[\"pi-style-message-assistant\", \"Enable pi-style assistant message prefix\"],\n\t\t[\"pi-style-message-special-blocks\", \"Enable pi-style boxed compaction/skill/branch/custom message blocks\"],\n\t\t[\"pi-style-tools\", \"Enable pi-style tool renderer decoration\"],\n\t] as const)\n\t\tpi.registerFlag(name, { type: \"boolean\", description, default: true });\n\t// ASCII markers stay opt-in; unicode markers are the default.\n\tpi.registerFlag(\"pi-style-ascii\", { type: \"boolean\", description: \"Use ASCII pi-style markers\" });\n\tconst coordinator = createPiStyleSessionCoordinator(pi, compatibilityTestHooks);\n\tregisterPiStyleCommand(pi, coordinator.app);\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tawait coordinator.start(event, ctx);\n\t});\n\tpi.on(\"agent_start\", () => coordinator.app.runtime.current?.dismissStartup());\n\tpi.on(\"input\", () => coordinator.app.runtime.current?.dismissStartup());\n\tpi.on(\"tool_execution_start\", () => coordinator.app.runtime.current?.dismissStartup());\n\tpi.on(\"model_select\", (event) =>\n\t\tcoordinator.app.update(\n\t\t\t{\n\t\t\t\tmodel: event.model.name || event.model.id,\n\t\t\t\t...(event.model.provider ? { provider: event.model.provider } : {}),\n\t\t\t\t...(event.model.reasoning !== undefined ? { reasoning: event.model.reasoning } : {}),\n\t\t\t},\n\t\t\t\"immediate\",\n\t\t),\n\t);\n\tpi.on(\"thinking_level_select\", (event) => coordinator.app.update({ thinkingLevel: event.level }, \"immediate\"));\n\tpi.on(\"session_info_changed\", (event) => coordinator.app.update({ sessionName: event.name }, \"coalesced\"));\n\tpi.on(\"message_update\", () => coordinator.app.update({}, \"coalesced\"));\n\t// Usage (tokens + cost) is aggregated from finalized session entries at\n\t// message/turn boundaries, mirroring Pi's native footer; per-chunk updates\n\t// stay usage-free to keep streaming cheap.\n\tpi.on(\"message_end\", (_event, ctx) => coordinator.app.update({ ...usagePatch(ctx) }, \"coalesced\"));\n\tpi.on(\"turn_end\", (_event, ctx) => coordinator.app.update({ ...usagePatch(ctx) }, \"deferred\"));\n\tpi.on(\"agent_settled\", (_event, ctx) => coordinator.app.update({ ...usagePatch(ctx) }, \"coalesced\"));\n\tpi.on(\"session_tree\", (_event, ctx) => coordinator.app.update({ ...usagePatch(ctx) }, \"deferred\"));\n\tpi.on(\"session_compact\", (_event, ctx) => coordinator.app.update({ ...usagePatch(ctx) }, \"deferred\"));\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif ([\"write\", \"edit\", \"bash\"].includes(event.toolName)) {\n\t\t\tcoordinator.app.runtime.current?.invalidateGit();\n\t\t\tcoordinator.app.update({ ...usagePatch(ctx) }, \"delayed-retry\");\n\t\t}\n\t});\n\tpi.on(\"user_bash\", (_event, ctx) => {\n\t\tcoordinator.app.runtime.current?.invalidateGit();\n\t\tcoordinator.app.update({ ...usagePatch(ctx) }, \"delayed-retry\");\n\t});\n\tpi.on(\"session_shutdown\", () => coordinator.shutdown());\n}\n"],"mappings":"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","names":["record","value","patch","visibleWidth","r","g","b","visibleWidth","prompt","padding","promptWidth","prefix","continuation","body","renderedBody","marker","widthOf","segment","ownerMap","owners","snapshot","generation","generation","generation","generation","mergePatch","dirname","join","dirname","record","join","homedir","resolve","visibleWidth","truncated","homedir","resolve","countLines","countWords","fill","block","readFileSync","dirname","join","fileURLToPath","visibleWidth","visibleWidth","ESC","inner","highlightCode","ESC","BG_ANSI_PATTERN","oldNum","newNum","marker","highlightCode","segment","displayPath","countLines","queryDetail","displayPath","countLines","displayPath","countLines","getLanguageFromPath","Text","MAX_HIGHLIGHT_DIFF_CHARS","MAX_HIGHLIGHT_DIFF_ROWS","getLanguageFromPath","Text","getLanguageFromPath","highlightCode","countLines","getLanguageFromPath","highlightCode","summary","renderBoxedToolCall","renderBoxedToolResult","visibleWidth","record","renderBoxedToolCall","renderBoxedToolResult","args","record","shape","generation","fileURLToPath","readFile","readFileSync","dirname","join","generation","record","segment"]}