omp-fabric 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/ui/code-preview-shell.ts", "../src/actors/host-event-observer.ts", "../src/capture/interceptor.ts", "../src/commands/fabric.ts", "../src/prewalk/arm.ts", "../src/ui/conversation-shortcut.ts", "../src/speculation/warmup.ts", "../src/storage/lcm-migration.ts", "../src/compaction/lcm-maintenance.ts", "../src/compaction/lcm-runtime.ts", "../src/core/tool-ownership.ts", "../src/audit/details.ts", "../src/core/core-override-guidance.ts", "../src/core/system-guidance.ts", "../src/core/skill-prompt.ts", "../src/core/proxy-contract.ts", "../src/core/direct-tool-approval.ts", "../src/core/skill-references.ts", "../src/fabric-exec-tool.ts", "../src/speculation/summary.ts", "../src/failure-progress.ts", "../src/fabric-exec-arguments.ts", "../src/runtime/core-tool-properties.ts", "../src/type-error-guidance.ts", "../src/ui/row-balance.ts", "../src/output-budget.ts", "../src/fabric-state.ts", "../src/repairs/classify.ts", "../src/host-compatibility.ts", "../src/update/check.ts", "../src/ui/controller.ts", "../src/ui/snapshot.ts", "../src/ui/widget.ts", "../src/ui/escape-halt.ts", "../src/ui/tool-display.ts", "../src/index.ts"],
4
- "sourcesContent": ["// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { Theme, ToolDefinition, ToolRenderResultOptions } from \"@oh-my-pi/pi-coding-agent\";\nimport { Ellipsis } from \"@oh-my-pi/pi-tui\";\nimport {\n Container,\n Text,\n truncateToWidth,\n visibleWidth,\n type Component,\n} from \"@oh-my-pi/pi-tui\";\nimport { continueArcGroup } from \"./arc-group.js\";\n\ntype ToolCallBackgroundMode = \"on\" | \"border\" | \"off\";\ntype AnyTool = ToolDefinition;\n\nexport type FabricToolShellDecorator = <TTool extends AnyTool>(\n tool: TTool,\n options?: {\n mode?: ToolCallBackgroundMode;\n preserveSelfShell?: boolean;\n toolCallTiming?: boolean;\n },\n) => TTool;\n\nexport type PreviewRenderContext = {\n args: unknown;\n toolCallId: string;\n invalidate: () => void;\n lastComponent: Component | undefined;\n state: Record<string, unknown>;\n cwd: string;\n executionStarted: boolean;\n argsComplete: boolean;\n isPartial: boolean;\n expanded: boolean;\n showImages: boolean;\n isError: boolean;\n};\n\ntype TimingState = Record<string, unknown> & {\n codePreviewTimingStartedAt?: number;\n codePreviewTimingEndedAt?: number;\n codePreviewTimingInterval?: ReturnType<typeof setInterval>;\n codePreviewTimingOnlyRenderToken?: number;\n codePreviewTimingCallComponent?: Component;\n codePreviewTimingResultComponent?: Component;\n};\n\ntype BorderState = TimingState & {\n codePreviewBorderCallComponent?: Component;\n codePreviewBorderResultComponent?: Component;\n codePreviewBorderShell?: BorderedToolCall;\n codePreviewBorderTheme?: Theme;\n codePreviewBorderLastCallExecutionStarted?: boolean;\n codePreviewBorderLastCallPartial?: boolean;\n};\n\nconst timingState = (context: { state?: unknown } | undefined): TimingState | undefined =>\n context?.state as TimingState | undefined;\n\nconst isTimingOnlyRender = (state: TimingState | undefined): boolean =>\n state?.codePreviewTimingOnlyRenderToken !== undefined;\n\nconst unwrapTimingComponent = (component: Component | undefined): Component | undefined =>\n component instanceof TimingPreservedComponent ? component.component : component;\n\nconst clearTimingInterval = (state: TimingState): void => {\n if (!state.codePreviewTimingInterval) return;\n clearInterval(state.codePreviewTimingInterval);\n delete state.codePreviewTimingInterval;\n delete state.codePreviewTimingOnlyRenderToken;\n};\n\nconst ensureTimingInterval = (state: TimingState, invalidate: () => void): void => {\n state.codePreviewTimingInterval ??= setInterval(() => {\n const token = (state.codePreviewTimingOnlyRenderToken ?? 0) + 1;\n state.codePreviewTimingOnlyRenderToken = token;\n try {\n invalidate();\n } finally {\n queueMicrotask(() => {\n if (state.codePreviewTimingOnlyRenderToken === token) {\n delete state.codePreviewTimingOnlyRenderToken;\n }\n });\n }\n }, 100);\n};\n\nconst formatDuration = (milliseconds: number): string => {\n const ms = Math.max(0, Math.round(milliseconds));\n if (ms < 1_000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1_000).toFixed(1)}s`;\n const seconds = Math.round(ms / 1_000);\n const hours = Math.floor(seconds / 3_600);\n const minutes = Math.floor((seconds % 3_600) / 60);\n if (hours > 0) return `${hours}h ${minutes}m`;\n return `${minutes}m ${seconds % 60}s`;\n};\n\nconst updateTiming = (\n context: PreviewRenderContext,\n enabled: boolean,\n options: { animate?: boolean; formatLabel?: boolean } = {},\n): string | undefined => {\n const state = timingState(context);\n if (!state) return undefined;\n if (!enabled) {\n clearTimingInterval(state);\n return undefined;\n }\n if (\n context.executionStarted &&\n state.codePreviewTimingStartedAt === undefined &&\n context.isPartial !== false\n ) {\n state.codePreviewTimingStartedAt = Date.now();\n delete state.codePreviewTimingEndedAt;\n }\n const startedAt = state.codePreviewTimingStartedAt;\n if (startedAt === undefined) return undefined;\n if (context.isPartial && options.animate !== false) {\n ensureTimingInterval(state, context.invalidate);\n } else if (!context.isPartial) {\n state.codePreviewTimingEndedAt ??= Date.now();\n clearTimingInterval(state);\n }\n if (options.formatLabel === false) return undefined;\n const running = context.isPartial;\n const endedAt = running ? Date.now() : (state.codePreviewTimingEndedAt ?? Date.now());\n return `${running ? \"Elapsed\" : \"Took\"} ${formatDuration(endedAt - startedAt)}`;\n};\n\nclass TimingPreservedComponent implements Component {\n constructor(readonly component: Component, private readonly state: TimingState) {}\n render(width: number): readonly string[] {\n return this.component.render(width);\n }\n invalidate(): void {\n if (!isTimingOnlyRender(this.state)) this.component.invalidate?.();\n }\n}\n\nclass TimingFooter implements Component {\n constructor(\n private readonly component: Component,\n private readonly footer: string,\n private readonly state: TimingState,\n ) {}\n render(width: number): readonly string[] {\n return [\n ...continueArcGroup([...this.component.render(width)]),\n truncateToWidth(this.footer, width, \"\"),\n ];\n }\n invalidate(): void {\n if (!isTimingOnlyRender(this.state)) this.component.invalidate?.();\n }\n}\n\nconst renderTimedResult = (\n context: PreviewRenderContext,\n theme: Theme,\n render: (context: PreviewRenderContext) => Component,\n label: string | undefined,\n): Component => {\n const state = timingState(context);\n if (!state) return render(context);\n const reused = isTimingOnlyRender(state) ? state.codePreviewTimingResultComponent : undefined;\n const component = reused ?? render({\n ...context,\n lastComponent: unwrapTimingComponent(\n state.codePreviewTimingResultComponent ?? context.lastComponent,\n ),\n });\n state.codePreviewTimingResultComponent = component;\n return label\n ? new TimingFooter(component, theme.fg(\"muted\", `\u2570\u2500 ${label}`), state)\n : component;\n};\n\nconst borderState = (context: PreviewRenderContext): BorderState =>\n context.state as BorderState;\n\nconst shellStates = new WeakMap<object, BorderState>();\n\nconst shellStateFor = (key: unknown): BorderState => {\n const object = typeof key === \"object\" && key !== null ? key : shellStates;\n const existing = shellStates.get(object);\n if (existing) return existing;\n const created: BorderState = {};\n shellStates.set(object, created);\n return created;\n};\n\nconst isRenderComponent = (value: unknown): value is Component =>\n value !== null && typeof value === \"object\" &&\n typeof Reflect.get(value, \"render\") === \"function\";\n\nconst buildRenderContext = (\n args: unknown,\n options: ToolRenderResultOptions & { renderContext?: unknown },\n supplied: Record<string, unknown>,\n fallbackState: BorderState,\n): PreviewRenderContext => {\n const executionStarted = typeof supplied.executionStarted === \"boolean\"\n ? supplied.executionStarted\n : !options.isPartial;\n const argsComplete = typeof supplied.argsComplete === \"boolean\"\n ? supplied.argsComplete\n : !options.isPartial;\n const state = typeof supplied.state === \"object\" && supplied.state !== null\n ? supplied.state as BorderState\n : fallbackState;\n return {\n args,\n toolCallId: typeof supplied.toolCallId === \"string\" ? supplied.toolCallId : \"fabric_exec\",\n invalidate: typeof supplied.invalidate === \"function\"\n ? supplied.invalidate as () => void\n : () => undefined,\n lastComponent: isRenderComponent(supplied.lastComponent) ? supplied.lastComponent : undefined,\n state,\n cwd: typeof supplied.cwd === \"string\" ? supplied.cwd : process.cwd(),\n executionStarted,\n argsComplete,\n isPartial: options.isPartial,\n expanded: options.expanded,\n showImages: typeof supplied.showImages === \"boolean\" ? supplied.showImages : true,\n isError: supplied.isError === true,\n };\n};\n\nconst borderColor = (context: PreviewRenderContext): \"warning\" | \"success\" | \"error\" => {\n if (context.isError) return \"error\";\n return context.isPartial ? \"warning\" : \"success\";\n};\n\nclass BorderedToolCall implements Component {\n private callComponent: Component | undefined;\n private resultComponent: Component | undefined;\n private color: \"borderMuted\" | \"warning\" | \"success\" | \"error\" = \"borderMuted\";\n private timingLabel: string | undefined;\n private cachedWidth: number | undefined;\n private cachedRows: string[] | undefined;\n\n constructor(private readonly theme: Theme, private readonly state: TimingState) {}\n\n setCall(component: Component | undefined): void {\n this.callComponent = component;\n this.invalidateCache();\n }\n setResult(component: Component | undefined): void {\n this.resultComponent = component;\n this.invalidateCache();\n }\n setColor(color: typeof this.color): void {\n if (color === this.color) return;\n this.color = color;\n this.invalidateCache();\n }\n setTimingLabel(label: string | undefined): void {\n if (label === this.timingLabel) return;\n this.timingLabel = label;\n this.invalidateCache();\n }\n render(width: number): readonly string[] {\n if (width === this.cachedWidth && this.cachedRows) return this.cachedRows;\n const rows = this.renderUncached(width);\n this.cachedWidth = width;\n this.cachedRows = rows;\n return rows;\n }\n invalidate(): void {\n this.invalidateCache();\n if (isTimingOnlyRender(this.state)) return;\n this.callComponent?.invalidate?.();\n this.resultComponent?.invalidate?.();\n }\n private invalidateCache(): void {\n this.cachedWidth = undefined;\n this.cachedRows = undefined;\n }\n private renderUncached(width: number): string[] {\n const body = [\n ...(this.callComponent?.render(Math.max(1, width - 4)) ?? []),\n ...(this.resultComponent?.render(Math.max(1, width - 4)) ?? []),\n ];\n if (width < 4) return body;\n const innerWidth = width - 4;\n const border = (value: string) => this.theme.fg(this.color, value);\n const label = this.timingLabel ? ` ${this.theme.fg(\"muted\", this.timingLabel)} ` : \"\";\n const labelWidth = visibleWidth(label);\n const top = labelWidth > 0 && labelWidth <= width - 2\n ? `${border(\"\u256D\")}${border(\"\u2500\".repeat(width - 2 - labelWidth))}${label}${border(\"\u256E\")}`\n : border(`\u256D${\"\u2500\".repeat(width - 2)}\u256E`);\n return [\n top,\n ...body.map((line) => this.frameLine(line, innerWidth, border)),\n border(`\u2570${\"\u2500\".repeat(width - 2)}\u256F`),\n ];\n }\n private frameLine(\n line: string,\n innerWidth: number,\n border: (value: string) => string,\n ): string {\n const text = truncateToWidth(line, innerWidth, \"\");\n const padding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(text)));\n const hasDiffBackground = /^\\x1b\\[48;2;\\d+;\\d+;\\d+m/.test(text);\n return hasDiffBackground\n ? `${border(\"\u2502\")} ${text}${padding} \\x1b[49m${border(\"\u2502\")}\\x1b[0m`\n : `${border(\"\u2502\")} ${text}\\x1b[0m${padding} ${border(\"\u2502\")}`;\n }\n}\n\nconst shouldRenderResultSeparately = (state: BorderState, isPartial: boolean): boolean =>\n state.codePreviewBorderLastCallPartial === undefined ||\n (state.codePreviewBorderLastCallPartial !== isPartial &&\n state.codePreviewBorderLastCallExecutionStarted === true);\n\nexport const withCodePreviewShell: FabricToolShellDecorator = <TTool extends AnyTool>(\n tool: TTool,\n options: {\n mode?: ToolCallBackgroundMode;\n preserveSelfShell?: boolean;\n toolCallTiming?: boolean;\n } = {},\n): TTool => {\n const mode = options.mode ?? \"on\";\n const timingEnabled = options.toolCallTiming ?? true;\n if ((options.preserveSelfShell ?? true) && (tool as AnyTool & { renderShell?: string }).renderShell === \"self\") return tool;\n const originalRenderCall = tool.renderCall;\n const originalRenderResult = tool.renderResult;\n const renderCall = (args: unknown, options: ToolRenderResultOptions, theme: Theme, context: PreviewRenderContext): Component => {\n const renderOptions = { ...options, renderContext: context };\n return originalRenderCall\n ? originalRenderCall.call(tool, args as never, renderOptions, theme)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n };\n const renderResult = (\n result: unknown,\n resultOptions: unknown,\n theme: Theme,\n context: PreviewRenderContext,\n ): Component => {\n const renderOptions = { ...(resultOptions as ToolRenderResultOptions), renderContext: context };\n return originalRenderResult\n ? originalRenderResult.call(tool, result as never, renderOptions, theme)\n : new Container();\n };\n\n return {\n ...tool,\n renderShell: mode === \"on\" ? \"default\" : \"self\",\n renderCall(args, options, theme) {\n const renderOptions = options as ToolRenderResultOptions & { renderContext?: Record<string, unknown> };\n if (!renderOptions) {\n return originalRenderCall\n ? originalRenderCall.call(tool, args, { expanded: false, isPartial: false }, theme)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n }\n const supplied = renderOptions.renderContext && typeof renderOptions.renderContext === \"object\"\n ? renderOptions.renderContext\n : (renderOptions as unknown as Record<string, unknown>);\n const context = buildRenderContext(\n args,\n renderOptions,\n supplied,\n shellStateFor(renderOptions),\n );\n if (mode !== \"border\") {\n const state = timingState(context);\n if (\n context.isPartial &&\n isTimingOnlyRender(state) &&\n state?.codePreviewTimingCallComponent\n ) {\n updateTiming(context, timingEnabled, { animate: false, formatLabel: false });\n return state.codePreviewTimingCallComponent;\n }\n const component = renderCall(args, { expanded: context.expanded, isPartial: context.isPartial }, theme, {\n ...context,\n lastComponent: unwrapTimingComponent(context.lastComponent),\n });\n const wrapped = state\n ? new TimingPreservedComponent(component, state)\n : component;\n if (state) state.codePreviewTimingCallComponent = wrapped;\n updateTiming(context, timingEnabled, { animate: false, formatLabel: false });\n return wrapped;\n }\n\n const state = borderState(context);\n const timingOnly = context.isPartial && isTimingOnlyRender(state);\n const component = timingOnly && state.codePreviewBorderCallComponent\n ? state.codePreviewBorderCallComponent\n : renderCall(args, { expanded: context.expanded, isPartial: context.isPartial }, theme, {\n ...context,\n lastComponent: state.codePreviewBorderCallComponent,\n });\n const label = updateTiming(context, timingEnabled);\n state.codePreviewBorderCallComponent = component;\n state.codePreviewBorderLastCallExecutionStarted = context.executionStarted;\n state.codePreviewBorderLastCallPartial = context.isPartial;\n const shell = state.codePreviewBorderShell instanceof BorderedToolCall &&\n state.codePreviewBorderTheme === theme\n ? state.codePreviewBorderShell\n : new BorderedToolCall(theme, state);\n shell.setCall(component);\n shell.setResult(state.codePreviewBorderResultComponent);\n shell.setColor(borderColor(context));\n shell.setTimingLabel(label);\n state.codePreviewBorderShell = shell;\n state.codePreviewBorderTheme = theme;\n return shell;\n },\n renderResult(result, resultOptions, theme) {\n const renderOptions = (resultOptions ?? {}) as ToolRenderResultOptions & { renderContext?: Record<string, unknown> };\n const supplied = renderOptions.renderContext && typeof renderOptions.renderContext === \"object\"\n ? renderOptions.renderContext\n : (renderOptions as unknown as Record<string, unknown>);\n const context = buildRenderContext(\n result,\n renderOptions,\n supplied,\n shellStateFor(renderOptions),\n );\n const optionsRecord = resultOptions as { isPartial: boolean };\n const label = updateTiming(context, timingEnabled);\n if (mode !== \"border\") {\n return renderTimedResult(\n context,\n theme,\n (next) => renderResult(result, resultOptions, theme, next),\n label,\n );\n }\n\n const state = borderState(context);\n const timingOnly = context.isPartial && isTimingOnlyRender(state);\n const component = timingOnly && state.codePreviewBorderResultComponent\n ? state.codePreviewBorderResultComponent\n : renderResult(result, resultOptions, theme, {\n ...context,\n lastComponent: state.codePreviewBorderResultComponent,\n });\n state.codePreviewBorderResultComponent = component;\n const shell = state.codePreviewBorderShell instanceof BorderedToolCall &&\n state.codePreviewBorderTheme === theme\n ? state.codePreviewBorderShell\n : new BorderedToolCall(theme, state);\n shell.setCall(state.codePreviewBorderCallComponent);\n shell.setResult(component);\n shell.setColor(borderColor(context));\n shell.setTimingLabel(label);\n state.codePreviewBorderShell = shell;\n state.codePreviewBorderTheme = theme;\n return shouldRenderResultSeparately(state, optionsRecord.isPartial)\n ? component\n : new Container();\n },\n } as TTool;\n};\n", "import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionEvent,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport {\n FABRIC_ACTOR_OMP_HOST_EVENTS,\n type FabricActorOmpHostEvent,\n} from \"./types.js\";\n\nexport type FabricActorHostEventObserver = (\n eventName: typeof FABRIC_ACTOR_OMP_HOST_EVENTS[number],\n event: ExtensionEvent,\n context: ExtensionContext,\n) => void;\n\ninterface ObservableExtensionApi {\n on(\n event: typeof FABRIC_ACTOR_OMP_HOST_EVENTS[number],\n handler: (event: ExtensionEvent, context: ExtensionContext) => void,\n ): void;\n}\n\nexport const registerFabricActorHostEventObservers = (\n omp: ExtensionAPI,\n observer: FabricActorHostEventObserver,\n): void => {\n const observable = omp as unknown as ObservableExtensionApi;\n for (const eventName of FABRIC_ACTOR_OMP_HOST_EVENTS) {\n observable.on(eventName, (event, context) => observer(eventName, event, context));\n }\n};\n", "import { existsSync, readdirSync, readFileSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type {\n ExtensionRunner,\n RegisteredTool,\n ToolDefinition,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport { DEFAULT_FABRIC_CONFIG, type FabricToolCaptureConfig } from \"../config.js\";\nimport { CapturedToolCatalog } from \"./catalog.js\";\n\ntype ToolCaptureListener = (tools: RegisteredTool[], runner: ExtensionRunner) => RegisteredTool[];\n\ninterface ToolCaptureHub {\n listeners: Set<ToolCaptureListener>;\n}\n\nexport interface RegisteredToolCaptureController {\n setPolicy(config: FabricToolCaptureConfig): void;\n dispose(): void;\n}\n\nexport interface RegisteredToolCaptureOptions {\n anchorDefinition: ToolDefinition<any, any>;\n catalog: CapturedToolCatalog;\n initialPolicy?: FabricToolCaptureConfig;\n runner?: ExtensionRunner;\n onCatalogRefresh?: () => void;\n}\n\nconst HUB_SYMBOL = Symbol.for(\"omp-fabric.registered-tool-capture.v1\");\nconst ANCHOR_SYMBOL = Symbol.for(\"omp-fabric.registered-tool-anchor.v1\");\n\nconst definitionDelegatesTo = (\n definition: ToolDefinition<any, any>,\n target: ToolDefinition<any, any>,\n): boolean => {\n let current: object | null = definition;\n while (current) {\n if (current === target) return true;\n current = Object.getPrototypeOf(current) as object | null;\n }\n return false;\n};\n\nconst clonePolicy = (config: FabricToolCaptureConfig): FabricToolCaptureConfig => ({\n enabled: config.enabled,\n hideFromModel: config.hideFromModel,\n keepVisible: [...config.keepVisible],\n includeTools: [...config.includeTools],\n excludeTools: [...config.excludeTools],\n defaultRisk: config.defaultRisk,\n risks: { ...config.risks },\n});\n\ntype ExtensionRunnerConstructor = {\n prototype: ExtensionRunner;\n};\n\nconst isExtensionRunnerConstructor = (value: unknown): value is ExtensionRunnerConstructor =>\n typeof value === \"function\" &&\n typeof (value as { prototype?: unknown }).prototype === \"object\" &&\n typeof ((value as { prototype: Record<string, unknown> }).prototype).getAllRegisteredTools ===\n \"function\";\n\n// The bundled OMP CLI loads from dist/bundle/cli.js, whose rollup chunks carry\n// their own ExtensionRunner class identity \u2014 the library-level patch alone\n// never fires because the live host runner is an instance of the bundle's copy.\n// Importing each chunk inside the running CLI is a Node module-cache hit, so\n// scanning the bundle is free and yields the class the host actually runs.\nexport const bundleExtensionRunnerConstructors = async (\n bundleDir: string,\n): Promise<ExtensionRunnerConstructor[]> => {\n const chunksDir = path.join(bundleDir, \"chunks\");\n if (!existsSync(chunksDir)) return [];\n let files: string[];\n try {\n files = readdirSync(chunksDir);\n } catch {\n return [];\n }\n const constructors = new Set<ExtensionRunnerConstructor>();\n for (const file of files) {\n if (!file.endsWith(\".js\")) continue;\n try {\n const module = (await import(pathToFileURL(path.join(chunksDir, file)).href)) as Record<\n string,\n unknown\n >;\n for (const exported of Object.values(module)) {\n if (isExtensionRunnerConstructor(exported)) constructors.add(exported);\n }\n } catch { /* chunk not importable in this realm (worker entries, natives); skip */ }\n }\n return [...constructors];\n};\n\nconst captureHub = (Runner: ExtensionRunnerConstructor): ToolCaptureHub => {\n const prototype = Runner.prototype as ExtensionRunner & Record<PropertyKey, unknown>;\n const existing = prototype[HUB_SYMBOL] as ToolCaptureHub | undefined;\n if (existing) return existing;\n\n const original = prototype.getAllRegisteredTools;\n if (typeof original !== \"function\") {\n throw new Error(\"OMP Fabric could not intercept ExtensionRunner.getAllRegisteredTools\");\n }\n\n const hub: ToolCaptureHub = { listeners: new Set() };\n Object.defineProperty(prototype, HUB_SYMBOL, {\n value: hub,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n prototype.getAllRegisteredTools = function getFabricVisibleTools(): RegisteredTool[] {\n let tools = original.call(this);\n for (const listener of [...hub.listeners]) tools = listener(tools, this);\n return tools;\n };\n return hub;\n};\nconst captureRunner = (runner: ExtensionRunner): ToolCaptureHub => {\n const target = runner as ExtensionRunner & Record<PropertyKey, unknown>;\n const existing = target[HUB_SYMBOL] as ToolCaptureHub | undefined;\n if (existing) return existing;\n const original = target.getAllRegisteredTools;\n if (typeof original !== \"function\") throw new Error(\"OMP Fabric capture runner is missing getAllRegisteredTools\");\n const hub: ToolCaptureHub = { listeners: new Set() };\n Object.defineProperty(target, HUB_SYMBOL, { value: hub, configurable: false });\n target.getAllRegisteredTools = function getFabricVisibleTools(): RegisteredTool[] {\n let tools = original.call(this);\n for (const listener of [...hub.listeners]) tools = listener(tools, this);\n return tools;\n };\n return hub;\n};\n\nconst hostPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n let directory: string;\n try {\n directory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n while (directory !== path.dirname(directory)) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (manifest.name === \"@oh-my-pi/pi-coding-agent\") return directory;\n } catch { /* unreadable or invalid manifest; keep searching */ }\n }\n directory = path.dirname(directory);\n }\n return undefined;\n};\n\nconst extensionRunnerConstructors = async (): Promise<ExtensionRunnerConstructor[]> => {\n const constructors = new Set<ExtensionRunnerConstructor>();\n const packageRoots = new Set(\n [process.env.PI_PACKAGE_DIR, hostPackageRoot()].filter(\n (root): root is string => typeof root === \"string\" && Boolean(root),\n ),\n );\n for (const packageRoot of packageRoots) {\n try {\n const hostEntry = path.join(packageRoot, \"dist\", \"index.js\");\n const hostModule = (await import(pathToFileURL(hostEntry).href)) as {\n ExtensionRunner?: ExtensionRunnerConstructor;\n };\n if (hostModule.ExtensionRunner) constructors.add(hostModule.ExtensionRunner);\n } catch { /* host entry not importable; skip */ }\n for (const Runner of await bundleExtensionRunnerConstructors(\n path.join(packageRoot, \"dist\", \"bundle\"),\n )) {\n constructors.add(Runner);\n }\n }\n if (constructors.size === 0) {\n // The host does not advertise its package directory (tests, embeds,\n // future layouts): fall back to resolving it in this module realm.\n try {\n const hostModule = (await import(\"@oh-my-pi/pi-coding-agent/extensibility/extensions/runner\")) as {\n ExtensionRunner?: ExtensionRunnerConstructor;\n };\n if (hostModule.ExtensionRunner) constructors.add(hostModule.ExtensionRunner);\n } catch { /* host unavailable in this realm; tool capture stays inert */ }\n }\n return [...constructors];\n};\n\nexport const installRegisteredToolCapture = async (\n options: RegisteredToolCaptureOptions,\n): Promise<RegisteredToolCaptureController> => {\n const hubs = options.runner\n ? [captureRunner(options.runner)]\n : (await extensionRunnerConstructors()).map(captureHub);\n const anchorToken = {};\n Object.defineProperty(options.anchorDefinition, ANCHOR_SYMBOL, {\n value: anchorToken,\n configurable: false,\n enumerable: true,\n writable: false,\n });\n let policy = clonePolicy(options.initialPolicy ?? DEFAULT_FABRIC_CONFIG.capture);\n let disposed = false;\n\n const listener: ToolCaptureListener = (tools, runner) => {\n if (disposed) return tools;\n const anchor = tools.find(\n (tool) =>\n (tool.definition as unknown as Record<PropertyKey, unknown>)[ANCHOR_SYMBOL] ===\n anchorToken || definitionDelegatesTo(tool.definition, options.anchorDefinition),\n );\n if (!anchor) return tools;\n\n options.catalog.replace(tools, runner, policy, anchor.extensionPath);\n options.onCatalogRefresh?.();\n return tools;\n };\n\n for (const hub of hubs) hub.listeners.add(listener);\n return {\n setPolicy(config) {\n policy = clonePolicy(config);\n if (!policy.enabled) options.catalog.clear();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n for (const hub of hubs) hub.listeners.delete(listener);\n options.catalog.clear();\n },\n };\n};\n", "import { type ExtensionAPI, type ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { AutocompleteItem } from \"@oh-my-pi/pi-tui\";\nimport type { CapturedToolCatalog } from \"../capture/catalog.js\";\nimport type { FabricActorHostEvent } from \"../actors/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport { resolveAgentDir } from \"../core/agent-dir.js\";\nimport { saveFabricConfig } from \"../config.js\";\nimport { armFabricPrewalkSession } from \"../prewalk/arm.js\";\nimport { truncateMiddle } from \"../util.js\";\nimport type { FabricUiController } from \"../ui/controller.js\";\nimport { FABRIC_CONVERSATION_SHORTCUT } from \"../ui/conversation-shortcut.js\";\nimport { safeText } from \"../ui/format.js\";\nimport {\n FABRIC_PEER_AWAIT_SETTLE_EVENT,\n FABRIC_PEER_CARDS_EVENT,\n FABRIC_PREWALK_REQUEST_EVENT,\n readFabricPeerAwaitSettleRequestV1,\n readFabricPeerCardsRequestV1,\n readFabricPrewalkRequestV1,\n type FabricPrewalkRequestResultV1,\n} from \"../protocol.js\";\nimport { awaitPeerSettle, buildPeerCards } from \"../topology/peer-settle.js\";\nimport type { RepairStatus } from \"../repairs/types.js\";\nimport { ENTROPY_METRIC_VERSION } from \"../entropy/types.js\";\nimport {\n entropySurfaceHash,\n liveSurfaceSnapshot,\n surfaceFreedomReport,\n} from \"../entropy/surface.js\";\nimport {\n machineSessionFilesAsync,\n measureSessionCorpusAsync,\n projectSessionFilesAsync,\n sessionWindowEvidenceAsync,\n} from \"../entropy/sessions.js\";\nimport { measureEntropyAsync } from \"../entropy/meter.js\";\nimport { entropyRepairRows } from \"../entropy/corpus.js\";\nimport { entropyReviewSignals, formatEntropyReviewSignal } from \"../entropy/compiler.js\";\nimport { loadObservationPoolAsync } from \"../entropy/pool-store.js\";\nimport { mergeObservationWindowAsync, poolToValueObservations } from \"../entropy/pool.js\";\nimport { applyCompiledSurface } from \"../entropy/compiled-surface.js\";\nimport {\n loadCompiledSurfaceAsync,\n parseCompiledSurfaceArtifact,\n saveCompiledSurfaceAsync,\n} from \"../entropy/compiled-store.js\";\nimport {\n formatEntropyCommandHints,\n formatEntropyMetric,\n} from \"../entropy/presentation.js\";\nimport { mergeCompiledSurfaces } from \"../entropy/compiled-surface.js\";\nimport { setActiveCompiledSurface } from \"../entropy/active.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\ninterface FabricCommandDeps {\n state: FabricState;\n fabricUi: FabricUiController;\n capturedTools: CapturedToolCatalog;\n applyFabricMode: () => void;\n suspendToolCapture: () => void;\n autoArmPrewalk?: (context: ExtensionContext) => Promise<void>;\n refreshCodePreviewSettings?: () => void;\n refreshToolDisplay?: () => void;\n}\n\nconst extractContentText = (content: unknown): string => {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part !== \"object\" || part === null) return \"\";\n const p = part as Record<string, unknown>;\n return typeof p.text === \"string\" ? p.text : typeof p.type === \"string\" ? p.type : \"\";\n })\n .filter(Boolean)\n .join(\" \");\n }\n return \"\";\n};\n\nconst summarizeLogLine = (entry: unknown): string => {\n if (typeof entry !== \"object\" || entry === null) return truncateMiddle(String(entry), 200);\n const record = entry as Record<string, unknown>;\n const type = typeof record.type === \"string\" ? record.type : undefined;\n const tool = typeof record.toolName === \"string\" ? record.toolName : undefined;\n // OMP session lines and worker message_end both wrap a { role, content } message.\n const msg = record.message;\n if (typeof msg === \"object\" && msg !== null && !Array.isArray(msg)) {\n const m = msg as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"message\";\n const model = typeof m.model === \"string\" ? m.model : undefined;\n const text = extractContentText(m.content);\n const body = (text || JSON.stringify(m)).replace(/\\s+/g, \" \");\n return `${role}${model ? ` [${model}]` : \"\"}: ${truncateMiddle(body, 160)}`;\n }\n if (type) {\n const bits = [type];\n if (tool) bits.push(tool);\n const model = typeof record.modelId === \"string\" ? record.modelId : undefined;\n const provider = typeof record.provider === \"string\" && !model ? record.provider : undefined;\n if (provider) bits.push(provider);\n if (model) bits.push(model);\n return bits.join(\" \");\n }\n return truncateMiddle(JSON.stringify(record), 160);\n};\n\nconst resolvePrewalkModel = async (\n state: FabricState,\n context: ExtensionContext,\n): Promise<string | undefined> => {\n const configured = state.config.prewalk.model?.trim();\n if (configured) {\n if (configured.includes(\"/\")) return configured;\n context.ui.notify(\n \"prewalk.model must use provider/model form.\",\n \"error\",\n );\n return undefined;\n }\n let models: Array<{ provider: string; id: string; name?: string }> = [];\n try {\n models = context.modelRegistry.getAvailable();\n } catch {\n models = [];\n }\n const keys = models\n .map((model) => `${model.provider}/${model.id}`)\n .sort((left, right) => left.localeCompare(right));\n if (keys.length === 0) {\n context.ui.notify(\n \"Prewalk needs an explicit OMP executor model. Configure prewalk.model in /fabric settings.\",\n \"error\",\n );\n return undefined;\n }\n if (!context.hasUI) {\n context.ui.notify(\n \"Prewalk needs prewalk.model in non-interactive mode.\",\n \"error\",\n );\n return undefined;\n }\n return context.ui.select(\"Prewalk executor model\", keys);\n};\n\nconst armPrewalk = async (\n state: FabricState,\n context: ExtensionContext,\n omp: ExtensionAPI,\n task = \"\",\n): Promise<FabricPrewalkRequestResultV1> => {\n if (state.config.prewalk.enabled === false) {\n const error = \"Fabric prewalk is disabled; re-enable with /fabric prewalk --enable or /fabric settings.\";\n context.ui.notify(error, \"error\");\n return { ok: false, error };\n }\n if (!state.config.fullCodeMode || state.config.schema.mode === \"enforce\") {\n const error = \"Fabric prewalk requires full code mode and Schema enforce mode disabled.\";\n context.ui.notify(error, \"error\");\n return { ok: false, error };\n }\n if (state.config.prewalk.mode === \"trajectory\" && !state.config.agents.enabled) {\n const error = \"Trajectory prewalk requires enabled agents. Choose in-place mode or enable agents.\";\n context.ui.notify(error, \"error\");\n return { ok: false, error };\n }\n const model = await resolvePrewalkModel(state, context);\n if (!model) return { ok: false, error: \"Fabric prewalk was not armed.\" };\n\n await armFabricPrewalkSession(state, context, omp, {\n model,\n ...(task ? { task } : {}),\n });\n const modeLabel =\n state.config.prewalk.mode === \"in-place\"\n ? \"Main will continue in place\"\n : \"the trajectory will move to a visible child executor\";\n context.ui.notify(\n task\n ? `Fabric prewalk armed for the next matching Fabric boundary; ${modeLabel} with ${model}${state.config.prewalk.alwaysRearm ? \"; always re-arm enabled\" : \"\"}`\n : `Fabric prewalk armed for the next task; ${modeLabel} with ${model}${state.config.prewalk.alwaysRearm ? \"; always re-arm enabled\" : \"\"}`,\n \"info\",\n );\n if (task) omp.sendUserMessage(task);\n return { ok: true };\n};\n\nexport function registerFabricCommand(omp: ExtensionAPI, deps: FabricCommandDeps): void {\n const { state, fabricUi, capturedTools, applyFabricMode, suspendToolCapture } = deps;\n const unsubscribePrewalkRequests = omp.events?.on?.(FABRIC_PREWALK_REQUEST_EVENT, (value) => {\n const request = readFabricPrewalkRequestV1(value);\n if (!request || !request.claim()) return;\n void (async () => {\n try {\n await state.ensure(request.context);\n request.respond(await armPrewalk(state, request.context, omp));\n } catch (error) {\n request.respond({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n })();\n });\n if (unsubscribePrewalkRequests) {\n omp.on(\"session_shutdown\", () => unsubscribePrewalkRequests());\n }\n\n // Peer queuing protocol (used by pi-queue-steer): enumerate live peer root\n // sessions and hold dispatch until they settle on the project mesh.\n const unsubscribePeerCards = omp.events?.on?.(FABRIC_PEER_CARDS_EVENT, (value) => {\n const request = readFabricPeerCardsRequestV1(value);\n if (!request || !request.claim()) return;\n void (async () => {\n try {\n await state.ensure(request.context);\n request.respond({ ok: true, cards: buildPeerCards(state.peerInfos()) });\n } catch (error) {\n request.respond({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n })();\n });\n const unsubscribePeerAwait = omp.events?.on?.(FABRIC_PEER_AWAIT_SETTLE_EVENT, (value) => {\n const request = readFabricPeerAwaitSettleRequestV1(value);\n if (!request || !request.claim()) return;\n void (async () => {\n try {\n await state.ensure(request.context);\n if (!state.config.mesh.enabled) {\n request.respond({ ok: false, error: \"Fabric mesh is disabled; peers cannot be observed\" });\n return;\n }\n request.respond(await awaitPeerSettle({\n poll: () => state.peerInfos(),\n ...(request.selector !== undefined ? { selector: request.selector } : {}),\n ...(request.settledForMs !== undefined ? { settledForMs: request.settledForMs } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n ...(request.update ? { onUpdate: request.update } : {}),\n }));\n } catch (error) {\n request.respond({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n })();\n });\n if (unsubscribePeerCards || unsubscribePeerAwait) {\n omp.on(\"session_shutdown\", () => {\n unsubscribePeerCards?.();\n unsubscribePeerAwait?.();\n });\n }\n\n const formatRepairStatus = (status: RepairStatus): string => {\n const top = status.fingerprints\n .slice(0, 8)\n .map((entry) => ` ${entry.count}\u00D7 ${entry.fingerprint}`)\n .join(\"\\n\");\n const rows = status.repairs\n .slice(0, 12)\n .map((repair) =>\n repair.kind === \"keyAlias\"\n ? ` ${repair.ref}: ${repair.from} \u2192 ${repair.to}`\n : ` ${repair.provider}.${repair.from} \u2192 ${repair.to}`,\n )\n .join(\"\\n\");\n return [\n `repairs: ${status.enabled ? \"on\" : \"off\"} \u00B7 digest ${status.catalogDigest.slice(0, 12) || \"none\"}`,\n `table: ${status.repairCount} \u00B7 apply hits ${status.applyHits} \u00B7 invocation ${status.invocationErrors} \u00B7 effect dropped ${status.effectDropped}`,\n status.repairs.length > 0 ? `current:\\n${rows}` : \"current: (empty)\",\n ...(status.storeError ? [`store: ${status.storeError}`] : []),\n top ? `fingerprints:\\n${top}` : \"fingerprints: (none this session)\",\n ].join(\"\\n\");\n };\n\n omp.registerShortcut?.(FABRIC_CONVERSATION_SHORTCUT, {\n description: \"Open Fabric conversation or return to Main\",\n handler: async (context) => {\n if (context.mode !== \"tui\") return;\n try {\n await state.ensure(context);\n await fabricUi.openConversation(context);\n } catch (error) {\n context.ui.notify(safeText(error instanceof Error ? error.message : String(error)), \"error\");\n }\n },\n });\n\n omp.registerCommand(\"fabric\", {\n description: \"Open Fabric dashboard or chat, arm prewalk, reload, or manage agents and actors\",\n getArgumentCompletions: (argumentPrefix: string): AutocompleteItem[] | null => {\n const subcommands = [\n \"status\",\n \"dashboard\",\n \"chat\",\n \"settings\",\n \"schema\",\n \"prewalk\",\n \"reload\",\n \"providers\",\n \"agents\",\n \"actors\",\n \"messages\",\n \"clear-messages\",\n \"events\",\n \"log\",\n \"export-log\",\n \"attach\",\n \"stop\",\n \"remove\",\n \"global\",\n \"import\",\n \"export\",\n \"kill\",\n \"repairs\",\n \"entropy\",\n ];\n const idCommands = new Set([\n \"messages\",\n \"clear-messages\",\n \"events\",\n \"log\",\n \"export-log\",\n \"attach\",\n \"stop\",\n \"remove\",\n \"kill\",\n ]);\n const firstSpace = argumentPrefix.indexOf(\" \");\n if (firstSpace < 0) {\n const matches = subcommands.filter((name) => name.startsWith(argumentPrefix));\n return matches.length > 0 ? matches.map((name) => ({ value: name, label: name })) : null;\n }\n const subcommand = argumentPrefix.slice(0, firstSpace);\n const idPrefix = argumentPrefix.slice(firstSpace + 1);\n if (!state.initialized) return null;\n if (subcommand === \"chat\") {\n const snapshot = fabricUi.snapshot();\n const seen = new Set<string>();\n const targets = [snapshot.main, ...snapshot.peers, ...snapshot.actors, ...snapshot.agents, ...(snapshot.participants ?? [])];\n const matches = targets.filter((target) => {\n if (seen.has(target.id)) return false;\n seen.add(target.id);\n return `${target.id} ${target.name}`.toLowerCase().includes(idPrefix.toLowerCase());\n });\n return matches.length > 0 ? matches.map((target) => ({\n value: target.id,\n label: safeText(target.name),\n description: safeText(`${target.status} \u00B7 ${target.id.slice(0, 8)}`),\n })) : null;\n }\n if (subcommand === \"schema\") {\n const modes = [\"off\", \"audit\", \"enforce\"].filter((mode) => mode.startsWith(idPrefix));\n return modes.length > 0 ? modes.map((value) => ({ value, label: value })) : null;\n }\n if (subcommand === \"import\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const template of state.globalActors.list()) {\n items.push({\n value: template.name,\n label: template.name,\n description: `global ${template.runner} template \u00B7 ${template.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* global registry not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n if (!idCommands.has(subcommand)) {\n if (subcommand === \"export\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n return null;\n }\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n try {\n for (const agent of state.agents.list()) {\n const short = agent.id.slice(0, 8);\n items.push({\n value: short,\n label: short,\n description: `${agent.status} ${agent.runner} agent \u00B7 ${agent.name}`,\n });\n }\n } catch {\n /* agents not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n },\n async handler(argumentsText, context) {\n await state.ensure(context);\n const [command = \"dashboard\", ...argumentsList] = argumentsText\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (command === \"reload\") {\n fabricUi.stop();\n suspendToolCapture();\n try {\n await state.initialize(context);\n } catch (error) {\n fabricUi.stop();\n suspendToolCapture();\n throw error;\n }\n context.ui.notify(\"OMP Fabric reloaded\", \"info\");\n // initialize() reloads configuration, so an externally edited\n // ui.toolDisplay must re-render existing transcript cards too.\n deps.refreshToolDisplay?.();\n return;\n }\n if (command === \"settings\") {\n const { openFabricSettings } = await import(\"../ui/settings.js\");\n await openFabricSettings(context, {\n state,\n applyFabricMode,\n capturedTools,\n // Only card-affecting preferences pay for a transcript refresh:\n // refreshToolDisplay re-renders every fabric_exec card, so gating it\n // on the display sections keeps unrelated saves off the transcript.\n onConfigApplied: (id) => {\n if (id.startsWith(\"codePreview.\")) {\n deps.refreshCodePreviewSettings?.();\n deps.refreshToolDisplay?.();\n } else if (id === \"ui.toolDisplay\" || id === \"ui.showAgentToolPreview\") {\n deps.refreshToolDisplay?.();\n }\n },\n });\n return;\n }\n if (command === \"schema\") {\n const requested = argumentsList[0];\n if (requested === undefined) {\n const status = state.schemaStatus(context);\n context.ui.notify(\n `Schema mode: ${status.mode} (${status.source}) \u00B7 executor: ${status.executorRuntime} \u00B7 /fabric schema [off|audit|enforce] overrides this session only`,\n \"info\",\n );\n return;\n }\n if (requested !== \"off\" && requested !== \"audit\" && requested !== \"enforce\") {\n context.ui.notify(\"Usage: /fabric schema [off|audit|enforce]\", \"warning\");\n return;\n }\n try {\n state.setSchemaMode(context, requested);\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n return;\n }\n context.ui.notify(\n `Schema mode set to ${requested} for this session (config file unchanged; the next session starts from the configured mode)`,\n \"info\",\n );\n return;\n }\n if (command === \"prewalk\") {\n const option = argumentsList[0];\n if (option === \"--disable\" || option === \"--enable\") {\n const enabled = option === \"--enable\";\n try {\n const saved = saveFabricConfig(\n {\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n scope: \"global\",\n },\n { prewalk: { enabled } },\n );\n state.reloadConfig(context);\n if (!enabled) {\n state.prewalk.cancel();\n state.prewalkDrift.drop(context.sessionManager.getSessionId());\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n }\n context.ui.notify(\n `Fabric prewalk ${enabled ? \"enabled\" : \"disabled\"} (${saved.scope}: ${saved.path})`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n `Failed to update Fabric prewalk setting: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n return;\n }\n if (option === \"--off\" || option === \"--cancel\") {\n state.prewalk.cancel();\n state.prewalkDrift.drop(context.sessionManager.getSessionId());\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n context.ui.notify(\"Fabric prewalk cancelled\", \"info\");\n return;\n }\n if (option === \"--status\") {\n const status = state.prewalk.status();\n context.ui.notify(\n status.state === \"idle\"\n ? \"Fabric prewalk is idle\"\n : `Fabric prewalk ${status.state} (${status.mode}) \u2192 ${status.model}${status.task ? `\\nTask: ${status.task}` : \"\"}`,\n \"info\",\n );\n return;\n }\n const task = argumentsText.trim().slice(command.length).trim();\n await armPrewalk(state, context, omp, task);\n return;\n }\n if (command === \"chat\") {\n await fabricUi.openConversation(context, argumentsList.join(\" \") || undefined);\n return;\n }\n if (command === \"dashboard\" || command === \"ui\") {\n await fabricUi.openDashboard(context);\n return;\n }\n if (command === \"providers\") {\n const providers = state.registry.providers();\n context.ui.notify(\n providers.map((provider) => `${provider.name} \u2014 ${provider.description}`).join(\"\\n\"),\n \"info\",\n );\n return;\n }\n if (command === \"captured\") {\n const query = argumentsList.join(\" \").toLowerCase();\n const tools = capturedTools\n .list()\n .filter(\n (tool) =>\n !query ||\n `${tool.name} ${tool.definition.description} ${tool.sourceInfo.path}`\n .toLowerCase()\n .includes(query),\n );\n const shown = tools.slice(0, 100);\n context.ui.notify(\n shown.length > 0\n ? [\n ...shown.map((tool) => `${tool.name} [${tool.risk}] \u2014 ${tool.sourceInfo.path}`),\n ...(tools.length > shown.length\n ? [`\u2026 ${tools.length - shown.length} more captured tools`]\n : []),\n ].join(\"\\n\")\n : query\n ? `No captured extension tools matching ${JSON.stringify(query)}`\n : \"No extension tools captured\",\n \"info\",\n );\n return;\n }\n if (command === \"agents\") {\n const agents = state.agents.list();\n context.ui.notify(\n agents.length > 0\n ? agents\n .map(\n (agent) =>\n `${agent.id.slice(0, 8)} ${agent.status} ${agent.runner}/${agent.transport} \u2014 ${agent.name}`,\n )\n .join(\"\\n\")\n : \"No Fabric agents\",\n \"info\",\n );\n return;\n }\n if (command === \"actors\") {\n const actors = state.actors.list();\n context.ui.notify(\n actors.length > 0\n ? actors\n .map(\n (actor) =>\n `${actor.id.slice(0, 8)} ${actor.status} ${actor.runner} q:${actor.queued} \u2014 ${actor.name}`,\n )\n .join(\"\\n\")\n : \"No Fabric actors\",\n \"info\",\n );\n return;\n }\n if (command === \"messages\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric messages <actor-id>\", \"warning\");\n return;\n }\n try {\n const actor = state.actors.status(id);\n const messages = state.actors.messages(actor.id, 20);\n const shortId = actor.id.slice(0, 8);\n const body =\n messages.length > 0\n ? messages\n .map((message) => {\n const value = message.text ?? message.error ?? message.action ?? \"data\";\n const summary = truncateMiddle(value.replace(/\\s+/g, \" \"), 500);\n const runTag = message.runId ? ` [${message.runId.slice(0, 8)}]` : \"\";\n const usageTag = message.usage\n ? ` \u00B7 ${message.usage.input + message.usage.output} tok`\n : \"\";\n return `${message.direction === \"in\" ? \"\u2192\" : \"\u2190\"} ${message.source}${runTag}: ${summary}${usageTag}`;\n })\n .join(\"\\n\")\n : `No messages for ${actor.name}`;\n const footer = `\\nInspect LLM I/O: /fabric log ${shortId} \u00B7 Export: /fabric export-log ${actor.name}`;\n context.ui.notify(`${body}${footer}`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"log\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\n \"Usage: /fabric log <id> [session|run|all] [--lines N] [--run <runId>]\",\n \"warning\",\n );\n return;\n }\n let type: \"session\" | \"run\" | \"all\" = \"session\";\n let lines = 40;\n let runId: string | undefined;\n for (let i = 1; i < argumentsList.length; i++) {\n const arg = argumentsList[i]!;\n if (arg === \"session\" || arg === \"run\" || arg === \"all\") type = arg;\n else if ((arg === \"--lines\" || arg === \"-n\") && i + 1 < argumentsList.length) {\n const n = Number(argumentsList[++i]);\n if (n > 0) lines = Math.min(n, 5000);\n } else if (arg === \"--run\" && i + 1 < argumentsList.length) {\n runId = argumentsList[++i];\n }\n }\n try {\n const actor = state.actors.status(id);\n const log = state.actors.readLog(actor.id, { type, lines, ...(runId ? { runId } : {}) });\n const parts: string[] = [`Actor ${actor.name} \u00B7 ${log.sessionFile}`];\n if (log.session.length > 0) {\n parts.push(`\u2500\u2500 session (last ${log.session.length} lines) \u2500\u2500`);\n for (const line of log.session) parts.push(summarizeLogLine(line.parsed ?? line.raw));\n }\n if (log.run) {\n parts.push(\n `\u2500\u2500 run ${log.run.runId.slice(0, 8)} (${log.run.status?.status ?? \"?\"}) \u2500\u2500`,\n );\n for (const line of log.run.events) parts.push(summarizeLogLine(line.parsed ?? line.raw));\n }\n if (log.retainedRuns.length > 0) {\n parts.push(\n `retained runs: ${log.retainedRuns.map((r) => r.slice(0, 8)).join(\" \")}`,\n );\n }\n context.ui.notify(\n parts.length > 1 ? truncateMiddle(parts.join(\"\\n\"), 8000) : `No log found for ${actor.name}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"export-log\") {\n const id = argumentsList[0];\n const destArg = argumentsList.slice(1).join(\" \");\n if (!id) {\n context.ui.notify(\"Usage: /fabric export-log <id> [path]\", \"warning\");\n return;\n }\n try {\n const dest = path.resolve(\n destArg || path.join(\"fabric-logs\", `export-${Date.now()}`),\n );\n fs.mkdirSync(dest, { recursive: true });\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n let label: string;\n let copied: string[] = [];\n if (actor) {\n const full = state.actors.status(actor.id);\n label = actor.name;\n if (full.sessionFile && fs.existsSync(full.sessionFile)) {\n fs.copyFileSync(full.sessionFile, path.join(dest, \"session.jsonl\"));\n copied.push(\"session.jsonl\");\n }\n if (full.logDir && fs.existsSync(full.logDir)) {\n fs.cpSync(full.logDir, path.join(dest, \"runs\"), { recursive: true });\n copied.push(\"runs/\");\n }\n } else {\n const runDir = state.agents.runDirectory(id);\n const status = state.agents.status(id);\n label = status.name;\n if (runDir && fs.existsSync(runDir)) {\n fs.cpSync(runDir, dest, { recursive: true });\n copied.push(\"run/\");\n }\n }\n if (copied.length === 0) {\n context.ui.notify(`No log files found for ${label}`, \"warning\");\n return;\n }\n context.ui.notify(`Exported ${label} log \u2192 ${dest} (${copied.join(\", \")})`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"clear-messages\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric clear-messages <actor-id>\", \"warning\");\n return;\n }\n try {\n const actor = state.actors.status(id);\n await state.actors.clearMessages(actor.id);\n context.ui.notify(`Cleared message history for ${actor.name}`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"events\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric events <actor-id> [event...]\", \"warning\");\n return;\n }\n try {\n const actor = state.actors.status(id);\n const events = argumentsList.slice(1) as FabricActorHostEvent[];\n await state.actors.setEvents(actor.id, events);\n context.ui.notify(\n `Set ${actor.name} events: ${events.join(\", \") || \"(none)\"}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"stop\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric stop <id>\", \"warning\");\n return;\n }\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n if (actor) {\n await state.actors.stop(actor.id);\n context.ui.notify(`Stopped Fabric actor ${actor.id.slice(0, 8)}`, \"info\");\n return;\n }\n const agent = state.agents.list().find((candidate) => candidate.id.startsWith(id));\n if (!agent) {\n context.ui.notify(`Unknown Fabric actor or agent: ${id}`, \"error\");\n return;\n }\n await state.agents.stop(agent.id);\n context.ui.notify(`Stopped Fabric agent ${agent.id.slice(0, 8)}`, \"info\");\n return;\n }\n if (command === \"remove\" || command === \"kill\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric remove <id>\", \"warning\");\n return;\n }\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n if (actor) {\n await state.actors.remove(actor.id);\n context.ui.notify(`Removed Fabric actor ${actor.id.slice(0, 8)} (${actor.name})`, \"info\");\n return;\n }\n const agent = state.agents.list().find((candidate) => candidate.id.startsWith(id));\n if (!agent) {\n context.ui.notify(`Unknown Fabric actor or agent: ${id}`, \"error\");\n return;\n }\n await state.agents.stop(agent.id);\n await state.agents.cleanup(agent.id);\n context.ui.notify(`Removed Fabric agent ${agent.id.slice(0, 8)}`, \"info\");\n return;\n }\n if (command === \"attach\") {\n const id = argumentsList[0];\n const agent = id\n ? state.agents.list().find((candidate) => candidate.id.startsWith(id))\n : undefined;\n if (!agent?.attachCommand) {\n context.ui.notify(\"No attachable Fabric agent found\", \"warning\");\n return;\n }\n context.ui.notify(agent.attachCommand, \"info\");\n return;\n }\n if (command === \"global\") {\n const templates = state.globalActors.list();\n context.ui.notify(\n templates.length > 0\n ? templates\n .map((template) => `${template.id.slice(0, 8)} global ${template.runner} \u2014 ${template.name}`)\n .join(\"\\n\")\n : \"No global Fabric actor templates\",\n \"info\",\n );\n return;\n }\n if (command === \"import\") {\n const key = argumentsList[0];\n if (!key) {\n context.ui.notify(\"Usage: /fabric import <global-actor-name-or-id> [as <new-name>]\", \"warning\");\n return;\n }\n try {\n const def = state.globalActors.resolve(key);\n if (!def) {\n context.ui.notify(`Unknown global actor: ${key}`, \"error\");\n return;\n }\n const asIndex = argumentsList.indexOf(\"as\");\n const as =\n asIndex >= 0 && argumentsList[asIndex + 1] ? argumentsList[asIndex + 1] : undefined;\n const actor = await state.actors.create(state.globalActors.toRequest(def, as));\n context.ui.notify(`Imported global actor \"${def.name}\" as ${actor.name}`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"export\") {\n const id = argumentsList[0];\n const overwrite = argumentsList.includes(\"--overwrite\") || argumentsList.includes(\"-f\");\n if (!id) {\n context.ui.notify(\"Usage: /fabric export <actor-id> [--overwrite]\", \"warning\");\n return;\n }\n try {\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n if (!actor) {\n context.ui.notify(`Unknown Fabric actor: ${id}`, \"error\");\n return;\n }\n const def = state.actors.definition(actor.id);\n const template = state.globalActors.create(def, overwrite);\n context.ui.notify(`Exported \"${template.name}\" to global actors`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"repairs\") {\n if (argumentsList[0] !== undefined) {\n context.ui.notify(\"Usage: /fabric repairs\", \"warning\");\n return;\n }\n context.ui.notify(formatRepairStatus(state.repairs.status()), \"info\");\n return;\n }\n if (command === \"entropy\") {\n const exportArtifactIndex = argumentsList.indexOf(\"export-artifact\");\n if (exportArtifactIndex >= 0) {\n const target = argumentsList[exportArtifactIndex + 1];\n try {\n const loaded = await loadCompiledSurfaceAsync(resolveAgentDir());\n if (loaded.error) {\n context.ui.notify(loaded.error, \"error\");\n return;\n }\n if (!loaded.file) {\n context.ui.notify(\n \"No compiled surface to export; wait for a compile to pass its gate\",\n \"warning\",\n );\n return;\n }\n const dest = path.resolve(\n target ?? path.join(resolveAgentDir(), \"fabric\", \"entropy\", \"artifact.json\"),\n );\n await fs.promises.mkdir(path.dirname(dest), { recursive: true });\n await fs.promises.writeFile(dest, `${JSON.stringify(loaded.file, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n context.ui.notify(\n `Exported compiled surface (${loaded.file.actions.length} tightened \u00B7 ${loaded.file.quarantined.length} quarantined) \u2192 ${dest}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n const importIndex = argumentsList.indexOf(\"import\");\n if (importIndex >= 0) {\n const source = argumentsList[importIndex + 1];\n if (!source) {\n context.ui.notify(\"Usage: /fabric entropy import <artifact.json>\", \"warning\");\n return;\n }\n try {\n const raw: unknown = JSON.parse(\n await fs.promises.readFile(path.resolve(source), \"utf-8\"),\n );\n const incoming = parseCompiledSurfaceArtifact(raw);\n if (!incoming) {\n context.ui.notify(`Artifact is invalid: ${source}`, \"error\");\n return;\n }\n const agentDir = resolveAgentDir();\n const localLoaded = await loadCompiledSurfaceAsync(agentDir);\n if (localLoaded.error) {\n context.ui.notify(localLoaded.error, \"error\");\n return;\n }\n const live = await liveSurfaceSnapshot({\n registry: state.registry,\n extensionContext: context,\n cwd: state.cwd ?? context.cwd,\n });\n const merged = mergeCompiledSurfaces(localLoaded.file, incoming, live);\n const saved = await saveCompiledSurfaceAsync(agentDir, merged.file);\n if (state.config.entropy.compile) setActiveCompiledSurface(saved.file);\n context.ui.notify(\n `Imported compiled surface: ${merged.file.actions.length} tightened \u00B7 ${merged.file.quarantined.length} quarantined \u00B7 ${merged.droppedOverlays + merged.droppedQuarantines} dropped (base digest mismatch)`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n const exportIndex = argumentsList.indexOf(\"export\");\n if (exportIndex >= 0) {\n const target = argumentsList[exportIndex + 1];\n try {\n const snapshot = await liveSurfaceSnapshot({\n registry: state.registry,\n extensionContext: context,\n cwd: state.cwd ?? context.cwd,\n });\n const dest = path.resolve(\n target ?? path.join(resolveAgentDir(), \"fabric\", \"entropy\", \"surface.json\"),\n );\n await fs.promises.mkdir(path.dirname(dest), { recursive: true });\n await fs.promises.writeFile(dest, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n context.ui.notify(\n `Exported ${snapshot.actions.length} surface actions \u2192 ${dest}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n const projectScope = argumentsList.includes(\"--project\");\n const scopedArguments = argumentsList.filter((argument) => argument !== \"--project\");\n if (scopedArguments[0] !== undefined) {\n context.ui.notify(\n \"Usage: /fabric entropy [--project] [export [path] | export-artifact [path] | import <path>]\",\n \"warning\",\n );\n return;\n }\n try {\n const status = state.repairs.status();\n const agentDir = resolveAgentDir();\n const scopeCwd = state.cwd ?? context.cwd;\n const [loadedCompiled, live, files] = await Promise.all([\n loadCompiledSurfaceAsync(agentDir),\n liveSurfaceSnapshot({\n registry: state.registry,\n extensionContext: context,\n cwd: scopeCwd,\n }),\n projectScope\n ? projectSessionFilesAsync(agentDir, scopeCwd)\n : machineSessionFilesAsync(agentDir, scopeCwd),\n ]);\n const snapshot = loadedCompiled.file\n ? applyCompiledSurface(live, loadedCompiled.file)\n : live;\n const freedom = surfaceFreedomReport(snapshot);\n const surfaceDigest = entropySurfaceHash(snapshot);\n const corpus = await measureSessionCorpusAsync({\n files,\n surface: snapshot,\n catalogDigest: surfaceDigest,\n });\n const formatFreedom = (value: number): string =>\n String(Math.round(value * 100) / 100);\n const worst = freedom.actions\n .slice(0, 4)\n .map((action) => `${action.ref} ${formatFreedom(action.freedom)}`)\n .join(\" \u00B7 \");\n const latest = corpus.latest;\n const sessionsLine =\n corpus.sessions.length === 0 || latest === undefined\n ? `session entropy (observed): no fabric_exec traces in the latest ${files.length} ${projectScope ? \"project\" : \"machine\"} sessions`\n : `session entropy (observed): ${corpus.sessions.length} sessions \u00B7 latest ${latest.totals.operations} ops \u00B7 behavioral ${formatEntropyMetric(latest.behavioralScore)} + surface ${formatEntropyMetric(latest.staticScore)} = ${formatEntropyMetric(latest.behavioralScore + latest.staticScore)} \u00B7 lower is better \u00B7 slope ${formatEntropyMetric(corpus.trend.slopePerStep)}/session \u00B7 ${\n latest.totals.invocationRejectionsPer1k === 0 && corpus.trend.slopePerStep <= 0\n ? \"ratchet holding\"\n : \"ratchet slipping\"\n }`;\n const modelsLine =\n corpus.models.length > 1\n ? `models: ${corpus.models\n .map(\n (model) =>\n `${model.model} behavioral ${formatEntropyMetric(model.latestBehavioralScore)} \u00B7 slope ${formatEntropyMetric(model.slopePerSession)}`,\n )\n .join(\" \u00B7 \")}`\n : undefined;\n const compiledLine = loadedCompiled.error\n ? `compiled: unavailable \u2014 ${loadedCompiled.error}`\n : loadedCompiled.file\n ? `compiled: v${loadedCompiled.file.metricVersion} \u00B7 ${loadedCompiled.file.actions.length} tightened \u00B7 ${loadedCompiled.file.quarantined.length} quarantined \u00B7 ${loadedCompiled.file.applied.length} applied \u00B7 gate ${loadedCompiled.file.gate.passed ? \"pass\" : \"REJECTED\"} (${formatEntropyMetric(loadedCompiled.file.gate.beforeScore)} \u2192 ${formatEntropyMetric(loadedCompiled.file.gate.afterScore)})`\n : \"compiled: none\";\n // Review listing: the signals the compiler declined to apply,\n // derived read-only from the current window plus the pool (the\n // merge is in memory; the listing never writes the pool).\n let reviewLine: string;\n try {\n const [windowEvidence, poolLoaded] = await Promise.all([\n sessionWindowEvidenceAsync(files),\n loadObservationPoolAsync(agentDir),\n ]);\n if (poolLoaded.error) {\n reviewLine = `review: unavailable \u2014 ${poolLoaded.error}`;\n } else if (windowEvidence.traces.length === 0) {\n reviewLine = \"review: no window evidence\";\n } else {\n const mergedPool = await mergeObservationWindowAsync(\n poolLoaded.file,\n windowEvidence.observationWindows,\n );\n const signals = entropyReviewSignals({\n report: await measureEntropyAsync({\n traces: windowEvidence.traces,\n surface: snapshot,\n catalogDigest: surfaceDigest,\n }),\n traces: windowEvidence.traces,\n surface: snapshot,\n repairs: entropyRepairRows(state.repairs.repairs),\n valueObservations: poolToValueObservations(mergedPool.file),\n });\n reviewLine =\n signals.length === 0\n ? \"review: none\"\n : `review: ${signals.length} suggestion${signals.length === 1 ? \"\" : \"s\"} \u00B7 ${signals\n .slice(0, 4)\n .map(formatEntropyReviewSignal)\n .join(\" \u00B7 \")}${signals.length > 4 ? ` \u00B7 +${signals.length - 4} more` : \"\"}`;\n }\n } catch {\n reviewLine = \"review: unavailable\";\n }\n context.ui.notify(\n [\n `entropy: metric v${ENTROPY_METRIC_VERSION} \u00B7 surface ${surfaceDigest.slice(0, 12)} \u00B7 ${freedom.actions.length} actions`,\n `live: invocation errors ${status.invocationErrors} \u00B7 effect dropped ${status.effectDropped} \u00B7 aliases ${status.repairCount} \u00B7 alias hits ${status.applyHits}`,\n compiledLine,\n reviewLine,\n `surface freedom (potential): mean ${formatFreedom(freedom.mean)}${worst ? ` \u00B7 worst ${worst}` : \"\"}`,\n sessionsLine,\n ...(modelsLine ? [modelsLine] : []),\n ...formatEntropyCommandHints(),\n ].join(\"\\n\"),\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n if (command !== \"status\") {\n context.ui.notify(\n \"Usage: /fabric [status|dashboard|chat [id-or-name]|prewalk [task]|prewalk --off|--disable|--enable|reload|providers|agents|actors|global|import <name> [as <new>]|export <id> [--overwrite]|messages <id>|clear-messages <id>|events <id> [event...]|log <id>|export-log <id>|attach <id>|stop <id>|remove <id>|kill <id>|repairs|entropy]\",\n \"warning\",\n );\n return;\n }\n const config = state.config;\n context.ui.notify(\n [\n `cwd: ${state.cwd}`,\n `mode: ${config.fullCodeMode ? \"full code (Fabric-owned core tools)\" : \"orchestration-only (native OMP tools)\"}`,\n `providers: ${state.registry\n .providers()\n .map((provider) => provider.name)\n .join(\", \")}`,\n `runner: ${config.agents.runner} \u00B7 transport: ${config.agents.transport} \u00B7 model: ${\n config.agents.runner === \"claude\"\n ? config.agents.claude.model || \"Claude default\"\n : config.agents.runner === \"veda\"\n ? `${config.agents.veda.model || \"Veda default\"} \u00B7 backend ${config.agents.veda.backend} \u00B7 persona ${config.agents.veda.persona}`\n : config.agents.model || \"inherit\"\n }`,\n `agent limits: concurrency ${config.agents.maxConcurrent}, per execution ${config.agents.maxPerExecution}, depth ${config.agents.maxDepth}`,\n (() => {\n const prewalk = state.prewalk.status();\n return prewalk.state === \"idle\"\n ? `prewalk: idle \u00B7 ${config.prewalk.mode} \u00B7 model ${config.prewalk.model || \"Ask each time\"} \u00B7 auto-arm & re-arm ${config.prewalk.alwaysRearm ? \"on\" : \"off\"}`\n : `prewalk: ${prewalk.state} \u00B7 ${prewalk.mode} \u2192 ${prewalk.model}${prewalk.alwaysRearm ? \" \u00B7 always re-arm\" : \"\"}`;\n })(),\n config.fullCodeMode && config.capture.enabled\n ? `captured tools: ${capturedTools.size} \u00B7 model visibility: ${config.capture.hideFromModel ? \"hidden\" : \"visible\"}`\n : \"captured tools: disabled (native registry preserved)\",\n `actors: ${state.actors.list().length} \u00B7 mesh: ${config.mesh.enabled ? state.mesh.root : \"disabled\"}`,\n `MCP: ${config.mcp.enabled ? \"enabled\" : \"disabled\"}`,\n `UI: ${config.ui.enabled ? `${config.ui.widget} widget above chat` : \"disabled\"}`,\n ].join(\"\\n\"),\n \"info\",\n );\n },\n });\n}\n", "import type { ExtensionAPI, ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport {\n PREWALK_ARMED_MESSAGE_TYPE,\n hasPrewalkArmedPrompt,\n prewalkArmedPrompt,\n} from \"./handoff.js\";\n\n// The single arm path shared by `/fabric prewalk` and alwaysRearm session\n// auto-arm, so drift baseline, hidden armed advisory, and status chip never\n// drift apart between entry points.\nexport const armFabricPrewalkSession = async (\n state: FabricState,\n context: ExtensionContext,\n omp: ExtensionAPI,\n input: { model: string; task?: string },\n): Promise<void> => {\n const { prewalk } = state.config;\n const sessionId = context.sessionManager.getSessionId();\n state.prewalk.arm({\n model: input.model,\n mode: prewalk.mode,\n sessionId,\n ...(input.task ? { task: input.task } : {}),\n ...(prewalk.thinking ? { thinking: prewalk.thinking } : {}),\n alwaysRearm: prewalk.alwaysRearm,\n });\n // Anchor the shell-write drift window at arm time so the first\n // bash-running boundary diffs against the pre-task tree state; only\n // snapshot when the fs fallback can actually claim.\n if (prewalk.detectShellWrites) {\n await state.prewalkDrift.captureBaseline(sessionId, context.cwd);\n }\n // Hidden advisory framing, queued for the next prompt (rules before the\n // task when the caller submits one). nextTurn never triggers a turn;\n // custom messages never fire `input`, so observeTask ignores it.\n const armedPrompt = prewalkArmedPrompt(prewalk.mode, input.model);\n if (!hasPrewalkArmedPrompt(context.sessionManager.getBranch(), armedPrompt)) {\n omp.sendMessage(\n {\n customType: PREWALK_ARMED_MESSAGE_TYPE,\n content: armedPrompt,\n display: false,\n details: { mode: prewalk.mode, model: input.model },\n },\n { deliverAs: \"nextTurn\" },\n );\n }\n context.ui.setStatus(\"fabric-prewalk\", `armed (${prewalk.mode}) \u2192 ${input.model}`);\n};\n\n// alwaysRearm covers unarmed starts too: every session (and `/fabric reload`)\n// opens armed, not only sessions following a completed handoff. Prerequisites\n// mirror the `/fabric prewalk` command gates, minus interactive model\n// selection \u2014 auto-arm is non-interactive and reads `prewalk.model`.\n//\n// Returns a human-readable reason when auto-arm is configured but skipped for\n// health reasons; undefined when it armed or when the feature is off / an arm\n// already exists.\nexport const autoArmFabricPrewalk = async (\n state: FabricState,\n context: ExtensionContext,\n omp: ExtensionAPI,\n): Promise<string | undefined> => {\n const { prewalk } = state.config;\n if (prewalk.enabled === false || !prewalk.alwaysRearm) return undefined;\n // initialize() cancels any prior arm at session start; a non-idle status\n // means another path armed first \u2014 never clobber it.\n if (state.prewalk.status().state !== \"idle\") return undefined;\n if (!state.config.fullCodeMode || state.config.schema.mode === \"enforce\") {\n return \"Fabric prewalk auto-arm skipped: requires full code mode with Schema enforce mode disabled.\";\n }\n if (prewalk.mode === \"trajectory\" && !state.config.agents.enabled) {\n return \"Fabric prewalk auto-arm skipped: trajectory mode requires agents.enabled.\";\n }\n const model = prewalk.model?.trim();\n if (!model || !model.includes(\"/\")) {\n return \"Fabric prewalk auto-arm skipped: set prewalk.model (provider/model) in /fabric settings so sessions arm without the interactive picker.\";\n }\n await armFabricPrewalkSession(state, context, omp, { model });\n return undefined;\n};\n", "export const FABRIC_CONVERSATION_SHORTCUT = \"ctrl+shift+a\";\nexport const FABRIC_CONVERSATION_HINT = \"Ctrl+Shift+A chat\";\n", "import type { ExtensionContext, MessageUpdateEvent } from \"@oh-my-pi/pi-coding-agent\";\nimport { streamedToolCallName } from \"./stream-tap.js\";\nimport type { FabricSpeculationStreamTap } from \"./stream-tap.js\";\n\nexport interface FabricSpeculationWarmupOptions {\n enabled(): boolean;\n tap(): FabricSpeculationStreamTap | undefined;\n activate(context: ExtensionContext): Promise<void>;\n maxBufferedEvents?: number;\n maxBufferedChars?: number;\n}\n\nconst DEFAULT_MAX_BUFFERED_EVENTS = 4_096;\nconst DEFAULT_MAX_BUFFERED_CHARS = 2 * 1024 * 1024;\n\nexport class FabricSpeculationWarmup {\n readonly #options: FabricSpeculationWarmupOptions;\n readonly #buffered: MessageUpdateEvent[] = [];\n #bufferedChars = 0;\n #activating = false;\n #overflowed = false;\n\n constructor(options: FabricSpeculationWarmupOptions) {\n this.#options = options;\n }\n\n get pending(): number {\n return this.#buffered.length;\n }\n\n reset(): void {\n this.#buffered.length = 0;\n this.#bufferedChars = 0;\n this.#overflowed = false;\n }\n\n handleMessageUpdate(event: MessageUpdateEvent, context: ExtensionContext): void {\n try {\n const tap = this.#options.tap();\n if (tap) {\n this.#drain(tap, context);\n tap.handleMessageUpdate(event, context);\n return;\n }\n if (!this.#options.enabled()) return;\n const assistantEvent = event.assistantMessageEvent;\n if (\n assistantEvent.type !== \"toolcall_start\" &&\n assistantEvent.type !== \"toolcall_delta\" &&\n assistantEvent.type !== \"toolcall_end\"\n ) {\n return;\n }\n const name = streamedToolCallName(event);\n if (name !== undefined && name !== \"fabric_exec\") return;\n this.#buffer(event, assistantEvent.type === \"toolcall_delta\" ? assistantEvent.delta.length : 0);\n if (this.#activating) return;\n this.#activating = true;\n void this.#options\n .activate(context)\n .then(\n () => {\n const activated = this.#options.tap();\n if (activated) this.#drain(activated, context);\n },\n () => undefined,\n )\n .finally(() => {\n this.#activating = false;\n });\n } catch {\n return;\n }\n }\n\n #buffer(event: MessageUpdateEvent, chars: number): void {\n if (this.#overflowed) return;\n if (\n this.#buffered.length >= (this.#options.maxBufferedEvents ?? DEFAULT_MAX_BUFFERED_EVENTS) ||\n this.#bufferedChars + chars > (this.#options.maxBufferedChars ?? DEFAULT_MAX_BUFFERED_CHARS)\n ) {\n this.#overflowed = true;\n this.#buffered.length = 0;\n this.#bufferedChars = 0;\n return;\n }\n this.#buffered.push(event);\n this.#bufferedChars += chars;\n }\n\n #drain(tap: FabricSpeculationStreamTap, context: ExtensionContext): void {\n if (this.#buffered.length === 0) return;\n const replay = this.#buffered.splice(0);\n this.#bufferedChars = 0;\n for (const event of replay) tap.handleMessageUpdate(event, context);\n }\n}\n", "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { sessionsDirRoot, sessionDirNamesForCwd } from \"../memory/discovery.js\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, defaultLedgerPath, hashLcmPayload, LcmLedger } from \"./lcm-ledger.js\";\n\nexport interface MigrationOptions {\n agentDir: string;\n ledgerRoot?: string;\n ledger?: LcmLedger;\n files?: string[];\n candidateDirs?: string[];\n projectCwd?: string;\n liveCwd?: string;\n since?: string;\n until?: string;\n onDemand?: boolean;\n now?: number;\n apply?: boolean;\n allowIncompleteDiscovery?: boolean;\n maxFiles?: number;\n maxDiscoveryEntries?: number;\n maxFileBytes?: number;\n maxLineBytes?: number;\n maxTotalBytes?: number;\n onProgress?: (progress: MigrationProgress) => void;\n}\ninterface MigrationProgress {\n projectKey: string;\n sessionPath: string;\n sourceHash: string;\n lineOrdinal: number;\n entryId: string;\n contentHash: string;\n}\ninterface MigrationCounts {\n eligible: number;\n imported: number;\n skippedDuplicate: number;\n skippedOutOfWindow: number;\n malformed: number;\n oversized: number;\n incompleteDiscovery: number;\n errors: number;\n}\nexport interface MigrationResult {\n mode: \"apply\" | \"dry-run\";\n since: string;\n until: string;\n counts: MigrationCounts;\n filesScanned: number;\n bytesScanned: number;\n generations: Array<{ sessionPath: string; sourceHash: string }>;\n exitCode: number;\n}\nconst hash = (data: string | Buffer): string => crypto.createHash(\"sha256\").update(data).digest(\"hex\");\nconst record = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\nconst nonblank = (value: unknown): value is string => typeof value === \"string\" && value.trim().length > 0;\nconst utc = (value: string): number => {\n if (!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|\\+00:00)$/.test(value)) throw new Error(\"timestamps must be explicit UTC ISO-8601 values\");\n const at = Date.parse(value);\n const normalized = value.replace(\"+00:00\", \"Z\").replace(/Z$/, \"\");\n if (!Number.isFinite(at) || new Date(at).toISOString().slice(0, 19) !== normalized.slice(0, 19)) throw new Error(\"invalid UTC timestamp\");\n return at;\n};\nexport function migrationWindow(options: Pick<MigrationOptions, \"since\" | \"until\" | \"now\">): { since: number; until: number } {\n const now = options.now ?? Date.now();\n const since = options.since === undefined ? now - 72 * 60 * 60 * 1000 : utc(options.since);\n const until = options.until === undefined ? now : utc(options.until);\n if (!Number.isFinite(since) || !Number.isFinite(until) || since > until) throw new Error(\"invalid migration window\");\n return { since, until };\n}\nconst positive = (value: number | undefined, fallback: number): number => {\n const result = value ?? fallback;\n if (!Number.isSafeInteger(result) || result < 1) throw new Error(\"scan limits must be positive safe integers\");\n return result;\n};\nexport function discoverMigrationSessions(options: MigrationOptions): { files: string[]; incomplete: number } {\n const maxFiles = positive(options.maxFiles, 10_000);\n const maxEntries = positive(options.maxDiscoveryEntries, 100_000);\n const files = new Set<string>();\n let incomplete = 0;\n let entries = 0;\n const add = (file: string): void => {\n if (files.size >= maxFiles && !files.has(path.resolve(file))) { incomplete++; return; }\n files.add(path.resolve(file));\n };\n if (options.files) {\n for (const file of options.files.slice(0, maxFiles)) add(file);\n if (options.files.length > maxFiles) incomplete++;\n return { files: [...files].sort(), incomplete };\n }\n const list = (dir: string, visit: (entry: fs.Dirent) => void): void => {\n let handle: fs.Dir | undefined;\n try {\n handle = fs.opendirSync(dir);\n let entry: fs.Dirent | null;\n while ((entry = handle.readSync()) !== null) {\n if (++entries > maxEntries) { incomplete++; break; }\n visit(entry);\n }\n } catch { incomplete++; } finally { handle?.closeSync(); }\n };\n const scan = (dir: string): void => list(dir, entry => {\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(dir, entry.name));\n else if (entry.isSymbolicLink() && entry.name.endsWith(\".jsonl\")) incomplete++;\n });\n if (options.candidateDirs) {\n for (const dir of options.candidateDirs) { if (entries >= maxEntries) { incomplete++; break; } scan(dir); }\n } else if (options.projectCwd) {\n const names = sessionDirNamesForCwd(options.projectCwd);\n let found = false;\n for (const name of [names.canonical, ...names.legacy]) {\n const dir = path.join(sessionsDirRoot(options.agentDir), name);\n try { if (fs.statSync(dir).isDirectory()) { found = true; scan(dir); } }\n catch (error) { if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") incomplete++; }\n }\n if (!found) incomplete++;\n } else {\n const root = sessionsDirRoot(options.agentDir);\n list(root, entry => {\n if (entry.isDirectory()) scan(path.join(root, entry.name));\n else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(root, entry.name));\n else if (entry.isSymbolicLink()) incomplete++;\n });\n }\n return { files: [...files].sort(), incomplete };\n}\nconst CHECKPOINT_SCHEMA = \"CREATE TABLE IF NOT EXISTS migration_checkpoints (project_key TEXT NOT NULL, session_path TEXT NOT NULL, source_hash TEXT NOT NULL, line_ordinal INTEGER NOT NULL, entry_id TEXT NOT NULL, content_hash TEXT NOT NULL, PRIMARY KEY(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash))\";\nexport function reconcileSession(options: Omit<MigrationOptions, \"files\"> & { files: [string] }): MigrationResult {\n return migrateSessions({ ...options, onDemand: true });\n}\n\nexport function migrateSessions(options: MigrationOptions): MigrationResult {\n const window = migrationWindow(options);\n const maxFileBytes = positive(options.maxFileBytes, 64 * 1024 ** 2);\n const maxLineBytes = positive(options.maxLineBytes, 8 * 1024 ** 2);\n const maxTotalBytes = positive(options.maxTotalBytes, 1024 ** 3);\n const discovery = discoverMigrationSessions(options);\n const result: MigrationResult = {\n mode: options.apply ? \"apply\" : \"dry-run\", since: new Date(window.since).toISOString(), until: new Date(window.until).toISOString(),\n counts: { eligible: 0, imported: 0, skippedDuplicate: 0, skippedOutOfWindow: 0, malformed: 0, oversized: 0, incompleteDiscovery: discovery.incomplete, errors: 0 },\n filesScanned: 0, bytesScanned: 0, generations: [], exitCode: 0,\n };\n const counts = result.counts;\n const drySeen = new Set<string>();\n for (const file of discovery.files) {\n let data: Buffer;\n let fd: number | undefined;\n try {\n fd = fs.openSync(file, \"r\");\n const before = fs.fstatSync(fd);\n if (!before.isFile()) { counts.incompleteDiscovery++; continue; }\n if (before.size > maxFileBytes) { counts.oversized++; continue; }\n if (result.bytesScanned + before.size > maxTotalBytes) { counts.incompleteDiscovery++; break; }\n data = Buffer.allocUnsafe(before.size);\n let offset = 0;\n while (offset < data.length) {\n const size = fs.readSync(fd, data, offset, data.length - offset, offset);\n if (size === 0) throw new Error(\"source shortened during read\");\n offset += size;\n }\n const after = fs.fstatSync(fd);\n if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs) throw new Error(\"source changed during read\");\n } catch { counts.errors++; counts.incompleteDiscovery++; continue; }\n finally { if (fd !== undefined) fs.closeSync(fd); }\n result.filesScanned++;\n result.bytesScanned += data.length;\n const sourceHash = hash(data);\n result.generations.push({ sessionPath: file, sourceHash });\n let header: Record<string, unknown> | undefined;\n let ledger: LcmLedger | undefined;\n let database: DatabaseSync | undefined;\n let sessionId = \"\";\n let projectKey = \"\";\n let cwd: string | undefined;\n let ordinal = 0;\n try {\n for (let start = 0; start < data.length;) {\n ordinal++;\n const newline = data.indexOf(10, start);\n const end = newline < 0 ? data.length : newline;\n const bytes = data.subarray(start, end);\n start = newline < 0 ? data.length : end + 1;\n if (bytes.length > maxLineBytes) { counts.oversized++; continue; }\n const content = bytes.toString(\"utf8\").replace(/\\r$/, \"\");\n if (!content.trim()) continue;\n let row: Record<string, unknown> | undefined;\n try { row = record(JSON.parse(content)); } catch { counts.malformed++; continue; }\n if (!row) { counts.malformed++; continue; }\n if (row.type === \"message_end\") continue;\n if (!header) {\n if (ordinal !== 1 || row.type !== \"session\" || !nonblank(row.id)) { counts.malformed++; break; }\n header = row;\n sessionId = row.id;\n cwd = nonblank(row.cwd) ? row.cwd : options.liveCwd;\n if (!cwd) { counts.malformed++; break; }\n const projectInput = options.liveCwd ? { recordedCwd: cwd, liveCwd: options.liveCwd } : { recordedCwd: cwd };\n projectKey = canonicalProjectIdentity(projectInput).key;\n if (options.ledger && options.ledger.project.key !== projectKey) { counts.errors++; break; }\n if (options.apply) {\n if (options.ledger) ledger = options.ledger;\n else if (options.ledgerRoot) ledger = new LcmLedger({ rootDir: options.ledgerRoot, project: { recordedCwd: cwd } });\n else ledger = new LcmLedger({ project: { recordedCwd: cwd } });\n database = ledger.db;\n database.exec(CHECKPOINT_SCHEMA);\n } else if (options.ledger) database = options.ledger.db;\n else {\n const dbPath = defaultLedgerPath(options.ledgerRoot, projectKey);\n if (fs.existsSync(dbPath)) database = new DatabaseSync(dbPath, { readOnly: true });\n }\n continue;\n }\n if (row.type === \"session\" || !nonblank(row.type) || !nonblank(row.id) || (row.parentId !== null && row.parentId !== undefined && typeof row.parentId !== \"string\")) { counts.malformed++; continue; }\n const message = record(row.message);\n if (row.type === \"message\" && (!message || !nonblank(message.role))) { counts.malformed++; continue; }\n let at: number;\n try { at = typeof row.timestamp === \"string\" ? utc(row.timestamp) : NaN; } catch { at = NaN; }\n if (!Number.isFinite(at)) { counts.malformed++; continue; }\n if (!options.onDemand && (at < window.since || at > window.until)) { counts.skippedOutOfWindow++; continue; }\n counts.eligible++;\n const payloadJson = canonicalLcmPayload(row);\n const contentHash = hashLcmPayload(row);\n const identity = JSON.stringify([projectKey, sessionId, row.id, contentHash]);\n const progress: MigrationProgress = { projectKey, sessionPath: file, sourceHash, lineOrdinal: ordinal, entryId: row.id, contentHash };\n const duplicate = drySeen.has(identity) || database?.prepare(\"SELECT 1 FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND content_hash=?\").get(projectKey, sessionId, row.id, contentHash) !== undefined;\n if (duplicate) counts.skippedDuplicate++;\n else if (ledger) {\n ledger.appendRaw({\n projectKey, sessionId, entryId: row.id, role: message && typeof message.role === \"string\" ? message.role : row.type,\n content, payloadJson, parentEntryId: typeof row.parentId === \"string\" ? row.parentId : null,\n branch: typeof row.branch === \"string\" ? row.branch : typeof row.branchId === \"string\" ? row.branchId : null,\n ...(cwd ? { recordedCwd: cwd } : {}), createdAt: at\n });\n counts.imported++;\n }\n else if (!duplicate) counts.imported++;\n drySeen.add(identity);\n if (ledger) database!.prepare(\"INSERT OR IGNORE INTO migration_checkpoints(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash) VALUES(?,?,?,?,?,?)\")\n .run(projectKey, file, sourceHash, ordinal, row.id, contentHash);\n options.onProgress?.(progress);\n }\n if (!header && data.length === 0) counts.malformed++;\n } catch (error) {\n counts.errors++;\n if (options.onProgress) throw error;\n } finally {\n if (ledger && ledger !== options.ledger) ledger.close();\n else if (!ledger && database && database !== options.ledger?.db) database.close();\n }\n }\n result.exitCode = counts.errors || counts.malformed || counts.oversized || (counts.incompleteDiscovery && !options.allowIncompleteDiscovery) ? 1 : 0;\n return result;\n}\n", "import crypto from \"node:crypto\";\nimport { hashLcmPayload, type LcmLedger, type RawEntry } from \"../storage/lcm-ledger.js\";\nimport { buildLcmPrompt, emergencyReduce, type LcmModelResult, type LcmSummarizer } from \"./lcm-model.js\";\n\ntype LcmNodeState = \"pending\" | \"ready\" | \"running\" | \"failed\";\ntype LcmJobState = \"pending\" | \"running\" | \"completed\" | \"failed\";\nexport interface LcmSourceRef { sessionId: string; entryId: string; revision: number; payloadHash: string; }\ntype RawSourceRef = LcmSourceRef;\nexport interface LcmNode { nodeId: string; projectKey: string; sessionId: string; branch: string | null; kind: \"leaf\" | \"condensed\"; sources: LcmSourceRef[]; children: string[]; depth: number; sourceHash: string; policyHash: string; modelHash: string; state: LcmNodeState; text?: string; createdAt: number; }\nexport interface LcmJob { jobId: string; projectKey: string; nodeId: string; priority: number; eligibleAt: number; state: LcmJobState; ownerId?: string; leaseToken?: string; leaseUntil?: number; attempts: number; nextRetryAt: number; error?: string; createdAt: number; updatedAt: number; }\nexport interface LcmBudget { calls: number; inputTokens: number; outputTokens: number; cost: number; wallMs: number; }\nexport interface LcmBudgetPolicy extends LcmBudget { sessionCalls: number; }\nconst DEFAULT_LCM_BUDGET: LcmBudgetPolicy = { calls: 32, inputTokens: 2_000_000, outputTokens: 128_000, cost: Number.POSITIVE_INFINITY, wallMs: 60_000, sessionCalls: 16 };\nexport interface LcmMaintenanceOptions { now?: () => number; ownerId?: string; policyHash?: string; maxLeafEntries?: number; maxCondenseChildren?: number; maxInputChars?: number; maxOutputChars?: number; budget?: Partial<LcmBudgetPolicy>; }\nconst hash = (v: unknown) => hashLcmPayload(v);\nconst parse = <T>(v: unknown): T => JSON.parse(String(v));\nconst rawHash = (e: RawEntry) => e.payloadHash;\nconst token = () => crypto.randomUUID();\n\nexport class LcmMaintenance {\n readonly projectKey: string;\n private readonly now: () => number;\n private readonly ownerId: string;\n private readonly policyHash: string;\n private readonly maxLeaf: number;\n private readonly maxChildren: number;\n private readonly maxInputChars: number;\n private readonly maxOutputChars: number;\n private readonly budget: LcmBudgetPolicy;\n constructor(private readonly ledger: LcmLedger, options: LcmMaintenanceOptions = {}) { this.projectKey = ledger.project.key; this.now = options.now ?? Date.now; this.ownerId = options.ownerId ?? crypto.randomUUID(); this.policyHash = options.policyHash ?? hash(\"lcm-policy-v1\"); this.maxLeaf = options.maxLeafEntries ?? 8; this.maxChildren = options.maxCondenseChildren ?? 4; this.maxInputChars = options.maxInputChars ?? 48_000; this.maxOutputChars = options.maxOutputChars ?? 4_096; this.budget = { ...DEFAULT_LCM_BUDGET, ...options.budget }; }\n listNodes(limit = 100): LcmNode[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM summary_nodes WHERE project_key=? ORDER BY created_at,node_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const node = parse<LcmNode>(r.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; })); }\n getNode(nodeId: string): LcmNode | undefined { return this.ledger.readOnly(db => { const row = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(nodeId, this.projectKey) as {payload?:string}|undefined; if (!row?.payload) return undefined; const node = parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; }); }\n getFrontier(sessionId?: string, branch?: string | null, activeSources?: ReadonlySet<string>): LcmNode[] { const nodes=this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (branch === undefined || n.branch === branch || n.branch === null) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s))))) ; const covered=new Set(nodes.flatMap(n=>n.children)); return nodes.filter(n=>!covered.has(n.nodeId)); }\n listJobs(limit = 100): LcmJob[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? ORDER BY created_at,job_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const job = parse<LcmJob>(r.payload); if (job.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; })); }\n selectLeaf(entries = this.ledger.readRaw(this.projectKey), branch?: string | null): RawEntry[] { const first = entries[0]; if (!first) return []; const nodes = this.listNodes(100000).filter(n => n.state !== \"failed\" && n.policyHash === this.policyHash && n.sessionId === first.sessionId && (branch === undefined || n.branch === branch || n.branch === null)); const covered = new Set(nodes.flatMap(n => n.sources.map(s => this.sourceKey(s)))); return entries.filter(e => e.sessionId === first.sessionId && (branch === undefined || e.branch === branch || e.branch === null) && !covered.has(this.sourceKey(e))).slice(0, this.maxLeaf); }\n selectCondensation(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null): LcmNode[] { const nodes = this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s)))) && (branch === undefined || n.branch === branch || n.branch === null)); const eligible = new Set(nodes.map(n => n.nodeId)); const edges = this.ledger.readOnly(db => db.prepare(\"SELECT e.parent_id,e.child_id FROM summary_edges e JOIN summary_nodes parent ON parent.node_id=e.parent_id AND parent.project_key=? JOIN summary_nodes child ON child.node_id=e.child_id AND child.project_key=parent.project_key WHERE parent.project_key=?\").all(this.projectKey, this.projectKey) as Array<{parent_id:string;child_id:string}>); const consumed = new Set(edges.filter(e => eligible.has(e.parent_id)).map(e => e.child_id)); const candidates = nodes.filter(n => !consumed.has(n.nodeId)); const first = candidates[0]; if (!first) return []; const depth = Math.min(...candidates.map(n => n.depth)); const sameDepth = candidates.filter(n => n.depth === depth); if (depth > 0 && sameDepth.length < 2) return []; return candidates.filter(n => n.projectKey === first.projectKey && n.sessionId === first.sessionId && n.depth === depth).sort((a,b) => a.nodeId.localeCompare(b.nodeId)).slice(0, this.maxChildren); }\n createLeaf(entries = this.selectLeaf()): LcmNode | undefined { if (!entries.length) return undefined; const branches = new Set(entries.map(entry => entry.branch).filter((value): value is string => typeof value === \"string\")); if (branches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...branches][0] ?? null; const source = entries.map((e, index) => { if (e.projectKey !== this.projectKey) throw new Error(\"entry project does not match ledger project\"); const payload = parse<{type?: unknown; id?: unknown}>(e.payloadJson); if (typeof payload.type !== \"string\" || !payload.type || payload.id !== e.entryId) throw new Error(\"invalid raw payload\"); if (hash(payload) !== rawHash(e)) throw new Error(\"payload hash mismatch\"); return { sessionId:e.sessionId, entryId:e.entryId, revision:e.revision, payloadHash:rawHash(e) }; }); this.validateSources(source); const node: LcmNode = { nodeId:`leaf:${hash({ projectKey:this.projectKey, source, branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:entries[0]!.sessionId, branch, kind:\"leaf\", sources:source, children:[], depth:0, sourceHash:hash(source.map(s=>s.payloadHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n createCondensed(children = this.selectCondensation()): LcmNode | undefined { if (!children.length) return undefined; if (children.some(c => c.state !== \"ready\")) throw new Error(\"condensation requires ready children\"); if (new Set(children.map(c=>c.sessionId)).size !== 1 || new Set(children.map(c=>c.depth)).size !== 1) throw new Error(\"cross-branch ranges\"); const storedChildren = children.map((child) => this.getNode(child.nodeId)); if (storedChildren.some((child) => !child || child.projectKey !== this.projectKey)) throw new Error(\"child project does not match ledger project\"); if (storedChildren.some((child, index) => JSON.stringify(child) !== JSON.stringify(children[index]))) throw new Error(\"child payload changed\"); const concreteBranches = new Set(storedChildren.map(c => c!.branch).filter((value): value is string => typeof value === \"string\")); if (concreteBranches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...concreteBranches][0] ?? null; const source = [...new Map(storedChildren.flatMap(c => c!.sources).map((value) => [this.sourceKey(value), value])).values()]; this.validateSources(source); const node: LcmNode = { nodeId:`condensed:${hash({ projectKey:this.projectKey, children:storedChildren.map(c=>c!.nodeId), branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:children[0]!.sessionId, branch, kind:\"condensed\", sources:source, children:children.map(c=>c.nodeId), depth:Math.max(...children.map(c=>c.depth))+1, sourceHash:hash(children.map(c=>c.sourceHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n private validateSources(source: LcmSourceRef[]) { const seen = new Set<string>(); for (const s of source) { if (seen.has(this.sourceKey(s))) throw new Error(\"duplicate source identity\"); seen.add(this.sourceKey(s)); } if (new Set(source.map(s => s.sessionId)).size !== 1) throw new Error(\"cross-session ranges\"); }\n private sourceKey(source: Pick<LcmSourceRef, \"sessionId\" | \"entryId\" | \"revision\">) { return `${source.sessionId}:${source.entryId}:${source.revision}`; }\n private publish(node: LcmNode) { this.ledger.transaction(db => { if (node.children.includes(node.nodeId)) throw new Error(\"cycle\"); for (const child of node.children) if (!db.prepare(\"SELECT 1 FROM summary_nodes WHERE node_id=? AND project_key=?\").get(child,this.projectKey)) throw new Error(\"missing child\"); db.prepare(\"INSERT OR IGNORE INTO summary_nodes(node_id,project_key,payload,created_at) VALUES(?,?,?,?)\").run(node.nodeId,this.projectKey,JSON.stringify(node),node.createdAt); for (const child of node.children) db.prepare(\"INSERT OR IGNORE INTO summary_edges(parent_id,child_id) VALUES(?,?)\").run(node.nodeId,child); const job = this.job(node); db.prepare(\"INSERT OR IGNORE INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)\").run(job.jobId,this.projectKey,job.state,JSON.stringify(job),job.createdAt,job.updatedAt); }); }\n private job(node:LcmNode): LcmJob { const t=this.now(); return {jobId:`job:${node.nodeId}`,projectKey:this.projectKey,nodeId:node.nodeId,priority:node.kind === \"condensed\" ? 20 : 10,eligibleAt:t,state:\"pending\",attempts:0,nextRetryAt:t,createdAt:t,updatedAt:t}; }\n claim(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old=parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t=this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if ((old.state !== \"pending\" && !expired) || old.eligibleAt > t || old.nextRetryAt > t) throw new Error(\"job not eligible\"); const active = (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? AND status=?\").all(this.projectKey, \"running\") as Array<{payload:string}>).map(r => parse<LcmJob>(r.payload)).filter(j => j.jobId !== old.jobId && (j.leaseUntil ?? 0) > t); if (active.length) throw new Error(\"project lease held\"); const nodeRow = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(old.nodeId,this.projectKey) as {payload?:string}|undefined; const sessionId = nodeRow?.payload ? parse<LcmNode>(nodeRow.payload).sessionId : \"\"; const day = this.day(t); const projectUsage = this.usage(db, day); const sessionUsage = this.usage(db, day, sessionId); if (projectUsage.calls >= this.budget.calls || projectUsage.inputTokens >= this.budget.inputTokens || projectUsage.outputTokens >= this.budget.outputTokens || projectUsage.cost >= this.budget.cost || projectUsage.wallMs >= this.budget.wallMs || sessionUsage.calls >= this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...old,state:\"running\" as const,ownerId,leaseToken:token(),leaseUntil:t+30_000,updatedAt:t}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n claimEmergency(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old = parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t = this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if (old.state === \"completed\") throw new Error(\"job already completed\"); const out = { ...old, state: \"running\" as const, ownerId, leaseToken: token(), leaseUntil: t + 30_000, updatedAt: t }; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n renew(job:LcmJob): LcmJob { return this.fenced(job, old => ({...old,leaseUntil:this.now()+30_000,updatedAt:this.now()})); }\n private validateText(text: unknown): asserts text is string { if (typeof text !== \"string\" || text.length === 0) throw new Error(\"invalid summary text\"); let length = 0; for (const _ of text) { length += 1; if (length > this.maxOutputChars) throw new Error(\"summary exceeds output bound\"); } }\n complete(job:LcmJob, result:LcmModelResult): LcmNode { this.validateText(result.text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } if (![result.inputTokens,result.outputTokens,result.cost,result.wallMs].every((value) => Number.isFinite(value) && value >= 0)) throw new Error(\"invalid model usage\"); const projectUsage = this.usage(db, this.day(this.now())); const sessionUsage = this.usage(db, this.day(this.now()), node.sessionId); if (projectUsage.calls + 1 > this.budget.calls || projectUsage.inputTokens + result.inputTokens > this.budget.inputTokens || projectUsage.outputTokens + result.outputTokens > this.budget.outputTokens || projectUsage.cost + result.cost > this.budget.cost || projectUsage.wallMs + result.wallMs > this.budget.wallMs || sessionUsage.calls + 1 > this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...node,state:\"ready\" as const,text:result.text,modelHash:result.modelHash}; this.account(db,node.sessionId,result); db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n completeEmergency(job:LcmJob, text:string): LcmNode { this.validateText(text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } const out={...node,state:\"ready\" as const,text,modelHash:\"emergency\"}; db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n fail(job:LcmJob,error:string): LcmJob { return this.fenced(job, old => { const attempts=old.attempts+1; const delay=Math.min(900_000,30_000*2**(attempts-1)); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = old; return {...base,attempts,error,state:attempts>=3?\"failed\":\"pending\",eligibleAt:this.now()+delay,nextRetryAt:this.now()+delay,updatedAt:this.now()}; }); }\n async run(job:LcmJob, model:LcmSummarizer, input:string, signal=new AbortController().signal): Promise<LcmNode> { let sources: LcmSourceRef[] = []; let claimed: LcmJob | undefined; const controller = new AbortController(); let renew: ReturnType<typeof setInterval> | undefined; const timer = setTimeout(() => controller.abort(), 60_000); const abort = () => controller.abort(); signal.addEventListener(\"abort\", abort, { once: true }); try { claimed=this.claim(job.jobId,job.ownerId ?? this.ownerId); const node=this.getNode(claimed.nodeId); sources=node?.sources ?? []; renew = setInterval(() => { try { if (claimed) claimed = this.renew(claimed); } catch {} }, 10_000); const result=await Promise.race([model.generate({prompt:buildLcmPrompt(node?.kind ?? \"leaf\",input,this.maxInputChars),sessionId:node?.sessionId ?? \"\",signal:controller.signal}), new Promise<never>((_, reject) => controller.signal.addEventListener(\"abort\", () => reject(new Error(\"LCM timeout\")), { once: true }))]); return this.complete(claimed,result); } catch (error) { if (!claimed) throw error; const fallback=emergencyReduce(input,this.maxOutputChars,sources); try { return this.completeEmergency(claimed,fallback); } catch { try { this.fail(claimed,String(error)); } catch {} throw error; } } finally { clearTimeout(timer); if (renew) clearInterval(renew); signal.removeEventListener(\"abort\", abort); } }\n private day(ms:number): string { return new Date(ms).toISOString().slice(0,10); }\n private usage(db:any, day:string, sessionId?:string): LcmBudget { const q = sessionId === undefined ? \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=?\" : \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=? AND session_id=?\"; const r=(sessionId === undefined ? db.prepare(q).get(this.projectKey,day) : db.prepare(q).get(this.projectKey,day,sessionId)) as LcmBudget; return r; }\n private account(db:any, sessionId:string, result:LcmModelResult) { const d=this.day(this.now()); db.prepare(\"INSERT INTO maintenance_usage(project_key,day,session_id,calls,input_tokens,output_tokens,cost,wall_ms) VALUES(?,?,?,?,?,?,?,?) ON CONFLICT(project_key,day,session_id) DO UPDATE SET calls=calls+excluded.calls,input_tokens=input_tokens+excluded.input_tokens,output_tokens=output_tokens+excluded.output_tokens,cost=cost+excluded.cost,wall_ms=wall_ms+excluded.wall_ms\").run(this.projectKey,d,sessionId,1,result.inputTokens,result.outputTokens,result.cost,result.wallMs); }\n private readJob(db: any,id:string):LcmJob { const row=db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(id,this.projectKey) as {payload:string}|undefined; if(!row) throw new Error(\"job not found\"); const job=parse<LcmJob>(row.payload); if(job.projectKey!==this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; }\n private assertLease(current:LcmJob, expected:LcmJob) { if(current.ownerId!==expected.ownerId || current.leaseToken!==expected.leaseToken || current.state!==\"running\" || (current.leaseUntil??0)<this.now()) throw new Error(\"lease fenced\"); }\n private fenced(job:LcmJob, update:(old:LcmJob)=>LcmJob):LcmJob { return this.ledger.transaction(db => { const old=this.readJob(db,job.jobId); this.assertLease(old,job); const out=update(old); db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),out.updatedAt,out.jobId,this.projectKey); return out; }); }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, hashLcmPayload, LcmLedger, type RawEntry } from \"../storage/lcm-ledger.js\";\nimport { reconcileSession } from \"../storage/lcm-migration.js\";\nimport { emergencyReduce, LcmModelAdapter, type LcmSummarizer } from \"./lcm-model.js\";\nimport { LcmMaintenance, type LcmJob, type LcmNode } from \"./lcm-maintenance.js\";\nimport type { LcmCompactionInput, LcmCompactionOutput } from \"./hook.js\";\n\nexport interface LcmRuntimeOptions {\n rootDir?: string;\n summaryModel?: string;\n maxLeafEntries?: number;\n maxCondenseChildren?: number;\n lcmMaxInputChars?: number;\n lcmMaxOutputTokens?: number;\n lcmMaxOutputChars?: number;\n}\n\nexport class LcmRuntime {\n readonly ledger: LcmLedger;\n readonly maintenance: LcmMaintenance;\n private readonly context: ExtensionContext;\n private readonly options: LcmRuntimeOptions;\n private readonly abort = new AbortController();\n private writePending: Promise<void> = Promise.resolve();\n private maintenancePending: Promise<void> = Promise.resolve();\n private closed = false;\n private dirty = false;\n private degradedError: unknown;\n private activeSources = new Set<string>();\n private activeSessionId: string | undefined;\n\n constructor(context: ExtensionContext, options: LcmRuntimeOptions = {}) {\n this.context = context;\n this.options = options;\n const recorded = context.sessionManager.getRecordedCwd?.();\n const liveCwd = recorded || context.cwd;\n const project = canonicalProjectIdentity({ liveCwd });\n const ledgerOptions = options.rootDir === undefined\n ? { project: { liveCwd: project.canonicalPath ?? liveCwd } }\n : { rootDir: options.rootDir, project: { liveCwd: project.canonicalPath ?? liveCwd } };\n this.ledger = new LcmLedger(ledgerOptions);\n this.maintenance = new LcmMaintenance(this.ledger, {\n ...options,\n ...(options.lcmMaxInputChars === undefined ? {} : { maxInputChars: options.lcmMaxInputChars }),\n ...(options.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: options.lcmMaxOutputChars }),\n });\n }\n\n get projectKey(): string { return this.ledger.project.key; }\n get signal(): AbortSignal { return this.abort.signal; }\n get status(): \"healthy\" | \"degraded\" { return this.degradedError === undefined ? \"healthy\" : \"degraded\"; }\n get error(): unknown { return this.degradedError; }\n markDirty(): void { this.dirty = true; }\n\n private enqueueWrite(operation: () => void | Promise<void>): Promise<void> {\n const run = this.writePending.then(operation);\n this.writePending = run.catch((error) => { this.degradedError = error; });\n return run;\n }\n\n private refreshActiveSources(sessionId: string, entries: readonly { id: string }[]): void {\n const ids = new Set(entries.map((entry) => entry.id));\n const latest = new Map<string, RawEntry>();\n for (const entry of this.ledger.readRaw(this.projectKey, sessionId)) {\n if (!ids.has(entry.entryId)) continue;\n const previous = latest.get(entry.entryId);\n if (!previous || previous.revision < entry.revision) latest.set(entry.entryId, entry);\n }\n this.activeSources = new Set(\n [...latest.values()].map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n this.activeSessionId = sessionId;\n }\n\n reconcileSelectedSession(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n const getSessionFile = this.context.sessionManager.getSessionFile;\n if (typeof getSessionFile !== \"function\") return;\n const sessionFile = getSessionFile.call(this.context.sessionManager);\n if (!sessionFile) return;\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const cwd = recorded || this.context.cwd;\n const result = reconcileSession({\n agentDir: this.options.rootDir ?? process.env.PI_CODING_AGENT_DIR ?? `${process.env.HOME ?? \".\"}/.omp/agent`,\n ledger: this.ledger,\n files: [sessionFile],\n liveCwd: cwd,\n projectCwd: cwd,\n apply: true,\n });\n if (result.exitCode !== 0) throw new Error(`LCM session reconciliation failed with exit code ${result.exitCode}`);\n const sessionId = this.context.sessionManager.getSessionId();\n this.refreshActiveSources(sessionId, this.context.sessionManager.getBranch());\n });\n }\n\n readback(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n if (this.closed) return;\n const entries = this.context.sessionManager.getBranch();\n const sessionId = this.context.sessionManager.getSessionId();\n const branch = this.context.sessionManager.getLeafId();\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const active = new Set<string>();\n for (const entry of entries) {\n const payloadJson = canonicalLcmPayload(entry);\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch,\n ...(recorded || this.context.cwd ? { recordedCwd: recorded || this.context.cwd } : {}),\n });\n active.add(`${sessionId}:${stored.entryId}:${stored.revision}`);\n }\n this.activeSources = active;\n this.activeSessionId = sessionId;\n this.dirty = false;\n this.degradedError = undefined;\n });\n }\n\n async syncAndSchedule(): Promise<void> {\n if (this.closed) return;\n await this.readback();\n this.scheduleMaintenance();\n }\n\n maintain(): Promise<void> { return this.syncAndSchedule(); }\n\n scheduleMaintenance(): void {\n if (this.closed) return;\n const run = this.maintenancePending.then(() => this.runMaintenance());\n this.maintenancePending = run.catch((error) => { this.degradedError = error; });\n }\n\n private async runMaintenance(): Promise<void> {\n if (this.closed || !this.activeSessionId || this.activeSources.size === 0) return;\n let model: LcmSummarizer;\n try {\n model = new LcmModelAdapter(this.context, this.options.summaryModel, true, {\n ...(this.options.lcmMaxInputChars === undefined ? {} : { maxInputChars: this.options.lcmMaxInputChars }),\n ...(this.options.lcmMaxOutputTokens === undefined ? {} : { maxOutputTokens: this.options.lcmMaxOutputTokens }),\n ...(this.options.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: this.options.lcmMaxOutputChars }),\n });\n } catch (error) {\n this.degradedError = error;\n model = { modelHash: \"unavailable\", generate: async () => { throw error instanceof Error ? error : new Error(String(error)); } };\n }\n const budget = Math.max(1, this.options.maxCondenseChildren ?? 4);\n const sessionId = this.activeSessionId;\n const raw = this.ledger.readRaw(this.projectKey, sessionId).filter((entry) =>\n this.activeSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n const inputFor = (node: NonNullable<ReturnType<LcmMaintenance[\"getNode\"]>>): string => {\n if (node.kind === \"condensed\") return node.children.map((id) => this.maintenance.getNode(id)?.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n return node.sources.map((source) => {\n const entry = this.ledger.readRawEntry(this.projectKey, source.sessionId, source.entryId, source.revision);\n if (!entry || entry.payloadHash !== source.payloadHash) throw new Error(\"stale source\");\n return entry.payloadJson;\n }).join(\"\\n\");\n };\n const runJob = async (job: LcmJob, node: LcmNode): Promise<void> => {\n try { await this.maintenance.run(job, model, inputFor(node), this.signal); } catch {}\n };\n for (let pass = 0; pass < budget && !this.closed; pass += 1) {\n const leafCandidate = this.maintenance.createLeaf(this.maintenance.selectLeaf(raw, this.context.sessionManager.getLeafId()));\n const leaf = leafCandidate ? this.maintenance.getNode(leafCandidate.nodeId) : undefined;\n if (leaf?.state === \"pending\") {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (job) await runJob(job, leaf);\n }\n const branch = this.context.sessionManager.getLeafId();\n const pending = this.maintenance.listJobs().filter((job) => job.state === \"pending\").flatMap((job) => {\n const node = this.maintenance.getNode(job.nodeId);\n if (!node || node.sessionId !== sessionId || (branch !== null && node.branch !== branch && node.branch !== null) || !node.sources.every((source) => this.activeSources.has(`${source.sessionId}:${source.entryId}:${source.revision}`))) return [];\n return [{ job, node }];\n }).slice(0, budget);\n for (const item of pending) await runJob(item.job, item.node);\n const children = this.maintenance.selectCondensation(sessionId, this.activeSources, this.context.sessionManager.getLeafId());\n if (children.length >= budget) {\n const node = this.maintenance.createCondensed(children);\n if (node) {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === node.nodeId);\n if (job) await runJob(job, node);\n }\n }\n if (!leaf && pending.length === 0 && children.length < budget) break;\n }\n }\n\n compact(input: LcmCompactionInput): LcmCompactionOutput {\n const persistedEntries = new Map<string, RawEntry>();\n for (const entry of input.branchEntries) {\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const payloadJson = canonicalLcmPayload(entry);\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId: input.sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch: input.branch,\n });\n persistedEntries.set(`${entry.id}:${stored.payloadHash}`, stored);\n }\n const firstKeptIndex = input.firstKeptEntryId\n ? input.branchEntries.findIndex((entry) => entry.id === input.firstKeptEntryId)\n : input.branchEntries.length;\n const sourceEntries = input.branchEntries.slice(0, firstKeptIndex < 0 ? input.branchEntries.length : firstKeptIndex);\n const selectedStored = sourceEntries.map((entry) => {\n const payloadHash = hashLcmPayload(JSON.parse(canonicalLcmPayload(entry)));\n const stored = persistedEntries.get(`${entry.id}:${payloadHash}`);\n if (!stored) throw new Error(\"compaction source was not persisted\");\n return stored;\n });\n const activeSources = new Set(selectedStored.map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`));\n const frontier = this.maintenance.getFrontier(input.sessionId, input.branch, activeSources);\n const coveredSources = new Set(frontier.flatMap((node) => node.sources.map((source) => `${source.sessionId}:${source.entryId}:${source.revision}`)));\n const summary = frontier.map((node) => node.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n if (summary && selectedStored.every((entry) => coveredSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`))) return { summary, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"ready-frontier\", branch: input.branch };\n if (selectedStored.length === 0) throw new Error(\"LCM emergency fallback has no persisted sources\");\n const payloads = sourceEntries.map((entry) => canonicalLcmPayload(entry)).join(\"\\n\");\n const sources = selectedStored.map((stored) => ({ sessionId: stored.sessionId, entryId: stored.entryId, revision: stored.revision, payloadHash: stored.payloadHash }));\n const fallback = emergencyReduce(payloads, this.options.lcmMaxOutputChars ?? 4_096, sources);\n const leaf = this.maintenance.createLeaf(selectedStored);\n if (!leaf) throw new Error(\"LCM emergency fallback node was not created\");\n const persisted = this.maintenance.getNode(leaf.nodeId);\n if (persisted?.state === \"ready\") {\n if (persisted.branch !== input.branch || JSON.stringify(persisted.sources) !== JSON.stringify(sources)) throw new Error(\"LCM emergency fallback provenance mismatch\");\n if (!persisted.text) throw new Error(\"LCM emergency fallback text is missing\");\n return { summary: persisted.text, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (!job) throw new Error(\"LCM emergency fallback job was not created\");\n const completed = this.maintenance.completeEmergency(this.maintenance.claimEmergency(job.jobId), fallback);\n return { summary: completed.text ?? fallback, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n\n memoryContext() {\n return {\n ledger: {\n projectKey: this.projectKey,\n readRaw: (sessionId?: string) => this.ledger.readRaw(this.projectKey, sessionId),\n readRawPage: (sessionId?: string, offset?: number, limit?: number) => this.ledger.readRawPage(this.projectKey, sessionId, offset, limit),\n readRawEntry: (sessionId: string, entryId: string, revision: number) => this.ledger.readRawEntry(this.projectKey, sessionId, entryId, revision),\n },\n ...(this.activeSessionId === undefined ? {} : { currentSessionId: this.activeSessionId }),\n summaries: {\n listNodes: ({ sessionId, branch, limit }: { sessionId?: string; branch?: string | null; limit: number }) => this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined).slice(0, limit).map((node) => ({ ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) })),\n getNode: (nodeId: string) => {\n const node = this.maintenance.getNode(nodeId);\n return node ? { ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) } : undefined;\n },\n },\n branchForSession: (sessionId: string) => sessionId === this.activeSessionId\n ? { branch: this.context.sessionManager.getLeafId(), activeSourceKeys: [...this.activeSources], ready: this.status === \"healthy\" }\n : undefined,\n };\n }\n\n frontier(sessionId?: string, branch?: string | null) {\n return this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined);\n }\n\n raw(sessionId?: string): RawEntry[] { return this.ledger.readRaw(this.projectKey, sessionId); }\n\n async shutdown(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.abort.abort();\n await this.writePending.catch(() => undefined);\n await this.maintenancePending.catch(() => undefined);\n this.ledger.close();\n }\n}\n", "import path from \"node:path\";\nimport type {\n ToolCallEvent,\n ToolCallEventResult,\n ToolResultEvent,\n ExtensionContext,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport { readFabricExecutionTraceV1 } from \"../audit/index.js\";\nimport { NESTED_TOOL_CALL_ID_PREFIX } from \"./action-registry.js\";\nimport { OMP_CORE_TOOL_NAME_SET } from \"./omp-tools.js\";\n\nexport interface FabricToolOwnershipHost {\n getActiveTools(): string[];\n setActiveTools(names: string[]): void;\n}\n\nexport interface FabricTopLevelToolAuthorizer {\n authorize(ref: string, parentToolCallId: string): Promise<void>;\n}\n\nexport interface FabricTopLevelToolApprover {\n approve(event: ToolCallEvent, context: ExtensionContext): Promise<void>;\n}\n\nconst FABRIC_TOOL_NAME = \"fabric_exec\";\nconst TOP_LEVEL_SCHEMA_REF_PREFIX = \"schema.top_level_tool.\";\n\nexport const ownsFabricToolSource = (\n tools: Array<{ name: string; sourceInfo: { path: string } }>,\n extensionEntryPath: string,\n): boolean => tools.some(\n (tool) =>\n tool.name === FABRIC_TOOL_NAME &&\n path.resolve(tool.sourceInfo.path) === path.resolve(extensionEntryPath),\n);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst finalFabricDetailsFailed = (details: unknown): boolean => {\n if (!isRecord(details)) return false;\n if (details.success === false) return true;\n const trace = readFabricExecutionTraceV1(details.trace);\n return trace !== undefined && trace.outcome !== \"succeeded\";\n};\n\nexport class FabricToolLifecycle {\n readonly #outerCalls = new Set<string>();\n\n constructor(\n readonly ownsFabricTool: () => boolean,\n readonly authorizer: () => FabricTopLevelToolAuthorizer | undefined,\n readonly approver: () => FabricTopLevelToolApprover | undefined = () => undefined,\n ) {}\n\n async toolCall(\n event: ToolCallEvent,\n context?: ExtensionContext,\n ): Promise<ToolCallEventResult | undefined> {\n if (event.toolCallId.startsWith(NESTED_TOOL_CALL_ID_PREFIX)) {\n if (this.#outerCalls.size > 0) return undefined;\n await this.#authorizeTopLevel(event);\n return undefined;\n }\n if (event.toolName === FABRIC_TOOL_NAME && this.ownsFabricTool()) {\n this.#outerCalls.add(event.toolCallId);\n return undefined;\n }\n await this.#authorizeTopLevel(event);\n const approver = this.approver();\n if (approver) {\n if (!context) throw new Error(\"Fabric direct tool approval needs an extension context\");\n await approver.approve(event, context);\n }\n return undefined;\n }\n\n toolResult(event: ToolResultEvent): { isError: true } | undefined {\n if (\n event.toolName !== FABRIC_TOOL_NAME ||\n event.toolCallId.startsWith(NESTED_TOOL_CALL_ID_PREFIX) ||\n !this.#outerCalls.delete(event.toolCallId)\n ) {\n return undefined;\n }\n return !event.isError && finalFabricDetailsFailed(event.details)\n ? { isError: true }\n : undefined;\n }\n\n clear(): void {\n this.#outerCalls.clear();\n }\n\n async #authorizeTopLevel(event: ToolCallEvent): Promise<void> {\n await this.authorizer()?.authorize(\n `${TOP_LEVEL_SCHEMA_REF_PREFIX}${event.toolName}`,\n event.toolCallId,\n );\n }\n}\n\nconst sameTools = (left: string[], right: string[]): boolean =>\n left.length === right.length && left.every((name, index) => name === right[index]);\n\nexport interface ToolOwnershipReassertion {\n reassert(): void;\n schedule(): void;\n}\n\n// Re-asserts active-set ownership after registry refreshes and at turn\n// boundaries. Refresh-driven microtasks can run before the host finished\n// initializing (registry rebuilds happen before session_start), when neither\n// the live config nor the active tool set is safe to touch \u2014 `ready` guards\n// every entry point, including the deferred microtask.\nexport const createToolOwnershipReassertion = (options: {\n ready: () => boolean;\n active: () => boolean;\n hiddenNames: () => ReadonlySet<string>;\n apply: (hidden: ReadonlySet<string>) => boolean;\n}): ToolOwnershipReassertion => {\n let queued = false;\n const reassert = (): void => {\n queued = false;\n if (!options.ready() || !options.active()) return;\n options.apply(options.hiddenNames());\n };\n return {\n reassert,\n schedule: () => {\n if (queued) return;\n queued = true;\n queueMicrotask(reassert);\n },\n };\n};\n\nexport class FabricToolOwnership {\n #savedNativeCoreTools: Array<{ name: string; index: number }> | undefined;\n // Captured extension tools stay registered so host extensions (permission\n // systems, auditors) keep them in `omp.getAllTools()`; hiding from the model\n // happens here, in the active set. Removed names are remembered so leaving\n // full code mode (or adding a name to `capture.keepVisible`) re-exposes them.\n #savedHiddenExtensionTools = new Map<string, number>();\n\n constructor(readonly host: FabricToolOwnershipHost) {}\n\n apply(\n fullCodeModeOrPolicy: boolean | {\n fullCodeMode: boolean;\n schemaMode?: string;\n includeTools?: ReadonlySet<string>;\n excludeTools?: ReadonlySet<string>;\n },\n hiddenExtensionTools?: ReadonlySet<string>,\n ): boolean {\n const active = this.host.getActiveTools();\n const policy = typeof fullCodeModeOrPolicy === \"boolean\"\n ? { fullCodeMode: fullCodeModeOrPolicy, includeTools: new Set<string>(), excludeTools: new Set<string>() }\n : fullCodeModeOrPolicy;\n const enforce = policy.schemaMode === \"enforce\";\n const include = policy.includeTools ?? new Set<string>();\n const exclude = policy.excludeTools ?? new Set<string>();\n const hideCore = policy.fullCodeMode || enforce;\n const hidden = hiddenExtensionTools ?? new Set<string>();\n if (!hideCore && hidden.size === 0 && exclude.size === 0) return this.#restore(active);\n if (hideCore) {\n this.#savedNativeCoreTools ??= active.flatMap((name, index) =>\n OMP_CORE_TOOL_NAME_SET.has(name) ? [{ name, index }] : [],\n );\n }\n const next: string[] = [];\n for (const [index, name] of active.entries()) {\n const coreHidden = hideCore && OMP_CORE_TOOL_NAME_SET.has(name) && (enforce || !include.has(name));\n const extensionHidden = hidden.has(name) && !include.has(name);\n const explicitlyExcluded = exclude.has(name);\n if (coreHidden || extensionHidden || explicitlyExcluded) {\n if ((extensionHidden || explicitlyExcluded) && !this.#savedHiddenExtensionTools.has(name)) {\n this.#savedHiddenExtensionTools.set(name, index);\n }\n continue;\n }\n next.push(name);\n }\n for (const [name, index] of this.#savedHiddenExtensionTools) {\n if (hidden.has(name) || exclude.has(name) || next.includes(name)) continue;\n this.#savedHiddenExtensionTools.delete(name);\n next.splice(Math.min(index, next.length), 0, name);\n }\n return this.#setIfChanged(active, next);\n }\n\n release(): boolean {\n return this.#restore(this.host.getActiveTools());\n }\n\n #restore(active: string[]): boolean {\n const saved = this.#savedNativeCoreTools;\n const savedHidden = this.#savedHiddenExtensionTools;\n if (!saved && savedHidden.size === 0) return false;\n this.#savedNativeCoreTools = undefined;\n this.#savedHiddenExtensionTools = new Map();\n const next = [...active];\n for (const { name, index } of saved ?? []) {\n if (!next.includes(name)) next.splice(Math.min(index, next.length), 0, name);\n }\n for (const [name, index] of savedHidden) {\n if (!next.includes(name)) next.splice(Math.min(index, next.length), 0, name);\n }\n return this.#setIfChanged(active, next);\n }\n\n #setIfChanged(active: string[], next: string[]): boolean {\n if (sameTools(active, next)) return false;\n this.host.setActiveTools(next);\n return true;\n }\n}\n", "import {\n isFabricExecutionTraceV1,\n type FabricExecutionTraceOperationV1,\n type FabricExecutionTraceV1,\n} from \"./trace.js\";\n\nexport const FABRIC_EXECUTION_DETAILS_MAX_BYTES = 512 * 1024;\n\nexport interface FabricSpeculationSummaryV1 {\n launched: number;\n hit: number;\n missed: number;\n discarded: number;\n}\n\nexport interface FabricPersistedExecutionDetailsV1 {\n success: boolean;\n trace: FabricExecutionTraceV1;\n /** Rich render audits persisted verbatim (minus in-memory media) so a resumed transcript re-renders \u2014 and expands \u2014 exactly like the live one. */\n audits: FabricLegacyRenderAudit[];\n phases: string[];\n speculation?: FabricSpeculationSummaryV1;\n error?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n}\n\n/**\n * The audit fields that cross into the session record; read back by\n * {@link legacyAudit}. In-memory-only payloads (image blocks, media notes,\n * correlation ids) never persist.\n */\nexport interface FabricPersistableAuditInput {\n ref: string;\n tool?: string;\n provider?: string;\n success?: boolean;\n error?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n resultTruncated?: boolean;\n preview?: unknown;\n startedAt?: number;\n endedAt?: number;\n speculated?: boolean;\n}\n\nexport interface FabricLegacyRenderAudit {\n ref: string;\n tool?: string;\n provider?: string;\n success?: boolean;\n error?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n resultTruncated?: boolean;\n preview?: unknown;\n /** Set only when reconstructed from the durable trace: args are privacy-projected and results/previews are not retained. */\n fromTrace?: boolean;\n startedAt?: number;\n endedAt?: number;\n speculated?: boolean;\n}\n\nexport interface FabricExecutionRenderDetails {\n success?: boolean;\n error?: string;\n progress?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n phases: string[];\n audits: FabricLegacyRenderAudit[];\n}\n\nconst serializedBytes = (value: unknown): number =>\n Buffer.byteLength(JSON.stringify(value), \"utf8\");\n\nconst cloneTrace = (trace: FabricExecutionTraceV1): FabricExecutionTraceV1 =>\n structuredClone(trace);\n\nconst persistableAudit = (audit: FabricPersistableAuditInput): FabricLegacyRenderAudit =>\n structuredClone({\n ref: audit.ref,\n ...(audit.tool !== undefined ? { tool: audit.tool } : {}),\n ...(audit.provider !== undefined ? { provider: audit.provider } : {}),\n ...(audit.success !== undefined ? { success: audit.success } : {}),\n ...(audit.error !== undefined ? { error: audit.error } : {}),\n ...(audit.args !== undefined ? { args: audit.args } : {}),\n ...(audit.result !== undefined ? { result: audit.result } : {}),\n ...(audit.resultTruncated !== undefined ? { resultTruncated: audit.resultTruncated } : {}),\n ...(audit.preview !== undefined ? { preview: audit.preview } : {}),\n ...(audit.startedAt !== undefined ? { startedAt: audit.startedAt } : {}),\n ...(audit.endedAt !== undefined ? { endedAt: audit.endedAt } : {}),\n ...(audit.speculated === true ? { speculated: true } : {}),\n });\n\n/**\n * Creates the only object stored in final fabric_exec details. The\n * privacy-projected trace stays the functional record for compaction and tool\n * ownership; rich call audits persist verbatim (minus in-memory media) so a\n * resumed transcript re-renders and expands exactly like the live one \u2014 the\n * collapsed display, not the session record, is the visual boundary. The\n * aggregate object, not each member independently, is bound; display-only\n * audits trim before the functional trace.\n */\nexport const createFabricPersistedExecutionDetails = (input: {\n success: boolean;\n trace: FabricExecutionTraceV1;\n audits?: readonly FabricPersistableAuditInput[];\n phases?: readonly string[];\n speculation?: FabricSpeculationSummaryV1;\n error?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n}): FabricPersistedExecutionDetailsV1 => {\n const details: FabricPersistedExecutionDetailsV1 = {\n success: input.success,\n trace: cloneTrace(input.trace),\n audits: (input.audits ?? []).map(persistableAudit),\n phases: (input.phases ?? []).filter((phase): phase is string => typeof phase === \"string\"),\n ...(input.speculation ? { speculation: input.speculation } : {}),\n ...(typeof input.error === \"string\" && input.error ? { error: input.error } : {}),\n ...(input.outputFormat ? { outputFormat: input.outputFormat } : {}),\n ...(input.outputFormatStartLine !== undefined\n ? { outputFormatStartLine: Math.max(0, Math.floor(input.outputFormatStartLine)) }\n : {}),\n ...(input.outputFormatLines !== undefined\n ? { outputFormatLines: Math.max(0, Math.floor(input.outputFormatLines)) }\n : {}),\n };\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.audits.length > 0\n ) {\n details.audits.pop();\n }\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.trace.operations.length > 0\n ) {\n details.trace.operations.pop();\n details.trace.counts.droppedOperations++;\n }\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.phases.length > 0\n ) {\n details.phases.pop();\n }\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.trace.phases.length > 0\n ) {\n details.trace.phases.pop();\n details.trace.counts.droppedValues++;\n }\n if (serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES) {\n delete details.trace.error;\n details.trace.counts.droppedValues++;\n }\n return details;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst legacyAudit = (value: unknown): FabricLegacyRenderAudit | undefined => {\n if (!isRecord(value) || typeof value.ref !== \"string\") return undefined;\n return {\n ref: value.ref,\n ...(typeof value.tool === \"string\" ? { tool: value.tool } : {}),\n ...(typeof value.provider === \"string\" ? { provider: value.provider } : {}),\n ...(typeof value.success === \"boolean\" ? { success: value.success } : {}),\n ...(typeof value.error === \"string\" ? { error: value.error } : {}),\n ...(isRecord(value.args) ? { args: value.args } : {}),\n ...(value.result !== undefined ? { result: value.result } : {}),\n ...(typeof value.resultTruncated === \"boolean\"\n ? { resultTruncated: value.resultTruncated }\n : {}),\n ...(value.preview !== undefined ? { preview: value.preview } : {}),\n ...(typeof value.startedAt === \"number\" ? { startedAt: value.startedAt } : {}),\n ...(typeof value.endedAt === \"number\" ? { endedAt: value.endedAt } : {}),\n ...(value.speculated === true ? { speculated: true } : {}),\n };\n};\n\nconst auditFromOperation = (\n operation: FabricExecutionTraceOperationV1,\n): FabricLegacyRenderAudit => ({\n ref: operation.ref,\n fromTrace: true,\n ...(operation.action ? { tool: operation.action } : {}),\n ...(operation.provider ? { provider: operation.provider } : {}),\n success: operation.outcome === \"succeeded\",\n ...(operation.error ? { error: operation.error } : {}),\n ...(Object.keys(operation.args).length > 0 ? { args: operation.args } : {}),\n ...(operation.result !== undefined ? { result: operation.result } : {}),\n ...(operation.resultTruncated === true ? { resultTruncated: true } : {}),\n});\n\n/**\n * Adapts both old audit-bearing session details and current trace-only details\n * for rendering. Legacy audits win when present so old transcripts retain\n * their historical rich previews.\n */\nexport const readFabricExecutionRenderDetails = (\n value: unknown,\n): FabricExecutionRenderDetails => {\n if (!isRecord(value)) return { audits: [], phases: [] };\n const trace = isFabricExecutionTraceV1(value.trace) ? value.trace : undefined;\n const oldAudits = Array.isArray(value.audits)\n ? value.audits.map(legacyAudit).filter((audit): audit is FabricLegacyRenderAudit => audit !== undefined)\n : undefined;\n const oldPhases = Array.isArray(value.phases)\n ? value.phases.filter((phase): phase is string => typeof phase === \"string\")\n : undefined;\n return {\n ...(typeof value.success === \"boolean\"\n ? { success: value.success }\n : trace\n ? { success: trace.outcome === \"succeeded\" }\n : {}),\n ...(typeof value.error === \"string\"\n ? { error: value.error }\n : trace?.error\n ? { error: trace.error }\n : {}),\n ...(typeof value.progress === \"string\" ? { progress: value.progress } : {}),\n ...(value.outputFormat === \"yaml\" || value.outputFormat === \"json\"\n ? { outputFormat: value.outputFormat }\n : {}),\n ...(typeof value.outputFormatStartLine === \"number\" &&\n Number.isFinite(value.outputFormatStartLine) &&\n value.outputFormatStartLine >= 0\n ? { outputFormatStartLine: Math.floor(value.outputFormatStartLine) }\n : {}),\n ...(typeof value.outputFormatLines === \"number\" &&\n Number.isFinite(value.outputFormatLines) &&\n value.outputFormatLines >= 0\n ? { outputFormatLines: Math.floor(value.outputFormatLines) }\n : {}),\n phases: oldPhases ?? trace?.phases ?? [],\n audits: oldAudits ?? trace?.operations.map(auditFromOperation) ?? [],\n };\n};\n", "import type { CapturedToolCatalog } from \"../capture/catalog.js\";\nimport { OMP_CORE_TOOL_NAMES } from \"./omp-tools.js\";\n\n/**\n * Append authored guidance from the current exact-name core overrides without\n * presenting those definitions as separate extension tools.\n */\nexport const coreOverridePromptGuidance = (\n catalog: CapturedToolCatalog,\n): string => {\n const sections: string[] = [];\n for (const name of OMP_CORE_TOOL_NAMES) {\n const entry = catalog.get(name);\n if (!entry) continue;\n const definition = entry.definition;\n const snippet = Reflect.get(definition, \"promptSnippet\");\n const guidelines = Reflect.get(definition, \"promptGuidelines\");\n const lines: string[] = [];\n if (typeof snippet === \"string\" && snippet.length > 0) {\n lines.push(`Additional guidance for \\`omp.${name}\\`: ${snippet}`);\n }\n if (Array.isArray(guidelines) && guidelines.every((guideline): guideline is string => typeof guideline === \"string\")) {\n lines.push(`Guidelines for \\`omp.${name}\\`:`);\n lines.push(...guidelines.map((guideline) => `- ${guideline}`));\n }\n if (lines.length > 0) sections.push(lines.join(\"\\n\"));\n }\n return sections.length > 0\n ? `\\n\\nEffective compatible core override guidance:\\n${sections.join(\"\\n\")}`\n : \"\";\n};\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const fabricExecutionKernelGuidance = (fullCodeMode: boolean): string =>\n [\n fullCodeMode\n ? \"OMP Fabric full code mode: `fabric_exec` is the only way to call OMP core tools \u2014 use them as `omp.*` inside `code`.\"\n : \"OMP Fabric is in orchestration-only mode. OMP core and registered extension tools stay on their native direct execution path; inside fabric_exec, `omp.*` and `extensions.*` are unavailable.\",\n // Files the model has not opened (images in particular) must be read before\n // use; this line rides the turn-stable kernel guidance so provider prefix\n // caches stay warm.\n `Read every file the user provides (images, screenshots, code, text) with the ${fullCodeMode ? \"`omp.read`\" : \"`read`\"} tool before responding \u2014 never assume its contents.`,\n ].join(\" \");\n\nexport const defaultFabricExecutionGuidance = (fullCodeMode: boolean): string =>\n fullCodeMode\n ? \"Examples and returns: `omp.read('/x')`, `omp.grep('TODO','src')` / `omp.grep({pattern:'TODO', path:'src', ignoreCase:true, context:2})`, `omp.find({pattern:'*.ts', path:'src', limit:20})`, and `omp.ls('src')` return strings; `omp.bash({cmd:'ls'})`, `omp.edit({path:'/x', old:'a', new:'b'})`, and `omp.write({path:'/y', text:'z'})` return `{ok, output, details}` (read `.output`); failed core calls reject, including shell tools on an ordinary nonzero exit; pass `settle: true` to `omp.bash` to get `{ ok: false, exitCode, output, error }` instead. Timeout, cancellation, approval, and security failures still reject.\\n`tools` is discovery + generic calls only (`providers`/`catalog`/`list`/`search`/`describe`/`call`/`models`). Call known MCP tools as `mcp.<sanitized_server>.<sanitized_tool>(args)`, captured tools as `extensions.<tool>(args)`, and stable providers as `memory.*`, `state.*`, `schema.*`, or `compact.*`. Use `tools.call({ref,args})` for computed refs. `omp` is the core tools; `omp.<key>` reads a named `payloads` value (not a tool).\"\n : \"Call known actions through `mcp.<sanitized_server>.<sanitized_tool>(args)`, `memory.*`, `state.*`, `schema.*`, `components.*`, `compact.*`, `codemap.*`, `agents.*`, or `mesh.*`; use `tools.catalog`/`search`/`describe`/`list` for discovery and `tools.call({ref,args})` for computed refs. Other surfaces are opt-in via user-loaded skills.\";\n\n// Shape of CapturedToolCatalog entries this renderer needs (kept structural to avoid a runtime dependency on the capture layer from a guidance module).\nexport interface ExtensionRosterToolSource {\n name: string;\n sourceInfo?: { source?: string; path?: string };\n}\n\n// Namespace labels come from the extension package's own identity: the\n// package.json `name` nearest the tool's source file, mirroring how OMP names\n// npm-installed packages. Raw `source` strings are configured specifiers that\n// are often full relative paths, so they are only used when no manifest exists.\nconst manifestNameCache = new Map<string, string | undefined>();\n\nconst packageNameFromManifest = (startPath: string | undefined): string | undefined => {\n if (!startPath) return undefined;\n let directory = path.dirname(path.resolve(startPath));\n while (true) {\n if (manifestNameCache.has(directory)) return manifestNameCache.get(directory);\n const manifestPath = path.join(directory, \"package.json\");\n let name: string | undefined;\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (typeof manifest.name === \"string\" && manifest.name.trim()) name = manifest.name.trim();\n } catch {\n // Unreadable or invalid manifest; keep walking upward.\n }\n }\n manifestNameCache.set(directory, name);\n if (name) return name;\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\n// In full code mode the model sees only fabric_exec in its tool list, so\n// registered extension tools are invisible unless named up front (#69). The\n// roster stays names-only: descriptions and schemas are on demand through the\n// tools.list/search/describe discovery surface, so the standing prompt cost is\n// a bare name index. Core overrides are excluded: they surface as omp.* via\n// coreOverridePromptGuidance.\nexport const extensionToolRosterGuidance = (\n tools: ReadonlyArray<ExtensionRosterToolSource>,\n coreToolNames: ReadonlySet<string>,\n): string | undefined => {\n const extensionTools = tools.filter((tool) => !coreToolNames.has(tool.name));\n if (extensionTools.length === 0) return undefined;\n const namespaceLabel = (tool: ExtensionRosterToolSource): string => {\n const source = tool.sourceInfo?.source?.trim();\n if (source?.startsWith(\"npm:\")) return source.slice(\"npm:\".length) || source;\n const manifestName =\n packageNameFromManifest(tool.sourceInfo?.path) ??\n packageNameFromManifest(source && /[\\\\/]/.test(source) ? source : undefined);\n if (manifestName) return manifestName;\n if (source && !/[\\\\/]/.test(source)) return source;\n const parts = (tool.sourceInfo?.path ?? source ?? \"\").split(/[\\\\/]/).filter(Boolean);\n const base = parts.at(-1)?.trim() ?? \"\";\n // Entry files like index.js name the package directory, not the source.\n if (/^index\\./i.test(base)) return parts.at(-2)?.trim() || base;\n return base || \"extensions\";\n };\n const groups = new Map<string, string[]>();\n for (const tool of [...extensionTools].sort((left, right) => left.name.localeCompare(right.name))) {\n const label = namespaceLabel(tool);\n const names = groups.get(label);\n if (names) names.push(tool.name);\n else groups.set(label, [tool.name]);\n }\n return [\n \"Registered extension tools are callable inside fabric_exec as `extensions.<name>(args)`; run `tools.list` for full descriptions and schemas before re-implementing an effect with omp.bash.\",\n ...[...groups.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([label, names]) => \"- \" + label + \": \" + names.join(\", \")),\n ].join(\"\\n\");\n};\n\nexport const fabricSchemaGuidance = (mode: \"off\" | \"audit\" | \"enforce\"): string | undefined => {\n if (mode === \"enforce\") {\n return \"Schema enforce mode is fixed for this session. Reads remain available, but protected-workspace changes must use schema.hypothesize \u2192 schema.verify \u2192 schema.commit in the same fabric_exec invocation. Direct omp.edit/write/bash, agents, state/mesh writes, compaction requests, MCP, extensions, and external providers are blocked by the host gate.\";\n }\n if (mode === \"audit\") {\n return \"Schema audit mode reports actions that enforce mode would block, but preserves their current behavior.\";\n }\n return undefined;\n};\n", "\nimport { getActiveSkills, Settings, type Skill } from \"@oh-my-pi/pi-coding-agent\";\nimport { formatSkillsSection } from \"./skill-block.js\";\n\nconst OMP_SKILL_SECTION_MARKER = \"<skills>\";\nconst OMP_SKILL_SECTION_HEADING = \"# Skills & Rules\\n\";\nconst OMP_SKILL_LOAD_INSTRUCTION = \"Matching skill \u2192 MUST read \\`skill://<name>\\` first.\";\nconst OMP_CUSTOM_SKILL_LOAD_INSTRUCTION =\n \"If a skill applies, you MUST read \\`skill://<name>\\` before proceeding.\";\nconst FABRIC_OMP_SKILL_LOAD_INSTRUCTION =\n \"Matching skill \u2192 MUST read \\`skill://<name>\\` through \\`omp.read\\` inside \\`fabric_exec\\` first.\";\nconst FABRIC_CUSTOM_SKILL_LOAD_INSTRUCTION =\n \"If a skill applies, you MUST read \\`skill://<name>\\` through \\`omp.read\\` inside \\`fabric_exec\\` before proceeding.\";\n\nexport const activeSkills = (): readonly Skill[] => getActiveSkills();\n\nexport const listableSkills = (skills: readonly Skill[]): readonly Skill[] => {\n try {\n if (Settings.instance.get(\"skillful\") === false) return [];\n } catch {\n return skills;\n }\n return skills;\n};\n\nexport const restoreSkillsForFullCodePrompt = (\n systemPrompt: string,\n skills: readonly Skill[],\n): string => {\n if (systemPrompt.includes(OMP_SKILL_SECTION_MARKER)) {\n return systemPrompt\n .replace(OMP_SKILL_LOAD_INSTRUCTION, FABRIC_OMP_SKILL_LOAD_INSTRUCTION)\n .replace(OMP_CUSTOM_SKILL_LOAD_INSTRUCTION, FABRIC_CUSTOM_SKILL_LOAD_INSTRUCTION);\n }\n const section = formatSkillsSection(skills, FABRIC_OMP_SKILL_LOAD_INSTRUCTION);\n if (!section) return systemPrompt;\n const heading = systemPrompt.indexOf(OMP_SKILL_SECTION_HEADING);\n if (heading < 0) return `${systemPrompt}\\n\\n${section}`;\n const insertAt = heading + OMP_SKILL_SECTION_HEADING.length;\n return `${systemPrompt.slice(0, insertAt)}${section}\\n${systemPrompt.slice(insertAt)}`;\n};\n", "import { OMP_CORE_TOOL_NAME_SET } from \"./omp-tools.js\";\n\nexport const PROXY_CONTRACT_CUSTOM_TYPE = \"omp-fabric-proxy\";\n\nconst FABRIC_EXEC_TOOL = \"fabric_exec\";\nconst MAX_PROXY_NAMES = 8;\n\n// Same envelopes the furnace strips before scoring. Here they are the *only*\n// source of evidence: ambient skill prose, not user intent.\nconst SKILL_REGION =\n /<available_skills\\b[^>]*>[\\s\\S]*?(?:<\\/available_skills\\s*>|$)|<skill\\b[^>]*>[\\s\\S]*?(?:<\\/skill\\s*>|$)/g;\n\nconst escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nexport const isRewritableCapturedToolName = (name: string): boolean => {\n if (!name || name === FABRIC_EXEC_TOOL) return false;\n if (OMP_CORE_TOOL_NAME_SET.has(name)) return false;\n return name.includes(\"_\") || name.length >= 10;\n};\n\nexport const rewritableHiddenCapturedToolNames = (\n names: Iterable<string>,\n): string[] =>\n [...new Set(names)]\n .filter(isRewritableCapturedToolName)\n .sort((a, b) => b.length - a.length || a.localeCompare(b));\n\nconst mentionPattern = (name: string): RegExp =>\n new RegExp(`(?<![\\\\w.])${escapeRegex(name)}(?![\\\\w])`);\n\nexport const extractSkillRegions = (text: string): string => {\n const regions: string[] = [];\n for (const match of text.matchAll(SKILL_REGION)) {\n const region = match[0];\n if (region) regions.push(region);\n }\n return regions.join(\"\\n\");\n};\n\nexport const capturedToolMentions = (\n text: string,\n names: readonly string[],\n): string[] => names.filter((name) => mentionPattern(name).test(text));\n\nexport const proxyContractMentionsInSkills = (\n prompt: string,\n systemPrompt: string,\n names: readonly string[],\n): string[] => {\n const envelope = `${extractSkillRegions(prompt)}\\n${extractSkillRegions(systemPrompt)}`;\n if (envelope.trim().length === 0) return [];\n return capturedToolMentions(envelope, names).slice(0, MAX_PROXY_NAMES);\n};\n\nexport const formatProxyContractReminder = (names: readonly string[]): string => {\n const rows = names.map((name) => `\\u25aa ${name} \\u2192 extensions.${name}`);\n return [\n \"Proxy contract: these names in the loaded skill are captured tools, not top-level calls.\",\n \"Call them as `extensions.<name>({...})` inside `fabric_exec`.\",\n \"\",\n ...rows,\n ].join(\"\\n\");\n};\n\nconst namesFromEntry = (entry: {\n type?: unknown;\n customType?: unknown;\n details?: unknown;\n}): string[] => {\n if (entry.type !== \"custom_message\" || entry.customType !== PROXY_CONTRACT_CUSTOM_TYPE) {\n return [];\n }\n const details = entry.details as { names?: unknown } | undefined;\n if (Array.isArray(details?.names)) {\n return details.names.filter((name): name is string => typeof name === \"string\" && name.length > 0);\n }\n return [];\n};\n\n/**\n * Branch-local set of captured names already reminded. Restored from\n * `omp-fabric-proxy` transcript entries only \u2014 never counted as furnace fires.\n */\nexport class ProxyContractLedger {\n #reminded = new Set<string>();\n\n reset(): void {\n this.#reminded.clear();\n }\n\n restoreFromEntries(entries: readonly unknown[]): void {\n this.#reminded.clear();\n for (const entryUnknown of entries) {\n if (typeof entryUnknown !== \"object\" || entryUnknown === null) continue;\n for (const name of namesFromEntry(entryUnknown as Parameters<typeof namesFromEntry>[0])) {\n this.#reminded.add(name);\n }\n }\n }\n\n take(candidates: readonly string[]): string[] {\n const fresh = candidates.filter((name) => !this.#reminded.has(name));\n for (const name of fresh) this.#reminded.add(name);\n return fresh;\n }\n}\n", "import type { Usage } from \"@oh-my-pi/pi-ai\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n ToolCallEvent,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricConfig } from \"../config.js\";\nimport type { ResolvedFabricAction } from \"./action-registry.js\";\nimport {\n ApprovalController,\n FabricSessionApprovals,\n type FabricAutoApprovalAudit,\n} from \"./approval-controller.js\";\nimport {\n FabricAutoApprovalClassifier,\n type FabricAutoApprovalDecision,\n} from \"./auto-approval-classifier.js\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst addUsage = (left: Usage, right: Usage): Usage => ({\n input: left.input + right.input,\n output: left.output + right.output,\n cacheRead: left.cacheRead + right.cacheRead,\n cacheWrite: left.cacheWrite + right.cacheWrite,\n totalTokens: left.totalTokens + right.totalTokens,\n cost: {\n input: left.cost.input + right.cost.input,\n output: left.cost.output + right.cost.output,\n cacheRead: left.cost.cacheRead + right.cost.cacheRead,\n cacheWrite: left.cost.cacheWrite + right.cost.cacheWrite,\n total: left.cost.total + right.cost.total,\n },\n});\n\nexport const mergeFabricApprovalUsage = (\n existing: Usage | undefined,\n approval: Usage,\n): Usage => existing ? addUsage(existing, approval) : approval;\n\nexport class FabricDirectToolApproval {\n readonly #pendingUsage = new Map<string, Usage>();\n\n constructor(\n readonly omp: Pick<ExtensionAPI, \"getAllTools\">,\n readonly getConfig: () => FabricConfig,\n readonly sessionApprovals: FabricSessionApprovals,\n readonly classifier = new FabricAutoApprovalClassifier(),\n readonly onAutoDecision?: (\n audit: FabricAutoApprovalAudit,\n decision?: FabricAutoApprovalDecision,\n ) => void,\n ) {}\n\n async approve(event: ToolCallEvent, context: ExtensionContext): Promise<void> {\n const config = this.getConfig();\n const action = this.#resolve(event.toolName, config);\n const controller = new ApprovalController(\n config.approvals,\n context,\n this.sessionApprovals,\n this.classifier,\n (audit, decision) => {\n this.onAutoDecision?.(audit, decision);\n if (decision) this.#pendingUsage.set(event.toolCallId, decision.usage);\n },\n );\n await controller.approve(action, isRecord(event.input) ? event.input : {});\n }\n\n takeUsage(toolCallId: string): Usage | undefined {\n const usage = this.#pendingUsage.get(toolCallId);\n this.#pendingUsage.delete(toolCallId);\n return usage;\n }\n\n clear(): void {\n this.#pendingUsage.clear();\n }\n\n #resolve(toolName: string, config: FabricConfig): ResolvedFabricAction {\n const metadata = this.omp.getAllTools().find((tool) => tool.name === toolName);\n const builtin = metadata?.sourceInfo.source === \"builtin\";\n const provider = builtin ? \"omp\" : \"extensions\";\n return {\n ref: provider + \".\" + toolName,\n provider,\n name: toolName,\n description: metadata?.description ?? \"Direct OMP tool: \" + toolName,\n inputSchema: isRecord(metadata?.parameters) ? metadata.parameters : {},\n risk: config.capture.risks[toolName] ?? config.capture.defaultRisk,\n };\n }\n}\n", "export interface SkillReference {\n name: string;\n filePath: string;\n hide?: boolean;\n}\n\nconst INVOCATION_VERB =\n /^\\s*(?:[-*]\\s*)?(?:(?:then|next|first|always|must|you must)\\s+)?(?:run|invoke|load|start|follow|use)\\b/i;\nconst NEGATED_INVOCATION =\n /^\\s*(?:[-*]\\s*)?(?:do not|don't|never)\\s+(?:run|invoke|load|start|follow|use)\\b/i;\n\nconst escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nconst referencesSkill = (line: string, skillName: string): boolean => {\n const name = escapeRegex(skillName);\n return new RegExp(`/(?:skill:)?${name}(?=[\\\\s\\`'\".,;:!?<>)\\\\]}]|$)`, \"i\").test(line);\n};\n\nexport const buildSkillReferenceGuidance = (\n prompt: string,\n skills: readonly SkillReference[],\n): string | undefined => {\n const active = skills.find((skill) =>\n prompt.startsWith(`<skill name=\"${skill.name}\" location=\"${skill.filePath}\">`),\n );\n if (!active) return undefined;\n\n const closingTag = prompt.indexOf(\"</skill>\");\n if (closingTag < 0) return undefined;\n const openingEnd = prompt.indexOf(\"\\n\\n\");\n if (openingEnd < 0 || openingEnd >= closingTag) return undefined;\n const body = prompt.slice(openingEnd + 2, closingTag);\n const invocationLines = body\n .split(\"\\n\")\n .filter((line) => INVOCATION_VERB.test(line) && !NEGATED_INVOCATION.test(line));\n\n const referenced = skills.filter(\n (skill) =>\n skill.name !== active.name &&\n skill.hide !== true &&\n invocationLines.some((line) => referencesSkill(line, skill.name)),\n );\n if (referenced.length === 0) return undefined;\n\n const mappings = referenced\n .map((skill) => `- /${skill.name} -> ${JSON.stringify(skill.filePath)}`)\n .join(\"\\n\");\n return [\n `The active skill ${JSON.stringify(active.name)} is already expanded; do not reread ${JSON.stringify(active.filePath)}.`,\n \"Resolve the skill invocations below before task exploration:\",\n mappings,\n \"Load each mapped SKILL.md through omp.read inside fabric_exec and follow it. Skill loading is a dependency, not task exploration. Continue the active workflow after tool results and later user replies until it completes.\",\n ].join(\"\\n\");\n};\n", "import type { Theme, ToolDefinition, ToolRenderResultOptions } from \"@oh-my-pi/pi-coding-agent\";\nimport type { TSchema } from \"@oh-my-pi/omptype/typebox\";\nimport { Container, Text, type Component } from \"@oh-my-pi/pi-tui\";\n\ntype FabricToolDefinition = ToolDefinition<any, any> & {\n promptGuidelines?: readonly string[];\n promptSnippet?: string;\n};\n\nconst defineTool = (tool: FabricToolDefinition): ToolDefinition<any, any> => tool;\nimport { arcItemStyled } from \"./ui/arc-group.js\";\nimport type { CodePreviewSettings } from \"./ui/code-preview.js\";\nimport {\n type FabricToolShellDecorator,\n type PreviewRenderContext,\n withCodePreviewShell,\n} from \"./ui/code-preview-shell.js\";\nimport { fabricExecTitleHintCached } from \"./ui/fabric-title-hint.js\";\nimport { Type } from \"@oh-my-pi/omptype/typebox\";\nimport {\n createFabricPersistedExecutionDetails,\n readFabricExecutionRenderDetails,\n} from \"./audit/index.js\";\nimport { DEFAULT_FABRIC_CONFIG } from \"./config.js\";\nimport { fabricSpeculationSummary } from \"./speculation/summary.js\";\nimport type { FabricState } from \"./fabric-state.js\";\nimport { formatFailureProgress } from \"./failure-progress.js\";\nimport {\n prepareFabricExecArguments,\n resolveFabricExecPayloads,\n} from \"./fabric-exec-arguments.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\nimport { typeErrorRecoveryHint } from \"./type-error-guidance.js\";\nimport { normalizeRunDisplay } from \"./run-display.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport type { FabricMediaBlock } from \"./protocol.js\";\nimport {\n captureFabricAgentPreviews,\n captureFabricCallHeadlinePreviews,\n captureFabricCoreToolPreviews,\n captureFabricWritePreviews,\n expandHint,\n fabricMulticallCallLimit,\n fabricWriteBindings,\n inheritComponentBackground,\n modelReadHint,\n nestedCallBody,\n nestedCallTitle,\n renderBoundedLines,\n renderFabricMulticallPartial,\n renderFabricWriteArgumentPreview,\n renderAgentToolPreviewLines,\n restoreFabricAgentPreviews,\n restoreFabricCallHeadlinePreviews,\n restoreFabricCoreToolPreviews,\n restoreFabricWritePreviews,\n restoreLegacyBashCommands,\n safeTerminalText,\n singleCallProgressLine,\n type FabricAgentPreview,\n type FabricCallHeadlinePreview,\n type FabricCoreToolPreview,\n type FabricRenderAudit,\n type FabricWriteBinding,\n type FabricWritePreview,\n} from \"./ui/fabric-render.js\";\nimport {\n coreToolPreviewEnabled,\n coreToolRendererEnabled,\n isCoreToolAudit,\n renderCoreToolBody,\n} from \"./ui/core-tool-render.js\";\nimport { highlightCode, observeOmpTheme } from \"./ui/highlight.js\";\nimport {\n HiddenRowBorrowingComponent,\n observeResultRows,\n type ResultRowBalance,\n} from \"./ui/row-balance.js\";\nimport { type SpinnerTimerState, updateSpinner } from \"./ui/spinner.js\";\nimport type { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { boundModelOutput, modelOutputBudget } from \"./output-budget.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { countNewlines } from \"./util.js\";\n\nconst RESULT_FORMATS = [\"auto\", \"yaml\", \"json\", \"text\"] as const;\ntype FabricExecParams = {\n code: string | string[];\n payloads?: unknown;\n display?: unknown;\n resultFormat?: (typeof RESULT_FORMATS)[number];\n tokenBudget?: number;\n agentBudget?: number;\n timeoutMs?: number;\n};\nconst MAX_FABRIC_CODE_TRANSFER_LINES = 12;\n\ntype FabricRendererState = {\n fabricWriteBindingsCode?: string;\n fabricWriteBindings?: FabricWriteBinding[];\n fabricWritePreviews?: FabricWritePreview[];\n fabricCoreToolPreviews?: FabricCoreToolPreview[];\n fabricCallHeadlinePreviews?: FabricCallHeadlinePreview[];\n fabricAgentPreviews?: FabricAgentPreview[];\n fabricResultRowBalance?: ResultRowBalance;\n fabricSpinner?: SpinnerTimerState;\n};\n\nconst normalizeFabricExecParams = (input: unknown): FabricExecParams => {\n const prepared = prepareFabricExecArguments(input);\n if (typeof prepared !== \"object\" || prepared === null || Array.isArray(prepared)) {\n throw new Error(\"fabric_exec arguments must be an object\");\n }\n const record = prepared as Record<string, unknown>;\n const code = record.code;\n if (typeof code !== \"string\" && !(Array.isArray(code) && code.every((line) => typeof line === \"string\"))) {\n throw new Error(\"fabric_exec code must be a string or string array\");\n }\n const resultFormat = RESULT_FORMATS.includes(record.resultFormat as (typeof RESULT_FORMATS)[number])\n ? record.resultFormat as (typeof RESULT_FORMATS)[number]\n : undefined;\n return {\n code,\n ...(record.payloads !== undefined ? { payloads: record.payloads } : {}),\n ...(record.display !== undefined ? { display: record.display } : {}),\n ...(resultFormat !== undefined ? { resultFormat } : {}),\n ...(typeof record.tokenBudget === \"number\" ? { tokenBudget: record.tokenBudget } : {}),\n ...(typeof record.agentBudget === \"number\" ? { agentBudget: record.agentBudget } : {}),\n ...(typeof record.timeoutMs === \"number\" ? { timeoutMs: record.timeoutMs } : {}),\n };\n};\n\ntype FabricToolDisplayMode = \"full\" | \"compact\";\n\n// Bootstrap, not runtime activation, is the config-readiness seam: upstream's\n// deferred startup loads configuration into FabricState without creating the\n// heavyweight runtime, so a resumed session must honor the bootstrapped\n// ui.toolDisplay even while state.initialized is still false. The explicit\n// bootstrapped check also guards the failed-bootstrap window (config loaded\n// unsuccessfully): compact is the configured default, but a broken or absent\n// configuration falls back to full so a degraded startup never hides the\n// underlying transcript.\nconst toolDisplayMode = (state: FabricState): FabricToolDisplayMode =>\n state.bootstrapped ? state.config.ui.toolDisplay : \"full\";\n\nconst compactResultHeader = (\n theme: Theme,\n audits: FabricRenderAudit[],\n failed: boolean,\n): string => {\n const failedCalls = audits.filter((audit) => audit.success === false).length;\n const isFailed = failed || failedCalls > 0;\n return theme.fg(isFailed ? \"error\" : \"success\", `${isFailed ? \"\u2717\" : \"\u2713\"} Tools`) +\n theme.fg(\n \"dim\",\n ` \u00B7 ${countLabel(audits.length, \"call\")}${failedCalls > 0 ? ` \u00B7 ${failedCalls} failed` : \"\"}`,\n );\n};\n\nconst countLabel = (count: number, singular: string): string =>\n `${count} ${count === 1 ? singular : `${singular}s`}`;\nconst rendererStates = new WeakMap<object, FabricRendererState>();\n\nconst rendererStateFor = (key: unknown): FabricRendererState => {\n const object = typeof key === \"object\" && key !== null ? key : rendererStates;\n const existing = rendererStates.get(object);\n if (existing) return existing;\n const created: FabricRendererState = {};\n rendererStates.set(object, created);\n return created;\n};\n\nconst isRenderComponent = (value: unknown): value is Component =>\n value !== null && typeof value === \"object\" && typeof Reflect.get(value, \"render\") === \"function\";\n\nconst previewContext = (\n options: ToolRenderResultOptions,\n state: FabricState,\n args: unknown,\n rendererState: FabricRendererState,\n): PreviewRenderContext => {\n const raw = options as ToolRenderResultOptions & { renderContext?: Record<string, unknown> };\n const supplied = raw.renderContext ?? (options as unknown as Record<string, unknown>);\n const executionStarted = typeof supplied.executionStarted === \"boolean\"\n ? supplied.executionStarted\n : !options.isPartial;\n const argsComplete = typeof supplied.argsComplete === \"boolean\"\n ? supplied.argsComplete\n : !options.isPartial;\n return {\n args,\n toolCallId: typeof supplied.toolCallId === \"string\" ? supplied.toolCallId : \"fabric_exec\",\n invalidate: typeof supplied.invalidate === \"function\" ? supplied.invalidate as () => void : () => undefined,\n lastComponent: isRenderComponent(supplied.lastComponent) ? supplied.lastComponent : undefined,\n state: supplied.state && typeof supplied.state === \"object\" ? supplied.state as FabricRendererState : rendererState,\n cwd: typeof supplied.cwd === \"string\" ? supplied.cwd : state.cwd ?? process.cwd(),\n executionStarted,\n argsComplete,\n isPartial: options.isPartial,\n expanded: options.expanded,\n showImages: supplied.showImages !== false,\n isError: supplied.isError === true,\n };\n};\n\nexport const createFabricExecTool = (\n state: FabricState,\n codePreviewSettings: CodePreviewSettings,\n pendingHandoffs: Map<string, PendingFabricHandoff>,\n decorateShell: FabricToolShellDecorator = withCodePreviewShell,\n toolDisplay?: FabricToolDisplayController,\n): ToolDefinition<any, any> => decorateShell(\n defineTool({\n name: \"fabric_exec\",\n label: \"Fabric\",\n description:\n \"Execute type-checked TypeScript through Fabric's configured executor for OMP tools, MCP, Fabric providers, discovery, and extensions. QuickJS is isolated by default; the optional Node/Bun process is an unsafe trusted-code escape hatch. In full code mode, and always in Schema enforce mode, this is the exclusive model tool path.\",\n promptGuidelines: [\n \"Batch independent operations in one `fabric_exec` program (`Promise.all` for parallel, sequential `await` for ordered), not one call per tool; keep dependent/conditional steps sequential. Coalesce non-dependent replacements from one file snapshot into one `omp.edit({path, edits:[...]})`; use `all:true` only for intentional repeated exact anchors. Return only the compact final value; intermediate results stay in the sandbox.\",\n \"Search before reading: use `omp.grep`/`omp.find` to locate relevant lines, then `omp.read({path, offset, limit})` that range. Escape regex metacharacters, or use `literal:true` for exact punctuated text. Keep fan-out search limits small and widen only on misses. An unbounded `omp.read` returns at most 2000 lines or 50KB and, when truncated, ends with a `Use offset=\u2026` continuation notice.\",\n \"For coding tasks, keep an acceptance ledger: turn the request into concrete checks, trace the relevant execution path before editing, implement end to end, then run targeted tests and direct behavioral probes. Mechanically confirm requested public symbols, registrations, and configuration entries. Use the smallest checks that cover the ledger, escalating only for failures or cross-cutting risk; inspect failures and iterate instead of rerunning unchanged passing checks. A build alone is not completion.\",\n \"Amortize round trips without inflating context: batch only independent, bounded work. Keep search\u2192read and edit\u2192verify sequential when an output determines the next action. Use `settle:true` for tests or probes whose nonzero result is evidence rather than an exceptional stop; for a known long suite, set `omp.bash` `timeout` in seconds once instead of retrying a timed-out call. Filter or summarize noisy command output inside the program and return decisions, failures, and evidence\u2014not raw logs or unused intermediate results.\",\n \"For edits/writes, pass named payloads through top-level `payloads`; each `payloads.key` must exactly match a key there; prefer `omp.edit`/`omp.write`. `omp.bash`: no stdin.\",\n \"Use `display.name` and objective `display.description`; Fabric pairs them with verified outcomes in deterministic compaction.\",\n ],\n // The model-facing schema is intentionally flat: one large code string plus scalar metadata.\n // Keep nested payloads bounded and let prepareArguments normalize provider input.\n parameters: Type.Object({\n code: Type.String({\n description:\n \"TypeScript function body. Top-level await and return are supported. Globals include `tools`, `mcp`, `memory`, `state`, `schema`, `compact`, `codemap`, `agents`, `mesh`, `print`, and `omp`; full-code mode adds `omp` and `extensions`. Payloads contains only the exact keys supplied by this call.\"\n }),\n payloads: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n description:\n \"Named payloads exposed under the same exact name as omp.key (for example, payloads.contract becomes omp.contract). Never reference a key absent from this map. Useful for content that is awkward to quote inside code. Prefer an object of string values; a JSON-object string is parsed.\",\n }),\n ),\n resultFormat: Type.Optional(Type.Union(RESULT_FORMATS.map((value) => Type.Literal(value)))),\n tokenBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional token budget observed by workflow.agent() calls\",\n }),\n ),\n agentBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional agent-call cap, bounded by Fabric configuration\",\n }),\n ),\n timeoutMs: Type.Optional(\n Type.Number({\n minimum: 1,\n description:\n \"Optional whole-program deadline in ms for this invocation; raises (never lowers) the configured executor.timeoutMs, capped by executor.maxTimeoutMs\",\n }),\n ),\n display: Type.Optional(\n Type.Union([\n Type.Object(\n {\n name: Type.Optional(\n Type.String({\n description: \"Concise execution milestone used by the Fabric activity UI and deterministic compaction continuity\",\n }),\n ),\n description: Type.Optional(\n Type.String({\n description: \"Compact declared objective or acceptance criterion shown in the dashboard and richer compaction activity\",\n }),\n ),\n },\n ),\n Type.String({\n description:\n \"Objective shorthand normalized to { name } (a JSON-object string is parsed). Prefer the object form when available.\",\n }),\n ]),\n ),\n }),\n // OMP validates custom-tool arguments before `tool_call` and `execute`, so\n // compatibility coercions for the model-facing boundary must live in the\n // official prepareArguments hook rather than execute-time fallbacks.\n renderCall(params: FabricExecParams, options: ToolRenderResultOptions, theme: Theme) {\n const rendererState = rendererStateFor(params);\n const context = previewContext(options, state, params, rendererState);\n observeOmpTheme(theme);\n const code = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const mode = toolDisplayMode(state);\n toolDisplay?.observe(context.toolCallId, \"call\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n context.isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n if (rendererState.fabricWriteBindingsCode !== code) {\n rendererState.fabricWriteBindingsCode = code;\n rendererState.fabricWriteBindings = fabricWriteBindings(code);\n }\n // The write argument preview is a streaming affordance: it previews\n // pending writes while args are still arriving. OMP only flips\n // executionStarted for live calls; resumed cards stay at its false\n // default and are always complete (isPartial false), so their previews\n // belong to the result side alone. Without the isPartial gate, a\n // collapsed resumed card shows the same write twice.\n const writePreview = context.executionStarted || !context.isPartial\n ? null\n : renderFabricWriteArgumentPreview(\n {\n bindings: rendererState.fabricWriteBindings ?? [],\n payloads: resolveFabricExecPayloads(params),\n expanded: context.expanded,\n cwd: context.cwd,\n settings: codePreviewSettings,\n spinner,\n },\n theme,\n context.invalidate,\n );\n // OMP app.tools.expand toggle (ctrl+o) flips context.expanded and\n // promotes a compact card to the full transcript below.\n if (mode === \"compact\" && !context.expanded) {\n const display = normalizeRunDisplay(params.display);\n // Session-wide memo keyed by the program string: the same hint serves\n // the live card, the activity feed, and compaction intent.\n const title = display?.name?.trim() || fabricExecTitleHintCached(code);\n const header = renderBoundedLines(\n [\n theme.fg(\"toolTitle\", theme.bold(safeTerminalText(title || \"Fabric\"))),\n ...(display?.description\n ? [theme.fg(\"dim\", safeTerminalText(display.description))]\n : []),\n ],\n theme,\n codePreviewSettings.diffIntensity,\n );\n if (!writePreview) return header;\n const composite = new Container();\n composite.addChild(header);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n }\n\n const lines = safeTerminalText(code).split(\"\\n\");\n const runDisplay = normalizeRunDisplay(params.display);\n const displayName = runDisplay?.name ? safeTerminalText(runDisplay.name) : \"\";\n const title = `${theme.fg(\"toolTitle\", theme.bold(\"fabric\"))}${\n displayName ? ` ${theme.fg(\"accent\", displayName)}` : \"\"\n } ${theme.fg(\"dim\", `TypeScript \u00B7 ${countLabel(lines.length, \"line\")}`)}`;\n // Match the compact header: the declared objective sits between the\n // title and the code preview.\n const description = runDisplay?.description\n ? theme.fg(\"dim\", safeTerminalText(runDisplay.description))\n : \"\";\n const baseLimit = context.expanded ? lines.length : Math.min(lines.length, 8);\n const maxLimit = context.expanded\n ? lines.length\n : Math.min(lines.length, baseLimit + MAX_FABRIC_CODE_TRANSFER_LINES);\n const renderCodePreview = (limit: number, width: number): string[] => {\n const shown = lines.slice(0, limit);\n const lineNumberWidth = String(Math.max(1, shown.length)).length;\n const preview = shown\n .map(\n (line, index) =>\n `${theme.fg(\"dim\", String(index + 1).padStart(lineNumberWidth, \" \"))} ${theme.fg(\"muted\", line || \" \")}`,\n )\n .join(\"\\n\");\n const hidden = lines.length - shown.length;\n const hiddenHint =\n hidden > 0\n ? `\\n${theme.fg(\"dim\", `\u2026 ${countLabel(hidden, \"line\")} hidden \u00B7 `)}${expandHint(theme)}`\n : \"\";\n return [...new Text(\n `${title}${description ? `\\n${description}` : \"\"}${preview ? `\\n${preview}` : \"\"}${hiddenHint}`,\n 0,\n 0,\n ).render(width)];\n };\n const codePreview = new HiddenRowBorrowingComponent(\n baseLimit,\n maxLimit,\n renderCodePreview,\n rowBalance,\n );\n if (!writePreview) return codePreview;\n const composite = new Container();\n composite.addChild(codePreview);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n },\n renderResult(result, options, theme, params?: FabricExecParams) {\n const expanded = options.expanded;\n const isPartial = options.isPartial;\n const rendererState = rendererStateFor(result.details ?? params ?? options);\n const context = previewContext(options, state, params, rendererState);\n observeOmpTheme(theme);\n const details = readFabricExecutionRenderDetails(result.details);\n let audits = restoreLegacyBashCommands(\n details.audits as FabricRenderAudit[],\n params ?? { code: \"\" },\n );\n toolDisplay?.observe(context.toolCallId, \"result\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n const trackRows = (component: Component): Component =>\n observeResultRows(\n inheritComponentBackground(component),\n rowBalance,\n { expanded, isPartial },\n );\n if (isPartial) {\n rendererState.fabricCoreToolPreviews = captureFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n rendererState.fabricAgentPreviews = captureFabricAgentPreviews(\n audits,\n rendererState.fabricAgentPreviews,\n );\n const headlinePreviews = captureFabricCallHeadlinePreviews(audits);\n if (headlinePreviews.length > 0) {\n rendererState.fabricCallHeadlinePreviews = headlinePreviews;\n }\n const writePreviews = captureFabricWritePreviews(audits);\n if (writePreviews.length > 0) rendererState.fabricWritePreviews = writePreviews;\n } else {\n if (rendererState.fabricCoreToolPreviews) {\n audits = restoreFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n }\n if (rendererState.fabricAgentPreviews) {\n audits = restoreFabricAgentPreviews(audits, rendererState.fabricAgentPreviews);\n }\n if (rendererState.fabricCallHeadlinePreviews) {\n audits = restoreFabricCallHeadlinePreviews(\n audits,\n rendererState.fabricCallHeadlinePreviews,\n );\n }\n if (rendererState.fabricWritePreviews) {\n audits = restoreFabricWritePreviews(audits, rendererState.fabricWritePreviews);\n }\n }\n const phases = details.phases;\n const nl = \"\\n\";\n const allRowIndexes = (lines: string[], enabled: boolean): ReadonlySet<number> | undefined =>\n enabled ? new Set(lines.map((_line, index) => index)) : undefined;\n // Expanded (app.tools.expand / ctrl+o) promotes compact cards to the\n // full rendering; compact only governs the collapsed presentation.\n const compact = !expanded && toolDisplayMode(state) === \"compact\";\n const corePreviewContext = { cwd: context.cwd, settings: codePreviewSettings };\n const showAgentToolPreview = state.initialized\n ? state.config.ui.showAgentToolPreview\n : DEFAULT_FABRIC_CONFIG.ui.showAgentToolPreview;\n\n const renderBody = (\n audit: FabricRenderAudit,\n limit: number,\n ): { body: string; hidden: number } | null => {\n const core = renderCoreToolBody(audit, theme, {\n cwd: context.cwd,\n settings: codePreviewSettings,\n expanded,\n maxLines: limit,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (core) return { body: core.lines.join(nl), hidden: core.hidden };\n if (coreToolRendererEnabled(audit, codePreviewSettings)) return null;\n\n const body = nestedCallBody(audit);\n if (!body) return null;\n const bodyLines = safeTerminalText(body).split(nl);\n while (bodyLines.length > 0) {\n const last = bodyLines[bodyLines.length - 1];\n if (last === undefined || last.trim() === \"\") bodyLines.pop();\n else break;\n }\n if (bodyLines.length === 0) return null;\n const shown = bodyLines.slice(0, limit);\n return {\n body: shown.map((line) => theme.fg(\"toolOutput\", line || \" \")).join(nl),\n hidden: bodyLines.length - shown.length,\n };\n };\n\n if (isPartial) {\n const progress = details.progress;\n if (audits.length === 0) {\n const label = compact ? \"Running\u2026\" : progress ?? \"Running Fabric program\u2026\";\n return trackRows(\n new Text(theme.fg(\"warning\", `\u25C6 ${safeTerminalText(label)}`), 0, 0),\n );\n }\n if (audits.length === 1) {\n const audit = audits[0]!;\n const glyph =\n audit.success === undefined\n ? theme.fg(\"warning\", spinner)\n : audit.success === false\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n let text = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n const progressLine = singleCallProgressLine(progress, previewLines);\n if (audit.success === false && audit.error) {\n text += nl + ` ${theme.fg(\"error\", safeTerminalText(audit.error))}`;\n } else {\n const rendered = renderBody(\n audit,\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 10,\n );\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (progressLine) {\n text += nl + theme.fg(\"dim\", progressLine);\n }\n }\n if (audit.success !== false && previewLines[0]) {\n const firstBreak = text.indexOf(nl);\n if (firstBreak < 0) text += ` ${previewLines[0]}`;\n else text = `${text.slice(0, firstBreak)} ${previewLines[0]}${text.slice(firstBreak)}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n let preview: { auditIndex: number; body: string; hidden: number } | undefined;\n for (let index = audits.length - 1; index >= 0; index--) {\n const audit = audits[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, expanded ? 20 : 10);\n if (rendered) {\n preview = { auditIndex: index, ...rendered };\n break;\n }\n }\n return trackRows(\n renderFabricMulticallPartial(\n {\n audits,\n phases,\n progress,\n expanded,\n preview,\n core: corePreviewContext,\n showAgentToolPreview,\n spinner,\n ...(compact ? { activityLabel: \"Tools\" } : {}),\n },\n theme,\n context?.invalidate,\n ),\n );\n }\n\n const output = result.content\n .filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n .map((part) => part.text)\n .join(nl);\n const styleOutputLines = (lines: string[]): string[] => {\n if (!details.outputFormat || lines.length === 0) {\n return lines.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n }\n const highlightedStart = Math.min(\n lines.length,\n details.outputFormatStartLine ?? 0,\n );\n const highlightedCount = Math.min(\n lines.length - highlightedStart,\n details.outputFormatLines ?? lines.length,\n );\n const highlightedSource = lines.slice(\n highlightedStart,\n highlightedStart + highlightedCount,\n );\n const highlighted = highlightedSource.length > 0\n ? highlightCode(\n highlightedSource.join(nl),\n details.outputFormat,\n context?.invalidate,\n )\n : [];\n const styledPrefix = highlighted?.map((line) => line || \" \")\n ?? highlightedSource.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n return [\n ...lines.slice(0, highlightedStart).map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ...styledPrefix,\n ...lines\n .slice(highlightedStart + highlightedCount)\n .map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ];\n };\n const failed = details.success === false;\n\n if (audits.length === 0) {\n if (failed && details.error) {\n return trackRows(\n new Text(\n theme.fg(\"error\", `\u2717 ${safeTerminalText(details.error)}`),\n 0,\n 0,\n ),\n );\n }\n if (!output) {\n return trackRows(new Text(\n compact\n ? theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\")\n : theme.fg(\"dim\", \"\u2713 Fabric\"),\n 0,\n 0,\n ));\n }\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 12;\n const shown = lines.slice(0, limit);\n let text = styleOutputLines(shown).join(nl);\n if (compact) {\n text = theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\") + nl + text;\n }\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n return trackRows(\n renderBoundedLines(text.split(nl), theme, codePreviewSettings.diffIntensity),\n );\n }\n\n if (audits.length === 1) {\n const audit = audits[0]!;\n let text = compact\n ? `${compactResultHeader(theme, audits, failed)}${nl}${nestedCallTitle(\n audit,\n theme,\n context?.invalidate,\n corePreviewContext,\n )}`\n : nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext);\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (audit.success === false) {\n if (audit.error) {\n text += nl + theme.fg(\"error\", safeTerminalText(audit.error));\n }\n return trackRows(new Text(text, 0, 0));\n }\n if (previewLines[0]) {\n text += ` ${previewLines[0]}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const limit =\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 12;\n const rendered = previewLines.length > 0 ? null : renderBody(audit, limit);\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (\n previewLines.length === 0 &&\n output &&\n !isCoreToolAudit(audit) &&\n (!compact || failed || expanded)\n ) {\n const lines = safeTerminalText(output).split(nl);\n const outLimit = expanded ? Math.min(lines.length, 200) : 12;\n const outShown = lines.slice(0, outLimit);\n text += nl + styleOutputLines(outShown).join(nl);\n if (lines.length > outShown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - outShown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n\n const failedCalls = audits.filter(\n (audit) => audit.success === false,\n ).length;\n const status = failed ? \"failed\" : \"complete\";\n const statusColor = failed ? \"error\" : \"success\";\n const metadata = [\n countLabel(audits.length, \"nested call\"),\n failedCalls > 0 ? `${failedCalls} failed` : undefined,\n phases.length > 0 ? countLabel(phases.length, \"phase\") : undefined,\n ].filter((value): value is string => Boolean(value));\n let text = compact\n ? compactResultHeader(theme, audits, failed)\n : theme.fg(\n statusColor,\n `${failed ? \"\u2717\" : \"\u2713\"} Fabric ${status}`,\n );\n if (!compact && metadata.length > 0) text += theme.fg(\"dim\", ` \u00B7 ${metadata.join(\" \u00B7 \")}`);\n if (phases.length > 0)\n text += nl + theme.fg(\"dim\", phases.map((phase) => `\u25C6 ${phase}`).join(\" \"));\n\n const callLimit = fabricMulticallCallLimit(expanded);\n const callsShown = audits.slice(0, callLimit);\n const callsHidden = audits.length - callsShown.length;\n let collapsedPreview:\n | { auditIndex: number; body: string; hidden: number }\n | undefined;\n if (!expanded) {\n for (let index = callsShown.length - 1; index >= 0; index--) {\n const audit = callsShown[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, 10);\n if (rendered) {\n collapsedPreview = { auditIndex: index, ...rendered };\n break;\n }\n }\n }\n let firstNested = true;\n const textRows = text.split(nl);\n const agentWrapLineIndexes = new Set<number>();\n for (let index = 0; index < callsShown.length; index++) {\n const audit = callsShown[index]!;\n if (expanded && !firstNested) textRows.push(\"\");\n firstNested = false;\n const glyph =\n audit.success === false ? theme.fg(\"error\", \"\u2717\") : theme.fg(\"dim\", \"\u203A\");\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n compact: !expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n let callRow = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n if (previewLines[0] && audit.success !== false) {\n callRow += ` ${previewLines[0]}`;\n if (expanded) agentWrapLineIndexes.add(textRows.length);\n }\n textRows.push(callRow);\n if (audit.success === false && audit.error) {\n textRows.push(` ${theme.fg(\"error\", safeTerminalText(audit.error))}`);\n } else {\n if (previewLines.length > 1) {\n for (const line of previewLines.slice(1)) {\n agentWrapLineIndexes.add(textRows.length);\n textRows.push(line);\n }\n }\n const rendered = previewLines.length === 0 && expanded ? renderBody(audit, 40) : null;\n if (rendered) {\n textRows.push(...rendered.body.split(nl));\n if (rendered.hidden > 0) {\n textRows.push(theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`));\n }\n } else if (previewLines.length === 0 && collapsedPreview?.auditIndex === index) {\n textRows.push(...collapsedPreview.body.split(nl).map((line) => ` ${line}`));\n if (collapsedPreview.hidden > 0) {\n textRows.push(theme.fg(\n \"dim\",\n ` \u2026 ${countLabel(collapsedPreview.hidden, \"line\")}`,\n ));\n }\n }\n }\n }\n text = textRows.join(nl);\n if (callsHidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(callsHidden, \"nested call\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n\n const showOutput = failed || expanded;\n if (showOutput && output) {\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 6;\n const shown = lines.slice(0, limit);\n if (shown.length > 0) {\n if (expanded) text += nl + theme.fg(\"dim\", \"\u21A9 return\");\n text += nl + styleOutputLines(shown).join(nl);\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n }\n return trackRows(\n renderBoundedLines(\n text.split(nl),\n theme,\n codePreviewSettings.diffIntensity,\n agentWrapLineIndexes,\n ),\n );\n },\n async execute(toolCallId, params, signal, onUpdate, context) {\n await state.ensure(context);\n // prepareArguments joins code arrays / remaps `payloads`\n // and quotes unquoted OMP path arguments before OMP validates this call;\n // keep the same coercion here for direct internal invocations.\n const normalized = normalizeFabricExecParams(params);\n const joined = Array.isArray(normalized.code) ? normalized.code.join(\"\\n\") : normalized.code;\n const code = repairFabricGuestCode(joined);\n const runDisplay = normalizeRunDisplay(normalized.display);\n const payloads = resolveFabricExecPayloads(normalized);\n const result = await state.execution.execute({\n code,\n ...(payloads ? { payloads } : {}),\n signal,\n parentToolCallId: toolCallId,\n context,\n ...(normalized.tokenBudget !== undefined ? { tokenBudget: normalized.tokenBudget } : {}),\n ...(normalized.agentBudget !== undefined ? { maxAgentCalls: normalized.agentBudget } : {}),\n ...(normalized.timeoutMs !== undefined ? { requestedTimeoutMs: normalized.timeoutMs } : {}),\n ...(runDisplay\n ? {\n display: {\n ...(runDisplay.name !== undefined && { name: runDisplay.name }),\n ...(runDisplay.description !== undefined && { description: runDisplay.description }),\n },\n }\n : {}),\n onPartial(snapshot) {\n onUpdate?.({\n content: [{ type: \"text\", text: snapshot.progress ?? \"\" }],\n details: {\n progress: snapshot.progress,\n audits: snapshot.audits,\n phases: snapshot.phases,\n },\n });\n },\n });\n\n const selectedResultFormat =\n normalized.resultFormat ?? state.config.executor.resultFormat;\n const pendingHandoff = await state.claimHandoff(\n result,\n context.sessionManager.getSessionId(),\n selectedResultFormat,\n toolCallId,\n );\n if (pendingHandoff) {\n pendingHandoffs.set(toolCallId, pendingHandoff);\n context.ui.setStatus(\n \"fabric-prewalk\",\n `waiting for fabric_exec boundary \u2192 ${String(pendingHandoff.args.model ?? \"executor\")}`,\n );\n }\n const fullFormattedValue = formatFabricValue(result.value, selectedResultFormat);\n const failureProgress = formatFailureProgress(result.trace);\n const fullSections = [...result.logs];\n if (fullFormattedValue.text) fullSections.push(fullFormattedValue.text);\n if (result.error) fullSections.push(`Runtime error: ${result.error}`);\n if (failureProgress) fullSections.push(failureProgress);\n const fullRawOutput = fullSections.join(\"\\n\\n\");\n const outputBudget = modelOutputBudget(\n state.config.executor.maxOutputChars,\n result.success,\n );\n const outputWillTruncate = fullRawOutput.length > outputBudget;\n const formattedValue = outputWillTruncate\n ? formatFabricValue(\n result.value,\n selectedResultFormat,\n outputBudget,\n )\n : fullFormattedValue;\n const sections = [...result.logs];\n const logPrefix = result.logs.join(\"\\n\\n\");\n if (formattedValue.text) sections.push(formattedValue.text);\n if (result.error) sections.push(`Runtime error: ${result.error}`);\n if (failureProgress) sections.push(failureProgress);\n const rawOutput = sections.join(\"\\n\\n\");\n const outputFormat =\n formattedValue.language &&\n formattedValue.text &&\n (result.logs.length === 0 || !outputWillTruncate)\n ? formattedValue.language\n : undefined;\n const outputFormatStartLine = result.logs.length > 0\n ? countNewlines(logPrefix) + 2\n : 0;\n // Evaluated lazily at each return so the main path persists audits after\n // their in-memory image payloads are stripped below.\n const speculationSummary = fabricSpeculationSummary(state.registry.speculationStats());\n const persistedRenderDetails = () =>\n createFabricPersistedExecutionDetails({\n ...result,\n ...(speculationSummary ? { speculation: speculationSummary } : {}),\n ...(outputFormat ? { outputFormat, outputFormatStartLine } : {}),\n ...(outputFormat\n ? {\n outputFormatLines:\n formattedValue.highlightedLineCount\n ?? countNewlines(formattedValue.text) + 1,\n }\n : {}),\n });\n\n if (result.typeErrors) {\n const text = result.typeErrors\n .map((error) =>\n error.line > 0\n ? `Line ${error.line}:${error.column} \u2014 ${error.message}`\n : error.message,\n )\n .join(\"\\n\");\n const recoveryHint = typeErrorRecoveryHint(code, result.typeErrors);\n const bounded = await boundModelOutput(\n `Type errors; code was not executed:\\n${text}${\n recoveryHint ? `\\n\\n${recoveryHint}` : \"\"\n }`,\n outputBudget,\n );\n return {\n content: [{ type: \"text\", text: bounded.text }],\n details: persistedRenderDetails(),\n isError: true,\n };\n }\n\n const output = (await boundModelOutput(\n rawOutput || \"(no output)\",\n outputBudget,\n fullRawOutput || \"(no output)\",\n )).text;\n const terminate =\n pendingHandoff !== undefined ||\n (result.success &&\n typeof result.value === \"object\" &&\n result.value !== null &&\n \"terminate\" in result.value &&\n result.value.terminate === true);\n // A nested `omp.read` of an image returns image content blocks that\n // normalizeResult stripped (the sandbox holds text only). The provider\n // handed them out-of-band to each call audit; re-attach them here so\n // OMP core's ToolExecutionComponent renders a kitty image preview \u2014 the\n // same path a native `read` takes \u2014 for single-call AND multitool\n // reads. pi-vision-handoff keeps the image in the nested tool_result\n // (its `context` hook swaps image\u2192description on the LLM-bound\n // fabric_exec clone), so every read audit carries its image here.\n const mediaBlocks: FabricMediaBlock[] = [];\n for (const audit of result.audits) {\n if (audit.media) mediaBlocks.push(...audit.media);\n }\n const singleAudit = result.audits.length === 1 ? result.audits[0] : undefined;\n // The read tool's own text note (e.g. \"Read image file [image/png]\"),\n // captured after the handoff stripped OMP's non-vision note. Used as\n // the single-call body + content text so the preview shows the kitty\n // image + the clean note (like OMP core) instead of the handoff's\n // verbose description. Multitool renders each read's note as its own\n // call body, so the joined program return suffices as the content text\n // there.\n const mediaNote = singleAudit?.mediaNote;\n // The base64 payload now lives in the result content; discard the\n // duplicate in-memory audit copies before returning.\n for (const audit of result.audits) {\n delete audit.media;\n delete audit.mediaNote;\n }\n const content: Array<{ type: \"text\"; text: string } | FabricMediaBlock> = [];\n if (mediaBlocks.length > 0) {\n // Mirror a native `read`: keep the image block(s) for OMP core's kitty\n // render alongside the short note. The handoff's `context` hook\n // swaps each image for its description on the LLM-bound clone, so the\n // text-only model still receives the description while the terminal\n // shows the kitty image.\n const textOutput =\n singleAudit && mediaNote\n ? mediaNote\n : (output === \"(no output)\" ? \"\" : output);\n if (textOutput) content.push({ type: \"text\", text: textOutput });\n for (const block of mediaBlocks) content.push(block);\n if (singleAudit && mediaNote) {\n singleAudit.result = mediaNote;\n }\n } else {\n content.push({ type: \"text\", text: output });\n }\n return {\n content,\n details: persistedRenderDetails(),\n ...(result.usage ? { usage: result.usage } : {}),\n ...(terminate ? { terminate: true } : {}),\n ...(result.success ? {} : { isError: true }),\n };\n },\n }),\n {\n mode: codePreviewSettings.toolCallBackground,\n toolCallTiming: codePreviewSettings.toolCallTiming,\n },\n);\n", "import type { FabricSpeculationSummaryV1 } from \"../audit/details.js\";\nimport type { FabricSpeculationStats } from \"./types.js\";\n\nexport const fabricSpeculationSummary = (\n stats: FabricSpeculationStats | undefined,\n): FabricSpeculationSummaryV1 | undefined => {\n if (!stats) return undefined;\n const summary: FabricSpeculationSummaryV1 = {\n launched: stats.launched,\n hit: stats.served,\n missed:\n stats.absent + stats.epochInvalidated + stats.freshnessInvalidated + stats.failed,\n discarded: stats.wasted + stats.skipped,\n };\n return summary.launched === 0 && summary.missed === 0 ? undefined : summary;\n};\n", "import type { FabricExecutionTraceV1 } from \"./audit/trace.js\";\n\nconst MAX_COMPLETED_CALLS = 8;\nconst MAX_PATH_CHARS = 100;\n\nconst compactPath = (value: string): string => {\n const singleLine = value.replaceAll(/\\s+/g, \" \").trim();\n if (singleLine.length <= MAX_PATH_CHARS) return singleLine;\n return `\u2026${singleLine.slice(-(MAX_PATH_CHARS - 1))}`;\n};\n\nexport const formatFailureProgress = (\n trace: FabricExecutionTraceV1,\n): string | undefined => {\n if (trace.outcome === \"succeeded\") return undefined;\n const completed = trace.operations.filter(\n (operation) => operation.outcome === \"succeeded\",\n );\n if (completed.length === 0) return undefined;\n const summaries = completed.slice(0, MAX_COMPLETED_CALLS).map((operation) => {\n const path = operation.args.path;\n return typeof path === \"string\"\n ? `${operation.ref}(${compactPath(path)})`\n : operation.ref;\n });\n const omitted = completed.length - summaries.length;\n return [\n `Completed before the outer failure (outputs not returned): ${summaries.join(\"; \")}${\n omitted > 0 ? `; +${omitted} more` : \"\"\n }.`,\n \"Successful calls may already have changed the workspace; inspect before repeating mutations.\",\n ].join(\"\\n\");\n};\n", "import { normalizeRunDisplay } from \"./run-display.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\n\nconst OPTIONAL_FABRIC_EXEC_KEYS = [\n \"payloads\",\n \"resultFormat\",\n \"tokenBudget\",\n \"agentBudget\",\n \"timeoutMs\",\n \"display\",\n] as const;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parsePayloads = (input: unknown): Record<string, string> | undefined => {\n let value = input;\n for (let attempt = 0; attempt < 2 && typeof value === \"string\"; attempt++) {\n try {\n value = JSON.parse(value);\n } catch {\n return undefined;\n }\n }\n if (!isRecord(value) || Object.values(value).some((entry) => typeof entry !== \"string\")) return undefined;\n return value as Record<string, string>;\n};\n\nexport const resolveFabricExecPayloads = (params: { payloads?: unknown }): Record<string, string> | undefined =>\n parsePayloads(params.payloads);\n\nexport const prepareFabricExecArguments = (input: unknown): unknown => {\n if (typeof input === \"string\") return { code: repairFabricGuestCode(input) };\n if (!isRecord(input)) return input;\n let prepared = input;\n const writable = (): Record<string, unknown> => {\n if (prepared === input) prepared = { ...input };\n return prepared;\n };\n if (Array.isArray(prepared.code) && prepared.code.every((line) => typeof line === \"string\")) {\n writable().code = prepared.code.join(\"\\n\");\n }\n if (typeof prepared.code === \"string\") {\n const repaired = repairFabricGuestCode(prepared.code);\n if (repaired !== prepared.code) writable().code = repaired;\n }\n for (const key of OPTIONAL_FABRIC_EXEC_KEYS) {\n if (Object.hasOwn(prepared, key) && (prepared[key] === null || prepared[key] === undefined)) {\n delete writable()[key];\n }\n }\n if (typeof prepared.display === \"string\" || isRecord(prepared.display)) {\n const normalized = normalizeRunDisplay(prepared.display);\n if (normalized) writable().display = normalized;\n else delete writable().display;\n }\n if (Object.hasOwn(prepared, \"payloads\")) {\n const normalized = parsePayloads(prepared.payloads);\n if (normalized && prepared.payloads !== normalized) writable().payloads = normalized;\n }\n return prepared;\n};\n", "import {\n GUEST_TYPE_DECLARATIONS,\n OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES,\n} from \"./guest-types.js\";\n\n// Core tool names come from the compatibility-argument table so a new guest\n// tool extends the registry (and the recovery hints) without edits here.\ntype CoreToolName = keyof typeof OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES;\n\nexport const CORE_TOOL_NAMES: readonly CoreToolName[] = Object.keys(\n OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES,\n) as CoreToolName[];\n\n// The guest declarations are a template-literal string, so the option bags are\n// extracted textually. Type aliases are matched with a bracket-depth scan (not\n// `[^;]`) because union members like `{ edits: OmpEditOperation[]; all?: boolean }`\n// contain interior semicolons.\nconst extractTypeDeclarations = (declarations: string): Map<string, string> => {\n const parsed = new Map<string, string>();\n for (const match of declarations.matchAll(/\\btype\\s+(\\w+)\\s*=/g)) {\n const name = match[1];\n if (name === undefined) continue;\n const rhsStart = match.index + match[0].length;\n let depth = 0;\n let end = rhsStart;\n while (end < declarations.length) {\n const character = declarations[end];\n if (character === \"(\" || character === \"{\" || character === \"[\") depth += 1;\n else if (character === \")\" || character === \"}\" || character === \"]\") depth -= 1;\n else if (character === \";\" && depth === 0) break;\n end += 1;\n }\n parsed.set(name, declarations.slice(rhsStart, end));\n }\n return parsed;\n};\n\nconst matchCaptures = (text: string, pattern: RegExp): string[] =>\n [...text.matchAll(pattern)].flatMap((match) =>\n match[1] === undefined ? [] : [match[1]],\n );\n\nconst objectLiteralKeys = (rhs: string): string[] => {\n const withoutMappedKeys = rhs.replace(/\\[\\s*\\w+\\s+in\\s+keyof\\s+\\w+\\s*\\]\\s*:/g, \" \");\n return matchCaptures(withoutMappedKeys, /([A-Za-z_]\\w*)\\s*\\??:/g);\n};\n\nconst referencedTypeNames = (rhs: string): string[] =>\n matchCaptures(rhs, /\\b(Omp[A-Z]\\w*)/g);\n\nconst capitalise = (tool: string): string =>\n tool.charAt(0).toUpperCase() + tool.slice(1);\n\n// Property name -> every core tool whose argument or options bag accepts it.\n// Walking starts from each tool's argument/compatibility/options aliases and\n// follows OMP* references (shared bags, edit operations) transitively.\nconst collectCoreToolProperties = (declarations: string): Map<string, CoreToolName[]> => {\n const typeDeclarations = extractTypeDeclarations(declarations);\n const owners = new Map<string, Set<CoreToolName>>();\n for (const tool of CORE_TOOL_NAMES) {\n const roots = [\n `Omp${capitalise(tool)}Argument`,\n OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES[tool],\n `Omp${capitalise(tool)}Options`,\n ];\n const visited = new Set<string>();\n const walk = (name: string): void => {\n if (visited.has(name)) return;\n visited.add(name);\n const rhs = typeDeclarations.get(name);\n if (rhs === undefined) return;\n for (const property of objectLiteralKeys(rhs)) {\n const toolSet = owners.get(property) ?? new Set<CoreToolName>();\n toolSet.add(tool);\n owners.set(property, toolSet);\n }\n for (const reference of referencedTypeNames(rhs)) walk(reference);\n };\n for (const root of roots) walk(root);\n }\n return new Map([...owners].map(([property, toolSet]) => [property, [...toolSet]]));\n};\n\nexport const CORE_TOOL_PROPERTIES: ReadonlyMap<string, readonly CoreToolName[]> =\n collectCoreToolProperties(GUEST_TYPE_DECLARATIONS);\n", "import type { FabricTypeError } from \"./runtime/type-checker.js\";\nimport {\n CORE_TOOL_NAMES,\n CORE_TOOL_PROPERTIES,\n} from \"./runtime/core-tool-properties.js\";\n\nconst SYNTAX_ERROR_PATTERN = /expected|unterminated|unexpected|invalid character/i;\nconst PAYLOAD_CALL_PATTERN = /\\bomp\\.(?:edit|write)\\s*\\(/;\nconst UNQUOTED_PATH_HEAD =\n /\\bomp\\.(?:read|ls|write|edit)\\(\\s*(?:https?:\\/\\/|\\/(?![/*])|\\.\\/|\\.\\.\\/|~\\/|[A-Za-z]:[\\\\/])/;\nconst PROMISE_ALL_PATTERN = /\\bPromise\\.all\\s*\\(/;\nconst TUPLE_ARITY_PATTERN = /Tuple type .* of length '[0-9]+' has no element at index '[0-9]+'/;\nconst MISSING_NAME_PATTERN = /^Cannot find name '([^']+)'/;\nconst UNKNOWN_PROPERTY_PATTERN = /'([^']+)' does not exist in type '([^']+)'/;\nconst OMP_CALL_PATTERN = /\\bomp\\.(\\w+)\\s*\\(/g;\n\nconst FABRIC_EXEC_ARGUMENT_NOTES: Readonly<Record<string, string>> = {\n payloads:\n \"Named values belong in the outer `fabric_exec` arguments, then become available inside code as payloads.key.\",\n strings:\n \"Named values belong in the outer `fabric_exec` arguments and become available inside code as omp.key (for example, strings.task becomes omp.task).\",\n tokenBudget:\n \"Budget arguments (`tokenBudget`, `agentBudget`) belong to the outer `fabric_exec` call, not inside code.\",\n agentBudget:\n \"Budget arguments (`tokenBudget`, `agentBudget`) belong to the outer `fabric_exec` call, not inside code.\",\n display: \"The `display` objective belongs to the outer `fabric_exec` call, not inside code.\",\n resultFormat: \"`resultFormat` belongs to the outer `fabric_exec` call, not inside code.\",\n};\n\nconst PROPERTY_NOTES: Readonly<Record<string, string>> = {\n settle:\n \"`settle:true` settles nonzero shell exits into an `ok:false` envelope instead of rejecting; other `omp.*` calls reject failures normally.\",\n timeout: \"`timeout` is measured in seconds; `timeoutMs` is converted from milliseconds.\",\n};\n\n// Shell options that stay unsupported (cwd is honored per call since #71).\nconst SHELL_OPTION_NOTES: Readonly<Record<string, string>> = {\n stdin:\n \"OMP shell tools do not accept `stdin`. Write the content with `omp.write(path, content)`, then pass that path to the command or redirect the file into it.\",\n};\n\nconst isCoreToolName = (name: string): name is (typeof CORE_TOOL_NAMES)[number] =>\n (CORE_TOOL_NAMES as readonly string[]).includes(name);\n\n// The 2353 message names the checked type (e.g. 'OmpCommandArgument &\n// OmpBashOptions'); strip alias suffixes to recover the called tool.\nconst toolFromTypeText = (typeText: string): string | undefined => {\n for (const match of typeText.matchAll(/\\bOmp([A-Z]\\w*)/g)) {\n const captured = match[1];\n if (captured === undefined) continue;\n const candidate = captured\n .replace(/(?:Compatibility)?(?:Argument|Options)$/, \"\")\n .toLowerCase();\n if (isCoreToolName(candidate)) return candidate;\n }\n return undefined;\n};\n\n// Fallback for messages naming only shared bags (e.g. 'OmpPathArgument'): find\n// the `omp.<tool>(` call enclosing the error position. Type-checker lines are\n// 1-based and preceded by the guest wrapper, so try both offsets.\nconst enclosingCoreTool = (code: string, error: FabricTypeError): string | undefined => {\n const lines = code.split(\"\\n\");\n for (const lineIndex of [error.line - 2, error.line - 1]) {\n if (lineIndex < 0 || lineIndex >= lines.length) continue;\n const offset =\n lines.slice(0, lineIndex).join(\"\\n\").length +\n (lineIndex > 0 ? 1 : 0) +\n Math.max(0, error.column - 1);\n OMP_CALL_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n let tool: string | undefined;\n while ((match = OMP_CALL_PATTERN.exec(code)) !== null && match.index < offset) {\n const called = match[1];\n if (called !== undefined && isCoreToolName(called)) tool = called;\n }\n if (tool !== undefined) return tool;\n }\n return undefined;\n};\n\nconst unknownPropertyHint = (\n property: string,\n tool: string | undefined,\n): string | undefined => {\n if (tool === undefined) return undefined;\n if (tool === \"bash\") {\n const shellNote = SHELL_OPTION_NOTES[property];\n if (shellNote !== undefined) return `Recovery hint: ${shellNote}`;\n }\n const envelopeNote = FABRIC_EXEC_ARGUMENT_NOTES[property];\n if (envelopeNote !== undefined) {\n return `Recovery hint: \\`${property}\\` is a \\`fabric_exec\\` argument, not a \\`omp.${tool}\\` property. ${envelopeNote}`;\n }\n const ownerTools = CORE_TOOL_PROPERTIES.get(property);\n if (ownerTools === undefined || ownerTools.includes(tool as never)) return undefined;\n const owners = ownerTools.map((owner) => `\\`omp.${owner}\\``).join(\", \");\n const note = PROPERTY_NOTES[property];\n return `Recovery hint: \\`${property}\\` is not a \\`omp.${tool}\\` property \\u2014 it belongs to ${owners}.${note ? ` ${note}` : \"\"}`;\n};\n\nconst hasLiteralPayloadInterpolation = (\n code: string,\n errors: FabricTypeError[],\n): boolean => {\n if (!PAYLOAD_CALL_PATTERN.test(code)) return false;\n return errors.some((error) => {\n const name = MISSING_NAME_PATTERN.exec(error.message)?.[1];\n return name !== undefined && code.includes(`\\${${name}}`);\n });\n};\n\nexport const typeErrorRecoveryHint = (\n code: string,\n errors: FabricTypeError[],\n): string | undefined => {\n for (const error of errors) {\n const property = UNKNOWN_PROPERTY_PATTERN.exec(error.message)?.[1];\n const typeText = UNKNOWN_PROPERTY_PATTERN.exec(error.message)?.[2];\n if (property !== undefined && typeText !== undefined) {\n const tool = toolFromTypeText(typeText) ?? enclosingCoreTool(code, error);\n const hint = unknownPropertyHint(property, tool);\n if (hint) return hint;\n }\n }\n if (\n PROMISE_ALL_PATTERN.test(code)\n && errors.some((error) => TUPLE_ARITY_PATTERN.test(error.message))\n ) {\n return \"Recovery hint: match `Promise.all` destructuring one binding per promise; remove the extra binding or add the missing call.\";\n }\n if (hasLiteralPayloadInterpolation(code, errors)) {\n return \"Recovery hint: a `${...}` expression in an edit/write payload is being evaluated by the Fabric TypeScript program. Declare it if intentional; for literal file content, move the payload to top-level `payloads` and reference `payloads.key`.\";\n }\n if (\n UNQUOTED_PATH_HEAD.test(code)\n && errors.some((error) =>\n SYNTAX_ERROR_PATTERN.test(error.message)\n || error.message.includes(\"Cannot find name\")\n || error.message.includes(\"Expected 1-2 arguments\")\n )\n ) {\n return \"Recovery hint: quote filesystem paths and URLs as strings, e.g. `omp.read('/x')` or `omp.read({ path: '/x' })`. Unquoted paths are parsed as regex, division, or extra arguments.\";\n }\n if (!PAYLOAD_CALL_PATTERN.test(code)) return undefined;\n if (!errors.some((error) => SYNTAX_ERROR_PATTERN.test(error.message))) {\n return undefined;\n }\n return \"Recovery hint: if embedded edit/write payload text caused the syntax error, pass it through top-level `payloads` and reference `payloads.key` instead of escaping it inside `code`.\";\n};\n", "import { truncateToWidth, type Component } from \"@oh-my-pi/pi-tui\";\n\ninterface MeasuredPartialResult {\n component: Component;\n width: number;\n rows: number;\n}\n\nexport interface ResultRowBalance {\n partial?: MeasuredPartialResult;\n final?: Component;\n finalized?: boolean;\n}\n\nexport type LimitRenderer = (limit: number, width: number) => string[];\n\nexport class HiddenRowBorrowingComponent implements Component {\n #cachedWidth: number | undefined;\n #cachedDeficit: number | undefined;\n #cachedRows: string[] | undefined;\n\n constructor(\n private readonly baseLimit: number,\n private readonly maxLimit: number,\n private readonly renderLimit: LimitRenderer,\n private readonly balance: ResultRowBalance,\n ) {}\n\n render(width: number): readonly string[] {\n const deficit = resultRowDeficit(this.balance, width);\n if (\n this.#cachedWidth === width &&\n this.#cachedDeficit === deficit &&\n this.#cachedRows\n ) {\n return this.#cachedRows;\n }\n\n const base = this.renderLimit(this.baseLimit, width);\n let best = base;\n if (deficit > 0 && this.maxLimit > this.baseLimit) {\n let bestGrowth = 0;\n for (let limit = this.baseLimit + 1; limit <= this.maxLimit; limit++) {\n const candidate = this.renderLimit(limit, width);\n const growth = candidate.length - base.length;\n if (growth > deficit) break;\n if (growth >= bestGrowth) {\n best = candidate;\n bestGrowth = growth;\n }\n }\n }\n // Upstream components (OMP's Text wrap) can overproduce at tiny widths;\n // never emit a row wider than the requested width (issue #84).\n this.#cachedWidth = width;\n this.#cachedDeficit = deficit;\n this.#cachedRows = best.map((row) => truncateToWidth(row, Math.max(1, width)));\n return this.#cachedRows;\n }\n\n invalidate(): void {\n this.#cachedWidth = undefined;\n this.#cachedDeficit = undefined;\n this.#cachedRows = undefined;\n }\n}\n\nexport const observeResultRows = (\n component: Component,\n balance: ResultRowBalance,\n options: { expanded: boolean; isPartial: boolean },\n): Component => {\n if (options.isPartial) {\n balance.finalized = false;\n delete balance.final;\n return options.expanded ? component : new PartialResultObserver(component, balance);\n }\n\n balance.finalized = true;\n if (options.expanded) delete balance.final;\n else balance.final = component;\n return component;\n};\n\nexport const resultRowDeficit = (\n balance: ResultRowBalance,\n width: number,\n): number => {\n if (!balance.finalized || !balance.partial || !balance.final) return 0;\n const partialRows = balance.partial.width === width\n ? balance.partial.rows\n : balance.partial.component.render(width).length;\n const finalRows = balance.final.render(width).length;\n return Math.max(0, partialRows - finalRows);\n};\n\nclass PartialResultObserver implements Component {\n constructor(\n private readonly component: Component,\n private readonly balance: ResultRowBalance,\n ) {}\n\n render(width: number): readonly string[] {\n const lines = this.component.render(width);\n const previous = this.balance.partial;\n if (\n !previous ||\n previous.width !== width ||\n lines.length >= previous.rows\n ) {\n this.balance.partial = {\n component: this.component,\n width,\n rows: lines.length,\n };\n }\n return lines;\n }\n\n invalidate(): void {\n this.component.invalidate?.();\n }\n}\n", "import { mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { truncateMiddle } from \"./util.js\";\n\nexport const MAX_FAILURE_MODEL_OUTPUT_CHARS = 20_000;\n\nexport const modelOutputBudget = (\n configuredMaxChars: number,\n success: boolean,\n): number => success\n ? configuredMaxChars\n : Math.min(configuredMaxChars, MAX_FAILURE_MODEL_OUTPUT_CHARS);\n\nexport interface BoundedModelOutput {\n text: string;\n artifactPath?: string;\n originalChars: number;\n omittedChars: number;\n}\n\ntype ArtifactWriter = (content: string) => Promise<string>;\n\nconst writeOutputArtifact: ArtifactWriter = async (content) => {\n const directory = await mkdtemp(path.join(tmpdir(), \"omp-fabric-output-\"));\n const artifactPath = path.join(directory, \"output.txt\");\n await writeFile(artifactPath, content, { encoding: \"utf8\", mode: 0o600 });\n return artifactPath;\n};\n\nexport const boundModelOutput = async (\n visible: string,\n maxChars: number,\n fullOutput = visible,\n writeArtifact: ArtifactWriter = writeOutputArtifact,\n): Promise<BoundedModelOutput> => {\n if (visible.length <= maxChars && fullOutput.length <= maxChars) {\n return { text: visible, originalChars: fullOutput.length, omittedChars: 0 };\n }\n\n let artifactPath: string | undefined;\n try {\n artifactPath = await writeArtifact(fullOutput);\n } catch {\n artifactPath = undefined;\n }\n const suffix = artifactPath\n ? `\\n\\n[Full output (${fullOutput.length} chars) saved to: ${artifactPath}]`\n : \"\";\n const bodyBudget = Math.max(1, maxChars - suffix.length);\n const text = `${truncateMiddle(visible, bodyBudget)}${suffix}`;\n return {\n text: text.length <= maxChars ? text : truncateMiddle(text, maxChars),\n ...(artifactPath ? { artifactPath } : {}),\n originalChars: fullOutput.length,\n omittedChars: Math.max(0, fullOutput.length - Math.min(fullOutput.length, bodyBudget)),\n };\n};\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { resolveAgentDir } from \"./core/agent-dir.js\";\nimport type { ExtensionAPI } from \"@oh-my-pi/pi-coding-agent\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { FabricActivityStore } from \"./activity/store.js\";\nimport { CapturedToolCatalog } from \"./capture/catalog.js\";\nimport {\n FABRIC_COMPONENT_PROVIDER_NAMES,\n FABRIC_PROVIDER_COMPONENT_PREFIX,\n} from \"./components/provider-component.js\";\nimport type { FabricOwnedModelGuidance } from \"./components/model-guidance.js\";\nimport type { FabricComponentGraph } from \"./components/types.js\";\nimport {\n loadFabricConfig,\n loadFabricConfigForScope,\n type FabricConfig,\n type FabricResultFormat,\n type FabricSchemaMode,\n} from \"./config.js\";\nimport { FabricSessionApprovals } from \"./core/approval-controller.js\";\nimport { PrewalkController } from \"./prewalk/controller.js\";\nimport { PrewalkDriftTracker } from \"./prewalk/fs-drift.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport type { AgentToolResultMessage } from \"./agents/types.js\";\nimport type { FabricExecutionResult } from \"./execution-service.js\";\nimport type {\n FabricParticipantInfo,\n FabricParticipantListOptions,\n FabricPeerInfo,\n} from \"./topology/types.js\";\nimport {\n resolveFabricIdentity,\n type FabricAgentMessageDelivery,\n type FabricAgentMessageResult,\n type FabricMainAgentInfo,\n} from \"./main-agent.js\";\nimport type { FabricActorHostEvent } from \"./actors/types.js\";\nimport type { FabricLifecycleEventType } from \"./lifecycle/types.js\";\nimport type {\n FabricActionDescriptor,\n FabricComponentDefinition,\n FabricProvider,\n} from \"./protocol.js\";\nimport type { FabricRuntimeState, FabricRuntimeStateOptions } from \"./fabric-runtime-state.js\";\nimport type { FabricRuntimePaths } from \"./runtime-paths.js\";\n\nexport interface FabricStateOptions {\n paths?: FabricRuntimePaths;\n runtimeLoader?: () => Promise<typeof import(\"./fabric-runtime-state.js\")>;\n lcmContext?: FabricRuntimeStateOptions[\"lcmContext\"];\n}\n\ntype ActivationHook = (context: ExtensionContext) => void | Promise<void>;\ntype ActivationFailureHook = () => void | Promise<void>;\n\nexport class FabricState {\n #runtime: FabricRuntimeState | undefined;\n #activatingRuntime: FabricRuntimeState | undefined;\n #activation: Promise<FabricRuntimeState> | undefined;\n #activationGeneration: number | undefined;\n #config: FabricConfig | undefined;\n #cwd: string | undefined;\n #generation = 0;\n #everActivated = false;\n #activationHook: ActivationHook | undefined;\n #activationFailureHook: ActivationFailureHook | undefined;\n readonly #externalProviders = new Map<string, FabricProvider>();\n readonly #externalComponents = new Map<string, FabricComponentDefinition>();\n readonly #options: FabricStateOptions;\n readonly activity = new FabricActivityStore();\n readonly prewalk = new PrewalkController();\n readonly prewalkDrift = new PrewalkDriftTracker();\n readonly sessionApprovals = new FabricSessionApprovals();\n #widgetDismissedAt = 0;\n\n constructor(\n readonly omp: ExtensionAPI,\n readonly capturedTools: CapturedToolCatalog,\n options: FabricStateOptions = {},\n ) {\n this.#options = options;\n }\n\n get initialized(): boolean {\n return this.#current()?.initialized === true;\n }\n\n // Lightweight bootstrap seam: true once configuration is loaded, with no\n // dependency on the heavyweight runtime. Rendering reads this instead of\n // initialized so a resumed session honors bootstrapped presentation\n // preferences while the runtime is intentionally inactive.\n get bootstrapped(): boolean {\n return this.#config !== undefined;\n }\n\n get activated(): boolean {\n return this.#everActivated;\n }\n\n get config(): FabricConfig {\n if (!this.#config) throw new Error(\"OMP Fabric has not bootstrapped\");\n return this.#config;\n }\n\n get cwd(): string | undefined {\n return this.#cwd;\n }\n\n get widgetDismissedAt(): number {\n return this.#current()?.widgetDismissedAt ?? this.#widgetDismissedAt;\n }\n\n set widgetDismissedAt(value: number) {\n this.#widgetDismissedAt = value;\n const runtime = this.#current();\n if (runtime) runtime.widgetDismissedAt = value;\n }\n\n get registry(): FabricRuntimeState[\"registry\"] { return this.#required().registry; }\n get execution(): FabricRuntimeState[\"execution\"] { return this.#required().execution; }\n\n /** Speculative-PTC stream tap; undefined pre-init or when speculation is disabled. */\n get speculationTap(): FabricRuntimeState[\"speculationTap\"] { return this.#runtime?.speculationTap; }\n\n /** Turn-boundary backstop for the speculation store; safe before initialization. */\n resetSpeculation(): void { this.#runtime?.resetSpeculation(); }\n get agents(): FabricRuntimeState[\"agents\"] { return this.#required().agents; }\n get actors(): FabricRuntimeState[\"actors\"] { return this.#required().actors; }\n get globalActors(): FabricRuntimeState[\"globalActors\"] { return this.#required().globalActors; }\n get mesh(): FabricRuntimeState[\"mesh\"] { return this.#required().mesh; }\n get compact(): FabricRuntimeState[\"compact\"] { return this.#required().compact; }\n get repairs(): FabricRuntimeState[\"repairs\"] { return this.#required().repairs; }\n get components(): FabricRuntimeState[\"components\"] { return this.#required().components; }\n\n setActivationHook(hook: ActivationHook, onFailure?: ActivationFailureHook): void {\n this.#activationHook = hook;\n this.#activationFailureHook = onFailure;\n }\n\n async bootstrap(context: ExtensionContext): Promise<void> {\n const generation = ++this.#generation;\n this.#cwd = context.cwd;\n // A failed config load must not leak the previous session's configuration\n // into this one: clear before the read so bootstrapped stays false and\n // presentation falls back to the safe default until a load succeeds.\n this.#config = undefined;\n const config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#config = config;\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n this.activity.reset();\n this.sessionApprovals.approvedRisks.clear();\n this.#widgetDismissedAt = 0;\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n\n const pending = this.#activation;\n if (pending) await pending.catch(() => undefined);\n if (generation !== this.#generation) return;\n if (this.#everActivated) await this.#activate(context, true);\n }\n\n async initialize(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) {\n await this.bootstrap(context);\n } else {\n this.#config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n }\n await this.#activate(context, true);\n }\n\n async ensure(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) await this.bootstrap(context);\n await this.#activate(context, false);\n }\n\n shouldEagerlyActivate(context: ExtensionContext): boolean {\n if (\n process.env.OMP_FABRIC_CAPABILITY_REQUIREMENTS !== undefined &&\n Boolean(process.env.OMP_FABRIC_CAPABILITY_DIGEST)\n ) return true;\n if (this.config.prewalk.alwaysRearm) return true;\n if (this.config.components.some((component) => component.disabled !== true)) return true;\n if (!context.isProjectTrusted() || !this.config.mesh.enabled || this.config.schema.mode === \"enforce\") {\n return false;\n }\n const sessionId = context.sessionManager.getSessionId();\n if (resolveFabricIdentity(sessionId).identity.kind !== \"main\") return false;\n const projectRoot = process.env.OMP_FABRIC_PROJECT_ROOT ?? context.cwd;\n const meshRoot = process.env.OMP_FABRIC_MESH_ROOT ??\n (this.config.mesh.root\n ? path.resolve(projectRoot, this.config.mesh.root)\n : path.join(projectRoot, \".omp\", \"fabric\", \"mesh\"));\n const fabricSessionId = process.env.OMP_FABRIC_SESSION_ID?.trim() || sessionId;\n const actorRoots = [\n path.join(meshRoot, \"actors\"),\n path.join(meshRoot, \"actors\", fabricSessionId),\n ];\n return actorRoots.some((actorRoot) => {\n try {\n const registry = JSON.parse(fs.readFileSync(path.join(actorRoot, \"actors.json\"), \"utf8\")) as unknown;\n if (typeof registry !== \"object\" || registry === null || Array.isArray(registry)) return false;\n const actors = (registry as { actors?: unknown }).actors;\n return Array.isArray(actors) && actors.some((value) => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const actor = value as Record<string, unknown>;\n return typeof actor.id === \"string\" && /^[a-f0-9]{32}$/.test(actor.id) &&\n typeof actor.name === \"string\" && /^[a-zA-Z0-9][a-zA-Z0-9 _.-]{0,59}$/.test(actor.name) &&\n typeof actor.instructions === \"string\" &&\n Buffer.byteLength(actor.instructions, \"utf8\") <= this.config.mesh.maxEventBytes &&\n typeof actor.createdAt === \"number\" && Number.isFinite(actor.createdAt);\n });\n } catch {\n return false;\n }\n });\n }\n\n mainAgentInfo(context?: ExtensionContext): FabricMainAgentInfo { return this.#required().mainAgentInfo(context); }\n peerInfos(): FabricPeerInfo[] { return this.#current()?.peerInfos() ?? []; }\n componentGraph(): FabricComponentGraph {\n return this.#current()?.componentGraph() ?? { components: [], edges: [], cycles: [] };\n }\n modelGuidance(): FabricOwnedModelGuidance[] { return this.#current()?.modelGuidance() ?? []; }\n participantInfos(options: FabricParticipantListOptions = {}): FabricParticipantInfo[] {\n return this.#current()?.participantInfos(options) ?? [];\n }\n queueUserMessage(targetId: string, message: string, delivery: FabricAgentMessageDelivery): Promise<FabricAgentMessageResult> {\n return this.#required().queueUserMessage(targetId, message, delivery);\n }\n stopParticipant(targetId: string): Promise<unknown> { return this.#required().stopParticipant(targetId); }\n claimHandoff(execution: FabricExecutionResult, sessionId: string, resultFormat: FabricResultFormat, outerToolCallId: string): Promise<PendingFabricHandoff | undefined> {\n return this.#required().claimHandoff(execution, sessionId, resultFormat, outerToolCallId);\n }\n runHandoffAtBoundary(pending: PendingFabricHandoff, result: AgentToolResultMessage, context: ExtensionContext): Promise<Record<string, unknown>> {\n return this.#required().runHandoffAtBoundary(pending, result, context);\n }\n noteMainActivity(context: ExtensionContext): void { this.#current()?.noteMainActivity(context); }\n dispatchHostEvent(event: FabricActorHostEvent, payload: unknown, context: ExtensionContext): number {\n return this.#current()?.dispatchHostEvent(event, payload, context) ?? 0;\n }\n publishHostLifecycle(event: FabricLifecycleEventType, payload: unknown): Promise<void> {\n return this.#current()?.publishHostLifecycle(event, payload) ?? Promise.resolve();\n }\n\n registerExternal(provider: FabricProvider, options: { overwrite?: boolean } = {}): void {\n if (\n provider.name === \"fabric\" ||\n provider.name === \"components\" ||\n FABRIC_COMPONENT_PROVIDER_NAMES.some((name) => name === provider.name)\n ) {\n throw new Error(`Reserved Fabric provider name: ${provider.name}`);\n }\n if (this.#externalProviders.has(provider.name) && !options.overwrite) {\n throw new Error(`Fabric provider already registered: ${provider.name}`);\n }\n this.#externalProviders.set(provider.name, provider);\n this.#current()?.registerExternal(provider, options);\n }\n\n registerExternalComponent(\n component: FabricComponentDefinition,\n options: { overwrite?: boolean } = {},\n ): void {\n if (component.name.startsWith(FABRIC_PROVIDER_COMPONENT_PREFIX)) {\n throw new Error(`Reserved Fabric component name: ${component.name}`);\n }\n if (this.#externalComponents.has(component.name) && !options.overwrite) {\n throw new Error(`Fabric component already registered: ${component.name}`);\n }\n this.#externalComponents.set(component.name, component);\n this.#current()?.registerExternalComponent(component, options);\n }\n\n reloadConfig(context: ExtensionContext): void {\n const next = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n if (this.#config) {\n next.schema.mode = this.#config.schema.mode;\n // Keep the enforce \u21D2 QuickJS coupling alive across reloads; a disk\n // runtime value must never combine with a live enforce override.\n if (next.schema.mode === \"enforce\") next.executor.runtime = this.#config.executor.runtime;\n }\n this.#config = next;\n this.#runtime?.reloadConfig(context, next);\n }\n\n // Ephemeral, session-only schema mode: mutates the live config (guidance,\n // resolved-action gate, and executor runtime all read it per call) without\n // touching fabric.json, so the next session starts from the configured mode.\n // reloadConfig preserves the override like the startup mode does.\n setSchemaMode(context: ExtensionContext, mode: FabricSchemaMode): void {\n if (!this.#config) throw new Error(\"Fabric is not initialized\");\n const previous = this.#config.schema.mode;\n if (mode === \"enforce\" && previous !== \"enforce\" && !this.#config.fullCodeMode) {\n throw new Error(\n \"Schema enforce requires full code mode; enable fullCodeMode or start a session with schema.mode=enforce\",\n );\n }\n this.#config.schema.mode = mode;\n if (mode === \"enforce\") {\n // Mirror normalizeFabricConfig: the sandbox gate is void when guest code\n // has a process escape hatch, so enforce always runs on QuickJS.\n this.#config.executor.runtime = \"quickjs\";\n } else if (previous === \"enforce\") {\n this.#config.executor.runtime = this.#diskConfig(context).executor.runtime;\n }\n this.#runtime?.setSchemaMode(mode, this.#config.executor.runtime);\n }\n\n schemaStatus(context: ExtensionContext): {\n mode: FabricSchemaMode;\n source: \"config\" | \"session override\";\n executorRuntime: string;\n } {\n const disk = this.#diskConfig(context);\n const mode = this.#config?.schema.mode ?? disk.schema.mode;\n return {\n mode,\n source: this.#config && this.#config.schema.mode !== disk.schema.mode\n ? \"session override\"\n : \"config\",\n executorRuntime: this.#config?.executor.runtime ?? disk.executor.runtime,\n };\n }\n\n #diskConfig(context: ExtensionContext): FabricConfig {\n const projectTrusted = context.isProjectTrusted();\n return loadFabricConfigForScope(\n { cwd: context.cwd, agentDir: resolveAgentDir(), projectTrusted },\n projectTrusted ? \"project\" : \"global\",\n );\n }\n\n async shutdown(): Promise<void> {\n const generation = ++this.#generation;\n const activation = this.#activation;\n if (activation) await activation.catch(() => undefined);\n if (generation !== this.#generation) return;\n\n const runtime = this.#runtime;\n this.#runtime = undefined;\n try {\n await runtime?.shutdown();\n } finally {\n if (generation === this.#generation) {\n this.#config = undefined;\n this.#cwd = undefined;\n this.#externalProviders.clear();\n this.#externalComponents.clear();\n this.#everActivated = false;\n this.activity.reset();\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n }\n }\n }\n\n async #activate(context: ExtensionContext, reinitialize: boolean): Promise<FabricRuntimeState> {\n if (this.#activation) {\n if (this.#activationGeneration === this.#generation) return this.#activation;\n await this.#activation.catch(() => undefined);\n return this.#activate(context, reinitialize);\n }\n if (this.#runtime?.initialized && !reinitialize) return this.#runtime;\n\n const generation = this.#generation;\n const config = this.config;\n const existing = this.#runtime;\n const reusable = existing?.initialized ? existing : undefined;\n const orphan = existing && !existing.initialized ? existing : undefined;\n this.#runtime = undefined;\n let candidate: FabricRuntimeState | undefined;\n const assertCurrent = (): void => {\n if (generation !== this.#generation) {\n throw new Error(\"OMP Fabric activation was superseded by a session change\");\n }\n };\n const activation = (async () => {\n try {\n await orphan?.shutdown().catch(() => undefined);\n assertCurrent();\n candidate = reusable ?? await this.#createRuntime();\n if (!reusable) {\n for (const component of this.#externalComponents.values()) {\n candidate.registerExternalComponent(component, { overwrite: true });\n }\n }\n await candidate.initialize(context, config);\n assertCurrent();\n for (const provider of this.#externalProviders.values()) {\n candidate.registerExternal(provider, { overwrite: true });\n }\n await candidate.settleComponents?.();\n assertCurrent();\n this.#activatingRuntime = candidate;\n candidate.widgetDismissedAt = this.#widgetDismissedAt;\n await this.#activationHook?.(context);\n assertCurrent();\n this.#runtime = candidate;\n this.#activatingRuntime = undefined;\n this.#everActivated = true;\n return candidate;\n } catch (error) {\n try {\n await this.#activationFailureHook?.();\n } catch {\n // Cleanup is best-effort; preserve the activation failure.\n }\n if (this.#activatingRuntime === candidate) this.#activatingRuntime = undefined;\n if (candidate) await candidate.shutdown().catch(() => undefined);\n if (this.#runtime === candidate) this.#runtime = undefined;\n throw error;\n }\n })();\n this.#activation = activation;\n this.#activationGeneration = generation;\n void activation.finally(() => {\n if (this.#activation === activation) {\n this.#activation = undefined;\n this.#activationGeneration = undefined;\n }\n }).catch(() => undefined);\n return activation;\n }\n\n async #createRuntime(): Promise<FabricRuntimeState> {\n const module = await (this.#options.runtimeLoader?.() ?? import(\"./fabric-runtime-state.js\"));\n return new module.FabricRuntimeState(\n this.omp,\n this.capturedTools,\n {\n activity: this.activity,\n prewalk: this.prewalk,\n prewalkDrift: this.prewalkDrift,\n sessionApprovals: this.sessionApprovals,\n ...(this.#options.paths ? { paths: this.#options.paths } : {}),\n ...(this.#options.lcmContext ? { lcmContext: this.#options.lcmContext } : {}),\n },\n );\n }\n\n #current(): FabricRuntimeState | undefined {\n return this.#runtime ?? this.#activatingRuntime;\n }\n\n #required(): FabricRuntimeState {\n const runtime = this.#current();\n if (!runtime?.initialized) throw new Error(\"OMP Fabric has not activated\");\n return runtime;\n }\n}\n", "import type { CatalogRepair, RepairClassification, RepairStage } from \"./types.js\";\n\nconst TYPECHECK_HEAD = /type error|type checking failed/i;\nconst INVALID_ARGS = /Invalid arguments for ([^:]+):\\s*(.*)/s;\nconst UNKNOWN_ACTION = /Unknown Fabric action:\\s*(\\S+)/i;\nconst VALIDATION_FAILED = /Validation failed for tool\\s+\"?fabric_exec\"?/i;\nconst EXACT_TEXT = /could not find the exact text|Could not find edits\\[/i;\nconst RUNTIME_HEAD = /^Runtime error/i;\nconst ENOENT = /ENOENT|no such file|Path not found/i;\nconst ARITY = /Expected ([0-9]+)(?:-[0-9]+)? arguments, but got ([0-9]+)/;\nconst CANNOT_FIND = /Cannot find name '([^']+)'/;\nconst DISPLAY_OBJECT = /display: must be object/i;\nconst PAYLOADS_OBJECT = /payloads: must be object/i;\nconst CODE_REQUIRED = /code: must have required properties/i;\n\nconst SHELL_OR_PROSE_NAMES = new Set([\n \"$\",\n \"PY\",\n \"a\",\n \"and\",\n \"bash\",\n \"data\",\n \"do\",\n \"document\",\n \"done\",\n \"e\",\n \"echo\",\n \"f\",\n \"fi\",\n \"for\",\n \"i\",\n \"if\",\n \"in\",\n \"k\",\n \"len\",\n \"m\",\n \"n\",\n \"name\",\n \"open\",\n \"out\",\n \"p\",\n \"path\",\n \"printf\",\n \"r\",\n \"s\",\n \"sh\",\n \"t\",\n \"text\",\n \"the\",\n \"then\",\n \"tmp\",\n \"while\",\n \"x\",\n]);\n\nconst firstText = (content: unknown): string => {\n if (typeof content === \"string\") return content;\n if (content && typeof content === \"object\" && !Array.isArray(content)) {\n return firstText((content as { content?: unknown }).content);\n }\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part) => {\n if (typeof part === \"string\") return part;\n if (part && typeof part === \"object\" && typeof (part as { text?: unknown }).text === \"string\") {\n return (part as { text: string }).text;\n }\n return \"\";\n })\n .join(\"\\n\");\n};\n\nconst extraKeysFromMessage = (message: string): string[] => {\n const keys: string[] = [];\n for (const match of message.matchAll(\n /\\/([A-Za-z_][\\w$]*): must not have additional properties/g,\n )) {\n const key = match[1];\n if (key) keys.push(key);\n }\n return keys;\n};\n\nexport const classifyInvalidArgs = (\n ref: string,\n message: string,\n extraKeys: readonly string[] = extraKeysFromMessage(message),\n): RepairClassification => {\n const key = extraKeys[0];\n return {\n stage: \"invocation_args\",\n fingerprint: key ? `args:${ref}:${key}` : `args:${ref}:${message.slice(0, 80)}`,\n };\n};\n\nexport const classifyUnknownAction = (ref: string): RepairClassification => {\n const trimmed = ref.replace(/[,)]+$/, \"\").trim();\n return {\n stage: \"invocation_unknown_action\",\n fingerprint: `unknown:${trimmed}`,\n };\n};\n\nexport const classifyTypeErrors = (\n messages: readonly string[],\n enclosingTool?: string,\n): RepairClassification[] => {\n const out: RepairClassification[] = [];\n const seen = new Set<string>();\n const push = (entry: RepairClassification) => {\n if (seen.has(entry.fingerprint)) return;\n seen.add(entry.fingerprint);\n out.push(entry);\n };\n for (const message of messages) {\n const arity = ARITY.exec(message);\n if (arity) {\n const expected = Number(arity[1]);\n const got = Number(arity[2]);\n if (got > expected) {\n push({\n stage: \"invocation_typecheck\",\n fingerprint: enclosingTool\n ? `typecheck:arity:${expected}<-${got}:${enclosingTool}`\n : `typecheck:arity:${expected}<-${got}`,\n });\n continue;\n }\n }\n const missing = CANNOT_FIND.exec(message);\n if (missing?.[1] && SHELL_OR_PROSE_NAMES.has(missing[1])) {\n push({\n stage: \"didactic\",\n fingerprint: `didactic:cannot_find:${missing[1]}`,\n });\n continue;\n }\n if (missing?.[1]) {\n push({\n stage: \"invocation_typecheck\",\n fingerprint: `typecheck:cannot_find:${missing[1]}`,\n });\n continue;\n }\n push({\n stage: \"invocation_typecheck\",\n fingerprint: `typecheck:${message.slice(0, 80)}`,\n });\n }\n return out.length > 0\n ? out\n : [{ stage: \"invocation_typecheck\", fingerprint: \"typecheck:unparsed\" }];\n};\n\nexport const classifyToolResult = (input: {\n toolName?: string;\n isError?: boolean;\n content?: unknown;\n}): RepairClassification | undefined => {\n if (!input.isError) return undefined;\n const text = firstText(input.content);\n const head = text.slice(0, 400);\n const tool = input.toolName ?? \"?\";\n\n if (VALIDATION_FAILED.test(head)) {\n if (DISPLAY_OBJECT.test(text)) {\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:display:object\" };\n }\n if (PAYLOADS_OBJECT.test(text)) {\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:payloads:object\" };\n }\n if (CODE_REQUIRED.test(text)) {\n return { stage: \"didactic\", fingerprint: \"outer:code:required\" };\n }\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:unparsed\" };\n }\n if (TYPECHECK_HEAD.test(head)) {\n const lines = text\n .split(\"\\n\")\n .map((line) => line.replace(/^Line \\d+:\\d+ \u2014 /, \"\").trim())\n .filter((line) => line.length > 0 && !/^Type errors?;? code was not executed:?$/i.test(line));\n return classifyTypeErrors(lines)[0];\n }\n const invalid = INVALID_ARGS.exec(text);\n if (invalid?.[1]) return classifyInvalidArgs(invalid[1].trim(), invalid[2] ?? \"\");\n const unknown = UNKNOWN_ACTION.exec(text);\n if (unknown?.[1]) return classifyUnknownAction(unknown[1]);\n if (EXACT_TEXT.test(text)) return { stage: \"effect\", fingerprint: `effect:edit_miss:${tool}` };\n if ([\"bash\", \"omp.bash\"].includes(tool)) {\n return { stage: \"effect\", fingerprint: \"effect:bash\" };\n }\n if ([\"read\", \"write\", \"edit\", \"grep\", \"find\", \"ls\"].includes(tool)) {\n return { stage: \"effect\", fingerprint: `effect:native:${tool}` };\n }\n if (ENOENT.test(text) || RUNTIME_HEAD.test(head)) {\n return { stage: \"effect\", fingerprint: `effect:runtime:${tool}` };\n }\n return { stage: \"didactic\", fingerprint: `other:${tool}` };\n};\n\n", "import { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport const MINIMUM_OMP_HOST_VERSION = \"18.1.10\";\n\nconst OMP_HOST_PACKAGE_NAMES: Record<string, true> = {\n \"@oh-my-pi/pi-coding-agent\": true,\n};\n\ninterface ParsedVersion {\n numbers: [number, number, number];\n prerelease?: string;\n}\n\nconst parseVersion = (value: string): ParsedVersion | undefined => {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?/.exec(value.trim());\n if (!match) return undefined;\n return {\n numbers: [Number(match[1]), Number(match[2]), Number(match[3])],\n ...(match[4] ? { prerelease: match[4] } : {}),\n };\n};\n\nexport const compareVersions = (left: string, right: string): number | undefined => {\n const a = parseVersion(left);\n const b = parseVersion(right);\n if (!a || !b) return undefined;\n for (let index = 0; index < a.numbers.length; index++) {\n const delta = a.numbers[index]! - b.numbers[index]!;\n if (delta !== 0) return Math.sign(delta);\n }\n if (a.prerelease && !b.prerelease) return -1;\n if (!a.prerelease && b.prerelease) return 1;\n if (a.prerelease === b.prerelease) return 0;\n return (a.prerelease ?? \"\").localeCompare(b.prerelease ?? \"\");\n};\n\nexport const detectOmpHostVersion = (\n cliPath: string | undefined = process.argv[1],\n): string | undefined => {\n if (!cliPath) return undefined;\n let directory: string;\n try {\n directory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n while (true) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n if (\n typeof manifest.name === \"string\" &&\n OMP_HOST_PACKAGE_NAMES[manifest.name] === true &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\nexport const ompHostCompatibilityWarning = (\n version: string | undefined = detectOmpHostVersion(),\n): string | undefined => {\n if (!version) return undefined;\n const comparison = compareVersions(version, MINIMUM_OMP_HOST_VERSION);\n if (comparison === undefined || comparison >= 0) return undefined;\n return `OMP Fabric requires OMP >= ${MINIMUM_OMP_HOST_VERSION}; detected ${version}. Upgrade OMP before relying on Fabric continuation behavior.`;\n};\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { writeJsonAtomic } from \"../core/atomic-write.js\";\nimport { compareVersions } from \"../host-compatibility.js\";\nimport { resolveFabricIdentity } from \"../main-agent.js\";\n\nconst PACKAGE_NAME = \"omp-fabric\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst UPGRADE_COMMAND = `omp plugin install ${PACKAGE_NAME}`;\nconst REQUEST_TIMEOUT_MS = 4_000;\n\nexport const UPDATE_STATUS_KEY = \"fabric-update\";\nexport const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1_000;\n\ninterface UpdateCheckCache {\n format: 1;\n checkedAt: number;\n latest: string;\n notified?: string;\n}\n\nexport interface FabricUpdateNotice {\n installed: string;\n latest: string;\n message: string;\n}\n\nexport type FabricUpdateFetch = (\n url: string,\n init: { signal: AbortSignal; headers: Record<string, string> },\n) => Promise<{ ok: boolean; json(): Promise<unknown> }>;\n\nexport interface FabricUpdateCheckOptions {\n agentDir: string;\n installedVersion?: string;\n fetchImpl?: FabricUpdateFetch;\n now?: number;\n timeoutMs?: number;\n}\n\nexport const updateCheckCachePath = (agentDir: string): string =>\n path.join(agentDir, \"fabric\", \"update-check.json\");\n\nconst installedVersionFromManifest = (): string | undefined => {\n let directory = path.dirname(fileURLToPath(import.meta.url));\n while (true) {\n try {\n const manifest = JSON.parse(\n fs.readFileSync(path.join(directory, \"package.json\"), \"utf8\"),\n ) as { name?: unknown; version?: unknown };\n if (manifest.name === PACKAGE_NAME && typeof manifest.version === \"string\") {\n return manifest.version;\n }\n } catch {\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\nconst readCache = (cachePath: string): UpdateCheckCache | undefined => {\n try {\n const parsed = JSON.parse(fs.readFileSync(cachePath, \"utf8\")) as Partial<UpdateCheckCache>;\n if (typeof parsed.checkedAt !== \"number\" || !Number.isFinite(parsed.checkedAt)) return undefined;\n if (typeof parsed.latest !== \"string\" || parsed.latest.length === 0) return undefined;\n return {\n format: 1,\n checkedAt: parsed.checkedAt,\n latest: parsed.latest,\n ...(typeof parsed.notified === \"string\" ? { notified: parsed.notified } : {}),\n };\n } catch {\n return undefined;\n }\n};\n\nconst writeCache = (cachePath: string, value: UpdateCheckCache): void => {\n try {\n writeJsonAtomic(cachePath, value, { space: 2, newline: true });\n } catch {\n }\n};\n\nconst fetchLatestVersion = async (\n fetchImpl: FabricUpdateFetch,\n timeoutMs: number,\n): Promise<string | undefined> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n timer.unref?.();\n try {\n const response = await fetchImpl(REGISTRY_URL, {\n signal: controller.signal,\n headers: { accept: \"application/json\" },\n });\n if (!response.ok) return undefined;\n const payload = (await response.json()) as { version?: unknown } | null;\n const version = payload?.version;\n return typeof version === \"string\" && version.length > 0 ? version : undefined;\n } catch {\n return undefined;\n } finally {\n clearTimeout(timer);\n }\n};\n\nexport const checkFabricUpdate = async (\n options: FabricUpdateCheckOptions,\n): Promise<FabricUpdateNotice | undefined> => {\n try {\n const installed = options.installedVersion ?? installedVersionFromManifest();\n if (installed === undefined) return undefined;\n const now = options.now ?? Date.now();\n const cachePath = updateCheckCachePath(options.agentDir);\n const cached = readCache(cachePath);\n const age = cached === undefined ? undefined : now - cached.checkedAt;\n const fresh = cached !== undefined && age !== undefined && age >= 0 && age < UPDATE_CHECK_TTL_MS;\n let record: UpdateCheckCache;\n if (fresh && cached !== undefined) {\n record = cached;\n } else {\n const latest = await fetchLatestVersion(\n options.fetchImpl ?? (globalThis.fetch as unknown as FabricUpdateFetch),\n options.timeoutMs ?? REQUEST_TIMEOUT_MS,\n );\n if (latest === undefined) return undefined;\n record = {\n format: 1,\n checkedAt: now,\n latest,\n ...(cached?.notified === undefined ? {} : { notified: cached.notified }),\n };\n }\n const behind = compareVersions(record.latest, installed) === 1;\n const announce = behind && record.notified !== record.latest;\n if (!fresh || announce) {\n writeCache(cachePath, announce ? { ...record, notified: record.latest } : record);\n }\n if (!announce) return undefined;\n return {\n installed,\n latest: record.latest,\n message: `${PACKAGE_NAME} ${installed} \u2192 ${record.latest} \u00B7 ${UPGRADE_COMMAND}`,\n };\n } catch {\n return undefined;\n }\n};\n\nexport interface FabricUpdateScheduleOptions {\n enabled: boolean;\n agentDir: string;\n installedVersion?: string;\n fetchImpl?: FabricUpdateFetch;\n now?: number;\n}\n\nexport const scheduleFabricUpdateCheck = async (\n context: ExtensionContext,\n options: FabricUpdateScheduleOptions,\n): Promise<void> => {\n if (!options.enabled || !context.hasUI) return;\n let sessionId: string;\n try {\n sessionId = context.sessionManager.getSessionId();\n } catch {\n return;\n }\n if (resolveFabricIdentity(sessionId).identity.kind !== \"main\") return;\n const notice = await checkFabricUpdate({\n agentDir: options.agentDir,\n ...(options.installedVersion === undefined ? {} : { installedVersion: options.installedVersion }),\n ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),\n ...(options.now === undefined ? {} : { now: options.now }),\n });\n if (notice === undefined) return;\n try {\n context.ui.setStatus(UPDATE_STATUS_KEY, notice.message);\n } catch {\n }\n};\n", "import path from \"node:path\";\nimport type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { TUI } from \"@oh-my-pi/pi-tui\";\nimport type { CodePreviewSettings } from \"./code-preview.js\";\nimport type { FabricConversationState, FabricConversationView } from \"./conversation.js\";\nimport type { NativeConversationReader, NativeConversationSource } from \"./conversation-native-reader.js\";\nimport type { FabricConversationTranscriptRendererOptions } from \"./conversation-render.js\";\nimport type { FabricActivityRun } from \"../activity/types.js\";\nimport type {\n FabricActorBindingScope,\n FabricActorDelivery,\n FabricActorHostEvent,\n} from \"../actors/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport type { FabricThinking } from \"../thinking.js\";\nimport type { MeshEvent } from \"../mesh/store.js\";\nimport type { FabricDashboardMessageTarget } from \"./dashboard.js\";\nimport type { ModelSource } from \"./model-picker.js\";\nimport { createDashboardSnapshot } from \"./snapshot.js\";\nimport { safeText } from \"./format.js\";\nimport { isActiveStatus, type FabricDashboardSnapshot, type FabricUiActor, type FabricUiAgent } from \"./types.js\";\nimport { FabricWidget, shouldShowFabricWidget } from \"./widget.js\";\nimport { AgentTranscriptReader, type FabricTranscriptSource } from \"./transcript.js\";\n\nconst WIDGET_ID = \"omp-fabric\";\nconst ACTIVITY_REFRESH_MS = 100;\n\nconst emptySnapshot = (): FabricDashboardSnapshot => {\n const now = Date.now();\n return {\n now,\n runs: [],\n main: {\n id: \"main\",\n name: \"Main\",\n kind: \"main\",\n status: \"idle\",\n runner: \"omp\",\n transport: \"host\",\n cwd: process.cwd(),\n startedAt: now,\n updatedAt: now,\n pendingMessages: false,\n local: true,\n },\n peers: [],\n agents: [],\n actors: [],\n componentGraph: { components: [], edges: [], cycles: [] },\n globalActors: [],\n state: [],\n events: [],\n };\n};\n\nexport class FabricUiController {\n #context: ExtensionContext | undefined;\n #snapshot: FabricDashboardSnapshot = emptySnapshot();\n #events: MeshEvent[] = [];\n #meshOffset = 0;\n #timer: NodeJS.Timeout | undefined;\n #activityUnsubscribe: (() => void) | undefined;\n #actorUnsubscribe: (() => void) | undefined;\n #agentUnsubscribe: (() => void) | undefined;\n #scheduledRefresh: NodeJS.Timeout | undefined;\n #widgetTui: TUI | undefined;\n #dashboardTui: TUI | undefined;\n #widgetMounted = false;\n #widget: FabricWidget | undefined;\n #lastRefreshErrorAt = 0;\n #lastRefreshAt = 0;\n #dashboardOpen = false;\n #conversationOpen = false;\n #conversationState: FabricConversationState | undefined;\n #conversationView: FabricConversationView | undefined;\n #conversationTui: TUI | undefined;\n #closeConversation: (() => void) | undefined;\n #epoch = 0;\n #activityRevision: number | undefined;\n // Tracks whether #activityRuns was last fetched with full payloads. The\n // dashboard needs args/result/preview to render call detail; the periodic\n // refresh instead pulls payload-free summaries so streaming runs stop\n // paying a deep clone of up to 1,000 bounded call payloads per tick.\n #activityRunsDetailed = true;\n #activityRuns: FabricActivityRun[] = [];\n readonly #transcripts = new AgentTranscriptReader();\n readonly #conversationReaders = new Map<string, NativeConversationReader>();\n\n constructor(\n readonly state: FabricState,\n readonly codePreviewSettings?: CodePreviewSettings,\n readonly conversationRenderers?: FabricConversationTranscriptRendererOptions,\n ) {}\n\n start(context: ExtensionContext): void {\n this.stop();\n this.#context = context;\n if (!this.state.config.ui.enabled || context.mode !== \"tui\") return;\n if (this.state.config.mesh.enabled) {\n this.#events = this.state.mesh.read({ limit: this.state.config.ui.eventHistory });\n this.#meshOffset = this.state.mesh.latestOffset();\n }\n this.#activityUnsubscribe = this.state.activity.subscribe(() => this.#scheduleRefresh());\n this.#actorUnsubscribe = this.state.actors.subscribe(() => this.#scheduleRefresh());\n this.#agentUnsubscribe = this.state.agents.subscribeUi(() => this.#scheduleRefresh());\n this.#refresh();\n this.#schedulePoll();\n }\n\n stop(): void {\n this.#epoch++;\n this.#closeConversation?.();\n this.#closeConversation = undefined;\n this.#conversationView?.dispose();\n this.#conversationView = undefined;\n this.#conversationTui = undefined;\n this.#conversationOpen = false;\n this.#conversationState?.clear();\n this.#conversationState = undefined;\n if (this.#timer) clearTimeout(this.#timer);\n if (this.#scheduledRefresh) clearTimeout(this.#scheduledRefresh);\n this.#timer = undefined;\n this.#scheduledRefresh = undefined;\n this.#widget = undefined;\n this.#activityUnsubscribe?.();\n this.#activityUnsubscribe = undefined;\n this.#actorUnsubscribe?.();\n this.#actorUnsubscribe = undefined;\n this.#agentUnsubscribe?.();\n this.#agentUnsubscribe = undefined;\n if (this.#context?.mode === \"tui\") {\n this.#context.ui.setWidget(WIDGET_ID, undefined);\n }\n this.#context = undefined;\n this.#widgetTui = undefined;\n this.#dashboardTui = undefined;\n this.#widgetMounted = false;\n this.#events = [];\n this.#meshOffset = 0;\n this.#snapshot = emptySnapshot();\n this.#lastRefreshErrorAt = 0;\n this.#lastRefreshAt = 0;\n this.#dashboardOpen = false;\n this.#activityRevision = undefined;\n this.#activityRunsDetailed = true;\n this.#activityRuns = [];\n this.#transcripts.clear();\n for (const reader of this.#conversationReaders.values()) reader.clear();\n this.#conversationReaders.clear();\n }\n\n /** True while Fabric owns keyboard input, including asynchronous view setup. */\n get ownsInput(): boolean {\n return this.#dashboardOpen || this.#conversationOpen;\n }\n\n async openConversation(context: ExtensionContext, query?: string): Promise<void> {\n if (context.mode !== \"tui\") {\n context.ui.notify(\"Fabric conversations are available in TUI mode\", \"warning\");\n return;\n }\n if (!this.state.config.ui.enabled) {\n context.ui.notify(\"The Fabric UI is disabled by ui.enabled\", \"warning\");\n return;\n }\n if (this.#dashboardOpen) {\n context.ui.notify(\"Close the dashboard or press Shift+C on a participant to chat\", \"info\");\n return;\n }\n if (!this.#context) this.start(context);\n if (this.#conversationOpen && !this.#conversationView) return;\n const alreadyOpen = this.#conversationOpen;\n this.#conversationOpen = true;\n const epoch = this.#epoch;\n try {\n const [{ FabricConversationView, FabricConversationState }, { conversationTargets, resolveConversationTarget }, { readConversationAppearance }, { NativeConversationReader }] =\n await Promise.all([import(\"./conversation.js\"), import(\"./conversation-targets.js\"), import(\"./conversation-chrome.js\"), import(\"./conversation-native-reader.js\")]);\n if (epoch !== this.#epoch) return;\n this.#refresh();\n const initialTarget = query?.trim()\n ? resolveConversationTarget(conversationTargets(this.#snapshot), query.trim())\n : undefined;\n if (alreadyOpen) {\n if (initialTarget) this.#conversationView?.selectTarget(initialTarget.id);\n else this.#closeConversation?.();\n return;\n }\n if (initialTarget?.kind === \"main\") return;\n this.#conversationState ??= new FabricConversationState();\n const source = (id: string): NativeConversationSource => {\n const actor = this.#snapshot.actors.find((candidate) => candidate.id === id);\n if (actor) return { ...this.#actorTranscriptSource(actor), id, ...(actor.sessionFile ? { sessionFile: actor.sessionFile } : {}) };\n const agent = this.#snapshot.agents.find((candidate) => candidate.id === id);\n return agent ? this.#agentTranscriptSource(agent) : { id, status: \"unavailable\" };\n };\n const readerFor = (id: string): NativeConversationReader => {\n let reader = this.#conversationReaders.get(id);\n if (!reader) {\n reader = new NativeConversationReader();\n this.#conversationReaders.set(id, reader);\n }\n return reader;\n };\n const requireTarget = (id: string, action: \"steer\" | \"followUp\" | \"stop\"): void => {\n if (epoch !== this.#epoch || !this.#conversationOpen || !this.state.initialized) {\n throw new Error(\"This Fabric conversation is no longer attached\");\n }\n this.#refresh();\n const target = conversationTargets(this.#snapshot).find((candidate) => candidate.id === id);\n const allowed = action === \"stop\" ? target?.canStop\n : action === \"steer\" ? target?.canSteer : target?.canFollowUp;\n if (!target || target.kind === \"main\" || !allowed) {\n throw new Error(target?.readOnlyReason ?? `Participant ${id} cannot receive ${action}`);\n }\n };\n const { getAgentDir } = await import(\"@oh-my-pi/pi-utils\");\n const appearance = await readConversationAppearance(context.cwd, getAgentDir(), context.isProjectTrusted?.() ?? false);\n this.#schedulePoll(true);\n await context.ui.custom<void>((tui, theme, keybindings, done) => {\n if (epoch !== this.#epoch) {\n done(undefined);\n return { render: () => [], invalidate: () => {} };\n }\n this.#conversationTui = tui;\n this.#closeConversation = () => done(undefined);\n const view = new FabricConversationView(tui, theme, {\n targets: () => conversationTargets(this.#snapshot).map((target) => {\n const split = target.model?.indexOf(\"/\") ?? -1;\n if (split < 1 || !target.model) return target;\n const model = context.modelRegistry?.find?.(target.model.slice(0, split), target.model.slice(split + 1));\n return model && typeof model.contextWindow === \"number\" ? { ...target, contextWindow: model.contextWindow } : target;\n }),\n appearance,\n ...(initialTarget ? { initialTargetId: initialTarget.id } : {}),\n state: this.#conversationState!,\n keybindings,\n rendererOptions: this.conversationRenderers,\n queueEvents: this.state.omp?.events,\n ...(this.codePreviewSettings ? { codePreviewSettings: this.codePreviewSettings } : {}),\n transcript: (id, followLatest) => readerFor(id).read(source(id), followLatest),\n loadOlder: (id) => {\n const reader = readerFor(id);\n const before = reader.read(source(id), false);\n if (!before.hasMore) return false;\n const next = reader.loadOlder();\n return !!next && (next.revision !== before.revision || !next.hasMore);\n },\n loadNewer: (id) => {\n const reader = readerFor(id);\n const before = reader.read(source(id), false);\n const next = reader.loadNewer();\n return !!next && next.revision !== before.revision;\n },\n loadLatest: (id) => {\n const reader = readerFor(id);\n const before = reader.read(source(id), false);\n const next = reader.loadLatest();\n return !!next && next.revision !== before.revision;\n },\n send: async (id, message, delivery) => {\n requireTarget(id, delivery);\n const result = await this.state.queueUserMessage(id, message, delivery);\n if (epoch === this.#epoch) this.#refresh();\n return result;\n },\n stop: async (id) => {\n requireTarget(id, \"stop\");\n const result = await this.state.stopParticipant(id);\n if (epoch === this.#epoch) this.#refresh();\n return result;\n },\n close: () => done(undefined),\n });\n this.#conversationView = view;\n return view;\n }, {\n overlay: true,\n overlayOptions: { width: \"100%\", maxHeight: \"100%\", anchor: \"top-left\", margin: 0 },\n });\n } catch (error) {\n if (epoch === this.#epoch) context.ui.notify(safeText(error instanceof Error ? error.message : String(error)), \"error\");\n } finally {\n if (!alreadyOpen && epoch === this.#epoch) {\n this.#conversationView?.dispose();\n this.#conversationView = undefined;\n this.#conversationTui = undefined;\n this.#closeConversation = undefined;\n this.#conversationOpen = false;\n this.#schedulePoll(true);\n }\n }\n }\n\n async openDashboard(context: ExtensionContext): Promise<void> {\n if (this.ownsInput) return;\n if (context.mode !== \"tui\") {\n context.ui.notify(\"The Fabric dashboard is available in TUI mode\", \"warning\");\n return;\n }\n if (!this.state.config.ui.enabled) {\n context.ui.notify(\"The Fabric UI is disabled by ui.enabled\", \"warning\");\n return;\n }\n if (!this.#context) this.start(context);\n // Set after start(): it calls stop(), which clears this flag. The flag\n // must be true before this refresh so the first dashboard frame renders\n // from full activity runs rather than stripped summaries.\n this.#dashboardOpen = true;\n this.#refresh();\n const [{ FabricDashboard }, { buildClaudeModelSource, buildModelSource }] =\n await Promise.all([import(\"./dashboard.js\"), import(\"./model-picker.js\")]);\n const { getAgentDir } = await import(\"@oh-my-pi/pi-utils\");\n const modelSource = buildModelSource(context.modelRegistry, getAgentDir());\n let claudeModelSource: ModelSource | undefined;\n if (this.#snapshot.actors.some((actor) => actor.runner === \"claude\")) {\n try {\n claudeModelSource = buildClaudeModelSource(await this.state.agents.claudeModels());\n } catch (error) {\n context.ui.notify(\n `Claude model discovery failed: ${error instanceof Error ? error.message : String(error)}`,\n \"warning\",\n );\n }\n }\n const reportUpdate = (message: string, update: Promise<unknown>): void => {\n void update\n .then(() => {\n context.ui.notify(message, \"info\");\n this.#refresh();\n })\n .catch((error) =>\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\"),\n );\n };\n const onTargetMessage = (\n target: FabricDashboardMessageTarget,\n message: string,\n delivery: \"steer\" | \"followUp\",\n ): void => {\n const action =\n target.kind === \"actor\"\n ? \"Message queued for actor\"\n : delivery === \"steer\"\n ? `Steer queued for ${target.name}`\n : `Follow-up queued for ${target.name}`;\n reportUpdate(\n action,\n this.state.queueUserMessage(target.id, message, delivery),\n );\n };\n const onAgentStop = (agentId: string): void => {\n reportUpdate(\"Agent stopped\", this.state.stopParticipant(agentId));\n };\n const onActorModel = (\n actorId: string,\n model: string | undefined,\n scope: FabricActorBindingScope,\n ): void => {\n reportUpdate(\n scope === \"project\" ? \"Actor project model pinned\" : \"Actor session model updated\",\n this.state.actors.setModel(actorId, model, scope),\n );\n };\n const onActorThinking = (\n actorId: string,\n thinking: FabricThinking | undefined,\n scope: FabricActorBindingScope,\n ): void => {\n reportUpdate(\n scope === \"project\"\n ? \"Actor project thinking pinned\"\n : \"Actor session thinking updated\",\n this.state.actors.setThinking(actorId, thinking, scope),\n );\n };\n const onActorEvents = (actorId: string, events: FabricActorHostEvent[]): void => {\n reportUpdate(\"Actor event subscriptions updated\", this.state.actors.setEvents(actorId, events));\n };\n const onActorDeliveryPolicy = (\n actorId: string,\n delivery: FabricActorDelivery,\n triggerTurn: boolean,\n ): void => {\n reportUpdate(\n \"Actor delivery policy updated\",\n this.state.actors.setDeliveryPolicy(actorId, delivery, triggerTurn),\n );\n };\n const onGlobalDeliveryPolicy = (\n actorId: string,\n delivery: FabricActorDelivery,\n triggerTurn: boolean,\n ): void => {\n try {\n this.state.globalActors.update(actorId, { delivery, triggerTurn });\n context.ui.notify(\"Global actor delivery policy updated\", \"info\");\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n const onActorTools = (actorId: string, tools: string[]): void => {\n reportUpdate(\"Actor tools updated\", this.state.actors.setTools(actorId, tools));\n };\n const onClearMessages = (actorId: string): void => {\n reportUpdate(\"Actor mailbox cleared\", this.state.actors.clearMessages(actorId));\n };\n const onActorInstructions = (actorId: string, instructions: string): void => {\n reportUpdate(\"Actor instructions updated\", this.state.actors.setInstructions(actorId, instructions));\n };\n const onGlobalInstructions = (globalActorId: string, instructions: string): void => {\n try {\n this.state.globalActors.update(globalActorId, { instructions });\n context.ui.notify(\"Global actor instructions updated\", \"info\");\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n const onImportActor = (globalActorId: string): void => {\n const def = this.state.globalActors.resolve(globalActorId);\n if (!def) return;\n this.state.actors\n .create(this.state.globalActors.toRequest(def))\n .then((actor) => {\n context.ui.notify(`Imported global actor \"${def.name}\" as ${actor.name}`, \"info\");\n this.#refresh();\n })\n .catch((error) =>\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\"),\n );\n };\n const onExportActor = (actorId: string): void => {\n try {\n const def = this.state.actors.definition(actorId);\n const template = this.state.globalActors.create(def);\n context.ui.notify(`Exported \"${template.name}\" to global actors`, \"info\");\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n const onRemoveGlobalActor = (globalActorId: string): void => {\n try {\n const result = this.state.globalActors.remove(globalActorId);\n context.ui.notify(\n result.removed ? \"Removed global actor template\" : \"Global actor not found\",\n result.removed ? \"info\" : \"warning\",\n );\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n this.#schedulePoll(true);\n let conversationTarget: string | undefined;\n const epoch = this.#epoch;\n try {\n await context.ui.custom<void>(\n (tui, theme, keybindings, done) => {\n this.#dashboardTui = tui;\n return new FabricDashboard(tui, theme, () => this.#snapshot, () => done(undefined), {\n modelSource,\n keybindings,\n ...(this.codePreviewSettings\n ? { codePreviewSettings: this.codePreviewSettings }\n : {}),\n ...(claudeModelSource ? { claudeModelSource } : {}),\n onTargetMessage,\n onAgentStop,\n onConversation: (id) => {\n conversationTarget = id;\n done(undefined);\n },\n agentTranscript: (agent, followLatest) =>\n this.#transcripts.read(this.#agentTranscriptSource(agent), followLatest),\n actorTranscript: (actor, followLatest) =>\n this.#transcripts.read(this.#actorTranscriptSource(actor), followLatest),\n loadOlderTranscript: (target) =>\n this.#transcripts.loadOlder(this.#transcriptSource(target)),\n loadNewerTranscript: (target) =>\n this.#transcripts.loadNewer(this.#transcriptSource(target)),\n loadLatestTranscript: (target) =>\n this.#transcripts.loadLatest(this.#transcriptSource(target)),\n onActorModel,\n onActorThinking,\n onActorEvents,\n onActorDeliveryPolicy,\n onGlobalDeliveryPolicy,\n onActorTools,\n actorDefaultTools: this.state.config.agents?.defaultTools ?? [],\n onClearMessages,\n onActorInstructions,\n onGlobalInstructions,\n onImportActor,\n onExportActor,\n onRemoveGlobalActor,\n });\n },\n {\n overlay: true,\n overlayOptions: {\n width: \"94%\",\n minWidth: 40,\n maxHeight: \"90%\",\n anchor: \"center\",\n margin: 1,\n },\n },\n );\n } finally {\n if (epoch === this.#epoch) {\n this.#dashboardOpen = false;\n this.#dashboardTui = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }\n }\n if (conversationTarget && epoch === this.#epoch) {\n await this.openConversation(context, conversationTarget);\n }\n }\n\n snapshot(): FabricDashboardSnapshot {\n return structuredClone(this.#snapshot);\n }\n\n #schedulePoll(reset = false): void {\n if (reset && this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n if (this.#timer || !this.#context) return;\n const active =\n this.#snapshot.runs.some((run) => run.status === \"running\") ||\n this.#snapshot.peers.length > 0 ||\n this.#snapshot.agents.some((agent) => isActiveStatus(agent.status)) ||\n this.#snapshot.actors.some(\n (actor) =>\n isActiveStatus(actor.status) ||\n Boolean(actor.worker && isActiveStatus(actor.worker.status)),\n );\n if (!this.ownsInput && !active) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n this.#refresh();\n this.#schedulePoll();\n }, this.state.config.ui.refreshMs);\n this.#timer.unref();\n }\n\n #scheduleRefresh(): void {\n if (this.#scheduledRefresh || !this.#context) return;\n const elapsed = performance.now() - this.#lastRefreshAt;\n const delay = Math.max(\n 0,\n Math.min(ACTIVITY_REFRESH_MS, this.state.config.ui.refreshMs) - elapsed,\n );\n this.#scheduledRefresh = setTimeout(() => {\n this.#scheduledRefresh = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }, delay);\n this.#scheduledRefresh.unref();\n }\n\n #agentTranscriptSource(agent: FabricUiAgent): FabricTranscriptSource {\n return { id: agent.id, status: agent.status, ...(agent.logFile ? { logFile: agent.logFile } : {}) };\n }\n\n #actorTranscriptSource(actor: FabricUiActor): FabricTranscriptSource {\n if (actor.worker?.logFile && isActiveStatus(actor.worker.status)) {\n return {\n id: `${actor.id}:${actor.worker.id}`,\n status: actor.worker.status,\n logFile: actor.worker.logFile,\n };\n }\n const retained = actor.lastRunId && actor.logDir\n ? path.join(actor.logDir, actor.lastRunId, \"events.jsonl\")\n : undefined;\n if (retained) return { id: actor.id, status: actor.status, logFile: retained };\n if (actor.sessionFile) {\n return { id: actor.id, status: actor.status, logFile: actor.sessionFile };\n }\n return { id: actor.id, status: actor.status };\n }\n\n #transcriptSource(target: FabricUiAgent | FabricUiActor): FabricTranscriptSource {\n return \"recentMessages\" in target\n ? this.#actorTranscriptSource(target)\n : this.#agentTranscriptSource(target);\n }\n\n #refresh(): void {\n this.#lastRefreshAt = performance.now();\n const context = this.#context;\n if (!context || !this.state.initialized) return;\n try {\n this.#pollMesh();\n const revision =\n typeof this.state.activity.revision === \"function\"\n ? this.state.activity.revision()\n : undefined;\n const detailed = this.#dashboardOpen;\n if (\n revision === undefined ||\n revision !== this.#activityRevision ||\n detailed !== this.#activityRunsDetailed\n ) {\n this.#activityRuns =\n detailed || typeof this.state.activity.runSummaries !== \"function\"\n ? this.state.activity.runs()\n : this.state.activity.runSummaries();\n this.#activityRevision = revision;\n this.#activityRunsDetailed = detailed;\n }\n this.#snapshot = createDashboardSnapshot(\n this.state,\n this.#events,\n context,\n this.#activityRuns,\n );\n this.#renderWidget(context);\n if (this.#conversationTui) this.#conversationTui.requestRender();\n if (this.#dashboardTui) this.#dashboardTui.requestRender();\n else if (this.#widgetTui && this.#widget?.hasChanged()) this.#widgetTui.requestRender();\n } catch (error) {\n const now = Date.now();\n if (now - this.#lastRefreshErrorAt >= 10_000) {\n this.#lastRefreshErrorAt = now;\n const message = error instanceof Error ? error.message : String(error);\n context.ui.notify(`Fabric dashboard refresh failed: ${message}`, \"warning\");\n }\n }\n }\n\n #pollMesh(): void {\n if (!this.state.config.mesh.enabled) return;\n const result = this.state.mesh.tail(this.#meshOffset, this.state.config.ui.eventHistory);\n this.#meshOffset = result.nextOffset;\n if (result.events.length === 0) return;\n this.#events.push(...result.events);\n const limit = this.state.config.ui.eventHistory;\n if (this.#events.length > limit) this.#events.splice(0, this.#events.length - limit);\n }\n\n #renderWidget(context: ExtensionContext): void {\n const config = this.state.config.ui;\n const shouldShow =\n context.mode === \"tui\" &&\n shouldShowFabricWidget(this.#snapshot, config.widget);\n if (shouldShow) {\n if (this.#widgetMounted) return;\n this.#widgetMounted = true;\n context.ui.setWidget(\n WIDGET_ID,\n (tui, theme) => {\n this.#widgetTui = tui;\n this.#widget = new FabricWidget(theme, () => this.#snapshot, config.maxRows);\n return this.#widget;\n },\n { placement: \"aboveEditor\" },\n );\n return;\n }\n if (!this.#widgetMounted) return;\n context.ui.setWidget(WIDGET_ID, undefined);\n this.#widgetMounted = false;\n this.#widgetTui = undefined;\n this.#widget = undefined;\n }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricActivityRun } from \"../activity/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport type { MeshEvent, MeshStateEntry } from \"../mesh/store.js\";\nimport type { AgentHandleInfo, AgentRunRecord } from \"../agents/types.js\";\nimport { safeText } from \"./format.js\";\nimport {\n activeStatuses,\n orderAgentsByCreation,\n type FabricDashboardSnapshot,\n type FabricUiAgent,\n type FabricUiStateEntry,\n} from \"./types.js\";\n\nconst MAX_UI_AGENTS = 240;\n\nconst boundedUiAgents = (\n local: FabricUiAgent[],\n remote: FabricUiAgent[],\n): FabricUiAgent[] => {\n const selected = new Map<string, FabricUiAgent>();\n for (const agent of local) {\n if (activeStatuses.has(agent.status)) selected.set(agent.id, agent);\n }\n const addNewest = (agents: FabricUiAgent[]): void => {\n for (let index = agents.length - 1; index >= 0 && selected.size < MAX_UI_AGENTS; index--) {\n const agent = agents[index];\n if (agent) selected.set(agent.id, agent);\n }\n };\n addNewest(orderAgentsByCreation(local));\n addNewest(orderAgentsByCreation(remote));\n return orderAgentsByCreation([...selected.values()]);\n};\n\nconst isRunRecord = (\n value: AgentRunRecord | AgentHandleInfo,\n): value is AgentRunRecord => \"startedAt\" in value;\n\nconst numberFrom = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst stateEntry = (entry: MeshStateEntry): FabricUiStateEntry => {\n const value =\n typeof entry.value === \"object\" && entry.value !== null && !Array.isArray(entry.value)\n ? (entry.value as Record<string, unknown>)\n : undefined;\n const label = safeText(\n value?.title ?? value?.label ?? value?.name ?? value?.task ?? entry.key,\n ).slice(0, 160);\n const status = safeText(value?.status ?? value?.state ?? \"state\").toLowerCase() || \"state\";\n const owner = safeText(value?.owner ?? value?.claimedBy ?? value?.claimed_by);\n const detail = safeText(\n value?.current ?? value?.activity ?? value?.description ?? value?.summary,\n );\n return {\n key: entry.key,\n label: label || entry.key,\n status,\n value: entry.value,\n version: entry.version,\n updatedAt: entry.updatedAt,\n ...(owner ? { owner } : {}),\n ...(detail ? { detail: detail.slice(0, 500) } : {}),\n };\n};\n\nexport const createDashboardSnapshot = (\n state: FabricState,\n events: MeshEvent[],\n context?: ExtensionContext,\n activityRuns?: FabricActivityRun[],\n): FabricDashboardSnapshot => {\n const runs = activityRuns ?? state.activity.runs();\n const agentRecords =\n typeof state.agents.listForUi === \"function\"\n ? state.agents.listForUi()\n : state.agents.list();\n const agentLinks: Array<{ runId: string; call: FabricActivityRun[\"calls\"][number] }> = [];\n for (const run of runs) {\n for (const call of run.calls) {\n if (call.entityId) agentLinks.push({ runId: run.id, call });\n }\n }\n agentLinks.sort((left, right) => {\n const leftLaunch = left.call.ref === \"agents.spawn\" || left.call.ref === \"agents.run\";\n const rightLaunch = right.call.ref === \"agents.spawn\" || right.call.ref === \"agents.run\";\n if (leftLaunch !== rightLaunch) return leftLaunch ? -1 : 1;\n return left.call.startedAt - right.call.startedAt;\n });\n const agentFromRecord = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): FabricUiAgent => {\n const linked = parentId\n ? undefined\n : agentLinks.find(\n ({ call }) =>\n call.entityId &&\n (record.id.startsWith(call.entityId) || call.entityId.startsWith(record.id)),\n );\n const base: FabricUiAgent = {\n id: record.id,\n name: record.name,\n status: record.status,\n runner: record.runner,\n transport: record.transport,\n cwd: record.cwd,\n ...(!isRunRecord(record) && linked ? { startedAt: linked.call.startedAt } : {}),\n ...(record.model ? { model: record.model } : {}),\n ...(record.thinking ? { thinking: record.thinking } : {}),\n ...(record.attachCommand ? { attachCommand: record.attachCommand } : {}),\n ...(isRunRecord(record) && record.logFile ? { logFile: record.logFile } : {}),\n ...(record.branch ? { branch: record.branch } : {}),\n ...(record.worktree ? { worktree: record.worktree } : {}),\n ...(record.actorId ? { actorId: record.actorId } : {}),\n ...(record.actorName ? { actorName: record.actorName } : {}),\n ...(parentId ? { parentId } : {}),\n ...(nestingDepth > 0 ? { nestingDepth } : {}),\n ...(linked ? { runId: linked.runId } : parent?.runId ? { runId: parent.runId } : {}),\n ...(linked?.call.phaseId\n ? { phaseId: linked.call.phaseId }\n : parent?.phaseId\n ? { phaseId: parent.phaseId }\n : {}),\n };\n if (!isRunRecord(record)) return base;\n return {\n ...base,\n task: record.task,\n startedAt: record.startedAt,\n updatedAt: record.updatedAt,\n ...(record.finishedAt !== undefined ? { finishedAt: record.finishedAt } : {}),\n ...(record.currentTool ? { currentTool: record.currentTool } : {}),\n turns: record.turns,\n toolCalls: record.toolCalls,\n usage: { ...record.usage },\n ...(record.text ? { text: record.text } : {}),\n ...(record.value !== undefined ? { value: structuredClone(record.value) } : {}),\n ...(record.error ? { error: record.error } : {}),\n };\n };\n const allAgents: FabricUiAgent[] = [];\n const appendAgent = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): void => {\n const agent = agentFromRecord(record, nestingDepth, parentId, parent);\n allAgents.push(agent);\n if (!isRunRecord(record)) return;\n for (const nested of record.nestedAgents ?? []) {\n appendAgent(nested, nestingDepth + 1, record.id, agent);\n }\n };\n for (const record of agentRecords) appendAgent(record, 0);\n\n const participants =\n typeof state.participantInfos === \"function\"\n ? state.participantInfos({ scope: \"project\" })\n : [];\n const participantById = new Map(participants.map((participant) => [participant.id, participant]));\n const actors = state.actors\n .list()\n .map((actor) => {\n const participant = participantById.get(actor.id);\n const worker = allAgents\n .filter((agent) => agent.actorId === actor.id)\n .sort((left, right) => {\n const active =\n Number(activeStatuses.has(right.status)) -\n Number(activeStatuses.has(left.status));\n const recency =\n (numberFrom(right.updatedAt) ?? numberFrom(right.startedAt) ?? 0) -\n (numberFrom(left.updatedAt) ?? numberFrom(left.startedAt) ?? 0);\n return active || recency;\n })[0];\n return {\n ...actor,\n instructions: state.actors.instructions(actor.id),\n recentMessages: state.actors.messages(actor.id, 12),\n ...(participant\n ? { ownerHostId: participant.ownerHostId, local: participant.local }\n : {}),\n ...(worker ? { worker } : {}),\n };\n });\n const localAgents = allAgents\n .filter((agent) => !agent.actorId)\n .map((agent) => {\n const participant = participantById.get(agent.id);\n return participant\n ? {\n ...agent,\n ...(agent.parentId ? {} : participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }\n : agent;\n });\n const localAgentIds = new Set(localAgents.map((agent) => agent.id));\n const remoteAgents: FabricUiAgent[] = participants\n .filter((participant) => participant.kind === \"agent\" && !localAgentIds.has(participant.id))\n .map((participant) => ({\n id: participant.id,\n name: participant.name,\n status: participant.status,\n runner: participant.runner,\n transport: participant.transport,\n cwd: participant.cwd ?? \"\",\n ...(participant.model ? { model: participant.model } : {}),\n ...(participant.thinking ? { thinking: participant.thinking } : {}),\n ...(participant.currentTool ? { currentTool: participant.currentTool } : {}),\n startedAt: participant.startedAt,\n updatedAt: participant.updatedAt,\n ...(participant.finishedAt !== undefined ? { finishedAt: participant.finishedAt } : {}),\n ...(participant.turns !== undefined ? { turns: participant.turns } : {}),\n ...(participant.toolCalls !== undefined ? { toolCalls: participant.toolCalls } : {}),\n ...(participant.usage ? { usage: { ...participant.usage } } : {}),\n ...(participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }));\n const agents = [...localAgents, ...remoteAgents];\n const visibleAgents = boundedUiAgents(localAgents, remoteAgents);\n const activeRunIds = new Set(\n agents\n .filter((agent) => agent.runId && activeStatuses.has(agent.status))\n .map((agent) => agent.runId as string),\n );\n const orderedRuns = runs\n .map((run, index) => ({ run, index }))\n .sort((left, right) => {\n const leftActive = activeRunIds.has(left.run.id) ? 1 : 0;\n const rightActive = activeRunIds.has(right.run.id) ? 1 : 0;\n return rightActive - leftActive || left.index - right.index;\n })\n .map(({ run }) => run);\n\n const meshEntries = state.config.mesh.enabled ? state.mesh.list(\"\", 200) : [];\n const stateEntries = meshEntries\n .filter(\n (entry) =>\n !entry.key.startsWith(\"actors/\") &&\n !entry.key.startsWith(\"sessions/\") &&\n !entry.key.startsWith(\"topology/\"),\n )\n .map(stateEntry)\n .sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n })\n .slice(0, 120);\n\n return {\n now: Date.now(),\n runs: orderedRuns,\n main: state.mainAgentInfo(context),\n peers: typeof state.peerInfos === \"function\" ? state.peerInfos() : [],\n participants,\n widgetDismissedAt: state.widgetDismissedAt,\n globalActors: state.globalActors.list(),\n agents: visibleAgents,\n componentGraph: typeof state.componentGraph === \"function\"\n ? state.componentGraph()\n : { components: [], edges: [], cycles: [] },\n actors: actors.sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n }),\n state: stateEntries,\n events: events.map((event) => structuredClone(event)),\n };\n};\n", "import type { Component } from \"@oh-my-pi/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@oh-my-pi/pi-tui\";\nimport type { Theme } from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricUiWidgetMode } from \"../config.js\";\nimport { spinnerFrame } from \"./spinner.js\";\nimport { FABRIC_CONVERSATION_HINT } from \"./conversation-shortcut.js\";\nimport type {\n FabricActivityRun,\n FabricActivityStatus,\n} from \"../activity/types.js\";\nimport { formatCost, formatDuration, formatTokens, safeText } from \"./format.js\";\nimport {\n isActiveStatus,\n orderAgentsByCreation,\n type FabricDashboardSnapshot,\n type FabricUiAgent,\n} from \"./types.js\";\n\nconst statusGlyph = (status: string): string => {\n if (status === \"completed\" || status === \"done\") return \"\u2713\";\n if (status === \"failed\" || status === \"timed_out\") return \"\u2717\";\n if (status === \"blocked\") return \"!\";\n if (status === \"stopped\" || status === \"cancelled\") return \"\u25A0\";\n if (status === \"queued\" || status === \"pending\" || status === \"ready\") return \"\u25CB\";\n if (status === \"idle\" || status === \"state\") return \"\u00B7\";\n return spinnerFrame();\n};\n\nconst colorStatus = (theme: Theme, status: string, value: string): string => {\n if (status === \"completed\" || status === \"done\") return theme.fg(\"success\", value);\n if (status === \"failed\" || status === \"timed_out\") return theme.fg(\"error\", value);\n if (status === \"blocked\") return theme.fg(\"warning\", value);\n if (status === \"running\" || status === \"in_progress\") return theme.fg(\"accent\", value);\n return theme.fg(\"dim\", value);\n};\n\nconst phaseProgress = (\n run: FabricActivityRun,\n phaseId: string,\n): { completed: number; total: number } => {\n const phase = run.phases.find((candidate) => candidate.id === phaseId);\n const statuses: FabricActivityStatus[] = [\n ...run.calls.filter((call) => call.phaseId === phaseId).map((call) => call.status),\n ...run.items.filter((item) => item.phaseId === phaseId).map((item) => item.status),\n ];\n const completed = statuses.filter((status) => status === \"completed\").length;\n return { completed, total: Math.max(phase?.total ?? 0, statuses.length) };\n};\n\nconst totalTokens = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce(\n (sum, agent) => sum + (agent.usage ? agent.usage.input + agent.usage.output : 0),\n 0,\n );\n\nconst totalCost = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce((sum, agent) => sum + (agent.usage?.cost ?? 0), 0);\n\nconst agentLines = (\n theme: Theme,\n agent: FabricUiAgent,\n now: number,\n): string[] => {\n const status = colorStatus(theme, agent.status, statusGlyph(agent.status));\n const activity =\n agent.currentTool ??\n (agent.error\n ? `error: ${truncateToWidth(safeText(agent.error), 48)}`\n : agent.text && !isActiveStatus(agent.status)\n ? `result: ${truncateToWidth(safeText(agent.text), 48)}`\n : agent.status === \"running\"\n ? \"thinking\"\n : agent.status);\n const metrics = [\n agent.toolCalls !== undefined ? `${agent.toolCalls} calls` : undefined,\n agent.usage ? `${formatTokens(agent.usage.input + agent.usage.output)} tok` : undefined,\n agent.startedAt\n ? formatDuration((agent.finishedAt ?? now) - agent.startedAt)\n : undefined,\n ].filter((value): value is string => Boolean(value));\n const indent = \" \".repeat(1 + Math.max(0, agent.nestingDepth ?? 0));\n return [\n `${indent}${status} ${theme.fg(\"muted\", safeText(agent.name))} ${theme.fg(\"muted\", safeText(activity))}${\n metrics.length > 0 ? theme.fg(\"dim\", ` \u00B7 ${metrics.join(\" \u00B7 \")}`) : \"\"\n }`,\n ];\n};\n\nexport const shouldShowFabricWidget = (\n snapshot: FabricDashboardSnapshot,\n mode: FabricUiWidgetMode,\n): boolean => {\n if (mode === \"hidden\") return false;\n if (mode === \"always\") return true;\n if (snapshot.agents.some((agent) => isActiveStatus(agent.status))) return true;\n if (snapshot.actors.some((actor) => actor.status !== \"stopped\")) return true;\n const run = snapshot.runs[0];\n if (!run) return false;\n if (run.status === \"running\") return true;\n const finishedAt = run.finishedAt ?? run.updatedAt;\n return finishedAt > (snapshot.widgetDismissedAt ?? 0);\n};\n\nexport class FabricWidget implements Component {\n constructor(\n readonly theme: Theme,\n readonly snapshot: () => FabricDashboardSnapshot,\n readonly maxRows: number,\n ) {}\n\n #lastWidth: number | undefined;\n #lastSnapshot: FabricDashboardSnapshot | undefined;\n #lastLines: string[] | undefined;\n #pending:\n | { width: number; snapshot: FabricDashboardSnapshot; lines: string[] }\n | undefined;\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const snapshot = this.snapshot();\n const lines =\n this.#pending?.width === width && this.#pending.snapshot === snapshot\n ? this.#pending.lines\n : this.#lastWidth === width &&\n this.#lastSnapshot === snapshot &&\n this.#lastLines\n ? this.#lastLines\n : this.#renderLines(snapshot, width);\n this.#pending = undefined;\n this.#lastWidth = width;\n this.#lastSnapshot = snapshot;\n this.#lastLines = lines;\n return lines;\n }\n\n hasChanged(): boolean {\n if (this.#lastWidth === undefined || this.#lastLines === undefined) return true;\n const snapshot = this.snapshot();\n const lines = this.#renderLines(snapshot, this.#lastWidth);\n this.#pending = { width: this.#lastWidth, snapshot, lines };\n return (\n lines.length !== this.#lastLines.length ||\n lines.some((line, index) => line !== this.#lastLines?.[index])\n );\n }\n\n invalidate(): void {\n this.#pending = undefined;\n this.#lastWidth = undefined;\n this.#lastSnapshot = undefined;\n this.#lastLines = undefined;\n }\n\n #renderLines(snapshot: FabricDashboardSnapshot, width: number): string[] {\n return this.#boundContent(this.#buildContent(snapshot), width);\n }\n\n #buildContent(snapshot: FabricDashboardSnapshot): string[] {\n const candidateRun = snapshot.runs[0];\n const candidateFinishedAt = candidateRun?.finishedAt ?? candidateRun?.updatedAt ?? 0;\n const run =\n candidateRun &&\n (candidateRun.status === \"running\" ||\n candidateFinishedAt > (snapshot.widgetDismissedAt ?? 0))\n ? candidateRun\n : undefined;\n const orderedAgents = orderAgentsByCreation(snapshot.agents);\n const activeAgents = orderedAgents.filter((agent) => isActiveStatus(agent.status));\n const activeAgentIds = new Set(activeAgents.map((agent) => agent.id));\n const terminalAgents = run\n ? orderedAgents.filter(\n (agent) =>\n agent.runId === run.id &&\n !activeAgentIds.has(agent.id) &&\n !isActiveStatus(agent.status),\n )\n : [];\n const visibleActors = snapshot.actors.filter((actor) => actor.status !== \"stopped\");\n const activeActorWorkers = visibleActors\n .filter((actor) => actor.worker && isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const terminalActorWorkers = visibleActors\n .filter((actor) => actor.worker && !isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const nestedCalls =\n run?.calls.filter((call) => call.kind !== \"agent\" && call.kind !== \"actor\") ?? [];\n const title = run?.name ?? \"Fabric session\";\n const headerStatus =\n run?.status ??\n (activeAgents.length > 0 || activeActorWorkers.length > 0 ? \"running\" : \"idle\");\n const parts: string[] = [];\n\n const callTotal = nestedCalls.length;\n if (callTotal > 1) {\n const callDone = nestedCalls.filter(\n (call) => call.status === \"completed\" || call.status === \"failed\",\n ).length;\n parts.push(`${callDone}/${callTotal} calls`);\n }\n if (run?.currentPhaseId) {\n const phaseIndex = run.phases.findIndex((phase) => phase.id === run.currentPhaseId);\n const phase = run.phases[phaseIndex];\n if (phase) {\n const progress = phaseProgress(run, phase.id);\n parts.push(\n `${phaseIndex + 1}/${run.phases.length} ${safeText(phase.name)}${\n progress.total > 0 ? ` ${progress.completed}/${progress.total}` : \"\"\n }`,\n );\n }\n }\n if (activeAgents.length > 0) parts.push(`${activeAgents.length} running`);\n if (visibleActors.length > 0) parts.push(`${visibleActors.length} actor${visibleActors.length === 1 ? \"\" : \"s\"}`);\n const tokens = totalTokens(snapshot, run);\n if (tokens > 0) parts.push(`${formatTokens(tokens)} tok`);\n const cost = totalCost(snapshot, run);\n if (cost > 0) parts.push(formatCost(cost));\n if (run) parts.push(formatDuration((run.finishedAt ?? snapshot.now) - run.startedAt));\n\n const glyph = colorStatus(this.theme, headerStatus, statusGlyph(headerStatus));\n const header = `${glyph} ${this.theme.fg(\"accent\", \"Fabric\")} ${this.theme.fg(\n \"muted\",\n safeText(title),\n )}${parts.length > 0 ? this.theme.fg(\"dim\", ` \u00B7 ${parts.join(\" \u00B7 \")}`) : \"\"}`;\n const hasActiveConversations = activeAgents.some((agent) => !agent.stale) ||\n activeActorWorkers.length > 0 || visibleActors.some((actor) => isActiveStatus(actor.status));\n const lines = [hasActiveConversations ? `${header} \u00B7 ${this.theme.fg(\"dim\", FABRIC_CONVERSATION_HINT)}` : header];\n\n lines.push(\n ...activeAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n ...activeActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n );\n return lines;\n }\n\n #boundContent(content: string[], width: number): string[] {\n const bounded = content.slice(0, Math.max(1, this.maxRows));\n if (content.length > bounded.length && bounded.length > 0) {\n const marker = this.theme.fg(\"dim\", `+${content.length - bounded.length}`);\n const available = Math.max(0, width - visibleWidth(marker) - 1);\n const last = truncateToWidth(bounded[bounded.length - 1] ?? \"\", available, \"\");\n bounded[bounded.length - 1] = `${last} ${marker}`;\n }\n return bounded.map((line) => truncateToWidth(line, width));\n }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\n\ninterface EscapeHaltOptions {\n enabled: () => boolean;\n ownsInput: () => boolean;\n halted: () => boolean;\n halt: () => number;\n}\n\n/** Observe native Escape without treating navigation inside Fabric UI as an interrupt. */\nexport function installFabricEscapeHalt(\n context: ExtensionContext,\n options: EscapeHaltOptions,\n): () => void {\n if (context.mode !== \"tui\" || typeof context.ui.onTerminalInput !== \"function\") return () => {};\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cancel = (): void => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n const unsubscribe = context.ui.onTerminalInput((data) => {\n cancel();\n // Check before the overlay handles Escape and closes: a delayed check alone\n // would mistake that navigation key for a native Main interrupt.\n if (data !== \"\\x1b\" || options.ownsInput() || !options.enabled()) return undefined;\n timer = setTimeout(() => {\n timer = undefined;\n if (!options.enabled() || options.ownsInput()) return;\n let count: number;\n try {\n if (options.halted()) return;\n count = options.halt();\n } catch {\n return;\n }\n if (count > 0) {\n context.ui.notify(\n `Fabric: halted ${count} actor${count === 1 ? \"\" : \"s\"} (Esc) \u00B7 resumes on next message`,\n \"warning\",\n );\n }\n }, 60);\n timer.unref?.();\n return undefined;\n });\n return () => {\n cancel();\n unsubscribe();\n };\n}\n", "/** Tracks rendered fabric_exec cards so a display preference switch redraws the current transcript. */\nexport class FabricToolDisplayController {\n readonly #invalidators = new Map<string, {\n call?: () => void;\n result?: () => void;\n }>();\n #pendingRefresh: Array<() => void> = [];\n #refreshDrainScheduled = false;\n\n observe(\n toolCallId: string,\n kind: \"call\" | \"result\",\n invalidate: () => void,\n ): void {\n const invalidators = this.#invalidators.get(toolCallId) ?? {};\n invalidators[kind] = invalidate;\n this.#invalidators.set(toolCallId, invalidators);\n }\n\n refresh(): void {\n for (const { call, result } of this.#invalidators.values()) {\n // A card's call and result invalidators resolve to the same host\n // component: its invalidate() re-renders both renderers together, so one\n // call covers the whole card and calling both would double the work.\n const invalidate = result ?? call;\n if (invalidate) this.#pendingRefresh.push(invalidate);\n }\n this.#scheduleRefreshDrain();\n }\n\n // Drain a few cards per event-loop turn. invalidate() synchronously runs the\n // card's full renderer pair (updateDisplay in OMP's ToolExecutionComponent),\n // so re-rendering a long transcript inside a single keypress froze the UI\n // until every card had been redrawn.\n #scheduleRefreshDrain(): void {\n if (this.#refreshDrainScheduled) return;\n this.#refreshDrainScheduled = true;\n setImmediate(() => {\n this.#refreshDrainScheduled = false;\n const batch = this.#pendingRefresh.splice(0, REFRESH_CARDS_PER_TICK);\n for (const invalidate of batch) {\n try {\n invalidate();\n } catch {\n // A transcript component may already have been disposed.\n }\n }\n if (this.#pendingRefresh.length > 0) this.#scheduleRefreshDrain();\n });\n }\n\n clear(): void {\n this.#pendingRefresh = [];\n this.#invalidators.clear();\n }\n}\n\n// Cards re-rendered per event-loop turn during refresh(): small enough that\n// one drain tick stays well inside a frame, large enough that realistic\n// transcripts finish repainting within a handful of turns.\nconst REFRESH_CARDS_PER_TICK = 3;\n", "import type { Usage } from \"@oh-my-pi/pi-ai\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport { defaultCodePreviewSettings } from \"./ui/code-preview.js\";\nimport {\n type FabricToolShellDecorator,\n withCodePreviewShell,\n} from \"./ui/code-preview-shell.js\";\nimport { registerFabricActorHostEventObservers } from \"./actors/host-event-observer.js\";\nimport { CapturedToolCatalog } from \"./capture/catalog.js\";\nimport { installRegisteredToolCapture } from \"./capture/interceptor.js\";\nimport { registerFabricCommand } from \"./commands/fabric.js\";\nimport { resolveAgentDir } from \"./core/agent-dir.js\";\nimport {\n AUTO_APPLY_PROPOSAL_KINDS,\n compileEntropySurfaceAsync,\n compiledSurfaceEffectChanged,\n entropyRepairRows,\n entropyReviewKey,\n formatEntropyCompileNotice,\n formatEntropyReviewNotice,\n liveSurfaceSnapshot,\n loadCompiledSurfaceAsync,\n loadObservationPoolAsync,\n machineSessionFilesAsync,\n mergeObservationWindowAsync,\n poolToValueObservations,\n saveCompiledSurfaceAsync,\n saveObservationPoolAsync,\n sessionWindowEvidenceAsync,\n} from \"./entropy/index.js\";\nimport { setActiveCompiledSurface } from \"./entropy/active.js\";\nimport {\n filterPrewalkContinuationMessages,\n settleInPlacePrewalk,\n withTrajectoryRearmDirective,\n} from \"./prewalk/handoff.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport { autoArmFabricPrewalk } from \"./prewalk/arm.js\";\nimport { FabricSpeculationWarmup } from \"./speculation/warmup.js\";\nimport {\n DEFAULT_FABRIC_CONFIG,\n effectiveToolCaptureConfig,\n} from \"./config.js\";\nimport { registerCompactionHook } from \"./compaction/hook.js\";\nimport { LcmRuntime } from \"./compaction/lcm-runtime.js\";\nimport { canonicalProjectIdentity } from \"./storage/lcm-ledger.js\";\nimport { compactAtConfiguredThreshold } from \"./compaction/threshold.js\";\nimport {\n createToolOwnershipReassertion,\n FabricToolLifecycle,\n FabricToolOwnership,\n ownsFabricToolSource,\n} from \"./core/tool-ownership.js\";\nimport {\n expandSkillDirMarkersForRead,\n expandSkillDirMarkersInSkillBlock,\n} from \"./core/skill-dir.js\";\nimport { coreOverridePromptGuidance } from \"./core/core-override-guidance.js\";\nimport { OMP_CORE_TOOL_NAMES } from \"./core/omp-tools.js\";\nimport {\n fabricExecutionKernelGuidance,\n defaultFabricExecutionGuidance,\n fabricSchemaGuidance,\n extensionToolRosterGuidance,\n} from \"./core/system-guidance.js\";\nimport {\n FABRIC_EXECUTION_GUIDANCE_SLOT,\n resolveFabricModelGuidance,\n} from \"./components/model-guidance.js\";\nimport {\n activeSkills,\n listableSkills,\n restoreSkillsForFullCodePrompt,\n} from \"./core/skill-prompt.js\";\nimport {\n formatProxyContractReminder,\n PROXY_CONTRACT_CUSTOM_TYPE,\n ProxyContractLedger,\n proxyContractMentionsInSkills,\n rewritableHiddenCapturedToolNames,\n} from \"./core/proxy-contract.js\";\nimport {\n FabricDirectToolApproval,\n mergeFabricApprovalUsage,\n} from \"./core/direct-tool-approval.js\";\nimport { buildSkillReferenceGuidance } from \"./core/skill-references.js\";\nimport { createFabricExecTool } from \"./fabric-exec-tool.js\";\nimport { FabricState } from \"./fabric-state.js\";\nimport { classifyToolResult } from \"./repairs/classify.js\";\nimport { getActiveRepairCompiler } from \"./repairs/active.js\";\nimport { ompHostCompatibilityWarning } from \"./host-compatibility.js\";\nimport { scheduleFabricUpdateCheck } from \"./update/check.js\";\nimport {\n FABRIC_COMPONENT_REGISTER_EVENT,\n FABRIC_PROVIDER_REGISTER_EVENT,\n type FabricComponentRegistration,\n type FabricProviderRegistration,\n} from \"./protocol.js\";\nimport type { AgentToolResultMessage } from \"./agents/types.js\";\nimport { FabricUiController } from \"./ui/controller.js\";\nimport { installFabricEscapeHalt } from \"./ui/escape-halt.js\";\nimport { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { configureHighlighting } from \"./ui/highlight.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { truncateMiddle } from \"./util.js\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Absolute path to the Fabric skills bundled with this extension. Resolved\n// relative to the extension entry so it works both in development (src/) and\n// in an installed package (dist/). Contributed via resources_discover so child\n// OMP processes that load Fabric with -e (agents and actors) discover the\n// same fabric-exec / fabric-advisor / fabric-council skill references as the\n// main agent, which gets them through the package manifest.\nconst FABRIC_EXTENSION_ENTRY_PATH = path.resolve(fileURLToPath(import.meta.url));\nconst FABRIC_ENTRY_DIR = path.dirname(FABRIC_EXTENSION_ENTRY_PATH);\nconst FABRIC_RUNTIME_PATHS = {\n extension: FABRIC_EXTENSION_ENTRY_PATH,\n worker: path.join(FABRIC_ENTRY_DIR, \"worker.js\"),\n residentHost: path.join(FABRIC_ENTRY_DIR, \"residency\", \"launcher.js\"),\n skills: path.resolve(FABRIC_ENTRY_DIR, \"..\", \"skills\"),\n};\nconst FABRIC_SKILLS_DIR = FABRIC_RUNTIME_PATHS.skills;\n\nconst componentRegistrationFrom = (\n value: unknown,\n): FabricComponentRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricComponentRegistration>;\n const component = registration.component;\n if (\n registration.version !== 1 ||\n typeof component !== \"object\" ||\n component === null ||\n typeof component.name !== \"string\" ||\n typeof component.activate !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricComponentRegistration;\n};\n\nconst registrationFrom = (value: unknown): FabricProviderRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricProviderRegistration>;\n const provider = registration.provider;\n if (\n registration.version !== 1 ||\n typeof provider !== \"object\" ||\n provider === null ||\n typeof provider.name !== \"string\" ||\n typeof provider.description !== \"string\" ||\n typeof provider.list !== \"function\" ||\n typeof provider.describe !== \"function\" ||\n typeof provider.invoke !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricProviderRegistration;\n};\n\nconst SKILL_REFERENCE_CUSTOM_TYPE = \"omp-fabric-skill-reference\";\n\nexport default async function ompFabric(omp: ExtensionAPI): Promise<void> {\n const codePreviewSettings = defaultCodePreviewSettings();\n const decorateShell: FabricToolShellDecorator = withCodePreviewShell;\n let compatibilityWarningShown = false;\n let updateCheckStarted = false;\n configureHighlighting(\n codePreviewSettings.shikiTheme,\n codePreviewSettings.syntaxHighlighting,\n );\n const capturedTools = new CapturedToolCatalog();\n const proxyContract = new ProxyContractLedger();\n const state = new FabricState(omp, capturedTools, {\n paths: FABRIC_RUNTIME_PATHS,\n lcmContext: () => lcmRuntime?.memoryContext(),\n });\n const directToolApproval = new FabricDirectToolApproval(\n omp,\n () => state.config,\n state.sessionApprovals,\n );\n const pendingHandoffs = new Map<string, PendingFabricHandoff>();\n let lcmRuntime: LcmRuntime | undefined;\n let lcmCwd: string | undefined;\n let lcmProjectKey: string | undefined;\n const toolOwnership = new FabricToolOwnership(omp);\n const fabricUi = new FabricUiController(state, codePreviewSettings, {\n getToolDefinition: (name) => name === \"fabric_exec\" ? fabricTool : capturedTools.get(name)?.definition,\n getMessageRenderer: (type) => capturedTools.runner?.getMessageRenderer(type),\n });\n const toolDisplay = new FabricToolDisplayController();\n\n const capturePolicy = () => effectiveToolCaptureConfig(state.config);\n const fabricOwnsModelTools = (): boolean =>\n state.config.fullCodeMode || state.config.schema.mode === \"enforce\";\n const hiddenCapturedToolNames = (): Set<string> => {\n const policy = capturePolicy();\n const keep = new Set([...policy.keepVisible, ...policy.includeTools]);\n return new Set(\n capturedTools.list()\n .map((entry) => entry.name)\n .filter((name) => policy.hideFromModel && !keep.has(name) && !policy.excludeTools.includes(name)),\n );\n };\n const ownershipPolicy = () => {\n const policy = capturePolicy();\n return {\n fullCodeMode: state.config.fullCodeMode,\n schemaMode: state.config.schema.mode,\n includeTools: new Set(policy.includeTools),\n excludeTools: new Set(policy.excludeTools),\n };\n };\n const { reassert: reassertToolOwnership, schedule: scheduleOwnershipReassert } =\n createToolOwnershipReassertion({\n ready: () => state.cwd !== undefined,\n active: () => state.cwd !== undefined,\n hiddenNames: hiddenCapturedToolNames,\n apply: (hidden) => toolOwnership.apply(ownershipPolicy(), hidden),\n });\n\n const unsubscribeComponentRegistration = omp.events.on(\n FABRIC_COMPONENT_REGISTER_EVENT,\n (value: unknown) => {\n const registration = componentRegistrationFrom(value);\n if (!registration) throw new Error(\"Invalid OMP Fabric component registration\");\n state.registerExternalComponent(\n registration.component,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n const unsubscribeProviderRegistration = omp.events.on(\n FABRIC_PROVIDER_REGISTER_EVENT,\n (value: unknown) => {\n const registration = registrationFrom(value);\n if (!registration) throw new Error(\"Invalid OMP Fabric provider registration\");\n state.registerExternal(\n registration.provider,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n omp.on(\"resources_discover\", async () => {\n if (existsSync(FABRIC_SKILLS_DIR)) return { skillPaths: [FABRIC_SKILLS_DIR] };\n return {};\n });\n\n const fabricTool = createFabricExecTool(\n state,\n codePreviewSettings,\n pendingHandoffs,\n decorateShell,\n toolDisplay,\n );\n const refreshCodePreviewSettings = (): void => {\n Object.assign(codePreviewSettings, state.config.codePreview);\n configureHighlighting(\n codePreviewSettings.shikiTheme,\n codePreviewSettings.syntaxHighlighting,\n );\n };\n const fabricToolLifecycle = new FabricToolLifecycle(\n () => ownsFabricToolSource(omp.getAllTools(), FABRIC_EXTENSION_ENTRY_PATH),\n () => state.initialized ? state.execution.authorizer : undefined,\n () => state.initialized ? directToolApproval : undefined,\n );\n\n const inactiveCapturePolicy = {\n ...structuredClone(DEFAULT_FABRIC_CONFIG.capture),\n enabled: false,\n hideFromModel: false,\n };\n const toolCapture = await installRegisteredToolCapture({\n anchorDefinition: fabricTool,\n catalog: capturedTools,\n initialPolicy: inactiveCapturePolicy,\n onCatalogRefresh: () => {\n scheduleOwnershipReassert();\n },\n });\n omp.registerTool(fabricTool);\n const applyFabricMode = (): void => {\n capturedTools.markResumed();\n toolCapture.setPolicy(capturePolicy());\n omp.registerTool(fabricTool);\n toolOwnership.apply(ownershipPolicy(), hiddenCapturedToolNames());\n capturedTools.refresh();\n };\n const suspendToolCapture = (): void => {\n // Mark the suspension before the policy flip: setPolicy clears the\n // catalog, and the freeze must already be in effect when that clear\n // reaches derived-surface listeners.\n capturedTools.markSuspended();\n toolCapture.setPolicy(inactiveCapturePolicy);\n };\n\n // ESC stop-the-world: a lone Escape (debounced to ignore escape sequences\n // such as arrow keys) halts every persistent actor \u2014 aborting in-flight runs\n // and cancelling queued work \u2014 and arms a stop-the-world gate that freezes\n // host-event and mesh dispatch so the interrupted actors are not re-armed by\n // the interrupt's own turn_end / agent_end events. The gate lifts when the\n // user resumes by sending a new message (the \"input\" host event). Escape is\n // observed but not consumed, so OMP's native cancel-streaming still fires;\n // single ESC therefore stops the current turn and the advisor/supervisor\n // actors at once. Disabled when mesh/actors are off or ui.haltOnEscape is\n // false.\n let haltOnEscapeUnsubscribe: (() => void) | undefined;\n const uninstallHaltOnEscape = (): void => {\n haltOnEscapeUnsubscribe?.();\n haltOnEscapeUnsubscribe = undefined;\n };\n const installHaltOnEscape = (context: ExtensionContext): void => {\n uninstallHaltOnEscape();\n if (!state.config.ui.haltOnEscape || !state.config.mesh.enabled) return;\n haltOnEscapeUnsubscribe = installFabricEscapeHalt(context, {\n enabled: () => state.initialized && state.config.mesh.enabled && state.config.ui.haltOnEscape,\n ownsInput: () => fabricUi.ownsInput,\n halted: () => state.actors.halted,\n halt: () => state.actors.haltAll().halted,\n });\n };\n\n const refreshProxyLedger = (context: ExtensionContext): void => {\n proxyContract.restoreFromEntries(context.sessionManager?.getBranch?.() ?? []);\n };\n\n // alwaysRearm means always armed: every session opens with prewalk armed.\n // Config-health skips (no prewalk.model, gated modes) warn once per process\n // rather than on every session switch.\n let prewalkAutoArmNoticeShown = false;\n const autoArmPrewalk = async (context: ExtensionContext): Promise<void> => {\n const skipReason = await autoArmFabricPrewalk(state, context, omp);\n if (!skipReason || prewalkAutoArmNoticeShown || !context.hasUI) return;\n prewalkAutoArmNoticeShown = true;\n context.ui.notify(skipReason, \"warning\");\n };\n\n const cleanupActivationSideEffects = (): void => {\n uninstallHaltOnEscape();\n fabricUi.stop();\n };\n state.setActivationHook(async (context) => {\n refreshCodePreviewSettings();\n Object.assign(\n fabricTool,\n createFabricExecTool(state, codePreviewSettings, pendingHandoffs, decorateShell, toolDisplay),\n );\n await autoArmPrewalk(context);\n applyFabricMode();\n fabricUi.start(context);\n installHaltOnEscape(context);\n }, cleanupActivationSideEffects);\n\n // Continual entropy reduction runs off the interaction path. Session-tree\n // discovery and JSONL ingestion use async I/O, scoring yields in fixed trace\n // chunks, and durable stores acquire locks cooperatively. Turn hooks only\n // enqueue work; a pending turn coalesces to the newest context.\n let entropyEvidenceThisTurn = false;\n let entropyCompileInFlight: Promise<void> | undefined;\n let entropyCompilePending: EntropyCompileRequest | undefined;\n let entropyLastReview = \"\";\n let entropyLifecycleEpoch = 0;\n\n interface EntropyCompileRequest {\n context: ExtensionContext;\n delayMs: number;\n epoch: number;\n }\n\n const compileEntropyNow = async (\n context: ExtensionContext,\n epoch: number,\n ): Promise<void> => {\n const current = (): boolean =>\n epoch === entropyLifecycleEpoch && state.initialized && state.config.entropy.compile;\n if (!current()) return;\n const startedAt = performance.now();\n const agentDir = resolveAgentDir();\n const cwd = state.cwd ?? context.cwd;\n const repairs = entropyRepairRows(state.repairs.repairs);\n const [files, loaded, poolLoaded, snapshot] = await Promise.all([\n machineSessionFilesAsync(agentDir, cwd),\n loadCompiledSurfaceAsync(agentDir),\n loadObservationPoolAsync(agentDir),\n liveSurfaceSnapshot({ registry: state.registry, extensionContext: context, cwd }),\n ]);\n if (!current() || files.length === 0 || loaded.error || poolLoaded.error) return;\n const evidence = await sessionWindowEvidenceAsync(files);\n if (!current() || evidence.traces.length === 0) return;\n const mergedPool = await mergeObservationWindowAsync(\n poolLoaded.file,\n evidence.observationWindows,\n );\n await saveObservationPoolAsync(agentDir, mergedPool.file);\n if (!current()) return;\n const outcome = await compileEntropySurfaceAsync({\n traces: evidence.traces,\n surface: snapshot,\n repairs,\n valueObservations: poolToValueObservations(mergedPool.file),\n auditCalls: evidence.auditCalls,\n ...(loaded.file ? { artifact: loaded.file } : {}),\n });\n if (!current()) return;\n const review = outcome.proposals.filter(\n (proposal) => !(AUTO_APPLY_PROPOSAL_KINDS as readonly string[]).includes(proposal.kind),\n );\n const reviewKey = entropyReviewKey(review);\n const reviewChanged = reviewKey !== entropyLastReview;\n let compileNotified = false;\n if (outcome.status === \"compiled\" && outcome.artifact) {\n const saved = await saveCompiledSurfaceAsync(agentDir, outcome.artifact);\n if (saved.written && current()) {\n // Activate immediately: enforcement follows the background compile,\n // never waiting for the next session start. Provenance-only artifact\n // updates stay silent because they do not alter the live surface.\n setActiveCompiledSurface(outcome.artifact);\n if (compiledSurfaceEffectChanged(loaded.file, outcome.artifact) && context.hasUI) {\n context.ui.notify(\n formatEntropyCompileNotice({\n proposals: outcome.proposals,\n beforeScore: outcome.report.score,\n afterScore: outcome.after?.score ?? outcome.report.score,\n elapsedMs: performance.now() - startedAt,\n ...(reviewChanged && review.length > 0 ? { reviewCount: review.length } : {}),\n }),\n \"info\",\n );\n compileNotified = true;\n }\n }\n }\n if (epoch !== entropyLifecycleEpoch) return;\n if (reviewChanged) {\n entropyLastReview = reviewKey;\n if (review.length > 0 && !compileNotified && context.hasUI) {\n context.ui.notify(formatEntropyReviewNotice(review), \"info\");\n }\n }\n };\n\n const launchEntropyCompile = (request: EntropyCompileRequest): void => {\n const task = (async () => {\n try {\n if (request.delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, request.delayMs));\n }\n await compileEntropyNow(request.context, request.epoch);\n } catch (error) {\n console.warn(\n `[omp-fabric] entropy compile failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n })();\n entropyCompileInFlight = task;\n void task.finally(() => {\n if (entropyCompileInFlight !== task) return;\n entropyCompileInFlight = undefined;\n const pending = entropyCompilePending;\n entropyCompilePending = undefined;\n if (pending) launchEntropyCompile(pending);\n });\n };\n\n const scheduleEntropyCompile = (\n context: ExtensionContext,\n delayMs = 250,\n ): void => {\n const request = { context, delayMs, epoch: entropyLifecycleEpoch };\n if (entropyCompileInFlight) {\n entropyCompilePending = request;\n return;\n }\n launchEntropyCompile(request);\n };\n\n const settleEntropyCompiles = async (): Promise<void> => {\n while (entropyCompileInFlight) await entropyCompileInFlight;\n };\n\n omp.on(\"session_start\", async (_event, context) => {\n entropyLifecycleEpoch += 1;\n entropyEvidenceThisTurn = false;\n entropyCompilePending = undefined;\n entropyLastReview = \"\";\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n proxyContract.reset();\n refreshProxyLedger(context);\n if (!compatibilityWarningShown) {\n compatibilityWarningShown = true;\n const warning = ompHostCompatibilityWarning();\n if (warning) {\n console.warn(`[omp-fabric] ${warning}`);\n if (context.hasUI) context.ui.notify(warning, \"warning\");\n }\n }\n await state.bootstrap(context);\n const recordedCwd = context.sessionManager.getRecordedCwd?.() || context.cwd;\n const projectKey = canonicalProjectIdentity({ liveCwd: recordedCwd }).key;\n if (lcmRuntime && (lcmCwd !== context.cwd || lcmProjectKey !== projectKey || state.config.compaction.engine !== \"lcm\")) {\n await lcmRuntime.shutdown();\n lcmRuntime = undefined;\n lcmCwd = undefined;\n lcmProjectKey = undefined;\n }\n if (state.config.compaction.engine === \"lcm\" && !lcmRuntime) {\n lcmRuntime = new LcmRuntime(context, {\n ...(state.config.compaction.summaryModel ? { summaryModel: state.config.compaction.summaryModel } : {}),\n maxLeafEntries: state.config.compaction.lcmMaxLeafEntries,\n maxCondenseChildren: state.config.compaction.lcmMaxCondenseChildren,\n lcmMaxInputChars: state.config.compaction.lcmMaxInputChars,\n lcmMaxOutputTokens: state.config.compaction.lcmMaxOutputTokens,\n lcmMaxOutputChars: state.config.compaction.lcmMaxOutputChars,\n });\n lcmCwd = context.cwd;\n lcmProjectKey = lcmRuntime.projectKey;\n }\n if (state.config.compaction.engine === \"lcm\" && lcmRuntime) await lcmRuntime.reconcileSelectedSession();\n refreshCodePreviewSettings();\n applyFabricMode();\n if (!updateCheckStarted) {\n updateCheckStarted = true;\n void scheduleFabricUpdateCheck(context, {\n enabled: state.config.update.check,\n agentDir: resolveAgentDir(),\n });\n }\n if (state.shouldEagerlyActivate(context)) await state.ensure(context);\n });\n\n // Branch changes move the leaf: emitted echoes and spent reminder budget\n // must track it exactly. Rewind removes abandoned-branch residue.\n omp.on(\"session_tree\", async (_event, context) => {\n proxyContract.reset();\n refreshProxyLedger(context);\n // OMP emits session_tree before it clears and rebuilds the transcript:\n // drop card invalidators from abandoned branches so a later display-mode\n // switch only refreshes cards registered by the rebuilt active branch.\n toolDisplay.clear();\n return undefined;\n });\n\n omp.on(\"input\", async (event, context) => {\n if (!state.initialized) return;\n state.prewalk.observeTask(\n context.sessionManager.getSessionId(),\n event.text,\n );\n await state.publishHostLifecycle(\"omp.input\", event);\n });\n\n omp.on(\"agent_start\", async (event) => {\n if (state.initialized) await state.publishHostLifecycle(\"omp.agent_start\", event);\n });\n\n omp.on(\"turn_end\", async (event, context) => {\n // Speculation never crosses a turn boundary; registry.endInvocation already\n // dropped entries for completed fabric_exec runs, this catches turns where\n // the program never executed (type errors, aborts).\n if (state.initialized) state.resetSpeculation();\n if (state.initialized) await state.publishHostLifecycle(\"omp.turn_end\", event);\n // A turn with new action evidence only enqueues the background compiler;\n // the hook returns without scanning session files or waiting on a lock.\n if (entropyEvidenceThisTurn) {\n entropyEvidenceThisTurn = false;\n scheduleEntropyCompile(context);\n }\n });\n\n omp.on(\"agent_end\", async (event, context) => {\n if (event.willContinue === true) return;\n await lcmRuntime?.syncAndSchedule();\n if (!state.initialized) {\n await compactAtConfiguredThreshold(context, state.config);\n return;\n }\n const sessionId = context.sessionManager.getSessionId();\n const settledInPlace = await settleInPlacePrewalk(state.prewalk, omp, context, {\n compactOnReturn: state.config.prewalk.compactOnReturn,\n compact: state.compact,\n });\n if (!settledInPlace && state.prewalk.settleTask(sessionId)) {\n const status = state.prewalk.status();\n context.ui.setStatus(\n \"fabric-prewalk\",\n status.state === \"armed\" ? `armed \u2192 ${status.model}` : undefined,\n );\n }\n // Drift baselines track armed windows: re-anchor when still armed (a\n // re-arm starts each new window from the just-settled tree state), drop\n // once prewalk is no longer armed for this session.\n if (state.prewalk.status().state === \"armed\") {\n void state.prewalkDrift.captureBaseline(sessionId, context.cwd);\n } else {\n state.prewalkDrift.drop(sessionId);\n }\n // Keep the completed widget mounted until a newer Fabric run replaces it.\n // Removing rows at settle would pull the editor and latest chat content upward.\n // OMP's compact API is callback-based. Await the controller's Promise here\n // so ExtensionRunner does not finish this handler (and OMP does not publish\n // its public agent_end event) before compaction settles.\n await state.compact.maybeCommit(context);\n await compactAtConfiguredThreshold(context, state.config);\n await state.publishHostLifecycle(\"omp.agent_end\", event);\n });\n\n const speculationWarmup = new FabricSpeculationWarmup({\n enabled: () => {\n try {\n return state.config.speculation.enabled === true;\n } catch {\n return false;\n }\n },\n tap: () => state.speculationTap,\n activate: (context) => state.ensure(context),\n });\n\n // Speculative PTC: follow fabric_exec argument streaming and pre-launch\n // literal-argument read calls so their latency hides behind generation.\n omp.on(\"message_start\", () => {\n speculationWarmup.reset();\n state.speculationTap?.reset();\n });\n\n omp.on(\"message_update\", (event, context) => {\n speculationWarmup.handleMessageUpdate(event, context);\n });\n\n omp.on(\"tool_call\", (event, context) =>\n fabricToolLifecycle.toolCall(event, context));\n\n // The OMP host intentionally ignores `isError` returned by custom-tool\n // execute(). Repair the finalized outer result through official middleware.\n omp.on(\"tool_result\", (event) => fabricToolLifecycle.toolResult(event));\n\n omp.on(\"tool_result\", (event, context) => {\n if (event.toolName !== \"read\" || event.isError) return undefined;\n let changed = false;\n const content = event.content.map((part) => {\n if (part.type !== \"text\") return part;\n const text = expandSkillDirMarkersForRead(\n part.text,\n event.input,\n context.cwd,\n );\n if (text === part.text) return part;\n changed = true;\n return { ...part, text };\n });\n return changed ? { content } : undefined;\n });\n\n omp.on(\"message_end\", () => {\n lcmRuntime?.markDirty();\n });\n\n omp.on(\"message_end\", (event) => {\n if (event.message.role !== \"toolResult\") return;\n const message = event.message as AgentToolResultMessage & { usage?: Usage };\n const usage = directToolApproval.takeUsage(message.toolCallId);\n if (!usage) return;\n message.usage = mergeFabricApprovalUsage(message.usage, usage);\n });\n\n // message_end runs after all tool-result middleware and tool_execution_end but\n // before OMP persists the native toolResult or starts another model turn. That\n // is the complete outer fabric_exec boundary: fork the exact message, wait for\n // the child, then replace what Main sees while terminate prevents inference.\n omp.on(\"message_end\", async (event, context) => {\n if (event.message.role !== \"toolResult\") return;\n const pending = pendingHandoffs.get(event.message.toolCallId);\n if (!pending || event.message.toolName !== \"fabric_exec\") return;\n pendingHandoffs.delete(event.message.toolCallId);\n\n const outerToolResult = event.message as AgentToolResultMessage;\n const handoff = await state.runHandoffAtBoundary(\n pending,\n outerToolResult,\n context,\n );\n Object.assign(outerToolResult, handoff);\n });\n\n omp.on(\"tool_execution_end\", async (event, context) => {\n if (!state.initialized) return;\n if (event.toolName === \"fabric_exec\") entropyEvidenceThisTurn = true;\n state.noteMainActivity(context);\n if (event.isError) {\n const classified = classifyToolResult({\n toolName: event.toolName,\n isError: true,\n content: event.result,\n });\n const registryObserved =\n event.toolName === \"fabric_exec\" &&\n (classified?.stage === \"invocation_args\" ||\n classified?.stage === \"invocation_unknown_action\");\n if (classified && !registryObserved) {\n getActiveRepairCompiler()?.observe(classified);\n }\n state.dispatchHostEvent(\"tool_error\", event, context);\n await state.publishHostLifecycle(\"omp.tool_error\", event);\n }\n });\n\n omp.on(\"session_compact\", async (event, context) => {\n await lcmRuntime?.syncAndSchedule();\n if (!state.initialized) return;\n await state.publishHostLifecycle(\"omp.session_compact\", event);\n });\n\n // Deterministic, LLM-free compaction is registered unconditionally and is\n // active by default. The documented \"omp\" escape hatch returns early so\n // OMP's own summarization proceeds normally.\n registerCompactionHook(omp, {\n getEngine: () =>\n state.cwd\n ? state.config.compaction.engine\n : DEFAULT_FABRIC_CONFIG.compaction.engine,\n getTargetContextRatio: () =>\n state.cwd\n ? state.config.compaction.targetContextRatio\n : DEFAULT_FABRIC_CONFIG.compaction.targetContextRatio,\n lcm: {\n compact: (input) => lcmRuntime?.compact(input),\n },\n });\n\n omp.on(\"context\", (event, context) => {\n const sessionId = context.sessionManager.getSessionId();\n const continuation = filterPrewalkContinuationMessages(\n event.messages,\n (continuationId) => state.initialized &&\n state.prewalk.acceptContinuation(sessionId, continuationId),\n );\n let changed = continuation.changed;\n const messages = continuation.messages.map((message) => {\n if (message.role !== \"user\") return message;\n if (typeof message.content === \"string\") {\n const content = expandSkillDirMarkersInSkillBlock(message.content);\n if (content === message.content) return message;\n changed = true;\n return { ...message, content };\n }\n let messageChanged = false;\n const content = message.content.map((part) => {\n if (part.type !== \"text\") return part;\n const text = expandSkillDirMarkersInSkillBlock(part.text);\n if (text === part.text) return part;\n changed = true;\n messageChanged = true;\n return { ...part, text };\n });\n return messageChanged ? { ...message, content } : message;\n });\n return changed ? { messages } : undefined;\n });\n\n omp.on(\"before_agent_start\", async (event, context) => {\n const fullCodeMode = state.cwd\n ? state.config.fullCodeMode\n : DEFAULT_FABRIC_CONFIG.fullCodeMode;\n const schemaMode = state.cwd\n ? state.config.schema.mode\n : DEFAULT_FABRIC_CONFIG.schema.mode;\n reassertToolOwnership();\n const effectiveFullCodeMode = fullCodeMode || schemaMode === \"enforce\";\n if (!omp.getActiveTools().includes(\"fabric_exec\")) return;\n const skills = activeSkills();\n const captureSnapshot = state.cwd ? capturePolicy() : undefined;\n const systemPrompt = effectiveFullCodeMode\n ? restoreSkillsForFullCodePrompt(\n event.systemPrompt.join(\"\\n\"),\n listableSkills(skills),\n )\n : event.systemPrompt.join(\"\\n\");\n // OMP expands the invoked skill into the user message, but wrappers may\n // delegate by name. Resolve only explicit invocation lines so full code\n // mode preserves OMP's progressive skill loading without exposing read.\n // Turn-derived: delivered via the message channel (below), never the\n // system prompt, so the cached system prefix stays byte-stable.\n const skillReferenceGuidance = effectiveFullCodeMode\n ? buildSkillReferenceGuidance(event.prompt, skills)\n : undefined;\n const currentModel = context.model\n ? `${context.model.provider}/${context.model.id}`\n : undefined;\n const resolvedGuidance = resolveFabricModelGuidance(state.modelGuidance(), {\n ...(currentModel ? { model: currentModel } : {}),\n target: process.env.OMP_FABRIC_PARENT_RUN ? \"participant\" : \"main\",\n defaults: [{\n slot: FABRIC_EXECUTION_GUIDANCE_SLOT,\n content: defaultFabricExecutionGuidance(effectiveFullCodeMode),\n }],\n });\n const overrideGuidance = effectiveFullCodeMode\n ? coreOverridePromptGuidance(capturedTools).trim()\n : undefined;\n const extensionRoster = effectiveFullCodeMode\n ? extensionToolRosterGuidance(capturedTools.list(), new Set(OMP_CORE_TOOL_NAMES))\n : undefined;\n // Only turn-stable sections go into the system prompt. Anything derived\n // from the current prompt (skill references) rides\n // the message channel so provider prefix caches never cold-prefill.\n const guidance = [\n fabricExecutionKernelGuidance(effectiveFullCodeMode),\n resolvedGuidance.slotText,\n fabricSchemaGuidance(schemaMode),\n overrideGuidance,\n extensionRoster,\n resolvedGuidance.appendText,\n ].filter((section): section is string => Boolean(section)).join(\"\\n\\n\");\n // Turn-varying content (skill reference guidance) is delivered here as a\n // persistent message, not appended to the system prompt. Keeping the\n // system prompt byte-identical across turns is what lets provider prefix\n // caches (e.g. DeepSeek) stay warm.\n if (!skillReferenceGuidance) return {\n systemPrompt: [`${systemPrompt}\\n\\n${guidance}`],\n };\n return {\n systemPrompt: [`${systemPrompt}\\n\\n${guidance}`],\n message: {\n customType: SKILL_REFERENCE_CUSTOM_TYPE,\n content: skillReferenceGuidance,\n display: false,\n details: {},\n },\n };\n });\n\n // Ambient skill prose that names hidden captured tools is not user intent,\n // so the furnace strips it. This sidecar retargets the call site without\n // spending hint budget, echoing tokens, or burning ash.\n omp.on(\"before_agent_start\", (event) => {\n if (!omp.getActiveTools().includes(\"fabric_exec\")) return;\n const captureSnapshot = state.cwd ? capturePolicy() : undefined;\n if (\n !captureSnapshot?.enabled ||\n !captureSnapshot.hideFromModel ||\n !fabricOwnsModelTools()\n ) {\n return;\n }\n const names = rewritableHiddenCapturedToolNames(hiddenCapturedToolNames());\n if (names.length === 0) return;\n const mentioned = proxyContractMentionsInSkills(\n event.prompt,\n event.systemPrompt.join(\"\\n\"),\n names,\n );\n const fresh = proxyContract.take(mentioned);\n if (fresh.length === 0) return;\n return {\n message: {\n customType: PROXY_CONTRACT_CUSTOM_TYPE,\n content: formatProxyContractReminder(fresh),\n display: false,\n details: { names: fresh, origin: \"skill\" },\n },\n };\n });\n\n registerFabricActorHostEventObservers(omp, (eventName, event, context) => {\n if (!state.initialized) return;\n state.dispatchHostEvent(eventName, event, context);\n });\n\n omp.on(\"session_shutdown\", async (_event, context) => {\n // Queue the richest final window and let async I/O/cooperative scoring\n // finish before teardown; the TUI event loop remains responsive.\n if (entropyEvidenceThisTurn) {\n entropyEvidenceThisTurn = false;\n scheduleEntropyCompile(context, 0);\n }\n await settleEntropyCompiles();\n entropyLifecycleEpoch += 1;\n entropyCompilePending = undefined;\n unsubscribeComponentRegistration();\n unsubscribeProviderRegistration();\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n try {\n await lcmRuntime?.shutdown();\n lcmRuntime = undefined;\n lcmCwd = undefined;\n lcmProjectKey = undefined;\n await state.shutdown();\n } finally {\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n toolOwnership.release();\n fabricToolLifecycle.clear();\n toolCapture.dispose();\n }\n });\n\n // Turn-scoped invariant: even if another extension rewrote the active tool\n // set (e.g. a permission system filtering its allowlist at before_agent_start,\n // or a refresh that ran before Fabric's policy was active), captured tools\n // must not leak into the model's next turn.\n omp.on(\"before_agent_start\", () => {\n reassertToolOwnership();\n });\n\n registerFabricCommand(omp, {\n state,\n fabricUi,\n capturedTools,\n applyFabricMode,\n suspendToolCapture,\n refreshCodePreviewSettings,\n refreshToolDisplay: () => toolDisplay.refresh(),\n });\n}\n\nexport * from \"./audit/index.js\";\nexport * from \"./entropy/index.js\";\nexport * from \"./protocol.js\";\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { Theme, ToolDefinition, ToolRenderResultOptions } from \"@oh-my-pi/pi-coding-agent\";\nimport { Ellipsis } from \"@oh-my-pi/pi-tui\";\nimport {\n Container,\n Text,\n truncateToWidth,\n visibleWidth,\n type Component,\n} from \"@oh-my-pi/pi-tui\";\nimport { continueArcGroup } from \"./arc-group.js\";\n\ntype ToolCallBackgroundMode = \"on\" | \"border\" | \"off\";\ntype AnyTool = ToolDefinition;\n\nexport type FabricToolShellDecorator = <TTool extends AnyTool>(\n tool: TTool,\n options?: {\n mode?: ToolCallBackgroundMode;\n preserveSelfShell?: boolean;\n toolCallTiming?: boolean;\n },\n) => TTool;\n\nexport type PreviewRenderContext = {\n args: unknown;\n toolCallId: string;\n invalidate: () => void;\n lastComponent: Component | undefined;\n state: Record<string, unknown>;\n cwd: string;\n executionStarted: boolean;\n argsComplete: boolean;\n isPartial: boolean;\n expanded: boolean;\n showImages: boolean;\n isError: boolean;\n};\n\ntype TimingState = Record<string, unknown> & {\n codePreviewTimingStartedAt?: number;\n codePreviewTimingEndedAt?: number;\n codePreviewTimingInterval?: ReturnType<typeof setInterval>;\n codePreviewTimingOnlyRenderToken?: number;\n codePreviewTimingCallComponent?: Component;\n codePreviewTimingResultComponent?: Component;\n};\n\ntype BorderState = TimingState & {\n codePreviewBorderCallComponent?: Component;\n codePreviewBorderResultComponent?: Component;\n codePreviewBorderShell?: BorderedToolCall;\n codePreviewBorderTheme?: Theme;\n codePreviewBorderLastCallExecutionStarted?: boolean;\n codePreviewBorderLastCallPartial?: boolean;\n};\n\nconst timingState = (context: { state?: unknown } | undefined): TimingState | undefined =>\n context?.state as TimingState | undefined;\n\nconst isTimingOnlyRender = (state: TimingState | undefined): boolean =>\n state?.codePreviewTimingOnlyRenderToken !== undefined;\n\nconst unwrapTimingComponent = (component: Component | undefined): Component | undefined =>\n component instanceof TimingPreservedComponent ? component.component : component;\n\nconst clearTimingInterval = (state: TimingState): void => {\n if (!state.codePreviewTimingInterval) return;\n clearInterval(state.codePreviewTimingInterval);\n delete state.codePreviewTimingInterval;\n delete state.codePreviewTimingOnlyRenderToken;\n};\n\nconst ensureTimingInterval = (state: TimingState, invalidate: () => void): void => {\n state.codePreviewTimingInterval ??= setInterval(() => {\n const token = (state.codePreviewTimingOnlyRenderToken ?? 0) + 1;\n state.codePreviewTimingOnlyRenderToken = token;\n try {\n invalidate();\n } finally {\n queueMicrotask(() => {\n if (state.codePreviewTimingOnlyRenderToken === token) {\n delete state.codePreviewTimingOnlyRenderToken;\n }\n });\n }\n }, 100);\n};\n\nconst formatDuration = (milliseconds: number): string => {\n const ms = Math.max(0, Math.round(milliseconds));\n if (ms < 1_000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1_000).toFixed(1)}s`;\n const seconds = Math.round(ms / 1_000);\n const hours = Math.floor(seconds / 3_600);\n const minutes = Math.floor((seconds % 3_600) / 60);\n if (hours > 0) return `${hours}h ${minutes}m`;\n return `${minutes}m ${seconds % 60}s`;\n};\n\nconst updateTiming = (\n context: PreviewRenderContext,\n enabled: boolean,\n options: { animate?: boolean; formatLabel?: boolean } = {},\n): string | undefined => {\n const state = timingState(context);\n if (!state) return undefined;\n if (!enabled) {\n clearTimingInterval(state);\n return undefined;\n }\n if (\n context.executionStarted &&\n state.codePreviewTimingStartedAt === undefined &&\n context.isPartial !== false\n ) {\n state.codePreviewTimingStartedAt = Date.now();\n delete state.codePreviewTimingEndedAt;\n }\n const startedAt = state.codePreviewTimingStartedAt;\n if (startedAt === undefined) return undefined;\n if (context.isPartial && options.animate !== false) {\n ensureTimingInterval(state, context.invalidate);\n } else if (!context.isPartial) {\n state.codePreviewTimingEndedAt ??= Date.now();\n clearTimingInterval(state);\n }\n if (options.formatLabel === false) return undefined;\n const running = context.isPartial;\n const endedAt = running ? Date.now() : (state.codePreviewTimingEndedAt ?? Date.now());\n return `${running ? \"Elapsed\" : \"Took\"} ${formatDuration(endedAt - startedAt)}`;\n};\n\nclass TimingPreservedComponent implements Component {\n constructor(readonly component: Component, private readonly state: TimingState) {}\n render(width: number): readonly string[] {\n return this.component.render(width);\n }\n invalidate(): void {\n if (!isTimingOnlyRender(this.state)) this.component.invalidate?.();\n }\n}\n\nclass TimingFooter implements Component {\n constructor(\n private readonly component: Component,\n private readonly footer: string,\n private readonly state: TimingState,\n ) {}\n render(width: number): readonly string[] {\n return [\n ...continueArcGroup([...this.component.render(width)]),\n truncateToWidth(this.footer, width, \"\"),\n ];\n }\n invalidate(): void {\n if (!isTimingOnlyRender(this.state)) this.component.invalidate?.();\n }\n}\n\nconst renderTimedResult = (\n context: PreviewRenderContext,\n theme: Theme,\n render: (context: PreviewRenderContext) => Component,\n label: string | undefined,\n): Component => {\n const state = timingState(context);\n if (!state) return render(context);\n const reused = isTimingOnlyRender(state) ? state.codePreviewTimingResultComponent : undefined;\n const component = reused ?? render({\n ...context,\n lastComponent: unwrapTimingComponent(\n state.codePreviewTimingResultComponent ?? context.lastComponent,\n ),\n });\n state.codePreviewTimingResultComponent = component;\n return label\n ? new TimingFooter(component, theme.fg(\"muted\", `\u2570\u2500 ${label}`), state)\n : component;\n};\n\nconst borderState = (context: PreviewRenderContext): BorderState =>\n context.state as BorderState;\n\nconst shellStates = new WeakMap<object, BorderState>();\n\nconst shellStateFor = (key: unknown): BorderState => {\n const object = typeof key === \"object\" && key !== null ? key : shellStates;\n const existing = shellStates.get(object);\n if (existing) return existing;\n const created: BorderState = {};\n shellStates.set(object, created);\n return created;\n};\n\nconst isRenderComponent = (value: unknown): value is Component =>\n value !== null && typeof value === \"object\" &&\n typeof Reflect.get(value, \"render\") === \"function\";\n\nconst buildRenderContext = (\n args: unknown,\n options: ToolRenderResultOptions & { renderContext?: unknown },\n supplied: Record<string, unknown>,\n fallbackState: BorderState,\n): PreviewRenderContext => {\n const executionStarted = typeof supplied.executionStarted === \"boolean\"\n ? supplied.executionStarted\n : !options.isPartial;\n const argsComplete = typeof supplied.argsComplete === \"boolean\"\n ? supplied.argsComplete\n : !options.isPartial;\n const state = typeof supplied.state === \"object\" && supplied.state !== null\n ? supplied.state as BorderState\n : fallbackState;\n return {\n args,\n toolCallId: typeof supplied.toolCallId === \"string\" ? supplied.toolCallId : \"fabric_exec\",\n invalidate: typeof supplied.invalidate === \"function\"\n ? supplied.invalidate as () => void\n : () => undefined,\n lastComponent: isRenderComponent(supplied.lastComponent) ? supplied.lastComponent : undefined,\n state,\n cwd: typeof supplied.cwd === \"string\" ? supplied.cwd : process.cwd(),\n executionStarted,\n argsComplete,\n isPartial: options.isPartial,\n expanded: options.expanded,\n showImages: typeof supplied.showImages === \"boolean\" ? supplied.showImages : true,\n isError: supplied.isError === true,\n };\n};\n\nconst borderColor = (context: PreviewRenderContext): \"warning\" | \"success\" | \"error\" => {\n if (context.isError) return \"error\";\n return context.isPartial ? \"warning\" : \"success\";\n};\n\nclass BorderedToolCall implements Component {\n private callComponent: Component | undefined;\n private resultComponent: Component | undefined;\n private color: \"borderMuted\" | \"warning\" | \"success\" | \"error\" = \"borderMuted\";\n private timingLabel: string | undefined;\n private cachedWidth: number | undefined;\n private cachedRows: string[] | undefined;\n\n constructor(private readonly theme: Theme, private readonly state: TimingState) {}\n\n setCall(component: Component | undefined): void {\n this.callComponent = component;\n this.invalidateCache();\n }\n setResult(component: Component | undefined): void {\n this.resultComponent = component;\n this.invalidateCache();\n }\n setColor(color: typeof this.color): void {\n if (color === this.color) return;\n this.color = color;\n this.invalidateCache();\n }\n setTimingLabel(label: string | undefined): void {\n if (label === this.timingLabel) return;\n this.timingLabel = label;\n this.invalidateCache();\n }\n render(width: number): readonly string[] {\n if (width === this.cachedWidth && this.cachedRows) return this.cachedRows;\n const rows = this.renderUncached(width);\n this.cachedWidth = width;\n this.cachedRows = rows;\n return rows;\n }\n invalidate(): void {\n this.invalidateCache();\n if (isTimingOnlyRender(this.state)) return;\n this.callComponent?.invalidate?.();\n this.resultComponent?.invalidate?.();\n }\n private invalidateCache(): void {\n this.cachedWidth = undefined;\n this.cachedRows = undefined;\n }\n private renderUncached(width: number): string[] {\n const body = [\n ...(this.callComponent?.render(Math.max(1, width - 4)) ?? []),\n ...(this.resultComponent?.render(Math.max(1, width - 4)) ?? []),\n ];\n if (width < 4) return body;\n const innerWidth = width - 4;\n const border = (value: string) => this.theme.fg(this.color, value);\n const label = this.timingLabel ? ` ${this.theme.fg(\"muted\", this.timingLabel)} ` : \"\";\n const labelWidth = visibleWidth(label);\n const top = labelWidth > 0 && labelWidth <= width - 2\n ? `${border(\"\u256D\")}${border(\"\u2500\".repeat(width - 2 - labelWidth))}${label}${border(\"\u256E\")}`\n : border(`\u256D${\"\u2500\".repeat(width - 2)}\u256E`);\n return [\n top,\n ...body.map((line) => this.frameLine(line, innerWidth, border)),\n border(`\u2570${\"\u2500\".repeat(width - 2)}\u256F`),\n ];\n }\n private frameLine(\n line: string,\n innerWidth: number,\n border: (value: string) => string,\n ): string {\n const text = truncateToWidth(line, innerWidth, \"\");\n const padding = \" \".repeat(Math.max(0, innerWidth - visibleWidth(text)));\n const hasDiffBackground = /^\\x1b\\[48;2;\\d+;\\d+;\\d+m/.test(text);\n return hasDiffBackground\n ? `${border(\"\u2502\")} ${text}${padding} \\x1b[49m${border(\"\u2502\")}\\x1b[0m`\n : `${border(\"\u2502\")} ${text}\\x1b[0m${padding} ${border(\"\u2502\")}`;\n }\n}\n\nconst shouldRenderResultSeparately = (state: BorderState, isPartial: boolean): boolean =>\n state.codePreviewBorderLastCallPartial === undefined ||\n (state.codePreviewBorderLastCallPartial !== isPartial &&\n state.codePreviewBorderLastCallExecutionStarted === true);\n\nexport const withCodePreviewShell: FabricToolShellDecorator = <TTool extends AnyTool>(\n tool: TTool,\n options: {\n mode?: ToolCallBackgroundMode;\n preserveSelfShell?: boolean;\n toolCallTiming?: boolean;\n } = {},\n): TTool => {\n const mode = options.mode ?? \"on\";\n const timingEnabled = options.toolCallTiming ?? true;\n if ((options.preserveSelfShell ?? true) && (tool as AnyTool & { renderShell?: string }).renderShell === \"self\") return tool;\n const originalRenderCall = tool.renderCall;\n const originalRenderResult = tool.renderResult;\n const renderCall = (args: unknown, options: ToolRenderResultOptions, theme: Theme, context: PreviewRenderContext): Component => {\n const renderOptions = { ...options, renderContext: context };\n return originalRenderCall\n ? originalRenderCall.call(tool, args as never, renderOptions, theme)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n };\n const renderResult = (\n result: unknown,\n resultOptions: unknown,\n theme: Theme,\n context: PreviewRenderContext,\n ): Component => {\n const renderOptions = { ...(resultOptions as ToolRenderResultOptions), renderContext: context };\n return originalRenderResult\n ? originalRenderResult.call(tool, result as never, renderOptions, theme)\n : new Container();\n };\n\n return {\n ...tool,\n renderShell: mode === \"on\" ? \"default\" : \"self\",\n renderCall(args, options, theme) {\n const renderOptions = options as ToolRenderResultOptions & { renderContext?: Record<string, unknown> };\n if (!renderOptions) {\n return originalRenderCall\n ? originalRenderCall.call(tool, args, { expanded: false, isPartial: false }, theme)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n }\n const supplied = renderOptions.renderContext && typeof renderOptions.renderContext === \"object\"\n ? renderOptions.renderContext\n : (renderOptions as unknown as Record<string, unknown>);\n const context = buildRenderContext(\n args,\n renderOptions,\n supplied,\n shellStateFor(renderOptions),\n );\n if (mode !== \"border\") {\n const state = timingState(context);\n if (\n context.isPartial &&\n isTimingOnlyRender(state) &&\n state?.codePreviewTimingCallComponent\n ) {\n updateTiming(context, timingEnabled, { animate: false, formatLabel: false });\n return state.codePreviewTimingCallComponent;\n }\n const component = renderCall(args, { expanded: context.expanded, isPartial: context.isPartial }, theme, {\n ...context,\n lastComponent: unwrapTimingComponent(context.lastComponent),\n });\n const wrapped = state\n ? new TimingPreservedComponent(component, state)\n : component;\n if (state) state.codePreviewTimingCallComponent = wrapped;\n updateTiming(context, timingEnabled, { animate: false, formatLabel: false });\n return wrapped;\n }\n\n const state = borderState(context);\n const timingOnly = context.isPartial && isTimingOnlyRender(state);\n const component = timingOnly && state.codePreviewBorderCallComponent\n ? state.codePreviewBorderCallComponent\n : renderCall(args, { expanded: context.expanded, isPartial: context.isPartial }, theme, {\n ...context,\n lastComponent: state.codePreviewBorderCallComponent,\n });\n const label = updateTiming(context, timingEnabled);\n state.codePreviewBorderCallComponent = component;\n state.codePreviewBorderLastCallExecutionStarted = context.executionStarted;\n state.codePreviewBorderLastCallPartial = context.isPartial;\n const shell = state.codePreviewBorderShell instanceof BorderedToolCall &&\n state.codePreviewBorderTheme === theme\n ? state.codePreviewBorderShell\n : new BorderedToolCall(theme, state);\n shell.setCall(component);\n shell.setResult(state.codePreviewBorderResultComponent);\n shell.setColor(borderColor(context));\n shell.setTimingLabel(label);\n state.codePreviewBorderShell = shell;\n state.codePreviewBorderTheme = theme;\n return shell;\n },\n renderResult(result, resultOptions, theme) {\n const renderOptions = (resultOptions ?? {}) as ToolRenderResultOptions & { renderContext?: Record<string, unknown> };\n const supplied = renderOptions.renderContext && typeof renderOptions.renderContext === \"object\"\n ? renderOptions.renderContext\n : (renderOptions as unknown as Record<string, unknown>);\n const context = buildRenderContext(\n result,\n renderOptions,\n supplied,\n shellStateFor(renderOptions),\n );\n const optionsRecord = resultOptions as { isPartial: boolean };\n const label = updateTiming(context, timingEnabled);\n if (mode !== \"border\") {\n return renderTimedResult(\n context,\n theme,\n (next) => renderResult(result, resultOptions, theme, next),\n label,\n );\n }\n\n const state = borderState(context);\n const timingOnly = context.isPartial && isTimingOnlyRender(state);\n const component = timingOnly && state.codePreviewBorderResultComponent\n ? state.codePreviewBorderResultComponent\n : renderResult(result, resultOptions, theme, {\n ...context,\n lastComponent: state.codePreviewBorderResultComponent,\n });\n state.codePreviewBorderResultComponent = component;\n const shell = state.codePreviewBorderShell instanceof BorderedToolCall &&\n state.codePreviewBorderTheme === theme\n ? state.codePreviewBorderShell\n : new BorderedToolCall(theme, state);\n shell.setCall(state.codePreviewBorderCallComponent);\n shell.setResult(component);\n shell.setColor(borderColor(context));\n shell.setTimingLabel(label);\n state.codePreviewBorderShell = shell;\n state.codePreviewBorderTheme = theme;\n return shouldRenderResultSeparately(state, optionsRecord.isPartial)\n ? component\n : new Container();\n },\n } as TTool;\n};\n", "import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionEvent,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport {\n FABRIC_ACTOR_OMP_HOST_EVENTS,\n type FabricActorOmpHostEvent,\n} from \"./types.js\";\n\nexport type FabricActorHostEventObserver = (\n eventName: typeof FABRIC_ACTOR_OMP_HOST_EVENTS[number],\n event: ExtensionEvent,\n context: ExtensionContext,\n) => void;\n\ninterface ObservableExtensionApi {\n on(\n event: typeof FABRIC_ACTOR_OMP_HOST_EVENTS[number],\n handler: (event: ExtensionEvent, context: ExtensionContext) => void,\n ): void;\n}\n\nexport const registerFabricActorHostEventObservers = (\n omp: ExtensionAPI,\n observer: FabricActorHostEventObserver,\n): void => {\n const observable = omp as unknown as ObservableExtensionApi;\n for (const eventName of FABRIC_ACTOR_OMP_HOST_EVENTS) {\n observable.on(eventName, (event, context) => observer(eventName, event, context));\n }\n};\n", "import { existsSync, readdirSync, readFileSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type {\n ExtensionRunner,\n RegisteredTool,\n ToolDefinition,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport { DEFAULT_FABRIC_CONFIG, type FabricToolCaptureConfig } from \"../config.js\";\nimport { CapturedToolCatalog } from \"./catalog.js\";\n\ntype ToolCaptureListener = (tools: RegisteredTool[], runner: ExtensionRunner) => RegisteredTool[];\n\ninterface ToolCaptureHub {\n listeners: Set<ToolCaptureListener>;\n}\n\nexport interface RegisteredToolCaptureController {\n setPolicy(config: FabricToolCaptureConfig): void;\n dispose(): void;\n}\n\nexport interface RegisteredToolCaptureOptions {\n anchorDefinition: ToolDefinition<any, any>;\n catalog: CapturedToolCatalog;\n initialPolicy?: FabricToolCaptureConfig;\n runner?: ExtensionRunner;\n onCatalogRefresh?: () => void;\n}\n\nconst HUB_SYMBOL = Symbol.for(\"omp-fabric.registered-tool-capture.v1\");\nconst ANCHOR_SYMBOL = Symbol.for(\"omp-fabric.registered-tool-anchor.v1\");\n\nconst definitionDelegatesTo = (\n definition: ToolDefinition<any, any>,\n target: ToolDefinition<any, any>,\n): boolean => {\n let current: object | null = definition;\n while (current) {\n if (current === target) return true;\n current = Object.getPrototypeOf(current) as object | null;\n }\n return false;\n};\n\nconst clonePolicy = (config: FabricToolCaptureConfig): FabricToolCaptureConfig => ({\n enabled: config.enabled,\n hideFromModel: config.hideFromModel,\n keepVisible: [...config.keepVisible],\n includeTools: [...config.includeTools],\n excludeTools: [...config.excludeTools],\n defaultRisk: config.defaultRisk,\n risks: { ...config.risks },\n});\n\ntype ExtensionRunnerConstructor = {\n prototype: ExtensionRunner;\n};\n\nconst isExtensionRunnerConstructor = (value: unknown): value is ExtensionRunnerConstructor =>\n typeof value === \"function\" &&\n typeof (value as { prototype?: unknown }).prototype === \"object\" &&\n typeof ((value as { prototype: Record<string, unknown> }).prototype).getAllRegisteredTools ===\n \"function\";\n\n// The bundled OMP CLI loads from dist/bundle/cli.js, whose rollup chunks carry\n// their own ExtensionRunner class identity \u2014 the library-level patch alone\n// never fires because the live host runner is an instance of the bundle's copy.\n// Importing each chunk inside the running CLI is a Node module-cache hit, so\n// scanning the bundle is free and yields the class the host actually runs.\nexport const bundleExtensionRunnerConstructors = async (\n bundleDir: string,\n): Promise<ExtensionRunnerConstructor[]> => {\n const chunksDir = path.join(bundleDir, \"chunks\");\n if (!existsSync(chunksDir)) return [];\n let files: string[];\n try {\n files = readdirSync(chunksDir);\n } catch {\n return [];\n }\n const constructors = new Set<ExtensionRunnerConstructor>();\n for (const file of files) {\n if (!file.endsWith(\".js\")) continue;\n try {\n const module = (await import(pathToFileURL(path.join(chunksDir, file)).href)) as Record<\n string,\n unknown\n >;\n for (const exported of Object.values(module)) {\n if (isExtensionRunnerConstructor(exported)) constructors.add(exported);\n }\n } catch { /* chunk not importable in this realm (worker entries, natives); skip */ }\n }\n return [...constructors];\n};\n\nconst captureHub = (Runner: ExtensionRunnerConstructor): ToolCaptureHub => {\n const prototype = Runner.prototype as ExtensionRunner & Record<PropertyKey, unknown>;\n const existing = prototype[HUB_SYMBOL] as ToolCaptureHub | undefined;\n if (existing) return existing;\n\n const original = prototype.getAllRegisteredTools;\n if (typeof original !== \"function\") {\n throw new Error(\"OMP Fabric could not intercept ExtensionRunner.getAllRegisteredTools\");\n }\n\n const hub: ToolCaptureHub = { listeners: new Set() };\n Object.defineProperty(prototype, HUB_SYMBOL, {\n value: hub,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n prototype.getAllRegisteredTools = function getFabricVisibleTools(): RegisteredTool[] {\n let tools = original.call(this);\n for (const listener of [...hub.listeners]) tools = listener(tools, this);\n return tools;\n };\n return hub;\n};\nconst captureRunner = (runner: ExtensionRunner): ToolCaptureHub => {\n const target = runner as ExtensionRunner & Record<PropertyKey, unknown>;\n const existing = target[HUB_SYMBOL] as ToolCaptureHub | undefined;\n if (existing) return existing;\n const original = target.getAllRegisteredTools;\n if (typeof original !== \"function\") throw new Error(\"OMP Fabric capture runner is missing getAllRegisteredTools\");\n const hub: ToolCaptureHub = { listeners: new Set() };\n Object.defineProperty(target, HUB_SYMBOL, { value: hub, configurable: false });\n target.getAllRegisteredTools = function getFabricVisibleTools(): RegisteredTool[] {\n let tools = original.call(this);\n for (const listener of [...hub.listeners]) tools = listener(tools, this);\n return tools;\n };\n return hub;\n};\n\nconst hostPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n let directory: string;\n try {\n directory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n while (directory !== path.dirname(directory)) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (manifest.name === \"@oh-my-pi/pi-coding-agent\") return directory;\n } catch { /* unreadable or invalid manifest; keep searching */ }\n }\n directory = path.dirname(directory);\n }\n return undefined;\n};\n\nconst extensionRunnerConstructors = async (): Promise<ExtensionRunnerConstructor[]> => {\n const constructors = new Set<ExtensionRunnerConstructor>();\n const packageRoots = new Set(\n [process.env.PI_PACKAGE_DIR, hostPackageRoot()].filter(\n (root): root is string => typeof root === \"string\" && Boolean(root),\n ),\n );\n for (const packageRoot of packageRoots) {\n try {\n const hostEntry = path.join(packageRoot, \"dist\", \"index.js\");\n const hostModule = (await import(pathToFileURL(hostEntry).href)) as {\n ExtensionRunner?: ExtensionRunnerConstructor;\n };\n if (hostModule.ExtensionRunner) constructors.add(hostModule.ExtensionRunner);\n } catch { /* host entry not importable; skip */ }\n for (const Runner of await bundleExtensionRunnerConstructors(\n path.join(packageRoot, \"dist\", \"bundle\"),\n )) {\n constructors.add(Runner);\n }\n }\n if (constructors.size === 0) {\n // The host does not advertise its package directory (tests, embeds,\n // future layouts): fall back to resolving it in this module realm.\n try {\n const hostModule = (await import(\"@oh-my-pi/pi-coding-agent/extensibility/extensions/runner\")) as {\n ExtensionRunner?: ExtensionRunnerConstructor;\n };\n if (hostModule.ExtensionRunner) constructors.add(hostModule.ExtensionRunner);\n } catch { /* host unavailable in this realm; tool capture stays inert */ }\n }\n return [...constructors];\n};\n\nexport const installRegisteredToolCapture = async (\n options: RegisteredToolCaptureOptions,\n): Promise<RegisteredToolCaptureController> => {\n const hubs = options.runner\n ? [captureRunner(options.runner)]\n : (await extensionRunnerConstructors()).map(captureHub);\n const anchorToken = {};\n Object.defineProperty(options.anchorDefinition, ANCHOR_SYMBOL, {\n value: anchorToken,\n configurable: false,\n enumerable: true,\n writable: false,\n });\n let policy = clonePolicy(options.initialPolicy ?? DEFAULT_FABRIC_CONFIG.capture);\n let disposed = false;\n\n const listener: ToolCaptureListener = (tools, runner) => {\n if (disposed) return tools;\n const anchor = tools.find(\n (tool) =>\n (tool.definition as unknown as Record<PropertyKey, unknown>)[ANCHOR_SYMBOL] ===\n anchorToken || definitionDelegatesTo(tool.definition, options.anchorDefinition),\n );\n if (!anchor) return tools;\n\n options.catalog.replace(tools, runner, policy, anchor.extensionPath);\n options.onCatalogRefresh?.();\n return tools;\n };\n\n for (const hub of hubs) hub.listeners.add(listener);\n return {\n setPolicy(config) {\n policy = clonePolicy(config);\n if (!policy.enabled) options.catalog.clear();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n for (const hub of hubs) hub.listeners.delete(listener);\n options.catalog.clear();\n },\n };\n};\n", "import { type ExtensionAPI, type ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { AutocompleteItem } from \"@oh-my-pi/pi-tui\";\nimport type { CapturedToolCatalog } from \"../capture/catalog.js\";\nimport type { FabricActorHostEvent } from \"../actors/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport { resolveAgentDir } from \"../core/agent-dir.js\";\nimport { saveFabricConfig } from \"../config.js\";\nimport { armFabricPrewalkSession } from \"../prewalk/arm.js\";\nimport { truncateMiddle } from \"../util.js\";\nimport type { FabricUiController } from \"../ui/controller.js\";\nimport { FABRIC_CONVERSATION_SHORTCUT } from \"../ui/conversation-shortcut.js\";\nimport { safeText } from \"../ui/format.js\";\nimport {\n FABRIC_PEER_AWAIT_SETTLE_EVENT,\n FABRIC_PEER_CARDS_EVENT,\n FABRIC_PREWALK_REQUEST_EVENT,\n readFabricPeerAwaitSettleRequestV1,\n readFabricPeerCardsRequestV1,\n readFabricPrewalkRequestV1,\n type FabricPrewalkRequestResultV1,\n} from \"../protocol.js\";\nimport { awaitPeerSettle, buildPeerCards } from \"../topology/peer-settle.js\";\nimport type { RepairStatus } from \"../repairs/types.js\";\nimport { ENTROPY_METRIC_VERSION } from \"../entropy/types.js\";\nimport {\n entropySurfaceHash,\n liveSurfaceSnapshot,\n surfaceFreedomReport,\n} from \"../entropy/surface.js\";\nimport {\n machineSessionFilesAsync,\n measureSessionCorpusAsync,\n projectSessionFilesAsync,\n sessionWindowEvidenceAsync,\n} from \"../entropy/sessions.js\";\nimport { measureEntropyAsync } from \"../entropy/meter.js\";\nimport { entropyRepairRows } from \"../entropy/corpus.js\";\nimport { entropyReviewSignals, formatEntropyReviewSignal } from \"../entropy/compiler.js\";\nimport { loadObservationPoolAsync } from \"../entropy/pool-store.js\";\nimport { mergeObservationWindowAsync, poolToValueObservations } from \"../entropy/pool.js\";\nimport { applyCompiledSurface } from \"../entropy/compiled-surface.js\";\nimport {\n loadCompiledSurfaceAsync,\n parseCompiledSurfaceArtifact,\n saveCompiledSurfaceAsync,\n} from \"../entropy/compiled-store.js\";\nimport {\n formatEntropyCommandHints,\n formatEntropyMetric,\n} from \"../entropy/presentation.js\";\nimport { mergeCompiledSurfaces } from \"../entropy/compiled-surface.js\";\nimport { setActiveCompiledSurface } from \"../entropy/active.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\ninterface FabricCommandDeps {\n state: FabricState;\n fabricUi: FabricUiController;\n capturedTools: CapturedToolCatalog;\n applyFabricMode: () => void;\n suspendToolCapture: () => void;\n autoArmPrewalk?: (context: ExtensionContext) => Promise<void>;\n refreshCodePreviewSettings?: () => void;\n refreshToolDisplay?: () => void;\n}\n\nconst extractContentText = (content: unknown): string => {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part !== \"object\" || part === null) return \"\";\n const p = part as Record<string, unknown>;\n return typeof p.text === \"string\" ? p.text : typeof p.type === \"string\" ? p.type : \"\";\n })\n .filter(Boolean)\n .join(\" \");\n }\n return \"\";\n};\n\nconst summarizeLogLine = (entry: unknown): string => {\n if (typeof entry !== \"object\" || entry === null) return truncateMiddle(String(entry), 200);\n const record = entry as Record<string, unknown>;\n const type = typeof record.type === \"string\" ? record.type : undefined;\n const tool = typeof record.toolName === \"string\" ? record.toolName : undefined;\n // OMP session lines and worker message_end both wrap a { role, content } message.\n const msg = record.message;\n if (typeof msg === \"object\" && msg !== null && !Array.isArray(msg)) {\n const m = msg as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"message\";\n const model = typeof m.model === \"string\" ? m.model : undefined;\n const text = extractContentText(m.content);\n const body = (text || JSON.stringify(m)).replace(/\\s+/g, \" \");\n return `${role}${model ? ` [${model}]` : \"\"}: ${truncateMiddle(body, 160)}`;\n }\n if (type) {\n const bits = [type];\n if (tool) bits.push(tool);\n const model = typeof record.modelId === \"string\" ? record.modelId : undefined;\n const provider = typeof record.provider === \"string\" && !model ? record.provider : undefined;\n if (provider) bits.push(provider);\n if (model) bits.push(model);\n return bits.join(\" \");\n }\n return truncateMiddle(JSON.stringify(record), 160);\n};\n\nconst resolvePrewalkModel = async (\n state: FabricState,\n context: ExtensionContext,\n): Promise<string | undefined> => {\n const configured = state.config.prewalk.model?.trim();\n if (configured) {\n if (configured.includes(\"/\")) return configured;\n context.ui.notify(\n \"prewalk.model must use provider/model form.\",\n \"error\",\n );\n return undefined;\n }\n let models: Array<{ provider: string; id: string; name?: string }> = [];\n try {\n models = context.modelRegistry.getAvailable();\n } catch {\n models = [];\n }\n const keys = models\n .map((model) => `${model.provider}/${model.id}`)\n .sort((left, right) => left.localeCompare(right));\n if (keys.length === 0) {\n context.ui.notify(\n \"Prewalk needs an explicit OMP executor model. Configure prewalk.model in /fabric settings.\",\n \"error\",\n );\n return undefined;\n }\n if (!context.hasUI) {\n context.ui.notify(\n \"Prewalk needs prewalk.model in non-interactive mode.\",\n \"error\",\n );\n return undefined;\n }\n return context.ui.select(\"Prewalk executor model\", keys);\n};\n\nconst armPrewalk = async (\n state: FabricState,\n context: ExtensionContext,\n omp: ExtensionAPI,\n task = \"\",\n): Promise<FabricPrewalkRequestResultV1> => {\n if (state.config.prewalk.enabled === false) {\n const error = \"Fabric prewalk is disabled; re-enable with /fabric prewalk --enable or /fabric settings.\";\n context.ui.notify(error, \"error\");\n return { ok: false, error };\n }\n if (!state.config.fullCodeMode || state.config.schema.mode === \"enforce\") {\n const error = \"Fabric prewalk requires full code mode and Schema enforce mode disabled.\";\n context.ui.notify(error, \"error\");\n return { ok: false, error };\n }\n if (state.config.prewalk.mode === \"trajectory\" && !state.config.agents.enabled) {\n const error = \"Trajectory prewalk requires enabled agents. Choose in-place mode or enable agents.\";\n context.ui.notify(error, \"error\");\n return { ok: false, error };\n }\n const model = await resolvePrewalkModel(state, context);\n if (!model) return { ok: false, error: \"Fabric prewalk was not armed.\" };\n\n await armFabricPrewalkSession(state, context, omp, {\n model,\n ...(task ? { task } : {}),\n });\n const modeLabel =\n state.config.prewalk.mode === \"in-place\"\n ? \"Main will continue in place\"\n : \"the trajectory will move to a visible child executor\";\n context.ui.notify(\n task\n ? `Fabric prewalk armed for the next matching Fabric boundary; ${modeLabel} with ${model}${state.config.prewalk.alwaysRearm ? \"; always re-arm enabled\" : \"\"}`\n : `Fabric prewalk armed for the next task; ${modeLabel} with ${model}${state.config.prewalk.alwaysRearm ? \"; always re-arm enabled\" : \"\"}`,\n \"info\",\n );\n if (task) omp.sendUserMessage(task);\n return { ok: true };\n};\n\nexport function registerFabricCommand(omp: ExtensionAPI, deps: FabricCommandDeps): void {\n const { state, fabricUi, capturedTools, applyFabricMode, suspendToolCapture } = deps;\n const unsubscribePrewalkRequests = omp.events?.on?.(FABRIC_PREWALK_REQUEST_EVENT, (value) => {\n const request = readFabricPrewalkRequestV1(value);\n if (!request || !request.claim()) return;\n void (async () => {\n try {\n await state.ensure(request.context);\n request.respond(await armPrewalk(state, request.context, omp));\n } catch (error) {\n request.respond({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n })();\n });\n if (unsubscribePrewalkRequests) {\n omp.on(\"session_shutdown\", () => unsubscribePrewalkRequests());\n }\n\n // Peer queuing protocol (used by pi-queue-steer): enumerate live peer root\n // sessions and hold dispatch until they settle on the project mesh.\n const unsubscribePeerCards = omp.events?.on?.(FABRIC_PEER_CARDS_EVENT, (value) => {\n const request = readFabricPeerCardsRequestV1(value);\n if (!request || !request.claim()) return;\n void (async () => {\n try {\n await state.ensure(request.context);\n request.respond({ ok: true, cards: buildPeerCards(state.peerInfos()) });\n } catch (error) {\n request.respond({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n })();\n });\n const unsubscribePeerAwait = omp.events?.on?.(FABRIC_PEER_AWAIT_SETTLE_EVENT, (value) => {\n const request = readFabricPeerAwaitSettleRequestV1(value);\n if (!request || !request.claim()) return;\n void (async () => {\n try {\n await state.ensure(request.context);\n if (!state.config.mesh.enabled) {\n request.respond({ ok: false, error: \"Fabric mesh is disabled; peers cannot be observed\" });\n return;\n }\n request.respond(await awaitPeerSettle({\n poll: () => state.peerInfos(),\n ...(request.selector !== undefined ? { selector: request.selector } : {}),\n ...(request.settledForMs !== undefined ? { settledForMs: request.settledForMs } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n ...(request.update ? { onUpdate: request.update } : {}),\n }));\n } catch (error) {\n request.respond({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n })();\n });\n if (unsubscribePeerCards || unsubscribePeerAwait) {\n omp.on(\"session_shutdown\", () => {\n unsubscribePeerCards?.();\n unsubscribePeerAwait?.();\n });\n }\n\n const formatRepairStatus = (status: RepairStatus): string => {\n const top = status.fingerprints\n .slice(0, 8)\n .map((entry) => ` ${entry.count}\u00D7 ${entry.fingerprint}`)\n .join(\"\\n\");\n const rows = status.repairs\n .slice(0, 12)\n .map((repair) =>\n repair.kind === \"keyAlias\"\n ? ` ${repair.ref}: ${repair.from} \u2192 ${repair.to}`\n : ` ${repair.provider}.${repair.from} \u2192 ${repair.to}`,\n )\n .join(\"\\n\");\n return [\n `repairs: ${status.enabled ? \"on\" : \"off\"} \u00B7 digest ${status.catalogDigest.slice(0, 12) || \"none\"}`,\n `table: ${status.repairCount} \u00B7 apply hits ${status.applyHits} \u00B7 invocation ${status.invocationErrors} \u00B7 effect dropped ${status.effectDropped}`,\n status.repairs.length > 0 ? `current:\\n${rows}` : \"current: (empty)\",\n ...(status.storeError ? [`store: ${status.storeError}`] : []),\n top ? `fingerprints:\\n${top}` : \"fingerprints: (none this session)\",\n ].join(\"\\n\");\n };\n\n omp.registerShortcut?.(FABRIC_CONVERSATION_SHORTCUT, {\n description: \"Open Fabric conversation or return to Main\",\n handler: async (context) => {\n if (context.mode !== \"tui\") return;\n try {\n await state.ensure(context);\n await fabricUi.openConversation(context);\n } catch (error) {\n context.ui.notify(safeText(error instanceof Error ? error.message : String(error)), \"error\");\n }\n },\n });\n\n omp.registerCommand(\"fabric\", {\n description: \"Open Fabric dashboard or chat, arm prewalk, reload, or manage agents and actors\",\n getArgumentCompletions: (argumentPrefix: string): AutocompleteItem[] | null => {\n const subcommands = [\n \"status\",\n \"dashboard\",\n \"chat\",\n \"settings\",\n \"schema\",\n \"prewalk\",\n \"reload\",\n \"providers\",\n \"agents\",\n \"actors\",\n \"messages\",\n \"clear-messages\",\n \"events\",\n \"log\",\n \"export-log\",\n \"attach\",\n \"stop\",\n \"remove\",\n \"global\",\n \"import\",\n \"export\",\n \"kill\",\n \"repairs\",\n \"entropy\",\n ];\n const idCommands = new Set([\n \"messages\",\n \"clear-messages\",\n \"events\",\n \"log\",\n \"export-log\",\n \"attach\",\n \"stop\",\n \"remove\",\n \"kill\",\n ]);\n const firstSpace = argumentPrefix.indexOf(\" \");\n if (firstSpace < 0) {\n const matches = subcommands.filter((name) => name.startsWith(argumentPrefix));\n return matches.length > 0 ? matches.map((name) => ({ value: name, label: name })) : null;\n }\n const subcommand = argumentPrefix.slice(0, firstSpace);\n const idPrefix = argumentPrefix.slice(firstSpace + 1);\n if (!state.initialized) return null;\n if (subcommand === \"chat\") {\n const snapshot = fabricUi.snapshot();\n const seen = new Set<string>();\n const targets = [snapshot.main, ...snapshot.peers, ...snapshot.actors, ...snapshot.agents, ...(snapshot.participants ?? [])];\n const matches = targets.filter((target) => {\n if (seen.has(target.id)) return false;\n seen.add(target.id);\n return `${target.id} ${target.name}`.toLowerCase().includes(idPrefix.toLowerCase());\n });\n return matches.length > 0 ? matches.map((target) => ({\n value: target.id,\n label: safeText(target.name),\n description: safeText(`${target.status} \u00B7 ${target.id.slice(0, 8)}`),\n })) : null;\n }\n if (subcommand === \"schema\") {\n const modes = [\"off\", \"audit\", \"enforce\"].filter((mode) => mode.startsWith(idPrefix));\n return modes.length > 0 ? modes.map((value) => ({ value, label: value })) : null;\n }\n if (subcommand === \"import\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const template of state.globalActors.list()) {\n items.push({\n value: template.name,\n label: template.name,\n description: `global ${template.runner} template \u00B7 ${template.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* global registry not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n if (!idCommands.has(subcommand)) {\n if (subcommand === \"export\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n return null;\n }\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n try {\n for (const agent of state.agents.list()) {\n const short = agent.id.slice(0, 8);\n items.push({\n value: short,\n label: short,\n description: `${agent.status} ${agent.runner} agent \u00B7 ${agent.name}`,\n });\n }\n } catch {\n /* agents not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n },\n async handler(argumentsText, context) {\n await state.ensure(context);\n const [command = \"dashboard\", ...argumentsList] = argumentsText\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (command === \"reload\") {\n fabricUi.stop();\n suspendToolCapture();\n try {\n await state.initialize(context);\n } catch (error) {\n fabricUi.stop();\n suspendToolCapture();\n throw error;\n }\n context.ui.notify(\"OMP Fabric reloaded\", \"info\");\n // initialize() reloads configuration, so an externally edited\n // ui.toolDisplay must re-render existing transcript cards too.\n deps.refreshToolDisplay?.();\n return;\n }\n if (command === \"settings\") {\n const { openFabricSettings } = await import(\"../ui/settings.js\");\n await openFabricSettings(context, {\n state,\n applyFabricMode,\n capturedTools,\n // Only card-affecting preferences pay for a transcript refresh:\n // refreshToolDisplay re-renders every fabric_exec card, so gating it\n // on the display sections keeps unrelated saves off the transcript.\n onConfigApplied: (id) => {\n if (id.startsWith(\"codePreview.\")) {\n deps.refreshCodePreviewSettings?.();\n deps.refreshToolDisplay?.();\n } else if (id === \"ui.toolDisplay\" || id === \"ui.showAgentToolPreview\") {\n deps.refreshToolDisplay?.();\n }\n },\n });\n return;\n }\n if (command === \"schema\") {\n const requested = argumentsList[0];\n if (requested === undefined) {\n const status = state.schemaStatus(context);\n context.ui.notify(\n `Schema mode: ${status.mode} (${status.source}) \u00B7 executor: ${status.executorRuntime} \u00B7 /fabric schema [off|audit|enforce] overrides this session only`,\n \"info\",\n );\n return;\n }\n if (requested !== \"off\" && requested !== \"audit\" && requested !== \"enforce\") {\n context.ui.notify(\"Usage: /fabric schema [off|audit|enforce]\", \"warning\");\n return;\n }\n try {\n state.setSchemaMode(context, requested);\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n return;\n }\n context.ui.notify(\n `Schema mode set to ${requested} for this session (config file unchanged; the next session starts from the configured mode)`,\n \"info\",\n );\n return;\n }\n if (command === \"prewalk\") {\n const option = argumentsList[0];\n if (option === \"--disable\" || option === \"--enable\") {\n const enabled = option === \"--enable\";\n try {\n const saved = saveFabricConfig(\n {\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n scope: \"global\",\n },\n { prewalk: { enabled } },\n );\n state.reloadConfig(context);\n if (!enabled) {\n state.prewalk.cancel();\n state.prewalkDrift.drop(context.sessionManager.getSessionId());\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n }\n context.ui.notify(\n `Fabric prewalk ${enabled ? \"enabled\" : \"disabled\"} (${saved.scope}: ${saved.path})`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n `Failed to update Fabric prewalk setting: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n return;\n }\n if (option === \"--off\" || option === \"--cancel\") {\n state.prewalk.cancel();\n state.prewalkDrift.drop(context.sessionManager.getSessionId());\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n context.ui.notify(\"Fabric prewalk cancelled\", \"info\");\n return;\n }\n if (option === \"--status\") {\n const status = state.prewalk.status();\n context.ui.notify(\n status.state === \"idle\"\n ? \"Fabric prewalk is idle\"\n : `Fabric prewalk ${status.state} (${status.mode}) \u2192 ${status.model}${status.task ? `\\nTask: ${status.task}` : \"\"}`,\n \"info\",\n );\n return;\n }\n const task = argumentsText.trim().slice(command.length).trim();\n await armPrewalk(state, context, omp, task);\n return;\n }\n if (command === \"chat\") {\n await fabricUi.openConversation(context, argumentsList.join(\" \") || undefined);\n return;\n }\n if (command === \"dashboard\" || command === \"ui\") {\n await fabricUi.openDashboard(context);\n return;\n }\n if (command === \"providers\") {\n const providers = state.registry.providers();\n context.ui.notify(\n providers.map((provider) => `${provider.name} \u2014 ${provider.description}`).join(\"\\n\"),\n \"info\",\n );\n return;\n }\n if (command === \"captured\") {\n const query = argumentsList.join(\" \").toLowerCase();\n const tools = capturedTools\n .list()\n .filter(\n (tool) =>\n !query ||\n `${tool.name} ${tool.definition.description} ${tool.sourceInfo.path}`\n .toLowerCase()\n .includes(query),\n );\n const shown = tools.slice(0, 100);\n context.ui.notify(\n shown.length > 0\n ? [\n ...shown.map((tool) => `${tool.name} [${tool.risk}] \u2014 ${tool.sourceInfo.path}`),\n ...(tools.length > shown.length\n ? [`\u2026 ${tools.length - shown.length} more captured tools`]\n : []),\n ].join(\"\\n\")\n : query\n ? `No captured extension tools matching ${JSON.stringify(query)}`\n : \"No extension tools captured\",\n \"info\",\n );\n return;\n }\n if (command === \"agents\") {\n const agents = state.agents.list();\n context.ui.notify(\n agents.length > 0\n ? agents\n .map(\n (agent) =>\n `${agent.id.slice(0, 8)} ${agent.status} ${agent.runner}/${agent.transport} \u2014 ${agent.name}`,\n )\n .join(\"\\n\")\n : \"No Fabric agents\",\n \"info\",\n );\n return;\n }\n if (command === \"actors\") {\n const actors = state.actors.list();\n context.ui.notify(\n actors.length > 0\n ? actors\n .map(\n (actor) =>\n `${actor.id.slice(0, 8)} ${actor.status} ${actor.runner} q:${actor.queued} \u2014 ${actor.name}`,\n )\n .join(\"\\n\")\n : \"No Fabric actors\",\n \"info\",\n );\n return;\n }\n if (command === \"messages\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric messages <actor-id>\", \"warning\");\n return;\n }\n try {\n const actor = state.actors.status(id);\n const messages = state.actors.messages(actor.id, 20);\n const shortId = actor.id.slice(0, 8);\n const body =\n messages.length > 0\n ? messages\n .map((message) => {\n const value = message.text ?? message.error ?? message.action ?? \"data\";\n const summary = truncateMiddle(value.replace(/\\s+/g, \" \"), 500);\n const runTag = message.runId ? ` [${message.runId.slice(0, 8)}]` : \"\";\n const usageTag = message.usage\n ? ` \u00B7 ${message.usage.input + message.usage.output} tok`\n : \"\";\n return `${message.direction === \"in\" ? \"\u2192\" : \"\u2190\"} ${message.source}${runTag}: ${summary}${usageTag}`;\n })\n .join(\"\\n\")\n : `No messages for ${actor.name}`;\n const footer = `\\nInspect LLM I/O: /fabric log ${shortId} \u00B7 Export: /fabric export-log ${actor.name}`;\n context.ui.notify(`${body}${footer}`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"log\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\n \"Usage: /fabric log <id> [session|run|all] [--lines N] [--run <runId>]\",\n \"warning\",\n );\n return;\n }\n let type: \"session\" | \"run\" | \"all\" = \"session\";\n let lines = 40;\n let runId: string | undefined;\n for (let i = 1; i < argumentsList.length; i++) {\n const arg = argumentsList[i]!;\n if (arg === \"session\" || arg === \"run\" || arg === \"all\") type = arg;\n else if ((arg === \"--lines\" || arg === \"-n\") && i + 1 < argumentsList.length) {\n const n = Number(argumentsList[++i]);\n if (n > 0) lines = Math.min(n, 5000);\n } else if (arg === \"--run\" && i + 1 < argumentsList.length) {\n runId = argumentsList[++i];\n }\n }\n try {\n const actor = state.actors.status(id);\n const log = state.actors.readLog(actor.id, { type, lines, ...(runId ? { runId } : {}) });\n const parts: string[] = [`Actor ${actor.name} \u00B7 ${log.sessionFile}`];\n if (log.session.length > 0) {\n parts.push(`\u2500\u2500 session (last ${log.session.length} lines) \u2500\u2500`);\n for (const line of log.session) parts.push(summarizeLogLine(line.parsed ?? line.raw));\n }\n if (log.run) {\n parts.push(\n `\u2500\u2500 run ${log.run.runId.slice(0, 8)} (${log.run.status?.status ?? \"?\"}) \u2500\u2500`,\n );\n for (const line of log.run.events) parts.push(summarizeLogLine(line.parsed ?? line.raw));\n }\n if (log.retainedRuns.length > 0) {\n parts.push(\n `retained runs: ${log.retainedRuns.map((r) => r.slice(0, 8)).join(\" \")}`,\n );\n }\n context.ui.notify(\n parts.length > 1 ? truncateMiddle(parts.join(\"\\n\"), 8000) : `No log found for ${actor.name}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"export-log\") {\n const id = argumentsList[0];\n const destArg = argumentsList.slice(1).join(\" \");\n if (!id) {\n context.ui.notify(\"Usage: /fabric export-log <id> [path]\", \"warning\");\n return;\n }\n try {\n const dest = path.resolve(\n destArg || path.join(\"fabric-logs\", `export-${Date.now()}`),\n );\n fs.mkdirSync(dest, { recursive: true });\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n let label: string;\n let copied: string[] = [];\n if (actor) {\n const full = state.actors.status(actor.id);\n label = actor.name;\n if (full.sessionFile && fs.existsSync(full.sessionFile)) {\n fs.copyFileSync(full.sessionFile, path.join(dest, \"session.jsonl\"));\n copied.push(\"session.jsonl\");\n }\n if (full.logDir && fs.existsSync(full.logDir)) {\n fs.cpSync(full.logDir, path.join(dest, \"runs\"), { recursive: true });\n copied.push(\"runs/\");\n }\n } else {\n const runDir = state.agents.runDirectory(id);\n const status = state.agents.status(id);\n label = status.name;\n if (runDir && fs.existsSync(runDir)) {\n fs.cpSync(runDir, dest, { recursive: true });\n copied.push(\"run/\");\n }\n }\n if (copied.length === 0) {\n context.ui.notify(`No log files found for ${label}`, \"warning\");\n return;\n }\n context.ui.notify(`Exported ${label} log \u2192 ${dest} (${copied.join(\", \")})`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"clear-messages\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric clear-messages <actor-id>\", \"warning\");\n return;\n }\n try {\n const actor = state.actors.status(id);\n await state.actors.clearMessages(actor.id);\n context.ui.notify(`Cleared message history for ${actor.name}`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"events\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric events <actor-id> [event...]\", \"warning\");\n return;\n }\n try {\n const actor = state.actors.status(id);\n const events = argumentsList.slice(1) as FabricActorHostEvent[];\n await state.actors.setEvents(actor.id, events);\n context.ui.notify(\n `Set ${actor.name} events: ${events.join(\", \") || \"(none)\"}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"stop\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric stop <id>\", \"warning\");\n return;\n }\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n if (actor) {\n await state.actors.stop(actor.id);\n context.ui.notify(`Stopped Fabric actor ${actor.id.slice(0, 8)}`, \"info\");\n return;\n }\n const agent = state.agents.list().find((candidate) => candidate.id.startsWith(id));\n if (!agent) {\n context.ui.notify(`Unknown Fabric actor or agent: ${id}`, \"error\");\n return;\n }\n await state.agents.stop(agent.id);\n context.ui.notify(`Stopped Fabric agent ${agent.id.slice(0, 8)}`, \"info\");\n return;\n }\n if (command === \"remove\" || command === \"kill\") {\n const id = argumentsList[0];\n if (!id) {\n context.ui.notify(\"Usage: /fabric remove <id>\", \"warning\");\n return;\n }\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n if (actor) {\n await state.actors.remove(actor.id);\n context.ui.notify(`Removed Fabric actor ${actor.id.slice(0, 8)} (${actor.name})`, \"info\");\n return;\n }\n const agent = state.agents.list().find((candidate) => candidate.id.startsWith(id));\n if (!agent) {\n context.ui.notify(`Unknown Fabric actor or agent: ${id}`, \"error\");\n return;\n }\n await state.agents.stop(agent.id);\n await state.agents.cleanup(agent.id);\n context.ui.notify(`Removed Fabric agent ${agent.id.slice(0, 8)}`, \"info\");\n return;\n }\n if (command === \"attach\") {\n const id = argumentsList[0];\n const agent = id\n ? state.agents.list().find((candidate) => candidate.id.startsWith(id))\n : undefined;\n if (!agent?.attachCommand) {\n context.ui.notify(\"No attachable Fabric agent found\", \"warning\");\n return;\n }\n context.ui.notify(agent.attachCommand, \"info\");\n return;\n }\n if (command === \"global\") {\n const templates = state.globalActors.list();\n context.ui.notify(\n templates.length > 0\n ? templates\n .map((template) => `${template.id.slice(0, 8)} global ${template.runner} \u2014 ${template.name}`)\n .join(\"\\n\")\n : \"No global Fabric actor templates\",\n \"info\",\n );\n return;\n }\n if (command === \"import\") {\n const key = argumentsList[0];\n if (!key) {\n context.ui.notify(\"Usage: /fabric import <global-actor-name-or-id> [as <new-name>]\", \"warning\");\n return;\n }\n try {\n const def = state.globalActors.resolve(key);\n if (!def) {\n context.ui.notify(`Unknown global actor: ${key}`, \"error\");\n return;\n }\n const asIndex = argumentsList.indexOf(\"as\");\n const as =\n asIndex >= 0 && argumentsList[asIndex + 1] ? argumentsList[asIndex + 1] : undefined;\n const actor = await state.actors.create(state.globalActors.toRequest(def, as));\n context.ui.notify(`Imported global actor \"${def.name}\" as ${actor.name}`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"export\") {\n const id = argumentsList[0];\n const overwrite = argumentsList.includes(\"--overwrite\") || argumentsList.includes(\"-f\");\n if (!id) {\n context.ui.notify(\"Usage: /fabric export <actor-id> [--overwrite]\", \"warning\");\n return;\n }\n try {\n const actor = state.actors\n .list()\n .find((candidate) => candidate.id.startsWith(id) || candidate.name === id);\n if (!actor) {\n context.ui.notify(`Unknown Fabric actor: ${id}`, \"error\");\n return;\n }\n const def = state.actors.definition(actor.id);\n const template = state.globalActors.create(def, overwrite);\n context.ui.notify(`Exported \"${template.name}\" to global actors`, \"info\");\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n return;\n }\n if (command === \"repairs\") {\n if (argumentsList[0] !== undefined) {\n context.ui.notify(\"Usage: /fabric repairs\", \"warning\");\n return;\n }\n context.ui.notify(formatRepairStatus(state.repairs.status()), \"info\");\n return;\n }\n if (command === \"entropy\") {\n const exportArtifactIndex = argumentsList.indexOf(\"export-artifact\");\n if (exportArtifactIndex >= 0) {\n const target = argumentsList[exportArtifactIndex + 1];\n try {\n const loaded = await loadCompiledSurfaceAsync(resolveAgentDir());\n if (loaded.error) {\n context.ui.notify(loaded.error, \"error\");\n return;\n }\n if (!loaded.file) {\n context.ui.notify(\n \"No compiled surface to export; wait for a compile to pass its gate\",\n \"warning\",\n );\n return;\n }\n const dest = path.resolve(\n target ?? path.join(resolveAgentDir(), \"fabric\", \"entropy\", \"artifact.json\"),\n );\n await fs.promises.mkdir(path.dirname(dest), { recursive: true });\n await fs.promises.writeFile(dest, `${JSON.stringify(loaded.file, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n context.ui.notify(\n `Exported compiled surface (${loaded.file.actions.length} tightened \u00B7 ${loaded.file.quarantined.length} quarantined) \u2192 ${dest}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n const importIndex = argumentsList.indexOf(\"import\");\n if (importIndex >= 0) {\n const source = argumentsList[importIndex + 1];\n if (!source) {\n context.ui.notify(\"Usage: /fabric entropy import <artifact.json>\", \"warning\");\n return;\n }\n try {\n const raw: unknown = JSON.parse(\n await fs.promises.readFile(path.resolve(source), \"utf-8\"),\n );\n const incoming = parseCompiledSurfaceArtifact(raw);\n if (!incoming) {\n context.ui.notify(`Artifact is invalid: ${source}`, \"error\");\n return;\n }\n const agentDir = resolveAgentDir();\n const localLoaded = await loadCompiledSurfaceAsync(agentDir);\n if (localLoaded.error) {\n context.ui.notify(localLoaded.error, \"error\");\n return;\n }\n const live = await liveSurfaceSnapshot({\n registry: state.registry,\n extensionContext: context,\n cwd: state.cwd ?? context.cwd,\n });\n const merged = mergeCompiledSurfaces(localLoaded.file, incoming, live);\n const saved = await saveCompiledSurfaceAsync(agentDir, merged.file);\n if (state.config.entropy.compile) setActiveCompiledSurface(saved.file);\n context.ui.notify(\n `Imported compiled surface: ${merged.file.actions.length} tightened \u00B7 ${merged.file.quarantined.length} quarantined \u00B7 ${merged.droppedOverlays + merged.droppedQuarantines} dropped (base digest mismatch)`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n const exportIndex = argumentsList.indexOf(\"export\");\n if (exportIndex >= 0) {\n const target = argumentsList[exportIndex + 1];\n try {\n const snapshot = await liveSurfaceSnapshot({\n registry: state.registry,\n extensionContext: context,\n cwd: state.cwd ?? context.cwd,\n });\n const dest = path.resolve(\n target ?? path.join(resolveAgentDir(), \"fabric\", \"entropy\", \"surface.json\"),\n );\n await fs.promises.mkdir(path.dirname(dest), { recursive: true });\n await fs.promises.writeFile(dest, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n context.ui.notify(\n `Exported ${snapshot.actions.length} surface actions \u2192 ${dest}`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n const projectScope = argumentsList.includes(\"--project\");\n const scopedArguments = argumentsList.filter((argument) => argument !== \"--project\");\n if (scopedArguments[0] !== undefined) {\n context.ui.notify(\n \"Usage: /fabric entropy [--project] [export [path] | export-artifact [path] | import <path>]\",\n \"warning\",\n );\n return;\n }\n try {\n const status = state.repairs.status();\n const agentDir = resolveAgentDir();\n const scopeCwd = state.cwd ?? context.cwd;\n const [loadedCompiled, live, files] = await Promise.all([\n loadCompiledSurfaceAsync(agentDir),\n liveSurfaceSnapshot({\n registry: state.registry,\n extensionContext: context,\n cwd: scopeCwd,\n }),\n projectScope\n ? projectSessionFilesAsync(agentDir, scopeCwd)\n : machineSessionFilesAsync(agentDir, scopeCwd),\n ]);\n const snapshot = loadedCompiled.file\n ? applyCompiledSurface(live, loadedCompiled.file)\n : live;\n const freedom = surfaceFreedomReport(snapshot);\n const surfaceDigest = entropySurfaceHash(snapshot);\n const corpus = await measureSessionCorpusAsync({\n files,\n surface: snapshot,\n catalogDigest: surfaceDigest,\n });\n const formatFreedom = (value: number): string =>\n String(Math.round(value * 100) / 100);\n const worst = freedom.actions\n .slice(0, 4)\n .map((action) => `${action.ref} ${formatFreedom(action.freedom)}`)\n .join(\" \u00B7 \");\n const latest = corpus.latest;\n const sessionsLine =\n corpus.sessions.length === 0 || latest === undefined\n ? `session entropy (observed): no fabric_exec traces in the latest ${files.length} ${projectScope ? \"project\" : \"machine\"} sessions`\n : `session entropy (observed): ${corpus.sessions.length} sessions \u00B7 latest ${latest.totals.operations} ops \u00B7 behavioral ${formatEntropyMetric(latest.behavioralScore)} + surface ${formatEntropyMetric(latest.staticScore)} = ${formatEntropyMetric(latest.behavioralScore + latest.staticScore)} \u00B7 lower is better \u00B7 slope ${formatEntropyMetric(corpus.trend.slopePerStep)}/session \u00B7 ${\n latest.totals.invocationRejectionsPer1k === 0 && corpus.trend.slopePerStep <= 0\n ? \"ratchet holding\"\n : \"ratchet slipping\"\n }`;\n const modelsLine =\n corpus.models.length > 1\n ? `models: ${corpus.models\n .map(\n (model) =>\n `${model.model} behavioral ${formatEntropyMetric(model.latestBehavioralScore)} \u00B7 slope ${formatEntropyMetric(model.slopePerSession)}`,\n )\n .join(\" \u00B7 \")}`\n : undefined;\n const compiledLine = loadedCompiled.error\n ? `compiled: unavailable \u2014 ${loadedCompiled.error}`\n : loadedCompiled.file\n ? `compiled: v${loadedCompiled.file.metricVersion} \u00B7 ${loadedCompiled.file.actions.length} tightened \u00B7 ${loadedCompiled.file.quarantined.length} quarantined \u00B7 ${loadedCompiled.file.applied.length} applied \u00B7 gate ${loadedCompiled.file.gate.passed ? \"pass\" : \"REJECTED\"} (${formatEntropyMetric(loadedCompiled.file.gate.beforeScore)} \u2192 ${formatEntropyMetric(loadedCompiled.file.gate.afterScore)})`\n : \"compiled: none\";\n // Review listing: the signals the compiler declined to apply,\n // derived read-only from the current window plus the pool (the\n // merge is in memory; the listing never writes the pool).\n let reviewLine: string;\n try {\n const [windowEvidence, poolLoaded] = await Promise.all([\n sessionWindowEvidenceAsync(files),\n loadObservationPoolAsync(agentDir),\n ]);\n if (poolLoaded.error) {\n reviewLine = `review: unavailable \u2014 ${poolLoaded.error}`;\n } else if (windowEvidence.traces.length === 0) {\n reviewLine = \"review: no window evidence\";\n } else {\n const mergedPool = await mergeObservationWindowAsync(\n poolLoaded.file,\n windowEvidence.observationWindows,\n );\n const signals = entropyReviewSignals({\n report: await measureEntropyAsync({\n traces: windowEvidence.traces,\n surface: snapshot,\n catalogDigest: surfaceDigest,\n }),\n traces: windowEvidence.traces,\n surface: snapshot,\n repairs: entropyRepairRows(state.repairs.repairs),\n valueObservations: poolToValueObservations(mergedPool.file),\n });\n reviewLine =\n signals.length === 0\n ? \"review: none\"\n : `review: ${signals.length} suggestion${signals.length === 1 ? \"\" : \"s\"} \u00B7 ${signals\n .slice(0, 4)\n .map(formatEntropyReviewSignal)\n .join(\" \u00B7 \")}${signals.length > 4 ? ` \u00B7 +${signals.length - 4} more` : \"\"}`;\n }\n } catch {\n reviewLine = \"review: unavailable\";\n }\n context.ui.notify(\n [\n `entropy: metric v${ENTROPY_METRIC_VERSION} \u00B7 surface ${surfaceDigest.slice(0, 12)} \u00B7 ${freedom.actions.length} actions`,\n `live: invocation errors ${status.invocationErrors} \u00B7 effect dropped ${status.effectDropped} \u00B7 aliases ${status.repairCount} \u00B7 alias hits ${status.applyHits}`,\n compiledLine,\n reviewLine,\n `surface freedom (potential): mean ${formatFreedom(freedom.mean)}${worst ? ` \u00B7 worst ${worst}` : \"\"}`,\n sessionsLine,\n ...(modelsLine ? [modelsLine] : []),\n ...formatEntropyCommandHints(),\n ].join(\"\\n\"),\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n return;\n }\n if (command !== \"status\") {\n context.ui.notify(\n \"Usage: /fabric [status|dashboard|chat [id-or-name]|prewalk [task]|prewalk --off|--disable|--enable|reload|providers|agents|actors|global|import <name> [as <new>]|export <id> [--overwrite]|messages <id>|clear-messages <id>|events <id> [event...]|log <id>|export-log <id>|attach <id>|stop <id>|remove <id>|kill <id>|repairs|entropy]\",\n \"warning\",\n );\n return;\n }\n const config = state.config;\n context.ui.notify(\n [\n `cwd: ${state.cwd}`,\n `mode: ${config.fullCodeMode ? \"full code (Fabric-owned core tools)\" : \"orchestration-only (native OMP tools)\"}`,\n `providers: ${state.registry\n .providers()\n .map((provider) => provider.name)\n .join(\", \")}`,\n `runner: ${config.agents.runner} \u00B7 transport: ${config.agents.transport} \u00B7 model: ${\n config.agents.runner === \"claude\"\n ? config.agents.claude.model || \"Claude default\"\n : config.agents.runner === \"veda\"\n ? `${config.agents.veda.model || \"Veda default\"} \u00B7 backend ${config.agents.veda.backend} \u00B7 persona ${config.agents.veda.persona}`\n : config.agents.model || \"inherit\"\n }`,\n `agent limits: concurrency ${config.agents.maxConcurrent}, per execution ${config.agents.maxPerExecution}, depth ${config.agents.maxDepth}`,\n (() => {\n const prewalk = state.prewalk.status();\n return prewalk.state === \"idle\"\n ? `prewalk: idle \u00B7 ${config.prewalk.mode} \u00B7 model ${config.prewalk.model || \"Ask each time\"} \u00B7 auto-arm & re-arm ${config.prewalk.alwaysRearm ? \"on\" : \"off\"}`\n : `prewalk: ${prewalk.state} \u00B7 ${prewalk.mode} \u2192 ${prewalk.model}${prewalk.alwaysRearm ? \" \u00B7 always re-arm\" : \"\"}`;\n })(),\n config.fullCodeMode && config.capture.enabled\n ? `captured tools: ${capturedTools.size} \u00B7 model visibility: ${config.capture.hideFromModel ? \"hidden\" : \"visible\"}`\n : \"captured tools: disabled (native registry preserved)\",\n `actors: ${state.actors.list().length} \u00B7 mesh: ${config.mesh.enabled ? state.mesh.root : \"disabled\"}`,\n `MCP: ${config.mcp.enabled ? \"enabled\" : \"disabled\"}`,\n `UI: ${config.ui.enabled ? `${config.ui.widget} widget above chat` : \"disabled\"}`,\n ].join(\"\\n\"),\n \"info\",\n );\n },\n });\n}\n", "import type { ExtensionAPI, ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport {\n PREWALK_ARMED_MESSAGE_TYPE,\n hasPrewalkArmedPrompt,\n prewalkArmedPrompt,\n} from \"./handoff.js\";\n\n// The single arm path shared by `/fabric prewalk` and alwaysRearm session\n// auto-arm, so drift baseline, hidden armed advisory, and status chip never\n// drift apart between entry points.\nexport const armFabricPrewalkSession = async (\n state: FabricState,\n context: ExtensionContext,\n omp: ExtensionAPI,\n input: { model: string; task?: string },\n): Promise<void> => {\n const { prewalk } = state.config;\n const sessionId = context.sessionManager.getSessionId();\n state.prewalk.arm({\n model: input.model,\n mode: prewalk.mode,\n sessionId,\n ...(input.task ? { task: input.task } : {}),\n ...(prewalk.thinking ? { thinking: prewalk.thinking } : {}),\n alwaysRearm: prewalk.alwaysRearm,\n });\n // Anchor the shell-write drift window at arm time so the first\n // bash-running boundary diffs against the pre-task tree state; only\n // snapshot when the fs fallback can actually claim.\n if (prewalk.detectShellWrites) {\n await state.prewalkDrift.captureBaseline(sessionId, context.cwd);\n }\n // Hidden advisory framing, queued for the next prompt (rules before the\n // task when the caller submits one). nextTurn never triggers a turn;\n // custom messages never fire `input`, so observeTask ignores it.\n const armedPrompt = prewalkArmedPrompt(prewalk.mode, input.model);\n if (!hasPrewalkArmedPrompt(context.sessionManager.getBranch(), armedPrompt)) {\n omp.sendMessage(\n {\n customType: PREWALK_ARMED_MESSAGE_TYPE,\n content: armedPrompt,\n display: false,\n details: { mode: prewalk.mode, model: input.model },\n },\n { deliverAs: \"nextTurn\" },\n );\n }\n context.ui.setStatus(\"fabric-prewalk\", `armed (${prewalk.mode}) \u2192 ${input.model}`);\n};\n\n// alwaysRearm covers unarmed starts too: every session (and `/fabric reload`)\n// opens armed, not only sessions following a completed handoff. Prerequisites\n// mirror the `/fabric prewalk` command gates, minus interactive model\n// selection \u2014 auto-arm is non-interactive and reads `prewalk.model`.\n//\n// Returns a human-readable reason when auto-arm is configured but skipped for\n// health reasons; undefined when it armed or when the feature is off / an arm\n// already exists.\nexport const autoArmFabricPrewalk = async (\n state: FabricState,\n context: ExtensionContext,\n omp: ExtensionAPI,\n): Promise<string | undefined> => {\n const { prewalk } = state.config;\n if (prewalk.enabled === false || !prewalk.alwaysRearm) return undefined;\n // initialize() cancels any prior arm at session start; a non-idle status\n // means another path armed first \u2014 never clobber it.\n if (state.prewalk.status().state !== \"idle\") return undefined;\n if (!state.config.fullCodeMode || state.config.schema.mode === \"enforce\") {\n return \"Fabric prewalk auto-arm skipped: requires full code mode with Schema enforce mode disabled.\";\n }\n if (prewalk.mode === \"trajectory\" && !state.config.agents.enabled) {\n return \"Fabric prewalk auto-arm skipped: trajectory mode requires agents.enabled.\";\n }\n const model = prewalk.model?.trim();\n if (!model || !model.includes(\"/\")) {\n return \"Fabric prewalk auto-arm skipped: set prewalk.model (provider/model) in /fabric settings so sessions arm without the interactive picker.\";\n }\n await armFabricPrewalkSession(state, context, omp, { model });\n return undefined;\n};\n", "export const FABRIC_CONVERSATION_SHORTCUT = \"ctrl+shift+a\";\nexport const FABRIC_CONVERSATION_HINT = \"Ctrl+Shift+A chat\";\n", "import type { ExtensionContext, MessageUpdateEvent } from \"@oh-my-pi/pi-coding-agent\";\nimport { streamedToolCallName } from \"./stream-tap.js\";\nimport type { FabricSpeculationStreamTap } from \"./stream-tap.js\";\n\nexport interface FabricSpeculationWarmupOptions {\n enabled(): boolean;\n tap(): FabricSpeculationStreamTap | undefined;\n activate(context: ExtensionContext): Promise<void>;\n maxBufferedEvents?: number;\n maxBufferedChars?: number;\n}\n\nconst DEFAULT_MAX_BUFFERED_EVENTS = 4_096;\nconst DEFAULT_MAX_BUFFERED_CHARS = 2 * 1024 * 1024;\n\nexport class FabricSpeculationWarmup {\n readonly #options: FabricSpeculationWarmupOptions;\n readonly #buffered: MessageUpdateEvent[] = [];\n #bufferedChars = 0;\n #activating = false;\n #overflowed = false;\n\n constructor(options: FabricSpeculationWarmupOptions) {\n this.#options = options;\n }\n\n get pending(): number {\n return this.#buffered.length;\n }\n\n reset(): void {\n this.#buffered.length = 0;\n this.#bufferedChars = 0;\n this.#overflowed = false;\n }\n\n handleMessageUpdate(event: MessageUpdateEvent, context: ExtensionContext): void {\n try {\n const tap = this.#options.tap();\n if (tap) {\n this.#drain(tap, context);\n tap.handleMessageUpdate(event, context);\n return;\n }\n if (!this.#options.enabled()) return;\n const assistantEvent = event.assistantMessageEvent;\n if (\n assistantEvent.type !== \"toolcall_start\" &&\n assistantEvent.type !== \"toolcall_delta\" &&\n assistantEvent.type !== \"toolcall_end\"\n ) {\n return;\n }\n const name = streamedToolCallName(event);\n if (name !== undefined && name !== \"fabric_exec\") return;\n this.#buffer(event, assistantEvent.type === \"toolcall_delta\" ? assistantEvent.delta.length : 0);\n if (this.#activating) return;\n this.#activating = true;\n void this.#options\n .activate(context)\n .then(\n () => {\n const activated = this.#options.tap();\n if (activated) this.#drain(activated, context);\n },\n () => undefined,\n )\n .finally(() => {\n this.#activating = false;\n });\n } catch {\n return;\n }\n }\n\n #buffer(event: MessageUpdateEvent, chars: number): void {\n if (this.#overflowed) return;\n if (\n this.#buffered.length >= (this.#options.maxBufferedEvents ?? DEFAULT_MAX_BUFFERED_EVENTS) ||\n this.#bufferedChars + chars > (this.#options.maxBufferedChars ?? DEFAULT_MAX_BUFFERED_CHARS)\n ) {\n this.#overflowed = true;\n this.#buffered.length = 0;\n this.#bufferedChars = 0;\n return;\n }\n this.#buffered.push(event);\n this.#bufferedChars += chars;\n }\n\n #drain(tap: FabricSpeculationStreamTap, context: ExtensionContext): void {\n if (this.#buffered.length === 0) return;\n const replay = this.#buffered.splice(0);\n this.#bufferedChars = 0;\n for (const event of replay) tap.handleMessageUpdate(event, context);\n }\n}\n", "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { sessionsDirRoot, sessionDirNamesForCwd } from \"../memory/discovery.js\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, defaultLedgerPath, hashLcmPayload, LcmLedger } from \"./lcm-ledger.js\";\n\nexport interface MigrationOptions {\n agentDir: string;\n ledgerRoot?: string;\n ledger?: LcmLedger;\n files?: string[];\n candidateDirs?: string[];\n projectCwd?: string;\n liveCwd?: string;\n since?: string;\n until?: string;\n onDemand?: boolean;\n now?: number;\n apply?: boolean;\n allowIncompleteDiscovery?: boolean;\n maxFiles?: number;\n maxDiscoveryEntries?: number;\n maxFileBytes?: number;\n maxLineBytes?: number;\n maxTotalBytes?: number;\n onProgress?: (progress: MigrationProgress) => void;\n}\ninterface MigrationProgress {\n projectKey: string;\n sessionPath: string;\n sourceHash: string;\n lineOrdinal: number;\n entryId: string;\n contentHash: string;\n}\ninterface MigrationCounts {\n eligible: number;\n imported: number;\n skippedDuplicate: number;\n skippedOutOfWindow: number;\n malformed: number;\n oversized: number;\n incompleteDiscovery: number;\n errors: number;\n}\nexport interface MigrationResult {\n mode: \"apply\" | \"dry-run\";\n since: string;\n until: string;\n counts: MigrationCounts;\n filesScanned: number;\n bytesScanned: number;\n generations: Array<{ sessionPath: string; sourceHash: string }>;\n exitCode: number;\n}\nconst hash = (data: string | Buffer): string => crypto.createHash(\"sha256\").update(data).digest(\"hex\");\nconst record = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\nconst nonblank = (value: unknown): value is string => typeof value === \"string\" && value.trim().length > 0;\nconst utc = (value: string): number => {\n if (!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|\\+00:00)$/.test(value)) throw new Error(\"timestamps must be explicit UTC ISO-8601 values\");\n const at = Date.parse(value);\n const normalized = value.replace(\"+00:00\", \"Z\").replace(/Z$/, \"\");\n if (!Number.isFinite(at) || new Date(at).toISOString().slice(0, 19) !== normalized.slice(0, 19)) throw new Error(\"invalid UTC timestamp\");\n return at;\n};\nexport function migrationWindow(options: Pick<MigrationOptions, \"since\" | \"until\" | \"now\">): { since: number; until: number } {\n const now = options.now ?? Date.now();\n const since = options.since === undefined ? now - 72 * 60 * 60 * 1000 : utc(options.since);\n const until = options.until === undefined ? now : utc(options.until);\n if (!Number.isFinite(since) || !Number.isFinite(until) || since > until) throw new Error(\"invalid migration window\");\n return { since, until };\n}\nconst positive = (value: number | undefined, fallback: number): number => {\n const result = value ?? fallback;\n if (!Number.isSafeInteger(result) || result < 1) throw new Error(\"scan limits must be positive safe integers\");\n return result;\n};\nexport function discoverMigrationSessions(options: MigrationOptions): { files: string[]; incomplete: number } {\n const maxFiles = positive(options.maxFiles, 10_000);\n const maxEntries = positive(options.maxDiscoveryEntries, 100_000);\n const files = new Set<string>();\n let incomplete = 0;\n let entries = 0;\n const add = (file: string): void => {\n if (files.size >= maxFiles && !files.has(path.resolve(file))) { incomplete++; return; }\n files.add(path.resolve(file));\n };\n if (options.files) {\n for (const file of options.files.slice(0, maxFiles)) add(file);\n if (options.files.length > maxFiles) incomplete++;\n return { files: [...files].sort(), incomplete };\n }\n const list = (dir: string, visit: (entry: fs.Dirent) => void): void => {\n let handle: fs.Dir | undefined;\n try {\n handle = fs.opendirSync(dir);\n let entry: fs.Dirent | null;\n while ((entry = handle.readSync()) !== null) {\n if (++entries > maxEntries) { incomplete++; break; }\n visit(entry);\n }\n } catch { incomplete++; } finally { handle?.closeSync(); }\n };\n const scan = (dir: string): void => list(dir, entry => {\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(dir, entry.name));\n else if (entry.isSymbolicLink() && entry.name.endsWith(\".jsonl\")) incomplete++;\n });\n if (options.candidateDirs) {\n for (const dir of options.candidateDirs) { if (entries >= maxEntries) { incomplete++; break; } scan(dir); }\n } else if (options.projectCwd) {\n const names = sessionDirNamesForCwd(options.projectCwd);\n let found = false;\n for (const name of [names.canonical, ...names.legacy]) {\n const dir = path.join(sessionsDirRoot(options.agentDir), name);\n try { if (fs.statSync(dir).isDirectory()) { found = true; scan(dir); } }\n catch (error) { if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") incomplete++; }\n }\n if (!found) incomplete++;\n } else {\n const root = sessionsDirRoot(options.agentDir);\n list(root, entry => {\n if (entry.isDirectory()) scan(path.join(root, entry.name));\n else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(root, entry.name));\n else if (entry.isSymbolicLink()) incomplete++;\n });\n }\n return { files: [...files].sort(), incomplete };\n}\nconst CHECKPOINT_SCHEMA = \"CREATE TABLE IF NOT EXISTS migration_checkpoints (project_key TEXT NOT NULL, session_path TEXT NOT NULL, source_hash TEXT NOT NULL, line_ordinal INTEGER NOT NULL, entry_id TEXT NOT NULL, content_hash TEXT NOT NULL, PRIMARY KEY(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash))\";\nexport function reconcileSession(options: Omit<MigrationOptions, \"files\"> & { files: [string] }): MigrationResult {\n return migrateSessions({ ...options, onDemand: true });\n}\n\nexport function migrateSessions(options: MigrationOptions): MigrationResult {\n const window = migrationWindow(options);\n const maxFileBytes = positive(options.maxFileBytes, 64 * 1024 ** 2);\n const maxLineBytes = positive(options.maxLineBytes, 8 * 1024 ** 2);\n const maxTotalBytes = positive(options.maxTotalBytes, 1024 ** 3);\n const discovery = discoverMigrationSessions(options);\n const result: MigrationResult = {\n mode: options.apply ? \"apply\" : \"dry-run\", since: new Date(window.since).toISOString(), until: new Date(window.until).toISOString(),\n counts: { eligible: 0, imported: 0, skippedDuplicate: 0, skippedOutOfWindow: 0, malformed: 0, oversized: 0, incompleteDiscovery: discovery.incomplete, errors: 0 },\n filesScanned: 0, bytesScanned: 0, generations: [], exitCode: 0,\n };\n const counts = result.counts;\n const drySeen = new Set<string>();\n for (const file of discovery.files) {\n let data: Buffer;\n let fd: number | undefined;\n try {\n fd = fs.openSync(file, \"r\");\n const before = fs.fstatSync(fd);\n if (!before.isFile()) { counts.incompleteDiscovery++; continue; }\n if (before.size > maxFileBytes) { counts.oversized++; continue; }\n if (result.bytesScanned + before.size > maxTotalBytes) { counts.incompleteDiscovery++; break; }\n data = Buffer.allocUnsafe(before.size);\n let offset = 0;\n while (offset < data.length) {\n const size = fs.readSync(fd, data, offset, data.length - offset, offset);\n if (size === 0) throw new Error(\"source shortened during read\");\n offset += size;\n }\n const after = fs.fstatSync(fd);\n if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs) throw new Error(\"source changed during read\");\n } catch { counts.errors++; counts.incompleteDiscovery++; continue; }\n finally { if (fd !== undefined) fs.closeSync(fd); }\n result.filesScanned++;\n result.bytesScanned += data.length;\n const sourceHash = hash(data);\n result.generations.push({ sessionPath: file, sourceHash });\n let header: Record<string, unknown> | undefined;\n let ledger: LcmLedger | undefined;\n let database: DatabaseSync | undefined;\n let sessionId = \"\";\n let projectKey = \"\";\n let cwd: string | undefined;\n let ordinal = 0;\n try {\n for (let start = 0; start < data.length;) {\n ordinal++;\n const newline = data.indexOf(10, start);\n const end = newline < 0 ? data.length : newline;\n const bytes = data.subarray(start, end);\n start = newline < 0 ? data.length : end + 1;\n if (bytes.length > maxLineBytes) { counts.oversized++; continue; }\n const content = bytes.toString(\"utf8\").replace(/\\r$/, \"\");\n if (!content.trim()) continue;\n let row: Record<string, unknown> | undefined;\n try { row = record(JSON.parse(content)); } catch { counts.malformed++; continue; }\n if (!row) { counts.malformed++; continue; }\n if (row.type === \"message_end\") continue;\n if (!header) {\n if (row.type !== \"session\") { if (record(row.message)) counts.malformed++; continue; }\n if (!nonblank(row.id)) { counts.malformed++; break; }\n header = row;\n sessionId = row.id;\n cwd = nonblank(row.cwd) ? row.cwd : options.liveCwd;\n if (!cwd) { counts.malformed++; break; }\n const projectInput = options.liveCwd ? { recordedCwd: cwd, liveCwd: options.liveCwd } : { recordedCwd: cwd };\n projectKey = canonicalProjectIdentity(projectInput).key;\n if (options.ledger && options.ledger.project.key !== projectKey) { counts.errors++; break; }\n if (options.apply) {\n if (options.ledger) ledger = options.ledger;\n else if (options.ledgerRoot) ledger = new LcmLedger({ rootDir: options.ledgerRoot, project: { recordedCwd: cwd } });\n else ledger = new LcmLedger({ project: { recordedCwd: cwd } });\n database = ledger.db;\n database.exec(CHECKPOINT_SCHEMA);\n } else if (options.ledger) database = options.ledger.db;\n else {\n const dbPath = defaultLedgerPath(options.ledgerRoot, projectKey);\n if (fs.existsSync(dbPath)) database = new DatabaseSync(dbPath, { readOnly: true });\n }\n continue;\n }\n if (row.type === \"session\" || !nonblank(row.type) || !nonblank(row.id) || (row.parentId !== null && row.parentId !== undefined && typeof row.parentId !== \"string\")) { counts.malformed++; continue; }\n const message = record(row.message);\n if (row.type === \"message\" && (!message || !nonblank(message.role))) { counts.malformed++; continue; }\n let at: number;\n try { at = typeof row.timestamp === \"string\" ? utc(row.timestamp) : NaN; } catch { at = NaN; }\n if (!Number.isFinite(at)) { counts.malformed++; continue; }\n if (!options.onDemand && (at < window.since || at > window.until)) { counts.skippedOutOfWindow++; continue; }\n counts.eligible++;\n const payloadJson = canonicalLcmPayload(row);\n const contentHash = hashLcmPayload(row);\n const identity = JSON.stringify([projectKey, sessionId, row.id, contentHash]);\n const progress: MigrationProgress = { projectKey, sessionPath: file, sourceHash, lineOrdinal: ordinal, entryId: row.id, contentHash };\n const duplicate = drySeen.has(identity) || database?.prepare(\"SELECT 1 FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND content_hash=?\").get(projectKey, sessionId, row.id, contentHash) !== undefined;\n if (duplicate) counts.skippedDuplicate++;\n else if (ledger) {\n ledger.appendRaw({\n projectKey, sessionId, entryId: row.id, role: message && typeof message.role === \"string\" ? message.role : row.type,\n content, payloadJson, parentEntryId: typeof row.parentId === \"string\" ? row.parentId : null,\n branch: typeof row.branch === \"string\" ? row.branch : typeof row.branchId === \"string\" ? row.branchId : null,\n ...(cwd ? { recordedCwd: cwd } : {}), createdAt: at\n });\n counts.imported++;\n }\n else if (!duplicate) counts.imported++;\n drySeen.add(identity);\n if (ledger) database!.prepare(\"INSERT OR IGNORE INTO migration_checkpoints(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash) VALUES(?,?,?,?,?,?)\")\n .run(projectKey, file, sourceHash, ordinal, row.id, contentHash);\n options.onProgress?.(progress);\n }\n if (!header) counts.malformed++;\n } catch (error) {\n counts.errors++;\n if (options.onProgress) throw error;\n } finally {\n if (ledger && ledger !== options.ledger) ledger.close();\n else if (!ledger && database && database !== options.ledger?.db) database.close();\n }\n }\n result.exitCode = counts.errors || counts.malformed || counts.oversized || (counts.incompleteDiscovery && !options.allowIncompleteDiscovery) ? 1 : 0;\n return result;\n}\n", "import crypto from \"node:crypto\";\nimport { hashLcmPayload, type LcmLedger, type RawEntry } from \"../storage/lcm-ledger.js\";\nimport { buildLcmPrompt, emergencyReduce, type LcmModelResult, type LcmSummarizer } from \"./lcm-model.js\";\n\ntype LcmNodeState = \"pending\" | \"ready\" | \"running\" | \"failed\";\ntype LcmJobState = \"pending\" | \"running\" | \"completed\" | \"failed\";\nexport interface LcmSourceRef { sessionId: string; entryId: string; revision: number; payloadHash: string; }\ntype RawSourceRef = LcmSourceRef;\nexport interface LcmNode { nodeId: string; projectKey: string; sessionId: string; branch: string | null; kind: \"leaf\" | \"condensed\"; sources: LcmSourceRef[]; children: string[]; depth: number; sourceHash: string; policyHash: string; modelHash: string; state: LcmNodeState; text?: string; createdAt: number; }\nexport interface LcmJob { jobId: string; projectKey: string; nodeId: string; priority: number; eligibleAt: number; state: LcmJobState; ownerId?: string; leaseToken?: string; leaseUntil?: number; attempts: number; nextRetryAt: number; error?: string; createdAt: number; updatedAt: number; }\nexport interface LcmBudget { calls: number; inputTokens: number; outputTokens: number; cost: number; wallMs: number; }\nexport interface LcmBudgetPolicy extends LcmBudget { sessionCalls: number; }\nconst DEFAULT_LCM_BUDGET: LcmBudgetPolicy = { calls: 32, inputTokens: 2_000_000, outputTokens: 128_000, cost: Number.POSITIVE_INFINITY, wallMs: 60_000, sessionCalls: 16 };\nexport interface LcmMaintenanceOptions { now?: () => number; ownerId?: string; policyHash?: string; maxLeafEntries?: number; maxCondenseChildren?: number; maxInputChars?: number; maxOutputChars?: number; budget?: Partial<LcmBudgetPolicy>; }\nconst hash = (v: unknown) => hashLcmPayload(v);\nconst parse = <T>(v: unknown): T => JSON.parse(String(v));\nconst rawHash = (e: RawEntry) => e.payloadHash;\nconst token = () => crypto.randomUUID();\n\nexport class LcmMaintenance {\n readonly projectKey: string;\n private readonly now: () => number;\n private readonly ownerId: string;\n private readonly policyHash: string;\n private readonly maxLeaf: number;\n private readonly maxChildren: number;\n private readonly maxInputChars: number;\n private readonly maxOutputChars: number;\n private readonly budget: LcmBudgetPolicy;\n constructor(private readonly ledger: LcmLedger, options: LcmMaintenanceOptions = {}) { this.projectKey = ledger.project.key; this.now = options.now ?? Date.now; this.ownerId = options.ownerId ?? crypto.randomUUID(); this.policyHash = options.policyHash ?? hash(\"lcm-policy-v1\"); this.maxLeaf = options.maxLeafEntries ?? 8; this.maxChildren = options.maxCondenseChildren ?? 4; this.maxInputChars = options.maxInputChars ?? 48_000; this.maxOutputChars = options.maxOutputChars ?? 4_096; this.budget = { ...DEFAULT_LCM_BUDGET, ...options.budget }; }\n listNodes(limit = 100): LcmNode[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM summary_nodes WHERE project_key=? ORDER BY created_at,node_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const node = parse<LcmNode>(r.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; })); }\n getNode(nodeId: string): LcmNode | undefined { return this.ledger.readOnly(db => { const row = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(nodeId, this.projectKey) as {payload?:string}|undefined; if (!row?.payload) return undefined; const node = parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; }); }\n getFrontier(sessionId?: string, branch?: string | null, activeSources?: ReadonlySet<string>): LcmNode[] { const nodes=this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (branch === undefined || n.branch === branch || n.branch === null) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s))))) ; const covered=new Set(nodes.flatMap(n=>n.children)); return nodes.filter(n=>!covered.has(n.nodeId)); }\n listJobs(limit = 100): LcmJob[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? ORDER BY created_at,job_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const job = parse<LcmJob>(r.payload); if (job.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; })); }\n selectLeaf(entries = this.ledger.readRaw(this.projectKey), branch?: string | null): RawEntry[] { const first = entries[0]; if (!first) return []; const nodes = this.listNodes(100000).filter(n => n.state !== \"failed\" && n.policyHash === this.policyHash && n.sessionId === first.sessionId && (branch === undefined || n.branch === branch || n.branch === null)); const covered = new Set(nodes.flatMap(n => n.sources.map(s => this.sourceKey(s)))); return entries.filter(e => e.sessionId === first.sessionId && (branch === undefined || e.branch === branch || e.branch === null) && !covered.has(this.sourceKey(e))).slice(0, this.maxLeaf); }\n selectCondensation(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null): LcmNode[] { const nodes = this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s)))) && (branch === undefined || n.branch === branch || n.branch === null)); const eligible = new Set(nodes.map(n => n.nodeId)); const edges = this.ledger.readOnly(db => db.prepare(\"SELECT e.parent_id,e.child_id FROM summary_edges e JOIN summary_nodes parent ON parent.node_id=e.parent_id AND parent.project_key=? JOIN summary_nodes child ON child.node_id=e.child_id AND child.project_key=parent.project_key WHERE parent.project_key=?\").all(this.projectKey, this.projectKey) as Array<{parent_id:string;child_id:string}>); const consumed = new Set(edges.filter(e => eligible.has(e.parent_id)).map(e => e.child_id)); const candidates = nodes.filter(n => !consumed.has(n.nodeId)); const first = candidates[0]; if (!first) return []; const depth = Math.min(...candidates.map(n => n.depth)); const sameDepth = candidates.filter(n => n.depth === depth); if (depth > 0 && sameDepth.length < 2) return []; return candidates.filter(n => n.projectKey === first.projectKey && n.sessionId === first.sessionId && n.depth === depth).sort((a,b) => a.nodeId.localeCompare(b.nodeId)).slice(0, this.maxChildren); }\n createLeaf(entries = this.selectLeaf()): LcmNode | undefined { if (!entries.length) return undefined; const branches = new Set(entries.map(entry => entry.branch).filter((value): value is string => typeof value === \"string\")); if (branches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...branches][0] ?? null; const source = entries.map((e, index) => { if (e.projectKey !== this.projectKey) throw new Error(\"entry project does not match ledger project\"); const payload = parse<{type?: unknown; id?: unknown}>(e.payloadJson); if (typeof payload.type !== \"string\" || !payload.type || payload.id !== e.entryId) throw new Error(\"invalid raw payload\"); if (hash(payload) !== rawHash(e)) throw new Error(\"payload hash mismatch\"); return { sessionId:e.sessionId, entryId:e.entryId, revision:e.revision, payloadHash:rawHash(e) }; }); this.validateSources(source); const node: LcmNode = { nodeId:`leaf:${hash({ projectKey:this.projectKey, source, branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:entries[0]!.sessionId, branch, kind:\"leaf\", sources:source, children:[], depth:0, sourceHash:hash(source.map(s=>s.payloadHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n createCondensed(children = this.selectCondensation()): LcmNode | undefined { if (!children.length) return undefined; if (children.some(c => c.state !== \"ready\")) throw new Error(\"condensation requires ready children\"); if (new Set(children.map(c=>c.sessionId)).size !== 1 || new Set(children.map(c=>c.depth)).size !== 1) throw new Error(\"cross-branch ranges\"); const storedChildren = children.map((child) => this.getNode(child.nodeId)); if (storedChildren.some((child) => !child || child.projectKey !== this.projectKey)) throw new Error(\"child project does not match ledger project\"); if (storedChildren.some((child, index) => JSON.stringify(child) !== JSON.stringify(children[index]))) throw new Error(\"child payload changed\"); const concreteBranches = new Set(storedChildren.map(c => c!.branch).filter((value): value is string => typeof value === \"string\")); if (concreteBranches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...concreteBranches][0] ?? null; const source = [...new Map(storedChildren.flatMap(c => c!.sources).map((value) => [this.sourceKey(value), value])).values()]; this.validateSources(source); const node: LcmNode = { nodeId:`condensed:${hash({ projectKey:this.projectKey, children:storedChildren.map(c=>c!.nodeId), branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:children[0]!.sessionId, branch, kind:\"condensed\", sources:source, children:children.map(c=>c.nodeId), depth:Math.max(...children.map(c=>c.depth))+1, sourceHash:hash(children.map(c=>c.sourceHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n private validateSources(source: LcmSourceRef[]) { const seen = new Set<string>(); for (const s of source) { if (seen.has(this.sourceKey(s))) throw new Error(\"duplicate source identity\"); seen.add(this.sourceKey(s)); } if (new Set(source.map(s => s.sessionId)).size !== 1) throw new Error(\"cross-session ranges\"); }\n private sourceKey(source: Pick<LcmSourceRef, \"sessionId\" | \"entryId\" | \"revision\">) { return `${source.sessionId}:${source.entryId}:${source.revision}`; }\n private publish(node: LcmNode) { this.ledger.transaction(db => { if (node.children.includes(node.nodeId)) throw new Error(\"cycle\"); for (const child of node.children) if (!db.prepare(\"SELECT 1 FROM summary_nodes WHERE node_id=? AND project_key=?\").get(child,this.projectKey)) throw new Error(\"missing child\"); db.prepare(\"INSERT OR IGNORE INTO summary_nodes(node_id,project_key,payload,created_at) VALUES(?,?,?,?)\").run(node.nodeId,this.projectKey,JSON.stringify(node),node.createdAt); for (const child of node.children) db.prepare(\"INSERT OR IGNORE INTO summary_edges(parent_id,child_id) VALUES(?,?)\").run(node.nodeId,child); const job = this.job(node); db.prepare(\"INSERT OR IGNORE INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)\").run(job.jobId,this.projectKey,job.state,JSON.stringify(job),job.createdAt,job.updatedAt); }); }\n private job(node:LcmNode): LcmJob { const t=this.now(); return {jobId:`job:${node.nodeId}`,projectKey:this.projectKey,nodeId:node.nodeId,priority:node.kind === \"condensed\" ? 20 : 10,eligibleAt:t,state:\"pending\",attempts:0,nextRetryAt:t,createdAt:t,updatedAt:t}; }\n claim(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old=parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t=this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if ((old.state !== \"pending\" && !expired) || old.eligibleAt > t || old.nextRetryAt > t) throw new Error(\"job not eligible\"); const active = (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? AND status=?\").all(this.projectKey, \"running\") as Array<{payload:string}>).map(r => parse<LcmJob>(r.payload)).filter(j => j.jobId !== old.jobId && (j.leaseUntil ?? 0) > t); if (active.length) throw new Error(\"project lease held\"); const nodeRow = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(old.nodeId,this.projectKey) as {payload?:string}|undefined; const sessionId = nodeRow?.payload ? parse<LcmNode>(nodeRow.payload).sessionId : \"\"; const day = this.day(t); const projectUsage = this.usage(db, day); const sessionUsage = this.usage(db, day, sessionId); if (projectUsage.calls >= this.budget.calls || projectUsage.inputTokens >= this.budget.inputTokens || projectUsage.outputTokens >= this.budget.outputTokens || projectUsage.cost >= this.budget.cost || projectUsage.wallMs >= this.budget.wallMs || sessionUsage.calls >= this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...old,state:\"running\" as const,ownerId,leaseToken:token(),leaseUntil:t+30_000,updatedAt:t}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n claimEmergency(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old = parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t = this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if (old.state === \"completed\") throw new Error(\"job already completed\"); const out = { ...old, state: \"running\" as const, ownerId, leaseToken: token(), leaseUntil: t + 30_000, updatedAt: t }; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n renew(job:LcmJob): LcmJob { return this.fenced(job, old => ({...old,leaseUntil:this.now()+30_000,updatedAt:this.now()})); }\n private validateText(text: unknown): asserts text is string { if (typeof text !== \"string\" || text.length === 0) throw new Error(\"invalid summary text\"); let length = 0; for (const _ of text) { length += 1; if (length > this.maxOutputChars) throw new Error(\"summary exceeds output bound\"); } }\n complete(job:LcmJob, result:LcmModelResult): LcmNode { this.validateText(result.text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } if (![result.inputTokens,result.outputTokens,result.cost,result.wallMs].every((value) => Number.isFinite(value) && value >= 0)) throw new Error(\"invalid model usage\"); const projectUsage = this.usage(db, this.day(this.now())); const sessionUsage = this.usage(db, this.day(this.now()), node.sessionId); if (projectUsage.calls + 1 > this.budget.calls || projectUsage.inputTokens + result.inputTokens > this.budget.inputTokens || projectUsage.outputTokens + result.outputTokens > this.budget.outputTokens || projectUsage.cost + result.cost > this.budget.cost || projectUsage.wallMs + result.wallMs > this.budget.wallMs || sessionUsage.calls + 1 > this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...node,state:\"ready\" as const,text:result.text,modelHash:result.modelHash}; this.account(db,node.sessionId,result); db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n completeEmergency(job:LcmJob, text:string): LcmNode { this.validateText(text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } const out={...node,state:\"ready\" as const,text,modelHash:\"emergency\"}; db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n fail(job:LcmJob,error:string): LcmJob { return this.fenced(job, old => { const attempts=old.attempts+1; const delay=Math.min(900_000,30_000*2**(attempts-1)); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = old; return {...base,attempts,error,state:attempts>=3?\"failed\":\"pending\",eligibleAt:this.now()+delay,nextRetryAt:this.now()+delay,updatedAt:this.now()}; }); }\n async run(job:LcmJob, model:LcmSummarizer, input:string, signal=new AbortController().signal): Promise<LcmNode> { let sources: LcmSourceRef[] = []; let claimed: LcmJob | undefined; const controller = new AbortController(); let renew: ReturnType<typeof setInterval> | undefined; const timer = setTimeout(() => controller.abort(), 60_000); const abort = () => controller.abort(); signal.addEventListener(\"abort\", abort, { once: true }); try { claimed=this.claim(job.jobId,job.ownerId ?? this.ownerId); const node=this.getNode(claimed.nodeId); sources=node?.sources ?? []; renew = setInterval(() => { try { if (claimed) claimed = this.renew(claimed); } catch {} }, 10_000); const result=await Promise.race([model.generate({prompt:buildLcmPrompt(node?.kind ?? \"leaf\",input,this.maxInputChars),sessionId:node?.sessionId ?? \"\",signal:controller.signal}), new Promise<never>((_, reject) => controller.signal.addEventListener(\"abort\", () => reject(new Error(\"LCM timeout\")), { once: true }))]); return this.complete(claimed,result); } catch (error) { if (!claimed) throw error; const fallback=emergencyReduce(input,this.maxOutputChars,sources); try { return this.completeEmergency(claimed,fallback); } catch { try { this.fail(claimed,String(error)); } catch {} throw error; } } finally { clearTimeout(timer); if (renew) clearInterval(renew); signal.removeEventListener(\"abort\", abort); } }\n private day(ms:number): string { return new Date(ms).toISOString().slice(0,10); }\n private usage(db:any, day:string, sessionId?:string): LcmBudget { const q = sessionId === undefined ? \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=?\" : \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=? AND session_id=?\"; const r=(sessionId === undefined ? db.prepare(q).get(this.projectKey,day) : db.prepare(q).get(this.projectKey,day,sessionId)) as LcmBudget; return r; }\n private account(db:any, sessionId:string, result:LcmModelResult) { const d=this.day(this.now()); db.prepare(\"INSERT INTO maintenance_usage(project_key,day,session_id,calls,input_tokens,output_tokens,cost,wall_ms) VALUES(?,?,?,?,?,?,?,?) ON CONFLICT(project_key,day,session_id) DO UPDATE SET calls=calls+excluded.calls,input_tokens=input_tokens+excluded.input_tokens,output_tokens=output_tokens+excluded.output_tokens,cost=cost+excluded.cost,wall_ms=wall_ms+excluded.wall_ms\").run(this.projectKey,d,sessionId,1,result.inputTokens,result.outputTokens,result.cost,result.wallMs); }\n private readJob(db: any,id:string):LcmJob { const row=db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(id,this.projectKey) as {payload:string}|undefined; if(!row) throw new Error(\"job not found\"); const job=parse<LcmJob>(row.payload); if(job.projectKey!==this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; }\n private assertLease(current:LcmJob, expected:LcmJob) { if(current.ownerId!==expected.ownerId || current.leaseToken!==expected.leaseToken || current.state!==\"running\" || (current.leaseUntil??0)<this.now()) throw new Error(\"lease fenced\"); }\n private fenced(job:LcmJob, update:(old:LcmJob)=>LcmJob):LcmJob { return this.ledger.transaction(db => { const old=this.readJob(db,job.jobId); this.assertLease(old,job); const out=update(old); db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),out.updatedAt,out.jobId,this.projectKey); return out; }); }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, hashLcmPayload, LcmLedger, type RawEntry } from \"../storage/lcm-ledger.js\";\nimport { reconcileSession } from \"../storage/lcm-migration.js\";\nimport { emergencyReduce, LcmModelAdapter, type LcmSummarizer } from \"./lcm-model.js\";\nimport { LcmMaintenance, type LcmJob, type LcmNode } from \"./lcm-maintenance.js\";\nimport type { LcmCompactionInput, LcmCompactionOutput } from \"./hook.js\";\n\nexport interface LcmRuntimeOptions {\n rootDir?: string;\n summaryModel?: string;\n maxLeafEntries?: number;\n maxCondenseChildren?: number;\n lcmMaxInputChars?: number;\n lcmMaxOutputTokens?: number;\n lcmMaxOutputChars?: number;\n}\n\nexport class LcmRuntime {\n readonly ledger: LcmLedger;\n readonly maintenance: LcmMaintenance;\n private readonly context: ExtensionContext;\n private readonly options: LcmRuntimeOptions;\n private readonly abort = new AbortController();\n private writePending: Promise<void> = Promise.resolve();\n private maintenancePending: Promise<void> = Promise.resolve();\n private closed = false;\n private dirty = false;\n private degradedError: unknown;\n private activeSources = new Set<string>();\n private activeSessionId: string | undefined;\n\n constructor(context: ExtensionContext, options: LcmRuntimeOptions = {}) {\n this.context = context;\n this.options = options;\n const recorded = context.sessionManager.getRecordedCwd?.();\n const liveCwd = recorded || context.cwd;\n const project = canonicalProjectIdentity({ liveCwd });\n const ledgerOptions = options.rootDir === undefined\n ? { project: { liveCwd: project.canonicalPath ?? liveCwd } }\n : { rootDir: options.rootDir, project: { liveCwd: project.canonicalPath ?? liveCwd } };\n this.ledger = new LcmLedger(ledgerOptions);\n this.maintenance = new LcmMaintenance(this.ledger, {\n ...options,\n ...(options.lcmMaxInputChars === undefined ? {} : { maxInputChars: options.lcmMaxInputChars }),\n ...(options.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: options.lcmMaxOutputChars }),\n });\n }\n\n get projectKey(): string { return this.ledger.project.key; }\n get signal(): AbortSignal { return this.abort.signal; }\n get status(): \"healthy\" | \"degraded\" { return this.degradedError === undefined ? \"healthy\" : \"degraded\"; }\n get error(): unknown { return this.degradedError; }\n markDirty(): void { this.dirty = true; }\n\n private enqueueWrite(operation: () => void | Promise<void>): Promise<void> {\n const run = this.writePending.then(operation);\n this.writePending = run.catch((error) => { this.degradedError = error; });\n return run;\n }\n\n private refreshActiveSources(sessionId: string, entries: readonly { id: string }[]): void {\n const ids = new Set(entries.map((entry) => entry.id));\n const latest = new Map<string, RawEntry>();\n for (const entry of this.ledger.readRaw(this.projectKey, sessionId)) {\n if (!ids.has(entry.entryId)) continue;\n const previous = latest.get(entry.entryId);\n if (!previous || previous.revision < entry.revision) latest.set(entry.entryId, entry);\n }\n this.activeSources = new Set(\n [...latest.values()].map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n this.activeSessionId = sessionId;\n }\n\n reconcileSelectedSession(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n const getSessionFile = this.context.sessionManager.getSessionFile;\n if (typeof getSessionFile !== \"function\") return;\n const sessionFile = getSessionFile.call(this.context.sessionManager);\n if (!sessionFile) return;\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const cwd = recorded || this.context.cwd;\n const result = reconcileSession({\n agentDir: this.options.rootDir ?? process.env.PI_CODING_AGENT_DIR ?? `${process.env.HOME ?? \".\"}/.omp/agent`,\n ledger: this.ledger,\n files: [sessionFile],\n liveCwd: cwd,\n projectCwd: cwd,\n apply: true,\n });\n this.degradedError = result.counts.errors > 0\n ? new Error(`LCM session reconciliation reported ${result.counts.errors} error(s)`)\n : undefined;\n const sessionId = this.context.sessionManager.getSessionId();\n this.refreshActiveSources(sessionId, this.context.sessionManager.getBranch());\n });\n }\n\n readback(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n if (this.closed) return;\n const entries = this.context.sessionManager.getBranch();\n const sessionId = this.context.sessionManager.getSessionId();\n const branch = this.context.sessionManager.getLeafId();\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const active = new Set<string>();\n for (const entry of entries) {\n const payloadJson = canonicalLcmPayload(entry);\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch,\n ...(recorded || this.context.cwd ? { recordedCwd: recorded || this.context.cwd } : {}),\n });\n active.add(`${sessionId}:${stored.entryId}:${stored.revision}`);\n }\n this.activeSources = active;\n this.activeSessionId = sessionId;\n this.dirty = false;\n this.degradedError = undefined;\n });\n }\n\n async syncAndSchedule(): Promise<void> {\n if (this.closed) return;\n await this.readback();\n this.scheduleMaintenance();\n }\n\n maintain(): Promise<void> { return this.syncAndSchedule(); }\n\n scheduleMaintenance(): void {\n if (this.closed) return;\n const run = this.maintenancePending.then(() => this.runMaintenance());\n this.maintenancePending = run.catch((error) => { this.degradedError = error; });\n }\n\n private async runMaintenance(): Promise<void> {\n if (this.closed || !this.activeSessionId || this.activeSources.size === 0) return;\n let model: LcmSummarizer;\n try {\n model = new LcmModelAdapter(this.context, this.options.summaryModel, true, {\n ...(this.options.lcmMaxInputChars === undefined ? {} : { maxInputChars: this.options.lcmMaxInputChars }),\n ...(this.options.lcmMaxOutputTokens === undefined ? {} : { maxOutputTokens: this.options.lcmMaxOutputTokens }),\n ...(this.options.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: this.options.lcmMaxOutputChars }),\n });\n } catch (error) {\n this.degradedError = error;\n model = { modelHash: \"unavailable\", generate: async () => { throw error instanceof Error ? error : new Error(String(error)); } };\n }\n const budget = Math.max(1, this.options.maxCondenseChildren ?? 4);\n const sessionId = this.activeSessionId;\n const raw = this.ledger.readRaw(this.projectKey, sessionId).filter((entry) =>\n this.activeSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n const inputFor = (node: NonNullable<ReturnType<LcmMaintenance[\"getNode\"]>>): string => {\n if (node.kind === \"condensed\") return node.children.map((id) => this.maintenance.getNode(id)?.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n return node.sources.map((source) => {\n const entry = this.ledger.readRawEntry(this.projectKey, source.sessionId, source.entryId, source.revision);\n if (!entry || entry.payloadHash !== source.payloadHash) throw new Error(\"stale source\");\n return entry.payloadJson;\n }).join(\"\\n\");\n };\n const runJob = async (job: LcmJob, node: LcmNode): Promise<void> => {\n try { await this.maintenance.run(job, model, inputFor(node), this.signal); } catch {}\n };\n for (let pass = 0; pass < budget && !this.closed; pass += 1) {\n const leafCandidate = this.maintenance.createLeaf(this.maintenance.selectLeaf(raw, this.context.sessionManager.getLeafId()));\n const leaf = leafCandidate ? this.maintenance.getNode(leafCandidate.nodeId) : undefined;\n if (leaf?.state === \"pending\") {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (job) await runJob(job, leaf);\n }\n const branch = this.context.sessionManager.getLeafId();\n const pending = this.maintenance.listJobs().filter((job) => job.state === \"pending\").flatMap((job) => {\n const node = this.maintenance.getNode(job.nodeId);\n if (!node || node.sessionId !== sessionId || (branch !== null && node.branch !== branch && node.branch !== null) || !node.sources.every((source) => this.activeSources.has(`${source.sessionId}:${source.entryId}:${source.revision}`))) return [];\n return [{ job, node }];\n }).slice(0, budget);\n for (const item of pending) await runJob(item.job, item.node);\n const children = this.maintenance.selectCondensation(sessionId, this.activeSources, this.context.sessionManager.getLeafId());\n if (children.length >= budget) {\n const node = this.maintenance.createCondensed(children);\n if (node) {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === node.nodeId);\n if (job) await runJob(job, node);\n }\n }\n if (!leaf && pending.length === 0 && children.length < budget) break;\n }\n }\n\n compact(input: LcmCompactionInput): LcmCompactionOutput {\n const persistedEntries = new Map<string, RawEntry>();\n for (const entry of input.branchEntries) {\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const payloadJson = canonicalLcmPayload(entry);\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId: input.sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch: input.branch,\n });\n persistedEntries.set(`${entry.id}:${stored.payloadHash}`, stored);\n }\n const firstKeptIndex = input.firstKeptEntryId\n ? input.branchEntries.findIndex((entry) => entry.id === input.firstKeptEntryId)\n : input.branchEntries.length;\n const sourceEntries = input.branchEntries.slice(0, firstKeptIndex < 0 ? input.branchEntries.length : firstKeptIndex);\n const selectedStored = sourceEntries.map((entry) => {\n const payloadHash = hashLcmPayload(JSON.parse(canonicalLcmPayload(entry)));\n const stored = persistedEntries.get(`${entry.id}:${payloadHash}`);\n if (!stored) throw new Error(\"compaction source was not persisted\");\n return stored;\n });\n const activeSources = new Set(selectedStored.map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`));\n const frontier = this.maintenance.getFrontier(input.sessionId, input.branch, activeSources);\n const coveredSources = new Set(frontier.flatMap((node) => node.sources.map((source) => `${source.sessionId}:${source.entryId}:${source.revision}`)));\n const summary = frontier.map((node) => node.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n if (summary && selectedStored.every((entry) => coveredSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`))) return { summary, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"ready-frontier\", branch: input.branch };\n if (selectedStored.length === 0) throw new Error(\"LCM emergency fallback has no persisted sources\");\n const payloads = sourceEntries.map((entry) => canonicalLcmPayload(entry)).join(\"\\n\");\n const sources = selectedStored.map((stored) => ({ sessionId: stored.sessionId, entryId: stored.entryId, revision: stored.revision, payloadHash: stored.payloadHash }));\n const fallback = emergencyReduce(payloads, this.options.lcmMaxOutputChars ?? 4_096, sources);\n const leaf = this.maintenance.createLeaf(selectedStored);\n if (!leaf) throw new Error(\"LCM emergency fallback node was not created\");\n const persisted = this.maintenance.getNode(leaf.nodeId);\n if (persisted?.state === \"ready\") {\n if (persisted.branch !== input.branch || JSON.stringify(persisted.sources) !== JSON.stringify(sources)) throw new Error(\"LCM emergency fallback provenance mismatch\");\n if (!persisted.text) throw new Error(\"LCM emergency fallback text is missing\");\n return { summary: persisted.text, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (!job) throw new Error(\"LCM emergency fallback job was not created\");\n const completed = this.maintenance.completeEmergency(this.maintenance.claimEmergency(job.jobId), fallback);\n return { summary: completed.text ?? fallback, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n\n memoryContext() {\n return {\n ledger: {\n projectKey: this.projectKey,\n readRaw: (sessionId?: string) => this.ledger.readRaw(this.projectKey, sessionId),\n readRawPage: (sessionId?: string, offset?: number, limit?: number) => this.ledger.readRawPage(this.projectKey, sessionId, offset, limit),\n readRawEntry: (sessionId: string, entryId: string, revision: number) => this.ledger.readRawEntry(this.projectKey, sessionId, entryId, revision),\n },\n ...(this.activeSessionId === undefined ? {} : { currentSessionId: this.activeSessionId }),\n summaries: {\n listNodes: ({ sessionId, branch, limit }: { sessionId?: string; branch?: string | null; limit: number }) => this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined).slice(0, limit).map((node) => ({ ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) })),\n getNode: (nodeId: string) => {\n const node = this.maintenance.getNode(nodeId);\n return node ? { ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) } : undefined;\n },\n },\n branchForSession: (sessionId: string) => sessionId === this.activeSessionId\n ? { branch: this.context.sessionManager.getLeafId(), activeSourceKeys: [...this.activeSources], ready: this.status === \"healthy\" }\n : undefined,\n };\n }\n\n frontier(sessionId?: string, branch?: string | null) {\n return this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined);\n }\n\n raw(sessionId?: string): RawEntry[] { return this.ledger.readRaw(this.projectKey, sessionId); }\n\n async shutdown(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.abort.abort();\n await this.writePending.catch(() => undefined);\n await this.maintenancePending.catch(() => undefined);\n this.ledger.close();\n }\n}\n", "import path from \"node:path\";\nimport type {\n ToolCallEvent,\n ToolCallEventResult,\n ToolResultEvent,\n ExtensionContext,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport { readFabricExecutionTraceV1 } from \"../audit/index.js\";\nimport { NESTED_TOOL_CALL_ID_PREFIX } from \"./action-registry.js\";\nimport { OMP_CORE_TOOL_NAME_SET } from \"./omp-tools.js\";\n\nexport interface FabricToolOwnershipHost {\n getActiveTools(): string[];\n setActiveTools(names: string[]): void;\n}\n\nexport interface FabricTopLevelToolAuthorizer {\n authorize(ref: string, parentToolCallId: string): Promise<void>;\n}\n\nexport interface FabricTopLevelToolApprover {\n approve(event: ToolCallEvent, context: ExtensionContext): Promise<void>;\n}\n\nconst FABRIC_TOOL_NAME = \"fabric_exec\";\nconst TOP_LEVEL_SCHEMA_REF_PREFIX = \"schema.top_level_tool.\";\n\nexport const ownsFabricToolSource = (\n tools: Array<{ name: string; sourceInfo: { path: string } }>,\n extensionEntryPath: string,\n): boolean => tools.some(\n (tool) =>\n tool.name === FABRIC_TOOL_NAME &&\n path.resolve(tool.sourceInfo.path) === path.resolve(extensionEntryPath),\n);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst finalFabricDetailsFailed = (details: unknown): boolean => {\n if (!isRecord(details)) return false;\n if (details.success === false) return true;\n const trace = readFabricExecutionTraceV1(details.trace);\n return trace !== undefined && trace.outcome !== \"succeeded\";\n};\n\nexport class FabricToolLifecycle {\n readonly #outerCalls = new Set<string>();\n\n constructor(\n readonly ownsFabricTool: () => boolean,\n readonly authorizer: () => FabricTopLevelToolAuthorizer | undefined,\n readonly approver: () => FabricTopLevelToolApprover | undefined = () => undefined,\n ) {}\n\n async toolCall(\n event: ToolCallEvent,\n context?: ExtensionContext,\n ): Promise<ToolCallEventResult | undefined> {\n if (event.toolCallId.startsWith(NESTED_TOOL_CALL_ID_PREFIX)) {\n if (this.#outerCalls.size > 0) return undefined;\n await this.#authorizeTopLevel(event);\n return undefined;\n }\n if (event.toolName === FABRIC_TOOL_NAME && this.ownsFabricTool()) {\n this.#outerCalls.add(event.toolCallId);\n return undefined;\n }\n await this.#authorizeTopLevel(event);\n const approver = this.approver();\n if (approver) {\n if (!context) throw new Error(\"Fabric direct tool approval needs an extension context\");\n await approver.approve(event, context);\n }\n return undefined;\n }\n\n toolResult(event: ToolResultEvent): { isError: true } | undefined {\n if (\n event.toolName !== FABRIC_TOOL_NAME ||\n event.toolCallId.startsWith(NESTED_TOOL_CALL_ID_PREFIX) ||\n !this.#outerCalls.delete(event.toolCallId)\n ) {\n return undefined;\n }\n return !event.isError && finalFabricDetailsFailed(event.details)\n ? { isError: true }\n : undefined;\n }\n\n clear(): void {\n this.#outerCalls.clear();\n }\n\n async #authorizeTopLevel(event: ToolCallEvent): Promise<void> {\n await this.authorizer()?.authorize(\n `${TOP_LEVEL_SCHEMA_REF_PREFIX}${event.toolName}`,\n event.toolCallId,\n );\n }\n}\n\nconst sameTools = (left: string[], right: string[]): boolean =>\n left.length === right.length && left.every((name, index) => name === right[index]);\n\nexport interface ToolOwnershipReassertion {\n reassert(): void;\n schedule(): void;\n}\n\n// Re-asserts active-set ownership after registry refreshes and at turn\n// boundaries. Refresh-driven microtasks can run before the host finished\n// initializing (registry rebuilds happen before session_start), when neither\n// the live config nor the active tool set is safe to touch \u2014 `ready` guards\n// every entry point, including the deferred microtask.\nexport const createToolOwnershipReassertion = (options: {\n ready: () => boolean;\n active: () => boolean;\n hiddenNames: () => ReadonlySet<string>;\n apply: (hidden: ReadonlySet<string>) => boolean;\n}): ToolOwnershipReassertion => {\n let queued = false;\n const reassert = (): void => {\n queued = false;\n if (!options.ready() || !options.active()) return;\n options.apply(options.hiddenNames());\n };\n return {\n reassert,\n schedule: () => {\n if (queued) return;\n queued = true;\n queueMicrotask(reassert);\n },\n };\n};\n\nexport class FabricToolOwnership {\n #savedNativeCoreTools: Array<{ name: string; index: number }> | undefined;\n // Captured extension tools stay registered so host extensions (permission\n // systems, auditors) keep them in `omp.getAllTools()`; hiding from the model\n // happens here, in the active set. Removed names are remembered so leaving\n // full code mode (or adding a name to `capture.keepVisible`) re-exposes them.\n #savedHiddenExtensionTools = new Map<string, number>();\n\n constructor(readonly host: FabricToolOwnershipHost) {}\n\n apply(\n fullCodeModeOrPolicy: boolean | {\n fullCodeMode: boolean;\n schemaMode?: string;\n includeTools?: ReadonlySet<string>;\n excludeTools?: ReadonlySet<string>;\n },\n hiddenExtensionTools?: ReadonlySet<string>,\n ): boolean {\n const active = this.host.getActiveTools();\n const policy = typeof fullCodeModeOrPolicy === \"boolean\"\n ? { fullCodeMode: fullCodeModeOrPolicy, includeTools: new Set<string>(), excludeTools: new Set<string>() }\n : fullCodeModeOrPolicy;\n const enforce = policy.schemaMode === \"enforce\";\n const include = policy.includeTools ?? new Set<string>();\n const exclude = policy.excludeTools ?? new Set<string>();\n const hideCore = policy.fullCodeMode || enforce;\n const hidden = hiddenExtensionTools ?? new Set<string>();\n if (!hideCore && hidden.size === 0 && exclude.size === 0) return this.#restore(active);\n if (hideCore) {\n this.#savedNativeCoreTools ??= active.flatMap((name, index) =>\n OMP_CORE_TOOL_NAME_SET.has(name) ? [{ name, index }] : [],\n );\n }\n const next: string[] = [];\n for (const [index, name] of active.entries()) {\n const coreHidden = hideCore && OMP_CORE_TOOL_NAME_SET.has(name) && (enforce || !include.has(name));\n const extensionHidden = hidden.has(name) && !include.has(name);\n const explicitlyExcluded = exclude.has(name);\n if (coreHidden || extensionHidden || explicitlyExcluded) {\n if ((extensionHidden || explicitlyExcluded) && !this.#savedHiddenExtensionTools.has(name)) {\n this.#savedHiddenExtensionTools.set(name, index);\n }\n continue;\n }\n next.push(name);\n }\n for (const [name, index] of this.#savedHiddenExtensionTools) {\n if (hidden.has(name) || exclude.has(name) || next.includes(name)) continue;\n this.#savedHiddenExtensionTools.delete(name);\n next.splice(Math.min(index, next.length), 0, name);\n }\n return this.#setIfChanged(active, next);\n }\n\n release(): boolean {\n return this.#restore(this.host.getActiveTools());\n }\n\n #restore(active: string[]): boolean {\n const saved = this.#savedNativeCoreTools;\n const savedHidden = this.#savedHiddenExtensionTools;\n if (!saved && savedHidden.size === 0) return false;\n this.#savedNativeCoreTools = undefined;\n this.#savedHiddenExtensionTools = new Map();\n const next = [...active];\n for (const { name, index } of saved ?? []) {\n if (!next.includes(name)) next.splice(Math.min(index, next.length), 0, name);\n }\n for (const [name, index] of savedHidden) {\n if (!next.includes(name)) next.splice(Math.min(index, next.length), 0, name);\n }\n return this.#setIfChanged(active, next);\n }\n\n #setIfChanged(active: string[], next: string[]): boolean {\n if (sameTools(active, next)) return false;\n this.host.setActiveTools(next);\n return true;\n }\n}\n", "import {\n isFabricExecutionTraceV1,\n type FabricExecutionTraceOperationV1,\n type FabricExecutionTraceV1,\n} from \"./trace.js\";\n\nexport const FABRIC_EXECUTION_DETAILS_MAX_BYTES = 512 * 1024;\n\nexport interface FabricSpeculationSummaryV1 {\n launched: number;\n hit: number;\n missed: number;\n discarded: number;\n}\n\nexport interface FabricPersistedExecutionDetailsV1 {\n success: boolean;\n trace: FabricExecutionTraceV1;\n /** Rich render audits persisted verbatim (minus in-memory media) so a resumed transcript re-renders \u2014 and expands \u2014 exactly like the live one. */\n audits: FabricLegacyRenderAudit[];\n phases: string[];\n speculation?: FabricSpeculationSummaryV1;\n error?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n}\n\n/**\n * The audit fields that cross into the session record; read back by\n * {@link legacyAudit}. In-memory-only payloads (image blocks, media notes,\n * correlation ids) never persist.\n */\nexport interface FabricPersistableAuditInput {\n ref: string;\n tool?: string;\n provider?: string;\n success?: boolean;\n error?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n resultTruncated?: boolean;\n preview?: unknown;\n startedAt?: number;\n endedAt?: number;\n speculated?: boolean;\n}\n\nexport interface FabricLegacyRenderAudit {\n ref: string;\n tool?: string;\n provider?: string;\n success?: boolean;\n error?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n resultTruncated?: boolean;\n preview?: unknown;\n /** Set only when reconstructed from the durable trace: args are privacy-projected and results/previews are not retained. */\n fromTrace?: boolean;\n startedAt?: number;\n endedAt?: number;\n speculated?: boolean;\n}\n\nexport interface FabricExecutionRenderDetails {\n success?: boolean;\n error?: string;\n progress?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n phases: string[];\n audits: FabricLegacyRenderAudit[];\n}\n\nconst serializedBytes = (value: unknown): number =>\n Buffer.byteLength(JSON.stringify(value), \"utf8\");\n\nconst cloneTrace = (trace: FabricExecutionTraceV1): FabricExecutionTraceV1 =>\n structuredClone(trace);\n\nconst persistableAudit = (audit: FabricPersistableAuditInput): FabricLegacyRenderAudit =>\n structuredClone({\n ref: audit.ref,\n ...(audit.tool !== undefined ? { tool: audit.tool } : {}),\n ...(audit.provider !== undefined ? { provider: audit.provider } : {}),\n ...(audit.success !== undefined ? { success: audit.success } : {}),\n ...(audit.error !== undefined ? { error: audit.error } : {}),\n ...(audit.args !== undefined ? { args: audit.args } : {}),\n ...(audit.result !== undefined ? { result: audit.result } : {}),\n ...(audit.resultTruncated !== undefined ? { resultTruncated: audit.resultTruncated } : {}),\n ...(audit.preview !== undefined ? { preview: audit.preview } : {}),\n ...(audit.startedAt !== undefined ? { startedAt: audit.startedAt } : {}),\n ...(audit.endedAt !== undefined ? { endedAt: audit.endedAt } : {}),\n ...(audit.speculated === true ? { speculated: true } : {}),\n });\n\n/**\n * Creates the only object stored in final fabric_exec details. The\n * privacy-projected trace stays the functional record for compaction and tool\n * ownership; rich call audits persist verbatim (minus in-memory media) so a\n * resumed transcript re-renders and expands exactly like the live one \u2014 the\n * collapsed display, not the session record, is the visual boundary. The\n * aggregate object, not each member independently, is bound; display-only\n * audits trim before the functional trace.\n */\nexport const createFabricPersistedExecutionDetails = (input: {\n success: boolean;\n trace: FabricExecutionTraceV1;\n audits?: readonly FabricPersistableAuditInput[];\n phases?: readonly string[];\n speculation?: FabricSpeculationSummaryV1;\n error?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n}): FabricPersistedExecutionDetailsV1 => {\n const details: FabricPersistedExecutionDetailsV1 = {\n success: input.success,\n trace: cloneTrace(input.trace),\n audits: (input.audits ?? []).map(persistableAudit),\n phases: (input.phases ?? []).filter((phase): phase is string => typeof phase === \"string\"),\n ...(input.speculation ? { speculation: input.speculation } : {}),\n ...(typeof input.error === \"string\" && input.error ? { error: input.error } : {}),\n ...(input.outputFormat ? { outputFormat: input.outputFormat } : {}),\n ...(input.outputFormatStartLine !== undefined\n ? { outputFormatStartLine: Math.max(0, Math.floor(input.outputFormatStartLine)) }\n : {}),\n ...(input.outputFormatLines !== undefined\n ? { outputFormatLines: Math.max(0, Math.floor(input.outputFormatLines)) }\n : {}),\n };\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.audits.length > 0\n ) {\n details.audits.pop();\n }\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.trace.operations.length > 0\n ) {\n details.trace.operations.pop();\n details.trace.counts.droppedOperations++;\n }\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.phases.length > 0\n ) {\n details.phases.pop();\n }\n while (\n serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES &&\n details.trace.phases.length > 0\n ) {\n details.trace.phases.pop();\n details.trace.counts.droppedValues++;\n }\n if (serializedBytes(details) > FABRIC_EXECUTION_DETAILS_MAX_BYTES) {\n delete details.trace.error;\n details.trace.counts.droppedValues++;\n }\n return details;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst legacyAudit = (value: unknown): FabricLegacyRenderAudit | undefined => {\n if (!isRecord(value) || typeof value.ref !== \"string\") return undefined;\n return {\n ref: value.ref,\n ...(typeof value.tool === \"string\" ? { tool: value.tool } : {}),\n ...(typeof value.provider === \"string\" ? { provider: value.provider } : {}),\n ...(typeof value.success === \"boolean\" ? { success: value.success } : {}),\n ...(typeof value.error === \"string\" ? { error: value.error } : {}),\n ...(isRecord(value.args) ? { args: value.args } : {}),\n ...(value.result !== undefined ? { result: value.result } : {}),\n ...(typeof value.resultTruncated === \"boolean\"\n ? { resultTruncated: value.resultTruncated }\n : {}),\n ...(value.preview !== undefined ? { preview: value.preview } : {}),\n ...(typeof value.startedAt === \"number\" ? { startedAt: value.startedAt } : {}),\n ...(typeof value.endedAt === \"number\" ? { endedAt: value.endedAt } : {}),\n ...(value.speculated === true ? { speculated: true } : {}),\n };\n};\n\nconst auditFromOperation = (\n operation: FabricExecutionTraceOperationV1,\n): FabricLegacyRenderAudit => ({\n ref: operation.ref,\n fromTrace: true,\n ...(operation.action ? { tool: operation.action } : {}),\n ...(operation.provider ? { provider: operation.provider } : {}),\n success: operation.outcome === \"succeeded\",\n ...(operation.error ? { error: operation.error } : {}),\n ...(Object.keys(operation.args).length > 0 ? { args: operation.args } : {}),\n ...(operation.result !== undefined ? { result: operation.result } : {}),\n ...(operation.resultTruncated === true ? { resultTruncated: true } : {}),\n});\n\n/**\n * Adapts both old audit-bearing session details and current trace-only details\n * for rendering. Legacy audits win when present so old transcripts retain\n * their historical rich previews.\n */\nexport const readFabricExecutionRenderDetails = (\n value: unknown,\n): FabricExecutionRenderDetails => {\n if (!isRecord(value)) return { audits: [], phases: [] };\n const trace = isFabricExecutionTraceV1(value.trace) ? value.trace : undefined;\n const oldAudits = Array.isArray(value.audits)\n ? value.audits.map(legacyAudit).filter((audit): audit is FabricLegacyRenderAudit => audit !== undefined)\n : undefined;\n const oldPhases = Array.isArray(value.phases)\n ? value.phases.filter((phase): phase is string => typeof phase === \"string\")\n : undefined;\n return {\n ...(typeof value.success === \"boolean\"\n ? { success: value.success }\n : trace\n ? { success: trace.outcome === \"succeeded\" }\n : {}),\n ...(typeof value.error === \"string\"\n ? { error: value.error }\n : trace?.error\n ? { error: trace.error }\n : {}),\n ...(typeof value.progress === \"string\" ? { progress: value.progress } : {}),\n ...(value.outputFormat === \"yaml\" || value.outputFormat === \"json\"\n ? { outputFormat: value.outputFormat }\n : {}),\n ...(typeof value.outputFormatStartLine === \"number\" &&\n Number.isFinite(value.outputFormatStartLine) &&\n value.outputFormatStartLine >= 0\n ? { outputFormatStartLine: Math.floor(value.outputFormatStartLine) }\n : {}),\n ...(typeof value.outputFormatLines === \"number\" &&\n Number.isFinite(value.outputFormatLines) &&\n value.outputFormatLines >= 0\n ? { outputFormatLines: Math.floor(value.outputFormatLines) }\n : {}),\n phases: oldPhases ?? trace?.phases ?? [],\n audits: oldAudits ?? trace?.operations.map(auditFromOperation) ?? [],\n };\n};\n", "import type { CapturedToolCatalog } from \"../capture/catalog.js\";\nimport { OMP_CORE_TOOL_NAMES } from \"./omp-tools.js\";\n\n/**\n * Append authored guidance from the current exact-name core overrides without\n * presenting those definitions as separate extension tools.\n */\nexport const coreOverridePromptGuidance = (\n catalog: CapturedToolCatalog,\n): string => {\n const sections: string[] = [];\n for (const name of OMP_CORE_TOOL_NAMES) {\n const entry = catalog.get(name);\n if (!entry) continue;\n const definition = entry.definition;\n const snippet = Reflect.get(definition, \"promptSnippet\");\n const guidelines = Reflect.get(definition, \"promptGuidelines\");\n const lines: string[] = [];\n if (typeof snippet === \"string\" && snippet.length > 0) {\n lines.push(`Additional guidance for \\`omp.${name}\\`: ${snippet}`);\n }\n if (Array.isArray(guidelines) && guidelines.every((guideline): guideline is string => typeof guideline === \"string\")) {\n lines.push(`Guidelines for \\`omp.${name}\\`:`);\n lines.push(...guidelines.map((guideline) => `- ${guideline}`));\n }\n if (lines.length > 0) sections.push(lines.join(\"\\n\"));\n }\n return sections.length > 0\n ? `\\n\\nEffective compatible core override guidance:\\n${sections.join(\"\\n\")}`\n : \"\";\n};\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const fabricExecutionKernelGuidance = (fullCodeMode: boolean): string =>\n [\n fullCodeMode\n ? \"OMP Fabric full code mode: `fabric_exec` is the only way to call OMP core tools \u2014 use them as `omp.*` inside `code`.\"\n : \"OMP Fabric is in orchestration-only mode. OMP core and registered extension tools stay on their native direct execution path; inside fabric_exec, `omp.*` and `extensions.*` are unavailable.\",\n // Files the model has not opened (images in particular) must be read before\n // use; this line rides the turn-stable kernel guidance so provider prefix\n // caches stay warm.\n `Read every file the user provides (images, screenshots, code, text) with the ${fullCodeMode ? \"`omp.read`\" : \"`read`\"} tool before responding \u2014 never assume its contents.`,\n ].join(\" \");\n\nexport const defaultFabricExecutionGuidance = (fullCodeMode: boolean): string =>\n fullCodeMode\n ? \"Examples and returns: `omp.read('/x')`, `omp.grep('TODO','src')` / `omp.grep({pattern:'TODO', path:'src', ignoreCase:true, context:2})`, `omp.find({pattern:'*.ts', path:'src', limit:20})`, and `omp.ls('src')` return strings; `omp.bash({cmd:'ls'})`, `omp.edit({path:'/x', old:'a', new:'b'})`, and `omp.write({path:'/y', text:'z'})` return `{ok, output, details}` (read `.output`); failed core calls reject, including shell tools on an ordinary nonzero exit; pass `settle: true` to `omp.bash` to get `{ ok: false, exitCode, output, error }` instead. Timeout, cancellation, approval, and security failures still reject.\\n`tools` is discovery + generic calls only (`providers`/`catalog`/`list`/`search`/`describe`/`call`/`models`). Call known MCP tools as `mcp.<sanitized_server>.<sanitized_tool>(args)`, captured tools as `extensions.<tool>(args)`, and stable providers as `memory.*`, `state.*`, `schema.*`, or `compact.*`. Use `tools.call({ref,args})` for computed refs. `omp` is the core tools; `omp.<key>` reads a named `payloads` value (not a tool).\"\n : \"Call known actions through `mcp.<sanitized_server>.<sanitized_tool>(args)`, `memory.*`, `state.*`, `schema.*`, `components.*`, `compact.*`, `codemap.*`, `agents.*`, or `mesh.*`; use `tools.catalog`/`search`/`describe`/`list` for discovery and `tools.call({ref,args})` for computed refs. Other surfaces are opt-in via user-loaded skills.\";\n\n// Shape of CapturedToolCatalog entries this renderer needs (kept structural to avoid a runtime dependency on the capture layer from a guidance module).\nexport interface ExtensionRosterToolSource {\n name: string;\n sourceInfo?: { source?: string; path?: string };\n}\n\n// Namespace labels come from the extension package's own identity: the\n// package.json `name` nearest the tool's source file, mirroring how OMP names\n// npm-installed packages. Raw `source` strings are configured specifiers that\n// are often full relative paths, so they are only used when no manifest exists.\nconst manifestNameCache = new Map<string, string | undefined>();\n\nconst packageNameFromManifest = (startPath: string | undefined): string | undefined => {\n if (!startPath) return undefined;\n let directory = path.dirname(path.resolve(startPath));\n while (true) {\n if (manifestNameCache.has(directory)) return manifestNameCache.get(directory);\n const manifestPath = path.join(directory, \"package.json\");\n let name: string | undefined;\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (typeof manifest.name === \"string\" && manifest.name.trim()) name = manifest.name.trim();\n } catch {\n // Unreadable or invalid manifest; keep walking upward.\n }\n }\n manifestNameCache.set(directory, name);\n if (name) return name;\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\n// In full code mode the model sees only fabric_exec in its tool list, so\n// registered extension tools are invisible unless named up front (#69). The\n// roster stays names-only: descriptions and schemas are on demand through the\n// tools.list/search/describe discovery surface, so the standing prompt cost is\n// a bare name index. Core overrides are excluded: they surface as omp.* via\n// coreOverridePromptGuidance.\nexport const extensionToolRosterGuidance = (\n tools: ReadonlyArray<ExtensionRosterToolSource>,\n coreToolNames: ReadonlySet<string>,\n): string | undefined => {\n const extensionTools = tools.filter((tool) => !coreToolNames.has(tool.name));\n if (extensionTools.length === 0) return undefined;\n const namespaceLabel = (tool: ExtensionRosterToolSource): string => {\n const source = tool.sourceInfo?.source?.trim();\n if (source?.startsWith(\"npm:\")) return source.slice(\"npm:\".length) || source;\n const manifestName =\n packageNameFromManifest(tool.sourceInfo?.path) ??\n packageNameFromManifest(source && /[\\\\/]/.test(source) ? source : undefined);\n if (manifestName) return manifestName;\n if (source && !/[\\\\/]/.test(source)) return source;\n const parts = (tool.sourceInfo?.path ?? source ?? \"\").split(/[\\\\/]/).filter(Boolean);\n const base = parts.at(-1)?.trim() ?? \"\";\n // Entry files like index.js name the package directory, not the source.\n if (/^index\\./i.test(base)) return parts.at(-2)?.trim() || base;\n return base || \"extensions\";\n };\n const groups = new Map<string, string[]>();\n for (const tool of [...extensionTools].sort((left, right) => left.name.localeCompare(right.name))) {\n const label = namespaceLabel(tool);\n const names = groups.get(label);\n if (names) names.push(tool.name);\n else groups.set(label, [tool.name]);\n }\n return [\n \"Registered extension tools are callable inside fabric_exec as `extensions.<name>(args)`; run `tools.list` for full descriptions and schemas before re-implementing an effect with omp.bash.\",\n ...[...groups.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([label, names]) => \"- \" + label + \": \" + names.join(\", \")),\n ].join(\"\\n\");\n};\n\nexport const fabricSchemaGuidance = (mode: \"off\" | \"audit\" | \"enforce\"): string | undefined => {\n if (mode === \"enforce\") {\n return \"Schema enforce mode is fixed for this session. Reads remain available, but protected-workspace changes must use schema.hypothesize \u2192 schema.verify \u2192 schema.commit in the same fabric_exec invocation. Direct omp.edit/write/bash, agents, state/mesh writes, compaction requests, MCP, extensions, and external providers are blocked by the host gate.\";\n }\n if (mode === \"audit\") {\n return \"Schema audit mode reports actions that enforce mode would block, but preserves their current behavior.\";\n }\n return undefined;\n};\n", "\nimport { getActiveSkills, Settings, type Skill } from \"@oh-my-pi/pi-coding-agent\";\nimport { formatSkillsSection } from \"./skill-block.js\";\n\nconst OMP_SKILL_SECTION_MARKER = \"<skills>\";\nconst OMP_SKILL_SECTION_HEADING = \"# Skills & Rules\\n\";\nconst OMP_SKILL_LOAD_INSTRUCTION = \"Matching skill \u2192 MUST read \\`skill://<name>\\` first.\";\nconst OMP_CUSTOM_SKILL_LOAD_INSTRUCTION =\n \"If a skill applies, you MUST read \\`skill://<name>\\` before proceeding.\";\nconst FABRIC_OMP_SKILL_LOAD_INSTRUCTION =\n \"Matching skill \u2192 MUST read \\`skill://<name>\\` through \\`omp.read\\` inside \\`fabric_exec\\` first.\";\nconst FABRIC_CUSTOM_SKILL_LOAD_INSTRUCTION =\n \"If a skill applies, you MUST read \\`skill://<name>\\` through \\`omp.read\\` inside \\`fabric_exec\\` before proceeding.\";\n\nexport const activeSkills = (): readonly Skill[] => getActiveSkills();\n\nexport const listableSkills = (skills: readonly Skill[]): readonly Skill[] => {\n try {\n if (Settings.instance.get(\"skillful\") === false) return [];\n } catch {\n return skills;\n }\n return skills;\n};\n\nexport const restoreSkillsForFullCodePrompt = (\n systemPrompt: string,\n skills: readonly Skill[],\n): string => {\n if (systemPrompt.includes(OMP_SKILL_SECTION_MARKER)) {\n return systemPrompt\n .replace(OMP_SKILL_LOAD_INSTRUCTION, FABRIC_OMP_SKILL_LOAD_INSTRUCTION)\n .replace(OMP_CUSTOM_SKILL_LOAD_INSTRUCTION, FABRIC_CUSTOM_SKILL_LOAD_INSTRUCTION);\n }\n const section = formatSkillsSection(skills, FABRIC_OMP_SKILL_LOAD_INSTRUCTION);\n if (!section) return systemPrompt;\n const heading = systemPrompt.indexOf(OMP_SKILL_SECTION_HEADING);\n if (heading < 0) return `${systemPrompt}\\n\\n${section}`;\n const insertAt = heading + OMP_SKILL_SECTION_HEADING.length;\n return `${systemPrompt.slice(0, insertAt)}${section}\\n${systemPrompt.slice(insertAt)}`;\n};\n", "import { OMP_CORE_TOOL_NAME_SET } from \"./omp-tools.js\";\n\nexport const PROXY_CONTRACT_CUSTOM_TYPE = \"omp-fabric-proxy\";\n\nconst FABRIC_EXEC_TOOL = \"fabric_exec\";\nconst MAX_PROXY_NAMES = 8;\n\n// Same envelopes the furnace strips before scoring. Here they are the *only*\n// source of evidence: ambient skill prose, not user intent.\nconst SKILL_REGION =\n /<available_skills\\b[^>]*>[\\s\\S]*?(?:<\\/available_skills\\s*>|$)|<skill\\b[^>]*>[\\s\\S]*?(?:<\\/skill\\s*>|$)/g;\n\nconst escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nexport const isRewritableCapturedToolName = (name: string): boolean => {\n if (!name || name === FABRIC_EXEC_TOOL) return false;\n if (OMP_CORE_TOOL_NAME_SET.has(name)) return false;\n return name.includes(\"_\") || name.length >= 10;\n};\n\nexport const rewritableHiddenCapturedToolNames = (\n names: Iterable<string>,\n): string[] =>\n [...new Set(names)]\n .filter(isRewritableCapturedToolName)\n .sort((a, b) => b.length - a.length || a.localeCompare(b));\n\nconst mentionPattern = (name: string): RegExp =>\n new RegExp(`(?<![\\\\w.])${escapeRegex(name)}(?![\\\\w])`);\n\nexport const extractSkillRegions = (text: string): string => {\n const regions: string[] = [];\n for (const match of text.matchAll(SKILL_REGION)) {\n const region = match[0];\n if (region) regions.push(region);\n }\n return regions.join(\"\\n\");\n};\n\nexport const capturedToolMentions = (\n text: string,\n names: readonly string[],\n): string[] => names.filter((name) => mentionPattern(name).test(text));\n\nexport const proxyContractMentionsInSkills = (\n prompt: string,\n systemPrompt: string,\n names: readonly string[],\n): string[] => {\n const envelope = `${extractSkillRegions(prompt)}\\n${extractSkillRegions(systemPrompt)}`;\n if (envelope.trim().length === 0) return [];\n return capturedToolMentions(envelope, names).slice(0, MAX_PROXY_NAMES);\n};\n\nexport const formatProxyContractReminder = (names: readonly string[]): string => {\n const rows = names.map((name) => `\\u25aa ${name} \\u2192 extensions.${name}`);\n return [\n \"Proxy contract: these names in the loaded skill are captured tools, not top-level calls.\",\n \"Call them as `extensions.<name>({...})` inside `fabric_exec`.\",\n \"\",\n ...rows,\n ].join(\"\\n\");\n};\n\nconst namesFromEntry = (entry: {\n type?: unknown;\n customType?: unknown;\n details?: unknown;\n}): string[] => {\n if (entry.type !== \"custom_message\" || entry.customType !== PROXY_CONTRACT_CUSTOM_TYPE) {\n return [];\n }\n const details = entry.details as { names?: unknown } | undefined;\n if (Array.isArray(details?.names)) {\n return details.names.filter((name): name is string => typeof name === \"string\" && name.length > 0);\n }\n return [];\n};\n\n/**\n * Branch-local set of captured names already reminded. Restored from\n * `omp-fabric-proxy` transcript entries only \u2014 never counted as furnace fires.\n */\nexport class ProxyContractLedger {\n #reminded = new Set<string>();\n\n reset(): void {\n this.#reminded.clear();\n }\n\n restoreFromEntries(entries: readonly unknown[]): void {\n this.#reminded.clear();\n for (const entryUnknown of entries) {\n if (typeof entryUnknown !== \"object\" || entryUnknown === null) continue;\n for (const name of namesFromEntry(entryUnknown as Parameters<typeof namesFromEntry>[0])) {\n this.#reminded.add(name);\n }\n }\n }\n\n take(candidates: readonly string[]): string[] {\n const fresh = candidates.filter((name) => !this.#reminded.has(name));\n for (const name of fresh) this.#reminded.add(name);\n return fresh;\n }\n}\n", "import type { Usage } from \"@oh-my-pi/pi-ai\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n ToolCallEvent,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricConfig } from \"../config.js\";\nimport type { ResolvedFabricAction } from \"./action-registry.js\";\nimport {\n ApprovalController,\n FabricSessionApprovals,\n type FabricAutoApprovalAudit,\n} from \"./approval-controller.js\";\nimport {\n FabricAutoApprovalClassifier,\n type FabricAutoApprovalDecision,\n} from \"./auto-approval-classifier.js\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst addUsage = (left: Usage, right: Usage): Usage => ({\n input: left.input + right.input,\n output: left.output + right.output,\n cacheRead: left.cacheRead + right.cacheRead,\n cacheWrite: left.cacheWrite + right.cacheWrite,\n totalTokens: left.totalTokens + right.totalTokens,\n cost: {\n input: left.cost.input + right.cost.input,\n output: left.cost.output + right.cost.output,\n cacheRead: left.cost.cacheRead + right.cost.cacheRead,\n cacheWrite: left.cost.cacheWrite + right.cost.cacheWrite,\n total: left.cost.total + right.cost.total,\n },\n});\n\nexport const mergeFabricApprovalUsage = (\n existing: Usage | undefined,\n approval: Usage,\n): Usage => existing ? addUsage(existing, approval) : approval;\n\nexport class FabricDirectToolApproval {\n readonly #pendingUsage = new Map<string, Usage>();\n\n constructor(\n readonly omp: Pick<ExtensionAPI, \"getAllTools\">,\n readonly getConfig: () => FabricConfig,\n readonly sessionApprovals: FabricSessionApprovals,\n readonly classifier = new FabricAutoApprovalClassifier(),\n readonly onAutoDecision?: (\n audit: FabricAutoApprovalAudit,\n decision?: FabricAutoApprovalDecision,\n ) => void,\n ) {}\n\n async approve(event: ToolCallEvent, context: ExtensionContext): Promise<void> {\n const config = this.getConfig();\n const action = this.#resolve(event.toolName, config);\n const controller = new ApprovalController(\n config.approvals,\n context,\n this.sessionApprovals,\n this.classifier,\n (audit, decision) => {\n this.onAutoDecision?.(audit, decision);\n if (decision) this.#pendingUsage.set(event.toolCallId, decision.usage);\n },\n );\n await controller.approve(action, isRecord(event.input) ? event.input : {});\n }\n\n takeUsage(toolCallId: string): Usage | undefined {\n const usage = this.#pendingUsage.get(toolCallId);\n this.#pendingUsage.delete(toolCallId);\n return usage;\n }\n\n clear(): void {\n this.#pendingUsage.clear();\n }\n\n #resolve(toolName: string, config: FabricConfig): ResolvedFabricAction {\n const metadata = this.omp.getAllTools().find((tool) => tool.name === toolName);\n const builtin = metadata?.sourceInfo.source === \"builtin\";\n const provider = builtin ? \"omp\" : \"extensions\";\n return {\n ref: provider + \".\" + toolName,\n provider,\n name: toolName,\n description: metadata?.description ?? \"Direct OMP tool: \" + toolName,\n inputSchema: isRecord(metadata?.parameters) ? metadata.parameters : {},\n risk: config.capture.risks[toolName] ?? config.capture.defaultRisk,\n };\n }\n}\n", "export interface SkillReference {\n name: string;\n filePath: string;\n hide?: boolean;\n}\n\nconst INVOCATION_VERB =\n /^\\s*(?:[-*]\\s*)?(?:(?:then|next|first|always|must|you must)\\s+)?(?:run|invoke|load|start|follow|use)\\b/i;\nconst NEGATED_INVOCATION =\n /^\\s*(?:[-*]\\s*)?(?:do not|don't|never)\\s+(?:run|invoke|load|start|follow|use)\\b/i;\n\nconst escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nconst referencesSkill = (line: string, skillName: string): boolean => {\n const name = escapeRegex(skillName);\n return new RegExp(`/(?:skill:)?${name}(?=[\\\\s\\`'\".,;:!?<>)\\\\]}]|$)`, \"i\").test(line);\n};\n\nexport const buildSkillReferenceGuidance = (\n prompt: string,\n skills: readonly SkillReference[],\n): string | undefined => {\n const active = skills.find((skill) =>\n prompt.startsWith(`<skill name=\"${skill.name}\" location=\"${skill.filePath}\">`),\n );\n if (!active) return undefined;\n\n const closingTag = prompt.indexOf(\"</skill>\");\n if (closingTag < 0) return undefined;\n const openingEnd = prompt.indexOf(\"\\n\\n\");\n if (openingEnd < 0 || openingEnd >= closingTag) return undefined;\n const body = prompt.slice(openingEnd + 2, closingTag);\n const invocationLines = body\n .split(\"\\n\")\n .filter((line) => INVOCATION_VERB.test(line) && !NEGATED_INVOCATION.test(line));\n\n const referenced = skills.filter(\n (skill) =>\n skill.name !== active.name &&\n skill.hide !== true &&\n invocationLines.some((line) => referencesSkill(line, skill.name)),\n );\n if (referenced.length === 0) return undefined;\n\n const mappings = referenced\n .map((skill) => `- /${skill.name} -> ${JSON.stringify(skill.filePath)}`)\n .join(\"\\n\");\n return [\n `The active skill ${JSON.stringify(active.name)} is already expanded; do not reread ${JSON.stringify(active.filePath)}.`,\n \"Resolve the skill invocations below before task exploration:\",\n mappings,\n \"Load each mapped SKILL.md through omp.read inside fabric_exec and follow it. Skill loading is a dependency, not task exploration. Continue the active workflow after tool results and later user replies until it completes.\",\n ].join(\"\\n\");\n};\n", "import type { Theme, ToolDefinition, ToolRenderResultOptions } from \"@oh-my-pi/pi-coding-agent\";\nimport type { TSchema } from \"@oh-my-pi/omptype/typebox\";\nimport { Container, Text, type Component } from \"@oh-my-pi/pi-tui\";\n\ntype FabricToolDefinition = ToolDefinition<any, any> & {\n promptGuidelines?: readonly string[];\n promptSnippet?: string;\n};\n\nconst defineTool = (tool: FabricToolDefinition): ToolDefinition<any, any> => tool;\nimport { arcItemStyled } from \"./ui/arc-group.js\";\nimport type { CodePreviewSettings } from \"./ui/code-preview.js\";\nimport {\n type FabricToolShellDecorator,\n type PreviewRenderContext,\n withCodePreviewShell,\n} from \"./ui/code-preview-shell.js\";\nimport { fabricExecTitleHintCached } from \"./ui/fabric-title-hint.js\";\nimport { Type } from \"@oh-my-pi/omptype/typebox\";\nimport {\n createFabricPersistedExecutionDetails,\n readFabricExecutionRenderDetails,\n} from \"./audit/index.js\";\nimport { DEFAULT_FABRIC_CONFIG } from \"./config.js\";\nimport { fabricSpeculationSummary } from \"./speculation/summary.js\";\nimport type { FabricState } from \"./fabric-state.js\";\nimport { formatFailureProgress } from \"./failure-progress.js\";\nimport {\n prepareFabricExecArguments,\n resolveFabricExecPayloads,\n} from \"./fabric-exec-arguments.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\nimport { typeErrorRecoveryHint } from \"./type-error-guidance.js\";\nimport { normalizeRunDisplay } from \"./run-display.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport type { FabricMediaBlock } from \"./protocol.js\";\nimport {\n captureFabricAgentPreviews,\n captureFabricCallHeadlinePreviews,\n captureFabricCoreToolPreviews,\n captureFabricWritePreviews,\n expandHint,\n fabricMulticallCallLimit,\n fabricWriteBindings,\n inheritComponentBackground,\n modelReadHint,\n nestedCallBody,\n nestedCallTitle,\n renderBoundedLines,\n renderFabricMulticallPartial,\n renderFabricWriteArgumentPreview,\n renderAgentToolPreviewLines,\n restoreFabricAgentPreviews,\n restoreFabricCallHeadlinePreviews,\n restoreFabricCoreToolPreviews,\n restoreFabricWritePreviews,\n restoreLegacyBashCommands,\n safeTerminalText,\n singleCallProgressLine,\n type FabricAgentPreview,\n type FabricCallHeadlinePreview,\n type FabricCoreToolPreview,\n type FabricRenderAudit,\n type FabricWriteBinding,\n type FabricWritePreview,\n} from \"./ui/fabric-render.js\";\nimport {\n coreToolPreviewEnabled,\n coreToolRendererEnabled,\n isCoreToolAudit,\n renderCoreToolBody,\n} from \"./ui/core-tool-render.js\";\nimport { highlightCode, observeOmpTheme } from \"./ui/highlight.js\";\nimport {\n HiddenRowBorrowingComponent,\n observeResultRows,\n type ResultRowBalance,\n} from \"./ui/row-balance.js\";\nimport { type SpinnerTimerState, updateSpinner } from \"./ui/spinner.js\";\nimport type { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { boundModelOutput, modelOutputBudget } from \"./output-budget.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { countNewlines } from \"./util.js\";\n\nconst RESULT_FORMATS = [\"auto\", \"yaml\", \"json\", \"text\"] as const;\ntype FabricExecParams = {\n code: string | string[];\n payloads?: unknown;\n display?: unknown;\n resultFormat?: (typeof RESULT_FORMATS)[number];\n tokenBudget?: number;\n agentBudget?: number;\n timeoutMs?: number;\n};\nconst MAX_FABRIC_CODE_TRANSFER_LINES = 12;\n\ntype FabricRendererState = {\n fabricWriteBindingsCode?: string;\n fabricWriteBindings?: FabricWriteBinding[];\n fabricWritePreviews?: FabricWritePreview[];\n fabricCoreToolPreviews?: FabricCoreToolPreview[];\n fabricCallHeadlinePreviews?: FabricCallHeadlinePreview[];\n fabricAgentPreviews?: FabricAgentPreview[];\n fabricResultRowBalance?: ResultRowBalance;\n fabricSpinner?: SpinnerTimerState;\n};\n\nconst normalizeFabricExecParams = (input: unknown): FabricExecParams => {\n const prepared = prepareFabricExecArguments(input);\n if (typeof prepared !== \"object\" || prepared === null || Array.isArray(prepared)) {\n throw new Error(\"fabric_exec arguments must be an object\");\n }\n const record = prepared as Record<string, unknown>;\n const code = record.code;\n if (typeof code !== \"string\" && !(Array.isArray(code) && code.every((line) => typeof line === \"string\"))) {\n throw new Error(\"fabric_exec code must be a string or string array\");\n }\n const resultFormat = RESULT_FORMATS.includes(record.resultFormat as (typeof RESULT_FORMATS)[number])\n ? record.resultFormat as (typeof RESULT_FORMATS)[number]\n : undefined;\n return {\n code,\n ...(record.payloads !== undefined ? { payloads: record.payloads } : {}),\n ...(record.display !== undefined ? { display: record.display } : {}),\n ...(resultFormat !== undefined ? { resultFormat } : {}),\n ...(typeof record.tokenBudget === \"number\" ? { tokenBudget: record.tokenBudget } : {}),\n ...(typeof record.agentBudget === \"number\" ? { agentBudget: record.agentBudget } : {}),\n ...(typeof record.timeoutMs === \"number\" ? { timeoutMs: record.timeoutMs } : {}),\n };\n};\n\ntype FabricToolDisplayMode = \"full\" | \"compact\";\n\n// Bootstrap, not runtime activation, is the config-readiness seam: upstream's\n// deferred startup loads configuration into FabricState without creating the\n// heavyweight runtime, so a resumed session must honor the bootstrapped\n// ui.toolDisplay even while state.initialized is still false. The explicit\n// bootstrapped check also guards the failed-bootstrap window (config loaded\n// unsuccessfully): compact is the configured default, but a broken or absent\n// configuration falls back to full so a degraded startup never hides the\n// underlying transcript.\nconst toolDisplayMode = (state: FabricState): FabricToolDisplayMode =>\n state.bootstrapped ? state.config.ui.toolDisplay : \"full\";\n\nconst compactResultHeader = (\n theme: Theme,\n audits: FabricRenderAudit[],\n failed: boolean,\n): string => {\n const failedCalls = audits.filter((audit) => audit.success === false).length;\n const isFailed = failed || failedCalls > 0;\n return theme.fg(isFailed ? \"error\" : \"success\", `${isFailed ? \"\u2717\" : \"\u2713\"} Tools`) +\n theme.fg(\n \"dim\",\n ` \u00B7 ${countLabel(audits.length, \"call\")}${failedCalls > 0 ? ` \u00B7 ${failedCalls} failed` : \"\"}`,\n );\n};\n\nconst countLabel = (count: number, singular: string): string =>\n `${count} ${count === 1 ? singular : `${singular}s`}`;\nconst rendererStates = new WeakMap<object, FabricRendererState>();\n\nconst rendererStateFor = (key: unknown): FabricRendererState => {\n const object = typeof key === \"object\" && key !== null ? key : rendererStates;\n const existing = rendererStates.get(object);\n if (existing) return existing;\n const created: FabricRendererState = {};\n rendererStates.set(object, created);\n return created;\n};\n\nconst isRenderComponent = (value: unknown): value is Component =>\n value !== null && typeof value === \"object\" && typeof Reflect.get(value, \"render\") === \"function\";\n\nconst previewContext = (\n options: ToolRenderResultOptions,\n state: FabricState,\n args: unknown,\n rendererState: FabricRendererState,\n): PreviewRenderContext => {\n const raw = options as ToolRenderResultOptions & { renderContext?: Record<string, unknown> };\n const supplied = raw.renderContext ?? (options as unknown as Record<string, unknown>);\n const executionStarted = typeof supplied.executionStarted === \"boolean\"\n ? supplied.executionStarted\n : !options.isPartial;\n const argsComplete = typeof supplied.argsComplete === \"boolean\"\n ? supplied.argsComplete\n : !options.isPartial;\n return {\n args,\n toolCallId: typeof supplied.toolCallId === \"string\" ? supplied.toolCallId : \"fabric_exec\",\n invalidate: typeof supplied.invalidate === \"function\" ? supplied.invalidate as () => void : () => undefined,\n lastComponent: isRenderComponent(supplied.lastComponent) ? supplied.lastComponent : undefined,\n state: supplied.state && typeof supplied.state === \"object\" ? supplied.state as FabricRendererState : rendererState,\n cwd: typeof supplied.cwd === \"string\" ? supplied.cwd : state.cwd ?? process.cwd(),\n executionStarted,\n argsComplete,\n isPartial: options.isPartial,\n expanded: options.expanded,\n showImages: supplied.showImages !== false,\n isError: supplied.isError === true,\n };\n};\n\nexport const createFabricExecTool = (\n state: FabricState,\n codePreviewSettings: CodePreviewSettings,\n pendingHandoffs: Map<string, PendingFabricHandoff>,\n decorateShell: FabricToolShellDecorator = withCodePreviewShell,\n toolDisplay?: FabricToolDisplayController,\n): ToolDefinition<any, any> => decorateShell(\n defineTool({\n name: \"fabric_exec\",\n label: \"Fabric\",\n description:\n \"Execute type-checked TypeScript through Fabric's configured executor for OMP tools, MCP, Fabric providers, discovery, and extensions. QuickJS is isolated by default; the optional Node/Bun process is an unsafe trusted-code escape hatch. In full code mode, and always in Schema enforce mode, this is the exclusive model tool path.\",\n promptGuidelines: [\n \"Batch independent operations in one `fabric_exec` program (`Promise.all` for parallel, sequential `await` for ordered), not one call per tool; keep dependent/conditional steps sequential. Coalesce non-dependent replacements from one file snapshot into one `omp.edit({path, edits:[...]})`; use `all:true` only for intentional repeated exact anchors. Return only the compact final value; intermediate results stay in the sandbox.\",\n \"Search before reading: use `omp.grep`/`omp.find` to locate relevant lines, then `omp.read({path, offset, limit})` that range. Escape regex metacharacters, or use `literal:true` for exact punctuated text. Keep fan-out search limits small and widen only on misses. An unbounded `omp.read` returns at most 2000 lines or 50KB and, when truncated, ends with a `Use offset=\u2026` continuation notice.\",\n \"For coding tasks, keep an acceptance ledger: turn the request into concrete checks, trace the relevant execution path before editing, implement end to end, then run targeted tests and direct behavioral probes. Mechanically confirm requested public symbols, registrations, and configuration entries. Use the smallest checks that cover the ledger, escalating only for failures or cross-cutting risk; inspect failures and iterate instead of rerunning unchanged passing checks. A build alone is not completion.\",\n \"Amortize round trips without inflating context: batch only independent, bounded work. Keep search\u2192read and edit\u2192verify sequential when an output determines the next action. Use `settle:true` for tests or probes whose nonzero result is evidence rather than an exceptional stop; for a known long suite, set `omp.bash` `timeout` in seconds once instead of retrying a timed-out call. Filter or summarize noisy command output inside the program and return decisions, failures, and evidence\u2014not raw logs or unused intermediate results.\",\n \"For edits/writes, pass named payloads through top-level `payloads`; each `payloads.key` must exactly match a key there; prefer `omp.edit`/`omp.write`. `omp.bash`: no stdin.\",\n \"Use `display.name` and objective `display.description`; Fabric pairs them with verified outcomes in deterministic compaction.\",\n ],\n // The model-facing schema is intentionally flat: one large code string plus scalar metadata.\n // Keep nested payloads bounded and let prepareArguments normalize provider input.\n parameters: Type.Object({\n code: Type.String({\n description:\n \"TypeScript function body. Top-level await and return are supported. Globals include `tools`, `mcp`, `memory`, `state`, `schema`, `compact`, `codemap`, `agents`, `mesh`, `print`, and `omp`; full-code mode adds `omp` and `extensions`. Payloads contains only the exact keys supplied by this call.\"\n }),\n payloads: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n description:\n \"Named payloads exposed under the same exact name as omp.key (for example, payloads.contract becomes omp.contract). Never reference a key absent from this map. Useful for content that is awkward to quote inside code. Prefer an object of string values; a JSON-object string is parsed.\",\n }),\n ),\n resultFormat: Type.Optional(Type.Union(RESULT_FORMATS.map((value) => Type.Literal(value)))),\n tokenBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional token budget observed by workflow.agent() calls\",\n }),\n ),\n agentBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional agent-call cap, bounded by Fabric configuration\",\n }),\n ),\n timeoutMs: Type.Optional(\n Type.Number({\n minimum: 1,\n description:\n \"Optional whole-program deadline in ms for this invocation; raises (never lowers) the configured executor.timeoutMs, capped by executor.maxTimeoutMs\",\n }),\n ),\n display: Type.Optional(\n Type.Union([\n Type.Object(\n {\n name: Type.Optional(\n Type.String({\n description: \"Concise execution milestone used by the Fabric activity UI and deterministic compaction continuity\",\n }),\n ),\n description: Type.Optional(\n Type.String({\n description: \"Compact declared objective or acceptance criterion shown in the dashboard and richer compaction activity\",\n }),\n ),\n },\n ),\n Type.String({\n description:\n \"Objective shorthand normalized to { name } (a JSON-object string is parsed). Prefer the object form when available.\",\n }),\n ]),\n ),\n }),\n // OMP validates custom-tool arguments before `tool_call` and `execute`, so\n // compatibility coercions for the model-facing boundary must live in the\n // official prepareArguments hook rather than execute-time fallbacks.\n renderCall(params: FabricExecParams, options: ToolRenderResultOptions, theme: Theme) {\n const rendererState = rendererStateFor(params);\n const context = previewContext(options, state, params, rendererState);\n observeOmpTheme(theme);\n const code = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const mode = toolDisplayMode(state);\n toolDisplay?.observe(context.toolCallId, \"call\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n context.isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n if (rendererState.fabricWriteBindingsCode !== code) {\n rendererState.fabricWriteBindingsCode = code;\n rendererState.fabricWriteBindings = fabricWriteBindings(code);\n }\n // The write argument preview is a streaming affordance: it previews\n // pending writes while args are still arriving. OMP only flips\n // executionStarted for live calls; resumed cards stay at its false\n // default and are always complete (isPartial false), so their previews\n // belong to the result side alone. Without the isPartial gate, a\n // collapsed resumed card shows the same write twice.\n const writePreview = context.executionStarted || !context.isPartial\n ? null\n : renderFabricWriteArgumentPreview(\n {\n bindings: rendererState.fabricWriteBindings ?? [],\n payloads: resolveFabricExecPayloads(params),\n expanded: context.expanded,\n cwd: context.cwd,\n settings: codePreviewSettings,\n spinner,\n },\n theme,\n context.invalidate,\n );\n // OMP app.tools.expand toggle (ctrl+o) flips context.expanded and\n // promotes a compact card to the full transcript below.\n if (mode === \"compact\" && !context.expanded) {\n const display = normalizeRunDisplay(params.display);\n // Session-wide memo keyed by the program string: the same hint serves\n // the live card, the activity feed, and compaction intent.\n const title = display?.name?.trim() || fabricExecTitleHintCached(code);\n const header = renderBoundedLines(\n [\n theme.fg(\"toolTitle\", theme.bold(safeTerminalText(title || \"Fabric\"))),\n ...(display?.description\n ? [theme.fg(\"dim\", safeTerminalText(display.description))]\n : []),\n ],\n theme,\n codePreviewSettings.diffIntensity,\n );\n if (!writePreview) return header;\n const composite = new Container();\n composite.addChild(header);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n }\n\n const lines = safeTerminalText(code).split(\"\\n\");\n const runDisplay = normalizeRunDisplay(params.display);\n const displayName = runDisplay?.name ? safeTerminalText(runDisplay.name) : \"\";\n const title = `${theme.fg(\"toolTitle\", theme.bold(\"fabric\"))}${\n displayName ? ` ${theme.fg(\"accent\", displayName)}` : \"\"\n } ${theme.fg(\"dim\", `TypeScript \u00B7 ${countLabel(lines.length, \"line\")}`)}`;\n // Match the compact header: the declared objective sits between the\n // title and the code preview.\n const description = runDisplay?.description\n ? theme.fg(\"dim\", safeTerminalText(runDisplay.description))\n : \"\";\n const baseLimit = context.expanded ? lines.length : Math.min(lines.length, 8);\n const maxLimit = context.expanded\n ? lines.length\n : Math.min(lines.length, baseLimit + MAX_FABRIC_CODE_TRANSFER_LINES);\n const renderCodePreview = (limit: number, width: number): string[] => {\n const shown = lines.slice(0, limit);\n const lineNumberWidth = String(Math.max(1, shown.length)).length;\n const preview = shown\n .map(\n (line, index) =>\n `${theme.fg(\"dim\", String(index + 1).padStart(lineNumberWidth, \" \"))} ${theme.fg(\"muted\", line || \" \")}`,\n )\n .join(\"\\n\");\n const hidden = lines.length - shown.length;\n const hiddenHint =\n hidden > 0\n ? `\\n${theme.fg(\"dim\", `\u2026 ${countLabel(hidden, \"line\")} hidden \u00B7 `)}${expandHint(theme)}`\n : \"\";\n return [...new Text(\n `${title}${description ? `\\n${description}` : \"\"}${preview ? `\\n${preview}` : \"\"}${hiddenHint}`,\n 0,\n 0,\n ).render(width)];\n };\n const codePreview = new HiddenRowBorrowingComponent(\n baseLimit,\n maxLimit,\n renderCodePreview,\n rowBalance,\n );\n if (!writePreview) return codePreview;\n const composite = new Container();\n composite.addChild(codePreview);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n },\n renderResult(result, options, theme, params?: FabricExecParams) {\n const expanded = options.expanded;\n const isPartial = options.isPartial;\n const rendererState = rendererStateFor(result.details ?? params ?? options);\n const context = previewContext(options, state, params, rendererState);\n observeOmpTheme(theme);\n const details = readFabricExecutionRenderDetails(result.details);\n let audits = restoreLegacyBashCommands(\n details.audits as FabricRenderAudit[],\n params ?? { code: \"\" },\n );\n toolDisplay?.observe(context.toolCallId, \"result\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n const trackRows = (component: Component): Component =>\n observeResultRows(\n inheritComponentBackground(component),\n rowBalance,\n { expanded, isPartial },\n );\n if (isPartial) {\n rendererState.fabricCoreToolPreviews = captureFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n rendererState.fabricAgentPreviews = captureFabricAgentPreviews(\n audits,\n rendererState.fabricAgentPreviews,\n );\n const headlinePreviews = captureFabricCallHeadlinePreviews(audits);\n if (headlinePreviews.length > 0) {\n rendererState.fabricCallHeadlinePreviews = headlinePreviews;\n }\n const writePreviews = captureFabricWritePreviews(audits);\n if (writePreviews.length > 0) rendererState.fabricWritePreviews = writePreviews;\n } else {\n if (rendererState.fabricCoreToolPreviews) {\n audits = restoreFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n }\n if (rendererState.fabricAgentPreviews) {\n audits = restoreFabricAgentPreviews(audits, rendererState.fabricAgentPreviews);\n }\n if (rendererState.fabricCallHeadlinePreviews) {\n audits = restoreFabricCallHeadlinePreviews(\n audits,\n rendererState.fabricCallHeadlinePreviews,\n );\n }\n if (rendererState.fabricWritePreviews) {\n audits = restoreFabricWritePreviews(audits, rendererState.fabricWritePreviews);\n }\n }\n const phases = details.phases;\n const nl = \"\\n\";\n const allRowIndexes = (lines: string[], enabled: boolean): ReadonlySet<number> | undefined =>\n enabled ? new Set(lines.map((_line, index) => index)) : undefined;\n // Expanded (app.tools.expand / ctrl+o) promotes compact cards to the\n // full rendering; compact only governs the collapsed presentation.\n const compact = !expanded && toolDisplayMode(state) === \"compact\";\n const corePreviewContext = { cwd: context.cwd, settings: codePreviewSettings };\n const showAgentToolPreview = state.initialized\n ? state.config.ui.showAgentToolPreview\n : DEFAULT_FABRIC_CONFIG.ui.showAgentToolPreview;\n\n const renderBody = (\n audit: FabricRenderAudit,\n limit: number,\n ): { body: string; hidden: number } | null => {\n const core = renderCoreToolBody(audit, theme, {\n cwd: context.cwd,\n settings: codePreviewSettings,\n expanded,\n maxLines: limit,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (core) return { body: core.lines.join(nl), hidden: core.hidden };\n if (coreToolRendererEnabled(audit, codePreviewSettings)) return null;\n\n const body = nestedCallBody(audit);\n if (!body) return null;\n const bodyLines = safeTerminalText(body).split(nl);\n while (bodyLines.length > 0) {\n const last = bodyLines[bodyLines.length - 1];\n if (last === undefined || last.trim() === \"\") bodyLines.pop();\n else break;\n }\n if (bodyLines.length === 0) return null;\n const shown = bodyLines.slice(0, limit);\n return {\n body: shown.map((line) => theme.fg(\"toolOutput\", line || \" \")).join(nl),\n hidden: bodyLines.length - shown.length,\n };\n };\n\n if (isPartial) {\n const progress = details.progress;\n if (audits.length === 0) {\n const label = compact ? \"Running\u2026\" : progress ?? \"Running Fabric program\u2026\";\n return trackRows(\n new Text(theme.fg(\"warning\", `\u25C6 ${safeTerminalText(label)}`), 0, 0),\n );\n }\n if (audits.length === 1) {\n const audit = audits[0]!;\n const glyph =\n audit.success === undefined\n ? theme.fg(\"warning\", spinner)\n : audit.success === false\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n let text = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n const progressLine = singleCallProgressLine(progress, previewLines);\n if (audit.success === false && audit.error) {\n text += nl + ` ${theme.fg(\"error\", safeTerminalText(audit.error))}`;\n } else {\n const rendered = renderBody(\n audit,\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 10,\n );\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (progressLine) {\n text += nl + theme.fg(\"dim\", progressLine);\n }\n }\n if (audit.success !== false && previewLines[0]) {\n const firstBreak = text.indexOf(nl);\n if (firstBreak < 0) text += ` ${previewLines[0]}`;\n else text = `${text.slice(0, firstBreak)} ${previewLines[0]}${text.slice(firstBreak)}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n let preview: { auditIndex: number; body: string; hidden: number } | undefined;\n for (let index = audits.length - 1; index >= 0; index--) {\n const audit = audits[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, expanded ? 20 : 10);\n if (rendered) {\n preview = { auditIndex: index, ...rendered };\n break;\n }\n }\n return trackRows(\n renderFabricMulticallPartial(\n {\n audits,\n phases,\n progress,\n expanded,\n preview,\n core: corePreviewContext,\n showAgentToolPreview,\n spinner,\n ...(compact ? { activityLabel: \"Tools\" } : {}),\n },\n theme,\n context?.invalidate,\n ),\n );\n }\n\n const output = result.content\n .filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n .map((part) => part.text)\n .join(nl);\n const styleOutputLines = (lines: string[]): string[] => {\n if (!details.outputFormat || lines.length === 0) {\n return lines.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n }\n const highlightedStart = Math.min(\n lines.length,\n details.outputFormatStartLine ?? 0,\n );\n const highlightedCount = Math.min(\n lines.length - highlightedStart,\n details.outputFormatLines ?? lines.length,\n );\n const highlightedSource = lines.slice(\n highlightedStart,\n highlightedStart + highlightedCount,\n );\n const highlighted = highlightedSource.length > 0\n ? highlightCode(\n highlightedSource.join(nl),\n details.outputFormat,\n context?.invalidate,\n )\n : [];\n const styledPrefix = highlighted?.map((line) => line || \" \")\n ?? highlightedSource.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n return [\n ...lines.slice(0, highlightedStart).map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ...styledPrefix,\n ...lines\n .slice(highlightedStart + highlightedCount)\n .map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ];\n };\n const failed = details.success === false;\n\n if (audits.length === 0) {\n if (failed && details.error) {\n return trackRows(\n new Text(\n theme.fg(\"error\", `\u2717 ${safeTerminalText(details.error)}`),\n 0,\n 0,\n ),\n );\n }\n if (!output) {\n return trackRows(new Text(\n compact\n ? theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\")\n : theme.fg(\"dim\", \"\u2713 Fabric\"),\n 0,\n 0,\n ));\n }\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 12;\n const shown = lines.slice(0, limit);\n let text = styleOutputLines(shown).join(nl);\n if (compact) {\n text = theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\") + nl + text;\n }\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n return trackRows(\n renderBoundedLines(text.split(nl), theme, codePreviewSettings.diffIntensity),\n );\n }\n\n if (audits.length === 1) {\n const audit = audits[0]!;\n let text = compact\n ? `${compactResultHeader(theme, audits, failed)}${nl}${nestedCallTitle(\n audit,\n theme,\n context?.invalidate,\n corePreviewContext,\n )}`\n : nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext);\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (audit.success === false) {\n if (audit.error) {\n text += nl + theme.fg(\"error\", safeTerminalText(audit.error));\n }\n return trackRows(new Text(text, 0, 0));\n }\n if (previewLines[0]) {\n text += ` ${previewLines[0]}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const limit =\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 12;\n const rendered = previewLines.length > 0 ? null : renderBody(audit, limit);\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (\n previewLines.length === 0 &&\n output &&\n !isCoreToolAudit(audit) &&\n (!compact || failed || expanded)\n ) {\n const lines = safeTerminalText(output).split(nl);\n const outLimit = expanded ? Math.min(lines.length, 200) : 12;\n const outShown = lines.slice(0, outLimit);\n text += nl + styleOutputLines(outShown).join(nl);\n if (lines.length > outShown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - outShown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n\n const failedCalls = audits.filter(\n (audit) => audit.success === false,\n ).length;\n const status = failed ? \"failed\" : \"complete\";\n const statusColor = failed ? \"error\" : \"success\";\n const metadata = [\n countLabel(audits.length, \"nested call\"),\n failedCalls > 0 ? `${failedCalls} failed` : undefined,\n phases.length > 0 ? countLabel(phases.length, \"phase\") : undefined,\n ].filter((value): value is string => Boolean(value));\n let text = compact\n ? compactResultHeader(theme, audits, failed)\n : theme.fg(\n statusColor,\n `${failed ? \"\u2717\" : \"\u2713\"} Fabric ${status}`,\n );\n if (!compact && metadata.length > 0) text += theme.fg(\"dim\", ` \u00B7 ${metadata.join(\" \u00B7 \")}`);\n if (phases.length > 0)\n text += nl + theme.fg(\"dim\", phases.map((phase) => `\u25C6 ${phase}`).join(\" \"));\n\n const callLimit = fabricMulticallCallLimit(expanded);\n const callsShown = audits.slice(0, callLimit);\n const callsHidden = audits.length - callsShown.length;\n let collapsedPreview:\n | { auditIndex: number; body: string; hidden: number }\n | undefined;\n if (!expanded) {\n for (let index = callsShown.length - 1; index >= 0; index--) {\n const audit = callsShown[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, 10);\n if (rendered) {\n collapsedPreview = { auditIndex: index, ...rendered };\n break;\n }\n }\n }\n let firstNested = true;\n const textRows = text.split(nl);\n const agentWrapLineIndexes = new Set<number>();\n for (let index = 0; index < callsShown.length; index++) {\n const audit = callsShown[index]!;\n if (expanded && !firstNested) textRows.push(\"\");\n firstNested = false;\n const glyph =\n audit.success === false ? theme.fg(\"error\", \"\u2717\") : theme.fg(\"dim\", \"\u203A\");\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n compact: !expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n let callRow = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n if (previewLines[0] && audit.success !== false) {\n callRow += ` ${previewLines[0]}`;\n if (expanded) agentWrapLineIndexes.add(textRows.length);\n }\n textRows.push(callRow);\n if (audit.success === false && audit.error) {\n textRows.push(` ${theme.fg(\"error\", safeTerminalText(audit.error))}`);\n } else {\n if (previewLines.length > 1) {\n for (const line of previewLines.slice(1)) {\n agentWrapLineIndexes.add(textRows.length);\n textRows.push(line);\n }\n }\n const rendered = previewLines.length === 0 && expanded ? renderBody(audit, 40) : null;\n if (rendered) {\n textRows.push(...rendered.body.split(nl));\n if (rendered.hidden > 0) {\n textRows.push(theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`));\n }\n } else if (previewLines.length === 0 && collapsedPreview?.auditIndex === index) {\n textRows.push(...collapsedPreview.body.split(nl).map((line) => ` ${line}`));\n if (collapsedPreview.hidden > 0) {\n textRows.push(theme.fg(\n \"dim\",\n ` \u2026 ${countLabel(collapsedPreview.hidden, \"line\")}`,\n ));\n }\n }\n }\n }\n text = textRows.join(nl);\n if (callsHidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(callsHidden, \"nested call\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n\n const showOutput = failed || expanded;\n if (showOutput && output) {\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 6;\n const shown = lines.slice(0, limit);\n if (shown.length > 0) {\n if (expanded) text += nl + theme.fg(\"dim\", \"\u21A9 return\");\n text += nl + styleOutputLines(shown).join(nl);\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n }\n return trackRows(\n renderBoundedLines(\n text.split(nl),\n theme,\n codePreviewSettings.diffIntensity,\n agentWrapLineIndexes,\n ),\n );\n },\n async execute(toolCallId, params, signal, onUpdate, context) {\n await state.ensure(context);\n // prepareArguments joins code arrays / remaps `payloads`\n // and quotes unquoted OMP path arguments before OMP validates this call;\n // keep the same coercion here for direct internal invocations.\n const normalized = normalizeFabricExecParams(params);\n const joined = Array.isArray(normalized.code) ? normalized.code.join(\"\\n\") : normalized.code;\n const code = repairFabricGuestCode(joined);\n const runDisplay = normalizeRunDisplay(normalized.display);\n const payloads = resolveFabricExecPayloads(normalized);\n const result = await state.execution.execute({\n code,\n ...(payloads ? { payloads } : {}),\n signal,\n parentToolCallId: toolCallId,\n context,\n ...(normalized.tokenBudget !== undefined ? { tokenBudget: normalized.tokenBudget } : {}),\n ...(normalized.agentBudget !== undefined ? { maxAgentCalls: normalized.agentBudget } : {}),\n ...(normalized.timeoutMs !== undefined ? { requestedTimeoutMs: normalized.timeoutMs } : {}),\n ...(runDisplay\n ? {\n display: {\n ...(runDisplay.name !== undefined && { name: runDisplay.name }),\n ...(runDisplay.description !== undefined && { description: runDisplay.description }),\n },\n }\n : {}),\n onPartial(snapshot) {\n onUpdate?.({\n content: [{ type: \"text\", text: snapshot.progress ?? \"\" }],\n details: {\n progress: snapshot.progress,\n audits: snapshot.audits,\n phases: snapshot.phases,\n },\n });\n },\n });\n\n const selectedResultFormat =\n normalized.resultFormat ?? state.config.executor.resultFormat;\n const pendingHandoff = await state.claimHandoff(\n result,\n context.sessionManager.getSessionId(),\n selectedResultFormat,\n toolCallId,\n );\n if (pendingHandoff) {\n pendingHandoffs.set(toolCallId, pendingHandoff);\n context.ui.setStatus(\n \"fabric-prewalk\",\n `waiting for fabric_exec boundary \u2192 ${String(pendingHandoff.args.model ?? \"executor\")}`,\n );\n }\n const fullFormattedValue = formatFabricValue(result.value, selectedResultFormat);\n const failureProgress = formatFailureProgress(result.trace);\n const fullSections = [...result.logs];\n if (fullFormattedValue.text) fullSections.push(fullFormattedValue.text);\n if (result.error) fullSections.push(`Runtime error: ${result.error}`);\n if (failureProgress) fullSections.push(failureProgress);\n const fullRawOutput = fullSections.join(\"\\n\\n\");\n const outputBudget = modelOutputBudget(\n state.config.executor.maxOutputChars,\n result.success,\n );\n const outputWillTruncate = fullRawOutput.length > outputBudget;\n const formattedValue = outputWillTruncate\n ? formatFabricValue(\n result.value,\n selectedResultFormat,\n outputBudget,\n )\n : fullFormattedValue;\n const sections = [...result.logs];\n const logPrefix = result.logs.join(\"\\n\\n\");\n if (formattedValue.text) sections.push(formattedValue.text);\n if (result.error) sections.push(`Runtime error: ${result.error}`);\n if (failureProgress) sections.push(failureProgress);\n const rawOutput = sections.join(\"\\n\\n\");\n const outputFormat =\n formattedValue.language &&\n formattedValue.text &&\n (result.logs.length === 0 || !outputWillTruncate)\n ? formattedValue.language\n : undefined;\n const outputFormatStartLine = result.logs.length > 0\n ? countNewlines(logPrefix) + 2\n : 0;\n // Evaluated lazily at each return so the main path persists audits after\n // their in-memory image payloads are stripped below.\n const speculationSummary = fabricSpeculationSummary(state.registry.speculationStats());\n const persistedRenderDetails = () =>\n createFabricPersistedExecutionDetails({\n ...result,\n ...(speculationSummary ? { speculation: speculationSummary } : {}),\n ...(outputFormat ? { outputFormat, outputFormatStartLine } : {}),\n ...(outputFormat\n ? {\n outputFormatLines:\n formattedValue.highlightedLineCount\n ?? countNewlines(formattedValue.text) + 1,\n }\n : {}),\n });\n\n if (result.typeErrors) {\n const text = result.typeErrors\n .map((error) =>\n error.line > 0\n ? `Line ${error.line}:${error.column} \u2014 ${error.message}`\n : error.message,\n )\n .join(\"\\n\");\n const recoveryHint = typeErrorRecoveryHint(code, result.typeErrors);\n const bounded = await boundModelOutput(\n `Type errors; code was not executed:\\n${text}${\n recoveryHint ? `\\n\\n${recoveryHint}` : \"\"\n }`,\n outputBudget,\n );\n return {\n content: [{ type: \"text\", text: bounded.text }],\n details: persistedRenderDetails(),\n isError: true,\n };\n }\n\n const output = (await boundModelOutput(\n rawOutput || \"(no output)\",\n outputBudget,\n fullRawOutput || \"(no output)\",\n )).text;\n const terminate =\n pendingHandoff !== undefined ||\n (result.success &&\n typeof result.value === \"object\" &&\n result.value !== null &&\n \"terminate\" in result.value &&\n result.value.terminate === true);\n // A nested `omp.read` of an image returns image content blocks that\n // normalizeResult stripped (the sandbox holds text only). The provider\n // handed them out-of-band to each call audit; re-attach them here so\n // OMP core's ToolExecutionComponent renders a kitty image preview \u2014 the\n // same path a native `read` takes \u2014 for single-call AND multitool\n // reads. pi-vision-handoff keeps the image in the nested tool_result\n // (its `context` hook swaps image\u2192description on the LLM-bound\n // fabric_exec clone), so every read audit carries its image here.\n const mediaBlocks: FabricMediaBlock[] = [];\n for (const audit of result.audits) {\n if (audit.media) mediaBlocks.push(...audit.media);\n }\n const singleAudit = result.audits.length === 1 ? result.audits[0] : undefined;\n // The read tool's own text note (e.g. \"Read image file [image/png]\"),\n // captured after the handoff stripped OMP's non-vision note. Used as\n // the single-call body + content text so the preview shows the kitty\n // image + the clean note (like OMP core) instead of the handoff's\n // verbose description. Multitool renders each read's note as its own\n // call body, so the joined program return suffices as the content text\n // there.\n const mediaNote = singleAudit?.mediaNote;\n // The base64 payload now lives in the result content; discard the\n // duplicate in-memory audit copies before returning.\n for (const audit of result.audits) {\n delete audit.media;\n delete audit.mediaNote;\n }\n const content: Array<{ type: \"text\"; text: string } | FabricMediaBlock> = [];\n if (mediaBlocks.length > 0) {\n // Mirror a native `read`: keep the image block(s) for OMP core's kitty\n // render alongside the short note. The handoff's `context` hook\n // swaps each image for its description on the LLM-bound clone, so the\n // text-only model still receives the description while the terminal\n // shows the kitty image.\n const textOutput =\n singleAudit && mediaNote\n ? mediaNote\n : (output === \"(no output)\" ? \"\" : output);\n if (textOutput) content.push({ type: \"text\", text: textOutput });\n for (const block of mediaBlocks) content.push(block);\n if (singleAudit && mediaNote) {\n singleAudit.result = mediaNote;\n }\n } else {\n content.push({ type: \"text\", text: output });\n }\n return {\n content,\n details: persistedRenderDetails(),\n ...(result.usage ? { usage: result.usage } : {}),\n ...(terminate ? { terminate: true } : {}),\n ...(result.success ? {} : { isError: true }),\n };\n },\n }),\n {\n mode: codePreviewSettings.toolCallBackground,\n toolCallTiming: codePreviewSettings.toolCallTiming,\n },\n);\n", "import type { FabricSpeculationSummaryV1 } from \"../audit/details.js\";\nimport type { FabricSpeculationStats } from \"./types.js\";\n\nexport const fabricSpeculationSummary = (\n stats: FabricSpeculationStats | undefined,\n): FabricSpeculationSummaryV1 | undefined => {\n if (!stats) return undefined;\n const summary: FabricSpeculationSummaryV1 = {\n launched: stats.launched,\n hit: stats.served,\n missed:\n stats.absent + stats.epochInvalidated + stats.freshnessInvalidated + stats.failed,\n discarded: stats.wasted + stats.skipped,\n };\n return summary.launched === 0 && summary.missed === 0 ? undefined : summary;\n};\n", "import type { FabricExecutionTraceV1 } from \"./audit/trace.js\";\n\nconst MAX_COMPLETED_CALLS = 8;\nconst MAX_PATH_CHARS = 100;\n\nconst compactPath = (value: string): string => {\n const singleLine = value.replaceAll(/\\s+/g, \" \").trim();\n if (singleLine.length <= MAX_PATH_CHARS) return singleLine;\n return `\u2026${singleLine.slice(-(MAX_PATH_CHARS - 1))}`;\n};\n\nexport const formatFailureProgress = (\n trace: FabricExecutionTraceV1,\n): string | undefined => {\n if (trace.outcome === \"succeeded\") return undefined;\n const completed = trace.operations.filter(\n (operation) => operation.outcome === \"succeeded\",\n );\n if (completed.length === 0) return undefined;\n const summaries = completed.slice(0, MAX_COMPLETED_CALLS).map((operation) => {\n const path = operation.args.path;\n return typeof path === \"string\"\n ? `${operation.ref}(${compactPath(path)})`\n : operation.ref;\n });\n const omitted = completed.length - summaries.length;\n return [\n `Completed before the outer failure (outputs not returned): ${summaries.join(\"; \")}${\n omitted > 0 ? `; +${omitted} more` : \"\"\n }.`,\n \"Successful calls may already have changed the workspace; inspect before repeating mutations.\",\n ].join(\"\\n\");\n};\n", "import { normalizeRunDisplay } from \"./run-display.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\n\nconst OPTIONAL_FABRIC_EXEC_KEYS = [\n \"payloads\",\n \"resultFormat\",\n \"tokenBudget\",\n \"agentBudget\",\n \"timeoutMs\",\n \"display\",\n] as const;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parsePayloads = (input: unknown): Record<string, string> | undefined => {\n let value = input;\n for (let attempt = 0; attempt < 2 && typeof value === \"string\"; attempt++) {\n try {\n value = JSON.parse(value);\n } catch {\n return undefined;\n }\n }\n if (!isRecord(value) || Object.values(value).some((entry) => typeof entry !== \"string\")) return undefined;\n return value as Record<string, string>;\n};\n\nexport const resolveFabricExecPayloads = (params: { payloads?: unknown }): Record<string, string> | undefined =>\n parsePayloads(params.payloads);\n\nexport const prepareFabricExecArguments = (input: unknown): unknown => {\n if (typeof input === \"string\") return { code: repairFabricGuestCode(input) };\n if (!isRecord(input)) return input;\n let prepared = input;\n const writable = (): Record<string, unknown> => {\n if (prepared === input) prepared = { ...input };\n return prepared;\n };\n if (Array.isArray(prepared.code) && prepared.code.every((line) => typeof line === \"string\")) {\n writable().code = prepared.code.join(\"\\n\");\n }\n if (typeof prepared.code === \"string\") {\n const repaired = repairFabricGuestCode(prepared.code);\n if (repaired !== prepared.code) writable().code = repaired;\n }\n for (const key of OPTIONAL_FABRIC_EXEC_KEYS) {\n if (Object.hasOwn(prepared, key) && (prepared[key] === null || prepared[key] === undefined)) {\n delete writable()[key];\n }\n }\n if (typeof prepared.display === \"string\" || isRecord(prepared.display)) {\n const normalized = normalizeRunDisplay(prepared.display);\n if (normalized) writable().display = normalized;\n else delete writable().display;\n }\n if (Object.hasOwn(prepared, \"payloads\")) {\n const normalized = parsePayloads(prepared.payloads);\n if (normalized && prepared.payloads !== normalized) writable().payloads = normalized;\n }\n return prepared;\n};\n", "import {\n GUEST_TYPE_DECLARATIONS,\n OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES,\n} from \"./guest-types.js\";\n\n// Core tool names come from the compatibility-argument table so a new guest\n// tool extends the registry (and the recovery hints) without edits here.\ntype CoreToolName = keyof typeof OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES;\n\nexport const CORE_TOOL_NAMES: readonly CoreToolName[] = Object.keys(\n OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES,\n) as CoreToolName[];\n\n// The guest declarations are a template-literal string, so the option bags are\n// extracted textually. Type aliases are matched with a bracket-depth scan (not\n// `[^;]`) because union members like `{ edits: OmpEditOperation[]; all?: boolean }`\n// contain interior semicolons.\nconst extractTypeDeclarations = (declarations: string): Map<string, string> => {\n const parsed = new Map<string, string>();\n for (const match of declarations.matchAll(/\\btype\\s+(\\w+)\\s*=/g)) {\n const name = match[1];\n if (name === undefined) continue;\n const rhsStart = match.index + match[0].length;\n let depth = 0;\n let end = rhsStart;\n while (end < declarations.length) {\n const character = declarations[end];\n if (character === \"(\" || character === \"{\" || character === \"[\") depth += 1;\n else if (character === \")\" || character === \"}\" || character === \"]\") depth -= 1;\n else if (character === \";\" && depth === 0) break;\n end += 1;\n }\n parsed.set(name, declarations.slice(rhsStart, end));\n }\n return parsed;\n};\n\nconst matchCaptures = (text: string, pattern: RegExp): string[] =>\n [...text.matchAll(pattern)].flatMap((match) =>\n match[1] === undefined ? [] : [match[1]],\n );\n\nconst objectLiteralKeys = (rhs: string): string[] => {\n const withoutMappedKeys = rhs.replace(/\\[\\s*\\w+\\s+in\\s+keyof\\s+\\w+\\s*\\]\\s*:/g, \" \");\n return matchCaptures(withoutMappedKeys, /([A-Za-z_]\\w*)\\s*\\??:/g);\n};\n\nconst referencedTypeNames = (rhs: string): string[] =>\n matchCaptures(rhs, /\\b(Omp[A-Z]\\w*)/g);\n\nconst capitalise = (tool: string): string =>\n tool.charAt(0).toUpperCase() + tool.slice(1);\n\n// Property name -> every core tool whose argument or options bag accepts it.\n// Walking starts from each tool's argument/compatibility/options aliases and\n// follows OMP* references (shared bags, edit operations) transitively.\nconst collectCoreToolProperties = (declarations: string): Map<string, CoreToolName[]> => {\n const typeDeclarations = extractTypeDeclarations(declarations);\n const owners = new Map<string, Set<CoreToolName>>();\n for (const tool of CORE_TOOL_NAMES) {\n const roots = [\n `Omp${capitalise(tool)}Argument`,\n OMP_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES[tool],\n `Omp${capitalise(tool)}Options`,\n ];\n const visited = new Set<string>();\n const walk = (name: string): void => {\n if (visited.has(name)) return;\n visited.add(name);\n const rhs = typeDeclarations.get(name);\n if (rhs === undefined) return;\n for (const property of objectLiteralKeys(rhs)) {\n const toolSet = owners.get(property) ?? new Set<CoreToolName>();\n toolSet.add(tool);\n owners.set(property, toolSet);\n }\n for (const reference of referencedTypeNames(rhs)) walk(reference);\n };\n for (const root of roots) walk(root);\n }\n return new Map([...owners].map(([property, toolSet]) => [property, [...toolSet]]));\n};\n\nexport const CORE_TOOL_PROPERTIES: ReadonlyMap<string, readonly CoreToolName[]> =\n collectCoreToolProperties(GUEST_TYPE_DECLARATIONS);\n", "import type { FabricTypeError } from \"./runtime/type-checker.js\";\nimport {\n CORE_TOOL_NAMES,\n CORE_TOOL_PROPERTIES,\n} from \"./runtime/core-tool-properties.js\";\n\nconst SYNTAX_ERROR_PATTERN = /expected|unterminated|unexpected|invalid character/i;\nconst PAYLOAD_CALL_PATTERN = /\\bomp\\.(?:edit|write)\\s*\\(/;\nconst UNQUOTED_PATH_HEAD =\n /\\bomp\\.(?:read|ls|write|edit)\\(\\s*(?:https?:\\/\\/|\\/(?![/*])|\\.\\/|\\.\\.\\/|~\\/|[A-Za-z]:[\\\\/])/;\nconst PROMISE_ALL_PATTERN = /\\bPromise\\.all\\s*\\(/;\nconst TUPLE_ARITY_PATTERN = /Tuple type .* of length '[0-9]+' has no element at index '[0-9]+'/;\nconst MISSING_NAME_PATTERN = /^Cannot find name '([^']+)'/;\nconst UNKNOWN_PROPERTY_PATTERN = /'([^']+)' does not exist in type '([^']+)'/;\nconst OMP_CALL_PATTERN = /\\bomp\\.(\\w+)\\s*\\(/g;\n\nconst FABRIC_EXEC_ARGUMENT_NOTES: Readonly<Record<string, string>> = {\n payloads:\n \"Named values belong in the outer `fabric_exec` arguments, then become available inside code as payloads.key.\",\n strings:\n \"Named values belong in the outer `fabric_exec` arguments and become available inside code as omp.key (for example, strings.task becomes omp.task).\",\n tokenBudget:\n \"Budget arguments (`tokenBudget`, `agentBudget`) belong to the outer `fabric_exec` call, not inside code.\",\n agentBudget:\n \"Budget arguments (`tokenBudget`, `agentBudget`) belong to the outer `fabric_exec` call, not inside code.\",\n display: \"The `display` objective belongs to the outer `fabric_exec` call, not inside code.\",\n resultFormat: \"`resultFormat` belongs to the outer `fabric_exec` call, not inside code.\",\n};\n\nconst PROPERTY_NOTES: Readonly<Record<string, string>> = {\n settle:\n \"`settle:true` settles nonzero shell exits into an `ok:false` envelope instead of rejecting; other `omp.*` calls reject failures normally.\",\n timeout: \"`timeout` is measured in seconds; `timeoutMs` is converted from milliseconds.\",\n};\n\n// Shell options that stay unsupported (cwd is honored per call since #71).\nconst SHELL_OPTION_NOTES: Readonly<Record<string, string>> = {\n stdin:\n \"OMP shell tools do not accept `stdin`. Write the content with `omp.write(path, content)`, then pass that path to the command or redirect the file into it.\",\n};\n\nconst isCoreToolName = (name: string): name is (typeof CORE_TOOL_NAMES)[number] =>\n (CORE_TOOL_NAMES as readonly string[]).includes(name);\n\n// The 2353 message names the checked type (e.g. 'OmpCommandArgument &\n// OmpBashOptions'); strip alias suffixes to recover the called tool.\nconst toolFromTypeText = (typeText: string): string | undefined => {\n for (const match of typeText.matchAll(/\\bOmp([A-Z]\\w*)/g)) {\n const captured = match[1];\n if (captured === undefined) continue;\n const candidate = captured\n .replace(/(?:Compatibility)?(?:Argument|Options)$/, \"\")\n .toLowerCase();\n if (isCoreToolName(candidate)) return candidate;\n }\n return undefined;\n};\n\n// Fallback for messages naming only shared bags (e.g. 'OmpPathArgument'): find\n// the `omp.<tool>(` call enclosing the error position. Type-checker lines are\n// 1-based and preceded by the guest wrapper, so try both offsets.\nconst enclosingCoreTool = (code: string, error: FabricTypeError): string | undefined => {\n const lines = code.split(\"\\n\");\n for (const lineIndex of [error.line - 2, error.line - 1]) {\n if (lineIndex < 0 || lineIndex >= lines.length) continue;\n const offset =\n lines.slice(0, lineIndex).join(\"\\n\").length +\n (lineIndex > 0 ? 1 : 0) +\n Math.max(0, error.column - 1);\n OMP_CALL_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n let tool: string | undefined;\n while ((match = OMP_CALL_PATTERN.exec(code)) !== null && match.index < offset) {\n const called = match[1];\n if (called !== undefined && isCoreToolName(called)) tool = called;\n }\n if (tool !== undefined) return tool;\n }\n return undefined;\n};\n\nconst unknownPropertyHint = (\n property: string,\n tool: string | undefined,\n): string | undefined => {\n if (tool === undefined) return undefined;\n if (tool === \"bash\") {\n const shellNote = SHELL_OPTION_NOTES[property];\n if (shellNote !== undefined) return `Recovery hint: ${shellNote}`;\n }\n const envelopeNote = FABRIC_EXEC_ARGUMENT_NOTES[property];\n if (envelopeNote !== undefined) {\n return `Recovery hint: \\`${property}\\` is a \\`fabric_exec\\` argument, not a \\`omp.${tool}\\` property. ${envelopeNote}`;\n }\n const ownerTools = CORE_TOOL_PROPERTIES.get(property);\n if (ownerTools === undefined || ownerTools.includes(tool as never)) return undefined;\n const owners = ownerTools.map((owner) => `\\`omp.${owner}\\``).join(\", \");\n const note = PROPERTY_NOTES[property];\n return `Recovery hint: \\`${property}\\` is not a \\`omp.${tool}\\` property \\u2014 it belongs to ${owners}.${note ? ` ${note}` : \"\"}`;\n};\n\nconst hasLiteralPayloadInterpolation = (\n code: string,\n errors: FabricTypeError[],\n): boolean => {\n if (!PAYLOAD_CALL_PATTERN.test(code)) return false;\n return errors.some((error) => {\n const name = MISSING_NAME_PATTERN.exec(error.message)?.[1];\n return name !== undefined && code.includes(`\\${${name}}`);\n });\n};\n\nexport const typeErrorRecoveryHint = (\n code: string,\n errors: FabricTypeError[],\n): string | undefined => {\n for (const error of errors) {\n const property = UNKNOWN_PROPERTY_PATTERN.exec(error.message)?.[1];\n const typeText = UNKNOWN_PROPERTY_PATTERN.exec(error.message)?.[2];\n if (property !== undefined && typeText !== undefined) {\n const tool = toolFromTypeText(typeText) ?? enclosingCoreTool(code, error);\n const hint = unknownPropertyHint(property, tool);\n if (hint) return hint;\n }\n }\n if (\n PROMISE_ALL_PATTERN.test(code)\n && errors.some((error) => TUPLE_ARITY_PATTERN.test(error.message))\n ) {\n return \"Recovery hint: match `Promise.all` destructuring one binding per promise; remove the extra binding or add the missing call.\";\n }\n if (hasLiteralPayloadInterpolation(code, errors)) {\n return \"Recovery hint: a `${...}` expression in an edit/write payload is being evaluated by the Fabric TypeScript program. Declare it if intentional; for literal file content, move the payload to top-level `payloads` and reference `payloads.key`.\";\n }\n if (\n UNQUOTED_PATH_HEAD.test(code)\n && errors.some((error) =>\n SYNTAX_ERROR_PATTERN.test(error.message)\n || error.message.includes(\"Cannot find name\")\n || error.message.includes(\"Expected 1-2 arguments\")\n )\n ) {\n return \"Recovery hint: quote filesystem paths and URLs as strings, e.g. `omp.read('/x')` or `omp.read({ path: '/x' })`. Unquoted paths are parsed as regex, division, or extra arguments.\";\n }\n if (!PAYLOAD_CALL_PATTERN.test(code)) return undefined;\n if (!errors.some((error) => SYNTAX_ERROR_PATTERN.test(error.message))) {\n return undefined;\n }\n return \"Recovery hint: if embedded edit/write payload text caused the syntax error, pass it through top-level `payloads` and reference `payloads.key` instead of escaping it inside `code`.\";\n};\n", "import { truncateToWidth, type Component } from \"@oh-my-pi/pi-tui\";\n\ninterface MeasuredPartialResult {\n component: Component;\n width: number;\n rows: number;\n}\n\nexport interface ResultRowBalance {\n partial?: MeasuredPartialResult;\n final?: Component;\n finalized?: boolean;\n}\n\nexport type LimitRenderer = (limit: number, width: number) => string[];\n\nexport class HiddenRowBorrowingComponent implements Component {\n #cachedWidth: number | undefined;\n #cachedDeficit: number | undefined;\n #cachedRows: string[] | undefined;\n\n constructor(\n private readonly baseLimit: number,\n private readonly maxLimit: number,\n private readonly renderLimit: LimitRenderer,\n private readonly balance: ResultRowBalance,\n ) {}\n\n render(width: number): readonly string[] {\n const deficit = resultRowDeficit(this.balance, width);\n if (\n this.#cachedWidth === width &&\n this.#cachedDeficit === deficit &&\n this.#cachedRows\n ) {\n return this.#cachedRows;\n }\n\n const base = this.renderLimit(this.baseLimit, width);\n let best = base;\n if (deficit > 0 && this.maxLimit > this.baseLimit) {\n let bestGrowth = 0;\n for (let limit = this.baseLimit + 1; limit <= this.maxLimit; limit++) {\n const candidate = this.renderLimit(limit, width);\n const growth = candidate.length - base.length;\n if (growth > deficit) break;\n if (growth >= bestGrowth) {\n best = candidate;\n bestGrowth = growth;\n }\n }\n }\n // Upstream components (OMP's Text wrap) can overproduce at tiny widths;\n // never emit a row wider than the requested width (issue #84).\n this.#cachedWidth = width;\n this.#cachedDeficit = deficit;\n this.#cachedRows = best.map((row) => truncateToWidth(row, Math.max(1, width)));\n return this.#cachedRows;\n }\n\n invalidate(): void {\n this.#cachedWidth = undefined;\n this.#cachedDeficit = undefined;\n this.#cachedRows = undefined;\n }\n}\n\nexport const observeResultRows = (\n component: Component,\n balance: ResultRowBalance,\n options: { expanded: boolean; isPartial: boolean },\n): Component => {\n if (options.isPartial) {\n balance.finalized = false;\n delete balance.final;\n return options.expanded ? component : new PartialResultObserver(component, balance);\n }\n\n balance.finalized = true;\n if (options.expanded) delete balance.final;\n else balance.final = component;\n return component;\n};\n\nexport const resultRowDeficit = (\n balance: ResultRowBalance,\n width: number,\n): number => {\n if (!balance.finalized || !balance.partial || !balance.final) return 0;\n const partialRows = balance.partial.width === width\n ? balance.partial.rows\n : balance.partial.component.render(width).length;\n const finalRows = balance.final.render(width).length;\n return Math.max(0, partialRows - finalRows);\n};\n\nclass PartialResultObserver implements Component {\n constructor(\n private readonly component: Component,\n private readonly balance: ResultRowBalance,\n ) {}\n\n render(width: number): readonly string[] {\n const lines = this.component.render(width);\n const previous = this.balance.partial;\n if (\n !previous ||\n previous.width !== width ||\n lines.length >= previous.rows\n ) {\n this.balance.partial = {\n component: this.component,\n width,\n rows: lines.length,\n };\n }\n return lines;\n }\n\n invalidate(): void {\n this.component.invalidate?.();\n }\n}\n", "import { mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { truncateMiddle } from \"./util.js\";\n\nexport const MAX_FAILURE_MODEL_OUTPUT_CHARS = 20_000;\n\nexport const modelOutputBudget = (\n configuredMaxChars: number,\n success: boolean,\n): number => success\n ? configuredMaxChars\n : Math.min(configuredMaxChars, MAX_FAILURE_MODEL_OUTPUT_CHARS);\n\nexport interface BoundedModelOutput {\n text: string;\n artifactPath?: string;\n originalChars: number;\n omittedChars: number;\n}\n\ntype ArtifactWriter = (content: string) => Promise<string>;\n\nconst writeOutputArtifact: ArtifactWriter = async (content) => {\n const directory = await mkdtemp(path.join(tmpdir(), \"omp-fabric-output-\"));\n const artifactPath = path.join(directory, \"output.txt\");\n await writeFile(artifactPath, content, { encoding: \"utf8\", mode: 0o600 });\n return artifactPath;\n};\n\nexport const boundModelOutput = async (\n visible: string,\n maxChars: number,\n fullOutput = visible,\n writeArtifact: ArtifactWriter = writeOutputArtifact,\n): Promise<BoundedModelOutput> => {\n if (visible.length <= maxChars && fullOutput.length <= maxChars) {\n return { text: visible, originalChars: fullOutput.length, omittedChars: 0 };\n }\n\n let artifactPath: string | undefined;\n try {\n artifactPath = await writeArtifact(fullOutput);\n } catch {\n artifactPath = undefined;\n }\n const suffix = artifactPath\n ? `\\n\\n[Full output (${fullOutput.length} chars) saved to: ${artifactPath}]`\n : \"\";\n const bodyBudget = Math.max(1, maxChars - suffix.length);\n const text = `${truncateMiddle(visible, bodyBudget)}${suffix}`;\n return {\n text: text.length <= maxChars ? text : truncateMiddle(text, maxChars),\n ...(artifactPath ? { artifactPath } : {}),\n originalChars: fullOutput.length,\n omittedChars: Math.max(0, fullOutput.length - Math.min(fullOutput.length, bodyBudget)),\n };\n};\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { resolveAgentDir } from \"./core/agent-dir.js\";\nimport type { ExtensionAPI } from \"@oh-my-pi/pi-coding-agent\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { FabricActivityStore } from \"./activity/store.js\";\nimport { CapturedToolCatalog } from \"./capture/catalog.js\";\nimport {\n FABRIC_COMPONENT_PROVIDER_NAMES,\n FABRIC_PROVIDER_COMPONENT_PREFIX,\n} from \"./components/provider-component.js\";\nimport type { FabricOwnedModelGuidance } from \"./components/model-guidance.js\";\nimport type { FabricComponentGraph } from \"./components/types.js\";\nimport {\n loadFabricConfig,\n loadFabricConfigForScope,\n type FabricConfig,\n type FabricResultFormat,\n type FabricSchemaMode,\n} from \"./config.js\";\nimport { FabricSessionApprovals } from \"./core/approval-controller.js\";\nimport { PrewalkController } from \"./prewalk/controller.js\";\nimport { PrewalkDriftTracker } from \"./prewalk/fs-drift.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport type { AgentToolResultMessage } from \"./agents/types.js\";\nimport type { FabricExecutionResult } from \"./execution-service.js\";\nimport type {\n FabricParticipantInfo,\n FabricParticipantListOptions,\n FabricPeerInfo,\n} from \"./topology/types.js\";\nimport {\n resolveFabricIdentity,\n type FabricAgentMessageDelivery,\n type FabricAgentMessageResult,\n type FabricMainAgentInfo,\n} from \"./main-agent.js\";\nimport type { FabricActorHostEvent } from \"./actors/types.js\";\nimport type { FabricLifecycleEventType } from \"./lifecycle/types.js\";\nimport type {\n FabricActionDescriptor,\n FabricComponentDefinition,\n FabricProvider,\n} from \"./protocol.js\";\nimport type { FabricRuntimeState, FabricRuntimeStateOptions } from \"./fabric-runtime-state.js\";\nimport type { FabricRuntimePaths } from \"./runtime-paths.js\";\n\nexport interface FabricStateOptions {\n paths?: FabricRuntimePaths;\n runtimeLoader?: () => Promise<typeof import(\"./fabric-runtime-state.js\")>;\n lcmContext?: FabricRuntimeStateOptions[\"lcmContext\"];\n}\n\ntype ActivationHook = (context: ExtensionContext) => void | Promise<void>;\ntype ActivationFailureHook = () => void | Promise<void>;\n\nexport class FabricState {\n #runtime: FabricRuntimeState | undefined;\n #activatingRuntime: FabricRuntimeState | undefined;\n #activation: Promise<FabricRuntimeState> | undefined;\n #activationGeneration: number | undefined;\n #config: FabricConfig | undefined;\n #cwd: string | undefined;\n #generation = 0;\n #everActivated = false;\n #activationHook: ActivationHook | undefined;\n #activationFailureHook: ActivationFailureHook | undefined;\n readonly #externalProviders = new Map<string, FabricProvider>();\n readonly #externalComponents = new Map<string, FabricComponentDefinition>();\n readonly #options: FabricStateOptions;\n readonly activity = new FabricActivityStore();\n readonly prewalk = new PrewalkController();\n readonly prewalkDrift = new PrewalkDriftTracker();\n readonly sessionApprovals = new FabricSessionApprovals();\n #widgetDismissedAt = 0;\n\n constructor(\n readonly omp: ExtensionAPI,\n readonly capturedTools: CapturedToolCatalog,\n options: FabricStateOptions = {},\n ) {\n this.#options = options;\n }\n\n get initialized(): boolean {\n return this.#current()?.initialized === true;\n }\n\n // Lightweight bootstrap seam: true once configuration is loaded, with no\n // dependency on the heavyweight runtime. Rendering reads this instead of\n // initialized so a resumed session honors bootstrapped presentation\n // preferences while the runtime is intentionally inactive.\n get bootstrapped(): boolean {\n return this.#config !== undefined;\n }\n\n get activated(): boolean {\n return this.#everActivated;\n }\n\n get config(): FabricConfig {\n if (!this.#config) throw new Error(\"OMP Fabric has not bootstrapped\");\n return this.#config;\n }\n\n get cwd(): string | undefined {\n return this.#cwd;\n }\n\n get widgetDismissedAt(): number {\n return this.#current()?.widgetDismissedAt ?? this.#widgetDismissedAt;\n }\n\n set widgetDismissedAt(value: number) {\n this.#widgetDismissedAt = value;\n const runtime = this.#current();\n if (runtime) runtime.widgetDismissedAt = value;\n }\n\n get registry(): FabricRuntimeState[\"registry\"] { return this.#required().registry; }\n get execution(): FabricRuntimeState[\"execution\"] { return this.#required().execution; }\n\n /** Speculative-PTC stream tap; undefined pre-init or when speculation is disabled. */\n get speculationTap(): FabricRuntimeState[\"speculationTap\"] { return this.#runtime?.speculationTap; }\n\n /** Turn-boundary backstop for the speculation store; safe before initialization. */\n resetSpeculation(): void { this.#runtime?.resetSpeculation(); }\n get agents(): FabricRuntimeState[\"agents\"] { return this.#required().agents; }\n get actors(): FabricRuntimeState[\"actors\"] { return this.#required().actors; }\n get globalActors(): FabricRuntimeState[\"globalActors\"] { return this.#required().globalActors; }\n get mesh(): FabricRuntimeState[\"mesh\"] { return this.#required().mesh; }\n get compact(): FabricRuntimeState[\"compact\"] { return this.#required().compact; }\n get repairs(): FabricRuntimeState[\"repairs\"] { return this.#required().repairs; }\n get components(): FabricRuntimeState[\"components\"] { return this.#required().components; }\n\n setActivationHook(hook: ActivationHook, onFailure?: ActivationFailureHook): void {\n this.#activationHook = hook;\n this.#activationFailureHook = onFailure;\n }\n\n async bootstrap(context: ExtensionContext): Promise<void> {\n const generation = ++this.#generation;\n this.#cwd = context.cwd;\n // A failed config load must not leak the previous session's configuration\n // into this one: clear before the read so bootstrapped stays false and\n // presentation falls back to the safe default until a load succeeds.\n this.#config = undefined;\n const config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#config = config;\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n this.activity.reset();\n this.sessionApprovals.approvedRisks.clear();\n this.#widgetDismissedAt = 0;\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n\n const pending = this.#activation;\n if (pending) await pending.catch(() => undefined);\n if (generation !== this.#generation) return;\n if (this.#everActivated) await this.#activate(context, true);\n }\n\n async initialize(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) {\n await this.bootstrap(context);\n } else {\n this.#config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n }\n await this.#activate(context, true);\n }\n\n async ensure(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) await this.bootstrap(context);\n await this.#activate(context, false);\n }\n\n shouldEagerlyActivate(context: ExtensionContext): boolean {\n if (\n process.env.OMP_FABRIC_CAPABILITY_REQUIREMENTS !== undefined &&\n Boolean(process.env.OMP_FABRIC_CAPABILITY_DIGEST)\n ) return true;\n if (this.config.prewalk.alwaysRearm) return true;\n if (this.config.components.some((component) => component.disabled !== true)) return true;\n if (!context.isProjectTrusted() || !this.config.mesh.enabled || this.config.schema.mode === \"enforce\") {\n return false;\n }\n const sessionId = context.sessionManager.getSessionId();\n if (resolveFabricIdentity(sessionId).identity.kind !== \"main\") return false;\n const projectRoot = process.env.OMP_FABRIC_PROJECT_ROOT ?? context.cwd;\n const meshRoot = process.env.OMP_FABRIC_MESH_ROOT ??\n (this.config.mesh.root\n ? path.resolve(projectRoot, this.config.mesh.root)\n : path.join(projectRoot, \".omp\", \"fabric\", \"mesh\"));\n const fabricSessionId = process.env.OMP_FABRIC_SESSION_ID?.trim() || sessionId;\n const actorRoots = [\n path.join(meshRoot, \"actors\"),\n path.join(meshRoot, \"actors\", fabricSessionId),\n ];\n return actorRoots.some((actorRoot) => {\n try {\n const registry = JSON.parse(fs.readFileSync(path.join(actorRoot, \"actors.json\"), \"utf8\")) as unknown;\n if (typeof registry !== \"object\" || registry === null || Array.isArray(registry)) return false;\n const actors = (registry as { actors?: unknown }).actors;\n return Array.isArray(actors) && actors.some((value) => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const actor = value as Record<string, unknown>;\n return typeof actor.id === \"string\" && /^[a-f0-9]{32}$/.test(actor.id) &&\n typeof actor.name === \"string\" && /^[a-zA-Z0-9][a-zA-Z0-9 _.-]{0,59}$/.test(actor.name) &&\n typeof actor.instructions === \"string\" &&\n Buffer.byteLength(actor.instructions, \"utf8\") <= this.config.mesh.maxEventBytes &&\n typeof actor.createdAt === \"number\" && Number.isFinite(actor.createdAt);\n });\n } catch {\n return false;\n }\n });\n }\n\n mainAgentInfo(context?: ExtensionContext): FabricMainAgentInfo { return this.#required().mainAgentInfo(context); }\n peerInfos(): FabricPeerInfo[] { return this.#current()?.peerInfos() ?? []; }\n componentGraph(): FabricComponentGraph {\n return this.#current()?.componentGraph() ?? { components: [], edges: [], cycles: [] };\n }\n modelGuidance(): FabricOwnedModelGuidance[] { return this.#current()?.modelGuidance() ?? []; }\n participantInfos(options: FabricParticipantListOptions = {}): FabricParticipantInfo[] {\n return this.#current()?.participantInfos(options) ?? [];\n }\n queueUserMessage(targetId: string, message: string, delivery: FabricAgentMessageDelivery): Promise<FabricAgentMessageResult> {\n return this.#required().queueUserMessage(targetId, message, delivery);\n }\n stopParticipant(targetId: string): Promise<unknown> { return this.#required().stopParticipant(targetId); }\n claimHandoff(execution: FabricExecutionResult, sessionId: string, resultFormat: FabricResultFormat, outerToolCallId: string): Promise<PendingFabricHandoff | undefined> {\n return this.#required().claimHandoff(execution, sessionId, resultFormat, outerToolCallId);\n }\n runHandoffAtBoundary(pending: PendingFabricHandoff, result: AgentToolResultMessage, context: ExtensionContext): Promise<Record<string, unknown>> {\n return this.#required().runHandoffAtBoundary(pending, result, context);\n }\n noteMainActivity(context: ExtensionContext): void { this.#current()?.noteMainActivity(context); }\n dispatchHostEvent(event: FabricActorHostEvent, payload: unknown, context: ExtensionContext): number {\n return this.#current()?.dispatchHostEvent(event, payload, context) ?? 0;\n }\n publishHostLifecycle(event: FabricLifecycleEventType, payload: unknown): Promise<void> {\n return this.#current()?.publishHostLifecycle(event, payload) ?? Promise.resolve();\n }\n\n registerExternal(provider: FabricProvider, options: { overwrite?: boolean } = {}): void {\n if (\n provider.name === \"fabric\" ||\n provider.name === \"components\" ||\n FABRIC_COMPONENT_PROVIDER_NAMES.some((name) => name === provider.name)\n ) {\n throw new Error(`Reserved Fabric provider name: ${provider.name}`);\n }\n if (this.#externalProviders.has(provider.name) && !options.overwrite) {\n throw new Error(`Fabric provider already registered: ${provider.name}`);\n }\n this.#externalProviders.set(provider.name, provider);\n this.#current()?.registerExternal(provider, options);\n }\n\n registerExternalComponent(\n component: FabricComponentDefinition,\n options: { overwrite?: boolean } = {},\n ): void {\n if (component.name.startsWith(FABRIC_PROVIDER_COMPONENT_PREFIX)) {\n throw new Error(`Reserved Fabric component name: ${component.name}`);\n }\n if (this.#externalComponents.has(component.name) && !options.overwrite) {\n throw new Error(`Fabric component already registered: ${component.name}`);\n }\n this.#externalComponents.set(component.name, component);\n this.#current()?.registerExternalComponent(component, options);\n }\n\n reloadConfig(context: ExtensionContext): void {\n const next = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n if (this.#config) {\n next.schema.mode = this.#config.schema.mode;\n // Keep the enforce \u21D2 QuickJS coupling alive across reloads; a disk\n // runtime value must never combine with a live enforce override.\n if (next.schema.mode === \"enforce\") next.executor.runtime = this.#config.executor.runtime;\n }\n this.#config = next;\n this.#runtime?.reloadConfig(context, next);\n }\n\n // Ephemeral, session-only schema mode: mutates the live config (guidance,\n // resolved-action gate, and executor runtime all read it per call) without\n // touching fabric.json, so the next session starts from the configured mode.\n // reloadConfig preserves the override like the startup mode does.\n setSchemaMode(context: ExtensionContext, mode: FabricSchemaMode): void {\n if (!this.#config) throw new Error(\"Fabric is not initialized\");\n const previous = this.#config.schema.mode;\n if (mode === \"enforce\" && previous !== \"enforce\" && !this.#config.fullCodeMode) {\n throw new Error(\n \"Schema enforce requires full code mode; enable fullCodeMode or start a session with schema.mode=enforce\",\n );\n }\n this.#config.schema.mode = mode;\n if (mode === \"enforce\") {\n // Mirror normalizeFabricConfig: the sandbox gate is void when guest code\n // has a process escape hatch, so enforce always runs on QuickJS.\n this.#config.executor.runtime = \"quickjs\";\n } else if (previous === \"enforce\") {\n this.#config.executor.runtime = this.#diskConfig(context).executor.runtime;\n }\n this.#runtime?.setSchemaMode(mode, this.#config.executor.runtime);\n }\n\n schemaStatus(context: ExtensionContext): {\n mode: FabricSchemaMode;\n source: \"config\" | \"session override\";\n executorRuntime: string;\n } {\n const disk = this.#diskConfig(context);\n const mode = this.#config?.schema.mode ?? disk.schema.mode;\n return {\n mode,\n source: this.#config && this.#config.schema.mode !== disk.schema.mode\n ? \"session override\"\n : \"config\",\n executorRuntime: this.#config?.executor.runtime ?? disk.executor.runtime,\n };\n }\n\n #diskConfig(context: ExtensionContext): FabricConfig {\n const projectTrusted = context.isProjectTrusted();\n return loadFabricConfigForScope(\n { cwd: context.cwd, agentDir: resolveAgentDir(), projectTrusted },\n projectTrusted ? \"project\" : \"global\",\n );\n }\n\n async shutdown(): Promise<void> {\n const generation = ++this.#generation;\n const activation = this.#activation;\n if (activation) await activation.catch(() => undefined);\n if (generation !== this.#generation) return;\n\n const runtime = this.#runtime;\n this.#runtime = undefined;\n try {\n await runtime?.shutdown();\n } finally {\n if (generation === this.#generation) {\n this.#config = undefined;\n this.#cwd = undefined;\n this.#externalProviders.clear();\n this.#externalComponents.clear();\n this.#everActivated = false;\n this.activity.reset();\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n }\n }\n }\n\n async #activate(context: ExtensionContext, reinitialize: boolean): Promise<FabricRuntimeState> {\n if (this.#activation) {\n if (this.#activationGeneration === this.#generation) return this.#activation;\n await this.#activation.catch(() => undefined);\n return this.#activate(context, reinitialize);\n }\n if (this.#runtime?.initialized && !reinitialize) return this.#runtime;\n\n const generation = this.#generation;\n const config = this.config;\n const existing = this.#runtime;\n const reusable = existing?.initialized ? existing : undefined;\n const orphan = existing && !existing.initialized ? existing : undefined;\n this.#runtime = undefined;\n let candidate: FabricRuntimeState | undefined;\n const assertCurrent = (): void => {\n if (generation !== this.#generation) {\n throw new Error(\"OMP Fabric activation was superseded by a session change\");\n }\n };\n const activation = (async () => {\n try {\n await orphan?.shutdown().catch(() => undefined);\n assertCurrent();\n candidate = reusable ?? await this.#createRuntime();\n if (!reusable) {\n for (const component of this.#externalComponents.values()) {\n candidate.registerExternalComponent(component, { overwrite: true });\n }\n }\n await candidate.initialize(context, config);\n assertCurrent();\n for (const provider of this.#externalProviders.values()) {\n candidate.registerExternal(provider, { overwrite: true });\n }\n await candidate.settleComponents?.();\n assertCurrent();\n this.#activatingRuntime = candidate;\n candidate.widgetDismissedAt = this.#widgetDismissedAt;\n await this.#activationHook?.(context);\n assertCurrent();\n this.#runtime = candidate;\n this.#activatingRuntime = undefined;\n this.#everActivated = true;\n return candidate;\n } catch (error) {\n try {\n await this.#activationFailureHook?.();\n } catch {\n // Cleanup is best-effort; preserve the activation failure.\n }\n if (this.#activatingRuntime === candidate) this.#activatingRuntime = undefined;\n if (candidate) await candidate.shutdown().catch(() => undefined);\n if (this.#runtime === candidate) this.#runtime = undefined;\n throw error;\n }\n })();\n this.#activation = activation;\n this.#activationGeneration = generation;\n void activation.finally(() => {\n if (this.#activation === activation) {\n this.#activation = undefined;\n this.#activationGeneration = undefined;\n }\n }).catch(() => undefined);\n return activation;\n }\n\n async #createRuntime(): Promise<FabricRuntimeState> {\n const module = await (this.#options.runtimeLoader?.() ?? import(\"./fabric-runtime-state.js\"));\n return new module.FabricRuntimeState(\n this.omp,\n this.capturedTools,\n {\n activity: this.activity,\n prewalk: this.prewalk,\n prewalkDrift: this.prewalkDrift,\n sessionApprovals: this.sessionApprovals,\n ...(this.#options.paths ? { paths: this.#options.paths } : {}),\n ...(this.#options.lcmContext ? { lcmContext: this.#options.lcmContext } : {}),\n },\n );\n }\n\n #current(): FabricRuntimeState | undefined {\n return this.#runtime ?? this.#activatingRuntime;\n }\n\n #required(): FabricRuntimeState {\n const runtime = this.#current();\n if (!runtime?.initialized) throw new Error(\"OMP Fabric has not activated\");\n return runtime;\n }\n}\n", "import type { CatalogRepair, RepairClassification, RepairStage } from \"./types.js\";\n\nconst TYPECHECK_HEAD = /type error|type checking failed/i;\nconst INVALID_ARGS = /Invalid arguments for ([^:]+):\\s*(.*)/s;\nconst UNKNOWN_ACTION = /Unknown Fabric action:\\s*(\\S+)/i;\nconst VALIDATION_FAILED = /Validation failed for tool\\s+\"?fabric_exec\"?/i;\nconst EXACT_TEXT = /could not find the exact text|Could not find edits\\[/i;\nconst RUNTIME_HEAD = /^Runtime error/i;\nconst ENOENT = /ENOENT|no such file|Path not found/i;\nconst ARITY = /Expected ([0-9]+)(?:-[0-9]+)? arguments, but got ([0-9]+)/;\nconst CANNOT_FIND = /Cannot find name '([^']+)'/;\nconst DISPLAY_OBJECT = /display: must be object/i;\nconst PAYLOADS_OBJECT = /payloads: must be object/i;\nconst CODE_REQUIRED = /code: must have required properties/i;\n\nconst SHELL_OR_PROSE_NAMES = new Set([\n \"$\",\n \"PY\",\n \"a\",\n \"and\",\n \"bash\",\n \"data\",\n \"do\",\n \"document\",\n \"done\",\n \"e\",\n \"echo\",\n \"f\",\n \"fi\",\n \"for\",\n \"i\",\n \"if\",\n \"in\",\n \"k\",\n \"len\",\n \"m\",\n \"n\",\n \"name\",\n \"open\",\n \"out\",\n \"p\",\n \"path\",\n \"printf\",\n \"r\",\n \"s\",\n \"sh\",\n \"t\",\n \"text\",\n \"the\",\n \"then\",\n \"tmp\",\n \"while\",\n \"x\",\n]);\n\nconst firstText = (content: unknown): string => {\n if (typeof content === \"string\") return content;\n if (content && typeof content === \"object\" && !Array.isArray(content)) {\n return firstText((content as { content?: unknown }).content);\n }\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part) => {\n if (typeof part === \"string\") return part;\n if (part && typeof part === \"object\" && typeof (part as { text?: unknown }).text === \"string\") {\n return (part as { text: string }).text;\n }\n return \"\";\n })\n .join(\"\\n\");\n};\n\nconst extraKeysFromMessage = (message: string): string[] => {\n const keys: string[] = [];\n for (const match of message.matchAll(\n /\\/([A-Za-z_][\\w$]*): must not have additional properties/g,\n )) {\n const key = match[1];\n if (key) keys.push(key);\n }\n return keys;\n};\n\nexport const classifyInvalidArgs = (\n ref: string,\n message: string,\n extraKeys: readonly string[] = extraKeysFromMessage(message),\n): RepairClassification => {\n const key = extraKeys[0];\n return {\n stage: \"invocation_args\",\n fingerprint: key ? `args:${ref}:${key}` : `args:${ref}:${message.slice(0, 80)}`,\n };\n};\n\nexport const classifyUnknownAction = (ref: string): RepairClassification => {\n const trimmed = ref.replace(/[,)]+$/, \"\").trim();\n return {\n stage: \"invocation_unknown_action\",\n fingerprint: `unknown:${trimmed}`,\n };\n};\n\nexport const classifyTypeErrors = (\n messages: readonly string[],\n enclosingTool?: string,\n): RepairClassification[] => {\n const out: RepairClassification[] = [];\n const seen = new Set<string>();\n const push = (entry: RepairClassification) => {\n if (seen.has(entry.fingerprint)) return;\n seen.add(entry.fingerprint);\n out.push(entry);\n };\n for (const message of messages) {\n const arity = ARITY.exec(message);\n if (arity) {\n const expected = Number(arity[1]);\n const got = Number(arity[2]);\n if (got > expected) {\n push({\n stage: \"invocation_typecheck\",\n fingerprint: enclosingTool\n ? `typecheck:arity:${expected}<-${got}:${enclosingTool}`\n : `typecheck:arity:${expected}<-${got}`,\n });\n continue;\n }\n }\n const missing = CANNOT_FIND.exec(message);\n if (missing?.[1] && SHELL_OR_PROSE_NAMES.has(missing[1])) {\n push({\n stage: \"didactic\",\n fingerprint: `didactic:cannot_find:${missing[1]}`,\n });\n continue;\n }\n if (missing?.[1]) {\n push({\n stage: \"invocation_typecheck\",\n fingerprint: `typecheck:cannot_find:${missing[1]}`,\n });\n continue;\n }\n push({\n stage: \"invocation_typecheck\",\n fingerprint: `typecheck:${message.slice(0, 80)}`,\n });\n }\n return out.length > 0\n ? out\n : [{ stage: \"invocation_typecheck\", fingerprint: \"typecheck:unparsed\" }];\n};\n\nexport const classifyToolResult = (input: {\n toolName?: string;\n isError?: boolean;\n content?: unknown;\n}): RepairClassification | undefined => {\n if (!input.isError) return undefined;\n const text = firstText(input.content);\n const head = text.slice(0, 400);\n const tool = input.toolName ?? \"?\";\n\n if (VALIDATION_FAILED.test(head)) {\n if (DISPLAY_OBJECT.test(text)) {\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:display:object\" };\n }\n if (PAYLOADS_OBJECT.test(text)) {\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:payloads:object\" };\n }\n if (CODE_REQUIRED.test(text)) {\n return { stage: \"didactic\", fingerprint: \"outer:code:required\" };\n }\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:unparsed\" };\n }\n if (TYPECHECK_HEAD.test(head)) {\n const lines = text\n .split(\"\\n\")\n .map((line) => line.replace(/^Line \\d+:\\d+ \u2014 /, \"\").trim())\n .filter((line) => line.length > 0 && !/^Type errors?;? code was not executed:?$/i.test(line));\n return classifyTypeErrors(lines)[0];\n }\n const invalid = INVALID_ARGS.exec(text);\n if (invalid?.[1]) return classifyInvalidArgs(invalid[1].trim(), invalid[2] ?? \"\");\n const unknown = UNKNOWN_ACTION.exec(text);\n if (unknown?.[1]) return classifyUnknownAction(unknown[1]);\n if (EXACT_TEXT.test(text)) return { stage: \"effect\", fingerprint: `effect:edit_miss:${tool}` };\n if ([\"bash\", \"omp.bash\"].includes(tool)) {\n return { stage: \"effect\", fingerprint: \"effect:bash\" };\n }\n if ([\"read\", \"write\", \"edit\", \"grep\", \"find\", \"ls\"].includes(tool)) {\n return { stage: \"effect\", fingerprint: `effect:native:${tool}` };\n }\n if (ENOENT.test(text) || RUNTIME_HEAD.test(head)) {\n return { stage: \"effect\", fingerprint: `effect:runtime:${tool}` };\n }\n return { stage: \"didactic\", fingerprint: `other:${tool}` };\n};\n\n", "import { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport const MINIMUM_OMP_HOST_VERSION = \"18.1.10\";\n\nconst OMP_HOST_PACKAGE_NAMES: Record<string, true> = {\n \"@oh-my-pi/pi-coding-agent\": true,\n};\n\ninterface ParsedVersion {\n numbers: [number, number, number];\n prerelease?: string;\n}\n\nconst parseVersion = (value: string): ParsedVersion | undefined => {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?/.exec(value.trim());\n if (!match) return undefined;\n return {\n numbers: [Number(match[1]), Number(match[2]), Number(match[3])],\n ...(match[4] ? { prerelease: match[4] } : {}),\n };\n};\n\nexport const compareVersions = (left: string, right: string): number | undefined => {\n const a = parseVersion(left);\n const b = parseVersion(right);\n if (!a || !b) return undefined;\n for (let index = 0; index < a.numbers.length; index++) {\n const delta = a.numbers[index]! - b.numbers[index]!;\n if (delta !== 0) return Math.sign(delta);\n }\n if (a.prerelease && !b.prerelease) return -1;\n if (!a.prerelease && b.prerelease) return 1;\n if (a.prerelease === b.prerelease) return 0;\n return (a.prerelease ?? \"\").localeCompare(b.prerelease ?? \"\");\n};\n\nexport const detectOmpHostVersion = (\n cliPath: string | undefined = process.argv[1],\n): string | undefined => {\n if (!cliPath) return undefined;\n let directory: string;\n try {\n directory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n while (true) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n if (\n typeof manifest.name === \"string\" &&\n OMP_HOST_PACKAGE_NAMES[manifest.name] === true &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\nexport const ompHostCompatibilityWarning = (\n version: string | undefined = detectOmpHostVersion(),\n): string | undefined => {\n if (!version) return undefined;\n const comparison = compareVersions(version, MINIMUM_OMP_HOST_VERSION);\n if (comparison === undefined || comparison >= 0) return undefined;\n return `OMP Fabric requires OMP >= ${MINIMUM_OMP_HOST_VERSION}; detected ${version}. Upgrade OMP before relying on Fabric continuation behavior.`;\n};\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { writeJsonAtomic } from \"../core/atomic-write.js\";\nimport { compareVersions } from \"../host-compatibility.js\";\nimport { resolveFabricIdentity } from \"../main-agent.js\";\n\nconst PACKAGE_NAME = \"omp-fabric\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst UPGRADE_COMMAND = `omp plugin install ${PACKAGE_NAME}`;\nconst REQUEST_TIMEOUT_MS = 4_000;\n\nexport const UPDATE_STATUS_KEY = \"fabric-update\";\nexport const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1_000;\n\ninterface UpdateCheckCache {\n format: 1;\n checkedAt: number;\n latest: string;\n notified?: string;\n}\n\nexport interface FabricUpdateNotice {\n installed: string;\n latest: string;\n message: string;\n}\n\nexport type FabricUpdateFetch = (\n url: string,\n init: { signal: AbortSignal; headers: Record<string, string> },\n) => Promise<{ ok: boolean; json(): Promise<unknown> }>;\n\nexport interface FabricUpdateCheckOptions {\n agentDir: string;\n installedVersion?: string;\n fetchImpl?: FabricUpdateFetch;\n now?: number;\n timeoutMs?: number;\n}\n\nexport const updateCheckCachePath = (agentDir: string): string =>\n path.join(agentDir, \"fabric\", \"update-check.json\");\n\nconst installedVersionFromManifest = (): string | undefined => {\n let directory = path.dirname(fileURLToPath(import.meta.url));\n while (true) {\n try {\n const manifest = JSON.parse(\n fs.readFileSync(path.join(directory, \"package.json\"), \"utf8\"),\n ) as { name?: unknown; version?: unknown };\n if (manifest.name === PACKAGE_NAME && typeof manifest.version === \"string\") {\n return manifest.version;\n }\n } catch {\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\nconst readCache = (cachePath: string): UpdateCheckCache | undefined => {\n try {\n const parsed = JSON.parse(fs.readFileSync(cachePath, \"utf8\")) as Partial<UpdateCheckCache>;\n if (typeof parsed.checkedAt !== \"number\" || !Number.isFinite(parsed.checkedAt)) return undefined;\n if (typeof parsed.latest !== \"string\" || parsed.latest.length === 0) return undefined;\n return {\n format: 1,\n checkedAt: parsed.checkedAt,\n latest: parsed.latest,\n ...(typeof parsed.notified === \"string\" ? { notified: parsed.notified } : {}),\n };\n } catch {\n return undefined;\n }\n};\n\nconst writeCache = (cachePath: string, value: UpdateCheckCache): void => {\n try {\n writeJsonAtomic(cachePath, value, { space: 2, newline: true });\n } catch {\n }\n};\n\nconst fetchLatestVersion = async (\n fetchImpl: FabricUpdateFetch,\n timeoutMs: number,\n): Promise<string | undefined> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n timer.unref?.();\n try {\n const response = await fetchImpl(REGISTRY_URL, {\n signal: controller.signal,\n headers: { accept: \"application/json\" },\n });\n if (!response.ok) return undefined;\n const payload = (await response.json()) as { version?: unknown } | null;\n const version = payload?.version;\n return typeof version === \"string\" && version.length > 0 ? version : undefined;\n } catch {\n return undefined;\n } finally {\n clearTimeout(timer);\n }\n};\n\nexport const checkFabricUpdate = async (\n options: FabricUpdateCheckOptions,\n): Promise<FabricUpdateNotice | undefined> => {\n try {\n const installed = options.installedVersion ?? installedVersionFromManifest();\n if (installed === undefined) return undefined;\n const now = options.now ?? Date.now();\n const cachePath = updateCheckCachePath(options.agentDir);\n const cached = readCache(cachePath);\n const age = cached === undefined ? undefined : now - cached.checkedAt;\n const fresh = cached !== undefined && age !== undefined && age >= 0 && age < UPDATE_CHECK_TTL_MS;\n let record: UpdateCheckCache;\n if (fresh && cached !== undefined) {\n record = cached;\n } else {\n const latest = await fetchLatestVersion(\n options.fetchImpl ?? (globalThis.fetch as unknown as FabricUpdateFetch),\n options.timeoutMs ?? REQUEST_TIMEOUT_MS,\n );\n if (latest === undefined) return undefined;\n record = {\n format: 1,\n checkedAt: now,\n latest,\n ...(cached?.notified === undefined ? {} : { notified: cached.notified }),\n };\n }\n const behind = compareVersions(record.latest, installed) === 1;\n const announce = behind && record.notified !== record.latest;\n if (!fresh || announce) {\n writeCache(cachePath, announce ? { ...record, notified: record.latest } : record);\n }\n if (!announce) return undefined;\n return {\n installed,\n latest: record.latest,\n message: `${PACKAGE_NAME} ${installed} \u2192 ${record.latest} \u00B7 ${UPGRADE_COMMAND}`,\n };\n } catch {\n return undefined;\n }\n};\n\nexport interface FabricUpdateScheduleOptions {\n enabled: boolean;\n agentDir: string;\n installedVersion?: string;\n fetchImpl?: FabricUpdateFetch;\n now?: number;\n}\n\nexport const scheduleFabricUpdateCheck = async (\n context: ExtensionContext,\n options: FabricUpdateScheduleOptions,\n): Promise<void> => {\n if (!options.enabled || !context.hasUI) return;\n let sessionId: string;\n try {\n sessionId = context.sessionManager.getSessionId();\n } catch {\n return;\n }\n if (resolveFabricIdentity(sessionId).identity.kind !== \"main\") return;\n const notice = await checkFabricUpdate({\n agentDir: options.agentDir,\n ...(options.installedVersion === undefined ? {} : { installedVersion: options.installedVersion }),\n ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),\n ...(options.now === undefined ? {} : { now: options.now }),\n });\n if (notice === undefined) return;\n try {\n context.ui.setStatus(UPDATE_STATUS_KEY, notice.message);\n } catch {\n }\n};\n", "import path from \"node:path\";\nimport type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { TUI } from \"@oh-my-pi/pi-tui\";\nimport type { CodePreviewSettings } from \"./code-preview.js\";\nimport type { FabricConversationState, FabricConversationView } from \"./conversation.js\";\nimport type { NativeConversationReader, NativeConversationSource } from \"./conversation-native-reader.js\";\nimport type { FabricConversationTranscriptRendererOptions } from \"./conversation-render.js\";\nimport type { FabricActivityRun } from \"../activity/types.js\";\nimport type {\n FabricActorBindingScope,\n FabricActorDelivery,\n FabricActorHostEvent,\n} from \"../actors/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport type { FabricThinking } from \"../thinking.js\";\nimport type { MeshEvent } from \"../mesh/store.js\";\nimport type { FabricDashboardMessageTarget } from \"./dashboard.js\";\nimport type { ModelSource } from \"./model-picker.js\";\nimport { createDashboardSnapshot } from \"./snapshot.js\";\nimport { safeText } from \"./format.js\";\nimport { isActiveStatus, type FabricDashboardSnapshot, type FabricUiActor, type FabricUiAgent } from \"./types.js\";\nimport { FabricWidget, shouldShowFabricWidget } from \"./widget.js\";\nimport { AgentTranscriptReader, type FabricTranscriptSource } from \"./transcript.js\";\n\nconst WIDGET_ID = \"omp-fabric\";\nconst ACTIVITY_REFRESH_MS = 100;\n\nconst emptySnapshot = (): FabricDashboardSnapshot => {\n const now = Date.now();\n return {\n now,\n runs: [],\n main: {\n id: \"main\",\n name: \"Main\",\n kind: \"main\",\n status: \"idle\",\n runner: \"omp\",\n transport: \"host\",\n cwd: process.cwd(),\n startedAt: now,\n updatedAt: now,\n pendingMessages: false,\n local: true,\n },\n peers: [],\n agents: [],\n actors: [],\n componentGraph: { components: [], edges: [], cycles: [] },\n globalActors: [],\n state: [],\n events: [],\n };\n};\n\nexport class FabricUiController {\n #context: ExtensionContext | undefined;\n #snapshot: FabricDashboardSnapshot = emptySnapshot();\n #events: MeshEvent[] = [];\n #meshOffset = 0;\n #timer: NodeJS.Timeout | undefined;\n #activityUnsubscribe: (() => void) | undefined;\n #actorUnsubscribe: (() => void) | undefined;\n #agentUnsubscribe: (() => void) | undefined;\n #scheduledRefresh: NodeJS.Timeout | undefined;\n #widgetTui: TUI | undefined;\n #dashboardTui: TUI | undefined;\n #widgetMounted = false;\n #widget: FabricWidget | undefined;\n #lastRefreshErrorAt = 0;\n #lastRefreshAt = 0;\n #dashboardOpen = false;\n #conversationOpen = false;\n #conversationState: FabricConversationState | undefined;\n #conversationView: FabricConversationView | undefined;\n #conversationTui: TUI | undefined;\n #closeConversation: (() => void) | undefined;\n #epoch = 0;\n #activityRevision: number | undefined;\n // Tracks whether #activityRuns was last fetched with full payloads. The\n // dashboard needs args/result/preview to render call detail; the periodic\n // refresh instead pulls payload-free summaries so streaming runs stop\n // paying a deep clone of up to 1,000 bounded call payloads per tick.\n #activityRunsDetailed = true;\n #activityRuns: FabricActivityRun[] = [];\n readonly #transcripts = new AgentTranscriptReader();\n readonly #conversationReaders = new Map<string, NativeConversationReader>();\n\n constructor(\n readonly state: FabricState,\n readonly codePreviewSettings?: CodePreviewSettings,\n readonly conversationRenderers?: FabricConversationTranscriptRendererOptions,\n ) {}\n\n start(context: ExtensionContext): void {\n this.stop();\n this.#context = context;\n if (!this.state.config.ui.enabled || context.mode !== \"tui\") return;\n if (this.state.config.mesh.enabled) {\n this.#events = this.state.mesh.read({ limit: this.state.config.ui.eventHistory });\n this.#meshOffset = this.state.mesh.latestOffset();\n }\n this.#activityUnsubscribe = this.state.activity.subscribe(() => this.#scheduleRefresh());\n this.#actorUnsubscribe = this.state.actors.subscribe(() => this.#scheduleRefresh());\n this.#agentUnsubscribe = this.state.agents.subscribeUi(() => this.#scheduleRefresh());\n this.#refresh();\n this.#schedulePoll();\n }\n\n stop(): void {\n this.#epoch++;\n this.#closeConversation?.();\n this.#closeConversation = undefined;\n this.#conversationView?.dispose();\n this.#conversationView = undefined;\n this.#conversationTui = undefined;\n this.#conversationOpen = false;\n this.#conversationState?.clear();\n this.#conversationState = undefined;\n if (this.#timer) clearTimeout(this.#timer);\n if (this.#scheduledRefresh) clearTimeout(this.#scheduledRefresh);\n this.#timer = undefined;\n this.#scheduledRefresh = undefined;\n this.#widget = undefined;\n this.#activityUnsubscribe?.();\n this.#activityUnsubscribe = undefined;\n this.#actorUnsubscribe?.();\n this.#actorUnsubscribe = undefined;\n this.#agentUnsubscribe?.();\n this.#agentUnsubscribe = undefined;\n if (this.#context?.mode === \"tui\") {\n this.#context.ui.setWidget(WIDGET_ID, undefined);\n }\n this.#context = undefined;\n this.#widgetTui = undefined;\n this.#dashboardTui = undefined;\n this.#widgetMounted = false;\n this.#events = [];\n this.#meshOffset = 0;\n this.#snapshot = emptySnapshot();\n this.#lastRefreshErrorAt = 0;\n this.#lastRefreshAt = 0;\n this.#dashboardOpen = false;\n this.#activityRevision = undefined;\n this.#activityRunsDetailed = true;\n this.#activityRuns = [];\n this.#transcripts.clear();\n for (const reader of this.#conversationReaders.values()) reader.clear();\n this.#conversationReaders.clear();\n }\n\n /** True while Fabric owns keyboard input, including asynchronous view setup. */\n get ownsInput(): boolean {\n return this.#dashboardOpen || this.#conversationOpen;\n }\n\n async openConversation(context: ExtensionContext, query?: string): Promise<void> {\n if (context.mode !== \"tui\") {\n context.ui.notify(\"Fabric conversations are available in TUI mode\", \"warning\");\n return;\n }\n if (!this.state.config.ui.enabled) {\n context.ui.notify(\"The Fabric UI is disabled by ui.enabled\", \"warning\");\n return;\n }\n if (this.#dashboardOpen) {\n context.ui.notify(\"Close the dashboard or press Shift+C on a participant to chat\", \"info\");\n return;\n }\n if (!this.#context) this.start(context);\n if (this.#conversationOpen && !this.#conversationView) return;\n const alreadyOpen = this.#conversationOpen;\n this.#conversationOpen = true;\n const epoch = this.#epoch;\n try {\n const [{ FabricConversationView, FabricConversationState }, { conversationTargets, resolveConversationTarget }, { readConversationAppearance }, { NativeConversationReader }] =\n await Promise.all([import(\"./conversation.js\"), import(\"./conversation-targets.js\"), import(\"./conversation-chrome.js\"), import(\"./conversation-native-reader.js\")]);\n if (epoch !== this.#epoch) return;\n this.#refresh();\n const initialTarget = query?.trim()\n ? resolveConversationTarget(conversationTargets(this.#snapshot), query.trim())\n : undefined;\n if (alreadyOpen) {\n if (initialTarget) this.#conversationView?.selectTarget(initialTarget.id);\n else this.#closeConversation?.();\n return;\n }\n if (initialTarget?.kind === \"main\") return;\n this.#conversationState ??= new FabricConversationState();\n const source = (id: string): NativeConversationSource => {\n const actor = this.#snapshot.actors.find((candidate) => candidate.id === id);\n if (actor) return { ...this.#actorTranscriptSource(actor), id, ...(actor.sessionFile ? { sessionFile: actor.sessionFile } : {}) };\n const agent = this.#snapshot.agents.find((candidate) => candidate.id === id);\n return agent ? this.#agentTranscriptSource(agent) : { id, status: \"unavailable\" };\n };\n const readerFor = (id: string): NativeConversationReader => {\n let reader = this.#conversationReaders.get(id);\n if (!reader) {\n reader = new NativeConversationReader();\n this.#conversationReaders.set(id, reader);\n }\n return reader;\n };\n const requireTarget = (id: string, action: \"steer\" | \"followUp\" | \"stop\"): void => {\n if (epoch !== this.#epoch || !this.#conversationOpen || !this.state.initialized) {\n throw new Error(\"This Fabric conversation is no longer attached\");\n }\n this.#refresh();\n const target = conversationTargets(this.#snapshot).find((candidate) => candidate.id === id);\n const allowed = action === \"stop\" ? target?.canStop\n : action === \"steer\" ? target?.canSteer : target?.canFollowUp;\n if (!target || target.kind === \"main\" || !allowed) {\n throw new Error(target?.readOnlyReason ?? `Participant ${id} cannot receive ${action}`);\n }\n };\n const { getAgentDir } = await import(\"@oh-my-pi/pi-utils\");\n const appearance = await readConversationAppearance(context.cwd, getAgentDir(), context.isProjectTrusted?.() ?? false);\n this.#schedulePoll(true);\n await context.ui.custom<void>((tui, theme, keybindings, done) => {\n if (epoch !== this.#epoch) {\n done(undefined);\n return { render: () => [], invalidate: () => {} };\n }\n this.#conversationTui = tui;\n this.#closeConversation = () => done(undefined);\n const view = new FabricConversationView(tui, theme, {\n targets: () => conversationTargets(this.#snapshot).map((target) => {\n const split = target.model?.indexOf(\"/\") ?? -1;\n if (split < 1 || !target.model) return target;\n const model = context.modelRegistry?.find?.(target.model.slice(0, split), target.model.slice(split + 1));\n return model && typeof model.contextWindow === \"number\" ? { ...target, contextWindow: model.contextWindow } : target;\n }),\n appearance,\n ...(initialTarget ? { initialTargetId: initialTarget.id } : {}),\n state: this.#conversationState!,\n keybindings,\n rendererOptions: this.conversationRenderers,\n queueEvents: this.state.omp?.events,\n ...(this.codePreviewSettings ? { codePreviewSettings: this.codePreviewSettings } : {}),\n transcript: (id, followLatest) => readerFor(id).read(source(id), followLatest),\n loadOlder: (id) => {\n const reader = readerFor(id);\n const before = reader.read(source(id), false);\n if (!before.hasMore) return false;\n const next = reader.loadOlder();\n return !!next && (next.revision !== before.revision || !next.hasMore);\n },\n loadNewer: (id) => {\n const reader = readerFor(id);\n const before = reader.read(source(id), false);\n const next = reader.loadNewer();\n return !!next && next.revision !== before.revision;\n },\n loadLatest: (id) => {\n const reader = readerFor(id);\n const before = reader.read(source(id), false);\n const next = reader.loadLatest();\n return !!next && next.revision !== before.revision;\n },\n send: async (id, message, delivery) => {\n requireTarget(id, delivery);\n const result = await this.state.queueUserMessage(id, message, delivery);\n if (epoch === this.#epoch) this.#refresh();\n return result;\n },\n stop: async (id) => {\n requireTarget(id, \"stop\");\n const result = await this.state.stopParticipant(id);\n if (epoch === this.#epoch) this.#refresh();\n return result;\n },\n close: () => done(undefined),\n });\n this.#conversationView = view;\n return view;\n }, {\n overlay: true,\n overlayOptions: { width: \"100%\", maxHeight: \"100%\", anchor: \"top-left\", margin: 0 },\n });\n } catch (error) {\n if (epoch === this.#epoch) context.ui.notify(safeText(error instanceof Error ? error.message : String(error)), \"error\");\n } finally {\n if (!alreadyOpen && epoch === this.#epoch) {\n this.#conversationView?.dispose();\n this.#conversationView = undefined;\n this.#conversationTui = undefined;\n this.#closeConversation = undefined;\n this.#conversationOpen = false;\n this.#schedulePoll(true);\n }\n }\n }\n\n async openDashboard(context: ExtensionContext): Promise<void> {\n if (this.ownsInput) return;\n if (context.mode !== \"tui\") {\n context.ui.notify(\"The Fabric dashboard is available in TUI mode\", \"warning\");\n return;\n }\n if (!this.state.config.ui.enabled) {\n context.ui.notify(\"The Fabric UI is disabled by ui.enabled\", \"warning\");\n return;\n }\n if (!this.#context) this.start(context);\n // Set after start(): it calls stop(), which clears this flag. The flag\n // must be true before this refresh so the first dashboard frame renders\n // from full activity runs rather than stripped summaries.\n this.#dashboardOpen = true;\n this.#refresh();\n const [{ FabricDashboard }, { buildClaudeModelSource, buildModelSource }] =\n await Promise.all([import(\"./dashboard.js\"), import(\"./model-picker.js\")]);\n const { getAgentDir } = await import(\"@oh-my-pi/pi-utils\");\n const modelSource = buildModelSource(context.modelRegistry, getAgentDir());\n let claudeModelSource: ModelSource | undefined;\n if (this.#snapshot.actors.some((actor) => actor.runner === \"claude\")) {\n try {\n claudeModelSource = buildClaudeModelSource(await this.state.agents.claudeModels());\n } catch (error) {\n context.ui.notify(\n `Claude model discovery failed: ${error instanceof Error ? error.message : String(error)}`,\n \"warning\",\n );\n }\n }\n const reportUpdate = (message: string, update: Promise<unknown>): void => {\n void update\n .then(() => {\n context.ui.notify(message, \"info\");\n this.#refresh();\n })\n .catch((error) =>\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\"),\n );\n };\n const onTargetMessage = (\n target: FabricDashboardMessageTarget,\n message: string,\n delivery: \"steer\" | \"followUp\",\n ): void => {\n const action =\n target.kind === \"actor\"\n ? \"Message queued for actor\"\n : delivery === \"steer\"\n ? `Steer queued for ${target.name}`\n : `Follow-up queued for ${target.name}`;\n reportUpdate(\n action,\n this.state.queueUserMessage(target.id, message, delivery),\n );\n };\n const onAgentStop = (agentId: string): void => {\n reportUpdate(\"Agent stopped\", this.state.stopParticipant(agentId));\n };\n const onActorModel = (\n actorId: string,\n model: string | undefined,\n scope: FabricActorBindingScope,\n ): void => {\n reportUpdate(\n scope === \"project\" ? \"Actor project model pinned\" : \"Actor session model updated\",\n this.state.actors.setModel(actorId, model, scope),\n );\n };\n const onActorThinking = (\n actorId: string,\n thinking: FabricThinking | undefined,\n scope: FabricActorBindingScope,\n ): void => {\n reportUpdate(\n scope === \"project\"\n ? \"Actor project thinking pinned\"\n : \"Actor session thinking updated\",\n this.state.actors.setThinking(actorId, thinking, scope),\n );\n };\n const onActorEvents = (actorId: string, events: FabricActorHostEvent[]): void => {\n reportUpdate(\"Actor event subscriptions updated\", this.state.actors.setEvents(actorId, events));\n };\n const onActorDeliveryPolicy = (\n actorId: string,\n delivery: FabricActorDelivery,\n triggerTurn: boolean,\n ): void => {\n reportUpdate(\n \"Actor delivery policy updated\",\n this.state.actors.setDeliveryPolicy(actorId, delivery, triggerTurn),\n );\n };\n const onGlobalDeliveryPolicy = (\n actorId: string,\n delivery: FabricActorDelivery,\n triggerTurn: boolean,\n ): void => {\n try {\n this.state.globalActors.update(actorId, { delivery, triggerTurn });\n context.ui.notify(\"Global actor delivery policy updated\", \"info\");\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n const onActorTools = (actorId: string, tools: string[]): void => {\n reportUpdate(\"Actor tools updated\", this.state.actors.setTools(actorId, tools));\n };\n const onClearMessages = (actorId: string): void => {\n reportUpdate(\"Actor mailbox cleared\", this.state.actors.clearMessages(actorId));\n };\n const onActorInstructions = (actorId: string, instructions: string): void => {\n reportUpdate(\"Actor instructions updated\", this.state.actors.setInstructions(actorId, instructions));\n };\n const onGlobalInstructions = (globalActorId: string, instructions: string): void => {\n try {\n this.state.globalActors.update(globalActorId, { instructions });\n context.ui.notify(\"Global actor instructions updated\", \"info\");\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n const onImportActor = (globalActorId: string): void => {\n const def = this.state.globalActors.resolve(globalActorId);\n if (!def) return;\n this.state.actors\n .create(this.state.globalActors.toRequest(def))\n .then((actor) => {\n context.ui.notify(`Imported global actor \"${def.name}\" as ${actor.name}`, \"info\");\n this.#refresh();\n })\n .catch((error) =>\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\"),\n );\n };\n const onExportActor = (actorId: string): void => {\n try {\n const def = this.state.actors.definition(actorId);\n const template = this.state.globalActors.create(def);\n context.ui.notify(`Exported \"${template.name}\" to global actors`, \"info\");\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n const onRemoveGlobalActor = (globalActorId: string): void => {\n try {\n const result = this.state.globalActors.remove(globalActorId);\n context.ui.notify(\n result.removed ? \"Removed global actor template\" : \"Global actor not found\",\n result.removed ? \"info\" : \"warning\",\n );\n this.#refresh();\n } catch (error) {\n context.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n }\n };\n this.#schedulePoll(true);\n let conversationTarget: string | undefined;\n const epoch = this.#epoch;\n try {\n await context.ui.custom<void>(\n (tui, theme, keybindings, done) => {\n this.#dashboardTui = tui;\n return new FabricDashboard(tui, theme, () => this.#snapshot, () => done(undefined), {\n modelSource,\n keybindings,\n ...(this.codePreviewSettings\n ? { codePreviewSettings: this.codePreviewSettings }\n : {}),\n ...(claudeModelSource ? { claudeModelSource } : {}),\n onTargetMessage,\n onAgentStop,\n onConversation: (id) => {\n conversationTarget = id;\n done(undefined);\n },\n agentTranscript: (agent, followLatest) =>\n this.#transcripts.read(this.#agentTranscriptSource(agent), followLatest),\n actorTranscript: (actor, followLatest) =>\n this.#transcripts.read(this.#actorTranscriptSource(actor), followLatest),\n loadOlderTranscript: (target) =>\n this.#transcripts.loadOlder(this.#transcriptSource(target)),\n loadNewerTranscript: (target) =>\n this.#transcripts.loadNewer(this.#transcriptSource(target)),\n loadLatestTranscript: (target) =>\n this.#transcripts.loadLatest(this.#transcriptSource(target)),\n onActorModel,\n onActorThinking,\n onActorEvents,\n onActorDeliveryPolicy,\n onGlobalDeliveryPolicy,\n onActorTools,\n actorDefaultTools: this.state.config.agents?.defaultTools ?? [],\n onClearMessages,\n onActorInstructions,\n onGlobalInstructions,\n onImportActor,\n onExportActor,\n onRemoveGlobalActor,\n });\n },\n {\n overlay: true,\n overlayOptions: {\n width: \"94%\",\n minWidth: 40,\n maxHeight: \"90%\",\n anchor: \"center\",\n margin: 1,\n },\n },\n );\n } finally {\n if (epoch === this.#epoch) {\n this.#dashboardOpen = false;\n this.#dashboardTui = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }\n }\n if (conversationTarget && epoch === this.#epoch) {\n await this.openConversation(context, conversationTarget);\n }\n }\n\n snapshot(): FabricDashboardSnapshot {\n return structuredClone(this.#snapshot);\n }\n\n #schedulePoll(reset = false): void {\n if (reset && this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n if (this.#timer || !this.#context) return;\n const active =\n this.#snapshot.runs.some((run) => run.status === \"running\") ||\n this.#snapshot.peers.length > 0 ||\n this.#snapshot.agents.some((agent) => isActiveStatus(agent.status)) ||\n this.#snapshot.actors.some(\n (actor) =>\n isActiveStatus(actor.status) ||\n Boolean(actor.worker && isActiveStatus(actor.worker.status)),\n );\n if (!this.ownsInput && !active) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n this.#refresh();\n this.#schedulePoll();\n }, this.state.config.ui.refreshMs);\n this.#timer.unref();\n }\n\n #scheduleRefresh(): void {\n if (this.#scheduledRefresh || !this.#context) return;\n const elapsed = performance.now() - this.#lastRefreshAt;\n const delay = Math.max(\n 0,\n Math.min(ACTIVITY_REFRESH_MS, this.state.config.ui.refreshMs) - elapsed,\n );\n this.#scheduledRefresh = setTimeout(() => {\n this.#scheduledRefresh = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }, delay);\n this.#scheduledRefresh.unref();\n }\n\n #agentTranscriptSource(agent: FabricUiAgent): FabricTranscriptSource {\n return { id: agent.id, status: agent.status, ...(agent.logFile ? { logFile: agent.logFile } : {}) };\n }\n\n #actorTranscriptSource(actor: FabricUiActor): FabricTranscriptSource {\n if (actor.worker?.logFile && isActiveStatus(actor.worker.status)) {\n return {\n id: `${actor.id}:${actor.worker.id}`,\n status: actor.worker.status,\n logFile: actor.worker.logFile,\n };\n }\n const retained = actor.lastRunId && actor.logDir\n ? path.join(actor.logDir, actor.lastRunId, \"events.jsonl\")\n : undefined;\n if (retained) return { id: actor.id, status: actor.status, logFile: retained };\n if (actor.sessionFile) {\n return { id: actor.id, status: actor.status, logFile: actor.sessionFile };\n }\n return { id: actor.id, status: actor.status };\n }\n\n #transcriptSource(target: FabricUiAgent | FabricUiActor): FabricTranscriptSource {\n return \"recentMessages\" in target\n ? this.#actorTranscriptSource(target)\n : this.#agentTranscriptSource(target);\n }\n\n #refresh(): void {\n this.#lastRefreshAt = performance.now();\n const context = this.#context;\n if (!context || !this.state.initialized) return;\n try {\n this.#pollMesh();\n const revision =\n typeof this.state.activity.revision === \"function\"\n ? this.state.activity.revision()\n : undefined;\n const detailed = this.#dashboardOpen;\n if (\n revision === undefined ||\n revision !== this.#activityRevision ||\n detailed !== this.#activityRunsDetailed\n ) {\n this.#activityRuns =\n detailed || typeof this.state.activity.runSummaries !== \"function\"\n ? this.state.activity.runs()\n : this.state.activity.runSummaries();\n this.#activityRevision = revision;\n this.#activityRunsDetailed = detailed;\n }\n this.#snapshot = createDashboardSnapshot(\n this.state,\n this.#events,\n context,\n this.#activityRuns,\n );\n this.#renderWidget(context);\n if (this.#conversationTui) this.#conversationTui.requestRender();\n if (this.#dashboardTui) this.#dashboardTui.requestRender();\n else if (this.#widgetTui && this.#widget?.hasChanged()) this.#widgetTui.requestRender();\n } catch (error) {\n const now = Date.now();\n if (now - this.#lastRefreshErrorAt >= 10_000) {\n this.#lastRefreshErrorAt = now;\n const message = error instanceof Error ? error.message : String(error);\n context.ui.notify(`Fabric dashboard refresh failed: ${message}`, \"warning\");\n }\n }\n }\n\n #pollMesh(): void {\n if (!this.state.config.mesh.enabled) return;\n const result = this.state.mesh.tail(this.#meshOffset, this.state.config.ui.eventHistory);\n this.#meshOffset = result.nextOffset;\n if (result.events.length === 0) return;\n this.#events.push(...result.events);\n const limit = this.state.config.ui.eventHistory;\n if (this.#events.length > limit) this.#events.splice(0, this.#events.length - limit);\n }\n\n #renderWidget(context: ExtensionContext): void {\n const config = this.state.config.ui;\n const shouldShow =\n context.mode === \"tui\" &&\n shouldShowFabricWidget(this.#snapshot, config.widget);\n if (shouldShow) {\n if (this.#widgetMounted) return;\n this.#widgetMounted = true;\n context.ui.setWidget(\n WIDGET_ID,\n (tui, theme) => {\n this.#widgetTui = tui;\n this.#widget = new FabricWidget(theme, () => this.#snapshot, config.maxRows);\n return this.#widget;\n },\n { placement: \"aboveEditor\" },\n );\n return;\n }\n if (!this.#widgetMounted) return;\n context.ui.setWidget(WIDGET_ID, undefined);\n this.#widgetMounted = false;\n this.#widgetTui = undefined;\n this.#widget = undefined;\n }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricActivityRun } from \"../activity/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport type { MeshEvent, MeshStateEntry } from \"../mesh/store.js\";\nimport type { AgentHandleInfo, AgentRunRecord } from \"../agents/types.js\";\nimport { safeText } from \"./format.js\";\nimport {\n activeStatuses,\n orderAgentsByCreation,\n type FabricDashboardSnapshot,\n type FabricUiAgent,\n type FabricUiStateEntry,\n} from \"./types.js\";\n\nconst MAX_UI_AGENTS = 240;\n\nconst boundedUiAgents = (\n local: FabricUiAgent[],\n remote: FabricUiAgent[],\n): FabricUiAgent[] => {\n const selected = new Map<string, FabricUiAgent>();\n for (const agent of local) {\n if (activeStatuses.has(agent.status)) selected.set(agent.id, agent);\n }\n const addNewest = (agents: FabricUiAgent[]): void => {\n for (let index = agents.length - 1; index >= 0 && selected.size < MAX_UI_AGENTS; index--) {\n const agent = agents[index];\n if (agent) selected.set(agent.id, agent);\n }\n };\n addNewest(orderAgentsByCreation(local));\n addNewest(orderAgentsByCreation(remote));\n return orderAgentsByCreation([...selected.values()]);\n};\n\nconst isRunRecord = (\n value: AgentRunRecord | AgentHandleInfo,\n): value is AgentRunRecord => \"startedAt\" in value;\n\nconst numberFrom = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst stateEntry = (entry: MeshStateEntry): FabricUiStateEntry => {\n const value =\n typeof entry.value === \"object\" && entry.value !== null && !Array.isArray(entry.value)\n ? (entry.value as Record<string, unknown>)\n : undefined;\n const label = safeText(\n value?.title ?? value?.label ?? value?.name ?? value?.task ?? entry.key,\n ).slice(0, 160);\n const status = safeText(value?.status ?? value?.state ?? \"state\").toLowerCase() || \"state\";\n const owner = safeText(value?.owner ?? value?.claimedBy ?? value?.claimed_by);\n const detail = safeText(\n value?.current ?? value?.activity ?? value?.description ?? value?.summary,\n );\n return {\n key: entry.key,\n label: label || entry.key,\n status,\n value: entry.value,\n version: entry.version,\n updatedAt: entry.updatedAt,\n ...(owner ? { owner } : {}),\n ...(detail ? { detail: detail.slice(0, 500) } : {}),\n };\n};\n\nexport const createDashboardSnapshot = (\n state: FabricState,\n events: MeshEvent[],\n context?: ExtensionContext,\n activityRuns?: FabricActivityRun[],\n): FabricDashboardSnapshot => {\n const runs = activityRuns ?? state.activity.runs();\n const agentRecords =\n typeof state.agents.listForUi === \"function\"\n ? state.agents.listForUi()\n : state.agents.list();\n const agentLinks: Array<{ runId: string; call: FabricActivityRun[\"calls\"][number] }> = [];\n for (const run of runs) {\n for (const call of run.calls) {\n if (call.entityId) agentLinks.push({ runId: run.id, call });\n }\n }\n agentLinks.sort((left, right) => {\n const leftLaunch = left.call.ref === \"agents.spawn\" || left.call.ref === \"agents.run\";\n const rightLaunch = right.call.ref === \"agents.spawn\" || right.call.ref === \"agents.run\";\n if (leftLaunch !== rightLaunch) return leftLaunch ? -1 : 1;\n return left.call.startedAt - right.call.startedAt;\n });\n const agentFromRecord = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): FabricUiAgent => {\n const linked = parentId\n ? undefined\n : agentLinks.find(\n ({ call }) =>\n call.entityId &&\n (record.id.startsWith(call.entityId) || call.entityId.startsWith(record.id)),\n );\n const base: FabricUiAgent = {\n id: record.id,\n name: record.name,\n status: record.status,\n runner: record.runner,\n transport: record.transport,\n cwd: record.cwd,\n ...(!isRunRecord(record) && linked ? { startedAt: linked.call.startedAt } : {}),\n ...(record.model ? { model: record.model } : {}),\n ...(record.thinking ? { thinking: record.thinking } : {}),\n ...(record.attachCommand ? { attachCommand: record.attachCommand } : {}),\n ...(isRunRecord(record) && record.logFile ? { logFile: record.logFile } : {}),\n ...(record.branch ? { branch: record.branch } : {}),\n ...(record.worktree ? { worktree: record.worktree } : {}),\n ...(record.actorId ? { actorId: record.actorId } : {}),\n ...(record.actorName ? { actorName: record.actorName } : {}),\n ...(parentId ? { parentId } : {}),\n ...(nestingDepth > 0 ? { nestingDepth } : {}),\n ...(linked ? { runId: linked.runId } : parent?.runId ? { runId: parent.runId } : {}),\n ...(linked?.call.phaseId\n ? { phaseId: linked.call.phaseId }\n : parent?.phaseId\n ? { phaseId: parent.phaseId }\n : {}),\n };\n if (!isRunRecord(record)) return base;\n return {\n ...base,\n task: record.task,\n startedAt: record.startedAt,\n updatedAt: record.updatedAt,\n ...(record.finishedAt !== undefined ? { finishedAt: record.finishedAt } : {}),\n ...(record.currentTool ? { currentTool: record.currentTool } : {}),\n turns: record.turns,\n toolCalls: record.toolCalls,\n usage: { ...record.usage },\n ...(record.text ? { text: record.text } : {}),\n ...(record.value !== undefined ? { value: structuredClone(record.value) } : {}),\n ...(record.error ? { error: record.error } : {}),\n };\n };\n const allAgents: FabricUiAgent[] = [];\n const appendAgent = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): void => {\n const agent = agentFromRecord(record, nestingDepth, parentId, parent);\n allAgents.push(agent);\n if (!isRunRecord(record)) return;\n for (const nested of record.nestedAgents ?? []) {\n appendAgent(nested, nestingDepth + 1, record.id, agent);\n }\n };\n for (const record of agentRecords) appendAgent(record, 0);\n\n const participants =\n typeof state.participantInfos === \"function\"\n ? state.participantInfos({ scope: \"project\" })\n : [];\n const participantById = new Map(participants.map((participant) => [participant.id, participant]));\n const actors = state.actors\n .list()\n .map((actor) => {\n const participant = participantById.get(actor.id);\n const worker = allAgents\n .filter((agent) => agent.actorId === actor.id)\n .sort((left, right) => {\n const active =\n Number(activeStatuses.has(right.status)) -\n Number(activeStatuses.has(left.status));\n const recency =\n (numberFrom(right.updatedAt) ?? numberFrom(right.startedAt) ?? 0) -\n (numberFrom(left.updatedAt) ?? numberFrom(left.startedAt) ?? 0);\n return active || recency;\n })[0];\n return {\n ...actor,\n instructions: state.actors.instructions(actor.id),\n recentMessages: state.actors.messages(actor.id, 12),\n ...(participant\n ? { ownerHostId: participant.ownerHostId, local: participant.local }\n : {}),\n ...(worker ? { worker } : {}),\n };\n });\n const localAgents = allAgents\n .filter((agent) => !agent.actorId)\n .map((agent) => {\n const participant = participantById.get(agent.id);\n return participant\n ? {\n ...agent,\n ...(agent.parentId ? {} : participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }\n : agent;\n });\n const localAgentIds = new Set(localAgents.map((agent) => agent.id));\n const remoteAgents: FabricUiAgent[] = participants\n .filter((participant) => participant.kind === \"agent\" && !localAgentIds.has(participant.id))\n .map((participant) => ({\n id: participant.id,\n name: participant.name,\n status: participant.status,\n runner: participant.runner,\n transport: participant.transport,\n cwd: participant.cwd ?? \"\",\n ...(participant.model ? { model: participant.model } : {}),\n ...(participant.thinking ? { thinking: participant.thinking } : {}),\n ...(participant.currentTool ? { currentTool: participant.currentTool } : {}),\n startedAt: participant.startedAt,\n updatedAt: participant.updatedAt,\n ...(participant.finishedAt !== undefined ? { finishedAt: participant.finishedAt } : {}),\n ...(participant.turns !== undefined ? { turns: participant.turns } : {}),\n ...(participant.toolCalls !== undefined ? { toolCalls: participant.toolCalls } : {}),\n ...(participant.usage ? { usage: { ...participant.usage } } : {}),\n ...(participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }));\n const agents = [...localAgents, ...remoteAgents];\n const visibleAgents = boundedUiAgents(localAgents, remoteAgents);\n const activeRunIds = new Set(\n agents\n .filter((agent) => agent.runId && activeStatuses.has(agent.status))\n .map((agent) => agent.runId as string),\n );\n const orderedRuns = runs\n .map((run, index) => ({ run, index }))\n .sort((left, right) => {\n const leftActive = activeRunIds.has(left.run.id) ? 1 : 0;\n const rightActive = activeRunIds.has(right.run.id) ? 1 : 0;\n return rightActive - leftActive || left.index - right.index;\n })\n .map(({ run }) => run);\n\n const meshEntries = state.config.mesh.enabled ? state.mesh.list(\"\", 200) : [];\n const stateEntries = meshEntries\n .filter(\n (entry) =>\n !entry.key.startsWith(\"actors/\") &&\n !entry.key.startsWith(\"sessions/\") &&\n !entry.key.startsWith(\"topology/\"),\n )\n .map(stateEntry)\n .sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n })\n .slice(0, 120);\n\n return {\n now: Date.now(),\n runs: orderedRuns,\n main: state.mainAgentInfo(context),\n peers: typeof state.peerInfos === \"function\" ? state.peerInfos() : [],\n participants,\n widgetDismissedAt: state.widgetDismissedAt,\n globalActors: state.globalActors.list(),\n agents: visibleAgents,\n componentGraph: typeof state.componentGraph === \"function\"\n ? state.componentGraph()\n : { components: [], edges: [], cycles: [] },\n actors: actors.sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n }),\n state: stateEntries,\n events: events.map((event) => structuredClone(event)),\n };\n};\n", "import type { Component } from \"@oh-my-pi/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@oh-my-pi/pi-tui\";\nimport type { Theme } from \"@oh-my-pi/pi-coding-agent\";\nimport type { FabricUiWidgetMode } from \"../config.js\";\nimport { spinnerFrame } from \"./spinner.js\";\nimport { FABRIC_CONVERSATION_HINT } from \"./conversation-shortcut.js\";\nimport type {\n FabricActivityRun,\n FabricActivityStatus,\n} from \"../activity/types.js\";\nimport { formatCost, formatDuration, formatTokens, safeText } from \"./format.js\";\nimport {\n isActiveStatus,\n orderAgentsByCreation,\n type FabricDashboardSnapshot,\n type FabricUiAgent,\n} from \"./types.js\";\n\nconst statusGlyph = (status: string): string => {\n if (status === \"completed\" || status === \"done\") return \"\u2713\";\n if (status === \"failed\" || status === \"timed_out\") return \"\u2717\";\n if (status === \"blocked\") return \"!\";\n if (status === \"stopped\" || status === \"cancelled\") return \"\u25A0\";\n if (status === \"queued\" || status === \"pending\" || status === \"ready\") return \"\u25CB\";\n if (status === \"idle\" || status === \"state\") return \"\u00B7\";\n return spinnerFrame();\n};\n\nconst colorStatus = (theme: Theme, status: string, value: string): string => {\n if (status === \"completed\" || status === \"done\") return theme.fg(\"success\", value);\n if (status === \"failed\" || status === \"timed_out\") return theme.fg(\"error\", value);\n if (status === \"blocked\") return theme.fg(\"warning\", value);\n if (status === \"running\" || status === \"in_progress\") return theme.fg(\"accent\", value);\n return theme.fg(\"dim\", value);\n};\n\nconst phaseProgress = (\n run: FabricActivityRun,\n phaseId: string,\n): { completed: number; total: number } => {\n const phase = run.phases.find((candidate) => candidate.id === phaseId);\n const statuses: FabricActivityStatus[] = [\n ...run.calls.filter((call) => call.phaseId === phaseId).map((call) => call.status),\n ...run.items.filter((item) => item.phaseId === phaseId).map((item) => item.status),\n ];\n const completed = statuses.filter((status) => status === \"completed\").length;\n return { completed, total: Math.max(phase?.total ?? 0, statuses.length) };\n};\n\nconst totalTokens = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce(\n (sum, agent) => sum + (agent.usage ? agent.usage.input + agent.usage.output : 0),\n 0,\n );\n\nconst totalCost = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce((sum, agent) => sum + (agent.usage?.cost ?? 0), 0);\n\nconst agentLines = (\n theme: Theme,\n agent: FabricUiAgent,\n now: number,\n): string[] => {\n const status = colorStatus(theme, agent.status, statusGlyph(agent.status));\n const activity =\n agent.currentTool ??\n (agent.error\n ? `error: ${truncateToWidth(safeText(agent.error), 48)}`\n : agent.text && !isActiveStatus(agent.status)\n ? `result: ${truncateToWidth(safeText(agent.text), 48)}`\n : agent.status === \"running\"\n ? \"thinking\"\n : agent.status);\n const metrics = [\n agent.toolCalls !== undefined ? `${agent.toolCalls} calls` : undefined,\n agent.usage ? `${formatTokens(agent.usage.input + agent.usage.output)} tok` : undefined,\n agent.startedAt\n ? formatDuration((agent.finishedAt ?? now) - agent.startedAt)\n : undefined,\n ].filter((value): value is string => Boolean(value));\n const indent = \" \".repeat(1 + Math.max(0, agent.nestingDepth ?? 0));\n return [\n `${indent}${status} ${theme.fg(\"muted\", safeText(agent.name))} ${theme.fg(\"muted\", safeText(activity))}${\n metrics.length > 0 ? theme.fg(\"dim\", ` \u00B7 ${metrics.join(\" \u00B7 \")}`) : \"\"\n }`,\n ];\n};\n\nexport const shouldShowFabricWidget = (\n snapshot: FabricDashboardSnapshot,\n mode: FabricUiWidgetMode,\n): boolean => {\n if (mode === \"hidden\") return false;\n if (mode === \"always\") return true;\n if (snapshot.agents.some((agent) => isActiveStatus(agent.status))) return true;\n if (snapshot.actors.some((actor) => actor.status !== \"stopped\")) return true;\n const run = snapshot.runs[0];\n if (!run) return false;\n if (run.status === \"running\") return true;\n const finishedAt = run.finishedAt ?? run.updatedAt;\n return finishedAt > (snapshot.widgetDismissedAt ?? 0);\n};\n\nexport class FabricWidget implements Component {\n constructor(\n readonly theme: Theme,\n readonly snapshot: () => FabricDashboardSnapshot,\n readonly maxRows: number,\n ) {}\n\n #lastWidth: number | undefined;\n #lastSnapshot: FabricDashboardSnapshot | undefined;\n #lastLines: string[] | undefined;\n #pending:\n | { width: number; snapshot: FabricDashboardSnapshot; lines: string[] }\n | undefined;\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const snapshot = this.snapshot();\n const lines =\n this.#pending?.width === width && this.#pending.snapshot === snapshot\n ? this.#pending.lines\n : this.#lastWidth === width &&\n this.#lastSnapshot === snapshot &&\n this.#lastLines\n ? this.#lastLines\n : this.#renderLines(snapshot, width);\n this.#pending = undefined;\n this.#lastWidth = width;\n this.#lastSnapshot = snapshot;\n this.#lastLines = lines;\n return lines;\n }\n\n hasChanged(): boolean {\n if (this.#lastWidth === undefined || this.#lastLines === undefined) return true;\n const snapshot = this.snapshot();\n const lines = this.#renderLines(snapshot, this.#lastWidth);\n this.#pending = { width: this.#lastWidth, snapshot, lines };\n return (\n lines.length !== this.#lastLines.length ||\n lines.some((line, index) => line !== this.#lastLines?.[index])\n );\n }\n\n invalidate(): void {\n this.#pending = undefined;\n this.#lastWidth = undefined;\n this.#lastSnapshot = undefined;\n this.#lastLines = undefined;\n }\n\n #renderLines(snapshot: FabricDashboardSnapshot, width: number): string[] {\n return this.#boundContent(this.#buildContent(snapshot), width);\n }\n\n #buildContent(snapshot: FabricDashboardSnapshot): string[] {\n const candidateRun = snapshot.runs[0];\n const candidateFinishedAt = candidateRun?.finishedAt ?? candidateRun?.updatedAt ?? 0;\n const run =\n candidateRun &&\n (candidateRun.status === \"running\" ||\n candidateFinishedAt > (snapshot.widgetDismissedAt ?? 0))\n ? candidateRun\n : undefined;\n const orderedAgents = orderAgentsByCreation(snapshot.agents);\n const activeAgents = orderedAgents.filter((agent) => isActiveStatus(agent.status));\n const activeAgentIds = new Set(activeAgents.map((agent) => agent.id));\n const terminalAgents = run\n ? orderedAgents.filter(\n (agent) =>\n agent.runId === run.id &&\n !activeAgentIds.has(agent.id) &&\n !isActiveStatus(agent.status),\n )\n : [];\n const visibleActors = snapshot.actors.filter((actor) => actor.status !== \"stopped\");\n const activeActorWorkers = visibleActors\n .filter((actor) => actor.worker && isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const terminalActorWorkers = visibleActors\n .filter((actor) => actor.worker && !isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const nestedCalls =\n run?.calls.filter((call) => call.kind !== \"agent\" && call.kind !== \"actor\") ?? [];\n const title = run?.name ?? \"Fabric session\";\n const headerStatus =\n run?.status ??\n (activeAgents.length > 0 || activeActorWorkers.length > 0 ? \"running\" : \"idle\");\n const parts: string[] = [];\n\n const callTotal = nestedCalls.length;\n if (callTotal > 1) {\n const callDone = nestedCalls.filter(\n (call) => call.status === \"completed\" || call.status === \"failed\",\n ).length;\n parts.push(`${callDone}/${callTotal} calls`);\n }\n if (run?.currentPhaseId) {\n const phaseIndex = run.phases.findIndex((phase) => phase.id === run.currentPhaseId);\n const phase = run.phases[phaseIndex];\n if (phase) {\n const progress = phaseProgress(run, phase.id);\n parts.push(\n `${phaseIndex + 1}/${run.phases.length} ${safeText(phase.name)}${\n progress.total > 0 ? ` ${progress.completed}/${progress.total}` : \"\"\n }`,\n );\n }\n }\n if (activeAgents.length > 0) parts.push(`${activeAgents.length} running`);\n if (visibleActors.length > 0) parts.push(`${visibleActors.length} actor${visibleActors.length === 1 ? \"\" : \"s\"}`);\n const tokens = totalTokens(snapshot, run);\n if (tokens > 0) parts.push(`${formatTokens(tokens)} tok`);\n const cost = totalCost(snapshot, run);\n if (cost > 0) parts.push(formatCost(cost));\n if (run) parts.push(formatDuration((run.finishedAt ?? snapshot.now) - run.startedAt));\n\n const glyph = colorStatus(this.theme, headerStatus, statusGlyph(headerStatus));\n const header = `${glyph} ${this.theme.fg(\"accent\", \"Fabric\")} ${this.theme.fg(\n \"muted\",\n safeText(title),\n )}${parts.length > 0 ? this.theme.fg(\"dim\", ` \u00B7 ${parts.join(\" \u00B7 \")}`) : \"\"}`;\n const hasActiveConversations = activeAgents.some((agent) => !agent.stale) ||\n activeActorWorkers.length > 0 || visibleActors.some((actor) => isActiveStatus(actor.status));\n const lines = [hasActiveConversations ? `${header} \u00B7 ${this.theme.fg(\"dim\", FABRIC_CONVERSATION_HINT)}` : header];\n\n lines.push(\n ...activeAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n ...activeActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n );\n return lines;\n }\n\n #boundContent(content: string[], width: number): string[] {\n const bounded = content.slice(0, Math.max(1, this.maxRows));\n if (content.length > bounded.length && bounded.length > 0) {\n const marker = this.theme.fg(\"dim\", `+${content.length - bounded.length}`);\n const available = Math.max(0, width - visibleWidth(marker) - 1);\n const last = truncateToWidth(bounded[bounded.length - 1] ?? \"\", available, \"\");\n bounded[bounded.length - 1] = `${last} ${marker}`;\n }\n return bounded.map((line) => truncateToWidth(line, width));\n }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\n\ninterface EscapeHaltOptions {\n enabled: () => boolean;\n ownsInput: () => boolean;\n halted: () => boolean;\n halt: () => number;\n}\n\n/** Observe native Escape without treating navigation inside Fabric UI as an interrupt. */\nexport function installFabricEscapeHalt(\n context: ExtensionContext,\n options: EscapeHaltOptions,\n): () => void {\n if (context.mode !== \"tui\" || typeof context.ui.onTerminalInput !== \"function\") return () => {};\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cancel = (): void => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n const unsubscribe = context.ui.onTerminalInput((data) => {\n cancel();\n // Check before the overlay handles Escape and closes: a delayed check alone\n // would mistake that navigation key for a native Main interrupt.\n if (data !== \"\\x1b\" || options.ownsInput() || !options.enabled()) return undefined;\n timer = setTimeout(() => {\n timer = undefined;\n if (!options.enabled() || options.ownsInput()) return;\n let count: number;\n try {\n if (options.halted()) return;\n count = options.halt();\n } catch {\n return;\n }\n if (count > 0) {\n context.ui.notify(\n `Fabric: halted ${count} actor${count === 1 ? \"\" : \"s\"} (Esc) \u00B7 resumes on next message`,\n \"warning\",\n );\n }\n }, 60);\n timer.unref?.();\n return undefined;\n });\n return () => {\n cancel();\n unsubscribe();\n };\n}\n", "/** Tracks rendered fabric_exec cards so a display preference switch redraws the current transcript. */\nexport class FabricToolDisplayController {\n readonly #invalidators = new Map<string, {\n call?: () => void;\n result?: () => void;\n }>();\n #pendingRefresh: Array<() => void> = [];\n #refreshDrainScheduled = false;\n\n observe(\n toolCallId: string,\n kind: \"call\" | \"result\",\n invalidate: () => void,\n ): void {\n const invalidators = this.#invalidators.get(toolCallId) ?? {};\n invalidators[kind] = invalidate;\n this.#invalidators.set(toolCallId, invalidators);\n }\n\n refresh(): void {\n for (const { call, result } of this.#invalidators.values()) {\n // A card's call and result invalidators resolve to the same host\n // component: its invalidate() re-renders both renderers together, so one\n // call covers the whole card and calling both would double the work.\n const invalidate = result ?? call;\n if (invalidate) this.#pendingRefresh.push(invalidate);\n }\n this.#scheduleRefreshDrain();\n }\n\n // Drain a few cards per event-loop turn. invalidate() synchronously runs the\n // card's full renderer pair (updateDisplay in OMP's ToolExecutionComponent),\n // so re-rendering a long transcript inside a single keypress froze the UI\n // until every card had been redrawn.\n #scheduleRefreshDrain(): void {\n if (this.#refreshDrainScheduled) return;\n this.#refreshDrainScheduled = true;\n setImmediate(() => {\n this.#refreshDrainScheduled = false;\n const batch = this.#pendingRefresh.splice(0, REFRESH_CARDS_PER_TICK);\n for (const invalidate of batch) {\n try {\n invalidate();\n } catch {\n // A transcript component may already have been disposed.\n }\n }\n if (this.#pendingRefresh.length > 0) this.#scheduleRefreshDrain();\n });\n }\n\n clear(): void {\n this.#pendingRefresh = [];\n this.#invalidators.clear();\n }\n}\n\n// Cards re-rendered per event-loop turn during refresh(): small enough that\n// one drain tick stays well inside a frame, large enough that realistic\n// transcripts finish repainting within a handful of turns.\nconst REFRESH_CARDS_PER_TICK = 3;\n", "import type { Usage } from \"@oh-my-pi/pi-ai\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n} from \"@oh-my-pi/pi-coding-agent\";\nimport { defaultCodePreviewSettings } from \"./ui/code-preview.js\";\nimport {\n type FabricToolShellDecorator,\n withCodePreviewShell,\n} from \"./ui/code-preview-shell.js\";\nimport { registerFabricActorHostEventObservers } from \"./actors/host-event-observer.js\";\nimport { CapturedToolCatalog } from \"./capture/catalog.js\";\nimport { installRegisteredToolCapture } from \"./capture/interceptor.js\";\nimport { registerFabricCommand } from \"./commands/fabric.js\";\nimport { resolveAgentDir } from \"./core/agent-dir.js\";\nimport {\n AUTO_APPLY_PROPOSAL_KINDS,\n compileEntropySurfaceAsync,\n compiledSurfaceEffectChanged,\n entropyRepairRows,\n entropyReviewKey,\n formatEntropyCompileNotice,\n formatEntropyReviewNotice,\n liveSurfaceSnapshot,\n loadCompiledSurfaceAsync,\n loadObservationPoolAsync,\n machineSessionFilesAsync,\n mergeObservationWindowAsync,\n poolToValueObservations,\n saveCompiledSurfaceAsync,\n saveObservationPoolAsync,\n sessionWindowEvidenceAsync,\n} from \"./entropy/index.js\";\nimport { setActiveCompiledSurface } from \"./entropy/active.js\";\nimport {\n filterPrewalkContinuationMessages,\n settleInPlacePrewalk,\n withTrajectoryRearmDirective,\n} from \"./prewalk/handoff.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport { autoArmFabricPrewalk } from \"./prewalk/arm.js\";\nimport { FabricSpeculationWarmup } from \"./speculation/warmup.js\";\nimport {\n DEFAULT_FABRIC_CONFIG,\n effectiveToolCaptureConfig,\n} from \"./config.js\";\nimport { registerCompactionHook } from \"./compaction/hook.js\";\nimport { LcmRuntime } from \"./compaction/lcm-runtime.js\";\nimport { canonicalProjectIdentity } from \"./storage/lcm-ledger.js\";\nimport { compactAtConfiguredThreshold } from \"./compaction/threshold.js\";\nimport {\n createToolOwnershipReassertion,\n FabricToolLifecycle,\n FabricToolOwnership,\n ownsFabricToolSource,\n} from \"./core/tool-ownership.js\";\nimport {\n expandSkillDirMarkersForRead,\n expandSkillDirMarkersInSkillBlock,\n} from \"./core/skill-dir.js\";\nimport { coreOverridePromptGuidance } from \"./core/core-override-guidance.js\";\nimport { OMP_CORE_TOOL_NAMES } from \"./core/omp-tools.js\";\nimport {\n fabricExecutionKernelGuidance,\n defaultFabricExecutionGuidance,\n fabricSchemaGuidance,\n extensionToolRosterGuidance,\n} from \"./core/system-guidance.js\";\nimport {\n FABRIC_EXECUTION_GUIDANCE_SLOT,\n resolveFabricModelGuidance,\n} from \"./components/model-guidance.js\";\nimport {\n activeSkills,\n listableSkills,\n restoreSkillsForFullCodePrompt,\n} from \"./core/skill-prompt.js\";\nimport {\n formatProxyContractReminder,\n PROXY_CONTRACT_CUSTOM_TYPE,\n ProxyContractLedger,\n proxyContractMentionsInSkills,\n rewritableHiddenCapturedToolNames,\n} from \"./core/proxy-contract.js\";\nimport {\n FabricDirectToolApproval,\n mergeFabricApprovalUsage,\n} from \"./core/direct-tool-approval.js\";\nimport { buildSkillReferenceGuidance } from \"./core/skill-references.js\";\nimport { createFabricExecTool } from \"./fabric-exec-tool.js\";\nimport { FabricState } from \"./fabric-state.js\";\nimport { classifyToolResult } from \"./repairs/classify.js\";\nimport { getActiveRepairCompiler } from \"./repairs/active.js\";\nimport { ompHostCompatibilityWarning } from \"./host-compatibility.js\";\nimport { scheduleFabricUpdateCheck } from \"./update/check.js\";\nimport {\n FABRIC_COMPONENT_REGISTER_EVENT,\n FABRIC_PROVIDER_REGISTER_EVENT,\n type FabricComponentRegistration,\n type FabricProviderRegistration,\n} from \"./protocol.js\";\nimport type { AgentToolResultMessage } from \"./agents/types.js\";\nimport { FabricUiController } from \"./ui/controller.js\";\nimport { installFabricEscapeHalt } from \"./ui/escape-halt.js\";\nimport { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { configureHighlighting } from \"./ui/highlight.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { truncateMiddle } from \"./util.js\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Absolute path to the Fabric skills bundled with this extension. Resolved\n// relative to the extension entry so it works both in development (src/) and\n// in an installed package (dist/). Contributed via resources_discover so child\n// OMP processes that load Fabric with -e (agents and actors) discover the\n// same fabric-exec / fabric-advisor / fabric-council skill references as the\n// main agent, which gets them through the package manifest.\nconst FABRIC_EXTENSION_ENTRY_PATH = path.resolve(fileURLToPath(import.meta.url));\nconst FABRIC_ENTRY_DIR = path.dirname(FABRIC_EXTENSION_ENTRY_PATH);\nconst FABRIC_RUNTIME_PATHS = {\n extension: FABRIC_EXTENSION_ENTRY_PATH,\n worker: path.join(FABRIC_ENTRY_DIR, \"worker.js\"),\n residentHost: path.join(FABRIC_ENTRY_DIR, \"residency\", \"launcher.js\"),\n skills: path.resolve(FABRIC_ENTRY_DIR, \"..\", \"skills\"),\n};\nconst FABRIC_SKILLS_DIR = FABRIC_RUNTIME_PATHS.skills;\n\nconst componentRegistrationFrom = (\n value: unknown,\n): FabricComponentRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricComponentRegistration>;\n const component = registration.component;\n if (\n registration.version !== 1 ||\n typeof component !== \"object\" ||\n component === null ||\n typeof component.name !== \"string\" ||\n typeof component.activate !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricComponentRegistration;\n};\n\nconst registrationFrom = (value: unknown): FabricProviderRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricProviderRegistration>;\n const provider = registration.provider;\n if (\n registration.version !== 1 ||\n typeof provider !== \"object\" ||\n provider === null ||\n typeof provider.name !== \"string\" ||\n typeof provider.description !== \"string\" ||\n typeof provider.list !== \"function\" ||\n typeof provider.describe !== \"function\" ||\n typeof provider.invoke !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricProviderRegistration;\n};\n\nconst SKILL_REFERENCE_CUSTOM_TYPE = \"omp-fabric-skill-reference\";\n\nexport default async function ompFabric(omp: ExtensionAPI): Promise<void> {\n const codePreviewSettings = defaultCodePreviewSettings();\n const decorateShell: FabricToolShellDecorator = withCodePreviewShell;\n let compatibilityWarningShown = false;\n let updateCheckStarted = false;\n configureHighlighting(\n codePreviewSettings.shikiTheme,\n codePreviewSettings.syntaxHighlighting,\n );\n const capturedTools = new CapturedToolCatalog();\n const proxyContract = new ProxyContractLedger();\n const state = new FabricState(omp, capturedTools, {\n paths: FABRIC_RUNTIME_PATHS,\n lcmContext: () => lcmRuntime?.memoryContext(),\n });\n const directToolApproval = new FabricDirectToolApproval(\n omp,\n () => state.config,\n state.sessionApprovals,\n );\n const pendingHandoffs = new Map<string, PendingFabricHandoff>();\n let lcmRuntime: LcmRuntime | undefined;\n let lcmCwd: string | undefined;\n let lcmProjectKey: string | undefined;\n const toolOwnership = new FabricToolOwnership(omp);\n const fabricUi = new FabricUiController(state, codePreviewSettings, {\n getToolDefinition: (name) => name === \"fabric_exec\" ? fabricTool : capturedTools.get(name)?.definition,\n getMessageRenderer: (type) => capturedTools.runner?.getMessageRenderer(type),\n });\n const toolDisplay = new FabricToolDisplayController();\n\n const capturePolicy = () => effectiveToolCaptureConfig(state.config);\n const fabricOwnsModelTools = (): boolean =>\n state.config.fullCodeMode || state.config.schema.mode === \"enforce\";\n const hiddenCapturedToolNames = (): Set<string> => {\n const policy = capturePolicy();\n const keep = new Set([...policy.keepVisible, ...policy.includeTools]);\n return new Set(\n capturedTools.list()\n .map((entry) => entry.name)\n .filter((name) => policy.hideFromModel && !keep.has(name) && !policy.excludeTools.includes(name)),\n );\n };\n const ownershipPolicy = () => {\n const policy = capturePolicy();\n return {\n fullCodeMode: state.config.fullCodeMode,\n schemaMode: state.config.schema.mode,\n includeTools: new Set(policy.includeTools),\n excludeTools: new Set(policy.excludeTools),\n };\n };\n const { reassert: reassertToolOwnership, schedule: scheduleOwnershipReassert } =\n createToolOwnershipReassertion({\n ready: () => state.cwd !== undefined,\n active: () => state.cwd !== undefined,\n hiddenNames: hiddenCapturedToolNames,\n apply: (hidden) => toolOwnership.apply(ownershipPolicy(), hidden),\n });\n\n const unsubscribeComponentRegistration = omp.events.on(\n FABRIC_COMPONENT_REGISTER_EVENT,\n (value: unknown) => {\n const registration = componentRegistrationFrom(value);\n if (!registration) throw new Error(\"Invalid OMP Fabric component registration\");\n state.registerExternalComponent(\n registration.component,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n const unsubscribeProviderRegistration = omp.events.on(\n FABRIC_PROVIDER_REGISTER_EVENT,\n (value: unknown) => {\n const registration = registrationFrom(value);\n if (!registration) throw new Error(\"Invalid OMP Fabric provider registration\");\n state.registerExternal(\n registration.provider,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n omp.on(\"resources_discover\", async () => {\n if (existsSync(FABRIC_SKILLS_DIR)) return { skillPaths: [FABRIC_SKILLS_DIR] };\n return {};\n });\n\n const fabricTool = createFabricExecTool(\n state,\n codePreviewSettings,\n pendingHandoffs,\n decorateShell,\n toolDisplay,\n );\n const refreshCodePreviewSettings = (): void => {\n Object.assign(codePreviewSettings, state.config.codePreview);\n configureHighlighting(\n codePreviewSettings.shikiTheme,\n codePreviewSettings.syntaxHighlighting,\n );\n };\n const fabricToolLifecycle = new FabricToolLifecycle(\n () => ownsFabricToolSource(omp.getAllTools(), FABRIC_EXTENSION_ENTRY_PATH),\n () => state.initialized ? state.execution.authorizer : undefined,\n () => state.initialized ? directToolApproval : undefined,\n );\n\n const inactiveCapturePolicy = {\n ...structuredClone(DEFAULT_FABRIC_CONFIG.capture),\n enabled: false,\n hideFromModel: false,\n };\n const toolCapture = await installRegisteredToolCapture({\n anchorDefinition: fabricTool,\n catalog: capturedTools,\n initialPolicy: inactiveCapturePolicy,\n onCatalogRefresh: () => {\n scheduleOwnershipReassert();\n },\n });\n omp.registerTool(fabricTool);\n const applyFabricMode = (): void => {\n capturedTools.markResumed();\n toolCapture.setPolicy(capturePolicy());\n omp.registerTool(fabricTool);\n toolOwnership.apply(ownershipPolicy(), hiddenCapturedToolNames());\n capturedTools.refresh();\n };\n const suspendToolCapture = (): void => {\n // Mark the suspension before the policy flip: setPolicy clears the\n // catalog, and the freeze must already be in effect when that clear\n // reaches derived-surface listeners.\n capturedTools.markSuspended();\n toolCapture.setPolicy(inactiveCapturePolicy);\n };\n\n // ESC stop-the-world: a lone Escape (debounced to ignore escape sequences\n // such as arrow keys) halts every persistent actor \u2014 aborting in-flight runs\n // and cancelling queued work \u2014 and arms a stop-the-world gate that freezes\n // host-event and mesh dispatch so the interrupted actors are not re-armed by\n // the interrupt's own turn_end / agent_end events. The gate lifts when the\n // user resumes by sending a new message (the \"input\" host event). Escape is\n // observed but not consumed, so OMP's native cancel-streaming still fires;\n // single ESC therefore stops the current turn and the advisor/supervisor\n // actors at once. Disabled when mesh/actors are off or ui.haltOnEscape is\n // false.\n let haltOnEscapeUnsubscribe: (() => void) | undefined;\n const uninstallHaltOnEscape = (): void => {\n haltOnEscapeUnsubscribe?.();\n haltOnEscapeUnsubscribe = undefined;\n };\n const installHaltOnEscape = (context: ExtensionContext): void => {\n uninstallHaltOnEscape();\n if (!state.config.ui.haltOnEscape || !state.config.mesh.enabled) return;\n haltOnEscapeUnsubscribe = installFabricEscapeHalt(context, {\n enabled: () => state.initialized && state.config.mesh.enabled && state.config.ui.haltOnEscape,\n ownsInput: () => fabricUi.ownsInput,\n halted: () => state.actors.halted,\n halt: () => state.actors.haltAll().halted,\n });\n };\n\n const refreshProxyLedger = (context: ExtensionContext): void => {\n proxyContract.restoreFromEntries(context.sessionManager?.getBranch?.() ?? []);\n };\n\n // alwaysRearm means always armed: every session opens with prewalk armed.\n // Config-health skips (no prewalk.model, gated modes) warn once per process\n // rather than on every session switch.\n let prewalkAutoArmNoticeShown = false;\n const autoArmPrewalk = async (context: ExtensionContext): Promise<void> => {\n const skipReason = await autoArmFabricPrewalk(state, context, omp);\n if (!skipReason || prewalkAutoArmNoticeShown || !context.hasUI) return;\n prewalkAutoArmNoticeShown = true;\n context.ui.notify(skipReason, \"warning\");\n };\n\n const cleanupActivationSideEffects = (): void => {\n uninstallHaltOnEscape();\n fabricUi.stop();\n };\n state.setActivationHook(async (context) => {\n refreshCodePreviewSettings();\n Object.assign(\n fabricTool,\n createFabricExecTool(state, codePreviewSettings, pendingHandoffs, decorateShell, toolDisplay),\n );\n await autoArmPrewalk(context);\n applyFabricMode();\n fabricUi.start(context);\n installHaltOnEscape(context);\n }, cleanupActivationSideEffects);\n\n // Continual entropy reduction runs off the interaction path. Session-tree\n // discovery and JSONL ingestion use async I/O, scoring yields in fixed trace\n // chunks, and durable stores acquire locks cooperatively. Turn hooks only\n // enqueue work; a pending turn coalesces to the newest context.\n let entropyEvidenceThisTurn = false;\n let entropyCompileInFlight: Promise<void> | undefined;\n let entropyCompilePending: EntropyCompileRequest | undefined;\n let entropyLastReview = \"\";\n let entropyLifecycleEpoch = 0;\n\n interface EntropyCompileRequest {\n context: ExtensionContext;\n delayMs: number;\n epoch: number;\n }\n\n const compileEntropyNow = async (\n context: ExtensionContext,\n epoch: number,\n ): Promise<void> => {\n const current = (): boolean =>\n epoch === entropyLifecycleEpoch && state.initialized && state.config.entropy.compile;\n if (!current()) return;\n const startedAt = performance.now();\n const agentDir = resolveAgentDir();\n const cwd = state.cwd ?? context.cwd;\n const repairs = entropyRepairRows(state.repairs.repairs);\n const [files, loaded, poolLoaded, snapshot] = await Promise.all([\n machineSessionFilesAsync(agentDir, cwd),\n loadCompiledSurfaceAsync(agentDir),\n loadObservationPoolAsync(agentDir),\n liveSurfaceSnapshot({ registry: state.registry, extensionContext: context, cwd }),\n ]);\n if (!current() || files.length === 0 || loaded.error || poolLoaded.error) return;\n const evidence = await sessionWindowEvidenceAsync(files);\n if (!current() || evidence.traces.length === 0) return;\n const mergedPool = await mergeObservationWindowAsync(\n poolLoaded.file,\n evidence.observationWindows,\n );\n await saveObservationPoolAsync(agentDir, mergedPool.file);\n if (!current()) return;\n const outcome = await compileEntropySurfaceAsync({\n traces: evidence.traces,\n surface: snapshot,\n repairs,\n valueObservations: poolToValueObservations(mergedPool.file),\n auditCalls: evidence.auditCalls,\n ...(loaded.file ? { artifact: loaded.file } : {}),\n });\n if (!current()) return;\n const review = outcome.proposals.filter(\n (proposal) => !(AUTO_APPLY_PROPOSAL_KINDS as readonly string[]).includes(proposal.kind),\n );\n const reviewKey = entropyReviewKey(review);\n const reviewChanged = reviewKey !== entropyLastReview;\n let compileNotified = false;\n if (outcome.status === \"compiled\" && outcome.artifact) {\n const saved = await saveCompiledSurfaceAsync(agentDir, outcome.artifact);\n if (saved.written && current()) {\n // Activate immediately: enforcement follows the background compile,\n // never waiting for the next session start. Provenance-only artifact\n // updates stay silent because they do not alter the live surface.\n setActiveCompiledSurface(outcome.artifact);\n if (compiledSurfaceEffectChanged(loaded.file, outcome.artifact) && context.hasUI) {\n context.ui.notify(\n formatEntropyCompileNotice({\n proposals: outcome.proposals,\n beforeScore: outcome.report.score,\n afterScore: outcome.after?.score ?? outcome.report.score,\n elapsedMs: performance.now() - startedAt,\n ...(reviewChanged && review.length > 0 ? { reviewCount: review.length } : {}),\n }),\n \"info\",\n );\n compileNotified = true;\n }\n }\n }\n if (epoch !== entropyLifecycleEpoch) return;\n if (reviewChanged) {\n entropyLastReview = reviewKey;\n if (review.length > 0 && !compileNotified && context.hasUI) {\n context.ui.notify(formatEntropyReviewNotice(review), \"info\");\n }\n }\n };\n\n const launchEntropyCompile = (request: EntropyCompileRequest): void => {\n const task = (async () => {\n try {\n if (request.delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, request.delayMs));\n }\n await compileEntropyNow(request.context, request.epoch);\n } catch (error) {\n console.warn(\n `[omp-fabric] entropy compile failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n })();\n entropyCompileInFlight = task;\n void task.finally(() => {\n if (entropyCompileInFlight !== task) return;\n entropyCompileInFlight = undefined;\n const pending = entropyCompilePending;\n entropyCompilePending = undefined;\n if (pending) launchEntropyCompile(pending);\n });\n };\n\n const scheduleEntropyCompile = (\n context: ExtensionContext,\n delayMs = 250,\n ): void => {\n const request = { context, delayMs, epoch: entropyLifecycleEpoch };\n if (entropyCompileInFlight) {\n entropyCompilePending = request;\n return;\n }\n launchEntropyCompile(request);\n };\n\n const settleEntropyCompiles = async (): Promise<void> => {\n while (entropyCompileInFlight) await entropyCompileInFlight;\n };\n\n omp.on(\"session_start\", async (_event, context) => {\n entropyLifecycleEpoch += 1;\n entropyEvidenceThisTurn = false;\n entropyCompilePending = undefined;\n entropyLastReview = \"\";\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n proxyContract.reset();\n refreshProxyLedger(context);\n if (!compatibilityWarningShown) {\n compatibilityWarningShown = true;\n const warning = ompHostCompatibilityWarning();\n if (warning) {\n console.warn(`[omp-fabric] ${warning}`);\n if (context.hasUI) context.ui.notify(warning, \"warning\");\n }\n }\n await state.bootstrap(context);\n const recordedCwd = context.sessionManager.getRecordedCwd?.() || context.cwd;\n const projectKey = canonicalProjectIdentity({ liveCwd: recordedCwd }).key;\n if (lcmRuntime && (lcmCwd !== context.cwd || lcmProjectKey !== projectKey || state.config.compaction.engine !== \"lcm\")) {\n await lcmRuntime.shutdown();\n lcmRuntime = undefined;\n lcmCwd = undefined;\n lcmProjectKey = undefined;\n }\n if (state.config.compaction.engine === \"lcm\" && !lcmRuntime) {\n lcmRuntime = new LcmRuntime(context, {\n ...(state.config.compaction.summaryModel ? { summaryModel: state.config.compaction.summaryModel } : {}),\n maxLeafEntries: state.config.compaction.lcmMaxLeafEntries,\n maxCondenseChildren: state.config.compaction.lcmMaxCondenseChildren,\n lcmMaxInputChars: state.config.compaction.lcmMaxInputChars,\n lcmMaxOutputTokens: state.config.compaction.lcmMaxOutputTokens,\n lcmMaxOutputChars: state.config.compaction.lcmMaxOutputChars,\n });\n lcmCwd = context.cwd;\n lcmProjectKey = lcmRuntime.projectKey;\n }\n if (state.config.compaction.engine === \"lcm\" && lcmRuntime) await lcmRuntime.reconcileSelectedSession();\n refreshCodePreviewSettings();\n applyFabricMode();\n if (!updateCheckStarted) {\n updateCheckStarted = true;\n void scheduleFabricUpdateCheck(context, {\n enabled: state.config.update.check,\n agentDir: resolveAgentDir(),\n });\n }\n if (state.shouldEagerlyActivate(context)) await state.ensure(context);\n });\n\n // Branch changes move the leaf: emitted echoes and spent reminder budget\n // must track it exactly. Rewind removes abandoned-branch residue.\n omp.on(\"session_tree\", async (_event, context) => {\n proxyContract.reset();\n refreshProxyLedger(context);\n // OMP emits session_tree before it clears and rebuilds the transcript:\n // drop card invalidators from abandoned branches so a later display-mode\n // switch only refreshes cards registered by the rebuilt active branch.\n toolDisplay.clear();\n return undefined;\n });\n\n omp.on(\"input\", async (event, context) => {\n if (!state.initialized) return;\n state.prewalk.observeTask(\n context.sessionManager.getSessionId(),\n event.text,\n );\n await state.publishHostLifecycle(\"omp.input\", event);\n });\n\n omp.on(\"agent_start\", async (event) => {\n if (state.initialized) await state.publishHostLifecycle(\"omp.agent_start\", event);\n });\n\n omp.on(\"turn_end\", async (event, context) => {\n // Speculation never crosses a turn boundary; registry.endInvocation already\n // dropped entries for completed fabric_exec runs, this catches turns where\n // the program never executed (type errors, aborts).\n if (state.initialized) state.resetSpeculation();\n if (state.initialized) await state.publishHostLifecycle(\"omp.turn_end\", event);\n // A turn with new action evidence only enqueues the background compiler;\n // the hook returns without scanning session files or waiting on a lock.\n if (entropyEvidenceThisTurn) {\n entropyEvidenceThisTurn = false;\n scheduleEntropyCompile(context);\n }\n });\n\n omp.on(\"agent_end\", async (event, context) => {\n if (event.willContinue === true) return;\n await lcmRuntime?.syncAndSchedule();\n if (!state.initialized) {\n await compactAtConfiguredThreshold(context, state.config);\n return;\n }\n const sessionId = context.sessionManager.getSessionId();\n const settledInPlace = await settleInPlacePrewalk(state.prewalk, omp, context, {\n compactOnReturn: state.config.prewalk.compactOnReturn,\n compact: state.compact,\n });\n if (!settledInPlace && state.prewalk.settleTask(sessionId)) {\n const status = state.prewalk.status();\n context.ui.setStatus(\n \"fabric-prewalk\",\n status.state === \"armed\" ? `armed \u2192 ${status.model}` : undefined,\n );\n }\n // Drift baselines track armed windows: re-anchor when still armed (a\n // re-arm starts each new window from the just-settled tree state), drop\n // once prewalk is no longer armed for this session.\n if (state.prewalk.status().state === \"armed\") {\n void state.prewalkDrift.captureBaseline(sessionId, context.cwd);\n } else {\n state.prewalkDrift.drop(sessionId);\n }\n // Keep the completed widget mounted until a newer Fabric run replaces it.\n // Removing rows at settle would pull the editor and latest chat content upward.\n // OMP's compact API is callback-based. Await the controller's Promise here\n // so ExtensionRunner does not finish this handler (and OMP does not publish\n // its public agent_end event) before compaction settles.\n await state.compact.maybeCommit(context);\n await compactAtConfiguredThreshold(context, state.config);\n await state.publishHostLifecycle(\"omp.agent_end\", event);\n });\n\n const speculationWarmup = new FabricSpeculationWarmup({\n enabled: () => {\n try {\n return state.config.speculation.enabled === true;\n } catch {\n return false;\n }\n },\n tap: () => state.speculationTap,\n activate: (context) => state.ensure(context),\n });\n\n // Speculative PTC: follow fabric_exec argument streaming and pre-launch\n // literal-argument read calls so their latency hides behind generation.\n omp.on(\"message_start\", () => {\n speculationWarmup.reset();\n state.speculationTap?.reset();\n });\n\n omp.on(\"message_update\", (event, context) => {\n speculationWarmup.handleMessageUpdate(event, context);\n });\n\n omp.on(\"tool_call\", (event, context) =>\n fabricToolLifecycle.toolCall(event, context));\n\n // The OMP host intentionally ignores `isError` returned by custom-tool\n // execute(). Repair the finalized outer result through official middleware.\n omp.on(\"tool_result\", (event) => fabricToolLifecycle.toolResult(event));\n\n omp.on(\"tool_result\", (event, context) => {\n if (event.toolName !== \"read\" || event.isError) return undefined;\n let changed = false;\n const content = event.content.map((part) => {\n if (part.type !== \"text\") return part;\n const text = expandSkillDirMarkersForRead(\n part.text,\n event.input,\n context.cwd,\n );\n if (text === part.text) return part;\n changed = true;\n return { ...part, text };\n });\n return changed ? { content } : undefined;\n });\n\n omp.on(\"message_end\", () => {\n lcmRuntime?.markDirty();\n });\n\n omp.on(\"message_end\", (event) => {\n if (event.message.role !== \"toolResult\") return;\n const message = event.message as AgentToolResultMessage & { usage?: Usage };\n const usage = directToolApproval.takeUsage(message.toolCallId);\n if (!usage) return;\n message.usage = mergeFabricApprovalUsage(message.usage, usage);\n });\n\n // message_end runs after all tool-result middleware and tool_execution_end but\n // before OMP persists the native toolResult or starts another model turn. That\n // is the complete outer fabric_exec boundary: fork the exact message, wait for\n // the child, then replace what Main sees while terminate prevents inference.\n omp.on(\"message_end\", async (event, context) => {\n if (event.message.role !== \"toolResult\") return;\n const pending = pendingHandoffs.get(event.message.toolCallId);\n if (!pending || event.message.toolName !== \"fabric_exec\") return;\n pendingHandoffs.delete(event.message.toolCallId);\n\n const outerToolResult = event.message as AgentToolResultMessage;\n const handoff = await state.runHandoffAtBoundary(\n pending,\n outerToolResult,\n context,\n );\n Object.assign(outerToolResult, handoff);\n });\n\n omp.on(\"tool_execution_end\", async (event, context) => {\n if (!state.initialized) return;\n if (event.toolName === \"fabric_exec\") entropyEvidenceThisTurn = true;\n state.noteMainActivity(context);\n if (event.isError) {\n const classified = classifyToolResult({\n toolName: event.toolName,\n isError: true,\n content: event.result,\n });\n const registryObserved =\n event.toolName === \"fabric_exec\" &&\n (classified?.stage === \"invocation_args\" ||\n classified?.stage === \"invocation_unknown_action\");\n if (classified && !registryObserved) {\n getActiveRepairCompiler()?.observe(classified);\n }\n state.dispatchHostEvent(\"tool_error\", event, context);\n await state.publishHostLifecycle(\"omp.tool_error\", event);\n }\n });\n\n omp.on(\"session_compact\", async (event, context) => {\n await lcmRuntime?.syncAndSchedule();\n if (!state.initialized) return;\n await state.publishHostLifecycle(\"omp.session_compact\", event);\n });\n\n // Deterministic, LLM-free compaction is registered unconditionally and is\n // active by default. The documented \"omp\" escape hatch returns early so\n // OMP's own summarization proceeds normally.\n registerCompactionHook(omp, {\n getEngine: () =>\n state.cwd\n ? state.config.compaction.engine\n : DEFAULT_FABRIC_CONFIG.compaction.engine,\n getTargetContextRatio: () =>\n state.cwd\n ? state.config.compaction.targetContextRatio\n : DEFAULT_FABRIC_CONFIG.compaction.targetContextRatio,\n lcm: {\n compact: (input) => lcmRuntime?.compact(input),\n },\n });\n\n omp.on(\"context\", (event, context) => {\n const sessionId = context.sessionManager.getSessionId();\n const continuation = filterPrewalkContinuationMessages(\n event.messages,\n (continuationId) => state.initialized &&\n state.prewalk.acceptContinuation(sessionId, continuationId),\n );\n let changed = continuation.changed;\n const messages = continuation.messages.map((message) => {\n if (message.role !== \"user\") return message;\n if (typeof message.content === \"string\") {\n const content = expandSkillDirMarkersInSkillBlock(message.content);\n if (content === message.content) return message;\n changed = true;\n return { ...message, content };\n }\n let messageChanged = false;\n const content = message.content.map((part) => {\n if (part.type !== \"text\") return part;\n const text = expandSkillDirMarkersInSkillBlock(part.text);\n if (text === part.text) return part;\n changed = true;\n messageChanged = true;\n return { ...part, text };\n });\n return messageChanged ? { ...message, content } : message;\n });\n return changed ? { messages } : undefined;\n });\n\n omp.on(\"before_agent_start\", async (event, context) => {\n const fullCodeMode = state.cwd\n ? state.config.fullCodeMode\n : DEFAULT_FABRIC_CONFIG.fullCodeMode;\n const schemaMode = state.cwd\n ? state.config.schema.mode\n : DEFAULT_FABRIC_CONFIG.schema.mode;\n reassertToolOwnership();\n const effectiveFullCodeMode = fullCodeMode || schemaMode === \"enforce\";\n if (!omp.getActiveTools().includes(\"fabric_exec\")) return;\n const skills = activeSkills();\n const captureSnapshot = state.cwd ? capturePolicy() : undefined;\n const systemPrompt = effectiveFullCodeMode\n ? restoreSkillsForFullCodePrompt(\n event.systemPrompt.join(\"\\n\"),\n listableSkills(skills),\n )\n : event.systemPrompt.join(\"\\n\");\n // OMP expands the invoked skill into the user message, but wrappers may\n // delegate by name. Resolve only explicit invocation lines so full code\n // mode preserves OMP's progressive skill loading without exposing read.\n // Turn-derived: delivered via the message channel (below), never the\n // system prompt, so the cached system prefix stays byte-stable.\n const skillReferenceGuidance = effectiveFullCodeMode\n ? buildSkillReferenceGuidance(event.prompt, skills)\n : undefined;\n const currentModel = context.model\n ? `${context.model.provider}/${context.model.id}`\n : undefined;\n const resolvedGuidance = resolveFabricModelGuidance(state.modelGuidance(), {\n ...(currentModel ? { model: currentModel } : {}),\n target: process.env.OMP_FABRIC_PARENT_RUN ? \"participant\" : \"main\",\n defaults: [{\n slot: FABRIC_EXECUTION_GUIDANCE_SLOT,\n content: defaultFabricExecutionGuidance(effectiveFullCodeMode),\n }],\n });\n const overrideGuidance = effectiveFullCodeMode\n ? coreOverridePromptGuidance(capturedTools).trim()\n : undefined;\n const extensionRoster = effectiveFullCodeMode\n ? extensionToolRosterGuidance(capturedTools.list(), new Set(OMP_CORE_TOOL_NAMES))\n : undefined;\n // Only turn-stable sections go into the system prompt. Anything derived\n // from the current prompt (skill references) rides\n // the message channel so provider prefix caches never cold-prefill.\n const guidance = [\n fabricExecutionKernelGuidance(effectiveFullCodeMode),\n resolvedGuidance.slotText,\n fabricSchemaGuidance(schemaMode),\n overrideGuidance,\n extensionRoster,\n resolvedGuidance.appendText,\n ].filter((section): section is string => Boolean(section)).join(\"\\n\\n\");\n // Turn-varying content (skill reference guidance) is delivered here as a\n // persistent message, not appended to the system prompt. Keeping the\n // system prompt byte-identical across turns is what lets provider prefix\n // caches (e.g. DeepSeek) stay warm.\n if (!skillReferenceGuidance) return {\n systemPrompt: [`${systemPrompt}\\n\\n${guidance}`],\n };\n return {\n systemPrompt: [`${systemPrompt}\\n\\n${guidance}`],\n message: {\n customType: SKILL_REFERENCE_CUSTOM_TYPE,\n content: skillReferenceGuidance,\n display: false,\n details: {},\n },\n };\n });\n\n // Ambient skill prose that names hidden captured tools is not user intent,\n // so the furnace strips it. This sidecar retargets the call site without\n // spending hint budget, echoing tokens, or burning ash.\n omp.on(\"before_agent_start\", (event) => {\n if (!omp.getActiveTools().includes(\"fabric_exec\")) return;\n const captureSnapshot = state.cwd ? capturePolicy() : undefined;\n if (\n !captureSnapshot?.enabled ||\n !captureSnapshot.hideFromModel ||\n !fabricOwnsModelTools()\n ) {\n return;\n }\n const names = rewritableHiddenCapturedToolNames(hiddenCapturedToolNames());\n if (names.length === 0) return;\n const mentioned = proxyContractMentionsInSkills(\n event.prompt,\n event.systemPrompt.join(\"\\n\"),\n names,\n );\n const fresh = proxyContract.take(mentioned);\n if (fresh.length === 0) return;\n return {\n message: {\n customType: PROXY_CONTRACT_CUSTOM_TYPE,\n content: formatProxyContractReminder(fresh),\n display: false,\n details: { names: fresh, origin: \"skill\" },\n },\n };\n });\n\n registerFabricActorHostEventObservers(omp, (eventName, event, context) => {\n if (!state.initialized) return;\n state.dispatchHostEvent(eventName, event, context);\n });\n\n omp.on(\"session_shutdown\", async (_event, context) => {\n // Queue the richest final window and let async I/O/cooperative scoring\n // finish before teardown; the TUI event loop remains responsive.\n if (entropyEvidenceThisTurn) {\n entropyEvidenceThisTurn = false;\n scheduleEntropyCompile(context, 0);\n }\n await settleEntropyCompiles();\n entropyLifecycleEpoch += 1;\n entropyCompilePending = undefined;\n unsubscribeComponentRegistration();\n unsubscribeProviderRegistration();\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n try {\n await lcmRuntime?.shutdown();\n lcmRuntime = undefined;\n lcmCwd = undefined;\n lcmProjectKey = undefined;\n await state.shutdown();\n } finally {\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n toolOwnership.release();\n fabricToolLifecycle.clear();\n toolCapture.dispose();\n }\n });\n\n // Turn-scoped invariant: even if another extension rewrote the active tool\n // set (e.g. a permission system filtering its allowlist at before_agent_start,\n // or a refresh that ran before Fabric's policy was active), captured tools\n // must not leak into the model's next turn.\n omp.on(\"before_agent_start\", () => {\n reassertToolOwnership();\n });\n\n registerFabricCommand(omp, {\n state,\n fabricUi,\n capturedTools,\n applyFabricMode,\n suspendToolCapture,\n refreshCodePreviewSettings,\n refreshToolDisplay: () => toolDisplay.refresh(),\n });\n}\n\nexport * from \"./audit/index.js\";\nexport * from \"./entropy/index.js\";\nexport * from \"./protocol.js\";\n"],
5
+ "mappings": "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",
6
6
  "names": ["token", "formatDuration", "options", "state", "component", "path", "record", "items", "filtered", "fs", "path", "path", "fs", "crypto", "hash", "crypto", "path", "path", "isRecord", "existsSync", "readFileSync", "path", "isRecord", "escapeRegex", "Container", "Text", "path", "isRecord", "truncateToWidth", "path", "path", "record", "isRenderComponent", "title", "composite", "Container", "Text", "text", "readHint", "fs", "path", "path", "fs", "existsSync", "readFileSync", "realpathSync", "path", "fs", "path", "path", "fs", "record", "path", "record", "truncateToWidth", "visibleWidth", "truncateToWidth", "phase", "visibleWidth", "path", "existsSync", "path", "fileURLToPath", "resolve", "content"]
7
7
  }