pi-fabric 0.96.0 → 0.96.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 +1 -1
- package/dist/index.js.map +2 -2
- package/dist/worker/recovery-watchdog.d.ts +12 -0
- package/dist/worker/recovery-watchdog.d.ts.map +1 -0
- package/dist/worker/recovery-watchdog.js +41 -0
- package/dist/worker/recovery-watchdog.js.map +7 -0
- package/dist/worker.js +70 -20
- package/dist/worker.js.map +2 -2
- package/docs/agents.md +6 -0
- package/package.json +1 -1
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/prewalk/return.ts", "../src/ui/conversation-shortcut.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/kernel-skills.ts", "../src/core/proxy-contract.ts", "../src/core/direct-tool-approval.ts", "../src/core/skill-references.ts", "../src/fabric-exec-tool.ts", "../src/failure-progress.ts", "../src/fabric-exec-arguments.ts", "../src/repeat-guard.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/managed-host.ts", "../src/repairs/classify.ts", "../src/host-compatibility.ts", "../src/ui/controller.ts", "../src/ui/snapshot.ts", "../src/ui/widget.ts", "../src/ui/escape-halt.ts", "../src/ui/shell-hang-keys.ts", "../src/ui/tool-display.ts", "../src/ui/handoff-completion.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { Theme, ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport {\n Container,\n Text,\n truncateToWidth,\n visibleWidth,\n type Component,\n} from \"@earendil-works/pi-tui\";\nimport { continueArcGroup } from \"./arc-group.js\";\nimport { animationFitsViewport, type AnimationViewportState } from \"./spinner.js\";\n\ntype ToolCallBackgroundMode = \"on\" | \"border\" | \"off\";\ntype AnyTool = ToolDefinition<any, any, any>;\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\ntype 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 codePreviewTimingViewport?: AnimationViewportState;\n codePreviewTimingLabel?: string;\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 if (!animationFitsViewport(state.codePreviewTimingViewport)) return;\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 if (running && !animationFitsViewport(state.codePreviewTimingViewport)) {\n return state.codePreviewTimingLabel;\n }\n const endedAt = running ? Date.now() : (state.codePreviewTimingEndedAt ?? Date.now());\n const durationMs = endedAt - startedAt;\n if (!Number.isFinite(durationMs) || Math.round(durationMs) <= 0) return undefined;\n const label = `${running ? \"Elapsed\" : \"Took\"} ${formatDuration(durationMs)}`;\n state.codePreviewTimingLabel = label;\n return label;\n};\n\nclass TimingPreservedComponent implements Component {\n constructor(readonly component: Component, private readonly state: TimingState) {}\n render(width: number): 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): 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 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): 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 (this.state.codePreviewTimingViewport ??= {}).renderedRows = body.length + (width < 4 ? 0 : 2);\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 = (tool, options = {}) => {\n const mode = options.mode ?? \"on\";\n const timingEnabled = options.toolCallTiming ?? true;\n if ((options.preserveSelfShell ?? true) && tool.renderShell === \"self\") return tool;\n const originalRenderCall = tool.renderCall;\n const originalRenderResult = tool.renderResult;\n const renderCall = (args: unknown, theme: Theme, context: PreviewRenderContext): Component =>\n originalRenderCall\n ? originalRenderCall.call(tool, args as never, theme, context as never)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n const renderResult = (\n result: unknown,\n resultOptions: unknown,\n theme: Theme,\n context: PreviewRenderContext,\n ): Component => originalRenderResult\n ? originalRenderResult.call(tool, result as never, resultOptions as never, theme, context as never)\n : new Container();\n\n return {\n ...tool,\n renderShell: mode === \"on\" ? \"default\" : \"self\",\n renderCall(args, theme, rawContext) {\n if (!rawContext) {\n return originalRenderCall\n ? originalRenderCall.call(tool, args, theme, rawContext)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n }\n const context = rawContext as unknown as PreviewRenderContext;\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, 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, 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, rawContext) {\n const context = rawContext as unknown as PreviewRenderContext;\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 typeof tool;\n};\n", "import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionEvent,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n FABRIC_ACTOR_PI_HOST_EVENTS,\n type FabricActorPiHostEvent,\n} from \"./types.js\";\n\nexport type FabricActorHostEventObserver = (\n eventName: FabricActorPiHostEvent,\n event: ExtensionEvent,\n context: ExtensionContext,\n) => void;\n\ninterface ObservableExtensionApi {\n on(\n event: FabricActorPiHostEvent,\n handler: (event: ExtensionEvent, context: ExtensionContext) => void,\n ): void;\n}\n\nexport const registerFabricActorHostEventObservers = (\n pi: ExtensionAPI,\n observer: FabricActorHostEventObserver,\n): void => {\n const observable = pi as unknown as ObservableExtensionApi;\n for (const eventName of FABRIC_ACTOR_PI_HOST_EVENTS) {\n observable.on(eventName, (event, context) => observer(eventName, event, context));\n }\n};\n", "import { existsSync, readdirSync, readFileSync, realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type {\n ExtensionRunner,\n RegisteredTool,\n ToolDefinition,\n} from \"@earendil-works/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, any>;\n catalog: CapturedToolCatalog;\n initialPolicy?: FabricToolCaptureConfig;\n // Called after each refresh of the captured catalog so callers can re-assert\n // active-tool ownership. Tools are deliberately left in Pi's registry \u2014 the\n // listener observes rather than filters \u2014 because extensions that gate tool\n // calls against `pi.getAllTools()` (e.g. permission systems) must still see\n // captured tools as registered; hiding from the model happens exclusively in\n // the active tool set (see FabricToolOwnership).\n onCatalogRefresh?: () => void;\n}\n\nconst HUB_SYMBOL = Symbol.for(\"pi-fabric.registered-tool-capture.v1\");\nconst ANCHOR_SYMBOL = Symbol.for(\"pi-fabric.registered-tool-anchor.v1\");\n\nconst definitionDelegatesTo = (\n definition: ToolDefinition<any, any, any>,\n target: ToolDefinition<any, 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 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// pi >= 0.84.3 loads the CLI 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(\"Pi 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};\n\nconst PI_PACKAGE_NAME = \"@earendil-works/pi-coding-agent\";\n\nconst piPackageRootAbove = (startDirectory: string): string | undefined => {\n let directory = startDirectory;\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 === PI_PACKAGE_NAME) return directory;\n } catch { /* unreadable or invalid manifest; keep searching */ }\n }\n directory = path.dirname(directory);\n }\n return undefined;\n};\n\nconst hostPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n try {\n return piPackageRootAbove(path.dirname(realpathSync(cliPath)));\n } catch {\n return undefined;\n }\n};\n\n// Embedded hosts (pi-web sessiond, SDK embeds) instantiate ExtensionRunner from\n// their own node_modules copy while this extension runs from a separate package\n// realm: the in-realm fallback import below resolves this extension's private\n// dependency and patches a class identity the live runner never uses, leaving\n// the captured catalog permanently empty (extensions.* exposes nothing). Node\n// caches modules by absolute path, so locating the host's copy through the\n// process entry's module search path and importing it yields the very class\n// the host instantiates.\nconst entryRealmPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n let entryDirectory: string;\n try {\n entryDirectory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n // The package exports map is ESM-only, so plain resolve() fails with\n // ERR_PACKAGE_PATH_NOT_EXPORTED; resolve.paths() lists the node_modules\n // directories Node would search regardless of exports.\n const searchPaths = createRequire(path.join(entryDirectory, \"probe.js\"))\n .resolve.paths(PI_PACKAGE_NAME);\n for (const searchPath of searchPaths ?? []) {\n const manifestPath = path.join(searchPath, PI_PACKAGE_NAME, \"package.json\");\n if (!existsSync(manifestPath)) continue;\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (manifest.name === PI_PACKAGE_NAME) return path.join(searchPath, PI_PACKAGE_NAME);\n } catch { /* unreadable or invalid manifest; keep searching */ }\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(), entryRealmPackageRoot()].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(\"@earendil-works/pi-coding-agent\")) 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 = (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.sourceInfo.path);\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 \"@earendil-works/pi-coding-agent\";\nimport type { AutocompleteItem } from \"@earendil-works/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 { restoreBorrowedInPlaceMain } from \"../prewalk/return.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 { normalFormEvidenceSummary } from \"../entropy/normal-form.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 // Pi 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 Pi 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 pi: 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, pi, {\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) pi.sendUserMessage(task);\n return { ok: true };\n};\n\nexport function registerFabricCommand(pi: ExtensionAPI, deps: FabricCommandDeps): void {\n const { state, fabricUi, capturedTools, applyFabricMode, suspendToolCapture } = deps;\n const unsubscribePrewalkRequests = pi.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, pi));\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 pi.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 = pi.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 = pi.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 pi.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 pi.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 pi.registerShortcut?.(\"ctrl+alt+t\", {\n description: \"Inspect Fabric background shell tasks\",\n handler: async (context) => {\n if (context.mode !== \"tui\") return;\n try { await state.ensure(context); await fabricUi.openTasks(context); }\n catch (error) { context.ui.notify(safeText(error instanceof Error ? error.message : String(error)), \"error\"); }\n },\n });\n\n pi.registerCommand(\"fabric\", {\n description: \"Open Fabric dashboard, chat or tasks, arm prewalk, reload, or manage agents and actors\",\n getArgumentCompletions: (argumentPrefix: string): AutocompleteItem[] | null => {\n const subcommands = [\n \"status\",\n \"dashboard\",\n \"tasks\",\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 === \"tasks\") {\n const matches = state.shellJobs?.list().filter(job => job.id.startsWith(idPrefix)) ?? [];\n return matches.map(job => ({ value: `tasks ${job.id}`, label: job.id.slice(0, 8), description: safeText(job.description ?? job.command).slice(0, 120) }));\n }\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 if (state.kernelReloadRequired) {\n await context.reload();\n return;\n }\n await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\n context.ui.notify(\"Pi 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 reloadResources: () => context.reload(),\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 // Persistent master switch: saves prewalk.enabled to the same scope\n // the settings UI writes (project when trusted), reloads config so\n // the rest of the session agrees, and when disabling also cancels\n // the live arm so nothing claims mid-change.\n const enabled = option === \"--enable\";\n try {\n const projectTrusted = context.isProjectTrusted();\n const saved = saveFabricConfig(\n {\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted,\n scope: projectTrusted ? \"project\" : \"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 await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\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 await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\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, pi, task);\n return;\n }\n if (command === \"tasks\") {\n await fabricUi.openTasks(context, argumentsList[0]);\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.normalizations?.length ?? 0} normal-form plans; legacy restrictions inert) \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.normalizations?.length ?? 0} normal-form plans \u00B7 ${merged.droppedOverlays + merged.droppedQuarantines + merged.droppedNormalizations} dropped (unproved rules or legacy restrictions)`,\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 invocation rejection rate ${formatEntropyMetric(latest.score)} \u00B7 ${formatEntropyMetric(latest.totals.invocationRejectionsPer1k)}/1k calls \u00B7 lower is better \u00B7 slope ${formatEntropyMetric(corpus.trend.slopePerStep)}/session \u00B7 ${\n latest.totals.invocationRejectionsPer1k === 0 && corpus.trend.slopePerStep <= 0\n ? \"no invocation rejections\"\n : \"invocation friction remains\"\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: artifact v${loadedCompiled.file.version} \u00B7 ${loadedCompiled.file.normalizations?.length ?? 0} normal-form plans \u00B7 canonical capabilities preserved${loadedCompiled.file.version === 1 ? \" \u00B7 legacy restrictions inert (migration pending)\" : \"\"}`\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 let normalizationLine = \"normal forms: no witness evidence\";\n try {\n const [windowEvidence, poolLoaded] = await Promise.all([\n sessionWindowEvidenceAsync(files),\n loadObservationPoolAsync(agentDir),\n ]);\n const normal = normalFormEvidenceSummary(windowEvidence.traces);\n normalizationLine = `normal forms: ${normal.normalizedCalls} calls normalized \u00B7 ${normal.rulesApplied} rules applied \u00B7 ${normal.succeeded} succeeded \u00B7 ${normal.subsequentFailures} subsequent failures (not masked)`;\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 normalizationLine,\n reviewLine,\n `surface freedom (diagnostic, not objective): 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 Pi 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 \"@earendil-works/pi-coding-agent\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport { resolveFabricIdentity } from \"../main-agent.js\";\nimport {\n PREWALK_ARMED_MESSAGE_TYPE,\n hasPrewalkArmedPrompt,\n prewalkArmedPrompt,\n} from \"./messages.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 pi: 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 requirePlan: prewalk.requirePlan,\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, prewalk.requirePlan);\n if (!hasPrewalkArmedPrompt(context.sessionManager.getBranch(), armedPrompt)) {\n pi.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 Main 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 pi: ExtensionAPI,\n): Promise<string | undefined> => {\n const { prewalk } = state.config;\n if (prewalk.enabled === false || !prewalk.alwaysRearm) return undefined;\n // Participants inherit Main's settings and full-code mode, but must execute\n // their assigned work instead of handing it off again on their first write.\n if (resolveFabricIdentity(context.sessionManager.getSessionId()).identity.kind !== \"main\") {\n return undefined;\n }\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 // A failed in-place return left Main on the executor: auto-arming now would\n // hand the next mutation back to the same executor and capture it as the\n // new boundary model, losing the original Main. restoreBorrowedInPlaceMain\n // runs first at session start and reload, so this only triggers when that\n // recovery also failed; an explicit /fabric prewalk arm still overrides.\n const borrowed = state.prewalk.borrowedReturn();\n if (\n borrowed &&\n context.model &&\n `${context.model.provider}/${context.model.id}` === borrowed.executorModel\n ) {\n return \"Fabric prewalk auto-arm skipped: Main is still on the executor after a failed in-place return. Restart the session or run /fabric reload to retry the return, or arm prewalk explicitly.\";\n }\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, pi, { model });\n return undefined;\n};\n", "import type {\n ExtensionAPI,\n ExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport type { CompactRequestIntent } from \"../core/compact-controller.js\";\nimport { setModelSafely } from \"./model-switch.js\";\nimport { PREWALK_CONTINUE_MESSAGE_TYPE } from \"./messages.js\";\nimport type {\n FabricPrewalkBorrowedMain,\n PrewalkController,\n} from \"./controller.js\";\n\n// The return half of in-place Prewalk: restoring the borrowed Main model after a\n// continuation, restart-safe recovery from the persisted branch, and the\n// settle-on-return path. Session start and /fabric reload run this eagerly, so it\n// stays free of the boundary engine's executor dependencies.\nconst modelForReturnKey = (key: string, context: ExtensionContext) => {\n const separator = key.indexOf(\"/\");\n if (separator <= 0 || separator === key.length - 1) return undefined;\n return context.modelRegistry.find(key.slice(0, separator), key.slice(separator + 1));\n};\n\nconst PREWALK_RETURN_COMPACTION_INSTRUCTIONS = [\n \"Compact before Main returns to its boundary model after an in-place prewalk continuation.\",\n \"Preserve the executor's final report and verification results; summarize implementation scratch work, file reads, and command output.\",\n].join(\" \");\n\nexport interface InPlacePrewalkSettleOptions {\n // Enabled by default when a compact controller is provided.\n compactOnReturn?: boolean;\n compact?: {\n request(intent: CompactRequestIntent): unknown;\n maybeCommit(context: ExtensionContext): Promise<void>;\n status?(): { pending?: unknown };\n };\n}\n// A restarted process has no in-memory borrow record, yet the branch still\n// proves Main is owed a return: a persisted in-place continuation whose\n// executor switch is the session's last recorded model change. A later model\n// change (completed return, manual pick, another cycle) supersedes it, and a\n// malformed or trajectory record carries no return identity.\nconst prewalkRecoveryCandidate = (\n branch: ReadonlyArray<unknown>,\n): FabricPrewalkBorrowedMain | undefined => {\n let continuationIndex = -1;\n let details: { continuationId?: unknown; model?: unknown; returnModel?: unknown } | undefined;\n for (let index = branch.length - 1; index >= 0; index -= 1) {\n const entry = branch[index] as { type?: unknown; customType?: unknown; details?: unknown };\n if (entry?.type !== \"custom_message\" || entry.customType !== PREWALK_CONTINUE_MESSAGE_TYPE) {\n continue;\n }\n if (typeof entry.details !== \"object\" || entry.details === null) continue;\n if ((entry.details as { mode?: unknown }).mode !== \"in-place\") continue;\n continuationIndex = index;\n details = entry.details as { continuationId?: unknown; model?: unknown; returnModel?: unknown };\n break;\n }\n if (continuationIndex < 0 || !details) return undefined;\n const continuationId = typeof details.continuationId === \"string\" ? details.continuationId : \"\";\n const executorModel = typeof details.model === \"string\" ? details.model.trim() : \"\";\n const returnModel = typeof details.returnModel === \"string\" ? details.returnModel.trim() : \"\";\n if (!continuationId || !executorModel || !returnModel || returnModel === executorModel) {\n return undefined;\n }\n let recordedExecutor: string | undefined;\n for (let index = 0; index < branch.length; index += 1) {\n const entry = branch[index] as { type?: unknown; provider?: unknown; modelId?: unknown };\n if (entry?.type !== \"model_change\") continue;\n if (index > continuationIndex) return undefined;\n recordedExecutor = `${String(entry.provider)}/${String(entry.modelId)}`;\n }\n return recordedExecutor === executorModel ? { returnModel, executorModel } : undefined;\n};\nexport const restoreBorrowedInPlaceMain = async (\n controller: PrewalkController,\n extension: ExtensionAPI,\n context: ExtensionContext,\n): Promise<boolean> => {\n let borrowed = controller?.borrowedReturn?.();\n let recovered = false;\n if (!borrowed) {\n // Restart recovery: adopt the persisted continuation's return tuple, then\n // restore through the same path. Success clears the adopted record \u2014 the\n // restore's recorded model change supersedes the historical candidate \u2014\n // while failure keeps it so the auto-arm guard can still refuse to capture\n // the executor as Main.\n const candidate = prewalkRecoveryCandidate(context.sessionManager?.getBranch?.() ?? []);\n if (!candidate || !controller.hydrateBorrowedMain(candidate)) return false;\n borrowed = candidate;\n recovered = true;\n }\n const currentKey = context.model\n ? `${context.model.provider}/${context.model.id}`\n : undefined;\n // Only snap back when this session is still on the executor we switched to.\n // A new session that already loaded Main, or a later manual pick, stays put.\n if (currentKey !== undefined && currentKey !== borrowed.executorModel) return false;\n if (currentKey === borrowed.returnModel) return false;\n\n const model = modelForReturnKey(borrowed.returnModel, context);\n if (!model) {\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${borrowed.returnModel}`);\n context.ui.notify(\n `Prewalk left Main on the executor; could not restore unavailable model ${borrowed.returnModel}.`,\n \"error\",\n );\n return false;\n }\n\n const restored = await setModelSafely(extension, model);\n if (!restored) {\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${borrowed.returnModel}`);\n context.ui.notify(\n `Prewalk left Main on the executor; could not return to ${borrowed.returnModel}. Check model authentication.`,\n \"error\",\n );\n return false;\n }\n\n if (recovered) controller.clearBorrowed();\n context.ui.notify(`Restored Main to ${borrowed.returnModel} after in-place prewalk.`, \"info\");\n return true;\n};\nexport const settleInPlacePrewalk = async (\n controller: PrewalkController,\n extension: ExtensionAPI,\n context: ExtensionContext,\n options?: InPlacePrewalkSettleOptions,\n): Promise<boolean> => {\n const sessionId = context.sessionManager.getSessionId();\n const settlement = controller.takeContinuationSettlement(sessionId);\n if (!settlement) return false;\n\n const model = modelForReturnKey(settlement.returnModel, context);\n if (!model) {\n // A failed return is not completion: dropping to the shared cancel path\n // disarms without re-arming while preserving borrowedReturn, so a later\n // session start or /fabric reload can still restore Main. Repeated settle\n // calls find no continuation and stay quiet.\n controller.cancel();\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${settlement.returnModel}`);\n context.ui.notify(\n `Prewalk completed, but Main could not return to unavailable model ${settlement.returnModel}.`,\n \"error\",\n );\n return false;\n }\n\n context.ui.setStatus(\"fabric-prewalk\", `returning Main \u2192 ${settlement.returnModel}`);\n if (options?.compact && options.compactOnReturn !== false) {\n // Compact while the executor is still active so the restored boundary\n // model re-ingests a compacted transcript instead of the executor's full\n // implementation scratch work: the return prefill is cold regardless of\n // provider cache-policy differences, so keep it small. An already-pending\n // intent (e.g. requested by the model) wins over ours. The commit is\n // best-effort; the controller records failures without throwing.\n if (!options.compact.status?.().pending) {\n options.compact.request({\n reason: \"in-place prewalk return\",\n instructions: PREWALK_RETURN_COMPACTION_INSTRUCTIONS,\n requestedBy: \"prewalk\",\n });\n }\n await options.compact.maybeCommit(context);\n }\n const restored = await setModelSafely(extension, model);\n if (!restored) {\n // A failed return is not completion: dropping to the shared cancel path\n // disarms without re-arming while preserving borrowedReturn, so a later\n // session start or /fabric reload can still restore Main. Repeated settle\n // calls find no continuation and stay quiet.\n controller.cancel();\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${settlement.returnModel}`);\n context.ui.notify(\n `Prewalk completed, but Main could not return to ${settlement.returnModel}. Check model authentication.`,\n \"error\",\n );\n return false;\n }\n\n controller.finishContinuation(sessionId, settlement.continuationId);\n const status = controller.status();\n context.ui.setStatus(\n \"fabric-prewalk\",\n status.state === \"armed\" ? `armed \u2192 ${status.model}` : undefined,\n );\n context.ui.notify(\n status.state === \"armed\"\n ? `Prewalk complete. Main returned to ${settlement.returnModel} and re-armed for the next task.`\n : `Prewalk complete. Main returned to ${settlement.returnModel}.`,\n \"info\",\n );\n return true;\n};\n", "export const FABRIC_CONVERSATION_SHORTCUT = \"ctrl+shift+a\";\nexport const FABRIC_CONVERSATION_HINT = \"ctrl+shift+a chat\";\n", "import path from \"node:path\";\nimport type {\n ToolCallEvent,\n ToolCallEventResult,\n ToolResultEvent,\n ExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { readFabricExecutionTraceV1 } from \"../audit/index.js\";\nimport { FABRIC_NESTED_TOOL_CALL_ID_PREFIX as NESTED_TOOL_CALL_ID_PREFIX } from \"../protocol.js\";\nimport { PI_CORE_TOOL_NAME_SET } from \"./pi-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 `pi.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(fullCodeMode: boolean, hiddenExtensionTools?: ReadonlySet<string>): boolean {\n const active = this.host.getActiveTools();\n if (!fullCodeMode) return this.#restore(active);\n\n this.#savedNativeCoreTools ??= active.flatMap((name, index) =>\n PI_CORE_TOOL_NAME_SET.has(name) ? [{ name, index }] : [],\n );\n const hidden = hiddenExtensionTools ?? new Set<string>();\n const next: string[] = [];\n active.forEach((name, index) => {\n if (PI_CORE_TOOL_NAME_SET.has(name)) return;\n if (hidden.has(name)) {\n if (!this.#savedHiddenExtensionTools.has(name)) {\n this.#savedHiddenExtensionTools.set(name, index);\n }\n return;\n }\n next.push(name);\n });\n for (const [name, index] of this.#savedHiddenExtensionTools) {\n if (hidden.has(name) || next.includes(name)) continue;\n this.#savedHiddenExtensionTools.delete(name);\n next.splice(Math.min(index, next.length), 0, name);\n }\n if (!next.includes(\"fabric_exec\")) next.push(\"fabric_exec\");\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 type { FabricKernel } from \"../runtime/kernel.js\";\nimport {\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 FabricPersistedExecutionDetailsV1 {\n success: boolean;\n kernel?: FabricKernel;\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 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}\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}\n\nexport interface FabricExecutionRenderDetails {\n success?: boolean;\n kernel?: FabricKernel;\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 });\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 kernel?: FabricKernel;\n trace: FabricExecutionTraceV1;\n audits?: readonly FabricPersistableAuditInput[];\n phases?: readonly string[];\n error?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n}): FabricPersistedExecutionDetailsV1 => {\n const details: FabricPersistedExecutionDetailsV1 = {\n success: input.success,\n ...(input.kernel ? { kernel: input.kernel } : {}),\n trace: cloneTrace(input.trace),\n audits: (input.audits ?? []).map(persistableAudit),\n phases: (input.phases ?? []).filter((phase): phase is string => typeof phase === \"string\"),\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 };\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 ...(value.kernel === \"typescript\" || value.kernel === \"python\" ? { kernel: value.kernel } : {}),\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 { PI_CORE_TOOL_NAMES } from \"./pi-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 PI_CORE_TOOL_NAMES) {\n const entry = catalog.get(name);\n if (!entry) continue;\n const lines: string[] = [];\n if (entry.definition.promptSnippet) {\n lines.push(`Additional guidance for \\`pi.${name}\\`: ${entry.definition.promptSnippet}`);\n }\n const guidelines = entry.definition.promptGuidelines ?? [];\n if (guidelines.length > 0) {\n lines.push(`Guidelines for \\`pi.${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 type { FabricKernel } from \"../runtime/kernel.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const fabricExecutionKernelGuidance = (fullCodeMode: boolean, kernel: FabricKernel = \"typescript\", pythonRuntime: \"cpython\" | \"monty\" = \"monty\"): string =>\n [\n kernel === \"python\"\n ? `Configured fabric_exec kernel: Python (${pythonRuntime === \"monty\" ? \"Monty sandboxed subset\" : \"CPython\"}). Write Python only in \\`code\\`: top-level await/return, dicts, True/False/None, and asyncio.gather. There is no per-call language switch.`\n : \"Configured fabric_exec kernel: TypeScript. Write TypeScript only in `code`; top-level await and return are supported.\",\n \"The configured kernel is exclusive for Fabric orchestration, including when skills or earlier messages show another language. Do not invoke another interpreter through shell tools or native subprocesses merely to run Fabric orchestration in a different language. Project builds, tests, and explicitly requested interpreter work remain legitimate shell commands.\",\n fullCodeMode\n ? \"Pi Fabric full code mode: `fabric_exec` is the only way to call Pi core tools \u2014 use them as `pi.*` inside `code`.\"\n : \"Pi Fabric is in orchestration-only mode. Pi core and registered extension tools stay on their native direct execution path; inside fabric_exec, `pi.*` 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 ? \"`pi.read`\" : \"`read`\"} tool before responding \u2014 never assume its contents.`,\n ].join(\" \");\n\nexport const defaultFabricExecutionGuidance = (fullCodeMode: boolean, kernel: FabricKernel = \"typescript\", pythonRuntime: \"cpython\" | \"monty\" = \"monty\"): string =>\n kernel === \"python\"\n ? (pythonRuntime === \"monty\"\n ? \"Python backend: Monty sandboxed subset, not CPython. Native filesystem/network/environment access and arbitrary imports are unavailable; use host tools for effects. Supply acyclic JSON host arguments; recursive containers are unsupported. Underscore-prefixed direct capability attributes are unavailable: use tools.call with the exact discovered ref instead. \u03C0 is an attribute object; payloads is a dict, not the same identity. \"\n : \"Python backend: CPython; native standard-library imports are available. \") + \"Python fabric_exec: write an async function body with `await` and `return`; each invocation starts fresh. Use imports supported by the configured backend, such as `import asyncio`. Host methods accept one dict or keyword arguments: `await tools.search(query=\\\"example\\\")`, `await tools.call(ref=\\\"provider.action\\\", args={\\\"key\\\": \\\"value\\\"})`; discover with tools.search instead of enumerating: tools.list is a capped page (default 100, hard cap 1000) with no truncation marker, so a short result never proves an action is absent (tools.list(envelope=True) reports totals). Known actions use mcp.<server>.<tool>, memory.*, state.*, schema.*, compact.*, components.*, agents.*, or mesh.*. Responses are native Python dicts/lists, not attribute objects. Use `asyncio.gather` for independent calls. `\u03C0.key` and `payloads[\\\"key\\\"]` contain only the exact top-level payload keys. Return JSON-compatible data (convert sets, bytes, paths, and datetimes explicitly); print output is bounded. JavaScript callback helpers (workflow, memory.walk, and predicate callbacks) are not Python APIs; page with ordinary await/loops instead. Provider argument validation and approvals remain host-enforced. Schema enforce retains host gates and requires the selected runtime\u2019s isolation; no unrestricted fallback.\" + (fullCodeMode ? \" `await pi.read(\\\"/x\\\")`, `await pi.grep(pattern=\\\"TODO\\\", path=\\\"src\\\")`, `await pi.find(pattern=\\\"*.py\\\", path=\\\"src\\\")`, and `await pi.ls(\\\"src\\\")` return strings. `await pi.bash(command=\\\"ls\\\")`, `await pi.edit(path=\\\"/x\\\", oldText=\\\"a\\\", newText=\\\"b\\\")`, and `await pi.write(path=\\\"/y\\\", content=\u03C0.body)` return dicts; read `r[\\\"output\\\"]`. Shell nonzero exits raise; `settle=True` returns a failure dict instead. Cancellation, timeout, approval and security errors still raise. A nested shell that exceeds executor.shellHangMs still resolves ok with a still-running notice, pid, and live output path; background=True detaches immediately. Detached results include details.taskId; completion notifies this session. Use tools.call(ref='tasks.list', args={}), tasks.get or tasks.stop with {'id': taskId}; pi.read can read the bounded log. Opt-in monitor={'delivery':'wake','match':'literal','timeoutMs':300000,'intervalMs':5000} (choose delivery 'ui' or 'wake') also detaches: UI-only never wakes the agent, wake sends coalesced line events. Monitors expire and are not automatically renewed. Captured tools are `await extensions.<name>(...)`.\" : \" Pi core and extensions are unavailable inside fabric_exec in orchestration-only mode.\")\n : fullCodeMode\n ? \"Examples and returns: `pi.read('/x')`, `pi.grep('TODO','src')` / `pi.grep({pattern:'TODO', path:'src', ignoreCase:true, context:2})`, `pi.find({pattern:'*.ts', path:'src', limit:20})`, and `pi.ls('src')` return strings; `pi.bash({cmd:'ls'})` (or `pi.powershell` on Windows), `pi.edit({path:'/x', old:'a', new:'b'})`, and `pi.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 `pi.bash` or `pi.powershell` to get `{ ok: false, exitCode, output, error }` instead. Timeout, cancellation, approval, and security failures still reject. A nested shell that exceeds `executor.shellHangMs` still resolves `ok: true` with a still-running notice, pid, and live output path; `background: true` detaches immediately. Detached results include `details.taskId`; completion notifies this session, without polling. Use `tools.call({ref:'tasks.list',args:{}})` or `tasks.get`/`tasks.stop` with `{id: taskId}`; `pi.read` can read the bounded log. Opt-in `monitor:{delivery:'ui'|'wake',match:'literal',timeoutMs:300000,intervalMs:5000}` also detaches: UI-only never wakes the agent, wake sends coalesced line events. Monitors expire and are not automatically renewed.\\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. `pi` is the core tools; `\u03C0.<key>` reads named `strings` (not a tool).\"\n : \"Call known actions through `mcp.<sanitized_server>.<sanitized_tool>(args)`, `memory.*`, `state.*`, `schema.*`, `components.*`, `compact.*`, `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 pi 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 pi.* 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 pi.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 pi.edit/write/bash/powershell, 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", "import type { Skill } from \"@earendil-works/pi-coding-agent\";\nimport { formatSkillsForPrompt } from \"./skill-block.js\";\n\nconst SKILL_SECTION_HEADING =\n \"The following skills provide specialized instructions for specific tasks.\";\nconst PI_SKILL_LOAD_INSTRUCTION =\n \"Use the read tool to load a skill's file when the task matches its description.\";\nconst FABRIC_SKILL_LOAD_INSTRUCTION =\n \"Use `pi.read` inside `fabric_exec` to load a skill's file when the task matches its description.\";\nconst CWD_MARKER = \"\\nCurrent working directory:\";\n\nexport const restoreSkillsForFullCodePrompt = (\n systemPrompt: string,\n skills: readonly Skill[],\n fullCodeMode = true,\n): string => {\n const section = formatSkillsForPrompt([...skills]).replace(\n PI_SKILL_LOAD_INSTRUCTION,\n fullCodeMode ? FABRIC_SKILL_LOAD_INSTRUCTION : PI_SKILL_LOAD_INSTRUCTION,\n );\n // Replace the catalog, not just its loader sentence: a previous catalog may\n // advertise skills for a different kernel, including in native-tool mode.\n const start = systemPrompt.indexOf(SKILL_SECTION_HEADING);\n const end = start < 0 ? -1 : systemPrompt.indexOf(\"</available_skills>\", start);\n if (start >= 0 && end >= 0) {\n return systemPrompt.slice(0, start) + section.trimStart() +\n systemPrompt.slice(end + \"</available_skills>\".length);\n }\n if (!section) return systemPrompt;\n\n const cwdIndex = systemPrompt.lastIndexOf(CWD_MARKER);\n if (cwdIndex < 0) return `${systemPrompt}${section}`;\n return `${systemPrompt.slice(0, cwdIndex)}${section}${systemPrompt.slice(cwdIndex)}`;\n};\n", "import { statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { FabricKernel } from \"../runtime/kernel.js\";\n\n// Both trees use identical public names. Contribute only one physical root;\n// Pi resolves skill expansion and relative references from that root.\nexport const fabricSkillPaths = (root: string, kernel: FabricKernel): string[] => {\n const selected = path.join(root, kernel);\n if (!statSync(selected, { throwIfNoEntry: false })?.isDirectory()) {\n throw new Error(`Missing Fabric ${kernel} skill tree: ${selected}. Reinstall Fabric; no other-kernel fallback is available.`);\n }\n return [selected];\n};\n", "import { PI_CORE_TOOL_NAME_SET } from \"./pi-tools.js\";\n\nexport const PROXY_CONTRACT_CUSTOM_TYPE = \"pi-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 (PI_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 * `pi-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 \"@earendil-works/pi-ai\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n ToolCallEvent,\n} from \"@earendil-works/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 ...(left.cacheWrite1h !== undefined || right.cacheWrite1h !== undefined\n ? { cacheWrite1h: (left.cacheWrite1h ?? 0) + (right.cacheWrite1h ?? 0) }\n : {}),\n ...(left.reasoning !== undefined || right.reasoning !== undefined\n ? { reasoning: (left.reasoning ?? 0) + (right.reasoning ?? 0) }\n : {}),\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 pi: Pick<ExtensionAPI, \"getAllTools\">,\n readonly getConfig: () => FabricConfig,\n readonly sessionApprovals: FabricSessionApprovals,\n readonly classifier = new FabricAutoApprovalClassifier(() => getConfig().jev),\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.pi.getAllTools().find((tool) => tool.name === toolName);\n const builtin = metadata?.sourceInfo.source === \"builtin\";\n const provider = builtin ? \"pi\" : \"extensions\";\n return {\n ref: provider + \".\" + toolName,\n provider,\n name: toolName,\n description: metadata?.description ?? \"Direct Pi 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 disableModelInvocation?: 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.disableModelInvocation !== 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 pi.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 } from \"@earendil-works/pi-coding-agent\";\nimport type { TSchema } from \"@earendil-works/pi-ai\";\nimport { Container, Text, type Component } from \"@earendil-works/pi-tui\";\n\ntype AnyToolDefinition = ToolDefinition<any, any, any>;\n\n// Local mirror of the host's defineTool declaration shape (pi 0.84.2):\n// identity at runtime, inference-preserving in the type system.\nconst defineTool = <TParams extends TSchema, TDetails = unknown, TState = any>(\n tool: ToolDefinition<TParams, TDetails, TState>,\n): ToolDefinition<TParams, TDetails, TState> & AnyToolDefinition =>\n tool as ToolDefinition<TParams, TDetails, TState> & AnyToolDefinition;\nimport { arcItemStyled } from \"./ui/arc-group.js\";\nimport type { CodePreviewSettings } from \"./ui/code-preview.js\";\nimport {\n type FabricToolShellDecorator,\n withCodePreviewShell,\n} from \"./ui/code-preview-shell.js\";\nimport { fabricExecTitleHintCached } from \"./ui/fabric-title-hint.js\";\nimport { Type } from \"typebox\";\nimport {\n createFabricPersistedExecutionDetails,\n readFabricExecutionRenderDetails,\n} from \"./audit/index.js\";\nimport { DEFAULT_FABRIC_CONFIG } from \"./config.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 {\n FABRIC_REPEAT_BLOCK,\n FABRIC_REPEAT_WARN,\n FabricRepeatGuard,\n fabricRepeatBlockText,\n fabricRepeatWarnText,\n} from \"./repeat-guard.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, observePiTheme } from \"./ui/highlight.js\";\nimport {\n HiddenRowBorrowingComponent,\n observeResultRows,\n type ResultRowBalance,\n} from \"./ui/row-balance.js\";\nimport { observeAnimationRows, 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;\nconst MAX_FABRIC_CODE_TRANSFER_LINES = 12;\n\ntype FabricRendererState = {\n fabricKernel?: \"typescript\" | \"python\";\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\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 toolKernel = (state: FabricState): \"typescript\" | \"python\" =>\n state.bootstrapped ? state.config.executor?.kernel ?? \"typescript\" : \"typescript\";\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`}`;\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, any> => {\n const python = toolKernel(state) === \"python\";\n const monty = python && state.config.executor.pythonRuntime === \"monty\";\n const repeatGuard = new FabricRepeatGuard(FABRIC_REPEAT_WARN, FABRIC_REPEAT_BLOCK);\n return decorateShell(\n defineTool({\n name: \"fabric_exec\",\n label: \"Fabric\",\n description: python\n ? monty\n ? \"Execute Python through Fabric's configured Monty sandbox. Monty runs a Python subset with VM resource limits, no native filesystem/network/environment access, and only host-mediated tools. Each invocation starts fresh. This is the exclusive model tool path in full code mode and Schema enforce mode.\"\n : \"Execute Python through Fabric\u2019s configured CPython kernel for Pi core tools, MCP, providers, discovery, and extensions. Each call uses a fresh process. Native execution is trusted code; Schema enforce requires OS isolation. This is the exclusive model tool path in full code mode and Schema enforce mode.\"\n : \"Execute type-checked TypeScript through Fabric's configured executor for Pi core 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 promptSnippet:\n \"Pi core tools, MCP, Fabric providers, discovery, and extensions\",\n promptGuidelines: [\n python\n ? \"Batch independent operations in one `fabric_exec` Python program with `asyncio.gather`; await dependent/conditional steps sequentially. Coalesce independent replacements into one `await pi.edit(path=..., edits=[...])`. Return only the compact final JSON-compatible value.\"\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 `pi.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 python\n ? \"Search before reading with `await pi.grep(pattern=..., path=...)` or `await pi.find(pattern=..., path=...)`, then `await pi.read(path=..., offset=..., limit=...)`. Use Python dict syntax, `True`/`False`/`None`, and bounded searches; unbounded reads cap at 2000 lines or 50KB. Read continuation notices when needed.\"\n : \"Search before reading: use `pi.grep`/`pi.find` to locate relevant lines, then `pi.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 `pi.read` returns at most 2000 lines or 50KB and, when truncated, ends with a `Use offset=\u2026` continuation notice; reserve whole-file reads for small files you will use in full.\",\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 python\n ? \"For test/probe nonzero exits, use `await pi.bash(command=..., settle=True)` and inspect the returned dict: `r['ok']`, `r['output']`, and `r.get('exitCode')`. Set shell `timeout` in seconds once for long suites. Return decisions and evidence rather than raw logs.\"\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 `pi.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 `\u03C0.key` must exactly match a key there; prefer `pi.edit`/`pi.write`. `pi.bash`: no stdin.\",\n \"Use `display.name` and objective `display.description`; Fabric pairs them with verified outcomes in deterministic compaction.\",\n ...(monty ? [\"Monty requires acyclic JSON host arguments. For underscore-prefixed provider/tool names, use `await tools.call(ref=..., args={...})`, not direct attributes. Use `payloads['key']` for private/non-identifier payload keys.\"] : []),\n ],\n // The model-facing schema is intentionally flat: one large `code` string\n // plus scalar/optional params. Do not add nested arrays-of-objects with\n // escaped content here. SOTA models are post-trained on one dominant\n // harness's flat tool shapes and can invent trailing keys at the\n // highest-entropy point of a nested escaped-JSON field, which a strict\n // schema hard-rejects. Keep this surface string/scalar-heavy; the only\n // nested field (display) ignores unknown keys. See\n // lucumr.pocoo.org/2026/7/4/better-models-worse-tools/ and pi-tool-repair.\n // display also accepts a bare (or JSON-object) string, silently repaired\n // to { name } via normalizeRunDisplay: flash-tier models cold-start with\n // that near-miss, and repairing beats a zero-work rejection round trip.\n // payloads is the remaining nested map (legacy alias: strings). The old\n // name collides with the JSON string type, so models stringify it;\n // prepareArguments remaps `strings` and parses a JSON-object string\n // back to Record<string, string> before Pi validates.\n parameters: Type.Object({\n code: Type.String({\n description: python\n ? monty\n ? \"Python async function body executed by Monty, a sandboxed Python subset (not CPython). Top-level await/return and asyncio.gather are supported. Use only Monty's supported syntax/modules; native imports, filesystem, network, and environment are unavailable. Host globals: tools, mcp, memory, state, schema, compact, components, agents, mesh; full-code mode adds pi and extensions. Await dict/keyword calls; use native dict results r['output']. Payloads: \u03C0.key or payloads['key']. Return JSON-compatible data; each invocation starts fresh.\"\n : \"Python async function body executed by CPython. Top-level await and return are supported; standard-library imports are available. Globals: tools, mcp, memory, state, schema, compact, components, agents, mesh; full-code mode adds pi and extensions. Await host calls using a dict or keyword arguments. Results are native dicts/lists: r['output'], not r.output. Use asyncio.gather for concurrency. Named payloads are \u03C0.key or payloads['key']. Return a JSON-compatible value. Each call starts fresh.\"\n : \"TypeScript function body. Top-level await and return are supported. Globals include `tools`, `mcp`, `memory`, `state`, `schema`, `compact`, `agents`, `mesh`, `print`, and `\u03C0`; full-code mode adds `pi` and `extensions`. `\u03C0` contains only the exact keys supplied by this call's `payloads`. See session guidance / `fabric-exec` skill for exact signatures.\",\n }),\n payloads: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n description:\n \"Named payloads exposed under the same exact name as \u03C0.key (for example, payloads.contract becomes \u03C0.contract). Never reference a \u03C0 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 ...(python ? {} : {\n tokenBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional token budget observed by workflow.agent() calls\",\n }),\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 // Pi 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 prepareArguments(args) {\n return prepareFabricExecArguments(args, toolKernel(state)) as any;\n },\n renderCall(params, theme, context) {\n observePiTheme(theme);\n const code = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const mode = toolDisplayMode(state);\n const rendererState = context.state as FabricRendererState;\n const python = (rendererState.fabricKernel ?? toolKernel(state)) === \"python\";\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 = python ? [] : fabricWriteBindings(code);\n }\n // The write argument preview is a streaming affordance: it previews\n // pending writes while args are still arriving. Pi 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 strings: resolveFabricExecPayloads(params),\n expanded: context.expanded,\n cwd: context.cwd,\n settings: codePreviewSettings,\n spinner,\n },\n theme,\n context.invalidate,\n );\n // Pi's 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 // The kernel-aware memo serves the live card, activity and compaction.\n const title = display?.name?.trim()\n || (fabricExecTitleHintCached(code, python ? \"python\" : \"typescript\")\n ?? (python ? \"Python program\" : undefined));\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 observeAnimationRows(composite, rendererState.fabricSpinner ??= {});\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\", `${python ? \"Python\" : \"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 observeAnimationRows(composite, rendererState.fabricSpinner ??= {});\n },\n renderResult(result, { expanded, isPartial }, theme, context) {\n observePiTheme(theme);\n const details = readFabricExecutionRenderDetails(result.details);\n let audits = restoreLegacyBashCommands(\n details.audits as FabricRenderAudit[],\n context.args,\n );\n const rendererState = context.state as FabricRendererState;\n const recordedKernel = details.kernel ?? (isPartial ? undefined : \"typescript\");\n if (recordedKernel && rendererState.fabricKernel !== recordedKernel) {\n const renderedKernel = rendererState.fabricKernel ?? toolKernel(state);\n rendererState.fabricKernel = recordedKernel;\n delete rendererState.fabricWriteBindingsCode;\n if (renderedKernel !== recordedKernel) context.invalidate();\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 observeAnimationRows(inheritComponentBackground(component), rendererState.fabricSpinner ??= {}),\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 `strings` \u2192 `payloads`\n // and quotes unquoted pi path arguments before Pi validates this call;\n // keep the same coercion here for direct internal invocations.\n const joined = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const code = state.config.executor.kernel === \"python\" ? joined : repairFabricGuestCode(joined);\n const repeat = repeatGuard.observe(code);\n if (repeat.blocked) {\n return {\n content: [{ type: \"text\", text: fabricRepeatBlockText(repeat.count) }],\n isError: true,\n details: undefined,\n };\n }\n const runDisplay = normalizeRunDisplay(params.display);\n const strings = resolveFabricExecPayloads(params);\n const tokenBudget = \"tokenBudget\" in params && typeof params.tokenBudget === \"number\"\n ? params.tokenBudget : undefined;\n const result = await state.execution.execute({\n code,\n ...(strings ? { strings } : {}),\n signal,\n parentToolCallId: toolCallId,\n context,\n ...(tokenBudget !== undefined ? { tokenBudget } : {}),\n ...(params.agentBudget !== undefined ? { maxAgentCalls: params.agentBudget } : {}),\n ...(params.timeoutMs !== undefined ? { requestedTimeoutMs: params.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 params.resultFormat ?? state.config.executor.resultFormat;\n const boundarySessionId = context.sessionManager.getSessionId();\n const pendingHandoff = await state.claimHandoff(\n result,\n boundarySessionId,\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 // The nudge budget is spent and the arm still has no plan: the handoff\n // proceeds rather than stalling the session, and that is worth saying.\n if (pendingHandoff.readiness?.kind === \"unplanned\") {\n context.ui.notify(\n `Prewalk: handing off without a recorded plan after ${pendingHandoff.readiness.prompts} reminders.`,\n \"warning\",\n );\n }\n } else if (state.prewalk.planRequired(boundarySessionId)) {\n // This boundary was withheld because the plan is still owed. Reflect the\n // planning phase instead of leaving the footer reading \"armed\".\n const prewalkStatus = state.prewalk.status();\n context.ui.setStatus(\n \"fabric-prewalk\",\n prewalkStatus.state === \"armed\" ? `plan awaited \u2192 ${prewalkStatus.model}` : undefined,\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 if (repeat.warn) fullSections.push(fabricRepeatWarnText(repeat.count, FABRIC_REPEAT_BLOCK));\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 if (repeat.warn) sections.push(fabricRepeatWarnText(repeat.count, FABRIC_REPEAT_BLOCK));\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 persistedRenderDetails = () =>\n createFabricPersistedExecutionDetails({\n ...result,\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 // In-place prewalk continuation arrives as an in-band context message on\n // this boundary turn, so the loop must keep running: the executor's first\n // request follows naturally. Terminating here would strand the\n // continuation \u2014 no queued turn remains to carry it.\n const inPlaceContinuation = pendingHandoff?.kind === \"prewalk-in-place\";\n const terminate =\n !inPlaceContinuation &&\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 `pi.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 // pi 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 // Images the guest returned directly, hoisted out of the text channels by\n // the media sanitizer; their descriptors remain in the text.\n for (const block of result.media ?? []) mediaBlocks.push(block);\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 pi'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 pi 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 pi 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};\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 type { FabricKernel } from \"./runtime/kernel.js\";\nimport { normalizeRunDisplay } from \"./run-display.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\n\nconst OPTIONAL_FABRIC_EXEC_KEYS = [\n \"payloads\",\n \"strings\",\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 looksLikeJsonObject = (text: string): boolean =>\n text.startsWith(\"{\") && text.endsWith(\"}\");\n\nconst looksLikeJsonString = (text: string): boolean =>\n text.startsWith('\"') && text.endsWith('\"');\n\nconst parseJsonObject = (text: string): Record<string, unknown> | undefined => {\n const trimmed = text.trim();\n if (!looksLikeJsonObject(trimmed) && !looksLikeJsonString(trimmed)) return undefined;\n try {\n let parsed: unknown = JSON.parse(trimmed);\n // One extra unwrap: models sometimes JSON-encode the object twice.\n if (typeof parsed === \"string\") {\n const inner = parsed.trim();\n if (!looksLikeJsonObject(inner)) return undefined;\n parsed = JSON.parse(inner);\n }\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst asStringRecord = (record: Record<string, unknown>): Record<string, string> | undefined => {\n if (Object.values(record).some((value) => typeof value !== \"string\")) return undefined;\n return record as Record<string, string>;\n};\n\n// Silent repair for the named-payload map. The declared shape is\n// Record<string, string>, but models stringify nested maps (the highest-entropy\n// escaped field in an otherwise flat tool), which strict schema validation\n// rejects at the cost of a zero-work round trip. `strings` is a legacy alias:\n// the name collides with the JSON string type and taught models to pass one.\nconst normalizeFabricExecStrings = (\n input: unknown,\n): Record<string, string> | undefined => {\n if (isRecord(input)) return asStringRecord(input);\n if (typeof input !== \"string\") return undefined;\n const parsed = parseJsonObject(input);\n return parsed ? asStringRecord(parsed) : undefined;\n};\n\nexport const resolveFabricExecPayloads = (params: {\n payloads?: unknown;\n strings?: unknown;\n}): Record<string, string> | undefined =>\n normalizeFabricExecStrings(params.payloads) ?? normalizeFabricExecStrings(params.strings);\n\nexport const prepareFabricExecArguments = (input: unknown, kernel: FabricKernel = \"typescript\"): unknown => {\n if (typeof input === \"string\") return { code: kernel === \"python\" ? input : repairFabricGuestCode(input) };\n if (!isRecord(input)) return input;\n\n let prepared = input;\n const writable = (): Record<string, unknown> => {\n if (prepared === input) prepared = { ...input };\n return prepared;\n };\n\n if (Array.isArray(prepared.code) && prepared.code.every((line) => typeof line === \"string\")) {\n writable().code = prepared.code.join(\"\\n\");\n }\n if (kernel === \"typescript\" && typeof prepared.code === \"string\") {\n const repaired = repairFabricGuestCode(prepared.code);\n if (repaired !== prepared.code) writable().code = repaired;\n }\n\n for (const key of OPTIONAL_FABRIC_EXEC_KEYS) {\n if (!Object.hasOwn(prepared, key)) continue;\n if (prepared[key] === null || prepared[key] === undefined) delete writable()[key];\n }\n\n const display = prepared.display;\n if (typeof display === \"string\" || isRecord(display)) {\n const normalized = normalizeRunDisplay(display);\n if (normalized) writable().display = normalized;\n else delete writable().display;\n }\n\n const hasPayloads = Object.hasOwn(prepared, \"payloads\");\n const hasStrings = Object.hasOwn(prepared, \"strings\");\n if (hasPayloads || hasStrings) {\n const raw = hasPayloads ? prepared.payloads : prepared.strings;\n const normalized = normalizeFabricExecStrings(raw);\n if (normalized) {\n if (prepared.payloads !== normalized) writable().payloads = normalized;\n } else if (!hasPayloads) {\n writable().payloads = raw;\n }\n if (hasStrings) delete writable().strings;\n }\n\n return prepared;\n};\n", "/**\n * Degenerate-loop breaker for fabric_exec. Identical guest code back-to-back\n * is how lower-tier models burn a session (2026-09-15: 220x `bash echo noop`\n * on glm-5.3-flash). Display names and payload cosmetics are deliberately\n * excluded from the fingerprint: cosmetic variation is part of the loop\n * signature, not evidence of new work. Any differing code resets the count.\n */\nexport const FABRIC_REPEAT_WARN = 3;\nexport const FABRIC_REPEAT_BLOCK = 6;\n\nexport const fabricRepeatWarnText = (count: number, blockAt: number): string =>\n `[circuit-breaker] identical fabric_exec code has now run ${count} times in a row; at ${blockAt} identical runs will be blocked. Change the approach or finish your turn.`;\n\nexport const fabricRepeatBlockText = (count: number): string =>\n `Circuit breaker: this exact fabric_exec code has now executed ${count} times in a row and was blocked. Re-running identical code adds no information. Summarize what you already know and finish your turn; if the call is genuinely required, change the code materially.`;\n\nexport class FabricRepeatGuard {\n #code: string | undefined;\n #count = 0;\n\n constructor(\n /** Consecutive identical executions that start producing a warning. */\n readonly warnAt: number,\n /** Consecutive identical executions that get blocked outright. */\n readonly blockAt: number,\n ) {}\n\n observe(code: string): { count: number; blocked: boolean; warn: boolean } {\n this.#count = code === this.#code ? this.#count + 1 : 1;\n this.#code = code;\n return { count: this.#count, blocked: this.#count >= this.blockAt, warn: this.#count >= this.warnAt };\n }\n}\n", "import {\n GUEST_TYPE_DECLARATIONS,\n PI_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 PI_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES;\n\nexport const CORE_TOOL_NAMES: readonly CoreToolName[] = Object.keys(\n PI_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: PiEditOperation[]; 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(Pi[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 Pi* 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 `Pi${capitalise(tool)}Argument`,\n PI_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES[tool],\n `Pi${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 = /\\bpi\\.(?:edit|write)\\s*\\(/;\nconst UNQUOTED_PATH_HEAD =\n /\\bpi\\.(?: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 PI_CALL_PATTERN = /\\bpi\\.(\\w+)\\s*\\(/g;\n\n// fabric_exec envelope arguments that are commonly misplaced inside `code`.\nconst FABRIC_EXEC_ARGUMENT_NOTES: Readonly<Record<string, string>> = {\n payloads:\n \"named `payloads` belong in the outer `fabric_exec` arguments, then become available inside `code` as `\\u03c0.key`.\",\n strings:\n \"`strings` is an alias for outer `payloads`; named values belong in the outer `fabric_exec` arguments, then become available inside `code` as `\\u03c0.key`.\",\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:\n \"`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 `pi.*` calls reject failures normally.\",\n timeout: \"`timeout` is measured in seconds; `timeoutMs` is converted from milliseconds.\",\n background:\n \"`background: true` detaches immediately: the await returns ok:true with a still-running notice, pid, and live output path. Do not poll; `pi.read` the path when you need output.\",\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 \"Pi shell tools do not accept `stdin`. Write the content with `pi.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. 'PiCommandArgument &\n// PiBashOptions'); strip alias suffixes to recover the called tool.\nconst toolFromTypeText = (typeText: string): string | undefined => {\n for (const match of typeText.matchAll(/\\bPi([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. 'PiPathArgument'): find\n// the `pi.<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 PI_CALL_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n let tool: string | undefined;\n while ((match = PI_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\" || tool === \"powershell\") {\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 \\`pi.${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) => `\\`pi.${owner}\\``).join(\", \");\n const note = PROPERTY_NOTES[property];\n return `Recovery hint: \\`${property}\\` is not a \\`pi.${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 `\\u03c0.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. `pi.read('/x')` or `pi.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 `\\u03c0.key` instead of escaping it inside `code`.\";\n};\n", "import { truncateToWidth, type Component } from \"@earendil-works/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): 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 (pi'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): 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 fs from \"node:fs/promises\";\nimport { closeScratch, createScratch } from \"./storage/scratch.js\";\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 = createScratch(\"output\");\n try {\n const artifactPath = path.join(directory, \"output.txt\");\n await fs.writeFile(artifactPath, content, { encoding: \"utf8\", mode: 0o600, flag: \"wx\" });\n closeScratch(directory);\n return artifactPath;\n } catch (error) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n throw error;\n }\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 body = truncateMiddle(visible, bodyBudget);\n let text = `${body}${suffix}`;\n if (text.length > maxChars) {\n // The suffix carries the artifact path; shrink the body again instead of\n // cutting into the path. A truncation marker can itself exceed a tiny\n // rebudget, so fall back to the bare suffix (or its tail), which always\n // fits and still ends with the path.\n const rebudget = maxChars - suffix.length;\n if (rebudget <= 0) {\n text = suffix.slice(-Math.max(1, maxChars));\n } else {\n const shrunk = truncateMiddle(body, rebudget);\n text = shrunk.length + suffix.length <= maxChars ? `${shrunk}${suffix}` : suffix;\n }\n }\n return {\n text,\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 \"@earendil-works/pi-coding-agent\";\nimport { resolveAgentDir } from \"./core/agent-dir.js\";\nimport type { ExtensionAPI } from \"@earendil-works/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 } from \"./fabric-runtime-state.js\";\nimport type { FabricRuntimePaths } from \"./runtime-paths.js\";\nimport type { FabricLoadedFileIdentity } from \"./build-identity.js\";\n\nimport { FabricManagedHost, type FabricManagedHostOptions } from \"./managed-host.js\";\n\nexport interface FabricStateOptions {\n managedHost?: FabricManagedHostOptions;\n paths?: FabricRuntimePaths;\n runtimeLoader?: () => Promise<typeof import(\"./fabric-runtime-state.js\")>;\n entryIdentity?: FabricLoadedFileIdentity;\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 #kernelReloadRequired = false;\n\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 #managedHost: FabricManagedHost | undefined;\n readonly #entryIdentity: FabricLoadedFileIdentity | undefined;\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 pi: ExtensionAPI,\n readonly capturedTools: CapturedToolCatalog,\n options: FabricStateOptions = {},\n ) {\n this.#options = options;\n this.#managedHost = options.managedHost ? new FabricManagedHost(options.managedHost) : undefined;\n this.#entryIdentity = options.entryIdentity;\n }\n\n get kernelReloadRequired(): boolean {\n return this.#kernelReloadRequired;\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(\"Pi 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 shellJobs(): FabricRuntimeState[\"shellJobs\"] | undefined { return this.#runtime?.shellJobs; }\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 = this.#managedHost?.config() ?? loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#config = config;\n this.#kernelReloadRequired = false;\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 const next = this.#managedHost?.config() ?? loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#kernelReloadRequired = next.executor.kernel !== this.#config.executor.kernel;\n next.executor.kernel = this.#config.executor.kernel;\n this.#config = next;\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.PI_FABRIC_CAPABILITY_REQUIREMENTS !== undefined &&\n Boolean(process.env.PI_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.PI_FABRIC_PROJECT_ROOT ?? context.cwd;\n const meshRoot = process.env.PI_FABRIC_MESH_ROOT ??\n (this.config.mesh.root\n ? path.resolve(projectRoot, this.config.mesh.root)\n : path.join(projectRoot, \".pi\", \"fabric\", \"mesh\"));\n const fabricSessionId = process.env.PI_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 get advisorsHalted(): boolean { return this.#current()?.advisorsHalted ?? false; }\n haltAdvisors(): number { return this.#current()?.haltAdvisors() ?? 0; }\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 (this.#managedHost) {\n this.#managedHost.register(provider, options.overwrite);\n return;\n }\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 (this.#managedHost) throw new Error(\"Managed host component registration is disabled\");\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 = this.#managedHost?.config() ?? loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n if (this.#config) {\n // Pi skill discovery is additive. Keep execution aligned with the loaded\n // skill tree until Pi reload creates a fresh extension/resource runtime.\n this.#kernelReloadRequired = next.executor.kernel !== this.#config.executor.kernel;\n next.executor.kernel = this.#config.executor.kernel;\n next.schema.mode = this.#config.schema.mode;\n // Isolate the selected language, including when a live schema override\n // differs from disk. CPython selects its OS sandbox at execution time.\n if (next.schema.mode === \"enforce\" && next.executor.kernel === \"typescript\") {\n next.executor.runtime = \"quickjs\";\n }\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.#managedHost) throw new Error(\"Managed host policy is immutable\");\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 if (this.#config.executor.kernel === \"typescript\") 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 ?? disk).executor.kernel === \"python\"\n ? (this.#config ?? disk).executor.pythonRuntime\n : this.#config?.executor.runtime ?? disk.executor.runtime,\n };\n }\n\n #diskConfig(context: ExtensionContext): FabricConfig {\n if (this.#managedHost) return this.#managedHost.config();\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 await this.#managedHost?.close();\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(\"Pi 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 // Bootstrap stays cheap and may precede first use by minutes. Refresh only\n // the component plane here; executor/language policy remains bootstrapped.\n if (!this.#managedHost && !reinitialize) {\n const { FabricComponentConfiguration } = await import(\"./components/configuration.js\");\n try {\n config.components = new FabricComponentConfiguration({\n cwd: context.cwd, agentDir: resolveAgentDir(), projectTrusted: () => context.isProjectTrusted(),\n }).read().entries;\n } catch (error) {\n // Keep the bootstrapped manifest usable for repair. The live control\n // plane records this read failure and watches for a corrected file.\n if (context.hasUI) context.ui.notify(`Pi Fabric component configuration not applied: ${error instanceof Error ? error.message : String(error)}`, \"error\");\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.pi,\n this.capturedTools,\n {\n ...(this.#managedHost ? {managedHost: this.#managedHost} : {}),\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.#entryIdentity ? { entryIdentity: this.#entryIdentity } : {}),\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(\"Pi Fabric has not activated\");\n return runtime;\n }\n}\n", "import { DEFAULT_FABRIC_CONFIG, type FabricConfig } from \"./config.js\";\nimport { createProviderComponent, type FabricProviderComponent } from \"./components/provider-component.js\";\nimport type { FabricProvider } from \"./protocol.js\";\n\nconst REPLACEABLE = new Set([\"agents\", \"memory\", \"compact\", \"schema\", \"state\", \"mesh\", \"mcp\"]);\nexport interface FabricManagedHostOptions {\n /** Host code only; never read from project/global configuration or the provider event payload. */\n providers: readonly string[];\n}\n\n/** Closed-world provider authority for embedded hosts. Native providers cannot return on reload. */\nexport class FabricManagedHost {\n readonly #allowed: Set<string>;\n readonly #providers = new Map<string, FabricProvider>();\n readonly #retired = new Set<FabricProvider>();\n #sealed = false;\n constructor(options: FabricManagedHostOptions) {\n this.#allowed = new Set(options.providers);\n for (const name of this.#allowed) if (!REPLACEABLE.has(name)) throw new Error(`Managed host cannot replace provider: ${name}`);\n }\n register(provider: FabricProvider, overwrite = false): void {\n if (!this.#allowed.has(provider.name)) throw new Error(`Managed host provider not authorized: ${provider.name}`);\n const previous = this.#providers.get(provider.name);\n if (previous === provider) return;\n if (this.#sealed) throw new Error(\"Managed provider authority is sealed; create a new host to replace it\");\n if (previous && !overwrite) throw new Error(`Fabric provider already registered: ${provider.name}`);\n if (previous) this.#retired.add(previous);\n this.#providers.set(provider.name, provider);\n }\n seal(): void {\n for (const name of this.#allowed) if (!this.#providers.has(name)) throw new Error(`Managed host provider missing: ${name}`);\n this.#sealed = true;\n }\n has(name: string): boolean { return this.#allowed.has(name); }\n /** Only sealed, live host providers delegate effect approval to the host broker. */\n ownsProvider(name: string): boolean { return this.#sealed && this.#providers.has(name); }\n provider(name: string): FabricProvider {\n const source = this.#providers.get(name);\n if (!source) return {name, description: \"Unavailable in managed host\", list: async () => [], describe: async () => undefined, invoke: async () => {throw new Error(`Managed host provider unavailable: ${name}`);}};\n // Components own publication, while the host owns the supplied object's lifetime. Reload does\n // not close then reuse it; final host shutdown awaits close exactly once after withdrawal.\n return {name, description: source.description, list: source.list.bind(source), describe: source.describe.bind(source), invoke: source.invoke.bind(source),\n ...(source.prepareArguments ? {prepareArguments: source.prepareArguments.bind(source)} : {}),\n ...(source.acquire ? {acquire: source.acquire.bind(source)} : {}),\n ...(source.invocationEnded ? {invocationEnded: source.invocationEnded.bind(source)} : {}),\n ...(source.subscribeCatalog ? {subscribeCatalog: source.subscribeCatalog.bind(source)} : {}),\n };\n }\n component(component: FabricProviderComponent): FabricProviderComponent {\n const name = component.definition.provides?.[0];\n if (typeof name !== \"string\" || name === \"pi\" || name === \"extensions\") return component;\n return createProviderComponent({provider: name, description: \"Managed host provider\", create: () => this.provider(name)});\n }\n config(): FabricConfig {\n const config = structuredClone(DEFAULT_FABRIC_CONFIG);\n config.fullCodeMode = true;\n config.executor.kernel = \"typescript\";\n config.executor.runtime = \"quickjs\";\n config.mcp.enabled = false;\n config.mcp.allowDynamicServers = false;\n config.mesh.enabled = false;\n config.agents.enabled = false;\n config.agents.sessionExport = false;\n config.prewalk.enabled = false;\n config.memory.enabled = false;\n config.repairs.enabled = false;\n config.entropy.compile = false;\n config.speculation.enabled = false;\n config.ui.enabled = false;\n config.schema.mode = \"off\";\n config.schema.trustedCommands = {};\n config.components = [];\n config.compaction.engine = \"fabric\";\n config.approvals = {...config.approvals, read: \"allow\", write: \"allow\", execute: \"allow\", agent: \"allow\", network: \"deny\"};\n return config;\n }\n async close(): Promise<void> {\n const providers = new Set([...this.#providers.values(), ...this.#retired]);\n this.#providers.clear(); this.#retired.clear();\n await Promise.all([...providers].map((provider) => provider.close?.()));\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 STRINGS_OBJECT = /strings: 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 \"powershell\",\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 (STRINGS_OBJECT.test(text)) {\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:strings: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\", \"pi.bash\", \"powershell\", \"pi.powershell\"].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_PI_HOST_VERSION = \"0.80.6\";\n\nconst PI_HOST_PACKAGE_NAMES = new Set([\n \"@earendil-works/pi-coding-agent\",\n \"@mariozechner/pi-coding-agent\",\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 detectPiHostVersion = (\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 PI_HOST_PACKAGE_NAMES.has(manifest.name) &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Keep walking when a parent package manifest is unreadable.\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\nexport const piHostCompatibilityWarning = (\n version: string | undefined = detectPiHostVersion(),\n): string | undefined => {\n if (!version) return undefined;\n const comparison = compareVersions(version, MINIMUM_PI_HOST_VERSION);\n if (comparison === undefined || comparison >= 0) return undefined;\n return \"Pi Fabric requires Pi >= \" + MINIMUM_PI_HOST_VERSION + \"; detected \" + version + \". Actor triggerTurn and other host continuations may be ignored. Upgrade Pi before relying on actor delivery.\";\n};\n", "import path from \"node:path\";\nimport { resolveAgentDir } from \"../core/agent-dir.js\";\nimport * as piConversationHost from \"@earendil-works/pi-coding-agent\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { TUI } from \"@earendil-works/pi-tui\";\nimport type { CodePreviewSettings } from \"./code-preview.js\";\nimport type { FabricConversationState, FabricConversationTarget, 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, FabricDashboardSnapshotCache } 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 = \"pi-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: \"pi\",\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 #shellUnsubscribe: (() => void) | undefined;\n #tasksOpen = false;\n #tasksView: import(\"./shell-tasks.js\").ShellTasksView | undefined;\n #closeTasks: (() => 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 #activityView: ((detailed?: boolean) => FabricActivityRun[]) | undefined;\n readonly #transcripts = new AgentTranscriptReader();\n readonly #conversationReaders = new Map<string, NativeConversationReader>();\n #activeConversationReader: string | undefined;\n readonly #snapshotCache = new FabricDashboardSnapshotCache();\n #refreshGeneration = 0;\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.#shellUnsubscribe = this.state.shellJobs?.subscribe(() => this.#scheduleRefresh());\n this.#refresh();\n this.#schedulePoll();\n }\n\n stop(): void {\n this.#epoch++;\n this.#closeTasks?.();\n this.#closeTasks = undefined;\n this.#tasksView?.dispose();\n this.#tasksView = undefined;\n this.#tasksOpen = false;\n this.#shellUnsubscribe?.();\n this.#shellUnsubscribe = undefined;\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.#activityView = undefined;\n this.#transcripts.clear();\n for (const reader of this.#conversationReaders.values()) reader.clear();\n this.#conversationReaders.clear();\n this.#activeConversationReader = undefined;\n this.#snapshotCache.clear();\n }\n\n /** True while Fabric owns keyboard input, including asynchronous view setup. */\n get ownsInput(): boolean {\n return this.#dashboardOpen || this.#conversationOpen || this.#tasksOpen;\n }\n\n async openTasks(context: ExtensionContext, query?: string): Promise<void> {\n if (this.ownsInput) return;\n const jobs = this.state.shellJobs;\n if (!jobs) { context.ui.notify(\"No shell task store in this session\", \"info\"); return; }\n const candidates = query ? jobs.list().filter(job => job.id === query || job.id.startsWith(query)) : [];\n if (query && candidates.length !== 1) { context.ui.notify(\"Task ID is unknown or ambiguous\", \"warning\"); return; }\n if (context.mode !== \"tui\") {\n context.ui.notify(JSON.stringify(query ? candidates[0] : jobs.list(), null, 2), \"info\");\n return;\n }\n if (!this.state.config.ui.enabled) { context.ui.notify(\"The Fabric UI is disabled by ui.enabled\", \"warning\"); return; }\n if (!this.#context) this.start(context);\n this.#tasksOpen = true;\n const epoch = this.#epoch;\n try {\n const { ShellTasksView } = await import(\"./shell-tasks.js\");\n if (epoch !== this.#epoch) return;\n await context.ui.custom<void>((tui, theme, _keys, done) => {\n this.#closeTasks = () => done();\n const id = candidates[0]?.id;\n this.#tasksView = new ShellTasksView({ jobs, theme, done: () => done(), requestRender: () => tui.requestRender(),\n rows: () => tui.terminal?.rows ?? 24, ...(id ? { id } : {}) });\n return this.#tasksView;\n }, { overlay: true, overlayOptions: { width: \"94%\", maxHeight: \"90%\", anchor: \"center\", margin: 1 } });\n } finally {\n if (epoch === this.#epoch) {\n this.#tasksView?.dispose();\n this.#tasksView = undefined;\n this.#closeTasks = undefined;\n this.#tasksOpen = false;\n }\n }\n }\n\n async openConversation(context: ExtensionContext, query?: string): Promise<void> {\n if (this.#tasksOpen) return;\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 // Native lazy imports cannot see Pi's extension-loader aliases/virtual modules.\n const { initializeConversationHost } = await import(\"./conversation-host.js\");\n if (epoch !== this.#epoch) return;\n initializeConversationHost(piConversationHost);\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 let sourceAgents: FabricUiAgent[] | undefined;\n let sourceActors: FabricUiActor[] | undefined;\n let agentsById = new Map<string, FabricUiAgent>();\n let actorsById = new Map<string, FabricUiActor>();\n let targetDomains: unknown[] = [];\n let baseTargets: FabricConversationTarget[] = [];\n let enrichedTargets: FabricConversationTarget[] = [];\n let targetsById = new Map<string, FabricConversationTarget>();\n let modelGeneration = -1;\n let modelWindows = new Map<string, number | undefined>();\n const targets = (): FabricConversationTarget[] => {\n const snapshot = this.#snapshot;\n const domains = [snapshot.main, snapshot.agents, snapshot.actors, snapshot.peers, snapshot.participants];\n const changed = domains.some((domain, index) => domain !== targetDomains[index]);\n if (changed) {\n targetDomains = domains;\n baseTargets = conversationTargets(snapshot);\n }\n if (changed || modelGeneration !== this.#refreshGeneration) {\n modelGeneration = this.#refreshGeneration;\n const windows = new Map<string, number | undefined>();\n for (const target of baseTargets) {\n if (!target.model || windows.has(target.model)) continue;\n const split = target.model.indexOf(\"/\");\n if (split < 1) continue;\n windows.set(target.model, context.modelRegistry?.find?.(\n target.model.slice(0, split), target.model.slice(split + 1),\n )?.contextWindow);\n }\n if (changed || windows.size !== modelWindows.size ||\n [...windows].some(([model, window]) => modelWindows.get(model) !== window)) {\n enrichedTargets = baseTargets.map((target) => {\n const contextWindow = target.model ? windows.get(target.model) : undefined;\n return contextWindow !== undefined ? { ...target, contextWindow } : target;\n });\n targetsById = new Map(enrichedTargets.map((target) => [target.id, target]));\n }\n modelWindows = windows;\n }\n return enrichedTargets;\n };\n const source = (id: string): NativeConversationSource => {\n if (sourceActors !== this.#snapshot.actors) {\n sourceActors = this.#snapshot.actors;\n actorsById = new Map(sourceActors.map((actor) => [actor.id, actor]));\n }\n if (sourceAgents !== this.#snapshot.agents) {\n sourceAgents = this.#snapshot.agents;\n agentsById = new Map(sourceAgents.map((agent) => [agent.id, agent]));\n }\n const actor = actorsById.get(id);\n if (actor) return { ...this.#actorTranscriptSource(actor), id, ...(actor.sessionFile ? { sessionFile: actor.sessionFile } : {}) };\n const agent = agentsById.get(id);\n return agent ? this.#agentTranscriptSource(agent) : { id, status: \"unavailable\" };\n };\n const readerFor = (id: string): NativeConversationReader => {\n if (this.#activeConversationReader !== id) this.#suspendConversationReader();\n this.#activeConversationReader = id;\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 targets();\n const target = targetsById.get(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 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,\n onTargetChange: (id) => {\n if (this.#activeConversationReader !== id) this.#suspendConversationReader();\n },\n appearance: readConversationAppearance(context.cwd, resolveAgentDir(), context.isProjectTrusted?.() ?? false),\n ...(initialTarget ? { initialTargetId: initialTarget.id } : {}),\n state: this.#conversationState!,\n keybindings,\n rendererOptions: this.conversationRenderers,\n queueEvents: this.state.pi?.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.#suspendConversationReader();\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 modelSource = buildModelSource(context.modelRegistry, resolveAgentDir());\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.shells?.some(job => job.finishedAt === undefined || Date.now() - job.finishedAt < 30000) ||\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(false);\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 #suspendConversationReader(): void {\n if (!this.#activeConversationReader) return;\n const reader = this.#conversationReaders.get(this.#activeConversationReader);\n // Readers retain lightweight loaded-range bookmarks. Never clear as a\n // fallback: that would lose pinned history or unavailable-file content.\n (reader as (NativeConversationReader & { suspend?: () => void }) | undefined)?.suspend?.();\n this.#activeConversationReader = undefined;\n }\n\n #refresh(force = true): 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 if (!this.#activityView && typeof this.state.activity.createRunView === \"function\") {\n this.#activityView = this.state.activity.createRunView();\n }\n this.#activityRuns = this.#activityView\n ? this.#activityView(detailed)\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 if (force || this.#dashboardOpen) this.#snapshotCache.clear();\n this.#refreshGeneration++;\n this.#snapshot = createDashboardSnapshot(\n this.state,\n this.#events,\n context,\n this.#activityRuns,\n this.#dashboardOpen ? undefined : this.#snapshotCache,\n this.#activityView !== undefined,\n );\n this.#renderWidget(context);\n // Read the native source even when manager metadata is unchanged: log\n // appends and pinned-window growth do not require a status revision.\n if (this.#conversationTui && this.#conversationView?.refresh?.() !== false) {\n this.#conversationTui.requestRender();\n }\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(\n theme,\n () => this.#snapshot,\n config.maxRows,\n () => tui.terminal?.rows ?? process.stdout.rows,\n );\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 { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionContext } from \"@earendil-works/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\n/** Poll-only memoization. Event-driven refreshes and dispatch bypass this cache. */\nexport class FabricDashboardSnapshotCache {\n private inputs: unknown;\n private snapshot: FabricDashboardSnapshot | undefined;\n\n get(inputs: unknown): FabricDashboardSnapshot | undefined {\n return this.snapshot && isDeepStrictEqual(this.inputs, inputs)\n ? { ...this.snapshot, now: Date.now() } : undefined;\n }\n\n set(\n inputs: { runs: FabricActivityRun[] } & Record<string, unknown>,\n snapshot: FabricDashboardSnapshot,\n immutableActivity = false,\n ): void {\n // Only the controller-owned revision view guarantees deep immutability.\n // Legacy/mutable inputs must still be copied to detect in-place updates.\n const { runs, ...other } = inputs;\n this.inputs = immutableActivity\n ? { ...structuredClone(other), runs: runs.slice() }\n : structuredClone(inputs);\n this.snapshot = snapshot;\n }\n\n clear(): void {\n this.inputs = undefined;\n this.snapshot = undefined;\n }\n}\n\nexport const createDashboardSnapshot = (\n state: FabricState,\n events: MeshEvent[],\n context?: ExtensionContext,\n activityRuns?: FabricActivityRun[],\n cache?: FabricDashboardSnapshotCache,\n immutableActivity = false,\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 // Observe externally owned domains on every poll, including remote lease\n // expiry and model/usage updates that need not emit a local manager event.\n const participants = typeof state.participantInfos === \"function\"\n ? state.participantInfos({ scope: \"project\" }) : [];\n const actorRecords = state.actors.list();\n const main = state.mainAgentInfo(context);\n const peers = typeof state.peerInfos === \"function\" ? state.peerInfos() : [];\n const globalActors = state.globalActors.list();\n const componentGraph = typeof state.componentGraph === \"function\"\n ? state.componentGraph() : { components: [], edges: [], cycles: [] };\n const meshEntries = state.config.mesh.enabled ? state.mesh.list(\"\", 200) : [];\n const shells = state.shellJobs?.list().filter(job => job.spilledAt !== undefined || job.monitor) ?? [];\n const inputs = { runs, agentRecords, actorRecords, participants, main, peers, shells,\n globalActors, componentGraph, meshEntries, events, widgetDismissedAt: state.widgetDismissedAt };\n const previous = cache?.get(inputs);\n if (previous) return previous;\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 workerByActor = new Map<string, FabricUiAgent>();\n for (const agent of allAgents) {\n if (!agent.actorId) continue;\n const previous = workerByActor.get(agent.actorId);\n const active = Number(activeStatuses.has(agent.status)) -\n Number(previous !== undefined && activeStatuses.has(previous.status));\n const recency = (numberFrom(agent.updatedAt) ?? numberFrom(agent.startedAt) ?? 0) -\n (numberFrom(previous?.updatedAt) ?? numberFrom(previous?.startedAt) ?? 0);\n // Strict improvement retains the first source-order worker on exact ties,\n // matching the previous stable filter/sort selection.\n if (!previous || (active || recency) > 0) workerByActor.set(agent.actorId, agent);\n }\n const participantById = new Map(participants.map((participant) => [participant.id, participant]));\n const actors = actorRecords\n .map((actor) => {\n const participant = participantById.get(actor.id);\n const worker = workerByActor.get(actor.id);\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 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 const snapshot: FabricDashboardSnapshot = {\n now: Date.now(),\n shells,\n runs: orderedRuns,\n main,\n peers,\n participants,\n widgetDismissedAt: state.widgetDismissedAt,\n globalActors,\n agents: visibleAgents,\n componentGraph,\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 cache?.set(inputs, snapshot, immutableActivity);\n return snapshot;\n};\n", "import type { Component } from \"@earendil-works/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { Theme } from \"@earendil-works/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.shells?.some(job => job.finishedAt === undefined || snapshot.now - job.finishedAt < 30000)) 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\n/**\n * Share of the terminal height the animated box may claim. pi's main-screen\n * renderer scrolls the pane once the rendered content is taller than the\n * terminal, so a box that fills the viewport keeps that scroll region moving on\n * every animation frame \u2014 which reads as flicker inside tmux. Half the pane\n * keeps the transcript and editor visible and bounds the box on short panes.\n */\nexport const WIDGET_TERMINAL_ROW_SHARE = 0.5;\n\n/** Effective row budget: the configured maximum, bounded by the live pane. */\nexport const widgetRowLimit = (maxRows: number, terminalRows?: number): number => {\n const configured = Math.max(1, maxRows);\n if (terminalRows === undefined || !Number.isFinite(terminalRows) || terminalRows <= 0) {\n return configured;\n }\n const paneShare = Math.floor(terminalRows * WIDGET_TERMINAL_ROW_SHARE);\n return Math.max(1, Math.min(configured, paneShare));\n};\n\nexport class FabricWidget implements Component {\n constructor(\n readonly theme: Theme,\n readonly snapshot: () => FabricDashboardSnapshot,\n readonly maxRows: number,\n // Live terminal height. pi re-renders the widget on resize, so reading the\n // pane per render bounds the box without a resize subscription.\n readonly terminalRows?: () => number | undefined,\n ) {}\n\n #rowLimit(): number {\n return widgetRowLimit(this.maxRows, this.terminalRows?.());\n }\n\n #lastWidth: number | undefined;\n #lastLimit: number | undefined;\n #lastSnapshot: FabricDashboardSnapshot | undefined;\n #lastLines: string[] | undefined;\n #pending:\n | { width: number; limit: number; snapshot: FabricDashboardSnapshot; lines: string[] }\n | undefined;\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const snapshot = this.snapshot();\n // The pane can shrink between renders, so the row budget is part of the\n // cache key: a box measured against a taller terminal must not be reused.\n const limit = this.#rowLimit();\n const lines =\n this.#pending?.width === width &&\n this.#pending.limit === limit &&\n this.#pending.snapshot === snapshot\n ? this.#pending.lines\n : this.#lastWidth === width &&\n this.#lastLimit === limit &&\n this.#lastSnapshot === snapshot &&\n this.#lastLines\n ? this.#lastLines\n : this.#renderLines(snapshot, width, limit);\n this.#pending = undefined;\n this.#lastWidth = width;\n this.#lastLimit = limit;\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 limit = this.#rowLimit();\n const lines = this.#renderLines(snapshot, this.#lastWidth, limit);\n this.#pending = { width: this.#lastWidth, limit, 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.#lastLimit = undefined;\n this.#lastSnapshot = undefined;\n this.#lastLines = undefined;\n }\n\n #renderLines(snapshot: FabricDashboardSnapshot, width: number, limit: number): string[] {\n return this.#boundContent(this.#buildContent(snapshot), width, limit);\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 shells = snapshot.shells ?? [];\n const liveShells = shells.filter(job => job.finishedAt === undefined);\n const recentShells = shells.filter(job => job.finishedAt !== undefined && snapshot.now - job.finishedAt < 30000);\n const headerStatus =\n run?.status ??\n (activeAgents.length > 0 || activeActorWorkers.length > 0 || liveShells.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 (liveShells.length > 0) parts.push(`${liveShells.length} shell${liveShells.length === 1 ? \"\" : \"s\"}`);\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 const elapsed = run && formatDuration((run.finishedAt ?? snapshot.now) - run.startedAt);\n if (elapsed) parts.push(elapsed);\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 taskHint = liveShells.length || recentShells.length ? this.theme.fg(\"dim\", \" \u00B7 /fabric tasks \u00B7 ctrl+alt+t\") : \"\";\n const taskHeader = taskHint ? `${glyph} ${this.theme.fg(\"accent\", \"Fabric\")}${taskHint}${parts.length ? this.theme.fg(\"dim\", ` \u00B7 ${parts.join(\" \u00B7 \")}`) : \"\"}` : header;\n const lines = [hasActiveConversations ? `${taskHeader} \u00B7 ${this.theme.fg(\"dim\", FABRIC_CONVERSATION_HINT)}` : taskHeader];\n for (const job of [...liveShells, ...recentShells].slice(0, 3)) {\n const elapsed = formatDuration((job.finishedAt ?? snapshot.now) - job.startedAt) || \"0s\";\n const status = job.stopping ? \"stopping\" : job.monitor && !job.finishedAt ? `monitor:${job.monitor.delivery}` : job.status;\n lines.push(` ${this.theme.fg(\"accent\", job.id.slice(0, 8))} ${status} \u00B7 ${elapsed} \u00B7 ${safeText(job.description ?? job.command)}`);\n }\n if (liveShells.length + recentShells.length > 3) lines.push(this.theme.fg(\"dim\", ` +${liveShells.length + recentShells.length - 3} more shell tasks`));\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, limit: number): string[] {\n const bounded = content.slice(0, limit);\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 \"@earendil-works/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} background worker${count === 1 ? \"\" : \"s\"} (Esc)`,\n \"warning\",\n );\n }\n }, 60);\n timer.unref?.();\n return undefined;\n });\n return () => {\n cancel();\n unsubscribe();\n };\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { FabricShellJobStore } from \"../core/shell-jobs.js\";\nimport { installFabricEscapeHalt } from \"./escape-halt.js\";\n\nconst CTRL_B = \"\\x02\";\nconst CTRL_K = \"\\x0b\";\nconst CTRL_B_CHORD_MS = 1_000;\n\ninterface ShellHangKeyOptions {\n enabled: () => boolean;\n ownsInput: () => boolean;\n jobs: () => FabricShellJobStore | undefined;\n}\n\n/** Spill or kill a nested shell that is still waiting, without a jobs API. */\nexport function installFabricShellHangKeys(\n context: ExtensionContext,\n options: ShellHangKeyOptions,\n): () => void {\n if (context.mode !== \"tui\" || typeof context.ui.onTerminalInput !== \"function\") return () => {};\n const stopMonitors = installFabricEscapeHalt(context, {\n enabled: options.enabled, ownsInput: options.ownsInput, halted: () => false,\n halt: () => {\n let count = 0;\n for (const job of options.jobs()?.live() ?? []) if (job.options.monitor && job.stop(\"Main interrupted\")) count++;\n return count;\n },\n });\n let chordArmedAt = 0;\n const unsubscribe = context.ui.onTerminalInput((data) => {\n if (options.ownsInput() || !options.enabled()) {\n chordArmedAt = 0;\n return undefined;\n }\n const jobs = options.jobs();\n if (!jobs || jobs.waiting().length === 0) {\n chordArmedAt = 0;\n return undefined;\n }\n if (data === CTRL_B) {\n const now = Date.now();\n if (chordArmedAt > 0 && now - chordArmedAt <= CTRL_B_CHORD_MS) {\n chordArmedAt = 0;\n const count = jobs.spillWaiting();\n if (count > 0) {\n context.ui.notify(\n count === 1\n ? \"Fabric: shell still running \u00B7 output spilled to a live log\"\n : `Fabric: ${count} shells still running \u00B7 output spilled to live logs`,\n \"info\",\n );\n }\n return { consume: true };\n }\n chordArmedAt = now;\n return { consume: true };\n }\n chordArmedAt = 0;\n if (data === CTRL_K) {\n const count = jobs.killWaiting();\n if (count > 0) {\n context.ui.notify(\n count === 1 ? \"Fabric: killed waiting shell\" : `Fabric: killed ${count} waiting shells`,\n \"warning\",\n );\n }\n return { consume: true };\n }\n return undefined;\n });\n return () => { stopMonitors(); unsubscribe(); };\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 pi'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 { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { HANDOFF_COMPLETION_MESSAGE_TYPE } from \"../agents/handoff-completion.js\";\n\nexport const registerHandoffCompletionRenderer = (extension: ExtensionAPI): void => {\n extension.registerMessageRenderer(HANDOFF_COMPLETION_MESSAGE_TYPE, (message, { outputPad }) => {\n const details = message.details as { displayText?: string } | undefined;\n // Internal continuation instructions stay in model context, not the TUI.\n return new Text(details?.displayText ?? \"Fabric handoff finished. See the handoff tool result.\", outputPad, 0);\n });\n};\n", "import type { Usage } from \"@earendil-works/pi-ai\";\nimport { registerJevAuth } from \"./jev/auth.js\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n} from \"@earendil-works/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 comparableCompiledSurfaceScore,\n BackgroundEntropyCompiler,\n BackgroundSessionSelector,\n SessionObservationCache,\n entropyRepairRows,\n formatEntropyCompileNotice,\n liveSurfaceSnapshot,\n loadCompiledSurfaceAsync,\n loadObservationPoolAsync,\n machineSessionFilesAsync,\n saveCompiledSurfaceAsync,\n saveObservationPoolAsync,\n sessionWindowEvidenceAsync,\n} from \"./entropy/index.js\";\nimport { setActiveCompiledSurface } from \"./entropy/active.js\";\nimport {\n filterPrewalkContinuationMessages,\n filterPrewalkPlanningDirectives,\n withTrajectoryRearmDirective,\n} from \"./prewalk/messages.js\";\nimport {\n restoreBorrowedInPlaceMain,\n settleInPlacePrewalk,\n} from \"./prewalk/return.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport { autoArmFabricPrewalk } from \"./prewalk/arm.js\";\nimport {\n DEFAULT_FABRIC_CONFIG,\n effectiveToolCaptureConfig,\n} from \"./config.js\";\nimport { registerCompactionHook } from \"./compaction/hook.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 { PI_CORE_TOOL_NAMES } from \"./core/pi-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 { restoreSkillsForFullCodePrompt } from \"./core/skill-prompt.js\";\nimport { fabricSkillPaths } from \"./core/kernel-skills.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 { piHostCompatibilityWarning } from \"./host-compatibility.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 { installFabricShellHangKeys } from \"./ui/shell-hang-keys.js\";\nimport { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { configureHighlighting } from \"./ui/highlight.js\";\nimport { registerHandoffCompletionRenderer } from \"./ui/handoff-completion.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { truncateMiddle } from \"./util.js\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { captureLoadedFileIdentity } from \"./build-identity.js\";\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// Pi processes that load Fabric with -e (agents and actors) discover the\n// same kernel-specific tree as Main. The package manifest exposes no skills;\n// selecting exactly one tree avoids canonical-name collisions.\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, \"..\", \"skillsets\"),\n};\nconst FABRIC_SKILLS_DIR = FABRIC_RUNTIME_PATHS.skills;\n\n// Loaded-code identity of this extension entry, captured while the module bytes\n// on disk are still the bytes this process evaluated. prewalk.status compares\n// it against the current file to expose stale-runtime reloads.\nconst FABRIC_ENTRY_IDENTITY = captureLoadedFileIdentity(import.meta.url);\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 = \"pi-fabric-skill-reference\";\n\nexport const FABRIC_MANAGED_HOST_VERSION = 1;\nexport type { FabricManagedHostOptions } from \"./managed-host.js\";\nimport type { FabricManagedHostOptions } from \"./managed-host.js\";\n\nexport default async function piFabric(pi: ExtensionAPI, options: { managedHost?: FabricManagedHostOptions } = {}): Promise<void> {\n if (!options.managedHost) registerJevAuth(pi);\n const codePreviewSettings = defaultCodePreviewSettings();\n const decorateShell: FabricToolShellDecorator = withCodePreviewShell;\n let compatibilityWarningShown = 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(pi, capturedTools, {\n paths: FABRIC_RUNTIME_PATHS,\n ...(FABRIC_ENTRY_IDENTITY ? { entryIdentity: FABRIC_ENTRY_IDENTITY } : {}),\n ...(options.managedHost ? {managedHost: options.managedHost} : {}),\n });\n const directToolApproval = new FabricDirectToolApproval(\n pi,\n () => state.config,\n state.sessionApprovals,\n );\n const pendingHandoffs = new Map<string, PendingFabricHandoff>();\n const toolOwnership = new FabricToolOwnership(pi);\n const fabricUi = new FabricUiController(state, codePreviewSettings, {\n getToolDefinition: (name) => name === \"fabric_exec\" ? fabricTool : capturedTools.get(name)?.definition,\n get markdownTransformers() { return capturedTools.runner?.getMarkdownTransformers(); },\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 // Captured tools that must stay out of the model's active set in full code\n // mode: every captured extension tool minus the capture.keepVisible names.\n const hiddenCapturedToolNames = (): Set<string> => {\n const visible = new Set(capturePolicy().keepVisible);\n return new Set(\n capturedTools.list().map((entry) => entry.name).filter((name) => !visible.has(name)),\n );\n };\n // Pi auto-activates tools that newly appear in the registry on every tool\n // refresh; re-assert ownership afterwards so captured tools stay hidden from\n // the model even when a late-loading extension triggers a refresh. Refresh\n // callbacks arrive before session initialization too, so reassertion waits\n // for state to be ready rather than reading an uninitialized config.\n const { reassert: reassertToolOwnership, schedule: scheduleOwnershipReassert } =\n createToolOwnershipReassertion({\n ready: () => state.cwd !== undefined,\n active: () => {\n const policy = capturePolicy();\n return policy.enabled && policy.hideFromModel && fabricOwnsModelTools();\n },\n hiddenNames: hiddenCapturedToolNames,\n apply: (hidden) => toolOwnership.apply(true, hidden),\n });\n\n const unsubscribeComponentRegistration = pi.events.on(\n FABRIC_COMPONENT_REGISTER_EVENT,\n (value: unknown) => {\n const registration = componentRegistrationFrom(value);\n if (!registration) throw new Error(\"Invalid Pi Fabric component registration\");\n state.registerExternalComponent(\n registration.component,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n const unsubscribeProviderRegistration = pi.events.on(\n FABRIC_PROVIDER_REGISTER_EVENT,\n (value: unknown) => {\n const registration = registrationFrom(value);\n if (!registration) throw new Error(\"Invalid Pi Fabric provider registration\");\n state.registerExternal(\n registration.provider,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n pi.on(\"resources_discover\", async (_event, context) => {\n if (!state.bootstrapped) await state.bootstrap(context);\n return { skillPaths: fabricSkillPaths(FABRIC_SKILLS_DIR, state.config.executor.kernel) };\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(pi.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 registerHandoffCompletionRenderer(pi);\n pi.registerTool(fabricTool);\n\n const applyFabricMode = (): void => {\n // Re-applying the persistent policy ends any suspension window; do it\n // before setPolicy so a config-disabled policy recomputes derived\n // surfaces against the (now stable) empty catalog.\n capturedTools.markResumed();\n toolCapture.setPolicy(capturePolicy());\n Object.assign(\n fabricTool,\n createFabricExecTool(state, codePreviewSettings, pendingHandoffs, decorateShell, toolDisplay),\n );\n pi.registerTool(fabricTool);\n toolOwnership.apply(\n fabricOwnsModelTools(),\n fabricOwnsModelTools() ? hiddenCapturedToolNames() : undefined,\n );\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_settled 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 Pi's native cancel-streaming still fires;\n // single ESC therefore stops the current turn and the advisor/supervisor\n // actors and event-driven Jev observers at once. Jev observers are cancelled,\n // not automatically restarted. Also works without mesh. ui.haltOnEscape opts out.\n let haltOnEscapeUnsubscribe: (() => void) | undefined;\n let shellHangKeysUnsubscribe: (() => void) | undefined;\n const uninstallHaltOnEscape = (): void => {\n haltOnEscapeUnsubscribe?.();\n haltOnEscapeUnsubscribe = undefined;\n };\n const uninstallShellHangKeys = (): void => {\n shellHangKeysUnsubscribe?.();\n shellHangKeysUnsubscribe = undefined;\n };\n const installHaltOnEscape = (context: ExtensionContext): void => {\n uninstallHaltOnEscape();\n if (!state.config.ui.haltOnEscape || (!state.config.mesh.enabled && !state.config.jev.enabled)) return;\n haltOnEscapeUnsubscribe = installFabricEscapeHalt(context, {\n enabled: () => state.initialized && (state.config.mesh.enabled || state.config.jev.enabled) && state.config.ui.haltOnEscape,\n ownsInput: () => fabricUi.ownsInput,\n halted: () => state.advisorsHalted,\n halt: () => state.haltAdvisors(),\n });\n };\n const installShellHangKeys = (context: ExtensionContext): void => {\n uninstallShellHangKeys();\n shellHangKeysUnsubscribe = installFabricShellHangKeys(context, {\n enabled: () => state.initialized,\n ownsInput: () => fabricUi.ownsInput,\n jobs: () => state.shellJobs,\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, pi);\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 uninstallShellHangKeys();\n fabricUi.stop();\n };\n state.setActivationHook(async (context) => {\n refreshCodePreviewSettings();\n await autoArmPrewalk(context);\n applyFabricMode();\n fabricUi.start(context);\n installHaltOnEscape(context);\n installShellHangKeys(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 entropyLifecycleEpoch = 0;\n const createEntropyCaches = () => ({\n compiler: new BackgroundEntropyCompiler(),\n observations: new SessionObservationCache(),\n sessions: new BackgroundSessionSelector(machineSessionFilesAsync),\n });\n let entropyCaches = createEntropyCaches();\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 agentDir = resolveAgentDir();\n const cwd = state.cwd ?? context.cwd;\n const repairs = entropyRepairRows(state.repairs.repairs);\n const caches = entropyCaches;\n const [files, loaded, poolLoaded, snapshot] = await Promise.all([\n caches.sessions.select(agentDir, cwd, context.sessionManager.getSessionFile?.()),\n loadCompiledSurfaceAsync(agentDir),\n loadObservationPoolAsync(agentDir),\n liveSurfaceSnapshot({ registry: state.registry, extensionContext: context, cwd }),\n ]);\n if (!current() || loaded.error) return;\n const evidence = await sessionWindowEvidenceAsync(files, { windowsOnly: true });\n if (!current()) return;\n const mergedPool = await caches.observations.merge(\n poolLoaded.file,\n evidence.observationWindows,\n );\n if (!poolLoaded.error && (mergedPool.mergedSessions > 0 || !poolLoaded.file)) {\n await saveObservationPoolAsync(agentDir, mergedPool.file);\n }\n if (!current()) return;\n const outcome = await caches.compiler.compile({\n windows: evidence.traceWindows,\n surface: snapshot,\n repairs,\n ...(loaded.file ? { artifact: loaded.file } : {}),\n });\n if (!current()) return;\n if (outcome.status === \"compiled\" && outcome.artifact) {\n const saved = await saveCompiledSurfaceAsync(agentDir, outcome.artifact);\n if (current()) {\n // Activate even when another process already persisted identical bytes.\n setActiveCompiledSurface(saved.file);\n // The notice is progress evidence, not a heartbeat: show it only when\n // the fresh score measurably lowered the previously persisted surface.\n const previousScore = comparableCompiledSurfaceScore(loaded.file, saved.file.metricVersion);\n if (previousScore !== undefined && outcome.report.score < previousScore && context.hasUI) {\n context.ui.notify(formatEntropyCompileNotice({\n beforeScore: previousScore,\n afterScore: outcome.report.score,\n normalizations: saved.file.normalizations?.length ?? 0,\n }), \"info\");\n }\n }\n }\n // Advisory abstraction suggestions remain available on demand. Static\n // normalization never asks the user to approve a compatibility repair.\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 `[pi-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 pi.on(\"session_start\", async (_event, context) => {\n entropyLifecycleEpoch += 1;\n entropyCaches = createEntropyCaches();\n entropyEvidenceThisTurn = false;\n entropyCompilePending = undefined;\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n uninstallHaltOnEscape();\n uninstallShellHangKeys();\n fabricUi.stop();\n suspendToolCapture();\n proxyContract.reset();\n refreshProxyLedger(context);\n if (!compatibilityWarningShown) {\n compatibilityWarningShown = true;\n const warning = piHostCompatibilityWarning();\n if (warning) {\n console.warn(`[pi-fabric] ${warning}`);\n if (context.hasUI) context.ui.notify(warning, \"warning\");\n }\n }\n await state.bootstrap(context);\n // bootstrap() cancels any live arm; the borrowed Main model survives so a\n // new session that inherited the in-place executor can snap back.\n await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\n refreshCodePreviewSettings();\n applyFabricMode();\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 pi.on(\"session_tree\", async (_event, context) => {\n proxyContract.reset();\n refreshProxyLedger(context);\n // Pi 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 pi.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(\"pi.input\", event);\n });\n\n pi.on(\"agent_start\", async (event) => {\n if (state.initialized) await state.publishHostLifecycle(\"pi.agent_start\", event);\n });\n\n pi.on(\"agent_end\", async (event) => {\n if (state.initialized) await state.publishHostLifecycle(\"pi.agent_end\", event);\n });\n\n pi.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(\"pi.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 pi.on(\"agent_settled\", async (event, context) => {\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, pi, 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 // Pi's compact API is callback-based. Await the controller's Promise here\n // so ExtensionRunner does not finish this handler (and Pi does not publish\n // its public agent_settled event) before compaction settles.\n await state.compact.maybeCommit(context);\n await compactAtConfiguredThreshold(context, state.config);\n await state.publishHostLifecycle(\"pi.agent_settled\", event);\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 pi.on(\"message_start\", () => {\n state.speculationTap?.reset();\n });\n\n pi.on(\"message_update\", (event, context) => {\n if (!state.initialized) return;\n state.speculationTap?.handleMessageUpdate(event, context);\n });\n\n pi.on(\"tool_call\", (event, context) =>\n fabricToolLifecycle.toolCall(event, context));\n\n // Pi 0.80.6 intentionally ignores `isError` returned by custom-tool\n // execute(). Repair the finalized outer result through official middleware.\n pi.on(\"tool_result\", (event) => fabricToolLifecycle.toolResult(event));\n\n pi.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 pi.on(\"message_end\", (event) => {\n if (event.message.role !== \"toolResult\") return undefined;\n const message = event.message as AgentToolResultMessage & { usage?: Usage };\n const usage = directToolApproval.takeUsage(message.toolCallId);\n if (!usage) return undefined;\n return {\n message: {\n ...message,\n usage: mergeFabricApprovalUsage(message.usage, usage),\n },\n };\n });\n\n // message_end runs after all tool-result middleware and tool_execution_end but\n // before Pi 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 pi.on(\"message_end\", async (event, context) => {\n if (event.message.role !== \"toolResult\") return undefined;\n const pending = pendingHandoffs.get(event.message.toolCallId);\n if (!pending || event.message.toolName !== \"fabric_exec\") return undefined;\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 const formatted = formatFabricValue(\n handoff,\n pending.resultFormat,\n state.config.executor.maxOutputChars,\n );\n const output = truncateMiddle(\n formatted.text || \"(no output)\",\n state.config.executor.maxOutputChars,\n );\n // Directive lands after truncation so it survives maxOutputChars, and\n // gates on \"still armed\" so one-shot trajectory handoffs stay silent.\n const text = withTrajectoryRearmDirective(\n output,\n pending,\n handoff,\n state.prewalk,\n context.sessionManager.getSessionId(),\n );\n const boundarySucceeded = handoff.completed === true || handoff.continued === true;\n const details =\n typeof event.message.details === \"object\" &&\n event.message.details !== null &&\n !Array.isArray(event.message.details) &&\n \"success\" in event.message.details\n ? { ...event.message.details, success: boundarySucceeded }\n : event.message.details;\n // `details` is optional on ToolResultMessage; under exactOptionalPropertyTypes\n // an explicitly `undefined` property is rejected, so omit the key instead.\n return {\n message: {\n ...event.message,\n content: [{ type: \"text\", text }],\n isError: !boundarySucceeded,\n ...(details === undefined ? {} : { details }),\n },\n };\n });\n\n pi.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(\"pi.tool_error\", event);\n }\n });\n\n pi.on(\"session_compact\", async (event, context) => {\n if (!state.initialized) return;\n await state.publishHostLifecycle(\"pi.session_compact\", event);\n });\n\n // Deterministic, LLM-free compaction is registered unconditionally and is\n // active by default. The documented \"pi\" escape hatch returns early so\n // pi-core's own summarization proceeds normally.\n registerCompactionHook(pi, {\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 getThresholdContextRatio: (modelKey) =>\n state.cwd\n ? state.config.compaction.thresholds[modelKey]\n : DEFAULT_FABRIC_CONFIG.compaction.thresholds[modelKey],\n getThresholdTokens: (modelKey) =>\n state.cwd\n ? state.config.compaction.tokenThresholds[modelKey]\n : DEFAULT_FABRIC_CONFIG.compaction.tokenThresholds[modelKey],\n });\n\n pi.on(\"context\", (event, context) => {\n const sessionId = context.sessionManager.getSessionId();\n const pendingContinuation = state.initialized\n ? state.prewalk.pendingContinuationMessage(sessionId)\n : undefined;\n const continuation = filterPrewalkContinuationMessages(\n event.messages,\n (continuationId) => state.initialized &&\n state.prewalk.acceptContinuation(sessionId, continuationId),\n pendingContinuation,\n );\n // Planning directives are phase-scoped: visible only while this session's\n // arm is live (Main still owes its plan). A claimed handoff or an off arm\n // must not project stale planning instructions into later requests.\n const planning = filterPrewalkPlanningDirectives(\n continuation.messages,\n state.initialized && state.prewalk.isArmed(sessionId),\n );\n let changed = continuation.changed || planning.changed;\n const messages = planning.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 pi.on(\"before_agent_start\", async (event, context) => {\n const config = state.bootstrapped ? state.config : DEFAULT_FABRIC_CONFIG;\n const fullCodeMode = config.fullCodeMode;\n const schemaMode = config.schema.mode;\n const effectiveFullCodeMode = fullCodeMode || schemaMode === \"enforce\";\n if (!pi.getActiveTools().includes(\"fabric_exec\")) return;\n const skills = event.systemPromptOptions.skills ?? [];\n const captureSnapshot = state.bootstrapped ? capturePolicy() : undefined;\n // Pi omits its entire skill catalog when the active tool set lacks a tool\n // named read. Restore Pi's discovered catalog (already bound to one skill\n // tree); full code mode adapts its loader to Fabric's nested pi.read path.\n const systemPrompt = restoreSkillsForFullCodePrompt(event.systemPrompt, skills, effectiveFullCodeMode);\n // Pi 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 Pi'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.PI_FABRIC_PARENT_RUN ? \"participant\" : \"main\",\n defaults: [{\n slot: FABRIC_EXECUTION_GUIDANCE_SLOT,\n content: defaultFabricExecutionGuidance(effectiveFullCodeMode, config.executor.kernel, config.executor.pythonRuntime),\n }],\n });\n const overrideGuidance = effectiveFullCodeMode\n ? coreOverridePromptGuidance(capturedTools).trim()\n : undefined;\n const extensionRoster = effectiveFullCodeMode\n ? extensionToolRosterGuidance(capturedTools.list(), new Set(PI_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, config.executor.kernel, config.executor.pythonRuntime),\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 pi.on(\"before_agent_start\", (event) => {\n if (!pi.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,\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(pi, (eventName, event, context) => {\n if (!state.initialized) return;\n state.dispatchHostEvent(eventName, event, context);\n });\n\n pi.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 entropyCaches = createEntropyCaches();\n entropyCompilePending = undefined;\n unsubscribeComponentRegistration();\n unsubscribeProviderRegistration();\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n try {\n await state.shutdown();\n } finally {\n uninstallHaltOnEscape();\n uninstallShellHangKeys();\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 pi.on(\"before_agent_start\", () => {\n reassertToolOwnership();\n });\n\n registerFabricCommand(pi, {\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 } from \"@earendil-works/pi-coding-agent\";\nimport {\n Container,\n Text,\n truncateToWidth,\n visibleWidth,\n type Component,\n} from \"@earendil-works/pi-tui\";\nimport { continueArcGroup } from \"./arc-group.js\";\nimport { animationFitsViewport, type AnimationViewportState } from \"./spinner.js\";\n\ntype ToolCallBackgroundMode = \"on\" | \"border\" | \"off\";\ntype AnyTool = ToolDefinition<any, any, any>;\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\ntype 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 codePreviewTimingViewport?: AnimationViewportState;\n codePreviewTimingLabel?: string;\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 if (!animationFitsViewport(state.codePreviewTimingViewport)) return;\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 if (running && !animationFitsViewport(state.codePreviewTimingViewport)) {\n return state.codePreviewTimingLabel;\n }\n const endedAt = running ? Date.now() : (state.codePreviewTimingEndedAt ?? Date.now());\n const durationMs = endedAt - startedAt;\n if (!Number.isFinite(durationMs) || Math.round(durationMs) <= 0) return undefined;\n const label = `${running ? \"Elapsed\" : \"Took\"} ${formatDuration(durationMs)}`;\n state.codePreviewTimingLabel = label;\n return label;\n};\n\nclass TimingPreservedComponent implements Component {\n constructor(readonly component: Component, private readonly state: TimingState) {}\n render(width: number): 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): 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 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): 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 (this.state.codePreviewTimingViewport ??= {}).renderedRows = body.length + (width < 4 ? 0 : 2);\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 = (tool, options = {}) => {\n const mode = options.mode ?? \"on\";\n const timingEnabled = options.toolCallTiming ?? true;\n if ((options.preserveSelfShell ?? true) && tool.renderShell === \"self\") return tool;\n const originalRenderCall = tool.renderCall;\n const originalRenderResult = tool.renderResult;\n const renderCall = (args: unknown, theme: Theme, context: PreviewRenderContext): Component =>\n originalRenderCall\n ? originalRenderCall.call(tool, args as never, theme, context as never)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n const renderResult = (\n result: unknown,\n resultOptions: unknown,\n theme: Theme,\n context: PreviewRenderContext,\n ): Component => originalRenderResult\n ? originalRenderResult.call(tool, result as never, resultOptions as never, theme, context as never)\n : new Container();\n\n return {\n ...tool,\n renderShell: mode === \"on\" ? \"default\" : \"self\",\n renderCall(args, theme, rawContext) {\n if (!rawContext) {\n return originalRenderCall\n ? originalRenderCall.call(tool, args, theme, rawContext)\n : new Text(theme.fg(\"toolTitle\", theme.bold(tool.label || tool.name)), 0, 0);\n }\n const context = rawContext as unknown as PreviewRenderContext;\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, 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, 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, rawContext) {\n const context = rawContext as unknown as PreviewRenderContext;\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 typeof tool;\n};\n", "import type {\n ExtensionAPI,\n ExtensionContext,\n ExtensionEvent,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n FABRIC_ACTOR_PI_HOST_EVENTS,\n type FabricActorPiHostEvent,\n} from \"./types.js\";\n\nexport type FabricActorHostEventObserver = (\n eventName: FabricActorPiHostEvent,\n event: ExtensionEvent,\n context: ExtensionContext,\n) => void;\n\ninterface ObservableExtensionApi {\n on(\n event: FabricActorPiHostEvent,\n handler: (event: ExtensionEvent, context: ExtensionContext) => void,\n ): void;\n}\n\nexport const registerFabricActorHostEventObservers = (\n pi: ExtensionAPI,\n observer: FabricActorHostEventObserver,\n): void => {\n const observable = pi as unknown as ObservableExtensionApi;\n for (const eventName of FABRIC_ACTOR_PI_HOST_EVENTS) {\n observable.on(eventName, (event, context) => observer(eventName, event, context));\n }\n};\n", "import { existsSync, readdirSync, readFileSync, realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type {\n ExtensionRunner,\n RegisteredTool,\n ToolDefinition,\n} from \"@earendil-works/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, any>;\n catalog: CapturedToolCatalog;\n initialPolicy?: FabricToolCaptureConfig;\n // Called after each refresh of the captured catalog so callers can re-assert\n // active-tool ownership. Tools are deliberately left in Pi's registry \u2014 the\n // listener observes rather than filters \u2014 because extensions that gate tool\n // calls against `pi.getAllTools()` (e.g. permission systems) must still see\n // captured tools as registered; hiding from the model happens exclusively in\n // the active tool set (see FabricToolOwnership).\n onCatalogRefresh?: () => void;\n}\n\nconst HUB_SYMBOL = Symbol.for(\"pi-fabric.registered-tool-capture.v1\");\nconst ANCHOR_SYMBOL = Symbol.for(\"pi-fabric.registered-tool-anchor.v1\");\n\nconst definitionDelegatesTo = (\n definition: ToolDefinition<any, any, any>,\n target: ToolDefinition<any, 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 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// pi >= 0.84.3 loads the CLI 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(\"Pi 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};\n\nconst PI_PACKAGE_NAME = \"@earendil-works/pi-coding-agent\";\n\nconst piPackageRootAbove = (startDirectory: string): string | undefined => {\n let directory = startDirectory;\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 === PI_PACKAGE_NAME) return directory;\n } catch { /* unreadable or invalid manifest; keep searching */ }\n }\n directory = path.dirname(directory);\n }\n return undefined;\n};\n\nconst hostPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n try {\n return piPackageRootAbove(path.dirname(realpathSync(cliPath)));\n } catch {\n return undefined;\n }\n};\n\n// Embedded hosts (pi-web sessiond, SDK embeds) instantiate ExtensionRunner from\n// their own node_modules copy while this extension runs from a separate package\n// realm: the in-realm fallback import below resolves this extension's private\n// dependency and patches a class identity the live runner never uses, leaving\n// the captured catalog permanently empty (extensions.* exposes nothing). Node\n// caches modules by absolute path, so locating the host's copy through the\n// process entry's module search path and importing it yields the very class\n// the host instantiates.\nconst entryRealmPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n let entryDirectory: string;\n try {\n entryDirectory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n // The package exports map is ESM-only, so plain resolve() fails with\n // ERR_PACKAGE_PATH_NOT_EXPORTED; resolve.paths() lists the node_modules\n // directories Node would search regardless of exports.\n const searchPaths = createRequire(path.join(entryDirectory, \"probe.js\"))\n .resolve.paths(PI_PACKAGE_NAME);\n for (const searchPath of searchPaths ?? []) {\n const manifestPath = path.join(searchPath, PI_PACKAGE_NAME, \"package.json\");\n if (!existsSync(manifestPath)) continue;\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (manifest.name === PI_PACKAGE_NAME) return path.join(searchPath, PI_PACKAGE_NAME);\n } catch { /* unreadable or invalid manifest; keep searching */ }\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(), entryRealmPackageRoot()].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(\"@earendil-works/pi-coding-agent\")) 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 = (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.sourceInfo.path);\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 \"@earendil-works/pi-coding-agent\";\nimport type { AutocompleteItem } from \"@earendil-works/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 { restoreBorrowedInPlaceMain } from \"../prewalk/return.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 { normalFormEvidenceSummary } from \"../entropy/normal-form.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 // Pi 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 Pi 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 pi: 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, pi, {\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) pi.sendUserMessage(task);\n return { ok: true };\n};\n\nexport function registerFabricCommand(pi: ExtensionAPI, deps: FabricCommandDeps): void {\n const { state, fabricUi, capturedTools, applyFabricMode, suspendToolCapture } = deps;\n const unsubscribePrewalkRequests = pi.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, pi));\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 pi.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 = pi.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 = pi.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 pi.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 pi.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 pi.registerShortcut?.(\"ctrl+alt+t\", {\n description: \"Inspect Fabric background shell tasks\",\n handler: async (context) => {\n if (context.mode !== \"tui\") return;\n try { await state.ensure(context); await fabricUi.openTasks(context); }\n catch (error) { context.ui.notify(safeText(error instanceof Error ? error.message : String(error)), \"error\"); }\n },\n });\n\n pi.registerCommand(\"fabric\", {\n description: \"Open Fabric dashboard, chat or tasks, arm prewalk, reload, or manage agents and actors\",\n getArgumentCompletions: (argumentPrefix: string): AutocompleteItem[] | null => {\n const subcommands = [\n \"status\",\n \"dashboard\",\n \"tasks\",\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 === \"tasks\") {\n const matches = state.shellJobs?.list().filter(job => job.id.startsWith(idPrefix)) ?? [];\n return matches.map(job => ({ value: `tasks ${job.id}`, label: job.id.slice(0, 8), description: safeText(job.description ?? job.command).slice(0, 120) }));\n }\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 if (state.kernelReloadRequired) {\n await context.reload();\n return;\n }\n await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\n context.ui.notify(\"Pi 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 reloadResources: () => context.reload(),\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 // Persistent master switch: saves prewalk.enabled to the same scope\n // the settings UI writes (project when trusted), reloads config so\n // the rest of the session agrees, and when disabling also cancels\n // the live arm so nothing claims mid-change.\n const enabled = option === \"--enable\";\n try {\n const projectTrusted = context.isProjectTrusted();\n const saved = saveFabricConfig(\n {\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted,\n scope: projectTrusted ? \"project\" : \"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 await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\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 await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\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, pi, task);\n return;\n }\n if (command === \"tasks\") {\n await fabricUi.openTasks(context, argumentsList[0]);\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.normalizations?.length ?? 0} normal-form plans; legacy restrictions inert) \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.normalizations?.length ?? 0} normal-form plans \u00B7 ${merged.droppedOverlays + merged.droppedQuarantines + merged.droppedNormalizations} dropped (unproved rules or legacy restrictions)`,\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 invocation rejection rate ${formatEntropyMetric(latest.score)} \u00B7 ${formatEntropyMetric(latest.totals.invocationRejectionsPer1k)}/1k calls \u00B7 lower is better \u00B7 slope ${formatEntropyMetric(corpus.trend.slopePerStep)}/session \u00B7 ${\n latest.totals.invocationRejectionsPer1k === 0 && corpus.trend.slopePerStep <= 0\n ? \"no invocation rejections\"\n : \"invocation friction remains\"\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: artifact v${loadedCompiled.file.version} \u00B7 ${loadedCompiled.file.normalizations?.length ?? 0} normal-form plans \u00B7 canonical capabilities preserved${loadedCompiled.file.version === 1 ? \" \u00B7 legacy restrictions inert (migration pending)\" : \"\"}`\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 let normalizationLine = \"normal forms: no witness evidence\";\n try {\n const [windowEvidence, poolLoaded] = await Promise.all([\n sessionWindowEvidenceAsync(files),\n loadObservationPoolAsync(agentDir),\n ]);\n const normal = normalFormEvidenceSummary(windowEvidence.traces);\n normalizationLine = `normal forms: ${normal.normalizedCalls} calls normalized \u00B7 ${normal.rulesApplied} rules applied \u00B7 ${normal.succeeded} succeeded \u00B7 ${normal.subsequentFailures} subsequent failures (not masked)`;\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 normalizationLine,\n reviewLine,\n `surface freedom (diagnostic, not objective): 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 Pi 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 \"@earendil-works/pi-coding-agent\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport { resolveFabricIdentity } from \"../main-agent.js\";\nimport {\n PREWALK_ARMED_MESSAGE_TYPE,\n hasPrewalkArmedPrompt,\n prewalkArmedPrompt,\n} from \"./messages.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 pi: 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 requirePlan: prewalk.requirePlan,\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, prewalk.requirePlan);\n if (!hasPrewalkArmedPrompt(context.sessionManager.getBranch(), armedPrompt)) {\n pi.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 Main 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 pi: ExtensionAPI,\n): Promise<string | undefined> => {\n const { prewalk } = state.config;\n if (prewalk.enabled === false || !prewalk.alwaysRearm) return undefined;\n // Participants inherit Main's settings and full-code mode, but must execute\n // their assigned work instead of handing it off again on their first write.\n if (resolveFabricIdentity(context.sessionManager.getSessionId()).identity.kind !== \"main\") {\n return undefined;\n }\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 // A failed in-place return left Main on the executor: auto-arming now would\n // hand the next mutation back to the same executor and capture it as the\n // new boundary model, losing the original Main. restoreBorrowedInPlaceMain\n // runs first at session start and reload, so this only triggers when that\n // recovery also failed; an explicit /fabric prewalk arm still overrides.\n const borrowed = state.prewalk.borrowedReturn();\n if (\n borrowed &&\n context.model &&\n `${context.model.provider}/${context.model.id}` === borrowed.executorModel\n ) {\n return \"Fabric prewalk auto-arm skipped: Main is still on the executor after a failed in-place return. Restart the session or run /fabric reload to retry the return, or arm prewalk explicitly.\";\n }\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, pi, { model });\n return undefined;\n};\n", "import type {\n ExtensionAPI,\n ExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport type { CompactRequestIntent } from \"../core/compact-controller.js\";\nimport { setModelSafely } from \"./model-switch.js\";\nimport { PREWALK_CONTINUE_MESSAGE_TYPE } from \"./messages.js\";\nimport type {\n FabricPrewalkBorrowedMain,\n PrewalkController,\n} from \"./controller.js\";\n\n// The return half of in-place Prewalk: restoring the borrowed Main model after a\n// continuation, restart-safe recovery from the persisted branch, and the\n// settle-on-return path. Session start and /fabric reload run this eagerly, so it\n// stays free of the boundary engine's executor dependencies.\nconst modelForReturnKey = (key: string, context: ExtensionContext) => {\n const separator = key.indexOf(\"/\");\n if (separator <= 0 || separator === key.length - 1) return undefined;\n return context.modelRegistry.find(key.slice(0, separator), key.slice(separator + 1));\n};\n\nconst PREWALK_RETURN_COMPACTION_INSTRUCTIONS = [\n \"Compact before Main returns to its boundary model after an in-place prewalk continuation.\",\n \"Preserve the executor's final report and verification results; summarize implementation scratch work, file reads, and command output.\",\n].join(\" \");\n\nexport interface InPlacePrewalkSettleOptions {\n // Enabled by default when a compact controller is provided.\n compactOnReturn?: boolean;\n compact?: {\n request(intent: CompactRequestIntent): unknown;\n maybeCommit(context: ExtensionContext): Promise<void>;\n status?(): { pending?: unknown };\n };\n}\n// A restarted process has no in-memory borrow record, yet the branch still\n// proves Main is owed a return: a persisted in-place continuation whose\n// executor switch is the session's last recorded model change. A later model\n// change (completed return, manual pick, another cycle) supersedes it, and a\n// malformed or trajectory record carries no return identity.\nconst prewalkRecoveryCandidate = (\n branch: ReadonlyArray<unknown>,\n): FabricPrewalkBorrowedMain | undefined => {\n let continuationIndex = -1;\n let details: { continuationId?: unknown; model?: unknown; returnModel?: unknown } | undefined;\n for (let index = branch.length - 1; index >= 0; index -= 1) {\n const entry = branch[index] as { type?: unknown; customType?: unknown; details?: unknown };\n if (entry?.type !== \"custom_message\" || entry.customType !== PREWALK_CONTINUE_MESSAGE_TYPE) {\n continue;\n }\n if (typeof entry.details !== \"object\" || entry.details === null) continue;\n if ((entry.details as { mode?: unknown }).mode !== \"in-place\") continue;\n continuationIndex = index;\n details = entry.details as { continuationId?: unknown; model?: unknown; returnModel?: unknown };\n break;\n }\n if (continuationIndex < 0 || !details) return undefined;\n const continuationId = typeof details.continuationId === \"string\" ? details.continuationId : \"\";\n const executorModel = typeof details.model === \"string\" ? details.model.trim() : \"\";\n const returnModel = typeof details.returnModel === \"string\" ? details.returnModel.trim() : \"\";\n if (!continuationId || !executorModel || !returnModel || returnModel === executorModel) {\n return undefined;\n }\n let recordedExecutor: string | undefined;\n for (let index = 0; index < branch.length; index += 1) {\n const entry = branch[index] as { type?: unknown; provider?: unknown; modelId?: unknown };\n if (entry?.type !== \"model_change\") continue;\n if (index > continuationIndex) return undefined;\n recordedExecutor = `${String(entry.provider)}/${String(entry.modelId)}`;\n }\n return recordedExecutor === executorModel ? { returnModel, executorModel } : undefined;\n};\nexport const restoreBorrowedInPlaceMain = async (\n controller: PrewalkController,\n extension: ExtensionAPI,\n context: ExtensionContext,\n): Promise<boolean> => {\n let borrowed = controller?.borrowedReturn?.();\n let recovered = false;\n if (!borrowed) {\n // Restart recovery: adopt the persisted continuation's return tuple, then\n // restore through the same path. Success clears the adopted record \u2014 the\n // restore's recorded model change supersedes the historical candidate \u2014\n // while failure keeps it so the auto-arm guard can still refuse to capture\n // the executor as Main.\n const candidate = prewalkRecoveryCandidate(context.sessionManager?.getBranch?.() ?? []);\n if (!candidate || !controller.hydrateBorrowedMain(candidate)) return false;\n borrowed = candidate;\n recovered = true;\n }\n const currentKey = context.model\n ? `${context.model.provider}/${context.model.id}`\n : undefined;\n // Only snap back when this session is still on the executor we switched to.\n // A new session that already loaded Main, or a later manual pick, stays put.\n if (currentKey !== undefined && currentKey !== borrowed.executorModel) return false;\n if (currentKey === borrowed.returnModel) return false;\n\n const model = modelForReturnKey(borrowed.returnModel, context);\n if (!model) {\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${borrowed.returnModel}`);\n context.ui.notify(\n `Prewalk left Main on the executor; could not restore unavailable model ${borrowed.returnModel}.`,\n \"error\",\n );\n return false;\n }\n\n const restored = await setModelSafely(extension, model);\n if (!restored) {\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${borrowed.returnModel}`);\n context.ui.notify(\n `Prewalk left Main on the executor; could not return to ${borrowed.returnModel}. Check model authentication.`,\n \"error\",\n );\n return false;\n }\n\n if (recovered) controller.clearBorrowed();\n context.ui.notify(`Restored Main to ${borrowed.returnModel} after in-place prewalk.`, \"info\");\n return true;\n};\nexport const settleInPlacePrewalk = async (\n controller: PrewalkController,\n extension: ExtensionAPI,\n context: ExtensionContext,\n options?: InPlacePrewalkSettleOptions,\n): Promise<boolean> => {\n const sessionId = context.sessionManager.getSessionId();\n const settlement = controller.takeContinuationSettlement(sessionId);\n if (!settlement) return false;\n\n const model = modelForReturnKey(settlement.returnModel, context);\n if (!model) {\n // A failed return is not completion: dropping to the shared cancel path\n // disarms without re-arming while preserving borrowedReturn, so a later\n // session start or /fabric reload can still restore Main. Repeated settle\n // calls find no continuation and stay quiet.\n controller.cancel();\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${settlement.returnModel}`);\n context.ui.notify(\n `Prewalk completed, but Main could not return to unavailable model ${settlement.returnModel}.`,\n \"error\",\n );\n return false;\n }\n\n context.ui.setStatus(\"fabric-prewalk\", `returning Main \u2192 ${settlement.returnModel}`);\n if (options?.compact && options.compactOnReturn !== false) {\n // Compact while the executor is still active so the restored boundary\n // model re-ingests a compacted transcript instead of the executor's full\n // implementation scratch work: the return prefill is cold regardless of\n // provider cache-policy differences, so keep it small. An already-pending\n // intent (e.g. requested by the model) wins over ours. The commit is\n // best-effort; the controller records failures without throwing.\n if (!options.compact.status?.().pending) {\n options.compact.request({\n reason: \"in-place prewalk return\",\n instructions: PREWALK_RETURN_COMPACTION_INSTRUCTIONS,\n requestedBy: \"prewalk\",\n });\n }\n await options.compact.maybeCommit(context);\n }\n const restored = await setModelSafely(extension, model);\n if (!restored) {\n // A failed return is not completion: dropping to the shared cancel path\n // disarms without re-arming while preserving borrowedReturn, so a later\n // session start or /fabric reload can still restore Main. Repeated settle\n // calls find no continuation and stay quiet.\n controller.cancel();\n context.ui.setStatus(\"fabric-prewalk\", `return failed \u2192 ${settlement.returnModel}`);\n context.ui.notify(\n `Prewalk completed, but Main could not return to ${settlement.returnModel}. Check model authentication.`,\n \"error\",\n );\n return false;\n }\n\n controller.finishContinuation(sessionId, settlement.continuationId);\n const status = controller.status();\n context.ui.setStatus(\n \"fabric-prewalk\",\n status.state === \"armed\" ? `armed \u2192 ${status.model}` : undefined,\n );\n context.ui.notify(\n status.state === \"armed\"\n ? `Prewalk complete. Main returned to ${settlement.returnModel} and re-armed for the next task.`\n : `Prewalk complete. Main returned to ${settlement.returnModel}.`,\n \"info\",\n );\n return true;\n};\n", "export const FABRIC_CONVERSATION_SHORTCUT = \"ctrl+shift+a\";\nexport const FABRIC_CONVERSATION_HINT = \"ctrl+shift+a chat\";\n", "import path from \"node:path\";\nimport type {\n ToolCallEvent,\n ToolCallEventResult,\n ToolResultEvent,\n ExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { readFabricExecutionTraceV1 } from \"../audit/index.js\";\nimport { FABRIC_NESTED_TOOL_CALL_ID_PREFIX as NESTED_TOOL_CALL_ID_PREFIX } from \"../protocol.js\";\nimport { PI_CORE_TOOL_NAME_SET } from \"./pi-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 `pi.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(fullCodeMode: boolean, hiddenExtensionTools?: ReadonlySet<string>): boolean {\n const active = this.host.getActiveTools();\n if (!fullCodeMode) return this.#restore(active);\n\n this.#savedNativeCoreTools ??= active.flatMap((name, index) =>\n PI_CORE_TOOL_NAME_SET.has(name) ? [{ name, index }] : [],\n );\n const hidden = hiddenExtensionTools ?? new Set<string>();\n const next: string[] = [];\n active.forEach((name, index) => {\n if (PI_CORE_TOOL_NAME_SET.has(name)) return;\n if (hidden.has(name)) {\n if (!this.#savedHiddenExtensionTools.has(name)) {\n this.#savedHiddenExtensionTools.set(name, index);\n }\n return;\n }\n next.push(name);\n });\n for (const [name, index] of this.#savedHiddenExtensionTools) {\n if (hidden.has(name) || next.includes(name)) continue;\n this.#savedHiddenExtensionTools.delete(name);\n next.splice(Math.min(index, next.length), 0, name);\n }\n if (!next.includes(\"fabric_exec\")) next.push(\"fabric_exec\");\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 type { FabricKernel } from \"../runtime/kernel.js\";\nimport {\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 FabricPersistedExecutionDetailsV1 {\n success: boolean;\n kernel?: FabricKernel;\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 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}\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}\n\nexport interface FabricExecutionRenderDetails {\n success?: boolean;\n kernel?: FabricKernel;\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 });\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 kernel?: FabricKernel;\n trace: FabricExecutionTraceV1;\n audits?: readonly FabricPersistableAuditInput[];\n phases?: readonly string[];\n error?: string;\n outputFormat?: \"yaml\" | \"json\";\n outputFormatStartLine?: number;\n outputFormatLines?: number;\n}): FabricPersistedExecutionDetailsV1 => {\n const details: FabricPersistedExecutionDetailsV1 = {\n success: input.success,\n ...(input.kernel ? { kernel: input.kernel } : {}),\n trace: cloneTrace(input.trace),\n audits: (input.audits ?? []).map(persistableAudit),\n phases: (input.phases ?? []).filter((phase): phase is string => typeof phase === \"string\"),\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 };\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 ...(value.kernel === \"typescript\" || value.kernel === \"python\" ? { kernel: value.kernel } : {}),\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 { PI_CORE_TOOL_NAMES } from \"./pi-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 PI_CORE_TOOL_NAMES) {\n const entry = catalog.get(name);\n if (!entry) continue;\n const lines: string[] = [];\n if (entry.definition.promptSnippet) {\n lines.push(`Additional guidance for \\`pi.${name}\\`: ${entry.definition.promptSnippet}`);\n }\n const guidelines = entry.definition.promptGuidelines ?? [];\n if (guidelines.length > 0) {\n lines.push(`Guidelines for \\`pi.${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 type { FabricKernel } from \"../runtime/kernel.js\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const fabricExecutionKernelGuidance = (fullCodeMode: boolean, kernel: FabricKernel = \"typescript\", pythonRuntime: \"cpython\" | \"monty\" = \"monty\"): string =>\n [\n kernel === \"python\"\n ? `Configured fabric_exec kernel: Python (${pythonRuntime === \"monty\" ? \"Monty sandboxed subset\" : \"CPython\"}). Write Python only in \\`code\\`: top-level await/return, dicts, True/False/None, and asyncio.gather. There is no per-call language switch.`\n : \"Configured fabric_exec kernel: TypeScript. Write TypeScript only in `code`; top-level await and return are supported.\",\n \"The configured kernel is exclusive for Fabric orchestration, including when skills or earlier messages show another language. Do not invoke another interpreter through shell tools or native subprocesses merely to run Fabric orchestration in a different language. Project builds, tests, and explicitly requested interpreter work remain legitimate shell commands.\",\n fullCodeMode\n ? \"Pi Fabric full code mode: `fabric_exec` is the only way to call Pi core tools \u2014 use them as `pi.*` inside `code`.\"\n : \"Pi Fabric is in orchestration-only mode. Pi core and registered extension tools stay on their native direct execution path; inside fabric_exec, `pi.*` 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 ? \"`pi.read`\" : \"`read`\"} tool before responding \u2014 never assume its contents.`,\n ].join(\" \");\n\nexport const defaultFabricExecutionGuidance = (fullCodeMode: boolean, kernel: FabricKernel = \"typescript\", pythonRuntime: \"cpython\" | \"monty\" = \"monty\"): string =>\n kernel === \"python\"\n ? (pythonRuntime === \"monty\"\n ? \"Python backend: Monty sandboxed subset, not CPython. Native filesystem/network/environment access and arbitrary imports are unavailable; use host tools for effects. Supply acyclic JSON host arguments; recursive containers are unsupported. Underscore-prefixed direct capability attributes are unavailable: use tools.call with the exact discovered ref instead. \u03C0 is an attribute object; payloads is a dict, not the same identity. \"\n : \"Python backend: CPython; native standard-library imports are available. \") + \"Python fabric_exec: write an async function body with `await` and `return`; each invocation starts fresh. Use imports supported by the configured backend, such as `import asyncio`. Host methods accept one dict or keyword arguments: `await tools.search(query=\\\"example\\\")`, `await tools.call(ref=\\\"provider.action\\\", args={\\\"key\\\": \\\"value\\\"})`; discover with tools.search instead of enumerating: tools.list is a capped page (default 100, hard cap 1000) with no truncation marker, so a short result never proves an action is absent (tools.list(envelope=True) reports totals). Known actions use mcp.<server>.<tool>, memory.*, state.*, schema.*, compact.*, components.*, agents.*, or mesh.*. Responses are native Python dicts/lists, not attribute objects. Use `asyncio.gather` for independent calls. `\u03C0.key` and `payloads[\\\"key\\\"]` contain only the exact top-level payload keys. Return JSON-compatible data (convert sets, bytes, paths, and datetimes explicitly); print output is bounded. JavaScript callback helpers (workflow, memory.walk, and predicate callbacks) are not Python APIs; page with ordinary await/loops instead. Provider argument validation and approvals remain host-enforced. Schema enforce retains host gates and requires the selected runtime\u2019s isolation; no unrestricted fallback.\" + (fullCodeMode ? \" `await pi.read(\\\"/x\\\")`, `await pi.grep(pattern=\\\"TODO\\\", path=\\\"src\\\")`, `await pi.find(pattern=\\\"*.py\\\", path=\\\"src\\\")`, and `await pi.ls(\\\"src\\\")` return strings. `await pi.bash(command=\\\"ls\\\")`, `await pi.edit(path=\\\"/x\\\", oldText=\\\"a\\\", newText=\\\"b\\\")`, and `await pi.write(path=\\\"/y\\\", content=\u03C0.body)` return dicts; read `r[\\\"output\\\"]`. Shell nonzero exits raise; `settle=True` returns a failure dict instead. Cancellation, timeout, approval and security errors still raise. A nested shell that exceeds executor.shellHangMs still resolves ok with a still-running notice, pid, and live output path; background=True detaches immediately. Detached results include details.taskId; completion notifies this session. Use tools.call(ref='tasks.list', args={}), tasks.get or tasks.stop with {'id': taskId}; pi.read can read the bounded log. Opt-in monitor={'delivery':'wake','match':'literal','timeoutMs':300000,'intervalMs':5000} (choose delivery 'ui' or 'wake') also detaches: UI-only never wakes the agent, wake sends coalesced line events. Monitors expire and are not automatically renewed. Captured tools are `await extensions.<name>(...)`.\" : \" Pi core and extensions are unavailable inside fabric_exec in orchestration-only mode.\")\n : fullCodeMode\n ? \"Examples and returns: `pi.read('/x')`, `pi.grep('TODO','src')` / `pi.grep({pattern:'TODO', path:'src', ignoreCase:true, context:2})`, `pi.find({pattern:'*.ts', path:'src', limit:20})`, and `pi.ls('src')` return strings; `pi.bash({cmd:'ls'})` (or `pi.powershell` on Windows), `pi.edit({path:'/x', old:'a', new:'b'})`, and `pi.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 `pi.bash` or `pi.powershell` to get `{ ok: false, exitCode, output, error }` instead. Timeout, cancellation, approval, and security failures still reject. A nested shell that exceeds `executor.shellHangMs` still resolves `ok: true` with a still-running notice, pid, and live output path; `background: true` detaches immediately. Detached results include `details.taskId`; completion notifies this session, without polling. Use `tools.call({ref:'tasks.list',args:{}})` or `tasks.get`/`tasks.stop` with `{id: taskId}`; `pi.read` can read the bounded log. Opt-in `monitor:{delivery:'ui'|'wake',match:'literal',timeoutMs:300000,intervalMs:5000}` also detaches: UI-only never wakes the agent, wake sends coalesced line events. Monitors expire and are not automatically renewed.\\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. `pi` is the core tools; `\u03C0.<key>` reads named `strings` (not a tool).\"\n : \"Call known actions through `mcp.<sanitized_server>.<sanitized_tool>(args)`, `memory.*`, `state.*`, `schema.*`, `components.*`, `compact.*`, `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 pi 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 pi.* 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 pi.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 pi.edit/write/bash/powershell, 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", "import type { Skill } from \"@earendil-works/pi-coding-agent\";\nimport { formatSkillsForPrompt } from \"./skill-block.js\";\n\nconst SKILL_SECTION_HEADING =\n \"The following skills provide specialized instructions for specific tasks.\";\nconst PI_SKILL_LOAD_INSTRUCTION =\n \"Use the read tool to load a skill's file when the task matches its description.\";\nconst FABRIC_SKILL_LOAD_INSTRUCTION =\n \"Use `pi.read` inside `fabric_exec` to load a skill's file when the task matches its description.\";\nconst CWD_MARKER = \"\\nCurrent working directory:\";\n\nexport const restoreSkillsForFullCodePrompt = (\n systemPrompt: string,\n skills: readonly Skill[],\n fullCodeMode = true,\n): string => {\n const section = formatSkillsForPrompt([...skills]).replace(\n PI_SKILL_LOAD_INSTRUCTION,\n fullCodeMode ? FABRIC_SKILL_LOAD_INSTRUCTION : PI_SKILL_LOAD_INSTRUCTION,\n );\n // Replace the catalog, not just its loader sentence: a previous catalog may\n // advertise skills for a different kernel, including in native-tool mode.\n const start = systemPrompt.indexOf(SKILL_SECTION_HEADING);\n const end = start < 0 ? -1 : systemPrompt.indexOf(\"</available_skills>\", start);\n if (start >= 0 && end >= 0) {\n return systemPrompt.slice(0, start) + section.trimStart() +\n systemPrompt.slice(end + \"</available_skills>\".length);\n }\n if (!section) return systemPrompt;\n\n const cwdIndex = systemPrompt.lastIndexOf(CWD_MARKER);\n if (cwdIndex < 0) return `${systemPrompt}${section}`;\n return `${systemPrompt.slice(0, cwdIndex)}${section}${systemPrompt.slice(cwdIndex)}`;\n};\n", "import { statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { FabricKernel } from \"../runtime/kernel.js\";\n\n// Both trees use identical public names. Contribute only one physical root;\n// Pi resolves skill expansion and relative references from that root.\nexport const fabricSkillPaths = (root: string, kernel: FabricKernel): string[] => {\n const selected = path.join(root, kernel);\n if (!statSync(selected, { throwIfNoEntry: false })?.isDirectory()) {\n throw new Error(`Missing Fabric ${kernel} skill tree: ${selected}. Reinstall Fabric; no other-kernel fallback is available.`);\n }\n return [selected];\n};\n", "import { PI_CORE_TOOL_NAME_SET } from \"./pi-tools.js\";\n\nexport const PROXY_CONTRACT_CUSTOM_TYPE = \"pi-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 (PI_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 * `pi-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 \"@earendil-works/pi-ai\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n ToolCallEvent,\n} from \"@earendil-works/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 ...(left.cacheWrite1h !== undefined || right.cacheWrite1h !== undefined\n ? { cacheWrite1h: (left.cacheWrite1h ?? 0) + (right.cacheWrite1h ?? 0) }\n : {}),\n ...(left.reasoning !== undefined || right.reasoning !== undefined\n ? { reasoning: (left.reasoning ?? 0) + (right.reasoning ?? 0) }\n : {}),\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 pi: Pick<ExtensionAPI, \"getAllTools\">,\n readonly getConfig: () => FabricConfig,\n readonly sessionApprovals: FabricSessionApprovals,\n readonly classifier = new FabricAutoApprovalClassifier(() => getConfig().jev),\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.pi.getAllTools().find((tool) => tool.name === toolName);\n const builtin = metadata?.sourceInfo.source === \"builtin\";\n const provider = builtin ? \"pi\" : \"extensions\";\n return {\n ref: provider + \".\" + toolName,\n provider,\n name: toolName,\n description: metadata?.description ?? \"Direct Pi 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 disableModelInvocation?: 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.disableModelInvocation !== 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 pi.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 } from \"@earendil-works/pi-coding-agent\";\nimport type { TSchema } from \"@earendil-works/pi-ai\";\nimport { Container, Text, type Component } from \"@earendil-works/pi-tui\";\n\ntype AnyToolDefinition = ToolDefinition<any, any, any>;\n\n// Local mirror of the host's defineTool declaration shape (pi 0.84.2):\n// identity at runtime, inference-preserving in the type system.\nconst defineTool = <TParams extends TSchema, TDetails = unknown, TState = any>(\n tool: ToolDefinition<TParams, TDetails, TState>,\n): ToolDefinition<TParams, TDetails, TState> & AnyToolDefinition =>\n tool as ToolDefinition<TParams, TDetails, TState> & AnyToolDefinition;\nimport { arcItemStyled } from \"./ui/arc-group.js\";\nimport type { CodePreviewSettings } from \"./ui/code-preview.js\";\nimport {\n type FabricToolShellDecorator,\n withCodePreviewShell,\n} from \"./ui/code-preview-shell.js\";\nimport { fabricExecTitleHintCached } from \"./ui/fabric-title-hint.js\";\nimport { Type } from \"typebox\";\nimport {\n createFabricPersistedExecutionDetails,\n readFabricExecutionRenderDetails,\n} from \"./audit/index.js\";\nimport { DEFAULT_FABRIC_CONFIG } from \"./config.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 {\n FABRIC_REPEAT_BLOCK,\n FABRIC_REPEAT_WARN,\n FabricRepeatGuard,\n fabricRepeatBlockText,\n fabricRepeatWarnText,\n} from \"./repeat-guard.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, observePiTheme } from \"./ui/highlight.js\";\nimport {\n HiddenRowBorrowingComponent,\n observeResultRows,\n type ResultRowBalance,\n} from \"./ui/row-balance.js\";\nimport { observeAnimationRows, 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;\nconst MAX_FABRIC_CODE_TRANSFER_LINES = 12;\n\ntype FabricRendererState = {\n fabricKernel?: \"typescript\" | \"python\";\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\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 toolKernel = (state: FabricState): \"typescript\" | \"python\" =>\n state.bootstrapped ? state.config.executor?.kernel ?? \"typescript\" : \"typescript\";\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`}`;\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, any> => {\n const python = toolKernel(state) === \"python\";\n const monty = python && state.config.executor.pythonRuntime === \"monty\";\n const repeatGuard = new FabricRepeatGuard(FABRIC_REPEAT_WARN, FABRIC_REPEAT_BLOCK);\n return decorateShell(\n defineTool({\n name: \"fabric_exec\",\n label: \"Fabric\",\n description: python\n ? monty\n ? \"Execute Python through Fabric's configured Monty sandbox. Monty runs a Python subset with VM resource limits, no native filesystem/network/environment access, and only host-mediated tools. Each invocation starts fresh. This is the exclusive model tool path in full code mode and Schema enforce mode.\"\n : \"Execute Python through Fabric\u2019s configured CPython kernel for Pi core tools, MCP, providers, discovery, and extensions. Each call uses a fresh process. Native execution is trusted code; Schema enforce requires OS isolation. This is the exclusive model tool path in full code mode and Schema enforce mode.\"\n : \"Execute type-checked TypeScript through Fabric's configured executor for Pi core 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 promptSnippet:\n \"Pi core tools, MCP, Fabric providers, discovery, and extensions\",\n promptGuidelines: [\n python\n ? \"Batch independent operations in one `fabric_exec` Python program with `asyncio.gather`; await dependent/conditional steps sequentially. Coalesce independent replacements into one `await pi.edit(path=..., edits=[...])`. Return only the compact final JSON-compatible value.\"\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 `pi.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 python\n ? \"Search before reading with `await pi.grep(pattern=..., path=...)` or `await pi.find(pattern=..., path=...)`, then `await pi.read(path=..., offset=..., limit=...)`. Use Python dict syntax, `True`/`False`/`None`, and bounded searches; unbounded reads cap at 2000 lines or 50KB. Read continuation notices when needed.\"\n : \"Search before reading: use `pi.grep`/`pi.find` to locate relevant lines, then `pi.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 `pi.read` returns at most 2000 lines or 50KB and, when truncated, ends with a `Use offset=\u2026` continuation notice; reserve whole-file reads for small files you will use in full.\",\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 python\n ? \"For test/probe nonzero exits, use `await pi.bash(command=..., settle=True)` and inspect the returned dict: `r['ok']`, `r['output']`, and `r.get('exitCode')`. Set shell `timeout` in seconds once for long suites. Return decisions and evidence rather than raw logs.\"\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 `pi.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 `\u03C0.key` must exactly match a key there; prefer `pi.edit`/`pi.write`. `pi.bash`: no stdin.\",\n \"Use `display.name` and objective `display.description`; Fabric pairs them with verified outcomes in deterministic compaction.\",\n ...(monty ? [\"Monty requires acyclic JSON host arguments. For underscore-prefixed provider/tool names, use `await tools.call(ref=..., args={...})`, not direct attributes. Use `payloads['key']` for private/non-identifier payload keys.\"] : []),\n ],\n // The model-facing schema is intentionally flat: one large `code` string\n // plus scalar/optional params. Do not add nested arrays-of-objects with\n // escaped content here. SOTA models are post-trained on one dominant\n // harness's flat tool shapes and can invent trailing keys at the\n // highest-entropy point of a nested escaped-JSON field, which a strict\n // schema hard-rejects. Keep this surface string/scalar-heavy; the only\n // nested field (display) ignores unknown keys. See\n // lucumr.pocoo.org/2026/7/4/better-models-worse-tools/ and pi-tool-repair.\n // display also accepts a bare (or JSON-object) string, silently repaired\n // to { name } via normalizeRunDisplay: flash-tier models cold-start with\n // that near-miss, and repairing beats a zero-work rejection round trip.\n // payloads is the remaining nested map (legacy alias: strings). The old\n // name collides with the JSON string type, so models stringify it;\n // prepareArguments remaps `strings` and parses a JSON-object string\n // back to Record<string, string> before Pi validates.\n parameters: Type.Object({\n code: Type.String({\n description: python\n ? monty\n ? \"Python async function body executed by Monty, a sandboxed Python subset (not CPython). Top-level await/return and asyncio.gather are supported. Use only Monty's supported syntax/modules; native imports, filesystem, network, and environment are unavailable. Host globals: tools, mcp, memory, state, schema, compact, components, agents, mesh; full-code mode adds pi and extensions. Await dict/keyword calls; use native dict results r['output']. Payloads: \u03C0.key or payloads['key']. Return JSON-compatible data; each invocation starts fresh.\"\n : \"Python async function body executed by CPython. Top-level await and return are supported; standard-library imports are available. Globals: tools, mcp, memory, state, schema, compact, components, agents, mesh; full-code mode adds pi and extensions. Await host calls using a dict or keyword arguments. Results are native dicts/lists: r['output'], not r.output. Use asyncio.gather for concurrency. Named payloads are \u03C0.key or payloads['key']. Return a JSON-compatible value. Each call starts fresh.\"\n : \"TypeScript function body. Top-level await and return are supported. Globals include `tools`, `mcp`, `memory`, `state`, `schema`, `compact`, `agents`, `mesh`, `print`, and `\u03C0`; full-code mode adds `pi` and `extensions`. `\u03C0` contains only the exact keys supplied by this call's `payloads`. See session guidance / `fabric-exec` skill for exact signatures.\",\n }),\n payloads: Type.Optional(\n Type.Record(Type.String(), Type.String(), {\n description:\n \"Named payloads exposed under the same exact name as \u03C0.key (for example, payloads.contract becomes \u03C0.contract). Never reference a \u03C0 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 ...(python ? {} : {\n tokenBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional token budget observed by workflow.agent() calls\",\n }),\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 // Pi 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 prepareArguments(args) {\n return prepareFabricExecArguments(args, toolKernel(state)) as any;\n },\n renderCall(params, theme, context) {\n observePiTheme(theme);\n const code = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const mode = toolDisplayMode(state);\n const rendererState = context.state as FabricRendererState;\n const python = (rendererState.fabricKernel ?? toolKernel(state)) === \"python\";\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 = python ? [] : fabricWriteBindings(code);\n }\n // The write argument preview is a streaming affordance: it previews\n // pending writes while args are still arriving. Pi 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 strings: resolveFabricExecPayloads(params),\n expanded: context.expanded,\n cwd: context.cwd,\n settings: codePreviewSettings,\n spinner,\n },\n theme,\n context.invalidate,\n );\n // Pi's 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 // The kernel-aware memo serves the live card, activity and compaction.\n const title = display?.name?.trim()\n || (fabricExecTitleHintCached(code, python ? \"python\" : \"typescript\")\n ?? (python ? \"Python program\" : undefined));\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 observeAnimationRows(composite, rendererState.fabricSpinner ??= {});\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\", `${python ? \"Python\" : \"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 observeAnimationRows(composite, rendererState.fabricSpinner ??= {});\n },\n renderResult(result, { expanded, isPartial }, theme, context) {\n observePiTheme(theme);\n const details = readFabricExecutionRenderDetails(result.details);\n let audits = restoreLegacyBashCommands(\n details.audits as FabricRenderAudit[],\n context.args,\n );\n const rendererState = context.state as FabricRendererState;\n const recordedKernel = details.kernel ?? (isPartial ? undefined : \"typescript\");\n if (recordedKernel && rendererState.fabricKernel !== recordedKernel) {\n const renderedKernel = rendererState.fabricKernel ?? toolKernel(state);\n rendererState.fabricKernel = recordedKernel;\n delete rendererState.fabricWriteBindingsCode;\n if (renderedKernel !== recordedKernel) context.invalidate();\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 observeAnimationRows(inheritComponentBackground(component), rendererState.fabricSpinner ??= {}),\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 `strings` \u2192 `payloads`\n // and quotes unquoted pi path arguments before Pi validates this call;\n // keep the same coercion here for direct internal invocations.\n const joined = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const code = state.config.executor.kernel === \"python\" ? joined : repairFabricGuestCode(joined);\n const repeat = repeatGuard.observe(code);\n if (repeat.blocked) {\n return {\n content: [{ type: \"text\", text: fabricRepeatBlockText(repeat.count) }],\n isError: true,\n details: undefined,\n };\n }\n const runDisplay = normalizeRunDisplay(params.display);\n const strings = resolveFabricExecPayloads(params);\n const tokenBudget = \"tokenBudget\" in params && typeof params.tokenBudget === \"number\"\n ? params.tokenBudget : undefined;\n const result = await state.execution.execute({\n code,\n ...(strings ? { strings } : {}),\n signal,\n parentToolCallId: toolCallId,\n context,\n ...(tokenBudget !== undefined ? { tokenBudget } : {}),\n ...(params.agentBudget !== undefined ? { maxAgentCalls: params.agentBudget } : {}),\n ...(params.timeoutMs !== undefined ? { requestedTimeoutMs: params.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 params.resultFormat ?? state.config.executor.resultFormat;\n const boundarySessionId = context.sessionManager.getSessionId();\n const pendingHandoff = await state.claimHandoff(\n result,\n boundarySessionId,\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 // The nudge budget is spent and the arm still has no plan: the handoff\n // proceeds rather than stalling the session, and that is worth saying.\n if (pendingHandoff.readiness?.kind === \"unplanned\") {\n context.ui.notify(\n `Prewalk: handing off without a recorded plan after ${pendingHandoff.readiness.prompts} reminders.`,\n \"warning\",\n );\n }\n } else if (state.prewalk.planRequired(boundarySessionId)) {\n // This boundary was withheld because the plan is still owed. Reflect the\n // planning phase instead of leaving the footer reading \"armed\".\n const prewalkStatus = state.prewalk.status();\n context.ui.setStatus(\n \"fabric-prewalk\",\n prewalkStatus.state === \"armed\" ? `plan awaited \u2192 ${prewalkStatus.model}` : undefined,\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 if (repeat.warn) fullSections.push(fabricRepeatWarnText(repeat.count, FABRIC_REPEAT_BLOCK));\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 if (repeat.warn) sections.push(fabricRepeatWarnText(repeat.count, FABRIC_REPEAT_BLOCK));\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 persistedRenderDetails = () =>\n createFabricPersistedExecutionDetails({\n ...result,\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 // In-place prewalk continuation arrives as an in-band context message on\n // this boundary turn, so the loop must keep running: the executor's first\n // request follows naturally. Terminating here would strand the\n // continuation \u2014 no queued turn remains to carry it.\n const inPlaceContinuation = pendingHandoff?.kind === \"prewalk-in-place\";\n const terminate =\n !inPlaceContinuation &&\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 `pi.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 // pi 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 // Images the guest returned directly, hoisted out of the text channels by\n // the media sanitizer; their descriptors remain in the text.\n for (const block of result.media ?? []) mediaBlocks.push(block);\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 pi'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 pi 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 pi 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};\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 type { FabricKernel } from \"./runtime/kernel.js\";\nimport { normalizeRunDisplay } from \"./run-display.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\n\nconst OPTIONAL_FABRIC_EXEC_KEYS = [\n \"payloads\",\n \"strings\",\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 looksLikeJsonObject = (text: string): boolean =>\n text.startsWith(\"{\") && text.endsWith(\"}\");\n\nconst looksLikeJsonString = (text: string): boolean =>\n text.startsWith('\"') && text.endsWith('\"');\n\nconst parseJsonObject = (text: string): Record<string, unknown> | undefined => {\n const trimmed = text.trim();\n if (!looksLikeJsonObject(trimmed) && !looksLikeJsonString(trimmed)) return undefined;\n try {\n let parsed: unknown = JSON.parse(trimmed);\n // One extra unwrap: models sometimes JSON-encode the object twice.\n if (typeof parsed === \"string\") {\n const inner = parsed.trim();\n if (!looksLikeJsonObject(inner)) return undefined;\n parsed = JSON.parse(inner);\n }\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst asStringRecord = (record: Record<string, unknown>): Record<string, string> | undefined => {\n if (Object.values(record).some((value) => typeof value !== \"string\")) return undefined;\n return record as Record<string, string>;\n};\n\n// Silent repair for the named-payload map. The declared shape is\n// Record<string, string>, but models stringify nested maps (the highest-entropy\n// escaped field in an otherwise flat tool), which strict schema validation\n// rejects at the cost of a zero-work round trip. `strings` is a legacy alias:\n// the name collides with the JSON string type and taught models to pass one.\nconst normalizeFabricExecStrings = (\n input: unknown,\n): Record<string, string> | undefined => {\n if (isRecord(input)) return asStringRecord(input);\n if (typeof input !== \"string\") return undefined;\n const parsed = parseJsonObject(input);\n return parsed ? asStringRecord(parsed) : undefined;\n};\n\nexport const resolveFabricExecPayloads = (params: {\n payloads?: unknown;\n strings?: unknown;\n}): Record<string, string> | undefined =>\n normalizeFabricExecStrings(params.payloads) ?? normalizeFabricExecStrings(params.strings);\n\nexport const prepareFabricExecArguments = (input: unknown, kernel: FabricKernel = \"typescript\"): unknown => {\n if (typeof input === \"string\") return { code: kernel === \"python\" ? input : repairFabricGuestCode(input) };\n if (!isRecord(input)) return input;\n\n let prepared = input;\n const writable = (): Record<string, unknown> => {\n if (prepared === input) prepared = { ...input };\n return prepared;\n };\n\n if (Array.isArray(prepared.code) && prepared.code.every((line) => typeof line === \"string\")) {\n writable().code = prepared.code.join(\"\\n\");\n }\n if (kernel === \"typescript\" && typeof prepared.code === \"string\") {\n const repaired = repairFabricGuestCode(prepared.code);\n if (repaired !== prepared.code) writable().code = repaired;\n }\n\n for (const key of OPTIONAL_FABRIC_EXEC_KEYS) {\n if (!Object.hasOwn(prepared, key)) continue;\n if (prepared[key] === null || prepared[key] === undefined) delete writable()[key];\n }\n\n const display = prepared.display;\n if (typeof display === \"string\" || isRecord(display)) {\n const normalized = normalizeRunDisplay(display);\n if (normalized) writable().display = normalized;\n else delete writable().display;\n }\n\n const hasPayloads = Object.hasOwn(prepared, \"payloads\");\n const hasStrings = Object.hasOwn(prepared, \"strings\");\n if (hasPayloads || hasStrings) {\n const raw = hasPayloads ? prepared.payloads : prepared.strings;\n const normalized = normalizeFabricExecStrings(raw);\n if (normalized) {\n if (prepared.payloads !== normalized) writable().payloads = normalized;\n } else if (!hasPayloads) {\n writable().payloads = raw;\n }\n if (hasStrings) delete writable().strings;\n }\n\n return prepared;\n};\n", "/**\n * Degenerate-loop breaker for fabric_exec. Identical guest code back-to-back\n * is how lower-tier models burn a session (2026-09-15: 220x `bash echo noop`\n * on glm-5.3-flash). Display names and payload cosmetics are deliberately\n * excluded from the fingerprint: cosmetic variation is part of the loop\n * signature, not evidence of new work. Any differing code resets the count.\n */\nexport const FABRIC_REPEAT_WARN = 3;\nexport const FABRIC_REPEAT_BLOCK = 6;\n\nexport const fabricRepeatWarnText = (count: number, blockAt: number): string =>\n `[circuit-breaker] identical fabric_exec code has now run ${count} times in a row; at ${blockAt} identical runs will be blocked. Change the approach or finish your turn.`;\n\nexport const fabricRepeatBlockText = (count: number): string =>\n `Circuit breaker: this exact fabric_exec code has now executed ${count} times in a row and was blocked. Re-running identical code adds no information. Summarize what you already know and finish your turn; if the call is genuinely required, change the code materially.`;\n\nexport class FabricRepeatGuard {\n #code: string | undefined;\n #count = 0;\n\n constructor(\n /** Consecutive identical executions that start producing a warning. */\n readonly warnAt: number,\n /** Consecutive identical executions that get blocked outright. */\n readonly blockAt: number,\n ) {}\n\n observe(code: string): { count: number; blocked: boolean; warn: boolean } {\n this.#count = code === this.#code ? this.#count + 1 : 1;\n this.#code = code;\n return { count: this.#count, blocked: this.#count >= this.blockAt, warn: this.#count >= this.warnAt };\n }\n}\n", "import {\n GUEST_TYPE_DECLARATIONS,\n PI_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 PI_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES;\n\nexport const CORE_TOOL_NAMES: readonly CoreToolName[] = Object.keys(\n PI_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: PiEditOperation[]; 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(Pi[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 Pi* 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 `Pi${capitalise(tool)}Argument`,\n PI_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES[tool],\n `Pi${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 = /\\bpi\\.(?:edit|write)\\s*\\(/;\nconst UNQUOTED_PATH_HEAD =\n /\\bpi\\.(?: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 PI_CALL_PATTERN = /\\bpi\\.(\\w+)\\s*\\(/g;\n\n// fabric_exec envelope arguments that are commonly misplaced inside `code`.\nconst FABRIC_EXEC_ARGUMENT_NOTES: Readonly<Record<string, string>> = {\n payloads:\n \"named `payloads` belong in the outer `fabric_exec` arguments, then become available inside `code` as `\\u03c0.key`.\",\n strings:\n \"`strings` is an alias for outer `payloads`; named values belong in the outer `fabric_exec` arguments, then become available inside `code` as `\\u03c0.key`.\",\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:\n \"`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 `pi.*` calls reject failures normally.\",\n timeout: \"`timeout` is measured in seconds; `timeoutMs` is converted from milliseconds.\",\n background:\n \"`background: true` detaches immediately: the await returns ok:true with a still-running notice, pid, and live output path. Do not poll; `pi.read` the path when you need output.\",\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 \"Pi shell tools do not accept `stdin`. Write the content with `pi.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. 'PiCommandArgument &\n// PiBashOptions'); strip alias suffixes to recover the called tool.\nconst toolFromTypeText = (typeText: string): string | undefined => {\n for (const match of typeText.matchAll(/\\bPi([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. 'PiPathArgument'): find\n// the `pi.<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 PI_CALL_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n let tool: string | undefined;\n while ((match = PI_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\" || tool === \"powershell\") {\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 \\`pi.${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) => `\\`pi.${owner}\\``).join(\", \");\n const note = PROPERTY_NOTES[property];\n return `Recovery hint: \\`${property}\\` is not a \\`pi.${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 `\\u03c0.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. `pi.read('/x')` or `pi.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 `\\u03c0.key` instead of escaping it inside `code`.\";\n};\n", "import { truncateToWidth, type Component } from \"@earendil-works/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): 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 (pi'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): 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 fs from \"node:fs/promises\";\nimport { closeScratch, createScratch } from \"./storage/scratch.js\";\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 = createScratch(\"output\");\n try {\n const artifactPath = path.join(directory, \"output.txt\");\n await fs.writeFile(artifactPath, content, { encoding: \"utf8\", mode: 0o600, flag: \"wx\" });\n closeScratch(directory);\n return artifactPath;\n } catch (error) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n throw error;\n }\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 body = truncateMiddle(visible, bodyBudget);\n let text = `${body}${suffix}`;\n if (text.length > maxChars) {\n // The suffix carries the artifact path; shrink the body again instead of\n // cutting into the path. A truncation marker can itself exceed a tiny\n // rebudget, so fall back to the bare suffix (or its tail), which always\n // fits and still ends with the path.\n const rebudget = maxChars - suffix.length;\n if (rebudget <= 0) {\n text = suffix.slice(-Math.max(1, maxChars));\n } else {\n const shrunk = truncateMiddle(body, rebudget);\n text = shrunk.length + suffix.length <= maxChars ? `${shrunk}${suffix}` : suffix;\n }\n }\n return {\n text,\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 \"@earendil-works/pi-coding-agent\";\nimport { resolveAgentDir } from \"./core/agent-dir.js\";\nimport type { ExtensionAPI } from \"@earendil-works/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 } from \"./fabric-runtime-state.js\";\nimport type { FabricRuntimePaths } from \"./runtime-paths.js\";\nimport type { FabricLoadedFileIdentity } from \"./build-identity.js\";\n\nimport { FabricManagedHost, type FabricManagedHostOptions } from \"./managed-host.js\";\n\nexport interface FabricStateOptions {\n managedHost?: FabricManagedHostOptions;\n paths?: FabricRuntimePaths;\n runtimeLoader?: () => Promise<typeof import(\"./fabric-runtime-state.js\")>;\n entryIdentity?: FabricLoadedFileIdentity;\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 #kernelReloadRequired = false;\n\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 #managedHost: FabricManagedHost | undefined;\n readonly #entryIdentity: FabricLoadedFileIdentity | undefined;\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 pi: ExtensionAPI,\n readonly capturedTools: CapturedToolCatalog,\n options: FabricStateOptions = {},\n ) {\n this.#options = options;\n this.#managedHost = options.managedHost ? new FabricManagedHost(options.managedHost) : undefined;\n this.#entryIdentity = options.entryIdentity;\n }\n\n get kernelReloadRequired(): boolean {\n return this.#kernelReloadRequired;\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(\"Pi 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 shellJobs(): FabricRuntimeState[\"shellJobs\"] | undefined { return this.#runtime?.shellJobs; }\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 = this.#managedHost?.config() ?? loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#config = config;\n this.#kernelReloadRequired = false;\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 const next = this.#managedHost?.config() ?? loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#kernelReloadRequired = next.executor.kernel !== this.#config.executor.kernel;\n next.executor.kernel = this.#config.executor.kernel;\n this.#config = next;\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.PI_FABRIC_CAPABILITY_REQUIREMENTS !== undefined &&\n Boolean(process.env.PI_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.PI_FABRIC_PROJECT_ROOT ?? context.cwd;\n const meshRoot = process.env.PI_FABRIC_MESH_ROOT ??\n (this.config.mesh.root\n ? path.resolve(projectRoot, this.config.mesh.root)\n : path.join(projectRoot, \".pi\", \"fabric\", \"mesh\"));\n const fabricSessionId = process.env.PI_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 get advisorsHalted(): boolean { return this.#current()?.advisorsHalted ?? false; }\n haltAdvisors(): number { return this.#current()?.haltAdvisors() ?? 0; }\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 (this.#managedHost) {\n this.#managedHost.register(provider, options.overwrite);\n return;\n }\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 (this.#managedHost) throw new Error(\"Managed host component registration is disabled\");\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 = this.#managedHost?.config() ?? loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n if (this.#config) {\n // Pi skill discovery is additive. Keep execution aligned with the loaded\n // skill tree until Pi reload creates a fresh extension/resource runtime.\n this.#kernelReloadRequired = next.executor.kernel !== this.#config.executor.kernel;\n next.executor.kernel = this.#config.executor.kernel;\n next.schema.mode = this.#config.schema.mode;\n // Isolate the selected language, including when a live schema override\n // differs from disk. CPython selects its OS sandbox at execution time.\n if (next.schema.mode === \"enforce\" && next.executor.kernel === \"typescript\") {\n next.executor.runtime = \"quickjs\";\n }\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.#managedHost) throw new Error(\"Managed host policy is immutable\");\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 if (this.#config.executor.kernel === \"typescript\") 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 ?? disk).executor.kernel === \"python\"\n ? (this.#config ?? disk).executor.pythonRuntime\n : this.#config?.executor.runtime ?? disk.executor.runtime,\n };\n }\n\n #diskConfig(context: ExtensionContext): FabricConfig {\n if (this.#managedHost) return this.#managedHost.config();\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 await this.#managedHost?.close();\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(\"Pi 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 // Bootstrap stays cheap and may precede first use by minutes. Refresh only\n // the component plane here; executor/language policy remains bootstrapped.\n if (!this.#managedHost && !reinitialize) {\n const { FabricComponentConfiguration } = await import(\"./components/configuration.js\");\n try {\n config.components = new FabricComponentConfiguration({\n cwd: context.cwd, agentDir: resolveAgentDir(), projectTrusted: () => context.isProjectTrusted(),\n }).read().entries;\n } catch (error) {\n // Keep the bootstrapped manifest usable for repair. The live control\n // plane records this read failure and watches for a corrected file.\n if (context.hasUI) context.ui.notify(`Pi Fabric component configuration not applied: ${error instanceof Error ? error.message : String(error)}`, \"error\");\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.pi,\n this.capturedTools,\n {\n ...(this.#managedHost ? {managedHost: this.#managedHost} : {}),\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.#entryIdentity ? { entryIdentity: this.#entryIdentity } : {}),\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(\"Pi Fabric has not activated\");\n return runtime;\n }\n}\n", "import { DEFAULT_FABRIC_CONFIG, type FabricConfig } from \"./config.js\";\nimport { createProviderComponent, type FabricProviderComponent } from \"./components/provider-component.js\";\nimport type { FabricProvider } from \"./protocol.js\";\n\nconst REPLACEABLE = new Set([\"agents\", \"memory\", \"compact\", \"schema\", \"state\", \"mesh\", \"mcp\"]);\nexport interface FabricManagedHostOptions {\n /** Host code only; never read from project/global configuration or the provider event payload. */\n providers: readonly string[];\n}\n\n/** Closed-world provider authority for embedded hosts. Native providers cannot return on reload. */\nexport class FabricManagedHost {\n readonly #allowed: Set<string>;\n readonly #providers = new Map<string, FabricProvider>();\n readonly #retired = new Set<FabricProvider>();\n #sealed = false;\n constructor(options: FabricManagedHostOptions) {\n this.#allowed = new Set(options.providers);\n for (const name of this.#allowed) if (!REPLACEABLE.has(name)) throw new Error(`Managed host cannot replace provider: ${name}`);\n }\n register(provider: FabricProvider, overwrite = false): void {\n if (!this.#allowed.has(provider.name)) throw new Error(`Managed host provider not authorized: ${provider.name}`);\n const previous = this.#providers.get(provider.name);\n if (previous === provider) return;\n if (this.#sealed) throw new Error(\"Managed provider authority is sealed; create a new host to replace it\");\n if (previous && !overwrite) throw new Error(`Fabric provider already registered: ${provider.name}`);\n if (previous) this.#retired.add(previous);\n this.#providers.set(provider.name, provider);\n }\n seal(): void {\n for (const name of this.#allowed) if (!this.#providers.has(name)) throw new Error(`Managed host provider missing: ${name}`);\n this.#sealed = true;\n }\n has(name: string): boolean { return this.#allowed.has(name); }\n /** Only sealed, live host providers delegate effect approval to the host broker. */\n ownsProvider(name: string): boolean { return this.#sealed && this.#providers.has(name); }\n provider(name: string): FabricProvider {\n const source = this.#providers.get(name);\n if (!source) return {name, description: \"Unavailable in managed host\", list: async () => [], describe: async () => undefined, invoke: async () => {throw new Error(`Managed host provider unavailable: ${name}`);}};\n // Components own publication, while the host owns the supplied object's lifetime. Reload does\n // not close then reuse it; final host shutdown awaits close exactly once after withdrawal.\n return {name, description: source.description, list: source.list.bind(source), describe: source.describe.bind(source), invoke: source.invoke.bind(source),\n ...(source.prepareArguments ? {prepareArguments: source.prepareArguments.bind(source)} : {}),\n ...(source.acquire ? {acquire: source.acquire.bind(source)} : {}),\n ...(source.invocationEnded ? {invocationEnded: source.invocationEnded.bind(source)} : {}),\n ...(source.subscribeCatalog ? {subscribeCatalog: source.subscribeCatalog.bind(source)} : {}),\n };\n }\n component(component: FabricProviderComponent): FabricProviderComponent {\n const name = component.definition.provides?.[0];\n if (typeof name !== \"string\" || name === \"pi\" || name === \"extensions\") return component;\n return createProviderComponent({provider: name, description: \"Managed host provider\", create: () => this.provider(name)});\n }\n config(): FabricConfig {\n const config = structuredClone(DEFAULT_FABRIC_CONFIG);\n config.fullCodeMode = true;\n config.executor.kernel = \"typescript\";\n config.executor.runtime = \"quickjs\";\n config.mcp.enabled = false;\n config.mcp.allowDynamicServers = false;\n config.mesh.enabled = false;\n config.agents.enabled = false;\n config.agents.sessionExport = false;\n config.prewalk.enabled = false;\n config.memory.enabled = false;\n config.repairs.enabled = false;\n config.entropy.compile = false;\n config.speculation.enabled = false;\n config.ui.enabled = false;\n config.schema.mode = \"off\";\n config.schema.trustedCommands = {};\n config.components = [];\n config.compaction.engine = \"fabric\";\n config.approvals = {...config.approvals, read: \"allow\", write: \"allow\", execute: \"allow\", agent: \"allow\", network: \"deny\"};\n return config;\n }\n async close(): Promise<void> {\n const providers = new Set([...this.#providers.values(), ...this.#retired]);\n this.#providers.clear(); this.#retired.clear();\n await Promise.all([...providers].map((provider) => provider.close?.()));\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 STRINGS_OBJECT = /strings: 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 \"powershell\",\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 (STRINGS_OBJECT.test(text)) {\n return { stage: \"invocation_outer_schema\", fingerprint: \"outer:strings: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\", \"pi.bash\", \"powershell\", \"pi.powershell\"].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_PI_HOST_VERSION = \"0.80.6\";\n\nconst PI_HOST_PACKAGE_NAMES = new Set([\n \"@earendil-works/pi-coding-agent\",\n \"@mariozechner/pi-coding-agent\",\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 detectPiHostVersion = (\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 PI_HOST_PACKAGE_NAMES.has(manifest.name) &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Keep walking when a parent package manifest is unreadable.\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n};\n\nexport const piHostCompatibilityWarning = (\n version: string | undefined = detectPiHostVersion(),\n): string | undefined => {\n if (!version) return undefined;\n const comparison = compareVersions(version, MINIMUM_PI_HOST_VERSION);\n if (comparison === undefined || comparison >= 0) return undefined;\n return \"Pi Fabric requires Pi >= \" + MINIMUM_PI_HOST_VERSION + \"; detected \" + version + \". Actor triggerTurn and other host continuations may be ignored. Upgrade Pi before relying on actor delivery.\";\n};\n", "import path from \"node:path\";\nimport { resolveAgentDir } from \"../core/agent-dir.js\";\nimport * as piConversationHost from \"@earendil-works/pi-coding-agent\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { TUI } from \"@earendil-works/pi-tui\";\nimport type { CodePreviewSettings } from \"./code-preview.js\";\nimport type { FabricConversationState, FabricConversationTarget, 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, FabricDashboardSnapshotCache } 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 = \"pi-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: \"pi\",\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 #shellUnsubscribe: (() => void) | undefined;\n #tasksOpen = false;\n #tasksView: import(\"./shell-tasks.js\").ShellTasksView | undefined;\n #closeTasks: (() => 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 #activityView: ((detailed?: boolean) => FabricActivityRun[]) | undefined;\n readonly #transcripts = new AgentTranscriptReader();\n readonly #conversationReaders = new Map<string, NativeConversationReader>();\n #activeConversationReader: string | undefined;\n readonly #snapshotCache = new FabricDashboardSnapshotCache();\n #refreshGeneration = 0;\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.#shellUnsubscribe = this.state.shellJobs?.subscribe(() => this.#scheduleRefresh());\n this.#refresh();\n this.#schedulePoll();\n }\n\n stop(): void {\n this.#epoch++;\n this.#closeTasks?.();\n this.#closeTasks = undefined;\n this.#tasksView?.dispose();\n this.#tasksView = undefined;\n this.#tasksOpen = false;\n this.#shellUnsubscribe?.();\n this.#shellUnsubscribe = undefined;\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.#activityView = undefined;\n this.#transcripts.clear();\n for (const reader of this.#conversationReaders.values()) reader.clear();\n this.#conversationReaders.clear();\n this.#activeConversationReader = undefined;\n this.#snapshotCache.clear();\n }\n\n /** True while Fabric owns keyboard input, including asynchronous view setup. */\n get ownsInput(): boolean {\n return this.#dashboardOpen || this.#conversationOpen || this.#tasksOpen;\n }\n\n async openTasks(context: ExtensionContext, query?: string): Promise<void> {\n if (this.ownsInput) return;\n const jobs = this.state.shellJobs;\n if (!jobs) { context.ui.notify(\"No shell task store in this session\", \"info\"); return; }\n const candidates = query ? jobs.list().filter(job => job.id === query || job.id.startsWith(query)) : [];\n if (query && candidates.length !== 1) { context.ui.notify(\"Task ID is unknown or ambiguous\", \"warning\"); return; }\n if (context.mode !== \"tui\") {\n context.ui.notify(JSON.stringify(query ? candidates[0] : jobs.list(), null, 2), \"info\");\n return;\n }\n if (!this.state.config.ui.enabled) { context.ui.notify(\"The Fabric UI is disabled by ui.enabled\", \"warning\"); return; }\n if (!this.#context) this.start(context);\n this.#tasksOpen = true;\n const epoch = this.#epoch;\n try {\n const { ShellTasksView } = await import(\"./shell-tasks.js\");\n if (epoch !== this.#epoch) return;\n await context.ui.custom<void>((tui, theme, _keys, done) => {\n this.#closeTasks = () => done();\n const id = candidates[0]?.id;\n this.#tasksView = new ShellTasksView({ jobs, theme, done: () => done(), requestRender: () => tui.requestRender(),\n rows: () => tui.terminal?.rows ?? 24, ...(id ? { id } : {}) });\n return this.#tasksView;\n }, { overlay: true, overlayOptions: { width: \"94%\", maxHeight: \"90%\", anchor: \"center\", margin: 1 } });\n } finally {\n if (epoch === this.#epoch) {\n this.#tasksView?.dispose();\n this.#tasksView = undefined;\n this.#closeTasks = undefined;\n this.#tasksOpen = false;\n }\n }\n }\n\n async openConversation(context: ExtensionContext, query?: string): Promise<void> {\n if (this.#tasksOpen) return;\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 // Native lazy imports cannot see Pi's extension-loader aliases/virtual modules.\n const { initializeConversationHost } = await import(\"./conversation-host.js\");\n if (epoch !== this.#epoch) return;\n initializeConversationHost(piConversationHost);\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 let sourceAgents: FabricUiAgent[] | undefined;\n let sourceActors: FabricUiActor[] | undefined;\n let agentsById = new Map<string, FabricUiAgent>();\n let actorsById = new Map<string, FabricUiActor>();\n let targetDomains: unknown[] = [];\n let baseTargets: FabricConversationTarget[] = [];\n let enrichedTargets: FabricConversationTarget[] = [];\n let targetsById = new Map<string, FabricConversationTarget>();\n let modelGeneration = -1;\n let modelWindows = new Map<string, number | undefined>();\n const targets = (): FabricConversationTarget[] => {\n const snapshot = this.#snapshot;\n const domains = [snapshot.main, snapshot.agents, snapshot.actors, snapshot.peers, snapshot.participants];\n const changed = domains.some((domain, index) => domain !== targetDomains[index]);\n if (changed) {\n targetDomains = domains;\n baseTargets = conversationTargets(snapshot);\n }\n if (changed || modelGeneration !== this.#refreshGeneration) {\n modelGeneration = this.#refreshGeneration;\n const windows = new Map<string, number | undefined>();\n for (const target of baseTargets) {\n if (!target.model || windows.has(target.model)) continue;\n const split = target.model.indexOf(\"/\");\n if (split < 1) continue;\n windows.set(target.model, context.modelRegistry?.find?.(\n target.model.slice(0, split), target.model.slice(split + 1),\n )?.contextWindow);\n }\n if (changed || windows.size !== modelWindows.size ||\n [...windows].some(([model, window]) => modelWindows.get(model) !== window)) {\n enrichedTargets = baseTargets.map((target) => {\n const contextWindow = target.model ? windows.get(target.model) : undefined;\n return contextWindow !== undefined ? { ...target, contextWindow } : target;\n });\n targetsById = new Map(enrichedTargets.map((target) => [target.id, target]));\n }\n modelWindows = windows;\n }\n return enrichedTargets;\n };\n const source = (id: string): NativeConversationSource => {\n if (sourceActors !== this.#snapshot.actors) {\n sourceActors = this.#snapshot.actors;\n actorsById = new Map(sourceActors.map((actor) => [actor.id, actor]));\n }\n if (sourceAgents !== this.#snapshot.agents) {\n sourceAgents = this.#snapshot.agents;\n agentsById = new Map(sourceAgents.map((agent) => [agent.id, agent]));\n }\n const actor = actorsById.get(id);\n if (actor) return { ...this.#actorTranscriptSource(actor), id, ...(actor.sessionFile ? { sessionFile: actor.sessionFile } : {}) };\n const agent = agentsById.get(id);\n return agent ? this.#agentTranscriptSource(agent) : { id, status: \"unavailable\" };\n };\n const readerFor = (id: string): NativeConversationReader => {\n if (this.#activeConversationReader !== id) this.#suspendConversationReader();\n this.#activeConversationReader = id;\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 targets();\n const target = targetsById.get(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 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,\n onTargetChange: (id) => {\n if (this.#activeConversationReader !== id) this.#suspendConversationReader();\n },\n appearance: readConversationAppearance(context.cwd, resolveAgentDir(), context.isProjectTrusted?.() ?? false),\n ...(initialTarget ? { initialTargetId: initialTarget.id } : {}),\n state: this.#conversationState!,\n keybindings,\n rendererOptions: this.conversationRenderers,\n queueEvents: this.state.pi?.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.#suspendConversationReader();\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 modelSource = buildModelSource(context.modelRegistry, resolveAgentDir());\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.shells?.some(job => job.finishedAt === undefined || Date.now() - job.finishedAt < 30000) ||\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(false);\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 #suspendConversationReader(): void {\n if (!this.#activeConversationReader) return;\n const reader = this.#conversationReaders.get(this.#activeConversationReader);\n // Readers retain lightweight loaded-range bookmarks. Never clear as a\n // fallback: that would lose pinned history or unavailable-file content.\n (reader as (NativeConversationReader & { suspend?: () => void }) | undefined)?.suspend?.();\n this.#activeConversationReader = undefined;\n }\n\n #refresh(force = true): 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 if (!this.#activityView && typeof this.state.activity.createRunView === \"function\") {\n this.#activityView = this.state.activity.createRunView();\n }\n this.#activityRuns = this.#activityView\n ? this.#activityView(detailed)\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 if (force || this.#dashboardOpen) this.#snapshotCache.clear();\n this.#refreshGeneration++;\n this.#snapshot = createDashboardSnapshot(\n this.state,\n this.#events,\n context,\n this.#activityRuns,\n this.#dashboardOpen ? undefined : this.#snapshotCache,\n this.#activityView !== undefined,\n );\n this.#renderWidget(context);\n // Read the native source even when manager metadata is unchanged: log\n // appends and pinned-window growth do not require a status revision.\n if (this.#conversationTui && this.#conversationView?.refresh?.() !== false) {\n this.#conversationTui.requestRender();\n }\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(\n theme,\n () => this.#snapshot,\n config.maxRows,\n () => tui.terminal?.rows ?? process.stdout.rows,\n );\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 { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionContext } from \"@earendil-works/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\n/** Poll-only memoization. Event-driven refreshes and dispatch bypass this cache. */\nexport class FabricDashboardSnapshotCache {\n private inputs: unknown;\n private snapshot: FabricDashboardSnapshot | undefined;\n\n get(inputs: unknown): FabricDashboardSnapshot | undefined {\n return this.snapshot && isDeepStrictEqual(this.inputs, inputs)\n ? { ...this.snapshot, now: Date.now() } : undefined;\n }\n\n set(\n inputs: { runs: FabricActivityRun[] } & Record<string, unknown>,\n snapshot: FabricDashboardSnapshot,\n immutableActivity = false,\n ): void {\n // Only the controller-owned revision view guarantees deep immutability.\n // Legacy/mutable inputs must still be copied to detect in-place updates.\n const { runs, ...other } = inputs;\n this.inputs = immutableActivity\n ? { ...structuredClone(other), runs: runs.slice() }\n : structuredClone(inputs);\n this.snapshot = snapshot;\n }\n\n clear(): void {\n this.inputs = undefined;\n this.snapshot = undefined;\n }\n}\n\nexport const createDashboardSnapshot = (\n state: FabricState,\n events: MeshEvent[],\n context?: ExtensionContext,\n activityRuns?: FabricActivityRun[],\n cache?: FabricDashboardSnapshotCache,\n immutableActivity = false,\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 // Observe externally owned domains on every poll, including remote lease\n // expiry and model/usage updates that need not emit a local manager event.\n const participants = typeof state.participantInfos === \"function\"\n ? state.participantInfos({ scope: \"project\" }) : [];\n const actorRecords = state.actors.list();\n const main = state.mainAgentInfo(context);\n const peers = typeof state.peerInfos === \"function\" ? state.peerInfos() : [];\n const globalActors = state.globalActors.list();\n const componentGraph = typeof state.componentGraph === \"function\"\n ? state.componentGraph() : { components: [], edges: [], cycles: [] };\n const meshEntries = state.config.mesh.enabled ? state.mesh.list(\"\", 200) : [];\n const shells = state.shellJobs?.list().filter(job => job.spilledAt !== undefined || job.monitor) ?? [];\n const inputs = { runs, agentRecords, actorRecords, participants, main, peers, shells,\n globalActors, componentGraph, meshEntries, events, widgetDismissedAt: state.widgetDismissedAt };\n const previous = cache?.get(inputs);\n if (previous) return previous;\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 workerByActor = new Map<string, FabricUiAgent>();\n for (const agent of allAgents) {\n if (!agent.actorId) continue;\n const previous = workerByActor.get(agent.actorId);\n const active = Number(activeStatuses.has(agent.status)) -\n Number(previous !== undefined && activeStatuses.has(previous.status));\n const recency = (numberFrom(agent.updatedAt) ?? numberFrom(agent.startedAt) ?? 0) -\n (numberFrom(previous?.updatedAt) ?? numberFrom(previous?.startedAt) ?? 0);\n // Strict improvement retains the first source-order worker on exact ties,\n // matching the previous stable filter/sort selection.\n if (!previous || (active || recency) > 0) workerByActor.set(agent.actorId, agent);\n }\n const participantById = new Map(participants.map((participant) => [participant.id, participant]));\n const actors = actorRecords\n .map((actor) => {\n const participant = participantById.get(actor.id);\n const worker = workerByActor.get(actor.id);\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 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 const snapshot: FabricDashboardSnapshot = {\n now: Date.now(),\n shells,\n runs: orderedRuns,\n main,\n peers,\n participants,\n widgetDismissedAt: state.widgetDismissedAt,\n globalActors,\n agents: visibleAgents,\n componentGraph,\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 cache?.set(inputs, snapshot, immutableActivity);\n return snapshot;\n};\n", "import type { Component } from \"@earendil-works/pi-tui\";\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { Theme } from \"@earendil-works/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.shells?.some(job => job.finishedAt === undefined || snapshot.now - job.finishedAt < 30000)) 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\n/**\n * Share of the terminal height the animated box may claim. pi's main-screen\n * renderer scrolls the pane once the rendered content is taller than the\n * terminal, so a box that fills the viewport keeps that scroll region moving on\n * every animation frame \u2014 which reads as flicker inside tmux. Half the pane\n * keeps the transcript and editor visible and bounds the box on short panes.\n */\nexport const WIDGET_TERMINAL_ROW_SHARE = 0.5;\n\n/** Effective row budget: the configured maximum, bounded by the live pane. */\nexport const widgetRowLimit = (maxRows: number, terminalRows?: number): number => {\n const configured = Math.max(1, maxRows);\n if (terminalRows === undefined || !Number.isFinite(terminalRows) || terminalRows <= 0) {\n return configured;\n }\n const paneShare = Math.floor(terminalRows * WIDGET_TERMINAL_ROW_SHARE);\n return Math.max(1, Math.min(configured, paneShare));\n};\n\nexport class FabricWidget implements Component {\n constructor(\n readonly theme: Theme,\n readonly snapshot: () => FabricDashboardSnapshot,\n readonly maxRows: number,\n // Live terminal height. pi re-renders the widget on resize, so reading the\n // pane per render bounds the box without a resize subscription.\n readonly terminalRows?: () => number | undefined,\n ) {}\n\n #rowLimit(): number {\n return widgetRowLimit(this.maxRows, this.terminalRows?.());\n }\n\n #lastWidth: number | undefined;\n #lastLimit: number | undefined;\n #lastSnapshot: FabricDashboardSnapshot | undefined;\n #lastLines: string[] | undefined;\n #pending:\n | { width: number; limit: number; snapshot: FabricDashboardSnapshot; lines: string[] }\n | undefined;\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const snapshot = this.snapshot();\n // The pane can shrink between renders, so the row budget is part of the\n // cache key: a box measured against a taller terminal must not be reused.\n const limit = this.#rowLimit();\n const lines =\n this.#pending?.width === width &&\n this.#pending.limit === limit &&\n this.#pending.snapshot === snapshot\n ? this.#pending.lines\n : this.#lastWidth === width &&\n this.#lastLimit === limit &&\n this.#lastSnapshot === snapshot &&\n this.#lastLines\n ? this.#lastLines\n : this.#renderLines(snapshot, width, limit);\n this.#pending = undefined;\n this.#lastWidth = width;\n this.#lastLimit = limit;\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 limit = this.#rowLimit();\n const lines = this.#renderLines(snapshot, this.#lastWidth, limit);\n this.#pending = { width: this.#lastWidth, limit, 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.#lastLimit = undefined;\n this.#lastSnapshot = undefined;\n this.#lastLines = undefined;\n }\n\n #renderLines(snapshot: FabricDashboardSnapshot, width: number, limit: number): string[] {\n return this.#boundContent(this.#buildContent(snapshot), width, limit);\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 shells = snapshot.shells ?? [];\n const liveShells = shells.filter(job => job.finishedAt === undefined);\n const recentShells = shells.filter(job => job.finishedAt !== undefined && snapshot.now - job.finishedAt < 30000);\n const headerStatus =\n run?.status ??\n (activeAgents.length > 0 || activeActorWorkers.length > 0 || liveShells.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 (liveShells.length > 0) parts.push(`${liveShells.length} shell${liveShells.length === 1 ? \"\" : \"s\"}`);\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 const elapsed = run && formatDuration((run.finishedAt ?? snapshot.now) - run.startedAt);\n if (elapsed) parts.push(elapsed);\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 taskHint = liveShells.length || recentShells.length ? this.theme.fg(\"dim\", \" \u00B7 /fabric tasks \u00B7 ctrl+alt+t\") : \"\";\n const taskHeader = taskHint ? `${glyph} ${this.theme.fg(\"accent\", \"Fabric\")}${taskHint}${parts.length ? this.theme.fg(\"dim\", ` \u00B7 ${parts.join(\" \u00B7 \")}`) : \"\"}` : header;\n const lines = [hasActiveConversations ? `${taskHeader} \u00B7 ${this.theme.fg(\"dim\", FABRIC_CONVERSATION_HINT)}` : taskHeader];\n for (const job of [...liveShells, ...recentShells].slice(0, 3)) {\n const elapsed = formatDuration((job.finishedAt ?? snapshot.now) - job.startedAt) || \"0s\";\n const status = job.stopping ? \"stopping\" : job.monitor && !job.finishedAt ? `monitor:${job.monitor.delivery}` : job.status;\n lines.push(this.theme.fg(\"dim\", ` ${job.id.slice(0, 8)} ${status} \u00B7 ${elapsed} \u00B7 ${safeText(job.description ?? job.command)}`));\n }\n if (liveShells.length + recentShells.length > 3) lines.push(this.theme.fg(\"dim\", ` +${liveShells.length + recentShells.length - 3} more shell tasks`));\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, limit: number): string[] {\n const bounded = content.slice(0, limit);\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 \"@earendil-works/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} background worker${count === 1 ? \"\" : \"s\"} (Esc)`,\n \"warning\",\n );\n }\n }, 60);\n timer.unref?.();\n return undefined;\n });\n return () => {\n cancel();\n unsubscribe();\n };\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { FabricShellJobStore } from \"../core/shell-jobs.js\";\nimport { installFabricEscapeHalt } from \"./escape-halt.js\";\n\nconst CTRL_B = \"\\x02\";\nconst CTRL_K = \"\\x0b\";\nconst CTRL_B_CHORD_MS = 1_000;\n\ninterface ShellHangKeyOptions {\n enabled: () => boolean;\n ownsInput: () => boolean;\n jobs: () => FabricShellJobStore | undefined;\n}\n\n/** Spill or kill a nested shell that is still waiting, without a jobs API. */\nexport function installFabricShellHangKeys(\n context: ExtensionContext,\n options: ShellHangKeyOptions,\n): () => void {\n if (context.mode !== \"tui\" || typeof context.ui.onTerminalInput !== \"function\") return () => {};\n const stopMonitors = installFabricEscapeHalt(context, {\n enabled: options.enabled, ownsInput: options.ownsInput, halted: () => false,\n halt: () => {\n let count = 0;\n for (const job of options.jobs()?.live() ?? []) if (job.options.monitor && job.stop(\"Main interrupted\")) count++;\n return count;\n },\n });\n let chordArmedAt = 0;\n const unsubscribe = context.ui.onTerminalInput((data) => {\n if (options.ownsInput() || !options.enabled()) {\n chordArmedAt = 0;\n return undefined;\n }\n const jobs = options.jobs();\n if (!jobs || jobs.waiting().length === 0) {\n chordArmedAt = 0;\n return undefined;\n }\n if (data === CTRL_B) {\n const now = Date.now();\n if (chordArmedAt > 0 && now - chordArmedAt <= CTRL_B_CHORD_MS) {\n chordArmedAt = 0;\n const count = jobs.spillWaiting();\n if (count > 0) {\n context.ui.notify(\n count === 1\n ? \"Fabric: shell still running \u00B7 output spilled to a live log\"\n : `Fabric: ${count} shells still running \u00B7 output spilled to live logs`,\n \"info\",\n );\n }\n return { consume: true };\n }\n chordArmedAt = now;\n return { consume: true };\n }\n chordArmedAt = 0;\n if (data === CTRL_K) {\n const count = jobs.killWaiting();\n if (count > 0) {\n context.ui.notify(\n count === 1 ? \"Fabric: killed waiting shell\" : `Fabric: killed ${count} waiting shells`,\n \"warning\",\n );\n }\n return { consume: true };\n }\n return undefined;\n });\n return () => { stopMonitors(); unsubscribe(); };\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 pi'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 { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { HANDOFF_COMPLETION_MESSAGE_TYPE } from \"../agents/handoff-completion.js\";\n\nexport const registerHandoffCompletionRenderer = (extension: ExtensionAPI): void => {\n extension.registerMessageRenderer(HANDOFF_COMPLETION_MESSAGE_TYPE, (message, { outputPad }) => {\n const details = message.details as { displayText?: string } | undefined;\n // Internal continuation instructions stay in model context, not the TUI.\n return new Text(details?.displayText ?? \"Fabric handoff finished. See the handoff tool result.\", outputPad, 0);\n });\n};\n", "import type { Usage } from \"@earendil-works/pi-ai\";\nimport { registerJevAuth } from \"./jev/auth.js\";\nimport type {\n ExtensionAPI,\n ExtensionContext,\n} from \"@earendil-works/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 comparableCompiledSurfaceScore,\n BackgroundEntropyCompiler,\n BackgroundSessionSelector,\n SessionObservationCache,\n entropyRepairRows,\n formatEntropyCompileNotice,\n liveSurfaceSnapshot,\n loadCompiledSurfaceAsync,\n loadObservationPoolAsync,\n machineSessionFilesAsync,\n saveCompiledSurfaceAsync,\n saveObservationPoolAsync,\n sessionWindowEvidenceAsync,\n} from \"./entropy/index.js\";\nimport { setActiveCompiledSurface } from \"./entropy/active.js\";\nimport {\n filterPrewalkContinuationMessages,\n filterPrewalkPlanningDirectives,\n withTrajectoryRearmDirective,\n} from \"./prewalk/messages.js\";\nimport {\n restoreBorrowedInPlaceMain,\n settleInPlacePrewalk,\n} from \"./prewalk/return.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport { autoArmFabricPrewalk } from \"./prewalk/arm.js\";\nimport {\n DEFAULT_FABRIC_CONFIG,\n effectiveToolCaptureConfig,\n} from \"./config.js\";\nimport { registerCompactionHook } from \"./compaction/hook.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 { PI_CORE_TOOL_NAMES } from \"./core/pi-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 { restoreSkillsForFullCodePrompt } from \"./core/skill-prompt.js\";\nimport { fabricSkillPaths } from \"./core/kernel-skills.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 { piHostCompatibilityWarning } from \"./host-compatibility.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 { installFabricShellHangKeys } from \"./ui/shell-hang-keys.js\";\nimport { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { configureHighlighting } from \"./ui/highlight.js\";\nimport { registerHandoffCompletionRenderer } from \"./ui/handoff-completion.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { truncateMiddle } from \"./util.js\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { captureLoadedFileIdentity } from \"./build-identity.js\";\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// Pi processes that load Fabric with -e (agents and actors) discover the\n// same kernel-specific tree as Main. The package manifest exposes no skills;\n// selecting exactly one tree avoids canonical-name collisions.\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, \"..\", \"skillsets\"),\n};\nconst FABRIC_SKILLS_DIR = FABRIC_RUNTIME_PATHS.skills;\n\n// Loaded-code identity of this extension entry, captured while the module bytes\n// on disk are still the bytes this process evaluated. prewalk.status compares\n// it against the current file to expose stale-runtime reloads.\nconst FABRIC_ENTRY_IDENTITY = captureLoadedFileIdentity(import.meta.url);\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 = \"pi-fabric-skill-reference\";\n\nexport const FABRIC_MANAGED_HOST_VERSION = 1;\nexport type { FabricManagedHostOptions } from \"./managed-host.js\";\nimport type { FabricManagedHostOptions } from \"./managed-host.js\";\n\nexport default async function piFabric(pi: ExtensionAPI, options: { managedHost?: FabricManagedHostOptions } = {}): Promise<void> {\n if (!options.managedHost) registerJevAuth(pi);\n const codePreviewSettings = defaultCodePreviewSettings();\n const decorateShell: FabricToolShellDecorator = withCodePreviewShell;\n let compatibilityWarningShown = 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(pi, capturedTools, {\n paths: FABRIC_RUNTIME_PATHS,\n ...(FABRIC_ENTRY_IDENTITY ? { entryIdentity: FABRIC_ENTRY_IDENTITY } : {}),\n ...(options.managedHost ? {managedHost: options.managedHost} : {}),\n });\n const directToolApproval = new FabricDirectToolApproval(\n pi,\n () => state.config,\n state.sessionApprovals,\n );\n const pendingHandoffs = new Map<string, PendingFabricHandoff>();\n const toolOwnership = new FabricToolOwnership(pi);\n const fabricUi = new FabricUiController(state, codePreviewSettings, {\n getToolDefinition: (name) => name === \"fabric_exec\" ? fabricTool : capturedTools.get(name)?.definition,\n get markdownTransformers() { return capturedTools.runner?.getMarkdownTransformers(); },\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 // Captured tools that must stay out of the model's active set in full code\n // mode: every captured extension tool minus the capture.keepVisible names.\n const hiddenCapturedToolNames = (): Set<string> => {\n const visible = new Set(capturePolicy().keepVisible);\n return new Set(\n capturedTools.list().map((entry) => entry.name).filter((name) => !visible.has(name)),\n );\n };\n // Pi auto-activates tools that newly appear in the registry on every tool\n // refresh; re-assert ownership afterwards so captured tools stay hidden from\n // the model even when a late-loading extension triggers a refresh. Refresh\n // callbacks arrive before session initialization too, so reassertion waits\n // for state to be ready rather than reading an uninitialized config.\n const { reassert: reassertToolOwnership, schedule: scheduleOwnershipReassert } =\n createToolOwnershipReassertion({\n ready: () => state.cwd !== undefined,\n active: () => {\n const policy = capturePolicy();\n return policy.enabled && policy.hideFromModel && fabricOwnsModelTools();\n },\n hiddenNames: hiddenCapturedToolNames,\n apply: (hidden) => toolOwnership.apply(true, hidden),\n });\n\n const unsubscribeComponentRegistration = pi.events.on(\n FABRIC_COMPONENT_REGISTER_EVENT,\n (value: unknown) => {\n const registration = componentRegistrationFrom(value);\n if (!registration) throw new Error(\"Invalid Pi Fabric component registration\");\n state.registerExternalComponent(\n registration.component,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n const unsubscribeProviderRegistration = pi.events.on(\n FABRIC_PROVIDER_REGISTER_EVENT,\n (value: unknown) => {\n const registration = registrationFrom(value);\n if (!registration) throw new Error(\"Invalid Pi Fabric provider registration\");\n state.registerExternal(\n registration.provider,\n registration.overwrite === undefined ? {} : { overwrite: registration.overwrite },\n );\n },\n );\n\n pi.on(\"resources_discover\", async (_event, context) => {\n if (!state.bootstrapped) await state.bootstrap(context);\n return { skillPaths: fabricSkillPaths(FABRIC_SKILLS_DIR, state.config.executor.kernel) };\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(pi.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 registerHandoffCompletionRenderer(pi);\n pi.registerTool(fabricTool);\n\n const applyFabricMode = (): void => {\n // Re-applying the persistent policy ends any suspension window; do it\n // before setPolicy so a config-disabled policy recomputes derived\n // surfaces against the (now stable) empty catalog.\n capturedTools.markResumed();\n toolCapture.setPolicy(capturePolicy());\n Object.assign(\n fabricTool,\n createFabricExecTool(state, codePreviewSettings, pendingHandoffs, decorateShell, toolDisplay),\n );\n pi.registerTool(fabricTool);\n toolOwnership.apply(\n fabricOwnsModelTools(),\n fabricOwnsModelTools() ? hiddenCapturedToolNames() : undefined,\n );\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_settled 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 Pi's native cancel-streaming still fires;\n // single ESC therefore stops the current turn and the advisor/supervisor\n // actors and event-driven Jev observers at once. Jev observers are cancelled,\n // not automatically restarted. Also works without mesh. ui.haltOnEscape opts out.\n let haltOnEscapeUnsubscribe: (() => void) | undefined;\n let shellHangKeysUnsubscribe: (() => void) | undefined;\n const uninstallHaltOnEscape = (): void => {\n haltOnEscapeUnsubscribe?.();\n haltOnEscapeUnsubscribe = undefined;\n };\n const uninstallShellHangKeys = (): void => {\n shellHangKeysUnsubscribe?.();\n shellHangKeysUnsubscribe = undefined;\n };\n const installHaltOnEscape = (context: ExtensionContext): void => {\n uninstallHaltOnEscape();\n if (!state.config.ui.haltOnEscape || (!state.config.mesh.enabled && !state.config.jev.enabled)) return;\n haltOnEscapeUnsubscribe = installFabricEscapeHalt(context, {\n enabled: () => state.initialized && (state.config.mesh.enabled || state.config.jev.enabled) && state.config.ui.haltOnEscape,\n ownsInput: () => fabricUi.ownsInput,\n halted: () => state.advisorsHalted,\n halt: () => state.haltAdvisors(),\n });\n };\n const installShellHangKeys = (context: ExtensionContext): void => {\n uninstallShellHangKeys();\n shellHangKeysUnsubscribe = installFabricShellHangKeys(context, {\n enabled: () => state.initialized,\n ownsInput: () => fabricUi.ownsInput,\n jobs: () => state.shellJobs,\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, pi);\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 uninstallShellHangKeys();\n fabricUi.stop();\n };\n state.setActivationHook(async (context) => {\n refreshCodePreviewSettings();\n await autoArmPrewalk(context);\n applyFabricMode();\n fabricUi.start(context);\n installHaltOnEscape(context);\n installShellHangKeys(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 entropyLifecycleEpoch = 0;\n const createEntropyCaches = () => ({\n compiler: new BackgroundEntropyCompiler(),\n observations: new SessionObservationCache(),\n sessions: new BackgroundSessionSelector(machineSessionFilesAsync),\n });\n let entropyCaches = createEntropyCaches();\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 agentDir = resolveAgentDir();\n const cwd = state.cwd ?? context.cwd;\n const repairs = entropyRepairRows(state.repairs.repairs);\n const caches = entropyCaches;\n const [files, loaded, poolLoaded, snapshot] = await Promise.all([\n caches.sessions.select(agentDir, cwd, context.sessionManager.getSessionFile?.()),\n loadCompiledSurfaceAsync(agentDir),\n loadObservationPoolAsync(agentDir),\n liveSurfaceSnapshot({ registry: state.registry, extensionContext: context, cwd }),\n ]);\n if (!current() || loaded.error) return;\n const evidence = await sessionWindowEvidenceAsync(files, { windowsOnly: true });\n if (!current()) return;\n const mergedPool = await caches.observations.merge(\n poolLoaded.file,\n evidence.observationWindows,\n );\n if (!poolLoaded.error && (mergedPool.mergedSessions > 0 || !poolLoaded.file)) {\n await saveObservationPoolAsync(agentDir, mergedPool.file);\n }\n if (!current()) return;\n const outcome = await caches.compiler.compile({\n windows: evidence.traceWindows,\n surface: snapshot,\n repairs,\n ...(loaded.file ? { artifact: loaded.file } : {}),\n });\n if (!current()) return;\n if (outcome.status === \"compiled\" && outcome.artifact) {\n const saved = await saveCompiledSurfaceAsync(agentDir, outcome.artifact);\n if (current()) {\n // Activate even when another process already persisted identical bytes.\n setActiveCompiledSurface(saved.file);\n // The notice is progress evidence, not a heartbeat: show it only when\n // the fresh score measurably lowered the previously persisted surface.\n const previousScore = comparableCompiledSurfaceScore(loaded.file, saved.file.metricVersion);\n if (previousScore !== undefined && outcome.report.score < previousScore && context.hasUI) {\n context.ui.notify(formatEntropyCompileNotice({\n beforeScore: previousScore,\n afterScore: outcome.report.score,\n normalizations: saved.file.normalizations?.length ?? 0,\n }), \"info\");\n }\n }\n }\n // Advisory abstraction suggestions remain available on demand. Static\n // normalization never asks the user to approve a compatibility repair.\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 `[pi-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 pi.on(\"session_start\", async (_event, context) => {\n entropyLifecycleEpoch += 1;\n entropyCaches = createEntropyCaches();\n entropyEvidenceThisTurn = false;\n entropyCompilePending = undefined;\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n uninstallHaltOnEscape();\n uninstallShellHangKeys();\n fabricUi.stop();\n suspendToolCapture();\n proxyContract.reset();\n refreshProxyLedger(context);\n if (!compatibilityWarningShown) {\n compatibilityWarningShown = true;\n const warning = piHostCompatibilityWarning();\n if (warning) {\n console.warn(`[pi-fabric] ${warning}`);\n if (context.hasUI) context.ui.notify(warning, \"warning\");\n }\n }\n await state.bootstrap(context);\n // bootstrap() cancels any live arm; the borrowed Main model survives so a\n // new session that inherited the in-place executor can snap back.\n await restoreBorrowedInPlaceMain(state.prewalk, pi, context);\n refreshCodePreviewSettings();\n applyFabricMode();\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 pi.on(\"session_tree\", async (_event, context) => {\n proxyContract.reset();\n refreshProxyLedger(context);\n // Pi 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 pi.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(\"pi.input\", event);\n });\n\n pi.on(\"agent_start\", async (event) => {\n if (state.initialized) await state.publishHostLifecycle(\"pi.agent_start\", event);\n });\n\n pi.on(\"agent_end\", async (event) => {\n if (state.initialized) await state.publishHostLifecycle(\"pi.agent_end\", event);\n });\n\n pi.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(\"pi.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 pi.on(\"agent_settled\", async (event, context) => {\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, pi, 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 // Pi's compact API is callback-based. Await the controller's Promise here\n // so ExtensionRunner does not finish this handler (and Pi does not publish\n // its public agent_settled event) before compaction settles.\n await state.compact.maybeCommit(context);\n await compactAtConfiguredThreshold(context, state.config);\n await state.publishHostLifecycle(\"pi.agent_settled\", event);\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 pi.on(\"message_start\", () => {\n state.speculationTap?.reset();\n });\n\n pi.on(\"message_update\", (event, context) => {\n if (!state.initialized) return;\n state.speculationTap?.handleMessageUpdate(event, context);\n });\n\n pi.on(\"tool_call\", (event, context) =>\n fabricToolLifecycle.toolCall(event, context));\n\n // Pi 0.80.6 intentionally ignores `isError` returned by custom-tool\n // execute(). Repair the finalized outer result through official middleware.\n pi.on(\"tool_result\", (event) => fabricToolLifecycle.toolResult(event));\n\n pi.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 pi.on(\"message_end\", (event) => {\n if (event.message.role !== \"toolResult\") return undefined;\n const message = event.message as AgentToolResultMessage & { usage?: Usage };\n const usage = directToolApproval.takeUsage(message.toolCallId);\n if (!usage) return undefined;\n return {\n message: {\n ...message,\n usage: mergeFabricApprovalUsage(message.usage, usage),\n },\n };\n });\n\n // message_end runs after all tool-result middleware and tool_execution_end but\n // before Pi 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 pi.on(\"message_end\", async (event, context) => {\n if (event.message.role !== \"toolResult\") return undefined;\n const pending = pendingHandoffs.get(event.message.toolCallId);\n if (!pending || event.message.toolName !== \"fabric_exec\") return undefined;\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 const formatted = formatFabricValue(\n handoff,\n pending.resultFormat,\n state.config.executor.maxOutputChars,\n );\n const output = truncateMiddle(\n formatted.text || \"(no output)\",\n state.config.executor.maxOutputChars,\n );\n // Directive lands after truncation so it survives maxOutputChars, and\n // gates on \"still armed\" so one-shot trajectory handoffs stay silent.\n const text = withTrajectoryRearmDirective(\n output,\n pending,\n handoff,\n state.prewalk,\n context.sessionManager.getSessionId(),\n );\n const boundarySucceeded = handoff.completed === true || handoff.continued === true;\n const details =\n typeof event.message.details === \"object\" &&\n event.message.details !== null &&\n !Array.isArray(event.message.details) &&\n \"success\" in event.message.details\n ? { ...event.message.details, success: boundarySucceeded }\n : event.message.details;\n // `details` is optional on ToolResultMessage; under exactOptionalPropertyTypes\n // an explicitly `undefined` property is rejected, so omit the key instead.\n return {\n message: {\n ...event.message,\n content: [{ type: \"text\", text }],\n isError: !boundarySucceeded,\n ...(details === undefined ? {} : { details }),\n },\n };\n });\n\n pi.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(\"pi.tool_error\", event);\n }\n });\n\n pi.on(\"session_compact\", async (event, context) => {\n if (!state.initialized) return;\n await state.publishHostLifecycle(\"pi.session_compact\", event);\n });\n\n // Deterministic, LLM-free compaction is registered unconditionally and is\n // active by default. The documented \"pi\" escape hatch returns early so\n // pi-core's own summarization proceeds normally.\n registerCompactionHook(pi, {\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 getThresholdContextRatio: (modelKey) =>\n state.cwd\n ? state.config.compaction.thresholds[modelKey]\n : DEFAULT_FABRIC_CONFIG.compaction.thresholds[modelKey],\n getThresholdTokens: (modelKey) =>\n state.cwd\n ? state.config.compaction.tokenThresholds[modelKey]\n : DEFAULT_FABRIC_CONFIG.compaction.tokenThresholds[modelKey],\n });\n\n pi.on(\"context\", (event, context) => {\n const sessionId = context.sessionManager.getSessionId();\n const pendingContinuation = state.initialized\n ? state.prewalk.pendingContinuationMessage(sessionId)\n : undefined;\n const continuation = filterPrewalkContinuationMessages(\n event.messages,\n (continuationId) => state.initialized &&\n state.prewalk.acceptContinuation(sessionId, continuationId),\n pendingContinuation,\n );\n // Planning directives are phase-scoped: visible only while this session's\n // arm is live (Main still owes its plan). A claimed handoff or an off arm\n // must not project stale planning instructions into later requests.\n const planning = filterPrewalkPlanningDirectives(\n continuation.messages,\n state.initialized && state.prewalk.isArmed(sessionId),\n );\n let changed = continuation.changed || planning.changed;\n const messages = planning.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 pi.on(\"before_agent_start\", async (event, context) => {\n const config = state.bootstrapped ? state.config : DEFAULT_FABRIC_CONFIG;\n const fullCodeMode = config.fullCodeMode;\n const schemaMode = config.schema.mode;\n const effectiveFullCodeMode = fullCodeMode || schemaMode === \"enforce\";\n if (!pi.getActiveTools().includes(\"fabric_exec\")) return;\n const skills = event.systemPromptOptions.skills ?? [];\n const captureSnapshot = state.bootstrapped ? capturePolicy() : undefined;\n // Pi omits its entire skill catalog when the active tool set lacks a tool\n // named read. Restore Pi's discovered catalog (already bound to one skill\n // tree); full code mode adapts its loader to Fabric's nested pi.read path.\n const systemPrompt = restoreSkillsForFullCodePrompt(event.systemPrompt, skills, effectiveFullCodeMode);\n // Pi 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 Pi'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.PI_FABRIC_PARENT_RUN ? \"participant\" : \"main\",\n defaults: [{\n slot: FABRIC_EXECUTION_GUIDANCE_SLOT,\n content: defaultFabricExecutionGuidance(effectiveFullCodeMode, config.executor.kernel, config.executor.pythonRuntime),\n }],\n });\n const overrideGuidance = effectiveFullCodeMode\n ? coreOverridePromptGuidance(capturedTools).trim()\n : undefined;\n const extensionRoster = effectiveFullCodeMode\n ? extensionToolRosterGuidance(capturedTools.list(), new Set(PI_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, config.executor.kernel, config.executor.pythonRuntime),\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 pi.on(\"before_agent_start\", (event) => {\n if (!pi.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,\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(pi, (eventName, event, context) => {\n if (!state.initialized) return;\n state.dispatchHostEvent(eventName, event, context);\n });\n\n pi.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 entropyCaches = createEntropyCaches();\n entropyCompilePending = undefined;\n unsubscribeComponentRegistration();\n unsubscribeProviderRegistration();\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n try {\n await state.shutdown();\n } finally {\n uninstallHaltOnEscape();\n uninstallShellHangKeys();\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 pi.on(\"before_agent_start\", () => {\n reassertToolOwnership();\n });\n\n registerFabricCommand(pi, {\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": ["formatDuration", "state", "component", "path", "items", "filtered", "path", "path", "isRecord", "existsSync", "readFileSync", "path", "path", "isRecord", "escapeRegex", "Container", "Text", "path", "isRecord", "truncateToWidth", "fs", "path", "path", "fs", "python", "title", "composite", "Container", "Text", "text", "readHint", "fs", "path", "path", "fs", "existsSync", "readFileSync", "realpathSync", "path", "path", "previous", "truncateToWidth", "visibleWidth", "truncateToWidth", "phase", "elapsed", "visibleWidth", "actor", "agent", "path", "Text", "Text", "path", "path", "resolve", "content"]
|
|
7
7
|
}
|