pi-fabric 0.76.1 → 0.76.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/chunks/{chunk-NI3ZXJZD.js → chunk-PAAXKXWT.js} +293 -1
- package/dist/chunks/{chunk-NI3ZXJZD.js.map → chunk-PAAXKXWT.js.map} +3 -3
- package/dist/chunks/{fabric-runtime-state-FBAJTXB2.js → fabric-runtime-state-VCLWTB55.js} +7 -5
- package/dist/chunks/fabric-runtime-state-VCLWTB55.js.map +7 -0
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/fabric-exec-arguments.d.ts.map +1 -1
- package/dist/fabric-exec-tool.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/index.js.map +2 -2
- package/dist/runtime/guest-code-repair.d.ts +2 -0
- package/dist/runtime/guest-code-repair.d.ts.map +1 -0
- package/dist/type-error-guidance.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/fabric-runtime-state-FBAJTXB2.js.map +0 -7
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/core/tool-ownership.ts", "../src/audit/details.ts", "../src/core/core-override-guidance.ts", "../src/core/system-guidance.ts", "../src/core/skill-prompt.ts", "../src/core/proxy-contract.ts", "../src/core/direct-tool-approval.ts", "../src/core/skill-references.ts", "../src/fabric-exec-tool.ts", "../src/failure-progress.ts", "../src/fabric-exec-arguments.ts", "../src/runtime/core-tool-properties.ts", "../src/type-error-guidance.ts", "../src/ui/row-balance.ts", "../src/output-budget.ts", "../src/fabric-state.ts", "../src/host-compatibility.ts", "../src/ui/controller.ts", "../src/ui/snapshot.ts", "../src/ui/widget.ts", "../src/ui/tool-display.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { Theme, ToolDefinition } 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\";\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};\n\ntype BorderState = TimingState & {\n codePreviewBorderCallComponent?: Component;\n codePreviewBorderResultComponent?: Component;\n codePreviewBorderShell?: BorderedToolCall;\n codePreviewBorderTheme?: Theme;\n codePreviewBorderLastCallExecutionStarted?: boolean;\n codePreviewBorderLastCallPartial?: boolean;\n};\n\nconst timingState = (context: { state?: unknown } | undefined): TimingState | undefined =>\n context?.state as TimingState | undefined;\n\nconst isTimingOnlyRender = (state: TimingState | undefined): boolean =>\n state?.codePreviewTimingOnlyRenderToken !== undefined;\n\nconst unwrapTimingComponent = (component: Component | undefined): Component | undefined =>\n component instanceof TimingPreservedComponent ? component.component : component;\n\nconst clearTimingInterval = (state: TimingState): void => {\n if (!state.codePreviewTimingInterval) return;\n clearInterval(state.codePreviewTimingInterval);\n delete state.codePreviewTimingInterval;\n delete state.codePreviewTimingOnlyRenderToken;\n};\n\nconst ensureTimingInterval = (state: TimingState, invalidate: () => void): void => {\n state.codePreviewTimingInterval ??= setInterval(() => {\n const token = (state.codePreviewTimingOnlyRenderToken ?? 0) + 1;\n state.codePreviewTimingOnlyRenderToken = token;\n try {\n invalidate();\n } finally {\n queueMicrotask(() => {\n if (state.codePreviewTimingOnlyRenderToken === token) {\n delete state.codePreviewTimingOnlyRenderToken;\n }\n });\n }\n }, 100);\n};\n\nconst formatDuration = (milliseconds: number): string => {\n const ms = Math.max(0, Math.round(milliseconds));\n if (ms < 1_000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1_000).toFixed(1)}s`;\n const seconds = Math.round(ms / 1_000);\n const hours = Math.floor(seconds / 3_600);\n const minutes = Math.floor((seconds % 3_600) / 60);\n if (hours > 0) return `${hours}h ${minutes}m`;\n return `${minutes}m ${seconds % 60}s`;\n};\n\nconst updateTiming = (\n context: PreviewRenderContext,\n enabled: boolean,\n options: { animate?: boolean; formatLabel?: boolean } = {},\n): string | undefined => {\n const state = timingState(context);\n if (!state) return undefined;\n if (!enabled) {\n clearTimingInterval(state);\n return undefined;\n }\n if (\n context.executionStarted &&\n state.codePreviewTimingStartedAt === undefined &&\n context.isPartial !== false\n ) {\n state.codePreviewTimingStartedAt = Date.now();\n delete state.codePreviewTimingEndedAt;\n }\n const startedAt = state.codePreviewTimingStartedAt;\n if (startedAt === undefined) return undefined;\n if (context.isPartial && options.animate !== false) {\n ensureTimingInterval(state, context.invalidate);\n } else if (!context.isPartial) {\n state.codePreviewTimingEndedAt ??= Date.now();\n clearTimingInterval(state);\n }\n if (options.formatLabel === false) return undefined;\n const running = context.isPartial;\n const endedAt = running ? Date.now() : (state.codePreviewTimingEndedAt ?? Date.now());\n return `${running ? \"Elapsed\" : \"Took\"} ${formatDuration(endedAt - startedAt)}`;\n};\n\nclass TimingPreservedComponent implements Component {\n constructor(readonly component: Component, private readonly state: TimingState) {}\n render(width: number): 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 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 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 hostPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n let directory: string;\n try {\n directory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n while (directory !== path.dirname(directory)) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (manifest.name === \"@earendil-works/pi-coding-agent\") return directory;\n } catch { /* unreadable or invalid manifest; keep searching */ }\n }\n directory = path.dirname(directory);\n }\n return undefined;\n};\n\nconst extensionRunnerConstructors = async (): Promise<ExtensionRunnerConstructor[]> => {\n const constructors = new Set<ExtensionRunnerConstructor>();\n const packageRoots = new Set(\n [process.env.PI_PACKAGE_DIR, hostPackageRoot()].filter(\n (root): root is string => typeof root === \"string\" && Boolean(root),\n ),\n );\n for (const packageRoot of packageRoots) {\n try {\n const hostEntry = path.join(packageRoot, \"dist\", \"index.js\");\n const hostModule = (await import(pathToFileURL(hostEntry).href)) as {\n ExtensionRunner?: ExtensionRunnerConstructor;\n };\n if (hostModule.ExtensionRunner) constructors.add(hostModule.ExtensionRunner);\n } catch { /* host entry not importable; skip */ }\n for (const Runner of await bundleExtensionRunnerConstructors(\n path.join(packageRoot, \"dist\", \"bundle\"),\n )) {\n constructors.add(Runner);\n }\n }\n if (constructors.size === 0) {\n // The host does not advertise its package directory (tests, embeds,\n // future layouts): fall back to resolving it in this module realm.\n try {\n const hostModule = (await import(\"@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 { truncateMiddle } from \"../util.js\";\nimport type { FabricUiController } from \"../ui/controller.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 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 pi.registerCommand(\"fabric\", {\n description: \"Open Fabric, arm prewalk, reload, or manage agents and actors\",\n getArgumentCompletions: (argumentPrefix: string): AutocompleteItem[] | null => {\n const subcommands = [\n \"status\",\n \"dashboard\",\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 ];\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 === \"schema\") {\n const modes = [\"off\", \"audit\", \"enforce\"].filter((mode) => mode.startsWith(idPrefix));\n return modes.length > 0 ? modes.map((value) => ({ value, label: value })) : null;\n }\n if (subcommand === \"import\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const template of state.globalActors.list()) {\n items.push({\n value: template.name,\n label: template.name,\n description: `global ${template.runner} template \u00B7 ${template.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* global registry not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n if (!idCommands.has(subcommand)) {\n if (subcommand === \"export\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n return null;\n }\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n try {\n for (const agent of state.agents.list()) {\n const short = agent.id.slice(0, 8);\n items.push({\n value: short,\n label: short,\n description: `${agent.status} ${agent.runner} agent \u00B7 ${agent.name}`,\n });\n }\n } catch {\n /* agents not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n },\n async handler(argumentsText, context) {\n await state.ensure(context);\n const [command = \"dashboard\", ...argumentsList] = argumentsText\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (command === \"reload\") {\n fabricUi.stop();\n suspendToolCapture();\n try {\n await state.initialize(context);\n } catch (error) {\n fabricUi.stop();\n suspendToolCapture();\n throw error;\n }\n context.ui.notify(\"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 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 }\n context.ui.notify(\n `Fabric prewalk ${enabled ? \"enabled\" : \"disabled\"} (${saved.scope}: ${saved.path})`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n `Failed to update Fabric prewalk setting: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n return;\n }\n if (option === \"--off\" || option === \"--cancel\") {\n state.prewalk.cancel();\n state.prewalkDrift.drop(context.sessionManager.getSessionId());\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n context.ui.notify(\"Fabric prewalk cancelled\", \"info\");\n return;\n }\n if (option === \"--status\") {\n const status = state.prewalk.status();\n context.ui.notify(\n status.state === \"idle\"\n ? \"Fabric prewalk is idle\"\n : `Fabric prewalk ${status.state} (${status.mode}) \u2192 ${status.model}${status.task ? `\\nTask: ${status.task}` : \"\"}`,\n \"info\",\n );\n return;\n }\n const task = argumentsText.trim().slice(command.length).trim();\n await armPrewalk(state, context, pi, task);\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 !== \"status\") {\n context.ui.notify(\n \"Usage: /fabric [status|dashboard|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>]\",\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 {\n PREWALK_ARMED_MESSAGE_TYPE,\n hasPrewalkArmedPrompt,\n prewalkArmedPrompt,\n} from \"./handoff.js\";\n\n// The single arm path shared by `/fabric prewalk` and alwaysRearm session\n// auto-arm, so drift baseline, hidden armed advisory, and status chip never\n// drift apart between entry points.\nexport const armFabricPrewalkSession = async (\n state: FabricState,\n context: ExtensionContext,\n 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 });\n // Anchor the shell-write drift window at arm time so the first\n // bash-running boundary diffs against the pre-task tree state; only\n // snapshot when the fs fallback can actually claim.\n if (prewalk.detectShellWrites) {\n await state.prewalkDrift.captureBaseline(sessionId, context.cwd);\n }\n // Hidden advisory framing, queued for the next prompt (rules before the\n // task when the caller submits one). nextTurn never triggers a turn;\n // custom messages never fire `input`, so observeTask ignores it.\n const armedPrompt = prewalkArmedPrompt(prewalk.mode, input.model);\n if (!hasPrewalkArmedPrompt(context.sessionManager.getBranch(), armedPrompt)) {\n 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 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 // initialize() cancels any prior arm at session start; a non-idle status\n // means another path armed first \u2014 never clobber it.\n if (state.prewalk.status().state !== \"idle\") return undefined;\n if (!state.config.fullCodeMode || state.config.schema.mode === \"enforce\") {\n return \"Fabric prewalk auto-arm skipped: requires full code mode with Schema enforce mode disabled.\";\n }\n if (prewalk.mode === \"trajectory\" && !state.config.agents.enabled) {\n return \"Fabric prewalk auto-arm skipped: trajectory mode requires agents.enabled.\";\n }\n const model = prewalk.model?.trim();\n if (!model || !model.includes(\"/\")) {\n return \"Fabric prewalk auto-arm skipped: set prewalk.model (provider/model) in /fabric settings so sessions arm without the interactive picker.\";\n }\n await armFabricPrewalkSession(state, context, pi, { model });\n return undefined;\n};\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 { NESTED_TOOL_CALL_ID_PREFIX } from \"./action-registry.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 {\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 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 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 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 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 ...(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 { existsSync, readFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const fabricExecutionKernelGuidance = (fullCodeMode: boolean): string =>\n [\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): string =>\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'})`, `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 `bash` on an ordinary nonzero exit; pass `settle: true` to `pi.bash` to get `{ ok: false, exitCode, output, error }` instead. Timeout, cancellation, approval, and security failures still reject.\\n`tools` is discovery + generic calls only (`providers`/`catalog`/`list`/`search`/`describe`/`call`/`models`). Call known MCP tools as `mcp.<sanitized_server>.<sanitized_tool>(args)`, captured tools as `extensions.<tool>(args)`, and stable providers as `memory.*`, `state.*`, `schema.*`, or `compact.*`. Use `tools.call({ref,args})` for computed refs. `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, 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): string => {\n const section = formatSkillsForPrompt([...skills]).replace(\n PI_SKILL_LOAD_INSTRUCTION,\n FABRIC_SKILL_LOAD_INSTRUCTION,\n );\n if (!section) return systemPrompt;\n\n if (systemPrompt.includes(SKILL_SECTION_HEADING)) {\n return systemPrompt.replace(\n PI_SKILL_LOAD_INSTRUCTION,\n FABRIC_SKILL_LOAD_INSTRUCTION,\n );\n }\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 { 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(),\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 { 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 { 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 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 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> => decorateShell(\n defineTool({\n name: \"fabric_exec\",\n label: \"Fabric\",\n description:\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 \"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 \"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 \"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 multiline edits/writes, pass named payloads through top-level `payloads` and use `\u03C0.key`; 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 ],\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:\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`. 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 as \u03C0.key, useful for content that is awkward to quote inside code. Prefer an object of string values; a JSON-object string is parsed.\",\n }),\n ),\n resultFormat: Type.Optional(Type.Union(RESULT_FORMATS.map((value) => Type.Literal(value)))),\n tokenBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional token budget observed by workflow.agent() calls\",\n }),\n ),\n agentBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional agent-call cap, bounded by Fabric configuration\",\n }),\n ),\n timeoutMs: Type.Optional(\n Type.Number({\n minimum: 1,\n description:\n \"Optional whole-program deadline in ms for this invocation; raises (never lowers) the configured executor.timeoutMs, capped by executor.maxTimeoutMs\",\n }),\n ),\n display: Type.Optional(\n Type.Union([\n Type.Object(\n {\n name: Type.Optional(\n Type.String({\n description: \"Concise execution milestone used by the Fabric activity UI and deterministic compaction continuity\",\n }),\n ),\n description: Type.Optional(\n Type.String({\n description: \"Compact declared objective or acceptance criterion shown in the dashboard and richer compaction activity\",\n }),\n ),\n },\n ),\n Type.String({\n description:\n \"Objective shorthand normalized to { name } (a JSON-object string is parsed). Prefer the object form when available.\",\n }),\n ]),\n ),\n }),\n // 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) 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 toolDisplay?.observe(context.toolCallId, \"call\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n context.isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n if (rendererState.fabricWriteBindingsCode !== code) {\n rendererState.fabricWriteBindingsCode = code;\n rendererState.fabricWriteBindings = fabricWriteBindings(code);\n }\n // The write argument preview is a streaming affordance: it previews\n // pending writes while args are still arriving. 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 // Session-wide memo keyed by the program string: the same hint serves\n // the live card, the activity feed, and compaction intent.\n const title = display?.name?.trim() || fabricExecTitleHintCached(code);\n const header = renderBoundedLines(\n [\n theme.fg(\"toolTitle\", theme.bold(safeTerminalText(title || \"Fabric\"))),\n ...(display?.description\n ? [theme.fg(\"dim\", safeTerminalText(display.description))]\n : []),\n ],\n theme,\n codePreviewSettings.diffIntensity,\n );\n if (!writePreview) return header;\n const composite = new Container();\n composite.addChild(header);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n }\n\n const lines = safeTerminalText(code).split(\"\\n\");\n const runDisplay = normalizeRunDisplay(params.display);\n const displayName = runDisplay?.name ? safeTerminalText(runDisplay.name) : \"\";\n const title = `${theme.fg(\"toolTitle\", theme.bold(\"fabric\"))}${\n displayName ? ` ${theme.fg(\"accent\", displayName)}` : \"\"\n } ${theme.fg(\"dim\", `TypeScript \u00B7 ${countLabel(lines.length, \"line\")}`)}`;\n // Match the compact header: the declared objective sits between the\n // title and the code preview.\n const description = runDisplay?.description\n ? theme.fg(\"dim\", safeTerminalText(runDisplay.description))\n : \"\";\n const baseLimit = context.expanded ? lines.length : Math.min(lines.length, 8);\n const maxLimit = context.expanded\n ? lines.length\n : Math.min(lines.length, baseLimit + MAX_FABRIC_CODE_TRANSFER_LINES);\n const renderCodePreview = (limit: number, width: number): string[] => {\n const shown = lines.slice(0, limit);\n const lineNumberWidth = String(Math.max(1, shown.length)).length;\n const preview = shown\n .map(\n (line, index) =>\n `${theme.fg(\"dim\", String(index + 1).padStart(lineNumberWidth, \" \"))} ${theme.fg(\"muted\", line || \" \")}`,\n )\n .join(\"\\n\");\n const hidden = lines.length - shown.length;\n const hiddenHint =\n hidden > 0\n ? `\\n${theme.fg(\"dim\", `\u2026 ${countLabel(hidden, \"line\")} hidden \u00B7 `)}${expandHint(theme)}`\n : \"\";\n return new Text(\n `${title}${description ? `\\n${description}` : \"\"}${preview ? `\\n${preview}` : \"\"}${hiddenHint}`,\n 0,\n 0,\n ).render(width);\n };\n const codePreview = new HiddenRowBorrowingComponent(\n baseLimit,\n maxLimit,\n renderCodePreview,\n rowBalance,\n );\n if (!writePreview) return codePreview;\n const composite = new Container();\n composite.addChild(codePreview);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n },\n renderResult(result, { 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 toolDisplay?.observe(context.toolCallId, \"result\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n const trackRows = (component: Component): Component =>\n observeResultRows(\n inheritComponentBackground(component),\n rowBalance,\n { expanded, isPartial },\n );\n if (isPartial) {\n rendererState.fabricCoreToolPreviews = captureFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n rendererState.fabricAgentPreviews = captureFabricAgentPreviews(\n audits,\n rendererState.fabricAgentPreviews,\n );\n const headlinePreviews = captureFabricCallHeadlinePreviews(audits);\n if (headlinePreviews.length > 0) {\n rendererState.fabricCallHeadlinePreviews = headlinePreviews;\n }\n const writePreviews = captureFabricWritePreviews(audits);\n if (writePreviews.length > 0) rendererState.fabricWritePreviews = writePreviews;\n } else {\n if (rendererState.fabricCoreToolPreviews) {\n audits = restoreFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n }\n if (rendererState.fabricAgentPreviews) {\n audits = restoreFabricAgentPreviews(audits, rendererState.fabricAgentPreviews);\n }\n if (rendererState.fabricCallHeadlinePreviews) {\n audits = restoreFabricCallHeadlinePreviews(\n audits,\n rendererState.fabricCallHeadlinePreviews,\n );\n }\n if (rendererState.fabricWritePreviews) {\n audits = restoreFabricWritePreviews(audits, rendererState.fabricWritePreviews);\n }\n }\n const phases = details.phases;\n const nl = \"\\n\";\n const allRowIndexes = (lines: string[], enabled: boolean): ReadonlySet<number> | undefined =>\n enabled ? new Set(lines.map((_line, index) => index)) : undefined;\n // Expanded (app.tools.expand / ctrl+o) promotes compact cards to the\n // full rendering; compact only governs the collapsed presentation.\n const compact = !expanded && toolDisplayMode(state) === \"compact\";\n const corePreviewContext = { cwd: context.cwd, settings: codePreviewSettings };\n const showAgentToolPreview = state.initialized\n ? state.config.ui.showAgentToolPreview\n : DEFAULT_FABRIC_CONFIG.ui.showAgentToolPreview;\n\n const renderBody = (\n audit: FabricRenderAudit,\n limit: number,\n ): { body: string; hidden: number } | null => {\n const core = renderCoreToolBody(audit, theme, {\n cwd: context.cwd,\n settings: codePreviewSettings,\n expanded,\n maxLines: limit,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (core) return { body: core.lines.join(nl), hidden: core.hidden };\n if (coreToolRendererEnabled(audit, codePreviewSettings)) return null;\n\n const body = nestedCallBody(audit);\n if (!body) return null;\n const bodyLines = safeTerminalText(body).split(nl);\n while (bodyLines.length > 0) {\n const last = bodyLines[bodyLines.length - 1];\n if (last === undefined || last.trim() === \"\") bodyLines.pop();\n else break;\n }\n if (bodyLines.length === 0) return null;\n const shown = bodyLines.slice(0, limit);\n return {\n body: shown.map((line) => theme.fg(\"toolOutput\", line || \" \")).join(nl),\n hidden: bodyLines.length - shown.length,\n };\n };\n\n if (isPartial) {\n const progress = details.progress;\n if (audits.length === 0) {\n const label = compact ? \"Running\u2026\" : progress ?? \"Running Fabric program\u2026\";\n return trackRows(\n new Text(theme.fg(\"warning\", `\u25C6 ${safeTerminalText(label)}`), 0, 0),\n );\n }\n if (audits.length === 1) {\n const audit = audits[0]!;\n const glyph =\n audit.success === undefined\n ? theme.fg(\"warning\", spinner)\n : audit.success === false\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n let text = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n const progressLine = singleCallProgressLine(progress, previewLines);\n if (audit.success === false && audit.error) {\n text += nl + ` ${theme.fg(\"error\", safeTerminalText(audit.error))}`;\n } else {\n const rendered = renderBody(\n audit,\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 10,\n );\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (progressLine) {\n text += nl + theme.fg(\"dim\", progressLine);\n }\n }\n if (audit.success !== false && previewLines[0]) {\n const firstBreak = text.indexOf(nl);\n if (firstBreak < 0) text += ` ${previewLines[0]}`;\n else text = `${text.slice(0, firstBreak)} ${previewLines[0]}${text.slice(firstBreak)}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n let preview: { auditIndex: number; body: string; hidden: number } | undefined;\n for (let index = audits.length - 1; index >= 0; index--) {\n const audit = audits[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, expanded ? 20 : 10);\n if (rendered) {\n preview = { auditIndex: index, ...rendered };\n break;\n }\n }\n return trackRows(\n renderFabricMulticallPartial(\n {\n audits,\n phases,\n progress,\n expanded,\n preview,\n core: corePreviewContext,\n showAgentToolPreview,\n spinner,\n ...(compact ? { activityLabel: \"Tools\" } : {}),\n },\n theme,\n context?.invalidate,\n ),\n );\n }\n\n const output = result.content\n .filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n .map((part) => part.text)\n .join(nl);\n const styleOutputLines = (lines: string[]): string[] => {\n if (!details.outputFormat || lines.length === 0) {\n return lines.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n }\n const highlightedStart = Math.min(\n lines.length,\n details.outputFormatStartLine ?? 0,\n );\n const highlightedCount = Math.min(\n lines.length - highlightedStart,\n details.outputFormatLines ?? lines.length,\n );\n const highlightedSource = lines.slice(\n highlightedStart,\n highlightedStart + highlightedCount,\n );\n const highlighted = highlightedSource.length > 0\n ? highlightCode(\n highlightedSource.join(nl),\n details.outputFormat,\n context?.invalidate,\n )\n : [];\n const styledPrefix = highlighted?.map((line) => line || \" \")\n ?? highlightedSource.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n return [\n ...lines.slice(0, highlightedStart).map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ...styledPrefix,\n ...lines\n .slice(highlightedStart + highlightedCount)\n .map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ];\n };\n const failed = details.success === false;\n\n if (audits.length === 0) {\n if (failed && details.error) {\n return trackRows(\n new Text(\n theme.fg(\"error\", `\u2717 ${safeTerminalText(details.error)}`),\n 0,\n 0,\n ),\n );\n }\n if (!output) {\n return trackRows(new Text(\n compact\n ? theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\")\n : theme.fg(\"dim\", \"\u2713 Fabric\"),\n 0,\n 0,\n ));\n }\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 12;\n const shown = lines.slice(0, limit);\n let text = styleOutputLines(shown).join(nl);\n if (compact) {\n text = theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\") + nl + text;\n }\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n return trackRows(\n renderBoundedLines(text.split(nl), theme, codePreviewSettings.diffIntensity),\n );\n }\n\n if (audits.length === 1) {\n const audit = audits[0]!;\n let text = compact\n ? `${compactResultHeader(theme, audits, failed)}${nl}${nestedCallTitle(\n audit,\n theme,\n context?.invalidate,\n corePreviewContext,\n )}`\n : nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext);\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (audit.success === false) {\n if (audit.error) {\n text += nl + theme.fg(\"error\", safeTerminalText(audit.error));\n }\n return trackRows(new Text(text, 0, 0));\n }\n if (previewLines[0]) {\n text += ` ${previewLines[0]}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const limit =\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 12;\n const rendered = previewLines.length > 0 ? null : renderBody(audit, limit);\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (\n previewLines.length === 0 &&\n output &&\n !isCoreToolAudit(audit) &&\n (!compact || failed || expanded)\n ) {\n const lines = safeTerminalText(output).split(nl);\n const outLimit = expanded ? Math.min(lines.length, 200) : 12;\n const outShown = lines.slice(0, outLimit);\n text += nl + styleOutputLines(outShown).join(nl);\n if (lines.length > outShown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - outShown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n\n const failedCalls = audits.filter(\n (audit) => audit.success === false,\n ).length;\n const status = failed ? \"failed\" : \"complete\";\n const statusColor = failed ? \"error\" : \"success\";\n const metadata = [\n countLabel(audits.length, \"nested call\"),\n failedCalls > 0 ? `${failedCalls} failed` : undefined,\n phases.length > 0 ? countLabel(phases.length, \"phase\") : undefined,\n ].filter((value): value is string => Boolean(value));\n let text = compact\n ? compactResultHeader(theme, audits, failed)\n : theme.fg(\n statusColor,\n `${failed ? \"\u2717\" : \"\u2713\"} Fabric ${status}`,\n );\n if (!compact && metadata.length > 0) text += theme.fg(\"dim\", ` \u00B7 ${metadata.join(\" \u00B7 \")}`);\n if (phases.length > 0)\n text += nl + theme.fg(\"dim\", phases.map((phase) => `\u25C6 ${phase}`).join(\" \"));\n\n const callLimit = fabricMulticallCallLimit(expanded);\n const callsShown = audits.slice(0, callLimit);\n const callsHidden = audits.length - callsShown.length;\n let collapsedPreview:\n | { auditIndex: number; body: string; hidden: number }\n | undefined;\n if (!expanded) {\n for (let index = callsShown.length - 1; index >= 0; index--) {\n const audit = callsShown[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, 10);\n if (rendered) {\n collapsedPreview = { auditIndex: index, ...rendered };\n break;\n }\n }\n }\n let firstNested = true;\n const textRows = text.split(nl);\n const agentWrapLineIndexes = new Set<number>();\n for (let index = 0; index < callsShown.length; index++) {\n const audit = callsShown[index]!;\n if (expanded && !firstNested) textRows.push(\"\");\n firstNested = false;\n const glyph =\n audit.success === false ? theme.fg(\"error\", \"\u2717\") : theme.fg(\"dim\", \"\u203A\");\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n compact: !expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n let callRow = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n if (previewLines[0] && audit.success !== false) {\n callRow += ` ${previewLines[0]}`;\n if (expanded) agentWrapLineIndexes.add(textRows.length);\n }\n textRows.push(callRow);\n if (audit.success === false && audit.error) {\n textRows.push(` ${theme.fg(\"error\", safeTerminalText(audit.error))}`);\n } else {\n if (previewLines.length > 1) {\n for (const line of previewLines.slice(1)) {\n agentWrapLineIndexes.add(textRows.length);\n textRows.push(line);\n }\n }\n const rendered = previewLines.length === 0 && expanded ? renderBody(audit, 40) : null;\n if (rendered) {\n textRows.push(...rendered.body.split(nl));\n if (rendered.hidden > 0) {\n textRows.push(theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`));\n }\n } else if (previewLines.length === 0 && collapsedPreview?.auditIndex === index) {\n textRows.push(...collapsedPreview.body.split(nl).map((line) => ` ${line}`));\n if (collapsedPreview.hidden > 0) {\n textRows.push(theme.fg(\n \"dim\",\n ` \u2026 ${countLabel(collapsedPreview.hidden, \"line\")}`,\n ));\n }\n }\n }\n }\n text = textRows.join(nl);\n if (callsHidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(callsHidden, \"nested call\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n\n const showOutput = failed || expanded;\n if (showOutput && output) {\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 6;\n const shown = lines.slice(0, limit);\n if (shown.length > 0) {\n if (expanded) text += nl + theme.fg(\"dim\", \"\u21A9 return\");\n text += nl + styleOutputLines(shown).join(nl);\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n }\n return trackRows(\n renderBoundedLines(\n text.split(nl),\n theme,\n codePreviewSettings.diffIntensity,\n agentWrapLineIndexes,\n ),\n );\n },\n async execute(toolCallId, params, signal, onUpdate, context) {\n await state.ensure(context);\n // prepareArguments joins code arrays / remaps `strings` \u2192 `payloads`\n // before Pi validates this call; keep the same coercion here for\n // direct internal invocations of the definition.\n const code = Array.isArray(params.code) ? params.code.join(\"\\n\") : params.code;\n const runDisplay = normalizeRunDisplay(params.display);\n const strings = resolveFabricExecPayloads(params);\n const result = await state.execution.execute({\n code,\n ...(strings ? { strings } : {}),\n signal,\n parentToolCallId: toolCallId,\n context,\n ...(params.tokenBudget !== undefined ? { tokenBudget: params.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 pendingHandoff = await state.claimHandoff(\n result,\n context.sessionManager.getSessionId(),\n selectedResultFormat,\n toolCallId,\n );\n if (pendingHandoff) {\n pendingHandoffs.set(toolCallId, pendingHandoff);\n context.ui.setStatus(\n \"fabric-prewalk\",\n `waiting for fabric_exec boundary \u2192 ${String(pendingHandoff.args.model ?? \"executor\")}`,\n );\n }\n const fullFormattedValue = formatFabricValue(result.value, selectedResultFormat);\n const failureProgress = formatFailureProgress(result.trace);\n const fullSections = [...result.logs];\n if (fullFormattedValue.text) fullSections.push(fullFormattedValue.text);\n if (result.error) fullSections.push(`Runtime error: ${result.error}`);\n if (failureProgress) fullSections.push(failureProgress);\n const fullRawOutput = fullSections.join(\"\\n\\n\");\n const outputBudget = modelOutputBudget(\n state.config.executor.maxOutputChars,\n result.success,\n );\n const outputWillTruncate = fullRawOutput.length > outputBudget;\n const formattedValue = outputWillTruncate\n ? formatFabricValue(\n result.value,\n selectedResultFormat,\n outputBudget,\n )\n : fullFormattedValue;\n const sections = [...result.logs];\n const logPrefix = result.logs.join(\"\\n\\n\");\n if (formattedValue.text) sections.push(formattedValue.text);\n if (result.error) sections.push(`Runtime error: ${result.error}`);\n if (failureProgress) sections.push(failureProgress);\n const rawOutput = sections.join(\"\\n\\n\");\n const outputFormat =\n formattedValue.language &&\n formattedValue.text &&\n (result.logs.length === 0 || !outputWillTruncate)\n ? formattedValue.language\n : undefined;\n const outputFormatStartLine = result.logs.length > 0\n ? countNewlines(logPrefix) + 2\n : 0;\n // Evaluated lazily at each return so the main path persists audits after\n // their in-memory image payloads are stripped below.\n const 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 const terminate =\n pendingHandoff !== undefined ||\n (result.success &&\n typeof result.value === \"object\" &&\n result.value !== null &&\n \"terminate\" in result.value &&\n result.value.terminate === true);\n // A nested `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 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", "import type { FabricExecutionTraceV1 } from \"./audit/trace.js\";\n\nconst MAX_COMPLETED_CALLS = 8;\nconst MAX_PATH_CHARS = 100;\n\nconst compactPath = (value: string): string => {\n const singleLine = value.replaceAll(/\\s+/g, \" \").trim();\n if (singleLine.length <= MAX_PATH_CHARS) return singleLine;\n return `\u2026${singleLine.slice(-(MAX_PATH_CHARS - 1))}`;\n};\n\nexport const formatFailureProgress = (\n trace: FabricExecutionTraceV1,\n): string | undefined => {\n if (trace.outcome === \"succeeded\") return undefined;\n const completed = trace.operations.filter(\n (operation) => operation.outcome === \"succeeded\",\n );\n if (completed.length === 0) return undefined;\n const summaries = completed.slice(0, MAX_COMPLETED_CALLS).map((operation) => {\n const path = operation.args.path;\n return typeof path === \"string\"\n ? `${operation.ref}(${compactPath(path)})`\n : operation.ref;\n });\n const omitted = completed.length - summaries.length;\n return [\n `Completed before the outer failure (outputs not returned): ${summaries.join(\"; \")}${\n omitted > 0 ? `; +${omitted} more` : \"\"\n }.`,\n \"Successful calls may already have changed the workspace; inspect before repeating mutations.\",\n ].join(\"\\n\");\n};\n", "import { normalizeRunDisplay } from \"./run-display.js\";\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): unknown => {\n if (typeof input === \"string\") return { code: 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\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", "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 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 `pi.bash` 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};\n\n// pi.bash options that stay unsupported (cwd is honored per call since #71).\nconst BASH_OPTION_NOTES: Readonly<Record<string, string>> = {\n stdin:\n \"`pi.bash` does 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\") {\n const bashNote = BASH_OPTION_NOTES[property];\n if (bashNote !== undefined) return `Recovery hint: ${bashNote}`;\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 (!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 { mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { truncateMiddle } from \"./util.js\";\n\nexport const MAX_FAILURE_MODEL_OUTPUT_CHARS = 20_000;\n\nexport const modelOutputBudget = (\n configuredMaxChars: number,\n success: boolean,\n): number => success\n ? configuredMaxChars\n : Math.min(configuredMaxChars, MAX_FAILURE_MODEL_OUTPUT_CHARS);\n\nexport interface BoundedModelOutput {\n text: string;\n artifactPath?: string;\n originalChars: number;\n omittedChars: number;\n}\n\ntype ArtifactWriter = (content: string) => Promise<string>;\n\nconst writeOutputArtifact: ArtifactWriter = async (content) => {\n const directory = await mkdtemp(path.join(tmpdir(), \"pi-fabric-output-\"));\n const artifactPath = path.join(directory, \"output.txt\");\n await writeFile(artifactPath, content, { encoding: \"utf8\", mode: 0o600 });\n return artifactPath;\n};\n\nexport const boundModelOutput = async (\n visible: string,\n maxChars: number,\n fullOutput = visible,\n writeArtifact: ArtifactWriter = writeOutputArtifact,\n): Promise<BoundedModelOutput> => {\n if (visible.length <= maxChars && fullOutput.length <= maxChars) {\n return { text: visible, originalChars: fullOutput.length, omittedChars: 0 };\n }\n\n let artifactPath: string | undefined;\n try {\n artifactPath = await writeArtifact(fullOutput);\n } catch {\n artifactPath = undefined;\n }\n const suffix = artifactPath\n ? `\\n\\n[Full output (${fullOutput.length} chars) saved to: ${artifactPath}]`\n : \"\";\n const bodyBudget = Math.max(1, maxChars - suffix.length);\n const text = `${truncateMiddle(visible, bodyBudget)}${suffix}`;\n return {\n text: text.length <= maxChars ? text : truncateMiddle(text, maxChars),\n ...(artifactPath ? { artifactPath } : {}),\n originalChars: fullOutput.length,\n omittedChars: Math.max(0, fullOutput.length - Math.min(fullOutput.length, bodyBudget)),\n };\n};\n", "import type { ExtensionContext } from \"@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\";\n\nexport interface FabricStateOptions {\n paths?: FabricRuntimePaths;\n runtimeLoader?: () => Promise<typeof import(\"./fabric-runtime-state.js\")>;\n}\n\ntype ActivationHook = (context: ExtensionContext) => void | Promise<void>;\ntype ActivationFailureHook = () => void | Promise<void>;\n\nexport class FabricState {\n #runtime: FabricRuntimeState | undefined;\n #activatingRuntime: FabricRuntimeState | undefined;\n #activation: Promise<FabricRuntimeState> | undefined;\n #activationGeneration: number | undefined;\n #config: FabricConfig | undefined;\n #cwd: string | undefined;\n #generation = 0;\n #everActivated = false;\n #activationHook: ActivationHook | undefined;\n #activationFailureHook: ActivationFailureHook | undefined;\n readonly #externalProviders = new Map<string, FabricProvider>();\n readonly #externalComponents = new Map<string, FabricComponentDefinition>();\n readonly #options: FabricStateOptions;\n readonly activity = new FabricActivityStore();\n readonly prewalk = new PrewalkController();\n readonly prewalkDrift = new PrewalkDriftTracker();\n readonly sessionApprovals = new FabricSessionApprovals();\n #widgetDismissedAt = 0;\n\n constructor(\n readonly pi: ExtensionAPI,\n readonly capturedTools: CapturedToolCatalog,\n options: FabricStateOptions = {},\n ) {\n this.#options = options;\n }\n\n get initialized(): boolean {\n return this.#current()?.initialized === true;\n }\n\n // Lightweight bootstrap seam: true once configuration is loaded, with no\n // dependency on the heavyweight runtime. Rendering reads this instead of\n // initialized so a resumed session honors bootstrapped presentation\n // preferences while the runtime is intentionally inactive.\n get bootstrapped(): boolean {\n return this.#config !== undefined;\n }\n\n get activated(): boolean {\n return this.#everActivated;\n }\n\n get config(): FabricConfig {\n if (!this.#config) throw new Error(\"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 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 components(): FabricRuntimeState[\"components\"] { return this.#required().components; }\n\n setActivationHook(hook: ActivationHook, onFailure?: ActivationFailureHook): void {\n this.#activationHook = hook;\n this.#activationFailureHook = onFailure;\n }\n\n async bootstrap(context: ExtensionContext): Promise<void> {\n const generation = ++this.#generation;\n this.#cwd = context.cwd;\n // A failed config load must not leak the previous session's configuration\n // into this one: clear before the read so bootstrapped stays false and\n // presentation falls back to the safe default until a load succeeds.\n this.#config = undefined;\n const config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#config = config;\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n this.activity.reset();\n this.sessionApprovals.approvedRisks.clear();\n this.#widgetDismissedAt = 0;\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n\n const pending = this.#activation;\n if (pending) await pending.catch(() => undefined);\n if (generation !== this.#generation) return;\n if (this.#everActivated) await this.#activate(context, true);\n }\n\n async initialize(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) {\n await this.bootstrap(context);\n } else {\n this.#config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n }\n await this.#activate(context, true);\n }\n\n async ensure(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) await this.bootstrap(context);\n await this.#activate(context, false);\n }\n\n shouldEagerlyActivate(context: ExtensionContext): boolean {\n if (\n process.env.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 actorRoot = this.config.mesh.actorScope === \"session\"\n ? path.join(meshRoot, \"actors\", sessionId)\n : path.join(meshRoot, \"actors\");\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 mainAgentInfo(context?: ExtensionContext): FabricMainAgentInfo { return this.#required().mainAgentInfo(context); }\n peerInfos(): FabricPeerInfo[] { return this.#current()?.peerInfos() ?? []; }\n componentGraph(): FabricComponentGraph {\n return this.#current()?.componentGraph() ?? { components: [], edges: [], cycles: [] };\n }\n modelGuidance(): FabricOwnedModelGuidance[] { return this.#current()?.modelGuidance() ?? []; }\n participantInfos(options: FabricParticipantListOptions = {}): FabricParticipantInfo[] {\n return this.#current()?.participantInfos(options) ?? [];\n }\n queueUserMessage(targetId: string, message: string, delivery: FabricAgentMessageDelivery): Promise<FabricAgentMessageResult> {\n return this.#required().queueUserMessage(targetId, message, delivery);\n }\n stopParticipant(targetId: string): Promise<unknown> { return this.#required().stopParticipant(targetId); }\n claimHandoff(execution: FabricExecutionResult, sessionId: string, resultFormat: FabricResultFormat, outerToolCallId: string): Promise<PendingFabricHandoff | undefined> {\n return this.#required().claimHandoff(execution, sessionId, resultFormat, outerToolCallId);\n }\n runHandoffAtBoundary(pending: PendingFabricHandoff, result: AgentToolResultMessage, context: ExtensionContext): Promise<Record<string, unknown>> {\n return this.#required().runHandoffAtBoundary(pending, result, context);\n }\n noteMainActivity(context: ExtensionContext): void { this.#current()?.noteMainActivity(context); }\n dispatchHostEvent(event: FabricActorHostEvent, payload: unknown, context: ExtensionContext): number {\n return this.#current()?.dispatchHostEvent(event, payload, context) ?? 0;\n }\n publishHostLifecycle(event: FabricLifecycleEventType, payload: unknown): Promise<void> {\n return this.#current()?.publishHostLifecycle(event, payload) ?? Promise.resolve();\n }\n\n registerExternal(provider: FabricProvider, options: { overwrite?: boolean } = {}): void {\n if (\n provider.name === \"fabric\" ||\n provider.name === \"components\" ||\n FABRIC_COMPONENT_PROVIDER_NAMES.some((name) => name === provider.name)\n ) {\n throw new Error(`Reserved Fabric provider name: ${provider.name}`);\n }\n if (this.#externalProviders.has(provider.name) && !options.overwrite) {\n throw new Error(`Fabric provider already registered: ${provider.name}`);\n }\n this.#externalProviders.set(provider.name, provider);\n this.#current()?.registerExternal(provider, options);\n }\n\n registerExternalComponent(\n component: FabricComponentDefinition,\n options: { overwrite?: boolean } = {},\n ): void {\n if (component.name.startsWith(FABRIC_PROVIDER_COMPONENT_PREFIX)) {\n throw new Error(`Reserved Fabric component name: ${component.name}`);\n }\n if (this.#externalComponents.has(component.name) && !options.overwrite) {\n throw new Error(`Fabric component already registered: ${component.name}`);\n }\n this.#externalComponents.set(component.name, component);\n this.#current()?.registerExternalComponent(component, options);\n }\n\n reloadConfig(context: ExtensionContext): void {\n const next = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n if (this.#config) {\n next.schema.mode = this.#config.schema.mode;\n // Keep the enforce \u21D2 QuickJS coupling alive across reloads; a disk\n // runtime value must never combine with a live enforce override.\n if (next.schema.mode === \"enforce\") next.executor.runtime = this.#config.executor.runtime;\n }\n this.#config = next;\n this.#runtime?.reloadConfig(context, next);\n }\n\n // Ephemeral, session-only schema mode: mutates the live config (guidance,\n // resolved-action gate, and executor runtime all read it per call) without\n // touching fabric.json, so the next session starts from the configured mode.\n // reloadConfig preserves the override like the startup mode does.\n setSchemaMode(context: ExtensionContext, mode: FabricSchemaMode): void {\n if (!this.#config) throw new Error(\"Fabric is not initialized\");\n const previous = this.#config.schema.mode;\n if (mode === \"enforce\" && previous !== \"enforce\" && !this.#config.fullCodeMode) {\n throw new Error(\n \"Schema enforce requires full code mode; enable fullCodeMode or start a session with schema.mode=enforce\",\n );\n }\n this.#config.schema.mode = mode;\n if (mode === \"enforce\") {\n // Mirror normalizeFabricConfig: the sandbox gate is void when guest code\n // has a process escape hatch, so enforce always runs on QuickJS.\n this.#config.executor.runtime = \"quickjs\";\n } else if (previous === \"enforce\") {\n this.#config.executor.runtime = this.#diskConfig(context).executor.runtime;\n }\n this.#runtime?.setSchemaMode(mode, this.#config.executor.runtime);\n }\n\n schemaStatus(context: ExtensionContext): {\n mode: FabricSchemaMode;\n source: \"config\" | \"session override\";\n executorRuntime: string;\n } {\n const disk = this.#diskConfig(context);\n const mode = this.#config?.schema.mode ?? disk.schema.mode;\n return {\n mode,\n source: this.#config && this.#config.schema.mode !== disk.schema.mode\n ? \"session override\"\n : \"config\",\n executorRuntime: this.#config?.executor.runtime ?? disk.executor.runtime,\n };\n }\n\n #diskConfig(context: ExtensionContext): FabricConfig {\n const projectTrusted = context.isProjectTrusted();\n return loadFabricConfigForScope(\n { cwd: context.cwd, agentDir: resolveAgentDir(), projectTrusted },\n projectTrusted ? \"project\" : \"global\",\n );\n }\n\n async shutdown(): Promise<void> {\n const generation = ++this.#generation;\n const activation = this.#activation;\n if (activation) await activation.catch(() => undefined);\n if (generation !== this.#generation) return;\n\n const runtime = this.#runtime;\n this.#runtime = undefined;\n try {\n await runtime?.shutdown();\n } finally {\n if (generation === this.#generation) {\n this.#config = undefined;\n this.#cwd = undefined;\n this.#externalProviders.clear();\n this.#externalComponents.clear();\n this.#everActivated = false;\n this.activity.reset();\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n }\n }\n }\n\n async #activate(context: ExtensionContext, reinitialize: boolean): Promise<FabricRuntimeState> {\n if (this.#activation) {\n if (this.#activationGeneration === this.#generation) return this.#activation;\n await this.#activation.catch(() => undefined);\n return this.#activate(context, reinitialize);\n }\n if (this.#runtime?.initialized && !reinitialize) return this.#runtime;\n\n const generation = this.#generation;\n const config = this.config;\n const existing = this.#runtime;\n const reusable = existing?.initialized ? existing : undefined;\n const orphan = existing && !existing.initialized ? existing : undefined;\n this.#runtime = undefined;\n let candidate: FabricRuntimeState | undefined;\n const assertCurrent = (): void => {\n if (generation !== this.#generation) {\n throw new Error(\"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 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 activity: this.activity,\n prewalk: this.prewalk,\n prewalkDrift: this.prewalkDrift,\n sessionApprovals: this.sessionApprovals,\n ...(this.#options.paths ? { paths: this.#options.paths } : {}),\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 { 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 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 { FabricActivityRun } from \"../activity/types.js\";\nimport type {\n FabricActorBindingScope,\n FabricActorDelivery,\n FabricActorHostEvent,\n} from \"../actors/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport type { FabricThinking } from \"../thinking.js\";\nimport type { MeshEvent } from \"../mesh/store.js\";\nimport type { FabricDashboardMessageTarget } from \"./dashboard.js\";\nimport type { ModelSource } from \"./model-picker.js\";\nimport { createDashboardSnapshot } from \"./snapshot.js\";\nimport { 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 #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 #activityRevision: number | undefined;\n // Tracks whether #activityRuns was last fetched with full payloads. The\n // dashboard needs args/result/preview to render call detail; the periodic\n // refresh instead pulls payload-free summaries so streaming runs stop\n // paying a deep clone of up to 1,000 bounded call payloads per tick.\n #activityRunsDetailed = true;\n #activityRuns: FabricActivityRun[] = [];\n readonly #transcripts = new AgentTranscriptReader();\n\n constructor(\n readonly state: FabricState,\n readonly codePreviewSettings?: CodePreviewSettings,\n ) {}\n\n start(context: ExtensionContext): void {\n this.stop();\n this.#context = context;\n if (!this.state.config.ui.enabled || context.mode !== \"tui\") return;\n if (this.state.config.mesh.enabled) {\n this.#events = this.state.mesh.read({ limit: this.state.config.ui.eventHistory });\n this.#meshOffset = this.state.mesh.latestOffset();\n }\n this.#activityUnsubscribe = this.state.activity.subscribe(() => this.#scheduleRefresh());\n this.#actorUnsubscribe = this.state.actors.subscribe(() => this.#scheduleRefresh());\n this.#agentUnsubscribe = this.state.agents.subscribeUi(() => this.#scheduleRefresh());\n this.#refresh();\n this.#schedulePoll();\n }\n\n stop(): void {\n if (this.#timer) clearTimeout(this.#timer);\n if (this.#scheduledRefresh) clearTimeout(this.#scheduledRefresh);\n this.#timer = undefined;\n this.#scheduledRefresh = undefined;\n this.#widget = undefined;\n this.#activityUnsubscribe?.();\n this.#activityUnsubscribe = undefined;\n this.#actorUnsubscribe?.();\n this.#actorUnsubscribe = undefined;\n this.#agentUnsubscribe?.();\n this.#agentUnsubscribe = undefined;\n if (this.#context?.mode === \"tui\") {\n this.#context.ui.setWidget(WIDGET_ID, undefined);\n }\n this.#context = undefined;\n this.#widgetTui = undefined;\n this.#dashboardTui = undefined;\n this.#widgetMounted = false;\n this.#events = [];\n this.#meshOffset = 0;\n this.#snapshot = emptySnapshot();\n this.#lastRefreshErrorAt = 0;\n this.#lastRefreshAt = 0;\n this.#dashboardOpen = false;\n this.#activityRevision = undefined;\n this.#activityRunsDetailed = true;\n this.#activityRuns = [];\n this.#transcripts.clear();\n }\n\n async openDashboard(context: ExtensionContext): Promise<void> {\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 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 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 this.#dashboardOpen = false;\n this.#dashboardTui = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }\n }\n\n snapshot(): FabricDashboardSnapshot {\n return structuredClone(this.#snapshot);\n }\n\n #schedulePoll(reset = false): void {\n if (reset && this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n if (this.#timer || !this.#context) return;\n const active =\n this.#snapshot.runs.some((run) => run.status === \"running\") ||\n this.#snapshot.peers.length > 0 ||\n this.#snapshot.agents.some((agent) => isActiveStatus(agent.status)) ||\n this.#snapshot.actors.some(\n (actor) =>\n isActiveStatus(actor.status) ||\n Boolean(actor.worker && isActiveStatus(actor.worker.status)),\n );\n if (!this.#dashboardOpen && !active) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n this.#refresh();\n this.#schedulePoll();\n }, this.state.config.ui.refreshMs);\n this.#timer.unref();\n }\n\n #scheduleRefresh(): void {\n if (this.#scheduledRefresh || !this.#context) return;\n const elapsed = performance.now() - this.#lastRefreshAt;\n const delay = Math.max(\n 0,\n Math.min(ACTIVITY_REFRESH_MS, this.state.config.ui.refreshMs) - elapsed,\n );\n this.#scheduledRefresh = setTimeout(() => {\n this.#scheduledRefresh = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }, delay);\n this.#scheduledRefresh.unref();\n }\n\n #agentTranscriptSource(agent: FabricUiAgent): FabricTranscriptSource {\n return { id: agent.id, status: agent.status, ...(agent.logFile ? { logFile: agent.logFile } : {}) };\n }\n\n #actorTranscriptSource(actor: FabricUiActor): FabricTranscriptSource {\n if (actor.worker?.logFile && isActiveStatus(actor.worker.status)) {\n return {\n id: `${actor.id}:${actor.worker.id}`,\n status: actor.worker.status,\n logFile: actor.worker.logFile,\n };\n }\n const retained = actor.lastRunId && actor.logDir\n ? path.join(actor.logDir, actor.lastRunId, \"events.jsonl\")\n : undefined;\n if (retained) return { id: actor.id, status: actor.status, logFile: retained };\n if (actor.sessionFile) {\n return { id: actor.id, status: actor.status, logFile: actor.sessionFile };\n }\n return { id: actor.id, status: actor.status };\n }\n\n #transcriptSource(target: FabricUiAgent | FabricUiActor): FabricTranscriptSource {\n return \"recentMessages\" in target\n ? this.#actorTranscriptSource(target)\n : this.#agentTranscriptSource(target);\n }\n\n #refresh(): void {\n this.#lastRefreshAt = performance.now();\n const context = this.#context;\n if (!context || !this.state.initialized) return;\n try {\n this.#pollMesh();\n const revision =\n typeof this.state.activity.revision === \"function\"\n ? this.state.activity.revision()\n : undefined;\n const detailed = this.#dashboardOpen;\n if (\n revision === undefined ||\n revision !== this.#activityRevision ||\n detailed !== this.#activityRunsDetailed\n ) {\n this.#activityRuns =\n detailed || typeof this.state.activity.runSummaries !== \"function\"\n ? this.state.activity.runs()\n : this.state.activity.runSummaries();\n this.#activityRevision = revision;\n this.#activityRunsDetailed = detailed;\n }\n this.#snapshot = createDashboardSnapshot(\n this.state,\n this.#events,\n context,\n this.#activityRuns,\n );\n this.#renderWidget(context);\n if (this.#dashboardTui) this.#dashboardTui.requestRender();\n else if (this.#widgetTui && this.#widget?.hasChanged()) this.#widgetTui.requestRender();\n } catch (error) {\n const now = Date.now();\n if (now - this.#lastRefreshErrorAt >= 10_000) {\n this.#lastRefreshErrorAt = now;\n const message = error instanceof Error ? error.message : String(error);\n context.ui.notify(`Fabric dashboard refresh failed: ${message}`, \"warning\");\n }\n }\n }\n\n #pollMesh(): void {\n if (!this.state.config.mesh.enabled) return;\n const result = this.state.mesh.tail(this.#meshOffset, this.state.config.ui.eventHistory);\n this.#meshOffset = result.nextOffset;\n if (result.events.length === 0) return;\n this.#events.push(...result.events);\n const limit = this.state.config.ui.eventHistory;\n if (this.#events.length > limit) this.#events.splice(0, this.#events.length - limit);\n }\n\n #renderWidget(context: ExtensionContext): void {\n const config = this.state.config.ui;\n const shouldShow =\n context.mode === \"tui\" &&\n shouldShowFabricWidget(this.#snapshot, config.widget);\n if (shouldShow) {\n if (this.#widgetMounted) return;\n this.#widgetMounted = true;\n context.ui.setWidget(\n WIDGET_ID,\n (tui, theme) => {\n this.#widgetTui = tui;\n this.#widget = new FabricWidget(theme, () => this.#snapshot, config.maxRows);\n return this.#widget;\n },\n { placement: \"aboveEditor\" },\n );\n return;\n }\n if (!this.#widgetMounted) return;\n context.ui.setWidget(WIDGET_ID, undefined);\n this.#widgetMounted = false;\n this.#widgetTui = undefined;\n this.#widget = undefined;\n }\n}\n", "import type { ExtensionContext } from \"@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\nexport const createDashboardSnapshot = (\n state: FabricState,\n events: MeshEvent[],\n context?: ExtensionContext,\n activityRuns?: FabricActivityRun[],\n): FabricDashboardSnapshot => {\n const runs = activityRuns ?? state.activity.runs();\n const agentRecords =\n typeof state.agents.listForUi === \"function\"\n ? state.agents.listForUi()\n : state.agents.list();\n const agentLinks: Array<{ runId: string; call: FabricActivityRun[\"calls\"][number] }> = [];\n for (const run of runs) {\n for (const call of run.calls) {\n if (call.entityId) agentLinks.push({ runId: run.id, call });\n }\n }\n agentLinks.sort((left, right) => {\n const leftLaunch = left.call.ref === \"agents.spawn\" || left.call.ref === \"agents.run\";\n const rightLaunch = right.call.ref === \"agents.spawn\" || right.call.ref === \"agents.run\";\n if (leftLaunch !== rightLaunch) return leftLaunch ? -1 : 1;\n return left.call.startedAt - right.call.startedAt;\n });\n const agentFromRecord = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): FabricUiAgent => {\n const linked = parentId\n ? undefined\n : agentLinks.find(\n ({ call }) =>\n call.entityId &&\n (record.id.startsWith(call.entityId) || call.entityId.startsWith(record.id)),\n );\n const base: FabricUiAgent = {\n id: record.id,\n name: record.name,\n status: record.status,\n runner: record.runner,\n transport: record.transport,\n cwd: record.cwd,\n ...(!isRunRecord(record) && linked ? { startedAt: linked.call.startedAt } : {}),\n ...(record.model ? { model: record.model } : {}),\n ...(record.thinking ? { thinking: record.thinking } : {}),\n ...(record.attachCommand ? { attachCommand: record.attachCommand } : {}),\n ...(isRunRecord(record) && record.logFile ? { logFile: record.logFile } : {}),\n ...(record.branch ? { branch: record.branch } : {}),\n ...(record.worktree ? { worktree: record.worktree } : {}),\n ...(record.actorId ? { actorId: record.actorId } : {}),\n ...(record.actorName ? { actorName: record.actorName } : {}),\n ...(parentId ? { parentId } : {}),\n ...(nestingDepth > 0 ? { nestingDepth } : {}),\n ...(linked ? { runId: linked.runId } : parent?.runId ? { runId: parent.runId } : {}),\n ...(linked?.call.phaseId\n ? { phaseId: linked.call.phaseId }\n : parent?.phaseId\n ? { phaseId: parent.phaseId }\n : {}),\n };\n if (!isRunRecord(record)) return base;\n return {\n ...base,\n task: record.task,\n startedAt: record.startedAt,\n updatedAt: record.updatedAt,\n ...(record.finishedAt !== undefined ? { finishedAt: record.finishedAt } : {}),\n ...(record.currentTool ? { currentTool: record.currentTool } : {}),\n turns: record.turns,\n toolCalls: record.toolCalls,\n usage: { ...record.usage },\n ...(record.text ? { text: record.text } : {}),\n ...(record.value !== undefined ? { value: structuredClone(record.value) } : {}),\n ...(record.error ? { error: record.error } : {}),\n };\n };\n const allAgents: FabricUiAgent[] = [];\n const appendAgent = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): void => {\n const agent = agentFromRecord(record, nestingDepth, parentId, parent);\n allAgents.push(agent);\n if (!isRunRecord(record)) return;\n for (const nested of record.nestedAgents ?? []) {\n appendAgent(nested, nestingDepth + 1, record.id, agent);\n }\n };\n for (const record of agentRecords) appendAgent(record, 0);\n\n const participants =\n typeof state.participantInfos === \"function\"\n ? state.participantInfos({ scope: \"project\" })\n : [];\n const participantById = new Map(participants.map((participant) => [participant.id, participant]));\n const actors = state.actors\n .list()\n .map((actor) => {\n const participant = participantById.get(actor.id);\n const worker = allAgents\n .filter((agent) => agent.actorId === actor.id)\n .sort((left, right) => {\n const active =\n Number(activeStatuses.has(right.status)) -\n Number(activeStatuses.has(left.status));\n const recency =\n (numberFrom(right.updatedAt) ?? numberFrom(right.startedAt) ?? 0) -\n (numberFrom(left.updatedAt) ?? numberFrom(left.startedAt) ?? 0);\n return active || recency;\n })[0];\n return {\n ...actor,\n instructions: state.actors.instructions(actor.id),\n recentMessages: state.actors.messages(actor.id, 12),\n ...(participant\n ? { ownerHostId: participant.ownerHostId, local: participant.local }\n : {}),\n ...(worker ? { worker } : {}),\n };\n });\n const localAgents = allAgents\n .filter((agent) => !agent.actorId)\n .map((agent) => {\n const participant = participantById.get(agent.id);\n return participant\n ? {\n ...agent,\n ...(agent.parentId ? {} : participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }\n : agent;\n });\n const localAgentIds = new Set(localAgents.map((agent) => agent.id));\n const remoteAgents: FabricUiAgent[] = participants\n .filter((participant) => participant.kind === \"agent\" && !localAgentIds.has(participant.id))\n .map((participant) => ({\n id: participant.id,\n name: participant.name,\n status: participant.status,\n runner: participant.runner,\n transport: participant.transport,\n cwd: participant.cwd ?? \"\",\n ...(participant.model ? { model: participant.model } : {}),\n ...(participant.thinking ? { thinking: participant.thinking } : {}),\n ...(participant.currentTool ? { currentTool: participant.currentTool } : {}),\n startedAt: participant.startedAt,\n updatedAt: participant.updatedAt,\n ...(participant.finishedAt !== undefined ? { finishedAt: participant.finishedAt } : {}),\n ...(participant.turns !== undefined ? { turns: participant.turns } : {}),\n ...(participant.toolCalls !== undefined ? { toolCalls: participant.toolCalls } : {}),\n ...(participant.usage ? { usage: { ...participant.usage } } : {}),\n ...(participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }));\n const agents = [...localAgents, ...remoteAgents];\n const visibleAgents = boundedUiAgents(localAgents, remoteAgents);\n const activeRunIds = new Set(\n agents\n .filter((agent) => agent.runId && activeStatuses.has(agent.status))\n .map((agent) => agent.runId as string),\n );\n const orderedRuns = runs\n .map((run, index) => ({ run, index }))\n .sort((left, right) => {\n const leftActive = activeRunIds.has(left.run.id) ? 1 : 0;\n const rightActive = activeRunIds.has(right.run.id) ? 1 : 0;\n return rightActive - leftActive || left.index - right.index;\n })\n .map(({ run }) => run);\n\n const meshEntries = state.config.mesh.enabled ? state.mesh.list(\"\", 200) : [];\n const stateEntries = meshEntries\n .filter(\n (entry) =>\n !entry.key.startsWith(\"actors/\") &&\n !entry.key.startsWith(\"sessions/\") &&\n !entry.key.startsWith(\"topology/\"),\n )\n .map(stateEntry)\n .sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n })\n .slice(0, 120);\n\n return {\n now: Date.now(),\n runs: orderedRuns,\n main: state.mainAgentInfo(context),\n peers: typeof state.peerInfos === \"function\" ? state.peerInfos() : [],\n participants,\n widgetDismissedAt: state.widgetDismissedAt,\n globalActors: state.globalActors.list(),\n agents: visibleAgents,\n componentGraph: typeof state.componentGraph === \"function\"\n ? state.componentGraph()\n : { components: [], edges: [], cycles: [] },\n actors: actors.sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n }),\n state: stateEntries,\n events: events.map((event) => structuredClone(event)),\n };\n};\n", "import type { Component } from \"@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 type {\n FabricActivityRun,\n FabricActivityStatus,\n} from \"../activity/types.js\";\nimport { formatCost, formatDuration, formatTokens, safeText } from \"./format.js\";\nimport {\n isActiveStatus,\n orderAgentsByCreation,\n type FabricDashboardSnapshot,\n type FabricUiAgent,\n} from \"./types.js\";\n\nconst statusGlyph = (status: string): string => {\n if (status === \"completed\" || status === \"done\") return \"\u2713\";\n if (status === \"failed\" || status === \"timed_out\") return \"\u2717\";\n if (status === \"blocked\") return \"!\";\n if (status === \"stopped\" || status === \"cancelled\") return \"\u25A0\";\n if (status === \"queued\" || status === \"pending\" || status === \"ready\") return \"\u25CB\";\n if (status === \"idle\" || status === \"state\") return \"\u00B7\";\n return spinnerFrame();\n};\n\nconst colorStatus = (theme: Theme, status: string, value: string): string => {\n if (status === \"completed\" || status === \"done\") return theme.fg(\"success\", value);\n if (status === \"failed\" || status === \"timed_out\") return theme.fg(\"error\", value);\n if (status === \"blocked\") return theme.fg(\"warning\", value);\n if (status === \"running\" || status === \"in_progress\") return theme.fg(\"accent\", value);\n return theme.fg(\"dim\", value);\n};\n\nconst phaseProgress = (\n run: FabricActivityRun,\n phaseId: string,\n): { completed: number; total: number } => {\n const phase = run.phases.find((candidate) => candidate.id === phaseId);\n const statuses: FabricActivityStatus[] = [\n ...run.calls.filter((call) => call.phaseId === phaseId).map((call) => call.status),\n ...run.items.filter((item) => item.phaseId === phaseId).map((item) => item.status),\n ];\n const completed = statuses.filter((status) => status === \"completed\").length;\n return { completed, total: Math.max(phase?.total ?? 0, statuses.length) };\n};\n\nconst totalTokens = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce(\n (sum, agent) => sum + (agent.usage ? agent.usage.input + agent.usage.output : 0),\n 0,\n );\n\nconst totalCost = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce((sum, agent) => sum + (agent.usage?.cost ?? 0), 0);\n\nconst agentLines = (\n theme: Theme,\n agent: FabricUiAgent,\n now: number,\n): string[] => {\n const status = colorStatus(theme, agent.status, statusGlyph(agent.status));\n const activity =\n agent.currentTool ??\n (agent.error\n ? `error: ${truncateToWidth(safeText(agent.error), 48)}`\n : agent.text && !isActiveStatus(agent.status)\n ? `result: ${truncateToWidth(safeText(agent.text), 48)}`\n : agent.status === \"running\"\n ? \"thinking\"\n : agent.status);\n const metrics = [\n agent.toolCalls !== undefined ? `${agent.toolCalls} calls` : undefined,\n agent.usage ? `${formatTokens(agent.usage.input + agent.usage.output)} tok` : undefined,\n agent.startedAt\n ? formatDuration((agent.finishedAt ?? now) - agent.startedAt)\n : undefined,\n ].filter((value): value is string => Boolean(value));\n const indent = \" \".repeat(1 + Math.max(0, agent.nestingDepth ?? 0));\n return [\n `${indent}${status} ${theme.fg(\"muted\", safeText(agent.name))} ${theme.fg(\"muted\", safeText(activity))}${\n metrics.length > 0 ? theme.fg(\"dim\", ` \u00B7 ${metrics.join(\" \u00B7 \")}`) : \"\"\n }`,\n ];\n};\n\nexport const shouldShowFabricWidget = (\n snapshot: FabricDashboardSnapshot,\n mode: FabricUiWidgetMode,\n): boolean => {\n if (mode === \"hidden\") return false;\n if (mode === \"always\") return true;\n if (snapshot.agents.some((agent) => isActiveStatus(agent.status))) return true;\n if (snapshot.actors.some((actor) => actor.status !== \"stopped\")) return true;\n const run = snapshot.runs[0];\n if (!run) return false;\n if (run.status === \"running\") return true;\n const finishedAt = run.finishedAt ?? run.updatedAt;\n return finishedAt > (snapshot.widgetDismissedAt ?? 0);\n};\n\nexport class FabricWidget implements Component {\n constructor(\n readonly theme: Theme,\n readonly snapshot: () => FabricDashboardSnapshot,\n readonly maxRows: number,\n ) {}\n\n #lastWidth: number | undefined;\n #lastSnapshot: FabricDashboardSnapshot | undefined;\n #lastLines: string[] | undefined;\n #leaseKey: string | undefined;\n #leasedRows = 0;\n #pending:\n | { width: number; snapshot: FabricDashboardSnapshot; lines: string[] }\n | undefined;\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const snapshot = this.snapshot();\n const lines =\n this.#pending?.width === width && this.#pending.snapshot === snapshot\n ? this.#pending.lines\n : this.#lastWidth === width &&\n this.#lastSnapshot === snapshot &&\n this.#lastLines\n ? this.#lastLines\n : this.#renderLines(snapshot, width);\n this.#pending = undefined;\n this.#lastWidth = width;\n this.#lastSnapshot = snapshot;\n this.#lastLines = lines;\n return lines;\n }\n\n hasChanged(): boolean {\n if (this.#lastWidth === undefined || this.#lastLines === undefined) return true;\n const snapshot = this.snapshot();\n const lines = this.#renderLines(snapshot, this.#lastWidth);\n this.#pending = { width: this.#lastWidth, snapshot, lines };\n return (\n lines.length !== this.#lastLines.length ||\n lines.some((line, index) => line !== this.#lastLines?.[index])\n );\n }\n\n invalidate(): void {\n this.#pending = undefined;\n this.#lastWidth = undefined;\n this.#lastSnapshot = undefined;\n this.#lastLines = undefined;\n }\n\n #renderLines(snapshot: FabricDashboardSnapshot, width: number): string[] {\n const { lines: content, leaseKey } = this.#buildContent(snapshot);\n return this.#leaseContent(this.#boundContent(content, width), leaseKey);\n }\n\n #buildContent(snapshot: FabricDashboardSnapshot): { lines: string[]; leaseKey: string } {\n const candidateRun = snapshot.runs[0];\n const candidateFinishedAt = candidateRun?.finishedAt ?? candidateRun?.updatedAt ?? 0;\n const run =\n candidateRun &&\n (candidateRun.status === \"running\" ||\n candidateFinishedAt > (snapshot.widgetDismissedAt ?? 0))\n ? candidateRun\n : undefined;\n const orderedAgents = orderAgentsByCreation(snapshot.agents);\n const activeAgents = orderedAgents.filter((agent) => isActiveStatus(agent.status));\n const activeAgentIds = new Set(activeAgents.map((agent) => agent.id));\n const terminalAgents = run\n ? orderedAgents.filter(\n (agent) =>\n agent.runId === run.id &&\n !activeAgentIds.has(agent.id) &&\n !isActiveStatus(agent.status),\n )\n : [];\n const visibleActors = snapshot.actors.filter((actor) => actor.status !== \"stopped\");\n const activeActorWorkers = visibleActors\n .filter((actor) => actor.worker && isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const terminalActorWorkers = visibleActors\n .filter((actor) => actor.worker && !isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const nestedCalls =\n run?.calls.filter((call) => call.kind !== \"agent\" && call.kind !== \"actor\") ?? [];\n const title = run?.name ?? \"Fabric session\";\n const headerStatus =\n run?.status ??\n (activeAgents.length > 0 || activeActorWorkers.length > 0 ? \"running\" : \"idle\");\n const parts: string[] = [];\n\n const callTotal = nestedCalls.length;\n if (callTotal > 1) {\n const callDone = nestedCalls.filter(\n (call) => call.status === \"completed\" || call.status === \"failed\",\n ).length;\n parts.push(`${callDone}/${callTotal} calls`);\n }\n if (run?.currentPhaseId) {\n const phaseIndex = run.phases.findIndex((phase) => phase.id === run.currentPhaseId);\n const phase = run.phases[phaseIndex];\n if (phase) {\n const progress = phaseProgress(run, phase.id);\n parts.push(\n `${phaseIndex + 1}/${run.phases.length} ${safeText(phase.name)}${\n progress.total > 0 ? ` ${progress.completed}/${progress.total}` : \"\"\n }`,\n );\n }\n }\n if (activeAgents.length > 0) parts.push(`${activeAgents.length} running`);\n if (visibleActors.length > 0) parts.push(`${visibleActors.length} actor${visibleActors.length === 1 ? \"\" : \"s\"}`);\n const tokens = totalTokens(snapshot, run);\n if (tokens > 0) parts.push(`${formatTokens(tokens)} tok`);\n const cost = totalCost(snapshot, run);\n if (cost > 0) parts.push(formatCost(cost));\n if (run) parts.push(formatDuration((run.finishedAt ?? snapshot.now) - run.startedAt));\n\n const glyph = colorStatus(this.theme, headerStatus, statusGlyph(headerStatus));\n const header = `${glyph} ${this.theme.fg(\"accent\", \"Fabric\")} ${this.theme.fg(\n \"muted\",\n safeText(title),\n )}${parts.length > 0 ? this.theme.fg(\"dim\", ` \u00B7 ${parts.join(\" \u00B7 \")}`) : \"\"}`;\n const lines = [header];\n\n lines.push(\n ...activeAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n ...activeActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n );\n const ambientOwners = [\n ...activeAgents.map((agent) => `agent:${agent.id}`),\n ...visibleActors.map(\n (actor) => `actor:${actor.id}:${actor.worker?.id ?? actor.lastRunId ?? \"idle\"}`,\n ),\n ];\n return {\n lines,\n leaseKey: run?.id ?? (ambientOwners.length > 0 ? `ambient:${ambientOwners.join(\",\")}` : \"ambient\"),\n };\n }\n\n #leaseContent(lines: string[], leaseKey: string): string[] {\n if (this.#leaseKey !== leaseKey) {\n this.#leaseKey = leaseKey;\n this.#leasedRows = lines.length;\n } else {\n this.#leasedRows = Math.max(this.#leasedRows, lines.length);\n }\n if (lines.length >= this.#leasedRows) return lines;\n return [\n ...lines,\n ...Array.from({ length: this.#leasedRows - lines.length }, () => \"\"),\n ];\n }\n\n #boundContent(content: string[], width: number): string[] {\n const bounded = content.slice(0, Math.max(1, this.maxRows));\n if (content.length > bounded.length && bounded.length > 0) {\n const marker = this.theme.fg(\"dim\", `+${content.length - bounded.length}`);\n const available = Math.max(0, width - visibleWidth(marker) - 1);\n const last = truncateToWidth(bounded[bounded.length - 1] ?? \"\", available, \"\");\n bounded[bounded.length - 1] = `${last} ${marker}`;\n }\n return bounded.map((line) => truncateToWidth(line, width));\n }\n}\n", "/** 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 { Usage } from \"@earendil-works/pi-ai\";\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 {\n filterPrewalkContinuationMessages,\n settleInPlacePrewalk,\n withTrajectoryRearmDirective,\n} from \"./prewalk/handoff.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport { autoArmFabricPrewalk } from \"./prewalk/arm.js\";\nimport {\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 {\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 { 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 { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { configureHighlighting } from \"./ui/highlight.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { truncateMiddle } from \"./util.js\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Absolute path to the Fabric skills bundled with this extension. Resolved\n// relative to the extension entry so it works both in development (src/) and\n// in an installed package (dist/). Contributed via resources_discover so child\n// Pi processes that load Fabric with -e (agents and actors) discover the\n// same fabric-exec / fabric-advisor / fabric-council skill references as the\n// main agent, which gets them through the package manifest.\nconst FABRIC_EXTENSION_ENTRY_PATH = path.resolve(fileURLToPath(import.meta.url));\nconst FABRIC_ENTRY_DIR = path.dirname(FABRIC_EXTENSION_ENTRY_PATH);\nconst FABRIC_RUNTIME_PATHS = {\n extension: FABRIC_EXTENSION_ENTRY_PATH,\n worker: path.join(FABRIC_ENTRY_DIR, \"worker.js\"),\n residentHost: path.join(FABRIC_ENTRY_DIR, \"residency\", \"launcher.js\"),\n skills: path.resolve(FABRIC_ENTRY_DIR, \"..\", \"skills\"),\n};\nconst FABRIC_SKILLS_DIR = FABRIC_RUNTIME_PATHS.skills;\n\nconst componentRegistrationFrom = (\n value: unknown,\n): FabricComponentRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricComponentRegistration>;\n const component = registration.component;\n if (\n registration.version !== 1 ||\n typeof component !== \"object\" ||\n component === null ||\n typeof component.name !== \"string\" ||\n typeof component.activate !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricComponentRegistration;\n};\n\nconst registrationFrom = (value: unknown): FabricProviderRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricProviderRegistration>;\n const provider = registration.provider;\n if (\n registration.version !== 1 ||\n typeof provider !== \"object\" ||\n provider === null ||\n typeof provider.name !== \"string\" ||\n typeof provider.description !== \"string\" ||\n typeof provider.list !== \"function\" ||\n typeof provider.describe !== \"function\" ||\n typeof provider.invoke !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricProviderRegistration;\n};\n\nconst SKILL_REFERENCE_CUSTOM_TYPE = \"pi-fabric-skill-reference\";\n\nexport default async function piFabric(pi: ExtensionAPI): Promise<void> {\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, { paths: FABRIC_RUNTIME_PATHS });\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 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 () => {\n if (existsSync(FABRIC_SKILLS_DIR)) return { skillPaths: [FABRIC_SKILLS_DIR] };\n return {};\n });\n\n const fabricTool = createFabricExecTool(\n state,\n codePreviewSettings,\n pendingHandoffs,\n decorateShell,\n toolDisplay,\n );\n const refreshCodePreviewSettings = (): void => {\n Object.assign(codePreviewSettings, state.config.codePreview);\n configureHighlighting(\n codePreviewSettings.shikiTheme,\n codePreviewSettings.syntaxHighlighting,\n );\n };\n const fabricToolLifecycle = new FabricToolLifecycle(\n () => ownsFabricToolSource(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 pi.registerTool(fabricTool);\n\n const applyFabricMode = (): void => {\n toolCapture.setPolicy(capturePolicy());\n pi.registerTool(fabricTool);\n toolOwnership.apply(\n fabricOwnsModelTools(),\n fabricOwnsModelTools() ? hiddenCapturedToolNames() : undefined,\n );\n capturedTools.refresh();\n };\n const suspendToolCapture = (): void => {\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 at once. Disabled when mesh/actors are off or ui.haltOnEscape is\n // false.\n let haltOnEscapeUnsubscribe: (() => void) | undefined;\n const uninstallHaltOnEscape = (): void => {\n haltOnEscapeUnsubscribe?.();\n haltOnEscapeUnsubscribe = undefined;\n };\n const installHaltOnEscape = (context: ExtensionContext): void => {\n uninstallHaltOnEscape();\n if (context.mode !== \"tui\") return;\n if (!state.config.ui.haltOnEscape || !state.config.mesh.enabled) return;\n if (typeof context.ui.onTerminalInput !== \"function\") return;\n const ESC = \"\\x1b\";\n const DEBOUNCE_MS = 60;\n let escTimer: NodeJS.Timeout | undefined;\n const trigger = (): void => {\n if (!state.initialized || !state.config.mesh.enabled) return;\n let halted = 0;\n try {\n // A lone Esc that lands while Fabric is already in a stop-the-world\n // halt is a no-op: the gate is armed and resumes on the next message,\n // so don't repeat the notice \u2014 a double-Esc to open /tree would\n // otherwise pop it on every press. Only the first Esc of a halt\n // session notifies.\n if (state.actors.halted) return;\n halted = state.actors.haltAll().halted;\n } catch {\n return;\n }\n // Nothing had work to abort: the gate armed silently, so skip the\n // notice \u2014 a lone Esc with no active actors should not pop a\n // \"halted 0 actors\" line.\n if (halted === 0) return;\n context.ui.notify(\n `Fabric: halted ${halted} actor${halted === 1 ? \"\" : \"s\"} (Esc) \u00B7 resumes on next message`,\n \"warning\",\n );\n };\n haltOnEscapeUnsubscribe = context.ui.onTerminalInput((data: string) => {\n if (data === ESC) {\n if (escTimer) clearTimeout(escTimer);\n escTimer = setTimeout(() => {\n escTimer = undefined;\n trigger();\n }, DEBOUNCE_MS);\n escTimer.unref?.();\n return undefined;\n }\n // Any other input cancels a pending lone-Esc debounce \u2014 the Esc byte was\n // most likely the start of an escape sequence that arrived split.\n if (escTimer) {\n clearTimeout(escTimer);\n escTimer = undefined;\n }\n return undefined;\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 fabricUi.stop();\n };\n state.setActivationHook(async (context) => {\n refreshCodePreviewSettings();\n Object.assign(\n fabricTool,\n createFabricExecTool(state, codePreviewSettings, pendingHandoffs, decorateShell, toolDisplay),\n );\n await autoArmPrewalk(context);\n applyFabricMode();\n fabricUi.start(context);\n installHaltOnEscape(context);\n }, cleanupActivationSideEffects);\n\n pi.on(\"session_start\", async (_event, context) => {\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n proxyContract.reset();\n refreshProxyLedger(context);\n if (!compatibilityWarningShown) {\n compatibilityWarningShown = true;\n const warning = 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 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 });\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 return {\n message: {\n ...event.message,\n content: [{ type: \"text\", text }],\n details,\n isError: !boundarySucceeded,\n },\n };\n });\n\n pi.on(\"tool_execution_end\", async (event, context) => {\n if (!state.initialized) return;\n state.noteMainActivity(context);\n if (event.isError) {\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 continuation = filterPrewalkContinuationMessages(\n event.messages,\n (continuationId) => state.initialized &&\n state.prewalk.acceptContinuation(sessionId, continuationId),\n );\n let changed = continuation.changed;\n const messages = continuation.messages.map((message) => {\n if (message.role !== \"user\") return message;\n if (typeof message.content === \"string\") {\n const content = expandSkillDirMarkersInSkillBlock(message.content);\n if (content === message.content) return message;\n changed = true;\n return { ...message, content };\n }\n let messageChanged = false;\n const content = message.content.map((part) => {\n if (part.type !== \"text\") return part;\n const text = expandSkillDirMarkersInSkillBlock(part.text);\n if (text === part.text) return part;\n changed = true;\n messageChanged = true;\n return { ...part, text };\n });\n return messageChanged ? { ...message, content } : message;\n });\n return changed ? { messages } : undefined;\n });\n\n pi.on(\"before_agent_start\", async (event, context) => {\n const fullCodeMode = state.cwd\n ? state.config.fullCodeMode\n : DEFAULT_FABRIC_CONFIG.fullCodeMode;\n const schemaMode = state.cwd\n ? state.config.schema.mode\n : DEFAULT_FABRIC_CONFIG.schema.mode;\n const effectiveFullCodeMode = fullCodeMode || schemaMode === \"enforce\";\n if (!pi.getActiveTools().includes(\"fabric_exec\")) return;\n const skills = event.systemPromptOptions.skills ?? [];\n const captureSnapshot = state.cwd ? capturePolicy() : undefined;\n // Pi omits its entire skill catalog when the active tool set lacks a tool\n // named read. Restore that catalog in full code mode with only the loader\n // instruction adapted to Fabric's nested pi.read path.\n const systemPrompt = effectiveFullCodeMode\n ? restoreSkillsForFullCodePrompt(event.systemPrompt, skills)\n : event.systemPrompt;\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),\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),\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 () => {\n unsubscribeComponentRegistration();\n unsubscribeProviderRegistration();\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n try {\n await state.shutdown();\n } finally {\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n toolOwnership.release();\n fabricToolLifecycle.clear();\n toolCapture.dispose();\n }\n });\n\n // Turn-scoped invariant: even if another extension rewrote the active tool\n // set (e.g. a permission system filtering its allowlist at before_agent_start,\n // or a refresh that ran before Fabric's policy was active), captured tools\n // must not leak into the model's next turn.\n 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 \"./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\";\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};\n\ntype BorderState = TimingState & {\n codePreviewBorderCallComponent?: Component;\n codePreviewBorderResultComponent?: Component;\n codePreviewBorderShell?: BorderedToolCall;\n codePreviewBorderTheme?: Theme;\n codePreviewBorderLastCallExecutionStarted?: boolean;\n codePreviewBorderLastCallPartial?: boolean;\n};\n\nconst timingState = (context: { state?: unknown } | undefined): TimingState | undefined =>\n context?.state as TimingState | undefined;\n\nconst isTimingOnlyRender = (state: TimingState | undefined): boolean =>\n state?.codePreviewTimingOnlyRenderToken !== undefined;\n\nconst unwrapTimingComponent = (component: Component | undefined): Component | undefined =>\n component instanceof TimingPreservedComponent ? component.component : component;\n\nconst clearTimingInterval = (state: TimingState): void => {\n if (!state.codePreviewTimingInterval) return;\n clearInterval(state.codePreviewTimingInterval);\n delete state.codePreviewTimingInterval;\n delete state.codePreviewTimingOnlyRenderToken;\n};\n\nconst ensureTimingInterval = (state: TimingState, invalidate: () => void): void => {\n state.codePreviewTimingInterval ??= setInterval(() => {\n const token = (state.codePreviewTimingOnlyRenderToken ?? 0) + 1;\n state.codePreviewTimingOnlyRenderToken = token;\n try {\n invalidate();\n } finally {\n queueMicrotask(() => {\n if (state.codePreviewTimingOnlyRenderToken === token) {\n delete state.codePreviewTimingOnlyRenderToken;\n }\n });\n }\n }, 100);\n};\n\nconst formatDuration = (milliseconds: number): string => {\n const ms = Math.max(0, Math.round(milliseconds));\n if (ms < 1_000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1_000).toFixed(1)}s`;\n const seconds = Math.round(ms / 1_000);\n const hours = Math.floor(seconds / 3_600);\n const minutes = Math.floor((seconds % 3_600) / 60);\n if (hours > 0) return `${hours}h ${minutes}m`;\n return `${minutes}m ${seconds % 60}s`;\n};\n\nconst updateTiming = (\n context: PreviewRenderContext,\n enabled: boolean,\n options: { animate?: boolean; formatLabel?: boolean } = {},\n): string | undefined => {\n const state = timingState(context);\n if (!state) return undefined;\n if (!enabled) {\n clearTimingInterval(state);\n return undefined;\n }\n if (\n context.executionStarted &&\n state.codePreviewTimingStartedAt === undefined &&\n context.isPartial !== false\n ) {\n state.codePreviewTimingStartedAt = Date.now();\n delete state.codePreviewTimingEndedAt;\n }\n const startedAt = state.codePreviewTimingStartedAt;\n if (startedAt === undefined) return undefined;\n if (context.isPartial && options.animate !== false) {\n ensureTimingInterval(state, context.invalidate);\n } else if (!context.isPartial) {\n state.codePreviewTimingEndedAt ??= Date.now();\n clearTimingInterval(state);\n }\n if (options.formatLabel === false) return undefined;\n const running = context.isPartial;\n const endedAt = running ? Date.now() : (state.codePreviewTimingEndedAt ?? Date.now());\n return `${running ? \"Elapsed\" : \"Took\"} ${formatDuration(endedAt - startedAt)}`;\n};\n\nclass TimingPreservedComponent implements Component {\n constructor(readonly component: Component, private readonly state: TimingState) {}\n render(width: number): 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 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 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 hostPackageRoot = (): string | undefined => {\n const cliPath = process.argv[1];\n if (!cliPath) return undefined;\n let directory: string;\n try {\n directory = path.dirname(realpathSync(cliPath));\n } catch {\n return undefined;\n }\n while (directory !== path.dirname(directory)) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { name?: unknown };\n if (manifest.name === \"@earendil-works/pi-coding-agent\") return directory;\n } catch { /* unreadable or invalid manifest; keep searching */ }\n }\n directory = path.dirname(directory);\n }\n return undefined;\n};\n\nconst extensionRunnerConstructors = async (): Promise<ExtensionRunnerConstructor[]> => {\n const constructors = new Set<ExtensionRunnerConstructor>();\n const packageRoots = new Set(\n [process.env.PI_PACKAGE_DIR, hostPackageRoot()].filter(\n (root): root is string => typeof root === \"string\" && Boolean(root),\n ),\n );\n for (const packageRoot of packageRoots) {\n try {\n const hostEntry = path.join(packageRoot, \"dist\", \"index.js\");\n const hostModule = (await import(pathToFileURL(hostEntry).href)) as {\n ExtensionRunner?: ExtensionRunnerConstructor;\n };\n if (hostModule.ExtensionRunner) constructors.add(hostModule.ExtensionRunner);\n } catch { /* host entry not importable; skip */ }\n for (const Runner of await bundleExtensionRunnerConstructors(\n path.join(packageRoot, \"dist\", \"bundle\"),\n )) {\n constructors.add(Runner);\n }\n }\n if (constructors.size === 0) {\n // The host does not advertise its package directory (tests, embeds,\n // future layouts): fall back to resolving it in this module realm.\n try {\n const hostModule = (await import(\"@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 { truncateMiddle } from \"../util.js\";\nimport type { FabricUiController } from \"../ui/controller.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 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 pi.registerCommand(\"fabric\", {\n description: \"Open Fabric, arm prewalk, reload, or manage agents and actors\",\n getArgumentCompletions: (argumentPrefix: string): AutocompleteItem[] | null => {\n const subcommands = [\n \"status\",\n \"dashboard\",\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 ];\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 === \"schema\") {\n const modes = [\"off\", \"audit\", \"enforce\"].filter((mode) => mode.startsWith(idPrefix));\n return modes.length > 0 ? modes.map((value) => ({ value, label: value })) : null;\n }\n if (subcommand === \"import\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const template of state.globalActors.list()) {\n items.push({\n value: template.name,\n label: template.name,\n description: `global ${template.runner} template \u00B7 ${template.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* global registry not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n if (!idCommands.has(subcommand)) {\n if (subcommand === \"export\") {\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n }\n return null;\n }\n const items: AutocompleteItem[] = [];\n try {\n for (const actor of state.actors.list()) {\n items.push({\n value: actor.name,\n label: actor.name,\n description: `${actor.status} ${actor.runner} actor \u00B7 ${actor.id.slice(0, 8)}`,\n });\n }\n } catch {\n /* actors not initialized */\n }\n try {\n for (const agent of state.agents.list()) {\n const short = agent.id.slice(0, 8);\n items.push({\n value: short,\n label: short,\n description: `${agent.status} ${agent.runner} agent \u00B7 ${agent.name}`,\n });\n }\n } catch {\n /* agents not initialized */\n }\n const filtered = items.filter((item) => item.value.startsWith(idPrefix));\n return filtered.length > 0 ? filtered : null;\n },\n async handler(argumentsText, context) {\n await state.ensure(context);\n const [command = \"dashboard\", ...argumentsList] = argumentsText\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (command === \"reload\") {\n fabricUi.stop();\n suspendToolCapture();\n try {\n await state.initialize(context);\n } catch (error) {\n fabricUi.stop();\n suspendToolCapture();\n throw error;\n }\n context.ui.notify(\"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 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 }\n context.ui.notify(\n `Fabric prewalk ${enabled ? \"enabled\" : \"disabled\"} (${saved.scope}: ${saved.path})`,\n \"info\",\n );\n } catch (error) {\n context.ui.notify(\n `Failed to update Fabric prewalk setting: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n return;\n }\n if (option === \"--off\" || option === \"--cancel\") {\n state.prewalk.cancel();\n state.prewalkDrift.drop(context.sessionManager.getSessionId());\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n context.ui.notify(\"Fabric prewalk cancelled\", \"info\");\n return;\n }\n if (option === \"--status\") {\n const status = state.prewalk.status();\n context.ui.notify(\n status.state === \"idle\"\n ? \"Fabric prewalk is idle\"\n : `Fabric prewalk ${status.state} (${status.mode}) \u2192 ${status.model}${status.task ? `\\nTask: ${status.task}` : \"\"}`,\n \"info\",\n );\n return;\n }\n const task = argumentsText.trim().slice(command.length).trim();\n await armPrewalk(state, context, pi, task);\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 !== \"status\") {\n context.ui.notify(\n \"Usage: /fabric [status|dashboard|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>]\",\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 {\n PREWALK_ARMED_MESSAGE_TYPE,\n hasPrewalkArmedPrompt,\n prewalkArmedPrompt,\n} from \"./handoff.js\";\n\n// The single arm path shared by `/fabric prewalk` and alwaysRearm session\n// auto-arm, so drift baseline, hidden armed advisory, and status chip never\n// drift apart between entry points.\nexport const armFabricPrewalkSession = async (\n state: FabricState,\n context: ExtensionContext,\n 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 });\n // Anchor the shell-write drift window at arm time so the first\n // bash-running boundary diffs against the pre-task tree state; only\n // snapshot when the fs fallback can actually claim.\n if (prewalk.detectShellWrites) {\n await state.prewalkDrift.captureBaseline(sessionId, context.cwd);\n }\n // Hidden advisory framing, queued for the next prompt (rules before the\n // task when the caller submits one). nextTurn never triggers a turn;\n // custom messages never fire `input`, so observeTask ignores it.\n const armedPrompt = prewalkArmedPrompt(prewalk.mode, input.model);\n if (!hasPrewalkArmedPrompt(context.sessionManager.getBranch(), armedPrompt)) {\n 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 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 // initialize() cancels any prior arm at session start; a non-idle status\n // means another path armed first \u2014 never clobber it.\n if (state.prewalk.status().state !== \"idle\") return undefined;\n if (!state.config.fullCodeMode || state.config.schema.mode === \"enforce\") {\n return \"Fabric prewalk auto-arm skipped: requires full code mode with Schema enforce mode disabled.\";\n }\n if (prewalk.mode === \"trajectory\" && !state.config.agents.enabled) {\n return \"Fabric prewalk auto-arm skipped: trajectory mode requires agents.enabled.\";\n }\n const model = prewalk.model?.trim();\n if (!model || !model.includes(\"/\")) {\n return \"Fabric prewalk auto-arm skipped: set prewalk.model (provider/model) in /fabric settings so sessions arm without the interactive picker.\";\n }\n await armFabricPrewalkSession(state, context, pi, { model });\n return undefined;\n};\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 { NESTED_TOOL_CALL_ID_PREFIX } from \"./action-registry.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 {\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 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 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 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 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 ...(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 { existsSync, readFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const fabricExecutionKernelGuidance = (fullCodeMode: boolean): string =>\n [\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): string =>\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'})`, `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 `bash` on an ordinary nonzero exit; pass `settle: true` to `pi.bash` to get `{ ok: false, exitCode, output, error }` instead. Timeout, cancellation, approval, and security failures still reject.\\n`tools` is discovery + generic calls only (`providers`/`catalog`/`list`/`search`/`describe`/`call`/`models`). Call known MCP tools as `mcp.<sanitized_server>.<sanitized_tool>(args)`, captured tools as `extensions.<tool>(args)`, and stable providers as `memory.*`, `state.*`, `schema.*`, or `compact.*`. Use `tools.call({ref,args})` for computed refs. `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, 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): string => {\n const section = formatSkillsForPrompt([...skills]).replace(\n PI_SKILL_LOAD_INSTRUCTION,\n FABRIC_SKILL_LOAD_INSTRUCTION,\n );\n if (!section) return systemPrompt;\n\n if (systemPrompt.includes(SKILL_SECTION_HEADING)) {\n return systemPrompt.replace(\n PI_SKILL_LOAD_INSTRUCTION,\n FABRIC_SKILL_LOAD_INSTRUCTION,\n );\n }\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 { 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(),\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 { 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 { 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 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 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> => decorateShell(\n defineTool({\n name: \"fabric_exec\",\n label: \"Fabric\",\n description:\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 \"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 \"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 \"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 multiline edits/writes, pass named payloads through top-level `payloads` and use `\u03C0.key`; 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 ],\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:\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`. 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 as \u03C0.key, useful for content that is awkward to quote inside code. Prefer an object of string values; a JSON-object string is parsed.\",\n }),\n ),\n resultFormat: Type.Optional(Type.Union(RESULT_FORMATS.map((value) => Type.Literal(value)))),\n tokenBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional token budget observed by workflow.agent() calls\",\n }),\n ),\n agentBudget: Type.Optional(\n Type.Number({\n minimum: 1,\n description: \"Optional agent-call cap, bounded by Fabric configuration\",\n }),\n ),\n timeoutMs: Type.Optional(\n Type.Number({\n minimum: 1,\n description:\n \"Optional whole-program deadline in ms for this invocation; raises (never lowers) the configured executor.timeoutMs, capped by executor.maxTimeoutMs\",\n }),\n ),\n display: Type.Optional(\n Type.Union([\n Type.Object(\n {\n name: Type.Optional(\n Type.String({\n description: \"Concise execution milestone used by the Fabric activity UI and deterministic compaction continuity\",\n }),\n ),\n description: Type.Optional(\n Type.String({\n description: \"Compact declared objective or acceptance criterion shown in the dashboard and richer compaction activity\",\n }),\n ),\n },\n ),\n Type.String({\n description:\n \"Objective shorthand normalized to { name } (a JSON-object string is parsed). Prefer the object form when available.\",\n }),\n ]),\n ),\n }),\n // 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) 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 toolDisplay?.observe(context.toolCallId, \"call\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n context.isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n if (rendererState.fabricWriteBindingsCode !== code) {\n rendererState.fabricWriteBindingsCode = code;\n rendererState.fabricWriteBindings = fabricWriteBindings(code);\n }\n // The write argument preview is a streaming affordance: it previews\n // pending writes while args are still arriving. 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 // Session-wide memo keyed by the program string: the same hint serves\n // the live card, the activity feed, and compaction intent.\n const title = display?.name?.trim() || fabricExecTitleHintCached(code);\n const header = renderBoundedLines(\n [\n theme.fg(\"toolTitle\", theme.bold(safeTerminalText(title || \"Fabric\"))),\n ...(display?.description\n ? [theme.fg(\"dim\", safeTerminalText(display.description))]\n : []),\n ],\n theme,\n codePreviewSettings.diffIntensity,\n );\n if (!writePreview) return header;\n const composite = new Container();\n composite.addChild(header);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n }\n\n const lines = safeTerminalText(code).split(\"\\n\");\n const runDisplay = normalizeRunDisplay(params.display);\n const displayName = runDisplay?.name ? safeTerminalText(runDisplay.name) : \"\";\n const title = `${theme.fg(\"toolTitle\", theme.bold(\"fabric\"))}${\n displayName ? ` ${theme.fg(\"accent\", displayName)}` : \"\"\n } ${theme.fg(\"dim\", `TypeScript \u00B7 ${countLabel(lines.length, \"line\")}`)}`;\n // Match the compact header: the declared objective sits between the\n // title and the code preview.\n const description = runDisplay?.description\n ? theme.fg(\"dim\", safeTerminalText(runDisplay.description))\n : \"\";\n const baseLimit = context.expanded ? lines.length : Math.min(lines.length, 8);\n const maxLimit = context.expanded\n ? lines.length\n : Math.min(lines.length, baseLimit + MAX_FABRIC_CODE_TRANSFER_LINES);\n const renderCodePreview = (limit: number, width: number): string[] => {\n const shown = lines.slice(0, limit);\n const lineNumberWidth = String(Math.max(1, shown.length)).length;\n const preview = shown\n .map(\n (line, index) =>\n `${theme.fg(\"dim\", String(index + 1).padStart(lineNumberWidth, \" \"))} ${theme.fg(\"muted\", line || \" \")}`,\n )\n .join(\"\\n\");\n const hidden = lines.length - shown.length;\n const hiddenHint =\n hidden > 0\n ? `\\n${theme.fg(\"dim\", `\u2026 ${countLabel(hidden, \"line\")} hidden \u00B7 `)}${expandHint(theme)}`\n : \"\";\n return new Text(\n `${title}${description ? `\\n${description}` : \"\"}${preview ? `\\n${preview}` : \"\"}${hiddenHint}`,\n 0,\n 0,\n ).render(width);\n };\n const codePreview = new HiddenRowBorrowingComponent(\n baseLimit,\n maxLimit,\n renderCodePreview,\n rowBalance,\n );\n if (!writePreview) return codePreview;\n const composite = new Container();\n composite.addChild(codePreview);\n composite.addChild(new Text(\"\\n\", 0, 0));\n composite.addChild(writePreview);\n return composite;\n },\n renderResult(result, { 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 toolDisplay?.observe(context.toolCallId, \"result\", context.invalidate);\n const spinner = updateSpinner(\n rendererState.fabricSpinner ??= {},\n isPartial,\n context.invalidate,\n );\n const rowBalance = rendererState.fabricResultRowBalance ??= {};\n const trackRows = (component: Component): Component =>\n observeResultRows(\n inheritComponentBackground(component),\n rowBalance,\n { expanded, isPartial },\n );\n if (isPartial) {\n rendererState.fabricCoreToolPreviews = captureFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n rendererState.fabricAgentPreviews = captureFabricAgentPreviews(\n audits,\n rendererState.fabricAgentPreviews,\n );\n const headlinePreviews = captureFabricCallHeadlinePreviews(audits);\n if (headlinePreviews.length > 0) {\n rendererState.fabricCallHeadlinePreviews = headlinePreviews;\n }\n const writePreviews = captureFabricWritePreviews(audits);\n if (writePreviews.length > 0) rendererState.fabricWritePreviews = writePreviews;\n } else {\n if (rendererState.fabricCoreToolPreviews) {\n audits = restoreFabricCoreToolPreviews(\n audits,\n rendererState.fabricCoreToolPreviews,\n );\n }\n if (rendererState.fabricAgentPreviews) {\n audits = restoreFabricAgentPreviews(audits, rendererState.fabricAgentPreviews);\n }\n if (rendererState.fabricCallHeadlinePreviews) {\n audits = restoreFabricCallHeadlinePreviews(\n audits,\n rendererState.fabricCallHeadlinePreviews,\n );\n }\n if (rendererState.fabricWritePreviews) {\n audits = restoreFabricWritePreviews(audits, rendererState.fabricWritePreviews);\n }\n }\n const phases = details.phases;\n const nl = \"\\n\";\n const allRowIndexes = (lines: string[], enabled: boolean): ReadonlySet<number> | undefined =>\n enabled ? new Set(lines.map((_line, index) => index)) : undefined;\n // Expanded (app.tools.expand / ctrl+o) promotes compact cards to the\n // full rendering; compact only governs the collapsed presentation.\n const compact = !expanded && toolDisplayMode(state) === \"compact\";\n const corePreviewContext = { cwd: context.cwd, settings: codePreviewSettings };\n const showAgentToolPreview = state.initialized\n ? state.config.ui.showAgentToolPreview\n : DEFAULT_FABRIC_CONFIG.ui.showAgentToolPreview;\n\n const renderBody = (\n audit: FabricRenderAudit,\n limit: number,\n ): { body: string; hidden: number } | null => {\n const core = renderCoreToolBody(audit, theme, {\n cwd: context.cwd,\n settings: codePreviewSettings,\n expanded,\n maxLines: limit,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (core) return { body: core.lines.join(nl), hidden: core.hidden };\n if (coreToolRendererEnabled(audit, codePreviewSettings)) return null;\n\n const body = nestedCallBody(audit);\n if (!body) return null;\n const bodyLines = safeTerminalText(body).split(nl);\n while (bodyLines.length > 0) {\n const last = bodyLines[bodyLines.length - 1];\n if (last === undefined || last.trim() === \"\") bodyLines.pop();\n else break;\n }\n if (bodyLines.length === 0) return null;\n const shown = bodyLines.slice(0, limit);\n return {\n body: shown.map((line) => theme.fg(\"toolOutput\", line || \" \")).join(nl),\n hidden: bodyLines.length - shown.length,\n };\n };\n\n if (isPartial) {\n const progress = details.progress;\n if (audits.length === 0) {\n const label = compact ? \"Running\u2026\" : progress ?? \"Running Fabric program\u2026\";\n return trackRows(\n new Text(theme.fg(\"warning\", `\u25C6 ${safeTerminalText(label)}`), 0, 0),\n );\n }\n if (audits.length === 1) {\n const audit = audits[0]!;\n const glyph =\n audit.success === undefined\n ? theme.fg(\"warning\", spinner)\n : audit.success === false\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n let text = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n const progressLine = singleCallProgressLine(progress, previewLines);\n if (audit.success === false && audit.error) {\n text += nl + ` ${theme.fg(\"error\", safeTerminalText(audit.error))}`;\n } else {\n const rendered = renderBody(\n audit,\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 10,\n );\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (progressLine) {\n text += nl + theme.fg(\"dim\", progressLine);\n }\n }\n if (audit.success !== false && previewLines[0]) {\n const firstBreak = text.indexOf(nl);\n if (firstBreak < 0) text += ` ${previewLines[0]}`;\n else text = `${text.slice(0, firstBreak)} ${previewLines[0]}${text.slice(firstBreak)}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n let preview: { auditIndex: number; body: string; hidden: number } | undefined;\n for (let index = audits.length - 1; index >= 0; index--) {\n const audit = audits[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, expanded ? 20 : 10);\n if (rendered) {\n preview = { auditIndex: index, ...rendered };\n break;\n }\n }\n return trackRows(\n renderFabricMulticallPartial(\n {\n audits,\n phases,\n progress,\n expanded,\n preview,\n core: corePreviewContext,\n showAgentToolPreview,\n spinner,\n ...(compact ? { activityLabel: \"Tools\" } : {}),\n },\n theme,\n context?.invalidate,\n ),\n );\n }\n\n const output = result.content\n .filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n .map((part) => part.text)\n .join(nl);\n const styleOutputLines = (lines: string[]): string[] => {\n if (!details.outputFormat || lines.length === 0) {\n return lines.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n }\n const highlightedStart = Math.min(\n lines.length,\n details.outputFormatStartLine ?? 0,\n );\n const highlightedCount = Math.min(\n lines.length - highlightedStart,\n details.outputFormatLines ?? lines.length,\n );\n const highlightedSource = lines.slice(\n highlightedStart,\n highlightedStart + highlightedCount,\n );\n const highlighted = highlightedSource.length > 0\n ? highlightCode(\n highlightedSource.join(nl),\n details.outputFormat,\n context?.invalidate,\n )\n : [];\n const styledPrefix = highlighted?.map((line) => line || \" \")\n ?? highlightedSource.map((line) => theme.fg(\"toolOutput\", line || \" \"));\n return [\n ...lines.slice(0, highlightedStart).map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ...styledPrefix,\n ...lines\n .slice(highlightedStart + highlightedCount)\n .map((line) => theme.fg(\"toolOutput\", line || \" \")),\n ];\n };\n const failed = details.success === false;\n\n if (audits.length === 0) {\n if (failed && details.error) {\n return trackRows(\n new Text(\n theme.fg(\"error\", `\u2717 ${safeTerminalText(details.error)}`),\n 0,\n 0,\n ),\n );\n }\n if (!output) {\n return trackRows(new Text(\n compact\n ? theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\")\n : theme.fg(\"dim\", \"\u2713 Fabric\"),\n 0,\n 0,\n ));\n }\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 12;\n const shown = lines.slice(0, limit);\n let text = styleOutputLines(shown).join(nl);\n if (compact) {\n text = theme.fg(failed ? \"error\" : \"success\", failed ? \"\u2717 Failed\" : \"\u2713 Evaluated\") + nl + text;\n }\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n return trackRows(\n renderBoundedLines(text.split(nl), theme, codePreviewSettings.diffIntensity),\n );\n }\n\n if (audits.length === 1) {\n const audit = audits[0]!;\n let text = compact\n ? `${compactResultHeader(theme, audits, failed)}${nl}${nestedCallTitle(\n audit,\n theme,\n context?.invalidate,\n corePreviewContext,\n )}`\n : nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext);\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n if (audit.success === false) {\n if (audit.error) {\n text += nl + theme.fg(\"error\", safeTerminalText(audit.error));\n }\n return trackRows(new Text(text, 0, 0));\n }\n if (previewLines[0]) {\n text += ` ${previewLines[0]}`;\n if (previewLines.length > 1) text += nl + previewLines.slice(1).join(nl);\n }\n const limit =\n expanded || coreToolRendererEnabled(audit, codePreviewSettings) ? 200 : 12;\n const rendered = previewLines.length > 0 ? null : renderBody(audit, limit);\n if (rendered) {\n text += nl + rendered.body;\n if (rendered.hidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n } else if (\n isCoreToolAudit(audit) &&\n !expanded &&\n !coreToolPreviewEnabled(audit, codePreviewSettings)\n ) {\n text += nl + arcItemStyled(theme, expandHint(theme));\n } else if (\n previewLines.length === 0 &&\n output &&\n !isCoreToolAudit(audit) &&\n (!compact || failed || expanded)\n ) {\n const lines = safeTerminalText(output).split(nl);\n const outLimit = expanded ? Math.min(lines.length, 200) : 12;\n const outShown = lines.slice(0, outLimit);\n text += nl + styleOutputLines(outShown).join(nl);\n if (lines.length > outShown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - outShown.length, \"line\")}`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n const textLines = text.split(nl);\n return trackRows(\n renderBoundedLines(\n textLines,\n theme,\n codePreviewSettings.diffIntensity,\n allRowIndexes(textLines, previewLines.length > 0),\n ),\n );\n }\n\n const failedCalls = audits.filter(\n (audit) => audit.success === false,\n ).length;\n const status = failed ? \"failed\" : \"complete\";\n const statusColor = failed ? \"error\" : \"success\";\n const metadata = [\n countLabel(audits.length, \"nested call\"),\n failedCalls > 0 ? `${failedCalls} failed` : undefined,\n phases.length > 0 ? countLabel(phases.length, \"phase\") : undefined,\n ].filter((value): value is string => Boolean(value));\n let text = compact\n ? compactResultHeader(theme, audits, failed)\n : theme.fg(\n statusColor,\n `${failed ? \"\u2717\" : \"\u2713\"} Fabric ${status}`,\n );\n if (!compact && metadata.length > 0) text += theme.fg(\"dim\", ` \u00B7 ${metadata.join(\" \u00B7 \")}`);\n if (phases.length > 0)\n text += nl + theme.fg(\"dim\", phases.map((phase) => `\u25C6 ${phase}`).join(\" \"));\n\n const callLimit = fabricMulticallCallLimit(expanded);\n const callsShown = audits.slice(0, callLimit);\n const callsHidden = audits.length - callsShown.length;\n let collapsedPreview:\n | { auditIndex: number; body: string; hidden: number }\n | undefined;\n if (!expanded) {\n for (let index = callsShown.length - 1; index >= 0; index--) {\n const audit = callsShown[index]!;\n if (\n (audit.tool !== \"write\" && audit.tool !== \"edit\") ||\n audit.success === false\n ) continue;\n const rendered = renderBody(audit, 10);\n if (rendered) {\n collapsedPreview = { auditIndex: index, ...rendered };\n break;\n }\n }\n }\n let firstNested = true;\n const textRows = text.split(nl);\n const agentWrapLineIndexes = new Set<number>();\n for (let index = 0; index < callsShown.length; index++) {\n const audit = callsShown[index]!;\n if (expanded && !firstNested) textRows.push(\"\");\n firstNested = false;\n const glyph =\n audit.success === false ? theme.fg(\"error\", \"\u2717\") : theme.fg(\"dim\", \"\u203A\");\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded,\n compact: !expanded,\n showTools: showAgentToolPreview,\n core: corePreviewContext,\n ...(context?.invalidate ? { invalidate: context.invalidate } : {}),\n });\n let callRow = `${glyph} ${nestedCallTitle(audit, theme, context?.invalidate, corePreviewContext)}`;\n if (previewLines[0] && audit.success !== false) {\n callRow += ` ${previewLines[0]}`;\n if (expanded) agentWrapLineIndexes.add(textRows.length);\n }\n textRows.push(callRow);\n if (audit.success === false && audit.error) {\n textRows.push(` ${theme.fg(\"error\", safeTerminalText(audit.error))}`);\n } else {\n if (previewLines.length > 1) {\n for (const line of previewLines.slice(1)) {\n agentWrapLineIndexes.add(textRows.length);\n textRows.push(line);\n }\n }\n const rendered = previewLines.length === 0 && expanded ? renderBody(audit, 40) : null;\n if (rendered) {\n textRows.push(...rendered.body.split(nl));\n if (rendered.hidden > 0) {\n textRows.push(theme.fg(\"dim\", `\u2026 ${countLabel(rendered.hidden, \"line\")}`));\n }\n } else if (previewLines.length === 0 && collapsedPreview?.auditIndex === index) {\n textRows.push(...collapsedPreview.body.split(nl).map((line) => ` ${line}`));\n if (collapsedPreview.hidden > 0) {\n textRows.push(theme.fg(\n \"dim\",\n ` \u2026 ${countLabel(collapsedPreview.hidden, \"line\")}`,\n ));\n }\n }\n }\n }\n text = textRows.join(nl);\n if (callsHidden > 0) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(callsHidden, \"nested call\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n const readHint = modelReadHint(audits, output, theme);\n if (readHint) text += nl + readHint;\n\n const showOutput = failed || expanded;\n if (showOutput && output) {\n const lines = safeTerminalText(output).split(nl);\n const limit = expanded ? Math.min(lines.length, 200) : 6;\n const shown = lines.slice(0, limit);\n if (shown.length > 0) {\n if (expanded) text += nl + theme.fg(\"dim\", \"\u21A9 return\");\n text += nl + styleOutputLines(shown).join(nl);\n if (lines.length > shown.length) {\n text += nl + theme.fg(\"dim\", `\u2026 ${countLabel(lines.length - shown.length, \"line\")} hidden`);\n if (!expanded) text += theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme);\n }\n }\n }\n return trackRows(\n renderBoundedLines(\n text.split(nl),\n theme,\n codePreviewSettings.diffIntensity,\n agentWrapLineIndexes,\n ),\n );\n },\n async execute(toolCallId, params, signal, onUpdate, context) {\n await state.ensure(context);\n // prepareArguments joins code arrays / remaps `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 = repairFabricGuestCode(joined);\n const runDisplay = normalizeRunDisplay(params.display);\n const strings = resolveFabricExecPayloads(params);\n const result = await state.execution.execute({\n code,\n ...(strings ? { strings } : {}),\n signal,\n parentToolCallId: toolCallId,\n context,\n ...(params.tokenBudget !== undefined ? { tokenBudget: params.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 pendingHandoff = await state.claimHandoff(\n result,\n context.sessionManager.getSessionId(),\n selectedResultFormat,\n toolCallId,\n );\n if (pendingHandoff) {\n pendingHandoffs.set(toolCallId, pendingHandoff);\n context.ui.setStatus(\n \"fabric-prewalk\",\n `waiting for fabric_exec boundary \u2192 ${String(pendingHandoff.args.model ?? \"executor\")}`,\n );\n }\n const fullFormattedValue = formatFabricValue(result.value, selectedResultFormat);\n const failureProgress = formatFailureProgress(result.trace);\n const fullSections = [...result.logs];\n if (fullFormattedValue.text) fullSections.push(fullFormattedValue.text);\n if (result.error) fullSections.push(`Runtime error: ${result.error}`);\n if (failureProgress) fullSections.push(failureProgress);\n const fullRawOutput = fullSections.join(\"\\n\\n\");\n const outputBudget = modelOutputBudget(\n state.config.executor.maxOutputChars,\n result.success,\n );\n const outputWillTruncate = fullRawOutput.length > outputBudget;\n const formattedValue = outputWillTruncate\n ? formatFabricValue(\n result.value,\n selectedResultFormat,\n outputBudget,\n )\n : fullFormattedValue;\n const sections = [...result.logs];\n const logPrefix = result.logs.join(\"\\n\\n\");\n if (formattedValue.text) sections.push(formattedValue.text);\n if (result.error) sections.push(`Runtime error: ${result.error}`);\n if (failureProgress) sections.push(failureProgress);\n const rawOutput = sections.join(\"\\n\\n\");\n const outputFormat =\n formattedValue.language &&\n formattedValue.text &&\n (result.logs.length === 0 || !outputWillTruncate)\n ? formattedValue.language\n : undefined;\n const outputFormatStartLine = result.logs.length > 0\n ? countNewlines(logPrefix) + 2\n : 0;\n // Evaluated lazily at each return so the main path persists audits after\n // their in-memory image payloads are stripped below.\n const 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 const terminate =\n pendingHandoff !== undefined ||\n (result.success &&\n typeof result.value === \"object\" &&\n result.value !== null &&\n \"terminate\" in result.value &&\n result.value.terminate === true);\n // A nested `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 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", "import type { FabricExecutionTraceV1 } from \"./audit/trace.js\";\n\nconst MAX_COMPLETED_CALLS = 8;\nconst MAX_PATH_CHARS = 100;\n\nconst compactPath = (value: string): string => {\n const singleLine = value.replaceAll(/\\s+/g, \" \").trim();\n if (singleLine.length <= MAX_PATH_CHARS) return singleLine;\n return `\u2026${singleLine.slice(-(MAX_PATH_CHARS - 1))}`;\n};\n\nexport const formatFailureProgress = (\n trace: FabricExecutionTraceV1,\n): string | undefined => {\n if (trace.outcome === \"succeeded\") return undefined;\n const completed = trace.operations.filter(\n (operation) => operation.outcome === \"succeeded\",\n );\n if (completed.length === 0) return undefined;\n const summaries = completed.slice(0, MAX_COMPLETED_CALLS).map((operation) => {\n const path = operation.args.path;\n return typeof path === \"string\"\n ? `${operation.ref}(${compactPath(path)})`\n : operation.ref;\n });\n const omitted = completed.length - summaries.length;\n return [\n `Completed before the outer failure (outputs not returned): ${summaries.join(\"; \")}${\n omitted > 0 ? `; +${omitted} more` : \"\"\n }.`,\n \"Successful calls may already have changed the workspace; inspect before repeating mutations.\",\n ].join(\"\\n\");\n};\n", "import { normalizeRunDisplay } from \"./run-display.js\";\nimport { repairFabricGuestCode } from \"./runtime/guest-code-repair.js\";\n\nconst OPTIONAL_FABRIC_EXEC_KEYS = [\n \"payloads\",\n \"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): unknown => {\n if (typeof input === \"string\") return { code: 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 (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", "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 `pi.bash` 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};\n\n// pi.bash options that stay unsupported (cwd is honored per call since #71).\nconst BASH_OPTION_NOTES: Readonly<Record<string, string>> = {\n stdin:\n \"`pi.bash` does 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\") {\n const bashNote = BASH_OPTION_NOTES[property];\n if (bashNote !== undefined) return `Recovery hint: ${bashNote}`;\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 { mkdtemp, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { truncateMiddle } from \"./util.js\";\n\nexport const MAX_FAILURE_MODEL_OUTPUT_CHARS = 20_000;\n\nexport const modelOutputBudget = (\n configuredMaxChars: number,\n success: boolean,\n): number => success\n ? configuredMaxChars\n : Math.min(configuredMaxChars, MAX_FAILURE_MODEL_OUTPUT_CHARS);\n\nexport interface BoundedModelOutput {\n text: string;\n artifactPath?: string;\n originalChars: number;\n omittedChars: number;\n}\n\ntype ArtifactWriter = (content: string) => Promise<string>;\n\nconst writeOutputArtifact: ArtifactWriter = async (content) => {\n const directory = await mkdtemp(path.join(tmpdir(), \"pi-fabric-output-\"));\n const artifactPath = path.join(directory, \"output.txt\");\n await writeFile(artifactPath, content, { encoding: \"utf8\", mode: 0o600 });\n return artifactPath;\n};\n\nexport const boundModelOutput = async (\n visible: string,\n maxChars: number,\n fullOutput = visible,\n writeArtifact: ArtifactWriter = writeOutputArtifact,\n): Promise<BoundedModelOutput> => {\n if (visible.length <= maxChars && fullOutput.length <= maxChars) {\n return { text: visible, originalChars: fullOutput.length, omittedChars: 0 };\n }\n\n let artifactPath: string | undefined;\n try {\n artifactPath = await writeArtifact(fullOutput);\n } catch {\n artifactPath = undefined;\n }\n const suffix = artifactPath\n ? `\\n\\n[Full output (${fullOutput.length} chars) saved to: ${artifactPath}]`\n : \"\";\n const bodyBudget = Math.max(1, maxChars - suffix.length);\n const text = `${truncateMiddle(visible, bodyBudget)}${suffix}`;\n return {\n text: text.length <= maxChars ? text : truncateMiddle(text, maxChars),\n ...(artifactPath ? { artifactPath } : {}),\n originalChars: fullOutput.length,\n omittedChars: Math.max(0, fullOutput.length - Math.min(fullOutput.length, bodyBudget)),\n };\n};\n", "import type { ExtensionContext } from \"@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\";\n\nexport interface FabricStateOptions {\n paths?: FabricRuntimePaths;\n runtimeLoader?: () => Promise<typeof import(\"./fabric-runtime-state.js\")>;\n}\n\ntype ActivationHook = (context: ExtensionContext) => void | Promise<void>;\ntype ActivationFailureHook = () => void | Promise<void>;\n\nexport class FabricState {\n #runtime: FabricRuntimeState | undefined;\n #activatingRuntime: FabricRuntimeState | undefined;\n #activation: Promise<FabricRuntimeState> | undefined;\n #activationGeneration: number | undefined;\n #config: FabricConfig | undefined;\n #cwd: string | undefined;\n #generation = 0;\n #everActivated = false;\n #activationHook: ActivationHook | undefined;\n #activationFailureHook: ActivationFailureHook | undefined;\n readonly #externalProviders = new Map<string, FabricProvider>();\n readonly #externalComponents = new Map<string, FabricComponentDefinition>();\n readonly #options: FabricStateOptions;\n readonly activity = new FabricActivityStore();\n readonly prewalk = new PrewalkController();\n readonly prewalkDrift = new PrewalkDriftTracker();\n readonly sessionApprovals = new FabricSessionApprovals();\n #widgetDismissedAt = 0;\n\n constructor(\n readonly pi: ExtensionAPI,\n readonly capturedTools: CapturedToolCatalog,\n options: FabricStateOptions = {},\n ) {\n this.#options = options;\n }\n\n get initialized(): boolean {\n return this.#current()?.initialized === true;\n }\n\n // Lightweight bootstrap seam: true once configuration is loaded, with no\n // dependency on the heavyweight runtime. Rendering reads this instead of\n // initialized so a resumed session honors bootstrapped presentation\n // preferences while the runtime is intentionally inactive.\n get bootstrapped(): boolean {\n return this.#config !== undefined;\n }\n\n get activated(): boolean {\n return this.#everActivated;\n }\n\n get config(): FabricConfig {\n if (!this.#config) throw new Error(\"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 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 components(): FabricRuntimeState[\"components\"] { return this.#required().components; }\n\n setActivationHook(hook: ActivationHook, onFailure?: ActivationFailureHook): void {\n this.#activationHook = hook;\n this.#activationFailureHook = onFailure;\n }\n\n async bootstrap(context: ExtensionContext): Promise<void> {\n const generation = ++this.#generation;\n this.#cwd = context.cwd;\n // A failed config load must not leak the previous session's configuration\n // into this one: clear before the read so bootstrapped stays false and\n // presentation falls back to the safe default until a load succeeds.\n this.#config = undefined;\n const config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n this.#config = config;\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n this.activity.reset();\n this.sessionApprovals.approvedRisks.clear();\n this.#widgetDismissedAt = 0;\n context.ui.setStatus(\"fabric-prewalk\", undefined);\n\n const pending = this.#activation;\n if (pending) await pending.catch(() => undefined);\n if (generation !== this.#generation) return;\n if (this.#everActivated) await this.#activate(context, true);\n }\n\n async initialize(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) {\n await this.bootstrap(context);\n } else {\n this.#config = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n }\n await this.#activate(context, true);\n }\n\n async ensure(context: ExtensionContext): Promise<void> {\n if (!this.#config || this.#cwd !== context.cwd) await this.bootstrap(context);\n await this.#activate(context, false);\n }\n\n shouldEagerlyActivate(context: ExtensionContext): boolean {\n if (\n process.env.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 actorRoot = this.config.mesh.actorScope === \"session\"\n ? path.join(meshRoot, \"actors\", sessionId)\n : path.join(meshRoot, \"actors\");\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 mainAgentInfo(context?: ExtensionContext): FabricMainAgentInfo { return this.#required().mainAgentInfo(context); }\n peerInfos(): FabricPeerInfo[] { return this.#current()?.peerInfos() ?? []; }\n componentGraph(): FabricComponentGraph {\n return this.#current()?.componentGraph() ?? { components: [], edges: [], cycles: [] };\n }\n modelGuidance(): FabricOwnedModelGuidance[] { return this.#current()?.modelGuidance() ?? []; }\n participantInfos(options: FabricParticipantListOptions = {}): FabricParticipantInfo[] {\n return this.#current()?.participantInfos(options) ?? [];\n }\n queueUserMessage(targetId: string, message: string, delivery: FabricAgentMessageDelivery): Promise<FabricAgentMessageResult> {\n return this.#required().queueUserMessage(targetId, message, delivery);\n }\n stopParticipant(targetId: string): Promise<unknown> { return this.#required().stopParticipant(targetId); }\n claimHandoff(execution: FabricExecutionResult, sessionId: string, resultFormat: FabricResultFormat, outerToolCallId: string): Promise<PendingFabricHandoff | undefined> {\n return this.#required().claimHandoff(execution, sessionId, resultFormat, outerToolCallId);\n }\n runHandoffAtBoundary(pending: PendingFabricHandoff, result: AgentToolResultMessage, context: ExtensionContext): Promise<Record<string, unknown>> {\n return this.#required().runHandoffAtBoundary(pending, result, context);\n }\n noteMainActivity(context: ExtensionContext): void { this.#current()?.noteMainActivity(context); }\n dispatchHostEvent(event: FabricActorHostEvent, payload: unknown, context: ExtensionContext): number {\n return this.#current()?.dispatchHostEvent(event, payload, context) ?? 0;\n }\n publishHostLifecycle(event: FabricLifecycleEventType, payload: unknown): Promise<void> {\n return this.#current()?.publishHostLifecycle(event, payload) ?? Promise.resolve();\n }\n\n registerExternal(provider: FabricProvider, options: { overwrite?: boolean } = {}): void {\n if (\n provider.name === \"fabric\" ||\n provider.name === \"components\" ||\n FABRIC_COMPONENT_PROVIDER_NAMES.some((name) => name === provider.name)\n ) {\n throw new Error(`Reserved Fabric provider name: ${provider.name}`);\n }\n if (this.#externalProviders.has(provider.name) && !options.overwrite) {\n throw new Error(`Fabric provider already registered: ${provider.name}`);\n }\n this.#externalProviders.set(provider.name, provider);\n this.#current()?.registerExternal(provider, options);\n }\n\n registerExternalComponent(\n component: FabricComponentDefinition,\n options: { overwrite?: boolean } = {},\n ): void {\n if (component.name.startsWith(FABRIC_PROVIDER_COMPONENT_PREFIX)) {\n throw new Error(`Reserved Fabric component name: ${component.name}`);\n }\n if (this.#externalComponents.has(component.name) && !options.overwrite) {\n throw new Error(`Fabric component already registered: ${component.name}`);\n }\n this.#externalComponents.set(component.name, component);\n this.#current()?.registerExternalComponent(component, options);\n }\n\n reloadConfig(context: ExtensionContext): void {\n const next = loadFabricConfig({\n cwd: context.cwd,\n agentDir: resolveAgentDir(),\n projectTrusted: context.isProjectTrusted(),\n });\n if (this.#config) {\n next.schema.mode = this.#config.schema.mode;\n // Keep the enforce \u21D2 QuickJS coupling alive across reloads; a disk\n // runtime value must never combine with a live enforce override.\n if (next.schema.mode === \"enforce\") next.executor.runtime = this.#config.executor.runtime;\n }\n this.#config = next;\n this.#runtime?.reloadConfig(context, next);\n }\n\n // Ephemeral, session-only schema mode: mutates the live config (guidance,\n // resolved-action gate, and executor runtime all read it per call) without\n // touching fabric.json, so the next session starts from the configured mode.\n // reloadConfig preserves the override like the startup mode does.\n setSchemaMode(context: ExtensionContext, mode: FabricSchemaMode): void {\n if (!this.#config) throw new Error(\"Fabric is not initialized\");\n const previous = this.#config.schema.mode;\n if (mode === \"enforce\" && previous !== \"enforce\" && !this.#config.fullCodeMode) {\n throw new Error(\n \"Schema enforce requires full code mode; enable fullCodeMode or start a session with schema.mode=enforce\",\n );\n }\n this.#config.schema.mode = mode;\n if (mode === \"enforce\") {\n // Mirror normalizeFabricConfig: the sandbox gate is void when guest code\n // has a process escape hatch, so enforce always runs on QuickJS.\n this.#config.executor.runtime = \"quickjs\";\n } else if (previous === \"enforce\") {\n this.#config.executor.runtime = this.#diskConfig(context).executor.runtime;\n }\n this.#runtime?.setSchemaMode(mode, this.#config.executor.runtime);\n }\n\n schemaStatus(context: ExtensionContext): {\n mode: FabricSchemaMode;\n source: \"config\" | \"session override\";\n executorRuntime: string;\n } {\n const disk = this.#diskConfig(context);\n const mode = this.#config?.schema.mode ?? disk.schema.mode;\n return {\n mode,\n source: this.#config && this.#config.schema.mode !== disk.schema.mode\n ? \"session override\"\n : \"config\",\n executorRuntime: this.#config?.executor.runtime ?? disk.executor.runtime,\n };\n }\n\n #diskConfig(context: ExtensionContext): FabricConfig {\n const projectTrusted = context.isProjectTrusted();\n return loadFabricConfigForScope(\n { cwd: context.cwd, agentDir: resolveAgentDir(), projectTrusted },\n projectTrusted ? \"project\" : \"global\",\n );\n }\n\n async shutdown(): Promise<void> {\n const generation = ++this.#generation;\n const activation = this.#activation;\n if (activation) await activation.catch(() => undefined);\n if (generation !== this.#generation) return;\n\n const runtime = this.#runtime;\n this.#runtime = undefined;\n try {\n await runtime?.shutdown();\n } finally {\n if (generation === this.#generation) {\n this.#config = undefined;\n this.#cwd = undefined;\n this.#externalProviders.clear();\n this.#externalComponents.clear();\n this.#everActivated = false;\n this.activity.reset();\n this.prewalk.cancel();\n this.prewalkDrift.clear();\n }\n }\n }\n\n async #activate(context: ExtensionContext, reinitialize: boolean): Promise<FabricRuntimeState> {\n if (this.#activation) {\n if (this.#activationGeneration === this.#generation) return this.#activation;\n await this.#activation.catch(() => undefined);\n return this.#activate(context, reinitialize);\n }\n if (this.#runtime?.initialized && !reinitialize) return this.#runtime;\n\n const generation = this.#generation;\n const config = this.config;\n const existing = this.#runtime;\n const reusable = existing?.initialized ? existing : undefined;\n const orphan = existing && !existing.initialized ? existing : undefined;\n this.#runtime = undefined;\n let candidate: FabricRuntimeState | undefined;\n const assertCurrent = (): void => {\n if (generation !== this.#generation) {\n throw new Error(\"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 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 activity: this.activity,\n prewalk: this.prewalk,\n prewalkDrift: this.prewalkDrift,\n sessionApprovals: this.sessionApprovals,\n ...(this.#options.paths ? { paths: this.#options.paths } : {}),\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 { 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 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 { FabricActivityRun } from \"../activity/types.js\";\nimport type {\n FabricActorBindingScope,\n FabricActorDelivery,\n FabricActorHostEvent,\n} from \"../actors/types.js\";\nimport type { FabricState } from \"../fabric-state.js\";\nimport type { FabricThinking } from \"../thinking.js\";\nimport type { MeshEvent } from \"../mesh/store.js\";\nimport type { FabricDashboardMessageTarget } from \"./dashboard.js\";\nimport type { ModelSource } from \"./model-picker.js\";\nimport { createDashboardSnapshot } from \"./snapshot.js\";\nimport { 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 #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 #activityRevision: number | undefined;\n // Tracks whether #activityRuns was last fetched with full payloads. The\n // dashboard needs args/result/preview to render call detail; the periodic\n // refresh instead pulls payload-free summaries so streaming runs stop\n // paying a deep clone of up to 1,000 bounded call payloads per tick.\n #activityRunsDetailed = true;\n #activityRuns: FabricActivityRun[] = [];\n readonly #transcripts = new AgentTranscriptReader();\n\n constructor(\n readonly state: FabricState,\n readonly codePreviewSettings?: CodePreviewSettings,\n ) {}\n\n start(context: ExtensionContext): void {\n this.stop();\n this.#context = context;\n if (!this.state.config.ui.enabled || context.mode !== \"tui\") return;\n if (this.state.config.mesh.enabled) {\n this.#events = this.state.mesh.read({ limit: this.state.config.ui.eventHistory });\n this.#meshOffset = this.state.mesh.latestOffset();\n }\n this.#activityUnsubscribe = this.state.activity.subscribe(() => this.#scheduleRefresh());\n this.#actorUnsubscribe = this.state.actors.subscribe(() => this.#scheduleRefresh());\n this.#agentUnsubscribe = this.state.agents.subscribeUi(() => this.#scheduleRefresh());\n this.#refresh();\n this.#schedulePoll();\n }\n\n stop(): void {\n if (this.#timer) clearTimeout(this.#timer);\n if (this.#scheduledRefresh) clearTimeout(this.#scheduledRefresh);\n this.#timer = undefined;\n this.#scheduledRefresh = undefined;\n this.#widget = undefined;\n this.#activityUnsubscribe?.();\n this.#activityUnsubscribe = undefined;\n this.#actorUnsubscribe?.();\n this.#actorUnsubscribe = undefined;\n this.#agentUnsubscribe?.();\n this.#agentUnsubscribe = undefined;\n if (this.#context?.mode === \"tui\") {\n this.#context.ui.setWidget(WIDGET_ID, undefined);\n }\n this.#context = undefined;\n this.#widgetTui = undefined;\n this.#dashboardTui = undefined;\n this.#widgetMounted = false;\n this.#events = [];\n this.#meshOffset = 0;\n this.#snapshot = emptySnapshot();\n this.#lastRefreshErrorAt = 0;\n this.#lastRefreshAt = 0;\n this.#dashboardOpen = false;\n this.#activityRevision = undefined;\n this.#activityRunsDetailed = true;\n this.#activityRuns = [];\n this.#transcripts.clear();\n }\n\n async openDashboard(context: ExtensionContext): Promise<void> {\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 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 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 this.#dashboardOpen = false;\n this.#dashboardTui = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }\n }\n\n snapshot(): FabricDashboardSnapshot {\n return structuredClone(this.#snapshot);\n }\n\n #schedulePoll(reset = false): void {\n if (reset && this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n if (this.#timer || !this.#context) return;\n const active =\n this.#snapshot.runs.some((run) => run.status === \"running\") ||\n this.#snapshot.peers.length > 0 ||\n this.#snapshot.agents.some((agent) => isActiveStatus(agent.status)) ||\n this.#snapshot.actors.some(\n (actor) =>\n isActiveStatus(actor.status) ||\n Boolean(actor.worker && isActiveStatus(actor.worker.status)),\n );\n if (!this.#dashboardOpen && !active) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n this.#refresh();\n this.#schedulePoll();\n }, this.state.config.ui.refreshMs);\n this.#timer.unref();\n }\n\n #scheduleRefresh(): void {\n if (this.#scheduledRefresh || !this.#context) return;\n const elapsed = performance.now() - this.#lastRefreshAt;\n const delay = Math.max(\n 0,\n Math.min(ACTIVITY_REFRESH_MS, this.state.config.ui.refreshMs) - elapsed,\n );\n this.#scheduledRefresh = setTimeout(() => {\n this.#scheduledRefresh = undefined;\n this.#refresh();\n this.#schedulePoll(true);\n }, delay);\n this.#scheduledRefresh.unref();\n }\n\n #agentTranscriptSource(agent: FabricUiAgent): FabricTranscriptSource {\n return { id: agent.id, status: agent.status, ...(agent.logFile ? { logFile: agent.logFile } : {}) };\n }\n\n #actorTranscriptSource(actor: FabricUiActor): FabricTranscriptSource {\n if (actor.worker?.logFile && isActiveStatus(actor.worker.status)) {\n return {\n id: `${actor.id}:${actor.worker.id}`,\n status: actor.worker.status,\n logFile: actor.worker.logFile,\n };\n }\n const retained = actor.lastRunId && actor.logDir\n ? path.join(actor.logDir, actor.lastRunId, \"events.jsonl\")\n : undefined;\n if (retained) return { id: actor.id, status: actor.status, logFile: retained };\n if (actor.sessionFile) {\n return { id: actor.id, status: actor.status, logFile: actor.sessionFile };\n }\n return { id: actor.id, status: actor.status };\n }\n\n #transcriptSource(target: FabricUiAgent | FabricUiActor): FabricTranscriptSource {\n return \"recentMessages\" in target\n ? this.#actorTranscriptSource(target)\n : this.#agentTranscriptSource(target);\n }\n\n #refresh(): void {\n this.#lastRefreshAt = performance.now();\n const context = this.#context;\n if (!context || !this.state.initialized) return;\n try {\n this.#pollMesh();\n const revision =\n typeof this.state.activity.revision === \"function\"\n ? this.state.activity.revision()\n : undefined;\n const detailed = this.#dashboardOpen;\n if (\n revision === undefined ||\n revision !== this.#activityRevision ||\n detailed !== this.#activityRunsDetailed\n ) {\n this.#activityRuns =\n detailed || typeof this.state.activity.runSummaries !== \"function\"\n ? this.state.activity.runs()\n : this.state.activity.runSummaries();\n this.#activityRevision = revision;\n this.#activityRunsDetailed = detailed;\n }\n this.#snapshot = createDashboardSnapshot(\n this.state,\n this.#events,\n context,\n this.#activityRuns,\n );\n this.#renderWidget(context);\n if (this.#dashboardTui) this.#dashboardTui.requestRender();\n else if (this.#widgetTui && this.#widget?.hasChanged()) this.#widgetTui.requestRender();\n } catch (error) {\n const now = Date.now();\n if (now - this.#lastRefreshErrorAt >= 10_000) {\n this.#lastRefreshErrorAt = now;\n const message = error instanceof Error ? error.message : String(error);\n context.ui.notify(`Fabric dashboard refresh failed: ${message}`, \"warning\");\n }\n }\n }\n\n #pollMesh(): void {\n if (!this.state.config.mesh.enabled) return;\n const result = this.state.mesh.tail(this.#meshOffset, this.state.config.ui.eventHistory);\n this.#meshOffset = result.nextOffset;\n if (result.events.length === 0) return;\n this.#events.push(...result.events);\n const limit = this.state.config.ui.eventHistory;\n if (this.#events.length > limit) this.#events.splice(0, this.#events.length - limit);\n }\n\n #renderWidget(context: ExtensionContext): void {\n const config = this.state.config.ui;\n const shouldShow =\n context.mode === \"tui\" &&\n shouldShowFabricWidget(this.#snapshot, config.widget);\n if (shouldShow) {\n if (this.#widgetMounted) return;\n this.#widgetMounted = true;\n context.ui.setWidget(\n WIDGET_ID,\n (tui, theme) => {\n this.#widgetTui = tui;\n this.#widget = new FabricWidget(theme, () => this.#snapshot, config.maxRows);\n return this.#widget;\n },\n { placement: \"aboveEditor\" },\n );\n return;\n }\n if (!this.#widgetMounted) return;\n context.ui.setWidget(WIDGET_ID, undefined);\n this.#widgetMounted = false;\n this.#widgetTui = undefined;\n this.#widget = undefined;\n }\n}\n", "import type { ExtensionContext } from \"@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\nexport const createDashboardSnapshot = (\n state: FabricState,\n events: MeshEvent[],\n context?: ExtensionContext,\n activityRuns?: FabricActivityRun[],\n): FabricDashboardSnapshot => {\n const runs = activityRuns ?? state.activity.runs();\n const agentRecords =\n typeof state.agents.listForUi === \"function\"\n ? state.agents.listForUi()\n : state.agents.list();\n const agentLinks: Array<{ runId: string; call: FabricActivityRun[\"calls\"][number] }> = [];\n for (const run of runs) {\n for (const call of run.calls) {\n if (call.entityId) agentLinks.push({ runId: run.id, call });\n }\n }\n agentLinks.sort((left, right) => {\n const leftLaunch = left.call.ref === \"agents.spawn\" || left.call.ref === \"agents.run\";\n const rightLaunch = right.call.ref === \"agents.spawn\" || right.call.ref === \"agents.run\";\n if (leftLaunch !== rightLaunch) return leftLaunch ? -1 : 1;\n return left.call.startedAt - right.call.startedAt;\n });\n const agentFromRecord = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): FabricUiAgent => {\n const linked = parentId\n ? undefined\n : agentLinks.find(\n ({ call }) =>\n call.entityId &&\n (record.id.startsWith(call.entityId) || call.entityId.startsWith(record.id)),\n );\n const base: FabricUiAgent = {\n id: record.id,\n name: record.name,\n status: record.status,\n runner: record.runner,\n transport: record.transport,\n cwd: record.cwd,\n ...(!isRunRecord(record) && linked ? { startedAt: linked.call.startedAt } : {}),\n ...(record.model ? { model: record.model } : {}),\n ...(record.thinking ? { thinking: record.thinking } : {}),\n ...(record.attachCommand ? { attachCommand: record.attachCommand } : {}),\n ...(isRunRecord(record) && record.logFile ? { logFile: record.logFile } : {}),\n ...(record.branch ? { branch: record.branch } : {}),\n ...(record.worktree ? { worktree: record.worktree } : {}),\n ...(record.actorId ? { actorId: record.actorId } : {}),\n ...(record.actorName ? { actorName: record.actorName } : {}),\n ...(parentId ? { parentId } : {}),\n ...(nestingDepth > 0 ? { nestingDepth } : {}),\n ...(linked ? { runId: linked.runId } : parent?.runId ? { runId: parent.runId } : {}),\n ...(linked?.call.phaseId\n ? { phaseId: linked.call.phaseId }\n : parent?.phaseId\n ? { phaseId: parent.phaseId }\n : {}),\n };\n if (!isRunRecord(record)) return base;\n return {\n ...base,\n task: record.task,\n startedAt: record.startedAt,\n updatedAt: record.updatedAt,\n ...(record.finishedAt !== undefined ? { finishedAt: record.finishedAt } : {}),\n ...(record.currentTool ? { currentTool: record.currentTool } : {}),\n turns: record.turns,\n toolCalls: record.toolCalls,\n usage: { ...record.usage },\n ...(record.text ? { text: record.text } : {}),\n ...(record.value !== undefined ? { value: structuredClone(record.value) } : {}),\n ...(record.error ? { error: record.error } : {}),\n };\n };\n const allAgents: FabricUiAgent[] = [];\n const appendAgent = (\n record: AgentRunRecord | AgentHandleInfo,\n nestingDepth: number,\n parentId?: string,\n parent?: FabricUiAgent,\n ): void => {\n const agent = agentFromRecord(record, nestingDepth, parentId, parent);\n allAgents.push(agent);\n if (!isRunRecord(record)) return;\n for (const nested of record.nestedAgents ?? []) {\n appendAgent(nested, nestingDepth + 1, record.id, agent);\n }\n };\n for (const record of agentRecords) appendAgent(record, 0);\n\n const participants =\n typeof state.participantInfos === \"function\"\n ? state.participantInfos({ scope: \"project\" })\n : [];\n const participantById = new Map(participants.map((participant) => [participant.id, participant]));\n const actors = state.actors\n .list()\n .map((actor) => {\n const participant = participantById.get(actor.id);\n const worker = allAgents\n .filter((agent) => agent.actorId === actor.id)\n .sort((left, right) => {\n const active =\n Number(activeStatuses.has(right.status)) -\n Number(activeStatuses.has(left.status));\n const recency =\n (numberFrom(right.updatedAt) ?? numberFrom(right.startedAt) ?? 0) -\n (numberFrom(left.updatedAt) ?? numberFrom(left.startedAt) ?? 0);\n return active || recency;\n })[0];\n return {\n ...actor,\n instructions: state.actors.instructions(actor.id),\n recentMessages: state.actors.messages(actor.id, 12),\n ...(participant\n ? { ownerHostId: participant.ownerHostId, local: participant.local }\n : {}),\n ...(worker ? { worker } : {}),\n };\n });\n const localAgents = allAgents\n .filter((agent) => !agent.actorId)\n .map((agent) => {\n const participant = participantById.get(agent.id);\n return participant\n ? {\n ...agent,\n ...(agent.parentId ? {} : participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }\n : agent;\n });\n const localAgentIds = new Set(localAgents.map((agent) => agent.id));\n const remoteAgents: FabricUiAgent[] = participants\n .filter((participant) => participant.kind === \"agent\" && !localAgentIds.has(participant.id))\n .map((participant) => ({\n id: participant.id,\n name: participant.name,\n status: participant.status,\n runner: participant.runner,\n transport: participant.transport,\n cwd: participant.cwd ?? \"\",\n ...(participant.model ? { model: participant.model } : {}),\n ...(participant.thinking ? { thinking: participant.thinking } : {}),\n ...(participant.currentTool ? { currentTool: participant.currentTool } : {}),\n startedAt: participant.startedAt,\n updatedAt: participant.updatedAt,\n ...(participant.finishedAt !== undefined ? { finishedAt: participant.finishedAt } : {}),\n ...(participant.turns !== undefined ? { turns: participant.turns } : {}),\n ...(participant.toolCalls !== undefined ? { toolCalls: participant.toolCalls } : {}),\n ...(participant.usage ? { usage: { ...participant.usage } } : {}),\n ...(participant.parentId ? { parentId: participant.parentId } : {}),\n rootId: participant.rootId,\n ownerHostId: participant.ownerHostId,\n local: participant.local,\n stale: participant.stale,\n participantKind: participant.kind,\n ...(participant.residency ? { residency: participant.residency } : {}),\n capabilities: [...participant.capabilities],\n }));\n const agents = [...localAgents, ...remoteAgents];\n const visibleAgents = boundedUiAgents(localAgents, remoteAgents);\n const activeRunIds = new Set(\n agents\n .filter((agent) => agent.runId && activeStatuses.has(agent.status))\n .map((agent) => agent.runId as string),\n );\n const orderedRuns = runs\n .map((run, index) => ({ run, index }))\n .sort((left, right) => {\n const leftActive = activeRunIds.has(left.run.id) ? 1 : 0;\n const rightActive = activeRunIds.has(right.run.id) ? 1 : 0;\n return rightActive - leftActive || left.index - right.index;\n })\n .map(({ run }) => run);\n\n const meshEntries = state.config.mesh.enabled ? state.mesh.list(\"\", 200) : [];\n const stateEntries = meshEntries\n .filter(\n (entry) =>\n !entry.key.startsWith(\"actors/\") &&\n !entry.key.startsWith(\"sessions/\") &&\n !entry.key.startsWith(\"topology/\"),\n )\n .map(stateEntry)\n .sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n })\n .slice(0, 120);\n\n return {\n now: Date.now(),\n runs: orderedRuns,\n main: state.mainAgentInfo(context),\n peers: typeof state.peerInfos === \"function\" ? state.peerInfos() : [],\n participants,\n widgetDismissedAt: state.widgetDismissedAt,\n globalActors: state.globalActors.list(),\n agents: visibleAgents,\n componentGraph: typeof state.componentGraph === \"function\"\n ? state.componentGraph()\n : { components: [], edges: [], cycles: [] },\n actors: actors.sort((left, right) => {\n const leftActive = activeStatuses.has(left.status) ? 1 : 0;\n const rightActive = activeStatuses.has(right.status) ? 1 : 0;\n return rightActive - leftActive || right.updatedAt - left.updatedAt;\n }),\n state: stateEntries,\n events: events.map((event) => structuredClone(event)),\n };\n};\n", "import type { Component } from \"@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 type {\n FabricActivityRun,\n FabricActivityStatus,\n} from \"../activity/types.js\";\nimport { formatCost, formatDuration, formatTokens, safeText } from \"./format.js\";\nimport {\n isActiveStatus,\n orderAgentsByCreation,\n type FabricDashboardSnapshot,\n type FabricUiAgent,\n} from \"./types.js\";\n\nconst statusGlyph = (status: string): string => {\n if (status === \"completed\" || status === \"done\") return \"\u2713\";\n if (status === \"failed\" || status === \"timed_out\") return \"\u2717\";\n if (status === \"blocked\") return \"!\";\n if (status === \"stopped\" || status === \"cancelled\") return \"\u25A0\";\n if (status === \"queued\" || status === \"pending\" || status === \"ready\") return \"\u25CB\";\n if (status === \"idle\" || status === \"state\") return \"\u00B7\";\n return spinnerFrame();\n};\n\nconst colorStatus = (theme: Theme, status: string, value: string): string => {\n if (status === \"completed\" || status === \"done\") return theme.fg(\"success\", value);\n if (status === \"failed\" || status === \"timed_out\") return theme.fg(\"error\", value);\n if (status === \"blocked\") return theme.fg(\"warning\", value);\n if (status === \"running\" || status === \"in_progress\") return theme.fg(\"accent\", value);\n return theme.fg(\"dim\", value);\n};\n\nconst phaseProgress = (\n run: FabricActivityRun,\n phaseId: string,\n): { completed: number; total: number } => {\n const phase = run.phases.find((candidate) => candidate.id === phaseId);\n const statuses: FabricActivityStatus[] = [\n ...run.calls.filter((call) => call.phaseId === phaseId).map((call) => call.status),\n ...run.items.filter((item) => item.phaseId === phaseId).map((item) => item.status),\n ];\n const completed = statuses.filter((status) => status === \"completed\").length;\n return { completed, total: Math.max(phase?.total ?? 0, statuses.length) };\n};\n\nconst totalTokens = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce(\n (sum, agent) => sum + (agent.usage ? agent.usage.input + agent.usage.output : 0),\n 0,\n );\n\nconst totalCost = (\n snapshot: FabricDashboardSnapshot,\n run: FabricActivityRun | undefined,\n): number =>\n snapshot.agents\n .filter((agent) => (run ? agent.runId === run.id : isActiveStatus(agent.status)))\n .reduce((sum, agent) => sum + (agent.usage?.cost ?? 0), 0);\n\nconst agentLines = (\n theme: Theme,\n agent: FabricUiAgent,\n now: number,\n): string[] => {\n const status = colorStatus(theme, agent.status, statusGlyph(agent.status));\n const activity =\n agent.currentTool ??\n (agent.error\n ? `error: ${truncateToWidth(safeText(agent.error), 48)}`\n : agent.text && !isActiveStatus(agent.status)\n ? `result: ${truncateToWidth(safeText(agent.text), 48)}`\n : agent.status === \"running\"\n ? \"thinking\"\n : agent.status);\n const metrics = [\n agent.toolCalls !== undefined ? `${agent.toolCalls} calls` : undefined,\n agent.usage ? `${formatTokens(agent.usage.input + agent.usage.output)} tok` : undefined,\n agent.startedAt\n ? formatDuration((agent.finishedAt ?? now) - agent.startedAt)\n : undefined,\n ].filter((value): value is string => Boolean(value));\n const indent = \" \".repeat(1 + Math.max(0, agent.nestingDepth ?? 0));\n return [\n `${indent}${status} ${theme.fg(\"muted\", safeText(agent.name))} ${theme.fg(\"muted\", safeText(activity))}${\n metrics.length > 0 ? theme.fg(\"dim\", ` \u00B7 ${metrics.join(\" \u00B7 \")}`) : \"\"\n }`,\n ];\n};\n\nexport const shouldShowFabricWidget = (\n snapshot: FabricDashboardSnapshot,\n mode: FabricUiWidgetMode,\n): boolean => {\n if (mode === \"hidden\") return false;\n if (mode === \"always\") return true;\n if (snapshot.agents.some((agent) => isActiveStatus(agent.status))) return true;\n if (snapshot.actors.some((actor) => actor.status !== \"stopped\")) return true;\n const run = snapshot.runs[0];\n if (!run) return false;\n if (run.status === \"running\") return true;\n const finishedAt = run.finishedAt ?? run.updatedAt;\n return finishedAt > (snapshot.widgetDismissedAt ?? 0);\n};\n\nexport class FabricWidget implements Component {\n constructor(\n readonly theme: Theme,\n readonly snapshot: () => FabricDashboardSnapshot,\n readonly maxRows: number,\n ) {}\n\n #lastWidth: number | undefined;\n #lastSnapshot: FabricDashboardSnapshot | undefined;\n #lastLines: string[] | undefined;\n #leaseKey: string | undefined;\n #leasedRows = 0;\n #pending:\n | { width: number; snapshot: FabricDashboardSnapshot; lines: string[] }\n | undefined;\n\n render(width: number): string[] {\n if (width <= 0) return [];\n const snapshot = this.snapshot();\n const lines =\n this.#pending?.width === width && this.#pending.snapshot === snapshot\n ? this.#pending.lines\n : this.#lastWidth === width &&\n this.#lastSnapshot === snapshot &&\n this.#lastLines\n ? this.#lastLines\n : this.#renderLines(snapshot, width);\n this.#pending = undefined;\n this.#lastWidth = width;\n this.#lastSnapshot = snapshot;\n this.#lastLines = lines;\n return lines;\n }\n\n hasChanged(): boolean {\n if (this.#lastWidth === undefined || this.#lastLines === undefined) return true;\n const snapshot = this.snapshot();\n const lines = this.#renderLines(snapshot, this.#lastWidth);\n this.#pending = { width: this.#lastWidth, snapshot, lines };\n return (\n lines.length !== this.#lastLines.length ||\n lines.some((line, index) => line !== this.#lastLines?.[index])\n );\n }\n\n invalidate(): void {\n this.#pending = undefined;\n this.#lastWidth = undefined;\n this.#lastSnapshot = undefined;\n this.#lastLines = undefined;\n }\n\n #renderLines(snapshot: FabricDashboardSnapshot, width: number): string[] {\n const { lines: content, leaseKey } = this.#buildContent(snapshot);\n return this.#leaseContent(this.#boundContent(content, width), leaseKey);\n }\n\n #buildContent(snapshot: FabricDashboardSnapshot): { lines: string[]; leaseKey: string } {\n const candidateRun = snapshot.runs[0];\n const candidateFinishedAt = candidateRun?.finishedAt ?? candidateRun?.updatedAt ?? 0;\n const run =\n candidateRun &&\n (candidateRun.status === \"running\" ||\n candidateFinishedAt > (snapshot.widgetDismissedAt ?? 0))\n ? candidateRun\n : undefined;\n const orderedAgents = orderAgentsByCreation(snapshot.agents);\n const activeAgents = orderedAgents.filter((agent) => isActiveStatus(agent.status));\n const activeAgentIds = new Set(activeAgents.map((agent) => agent.id));\n const terminalAgents = run\n ? orderedAgents.filter(\n (agent) =>\n agent.runId === run.id &&\n !activeAgentIds.has(agent.id) &&\n !isActiveStatus(agent.status),\n )\n : [];\n const visibleActors = snapshot.actors.filter((actor) => actor.status !== \"stopped\");\n const activeActorWorkers = visibleActors\n .filter((actor) => actor.worker && isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const terminalActorWorkers = visibleActors\n .filter((actor) => actor.worker && !isActiveStatus(actor.worker.status))\n .map((actor) => ({ ...actor.worker!, name: actor.name }));\n const nestedCalls =\n run?.calls.filter((call) => call.kind !== \"agent\" && call.kind !== \"actor\") ?? [];\n const title = run?.name ?? \"Fabric session\";\n const headerStatus =\n run?.status ??\n (activeAgents.length > 0 || activeActorWorkers.length > 0 ? \"running\" : \"idle\");\n const parts: string[] = [];\n\n const callTotal = nestedCalls.length;\n if (callTotal > 1) {\n const callDone = nestedCalls.filter(\n (call) => call.status === \"completed\" || call.status === \"failed\",\n ).length;\n parts.push(`${callDone}/${callTotal} calls`);\n }\n if (run?.currentPhaseId) {\n const phaseIndex = run.phases.findIndex((phase) => phase.id === run.currentPhaseId);\n const phase = run.phases[phaseIndex];\n if (phase) {\n const progress = phaseProgress(run, phase.id);\n parts.push(\n `${phaseIndex + 1}/${run.phases.length} ${safeText(phase.name)}${\n progress.total > 0 ? ` ${progress.completed}/${progress.total}` : \"\"\n }`,\n );\n }\n }\n if (activeAgents.length > 0) parts.push(`${activeAgents.length} running`);\n if (visibleActors.length > 0) parts.push(`${visibleActors.length} actor${visibleActors.length === 1 ? \"\" : \"s\"}`);\n const tokens = totalTokens(snapshot, run);\n if (tokens > 0) parts.push(`${formatTokens(tokens)} tok`);\n const cost = totalCost(snapshot, run);\n if (cost > 0) parts.push(formatCost(cost));\n if (run) parts.push(formatDuration((run.finishedAt ?? snapshot.now) - run.startedAt));\n\n const glyph = colorStatus(this.theme, headerStatus, statusGlyph(headerStatus));\n const header = `${glyph} ${this.theme.fg(\"accent\", \"Fabric\")} ${this.theme.fg(\n \"muted\",\n safeText(title),\n )}${parts.length > 0 ? this.theme.fg(\"dim\", ` \u00B7 ${parts.join(\" \u00B7 \")}`) : \"\"}`;\n const lines = [header];\n\n lines.push(\n ...activeAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n ...activeActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalActorWorkers.flatMap((agent) =>\n agentLines(this.theme, agent, snapshot.now),\n ),\n ...terminalAgents.flatMap((agent) => agentLines(this.theme, agent, snapshot.now)),\n );\n const ambientOwners = [\n ...activeAgents.map((agent) => `agent:${agent.id}`),\n ...visibleActors.map(\n (actor) => `actor:${actor.id}:${actor.worker?.id ?? actor.lastRunId ?? \"idle\"}`,\n ),\n ];\n return {\n lines,\n leaseKey: run?.id ?? (ambientOwners.length > 0 ? `ambient:${ambientOwners.join(\",\")}` : \"ambient\"),\n };\n }\n\n #leaseContent(lines: string[], leaseKey: string): string[] {\n if (this.#leaseKey !== leaseKey) {\n this.#leaseKey = leaseKey;\n this.#leasedRows = lines.length;\n } else {\n this.#leasedRows = Math.max(this.#leasedRows, lines.length);\n }\n if (lines.length >= this.#leasedRows) return lines;\n return [\n ...lines,\n ...Array.from({ length: this.#leasedRows - lines.length }, () => \"\"),\n ];\n }\n\n #boundContent(content: string[], width: number): string[] {\n const bounded = content.slice(0, Math.max(1, this.maxRows));\n if (content.length > bounded.length && bounded.length > 0) {\n const marker = this.theme.fg(\"dim\", `+${content.length - bounded.length}`);\n const available = Math.max(0, width - visibleWidth(marker) - 1);\n const last = truncateToWidth(bounded[bounded.length - 1] ?? \"\", available, \"\");\n bounded[bounded.length - 1] = `${last} ${marker}`;\n }\n return bounded.map((line) => truncateToWidth(line, width));\n }\n}\n", "/** 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 { Usage } from \"@earendil-works/pi-ai\";\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 {\n filterPrewalkContinuationMessages,\n settleInPlacePrewalk,\n withTrajectoryRearmDirective,\n} from \"./prewalk/handoff.js\";\nimport type { PendingFabricHandoff } from \"./prewalk/handoff.js\";\nimport { autoArmFabricPrewalk } from \"./prewalk/arm.js\";\nimport {\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 {\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 { 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 { FabricToolDisplayController } from \"./ui/tool-display.js\";\nimport { configureHighlighting } from \"./ui/highlight.js\";\nimport { formatFabricValue } from \"./ui/structured.js\";\nimport { truncateMiddle } from \"./util.js\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Absolute path to the Fabric skills bundled with this extension. Resolved\n// relative to the extension entry so it works both in development (src/) and\n// in an installed package (dist/). Contributed via resources_discover so child\n// Pi processes that load Fabric with -e (agents and actors) discover the\n// same fabric-exec / fabric-advisor / fabric-council skill references as the\n// main agent, which gets them through the package manifest.\nconst FABRIC_EXTENSION_ENTRY_PATH = path.resolve(fileURLToPath(import.meta.url));\nconst FABRIC_ENTRY_DIR = path.dirname(FABRIC_EXTENSION_ENTRY_PATH);\nconst FABRIC_RUNTIME_PATHS = {\n extension: FABRIC_EXTENSION_ENTRY_PATH,\n worker: path.join(FABRIC_ENTRY_DIR, \"worker.js\"),\n residentHost: path.join(FABRIC_ENTRY_DIR, \"residency\", \"launcher.js\"),\n skills: path.resolve(FABRIC_ENTRY_DIR, \"..\", \"skills\"),\n};\nconst FABRIC_SKILLS_DIR = FABRIC_RUNTIME_PATHS.skills;\n\nconst componentRegistrationFrom = (\n value: unknown,\n): FabricComponentRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricComponentRegistration>;\n const component = registration.component;\n if (\n registration.version !== 1 ||\n typeof component !== \"object\" ||\n component === null ||\n typeof component.name !== \"string\" ||\n typeof component.activate !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricComponentRegistration;\n};\n\nconst registrationFrom = (value: unknown): FabricProviderRegistration | undefined => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const registration = value as Partial<FabricProviderRegistration>;\n const provider = registration.provider;\n if (\n registration.version !== 1 ||\n typeof provider !== \"object\" ||\n provider === null ||\n typeof provider.name !== \"string\" ||\n typeof provider.description !== \"string\" ||\n typeof provider.list !== \"function\" ||\n typeof provider.describe !== \"function\" ||\n typeof provider.invoke !== \"function\"\n ) {\n return undefined;\n }\n return registration as FabricProviderRegistration;\n};\n\nconst SKILL_REFERENCE_CUSTOM_TYPE = \"pi-fabric-skill-reference\";\n\nexport default async function piFabric(pi: ExtensionAPI): Promise<void> {\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, { paths: FABRIC_RUNTIME_PATHS });\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 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 () => {\n if (existsSync(FABRIC_SKILLS_DIR)) return { skillPaths: [FABRIC_SKILLS_DIR] };\n return {};\n });\n\n const fabricTool = createFabricExecTool(\n state,\n codePreviewSettings,\n pendingHandoffs,\n decorateShell,\n toolDisplay,\n );\n const refreshCodePreviewSettings = (): void => {\n Object.assign(codePreviewSettings, state.config.codePreview);\n configureHighlighting(\n codePreviewSettings.shikiTheme,\n codePreviewSettings.syntaxHighlighting,\n );\n };\n const fabricToolLifecycle = new FabricToolLifecycle(\n () => ownsFabricToolSource(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 pi.registerTool(fabricTool);\n\n const applyFabricMode = (): void => {\n toolCapture.setPolicy(capturePolicy());\n pi.registerTool(fabricTool);\n toolOwnership.apply(\n fabricOwnsModelTools(),\n fabricOwnsModelTools() ? hiddenCapturedToolNames() : undefined,\n );\n capturedTools.refresh();\n };\n const suspendToolCapture = (): void => {\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 at once. Disabled when mesh/actors are off or ui.haltOnEscape is\n // false.\n let haltOnEscapeUnsubscribe: (() => void) | undefined;\n const uninstallHaltOnEscape = (): void => {\n haltOnEscapeUnsubscribe?.();\n haltOnEscapeUnsubscribe = undefined;\n };\n const installHaltOnEscape = (context: ExtensionContext): void => {\n uninstallHaltOnEscape();\n if (context.mode !== \"tui\") return;\n if (!state.config.ui.haltOnEscape || !state.config.mesh.enabled) return;\n if (typeof context.ui.onTerminalInput !== \"function\") return;\n const ESC = \"\\x1b\";\n const DEBOUNCE_MS = 60;\n let escTimer: NodeJS.Timeout | undefined;\n const trigger = (): void => {\n if (!state.initialized || !state.config.mesh.enabled) return;\n let halted = 0;\n try {\n // A lone Esc that lands while Fabric is already in a stop-the-world\n // halt is a no-op: the gate is armed and resumes on the next message,\n // so don't repeat the notice \u2014 a double-Esc to open /tree would\n // otherwise pop it on every press. Only the first Esc of a halt\n // session notifies.\n if (state.actors.halted) return;\n halted = state.actors.haltAll().halted;\n } catch {\n return;\n }\n // Nothing had work to abort: the gate armed silently, so skip the\n // notice \u2014 a lone Esc with no active actors should not pop a\n // \"halted 0 actors\" line.\n if (halted === 0) return;\n context.ui.notify(\n `Fabric: halted ${halted} actor${halted === 1 ? \"\" : \"s\"} (Esc) \u00B7 resumes on next message`,\n \"warning\",\n );\n };\n haltOnEscapeUnsubscribe = context.ui.onTerminalInput((data: string) => {\n if (data === ESC) {\n if (escTimer) clearTimeout(escTimer);\n escTimer = setTimeout(() => {\n escTimer = undefined;\n trigger();\n }, DEBOUNCE_MS);\n escTimer.unref?.();\n return undefined;\n }\n // Any other input cancels a pending lone-Esc debounce \u2014 the Esc byte was\n // most likely the start of an escape sequence that arrived split.\n if (escTimer) {\n clearTimeout(escTimer);\n escTimer = undefined;\n }\n return undefined;\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 fabricUi.stop();\n };\n state.setActivationHook(async (context) => {\n refreshCodePreviewSettings();\n Object.assign(\n fabricTool,\n createFabricExecTool(state, codePreviewSettings, pendingHandoffs, decorateShell, toolDisplay),\n );\n await autoArmPrewalk(context);\n applyFabricMode();\n fabricUi.start(context);\n installHaltOnEscape(context);\n }, cleanupActivationSideEffects);\n\n pi.on(\"session_start\", async (_event, context) => {\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n proxyContract.reset();\n refreshProxyLedger(context);\n if (!compatibilityWarningShown) {\n compatibilityWarningShown = true;\n const warning = 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 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 });\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 return {\n message: {\n ...event.message,\n content: [{ type: \"text\", text }],\n details,\n isError: !boundarySucceeded,\n },\n };\n });\n\n pi.on(\"tool_execution_end\", async (event, context) => {\n if (!state.initialized) return;\n state.noteMainActivity(context);\n if (event.isError) {\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 continuation = filterPrewalkContinuationMessages(\n event.messages,\n (continuationId) => state.initialized &&\n state.prewalk.acceptContinuation(sessionId, continuationId),\n );\n let changed = continuation.changed;\n const messages = continuation.messages.map((message) => {\n if (message.role !== \"user\") return message;\n if (typeof message.content === \"string\") {\n const content = expandSkillDirMarkersInSkillBlock(message.content);\n if (content === message.content) return message;\n changed = true;\n return { ...message, content };\n }\n let messageChanged = false;\n const content = message.content.map((part) => {\n if (part.type !== \"text\") return part;\n const text = expandSkillDirMarkersInSkillBlock(part.text);\n if (text === part.text) return part;\n changed = true;\n messageChanged = true;\n return { ...part, text };\n });\n return messageChanged ? { ...message, content } : message;\n });\n return changed ? { messages } : undefined;\n });\n\n pi.on(\"before_agent_start\", async (event, context) => {\n const fullCodeMode = state.cwd\n ? state.config.fullCodeMode\n : DEFAULT_FABRIC_CONFIG.fullCodeMode;\n const schemaMode = state.cwd\n ? state.config.schema.mode\n : DEFAULT_FABRIC_CONFIG.schema.mode;\n const effectiveFullCodeMode = fullCodeMode || schemaMode === \"enforce\";\n if (!pi.getActiveTools().includes(\"fabric_exec\")) return;\n const skills = event.systemPromptOptions.skills ?? [];\n const captureSnapshot = state.cwd ? capturePolicy() : undefined;\n // Pi omits its entire skill catalog when the active tool set lacks a tool\n // named read. Restore that catalog in full code mode with only the loader\n // instruction adapted to Fabric's nested pi.read path.\n const systemPrompt = effectiveFullCodeMode\n ? restoreSkillsForFullCodePrompt(event.systemPrompt, skills)\n : event.systemPrompt;\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),\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),\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 () => {\n unsubscribeComponentRegistration();\n unsubscribeProviderRegistration();\n pendingHandoffs.clear();\n directToolApproval.clear();\n toolDisplay.clear();\n try {\n await state.shutdown();\n } finally {\n uninstallHaltOnEscape();\n fabricUi.stop();\n suspendToolCapture();\n toolOwnership.release();\n fabricToolLifecycle.clear();\n toolCapture.dispose();\n }\n });\n\n // Turn-scoped invariant: even if another extension rewrote the active tool\n // set (e.g. a permission system filtering its allowlist at before_agent_start,\n // or a refresh that ran before Fabric's policy was active), captured tools\n // must not leak into the model's next turn.\n 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 \"./protocol.js\";\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["formatDuration", "state", "component", "path", "items", "filtered", "path", "path", "isRecord", "existsSync", "readFileSync", "path", "isRecord", "escapeRegex", "Container", "Text", "path", "isRecord", "truncateToWidth", "path", "path", "title", "composite", "Container", "Text", "text", "readHint", "fs", "path", "path", "fs", "existsSync", "readFileSync", "realpathSync", "path", "path", "truncateToWidth", "visibleWidth", "truncateToWidth", "phase", "visibleWidth", "path", "existsSync", "path", "content"]
|
|
7
7
|
}
|