{
  "version": 3,
  "sources": ["../src/pi-starship.ts", "../src/modules/git/runtime.ts", "../src/runtime/command.ts", "../src/runtime/github-pr.ts", "../src/runtime/refresh-controller.ts", "../src/runtime/workspace.ts", "../src/usage.ts"],
  "sourcesContent": ["import { homedir, hostname, userInfo } from \"node:os\";\nimport {\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\tgetAgentDir,\n\ttype ReadonlyFooterDataProvider,\n} from \"@earendil-works/pi-coding-agent\";\nimport { wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport { completeStarshipArguments } from \"./command-contract.js\";\nimport type { StarshipCommandOptions } from \"./commands.js\";\nimport {\n\ttype LoadedStarshipConfig,\n\tloadStarshipConfig,\n\ttype StarshipConfig,\n\tsettingsFilePath,\n} from \"./config.js\";\nimport { gitSnapshotEqual, readGitSnapshot } from \"./modules/git/runtime.js\";\nimport {\n\ttype GithubPrSnapshot,\n\ttype GitSnapshot,\n\tinspectStatuslineModules,\n\treachableModuleRequirements,\n\trenderStatusline,\n\ttype StarshipRuntimeSnapshot,\n\ttype StatuslineInspection,\n\ttype WorkspaceSnapshot,\n} from \"./modules/index.js\";\nimport { execWorkspaceCommand } from \"./runtime/command.js\";\nimport { githubPrSnapshotEqual, queryGithubPr } from \"./runtime/github-pr.js\";\nimport { AsyncRefreshController } from \"./runtime/refresh-controller.js\";\nimport {\n\tcollectWorkspaceSnapshot,\n\ttype WorkspaceExec,\n\ttype WorkspaceRefreshInput,\n\tworkspaceSnapshotEqual,\n} from \"./runtime/workspace.js\";\nimport { summarizeFooterUsage } from \"./usage.js\";\n\nconst REFRESH_INTERVAL_MS = 30_000;\nconst GITHUB_PR_REFRESH_INTERVAL_MS = 60_000;\nconst EVENT_DEBOUNCE_MS = 250;\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\ntype StarshipCommands = typeof import(\"./commands.js\");\nlet starshipCommandsPromise: Promise<StarshipCommands> | undefined;\n\nfunction loadStarshipCommands(): Promise<StarshipCommands> {\n\tif (!starshipCommandsPromise) {\n\t\tstarshipCommandsPromise = import(\"./commands.js\").catch((error) => {\n\t\t\tstarshipCommandsPromise = undefined;\n\t\t\tthrow error;\n\t\t});\n\t}\n\treturn starshipCommandsPromise;\n}\n\ninterface RuntimeState {\n\tactiveTools: Map<string, number>;\n\tisStreaming: boolean;\n\tthinkingLevel: string;\n\tlastCompletedTool?: string;\n\tgit?: GitSnapshot;\n\tgithubPr?: GithubPrSnapshot;\n\tworkspace?: WorkspaceSnapshot;\n\trequestRender?: () => void;\n\trenderPreview?: (loaded: LoadedStarshipConfig, width: number) => string[];\n\tinspect?: (loaded: LoadedStarshipConfig) => StatuslineInspection;\n\tfooterWidth?: number;\n}\n\ninterface RefreshTarget {\n\tcwd: string;\n\tgeneration: number;\n\tsessionManager: ExtensionContext[\"sessionManager\"];\n}\n\ninterface GitRefreshInput {\n\tcwd: string;\n\tconfig: StarshipConfig;\n}\n\ninterface PiStarshipOptions {\n\tgithubPrExec?: WorkspaceExec;\n}\n\nexport default function piStarship(pi: ExtensionAPI, options: PiStarshipOptions = {}) {\n\tlet loaded: LoadedStarshipConfig | undefined;\n\tlet loadedRevision = 0;\n\tlet previewLoaded: LoadedStarshipConfig | undefined;\n\tconst runtime: RuntimeState = {\n\t\tactiveTools: new Map(),\n\t\tisStreaming: false,\n\t\tthinkingLevel: \"off\",\n\t};\n\tlet sessionGeneration = 0;\n\tlet menuController = new AbortController();\n\tlet sessionOwner: ExtensionContext[\"sessionManager\"] | undefined;\n\tlet activeTarget: RefreshTarget | undefined;\n\tlet eventDebounceTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet githubPrRefreshTimer: ReturnType<typeof setInterval> | undefined;\n\tlet githubPrExpiryTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet githubPrGeneration = 0;\n\n\tconst refresh = () => runtime.requestRender?.();\n\tconst githubPrExec = options.githubPrExec ?? execWorkspaceCommand;\n\tconst gitController = new AsyncRefreshController<GitRefreshInput, GitSnapshot | undefined>({\n\t\tasync read(input, signal) {\n\t\t\tconst requirements = reachableModuleRequirements(input.config);\n\t\t\tconst gitReachable =\n\t\t\t\t[...requirements.keys()].some((name) => name.startsWith(\"git_\")) ||\n\t\t\t\t(requirements.has(\"directory\") &&\n\t\t\t\t\tinput.config.modules.directory.options.truncate_to_repo === true);\n\t\t\tif (!gitReachable) return undefined;\n\t\t\ttry {\n\t\t\t\treturn await readGitSnapshot(pi, input.cwd, {\n\t\t\t\t\tincludeMetrics: requirements.has(\"git_metrics\"),\n\t\t\t\t\tincludeTag: requirements.get(\"git_commit\")?.has(\"tag\") ?? false,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\tequal: gitSnapshotEqual,\n\t\tpublish(snapshot) {\n\t\t\truntime.git = snapshot;\n\t\t\trefresh();\n\t\t},\n\t});\n\tconst githubPrController = new AsyncRefreshController<\n\t\tPick<RefreshTarget, \"cwd\">,\n\t\tGithubPrSnapshot | undefined\n\t>({\n\t\tread: (input, signal) => queryGithubPr(githubPrExec, input.cwd, signal),\n\t\tequal: githubPrSnapshotEqual,\n\t\tpublish(snapshot) {\n\t\t\truntime.githubPr = snapshot;\n\t\t\tscheduleGithubPrExpiry(snapshot);\n\t\t\trefresh();\n\t\t},\n\t});\n\tconst workspaceController = new AsyncRefreshController<WorkspaceRefreshInput, WorkspaceSnapshot>({\n\t\tasync read(input, signal) {\n\t\t\ttry {\n\t\t\t\treturn await collectWorkspaceSnapshot({ ...input, signal });\n\t\t\t} catch {\n\t\t\t\treturn { modules: {} };\n\t\t\t}\n\t\t},\n\t\tequal: workspaceSnapshotEqual,\n\t\tpublish(snapshot) {\n\t\t\truntime.workspace = snapshot;\n\t\t\trefresh();\n\t\t},\n\t});\n\n\tconst clearDebounce = () => {\n\t\tif (!eventDebounceTimer) return;\n\t\tclearTimeout(eventDebounceTimer);\n\t\teventDebounceTimer = undefined;\n\t};\n\tconst isActiveTarget = (target: RefreshTarget) =>\n\t\tactiveTarget?.cwd === target.cwd &&\n\t\tactiveTarget.generation === target.generation &&\n\t\tactiveTarget.sessionManager === target.sessionManager &&\n\t\ttarget.generation === sessionGeneration;\n\n\tconst requestRefresh = (\n\t\ttarget: RefreshTarget,\n\t\treason: WorkspaceRefreshInput[\"reason\"] = \"event\",\n\t) => {\n\t\tif (!loaded || !isActiveTarget(target)) return;\n\t\tgitController.request({ cwd: target.cwd, config: loaded.config });\n\t\tworkspaceController.request(\n\t\t\tworkspaceInput(target.cwd, loaded.config, reason, runtime.workspace),\n\t\t);\n\t};\n\tconst scheduleRefresh = (ctx: ExtensionContext) => {\n\t\tconst target = activeTarget;\n\t\tif (!target || target.cwd !== ctx.cwd || target.sessionManager !== ctx.sessionManager) {\n\t\t\treturn;\n\t\t}\n\t\tclearDebounce();\n\t\teventDebounceTimer = setTimeout(() => {\n\t\t\teventDebounceTimer = undefined;\n\t\t\trequestRefresh(target);\n\t\t}, EVENT_DEBOUNCE_MS);\n\t};\n\n\tfunction restartLocalControllers(target: RefreshTarget) {\n\t\tif (!isActiveTarget(target)) return;\n\t\tgitController.start(target.generation);\n\t\tworkspaceController.start(target.generation);\n\t}\n\n\tfunction clearGithubPrTimers() {\n\t\tif (githubPrRefreshTimer) clearInterval(githubPrRefreshTimer);\n\t\tif (githubPrExpiryTimer) clearTimeout(githubPrExpiryTimer);\n\t\tgithubPrRefreshTimer = undefined;\n\t\tgithubPrExpiryTimer = undefined;\n\t}\n\n\tfunction stopGithubPr() {\n\t\tclearGithubPrTimers();\n\t\tgithubPrController.stop();\n\t\truntime.githubPr = undefined;\n\t}\n\n\tfunction githubPrReachable(): boolean {\n\t\treturn Boolean(loaded && reachableModuleRequirements(loaded.config).has(\"github_pr\"));\n\t}\n\n\tfunction startGithubPr(target: RefreshTarget): boolean {\n\t\tif (!isActiveTarget(target)) return false;\n\t\tstopGithubPr();\n\t\tif (!githubPrReachable()) return false;\n\t\tgithubPrController.start(++githubPrGeneration);\n\t\tgithubPrRefreshTimer = setInterval(() => {\n\t\t\trequestGithubPr(target);\n\t\t}, GITHUB_PR_REFRESH_INTERVAL_MS);\n\t\tgithubPrRefreshTimer.unref?.();\n\t\treturn true;\n\t}\n\n\tfunction requestGithubPr(target: RefreshTarget) {\n\t\tif (!isActiveTarget(target) || !githubPrReachable()) return;\n\t\tgithubPrController.request({ cwd: target.cwd });\n\t}\n\n\tfunction scheduleGithubPrExpiry(snapshot: GithubPrSnapshot | undefined) {\n\t\tif (githubPrExpiryTimer) clearTimeout(githubPrExpiryTimer);\n\t\tgithubPrExpiryTimer = undefined;\n\t\tif (snapshot?.expiresAt === undefined) return;\n\t\tconst target = activeTarget;\n\t\tif (!target) return;\n\t\tconst delay = snapshot.expiresAt - Date.now();\n\t\tif (delay <= 0) {\n\t\t\truntime.githubPr = undefined;\n\t\t\tgithubPrController.clear();\n\t\t\trefresh();\n\t\t\treturn;\n\t\t}\n\t\tgithubPrExpiryTimer = setTimeout(\n\t\t\t() => {\n\t\t\t\tgithubPrExpiryTimer = undefined;\n\t\t\t\tif (!isActiveTarget(target) || runtime.githubPr !== snapshot) return;\n\t\t\t\tscheduleGithubPrExpiry(snapshot);\n\t\t\t},\n\t\t\tMath.min(delay, MAX_TIMER_DELAY_MS),\n\t\t);\n\t\tgithubPrExpiryTimer.unref?.();\n\t}\n\n\tconst installFooter = (ctx: ExtensionContext) => {\n\t\tconst generation = ++sessionGeneration;\n\t\tsessionOwner = ctx.sessionManager;\n\t\tpreviewLoaded = undefined;\n\t\tmenuController.abort(new DOMException(\"Starship session context replaced\", \"AbortError\"));\n\t\tmenuController = new AbortController();\n\t\tconst target: RefreshTarget = { cwd: ctx.cwd, generation, sessionManager: ctx.sessionManager };\n\t\tclearDebounce();\n\t\tgitController.stop();\n\t\tworkspaceController.stop();\n\t\tstopGithubPr();\n\t\truntime.git = undefined;\n\t\truntime.workspace = undefined;\n\t\truntime.requestRender = undefined;\n\t\truntime.renderPreview = undefined;\n\t\truntime.inspect = undefined;\n\t\truntime.footerWidth = undefined;\n\t\tactiveTarget = ctx.mode === \"tui\" ? target : undefined;\n\t\tctx.ui.setStatus(\"starship\", undefined);\n\t\tif (!activeTarget || !loaded) return;\n\t\tgitController.start(generation);\n\t\tworkspaceController.start(generation);\n\t\tstartGithubPr(target);\n\n\t\tctx.ui.setFooter((tui, _theme, footerData) => {\n\t\t\truntime.requestRender = () => tui.requestRender();\n\t\t\truntime.renderPreview = (preview, width) => {\n\t\t\t\tconst snapshot = runtimeSnapshot(ctx, footerData, runtime);\n\t\t\t\treturn wrapFormattedStatusline(\n\t\t\t\t\trenderStatusline(preview.config, snapshot, width).ansi,\n\t\t\t\t\twidth,\n\t\t\t\t);\n\t\t\t};\n\t\t\truntime.inspect = (current) =>\n\t\t\t\tinspectStatuslineModules(\n\t\t\t\t\tcurrent.config,\n\t\t\t\t\truntimeSnapshot(ctx, footerData, runtime),\n\t\t\t\t\truntime.footerWidth ?? 80,\n\t\t\t\t);\n\t\t\tconst unsubscribe = footerData.onBranchChange(() => {\n\t\t\t\tif (!isActiveTarget(target)) return;\n\t\t\t\truntime.git = undefined;\n\t\t\t\trestartLocalControllers(target);\n\t\t\t\tclearDebounce();\n\t\t\t\tstartGithubPr(target);\n\t\t\t\trequestRefresh(target);\n\t\t\t\trequestGithubPr(target);\n\t\t\t\ttui.requestRender();\n\t\t\t});\n\t\t\tconst timer = setInterval(() => {\n\t\t\t\tif (!isActiveTarget(target)) return;\n\t\t\t\tclearDebounce();\n\t\t\t\trequestRefresh(target, \"periodic\");\n\t\t\t\ttui.requestRender();\n\t\t\t}, REFRESH_INTERVAL_MS);\n\t\t\tlet disposed = false;\n\n\t\t\treturn {\n\t\t\t\tdispose() {\n\t\t\t\t\tif (disposed) return;\n\t\t\t\t\tdisposed = true;\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tclearInterval(timer);\n\t\t\t\t\tif (isActiveTarget(target)) {\n\t\t\t\t\t\tactiveTarget = undefined;\n\t\t\t\t\t\tclearDebounce();\n\t\t\t\t\t\tgitController.stop();\n\t\t\t\t\t\tworkspaceController.stop();\n\t\t\t\t\t\tstopGithubPr();\n\t\t\t\t\t\truntime.git = undefined;\n\t\t\t\t\t\truntime.workspace = undefined;\n\t\t\t\t\t\truntime.requestRender = undefined;\n\t\t\t\t\t\truntime.renderPreview = undefined;\n\t\t\t\t\t\truntime.inspect = undefined;\n\t\t\t\t\t\truntime.footerWidth = undefined;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tinvalidate() {},\n\t\t\t\trender(width: number): string[] {\n\t\t\t\t\truntime.footerWidth = width;\n\t\t\t\t\tconst current = previewLoaded ?? loaded;\n\t\t\t\t\tif (!current) return [];\n\t\t\t\t\tconst snapshot = runtimeSnapshot(ctx, footerData, runtime);\n\t\t\t\t\treturn wrapFormattedStatusline(\n\t\t\t\t\t\trenderStatusline(current.config, snapshot, width).ansi,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t\trequestRefresh(target, \"initial\");\n\t\trequestGithubPr(target);\n\t};\n\n\tconst configPath = settingsFilePath(getAgentDir());\n\tconst commandOptions: StarshipCommandOptions = {\n\t\tsettingsPath: configPath,\n\t\tgetLoaded: () => loaded ?? loadStarshipConfig(configPath),\n\t\tgetLoadedRevision: () => loadedRevision,\n\t\tgetInspection: () => {\n\t\t\tconst current = loaded ?? loadStarshipConfig(configPath);\n\t\t\treturn runtime.inspect?.(current);\n\t\t},\n\t\tgetMenuOwner: () => {\n\t\t\tconst generation = sessionGeneration;\n\t\t\treturn {\n\t\t\t\tsignal: menuController.signal,\n\t\t\t\tisCurrent: () => generation === sessionGeneration && !menuController.signal.aborted,\n\t\t\t};\n\t\t},\n\t\tapply(next, ctx) {\n\t\t\tif (sessionOwner !== ctx.sessionManager) {\n\t\t\t\tthrow new Error(\"Starship session context was replaced\");\n\t\t\t}\n\t\t\tpreviewLoaded = undefined;\n\t\t\tloaded = next;\n\t\t\tloadedRevision += 1;\n\t\t\tconst target = activeTarget;\n\t\t\tif (target) {\n\t\t\t\trestartLocalControllers(target);\n\t\t\t\tstartGithubPr(target);\n\t\t\t\trequestRefresh(target);\n\t\t\t\trequestGithubPr(target);\n\t\t\t}\n\t\t\trefresh();\n\t\t},\n\t\tpreview(next, ctx) {\n\t\t\tif (sessionOwner !== ctx.sessionManager) return;\n\t\t\tpreviewLoaded = next;\n\t\t\trefresh();\n\t\t},\n\t\trenderPreview(preview, width) {\n\t\t\treturn (\n\t\t\t\truntime.renderPreview?.(preview, width) ?? [\n\t\t\t\t\t\"Live preview is unavailable until the footer is ready.\",\n\t\t\t\t]\n\t\t\t);\n\t\t},\n\t};\n\tpi.registerCommand(\"starship\", {\n\t\tdescription: \"Customize or inspect the native Starship-style footer\",\n\t\tgetArgumentCompletions: completeStarshipArguments,\n\t\thandler: async (args, ctx) => {\n\t\t\tconst commands = await loadStarshipCommands();\n\t\t\tif (sessionOwner !== ctx.sessionManager) return;\n\t\t\tawait commands.handleStarshipCommand(args, ctx, commandOptions);\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tloaded = loadStarshipConfig(configPath);\n\t\tloadedRevision += 1;\n\t\tif (loaded.diagnostics.length > 0 && (ctx.mode === \"tui\" || ctx.hasUI)) {\n\t\t\tctx.ui.notify(formatDiagnostics(loaded), \"warning\");\n\t\t}\n\t\truntime.thinkingLevel = pi.getThinkingLevel();\n\t\tinstallFooter(ctx);\n\t});\n\n\tpi.on(\"session_tree\", (_event, ctx) => {\n\t\tinstallFooter(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tif (sessionOwner !== ctx.sessionManager) return;\n\t\tsessionOwner = undefined;\n\t\tpreviewLoaded = undefined;\n\t\tsessionGeneration += 1;\n\t\tmenuController.abort(new DOMException(\"Starship session shut down\", \"AbortError\"));\n\t\tactiveTarget = undefined;\n\t\tclearDebounce();\n\t\tgitController.stop();\n\t\tworkspaceController.stop();\n\t\tstopGithubPr();\n\t\truntime.git = undefined;\n\t\truntime.workspace = undefined;\n\t\truntime.requestRender = undefined;\n\t\truntime.renderPreview = undefined;\n\t\truntime.inspect = undefined;\n\t\truntime.footerWidth = undefined;\n\t\tctx.ui.setFooter(undefined);\n\t\tctx.ui.setStatus(\"starship\", undefined);\n\t});\n\n\tpi.on(\"model_select\", () => refresh());\n\tpi.on(\"thinking_level_select\", (event) => {\n\t\truntime.thinkingLevel = event.level;\n\t\trefresh();\n\t});\n\tpi.on(\"agent_start\", () => {\n\t\truntime.isStreaming = true;\n\t\trefresh();\n\t});\n\tpi.on(\"agent_end\", (_event, ctx) => {\n\t\truntime.isStreaming = false;\n\t\tscheduleRefresh(ctx);\n\t\tconst target = activeTarget;\n\t\tif (target?.sessionManager === ctx.sessionManager) requestGithubPr(target);\n\t\trefresh();\n\t});\n\tpi.on(\"turn_start\", () => {\n\t\truntime.isStreaming = true;\n\t\trefresh();\n\t});\n\tpi.on(\"turn_end\", (_event, ctx) => {\n\t\tscheduleRefresh(ctx);\n\t\trefresh();\n\t});\n\tpi.on(\"tool_execution_start\", (event) => {\n\t\truntime.activeTools.set(event.toolName, (runtime.activeTools.get(event.toolName) ?? 0) + 1);\n\t\trefresh();\n\t});\n\tpi.on(\"tool_execution_end\", (event, ctx) => {\n\t\tconst count = runtime.activeTools.get(event.toolName) ?? 0;\n\t\tif (count <= 1) runtime.activeTools.delete(event.toolName);\n\t\telse runtime.activeTools.set(event.toolName, count - 1);\n\t\truntime.lastCompletedTool = event.toolName;\n\t\tscheduleRefresh(ctx);\n\t\trefresh();\n\t});\n}\n\nfunction workspaceInput(\n\tcwd: string,\n\tconfig: StarshipConfig,\n\treason: WorkspaceRefreshInput[\"reason\"],\n\tprevious: WorkspaceSnapshot | undefined,\n): WorkspaceRefreshInput {\n\treturn {\n\t\tcwd,\n\t\tconfig,\n\t\tenvironment: allowlistedEnvironment(config),\n\t\thomeDir: homedir(),\n\t\tplatform: process.platform,\n\t\thostname: hostname(),\n\t\tusername: safeUsername(),\n\t\texec: execWorkspaceCommand,\n\t\treason,\n\t\tprevious,\n\t};\n}\n\nconst ENVIRONMENT_ALLOWLIST = [\n\t\"AWS_CONFIG_FILE\",\n\t\"AWS_DEFAULT_PROFILE\",\n\t\"AWS_DEFAULT_REGION\",\n\t\"AWS_PROFILE\",\n\t\"AWS_REGION\",\n\t\"AZURE_CONFIG_DIR\",\n\t\"CLOUDSDK_ACTIVE_CONFIG_NAME\",\n\t\"CLOUDSDK_CONFIG\",\n\t\"CODESPACES\",\n\t\"CONDA_DEFAULT_ENV\",\n\t\"DOCKER_CONFIG\",\n\t\"DOCKER_CONTEXT\",\n\t\"GUIX_ENVIRONMENT\",\n\t\"IN_NIX_SHELL\",\n\t\"KUBECONFIG\",\n\t\"LOGNAME\",\n\t\"NIX_SHELL_LEVEL\",\n\t\"NIX_SHELL_NAME\",\n\t\"OS_CLIENT_CONFIG_FILE\",\n\t\"OS_CLOUD\",\n\t\"OS_PROJECT_NAME\",\n\t\"PATH\",\n\t\"PIXI_ENVIRONMENT_NAME\",\n\t\"PIXI_PROJECT_NAME\",\n\t\"PYENV_VERSION\",\n\t\"REMOTE_CONTAINERS\",\n\t\"RUSTC\",\n\t\"RUSTUP_TOOLCHAIN\",\n\t\"SSH_CONNECTION\",\n\t\"SSH_TTY\",\n\t\"TF_DATA_DIR\",\n\t\"TF_WORKSPACE\",\n\t\"USER\",\n\t\"USERNAME\",\n\t\"VIRTUAL_ENV\",\n\t\"WSL_DISTRO_NAME\",\n] as const;\n\nfunction allowlistedEnvironment(config: StarshipConfig): Record<string, string | undefined> {\n\tconst result: Record<string, string | undefined> = {};\n\tconst configured = config.modules.username.options.detect_env_vars;\n\tconst names = new Set([\n\t\t...ENVIRONMENT_ALLOWLIST,\n\t\t...(Array.isArray(configured)\n\t\t\t? configured.filter((name): name is string => typeof name === \"string\")\n\t\t\t: []),\n\t]);\n\tfor (const name of names) result[name] = process.env[name];\n\treturn result;\n}\n\nfunction safeUsername(): string {\n\ttry {\n\t\treturn userInfo().username;\n\t} catch {\n\t\treturn process.env.USER ?? process.env.USERNAME ?? \"\";\n\t}\n}\n\nfunction runtimeSnapshot(\n\tctx: ExtensionContext,\n\tfooterData: ReadonlyFooterDataProvider,\n\truntime: RuntimeState,\n): StarshipRuntimeSnapshot {\n\treturn {\n\t\tcwd: ctx.cwd,\n\t\thomeDir: homedir(),\n\t\tgitRoot: runtime.git?.root,\n\t\tmodel: ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : undefined,\n\t\tthinkingLevel: runtime.thinkingLevel,\n\t\tturnCount: userTurnCount(ctx),\n\t\tactiveTools: runtime.activeTools,\n\t\tisStreaming: runtime.isStreaming,\n\t\tlastCompletedTool: runtime.lastCompletedTool,\n\t\tcontextUsage: ctx.getContextUsage() ?? undefined,\n\t\ttokenTotals: summarizeFooterUsage(ctx.sessionManager.getEntries()),\n\t\tusingSubscription: isSubscriptionBacked(ctx),\n\t\tgitBranch: runtime.git?.branch?.name ?? footerData.getGitBranch(),\n\t\tgitBranchDetails: runtime.git?.branch,\n\t\tgitCommit: runtime.git?.commit,\n\t\tgitState: runtime.git?.state,\n\t\tgitMetrics: runtime.git?.metrics,\n\t\tgitStatus: runtime.git?.status,\n\t\tgitWorktree: runtime.git?.worktree,\n\t\tgithubPr: runtime.githubPr,\n\t\tworkspace: runtime.workspace,\n\t\textensionStatuses: footerData.getExtensionStatuses(),\n\t\tnow: new Date(),\n\t};\n}\n\nfunction userTurnCount(ctx: ExtensionContext): number {\n\treturn ctx.sessionManager\n\t\t.getBranch()\n\t\t.filter((entry) => entry.type === \"message\" && entry.message.role === \"user\").length;\n}\n\nfunction isSubscriptionBacked(ctx: ExtensionContext): boolean {\n\tconst model = ctx.model;\n\treturn (\n\t\tmodel !== undefined &&\n\t\t(model.provider === \"kimi-coding\" || ctx.modelRegistry.isUsingOAuth(model))\n\t);\n}\n\nfunction formatDiagnostics(loaded: LoadedStarshipConfig): string {\n\tconst details = loaded.diagnostics.slice(0, 5).map((item) => item.message);\n\tconst remaining = loaded.diagnostics.length - details.length;\n\treturn [\n\t\t`pi-starship settings: ${details.join(\"; \")}`,\n\t\t...(remaining > 0 ? [`+${remaining} more`] : []),\n\t].join(\" \");\n}\n\nexport function wrapFormattedStatusline(format: string, width: number): string[] {\n\tif (width <= 0) return [];\n\treturn wrapTextWithAnsi(format, width);\n}\n\nexport {\n\tparseGitDiffShortstat,\n\tparseGitState,\n\tparseGitStatusPorcelain,\n\tparseGitStatusPorcelainV2,\n\tparseGitWorktree,\n} from \"./modules/git/runtime.js\";\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport type {\n\tGitBranchSnapshot,\n\tGitCommitSnapshot,\n\tGitMetricsSnapshot,\n\tGitSnapshot,\n\tGitStateSnapshot,\n\tGitStatusSnapshot,\n\tGitWorktreeSnapshot,\n} from \"../types.js\";\n\nconst GIT_TIMEOUT_MS = 3_000;\n\nexport interface ReadGitSnapshotOptions {\n\tincludeMetrics: boolean;\n\tincludeTag: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport async function readGitSnapshot(\n\tpi: ExtensionAPI,\n\tcwd: string,\n\toptions: ReadGitSnapshotOptions,\n): Promise<GitSnapshot | undefined> {\n\tconst statusPromise = pi.exec(\n\t\t\"git\",\n\t\t[\n\t\t\t\"--no-optional-locks\",\n\t\t\t\"status\",\n\t\t\t\"--porcelain=v2\",\n\t\t\t\"--branch\",\n\t\t\t\"--show-stash\",\n\t\t\t\"--untracked-files=normal\",\n\t\t],\n\t\t{ cwd, signal: options.signal, timeout: GIT_TIMEOUT_MS },\n\t);\n\tconst metadataPromise = pi.exec(\n\t\t\"git\",\n\t\t[\"rev-parse\", \"--path-format=absolute\", \"--show-toplevel\", \"--git-common-dir\", \"--git-dir\"],\n\t\t{ cwd, signal: options.signal, timeout: GIT_TIMEOUT_MS },\n\t);\n\tconst metricsPromise = options.includeMetrics\n\t\t? pi.exec(\"git\", [\"--no-optional-locks\", \"diff\", \"--shortstat\", \"HEAD\", \"--\"], {\n\t\t\t\tcwd,\n\t\t\t\tsignal: options.signal,\n\t\t\t\ttimeout: GIT_TIMEOUT_MS,\n\t\t\t})\n\t\t: Promise.resolve(undefined);\n\tconst tagPromise = options.includeTag\n\t\t? pi.exec(\"git\", [\"describe\", \"--tags\", \"--exact-match\", \"HEAD\"], {\n\t\t\t\tcwd,\n\t\t\t\tsignal: options.signal,\n\t\t\t\ttimeout: GIT_TIMEOUT_MS,\n\t\t\t})\n\t\t: Promise.resolve(undefined);\n\n\tconst [statusResult, metadataResult, metricsResult, tagResult] = await Promise.all([\n\t\tstatusPromise,\n\t\tmetadataPromise,\n\t\tmetricsPromise,\n\t\ttagPromise,\n\t]);\n\tif (statusResult.code !== 0 || statusResult.killed) return undefined;\n\n\tconst parsed = parseGitStatusPorcelainV2(statusResult.stdout);\n\tconst metadata =\n\t\tmetadataResult.code === 0 && !metadataResult.killed\n\t\t\t? parseGitRepositoryMetadata(metadataResult.stdout)\n\t\t\t: undefined;\n\tconst commit = withTag(parsed.commit, tagResult);\n\tconst metrics =\n\t\tmetricsResult && metricsResult.code === 0 && !metricsResult.killed\n\t\t\t? parseGitDiffShortstat(metricsResult.stdout)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...parsed,\n\t\troot: metadata?.root,\n\t\tcommit,\n\t\tstate: metadata ? parseGitState(metadata.gitDirectory) : undefined,\n\t\tmetrics,\n\t\tworktree: metadata?.worktree,\n\t};\n}\n\nexport async function readGitStatus(\n\tpi: ExtensionAPI,\n\tcwd: string,\n): Promise<GitStatusSnapshot | undefined> {\n\tconst result = await pi.exec(\n\t\t\"git\",\n\t\t[\n\t\t\t\"--no-optional-locks\",\n\t\t\t\"status\",\n\t\t\t\"--porcelain=v2\",\n\t\t\t\"--branch\",\n\t\t\t\"--show-stash\",\n\t\t\t\"--untracked-files=normal\",\n\t\t],\n\t\t{ cwd, timeout: GIT_TIMEOUT_MS },\n\t);\n\tif (result.code !== 0 || result.killed) return undefined;\n\treturn parseGitStatusPorcelainV2(result.stdout).status;\n}\n\nexport async function readGitWorktree(\n\tpi: ExtensionAPI,\n\tcwd: string,\n): Promise<GitWorktreeSnapshot | undefined> {\n\tconst result = await pi.exec(\n\t\t\"git\",\n\t\t[\"rev-parse\", \"--path-format=absolute\", \"--show-toplevel\", \"--git-common-dir\", \"--git-dir\"],\n\t\t{ cwd, timeout: GIT_TIMEOUT_MS },\n\t);\n\tif (result.code !== 0 || result.killed) return undefined;\n\treturn parseGitRepositoryMetadata(result.stdout)?.worktree;\n}\n\ninterface ParsedGitStatus {\n\tbranch?: GitBranchSnapshot;\n\tcommit?: GitCommitSnapshot;\n\tstatus: GitStatusSnapshot;\n}\n\nexport function parseGitStatusPorcelainV2(output: string): ParsedGitStatus {\n\tconst status = emptyGitStatus();\n\tlet branchName: string | undefined;\n\tlet commitHash: string | undefined;\n\tlet upstream: string | undefined;\n\n\tfor (const line of output.split(/\\r?\\n/u)) {\n\t\tif (!line) continue;\n\t\tif (line.startsWith(\"# branch.oid \")) {\n\t\t\tconst value = line.slice(\"# branch.oid \".length).trim();\n\t\t\tif (value && value !== \"(initial)\") commitHash = value;\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# branch.head \")) {\n\t\t\tbranchName = line.slice(\"# branch.head \".length).trim();\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# branch.upstream \")) {\n\t\t\tupstream = line.slice(\"# branch.upstream \".length).trim();\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# branch.ab \")) {\n\t\t\tconst match = /^# branch\\.ab \\+(\\d+) -(\\d+)$/u.exec(line);\n\t\t\tstatus.ahead = match?.[1] ? Number(match[1]) : 0;\n\t\t\tstatus.behind = match?.[2] ? Number(match[2]) : 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# stash \")) {\n\t\t\tconst count = Number(line.slice(\"# stash \".length));\n\t\t\tstatus.stashed = Number.isSafeInteger(count) && count > 0 ? count : 0;\n\t\t\tcontinue;\n\t\t}\n\t\taddPorcelainV2Status(status, line);\n\t}\n\tfinalizeStatus(status);\n\n\tconst detached = branchName === \"(detached)\";\n\tconst remote = splitUpstream(upstream);\n\tconst branch = branchName\n\t\t? {\n\t\t\t\tname: detached ? \"HEAD\" : branchName,\n\t\t\t\t...remote,\n\t\t\t\tdetached,\n\t\t\t}\n\t\t: undefined;\n\tconst commit = commitHash ? { hash: commitHash, detached } : undefined;\n\treturn { branch, commit, status };\n}\n\nexport function parseGitStatusPorcelain(output: string): GitStatusSnapshot {\n\tconst status = emptyGitStatus();\n\tfor (const line of output.split(/\\r?\\n/u)) {\n\t\tif (!line) continue;\n\t\tif (line.startsWith(\"## \")) {\n\t\t\tconst ahead = /\\bahead (\\d+)/u.exec(line);\n\t\t\tconst behind = /\\bbehind (\\d+)/u.exec(line);\n\t\t\tstatus.ahead = ahead?.[1] ? Number(ahead[1]) : 0;\n\t\t\tstatus.behind = behind?.[1] ? Number(behind[1]) : 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst indexStatus = line[0] ?? \" \";\n\t\tconst worktreeStatus = line[1] ?? \" \";\n\t\tif (indexStatus === \"?\" && worktreeStatus === \"?\") {\n\t\t\tstatus.untracked += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isConflict(indexStatus, worktreeStatus)) {\n\t\t\tstatus.conflicted += 1;\n\t\t\tcontinue;\n\t\t}\n\t\taddNormalStatus(status, indexStatus, worktreeStatus);\n\t\tif (indexStatus === \"R\" || indexStatus === \"C\") status.renamed += 1;\n\t}\n\tfinalizeStatus(status);\n\treturn status;\n}\n\nexport function parseGitDiffShortstat(output: string): GitMetricsSnapshot {\n\treturn {\n\t\tadded: parseShortstatMetric(output, \"insertion(+)\", \"insertions(+)\") ?? 0,\n\t\tdeleted: parseShortstatMetric(output, \"deletion(-)\", \"deletions(-)\") ?? 0,\n\t};\n}\n\nfunction parseShortstatMetric(\n\toutput: string,\n\tsingularLabel: string,\n\tpluralLabel: string,\n): number | undefined {\n\tfor (const field of output.split(\",\")) {\n\t\tconst trimmed = field.trim();\n\t\tconst separator = trimmed.indexOf(\" \");\n\t\tif (separator <= 0) continue;\n\t\tconst label = trimmed.slice(separator + 1).trimStart();\n\t\tif (label !== singularLabel && label !== pluralLabel) continue;\n\t\tconst countText = trimmed.slice(0, separator);\n\t\tfor (const character of countText) {\n\t\t\tif (character < \"0\" || character > \"9\") return undefined;\n\t\t}\n\t\tconst count = Number(countText);\n\t\treturn Number.isSafeInteger(count) ? count : undefined;\n\t}\n\treturn undefined;\n}\n\nexport function parseGitState(gitDirectory: string): GitStateSnapshot | undefined {\n\tconst rebaseMerge = join(gitDirectory, \"rebase-merge\");\n\tif (existsSync(rebaseMerge))\n\t\treturn operationWithProgress(\"REBASING\", rebaseMerge, \"msgnum\", \"end\");\n\n\tconst rebaseApply = join(gitDirectory, \"rebase-apply\");\n\tif (existsSync(rebaseApply)) {\n\t\tconst state = existsSync(join(rebaseApply, \"applying\"))\n\t\t\t? \"AM\"\n\t\t\t: existsSync(join(rebaseApply, \"rebasing\"))\n\t\t\t\t? \"REBASING\"\n\t\t\t\t: \"AM/REBASE\";\n\t\treturn operationWithProgress(state, rebaseApply, \"next\", \"last\");\n\t}\n\tif (existsSync(join(gitDirectory, \"MERGE_HEAD\"))) return { state: \"MERGING\" };\n\tif (existsSync(join(gitDirectory, \"REVERT_HEAD\"))) return { state: \"REVERTING\" };\n\tif (existsSync(join(gitDirectory, \"CHERRY_PICK_HEAD\"))) return { state: \"CHERRY-PICKING\" };\n\tif (existsSync(join(gitDirectory, \"BISECT_LOG\"))) return { state: \"BISECTING\" };\n\treturn undefined;\n}\n\ninterface GitRepositoryMetadata {\n\troot: string;\n\tgitDirectory: string;\n\tworktree?: GitWorktreeSnapshot;\n}\n\nfunction parseGitRepositoryMetadata(output: string): GitRepositoryMetadata | undefined {\n\tconst lines = output.trimEnd().split(/\\r?\\n/u);\n\tif (lines.length !== 3) return undefined;\n\tconst [path, commonDir, gitDirectory] = lines;\n\tif (!path || !commonDir || !gitDirectory) return undefined;\n\tif (![path, commonDir, gitDirectory].every(isAbsolute)) return undefined;\n\treturn {\n\t\troot: path,\n\t\tgitDirectory,\n\t\tworktree: samePath(commonDir, gitDirectory)\n\t\t\t? undefined\n\t\t\t: { name: basename(path) || path, path },\n\t};\n}\n\nexport function parseGitWorktree(output: string): GitWorktreeSnapshot | undefined {\n\treturn parseGitRepositoryMetadata(output)?.worktree;\n}\n\nfunction addPorcelainV2Status(status: GitStatusSnapshot, line: string) {\n\tconst kind = line[0];\n\tif (kind === \"?\") {\n\t\tstatus.untracked += 1;\n\t\treturn;\n\t}\n\tif (kind === \"u\") {\n\t\tstatus.conflicted += 1;\n\t\treturn;\n\t}\n\tif (kind !== \"1\" && kind !== \"2\") return;\n\tconst indexStatus = line[2] ?? \".\";\n\tconst worktreeStatus = line[3] ?? \".\";\n\taddNormalStatus(status, indexStatus, worktreeStatus);\n\tif (kind === \"2\") status.renamed += 1;\n}\n\nfunction addNormalStatus(status: GitStatusSnapshot, indexStatus: string, worktreeStatus: string) {\n\tif (indexStatus === \"A\") status.indexAdded += 1;\n\tif (indexStatus === \"D\") status.indexDeleted += 1;\n\tif (indexStatus === \"M\") status.indexModified += 1;\n\tif (indexStatus === \"T\") status.indexTypechanged += 1;\n\tif (worktreeStatus === \"A\") status.worktreeAdded += 1;\n\tif (worktreeStatus === \"D\") status.worktreeDeleted += 1;\n\tif (worktreeStatus === \"M\") status.worktreeModified += 1;\n\tif (worktreeStatus === \"T\") status.worktreeTypechanged += 1;\n}\n\nfunction finalizeStatus(status: GitStatusSnapshot) {\n\tstatus.deleted = status.worktreeDeleted + status.indexDeleted;\n\tstatus.modified = status.worktreeModified + status.worktreeAdded;\n\tstatus.staged = status.indexModified + status.indexAdded + status.indexTypechanged;\n\tstatus.typechanged = status.worktreeTypechanged;\n}\n\nfunction emptyGitStatus(): GitStatusSnapshot {\n\treturn {\n\t\tahead: 0,\n\t\tbehind: 0,\n\t\tstashed: 0,\n\t\tconflicted: 0,\n\t\tdeleted: 0,\n\t\trenamed: 0,\n\t\tmodified: 0,\n\t\tstaged: 0,\n\t\ttypechanged: 0,\n\t\tuntracked: 0,\n\t\tworktreeAdded: 0,\n\t\tworktreeDeleted: 0,\n\t\tworktreeModified: 0,\n\t\tworktreeTypechanged: 0,\n\t\tindexAdded: 0,\n\t\tindexDeleted: 0,\n\t\tindexModified: 0,\n\t\tindexTypechanged: 0,\n\t};\n}\n\nfunction splitUpstream(upstream: string | undefined): {\n\tremoteName?: string;\n\tremoteBranch?: string;\n} {\n\tif (!upstream) return {};\n\tconst separator = upstream.indexOf(\"/\");\n\tif (separator <= 0 || separator === upstream.length - 1) return { remoteBranch: upstream };\n\treturn {\n\t\tremoteName: upstream.slice(0, separator),\n\t\tremoteBranch: upstream.slice(separator + 1),\n\t};\n}\n\nfunction withTag(\n\tcommit: GitCommitSnapshot | undefined,\n\tresult:\n\t\t| {\n\t\t\t\tstdout: string;\n\t\t\t\tcode: number;\n\t\t\t\tkilled: boolean;\n\t\t  }\n\t\t| undefined,\n): GitCommitSnapshot | undefined {\n\tif (!commit || !result || result.code !== 0 || result.killed) return commit;\n\tconst tag = result.stdout.trim();\n\treturn tag ? { ...commit, tag: tag.split(/\\r?\\n/u)[0] } : commit;\n}\n\nfunction operationWithProgress(\n\tstate: string,\n\tdirectory: string,\n\tcurrentName: string,\n\ttotalName: string,\n): GitStateSnapshot {\n\tconst progressCurrent = readPositiveInteger(join(directory, currentName));\n\tconst progressTotal = readPositiveInteger(join(directory, totalName));\n\treturn progressCurrent !== undefined && progressTotal !== undefined\n\t\t? { state, progressCurrent, progressTotal }\n\t\t: { state };\n}\n\nfunction readPositiveInteger(path: string): number | undefined {\n\ttry {\n\t\tconst value = Number(readFileSync(path, \"utf8\").trim());\n\t\treturn Number.isSafeInteger(value) && value > 0 ? value : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction samePath(left: string, right: string): boolean {\n\tconst normalizedLeft = resolve(left);\n\tconst normalizedRight = resolve(right);\n\treturn process.platform === \"win32\"\n\t\t? normalizedLeft.toLowerCase() === normalizedRight.toLowerCase()\n\t\t: normalizedLeft === normalizedRight;\n}\n\nfunction isConflict(indexStatus: string, worktreeStatus: string): boolean {\n\treturn (\n\t\t(indexStatus === \"D\" && worktreeStatus === \"D\") ||\n\t\t(indexStatus === \"A\" && worktreeStatus === \"A\") ||\n\t\tindexStatus === \"U\" ||\n\t\tworktreeStatus === \"U\"\n\t);\n}\n\nexport function gitStatusEqual(\n\tleft: GitStatusSnapshot | undefined,\n\tright: GitStatusSnapshot | undefined,\n): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport function gitSnapshotEqual(\n\tleft: GitSnapshot | undefined,\n\tright: GitSnapshot | undefined,\n): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n", "import { spawn } from \"node:child_process\";\nimport type { WorkspaceExec } from \"./types.js\";\n\nconst FORCE_KILL_DELAY_MS = 250;\n\nexport const execWorkspaceCommand: WorkspaceExec = async (command, args, options) =>\n\tnew Promise((resolve) => {\n\t\tif (options.signal?.aborted) {\n\t\t\tresolve({ stdout: \"\", stderr: \"\", code: 1, killed: true });\n\t\t\treturn;\n\t\t}\n\n\t\tlet child: ReturnType<typeof spawn>;\n\t\ttry {\n\t\t\tchild = spawn(command, args, {\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tenv: explicitEnvironment(options.environment),\n\t\t\t\tshell: false,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t} catch {\n\t\t\tresolve({ stdout: \"\", stderr: \"\", code: 1, killed: false });\n\t\t\treturn;\n\t\t}\n\n\t\tconst stdout: Buffer[] = [];\n\t\tconst stderr: Buffer[] = [];\n\t\tlet outputBytes = 0;\n\t\tlet killed = false;\n\t\tlet settled = false;\n\t\tlet forceKillTimer: NodeJS.Timeout | undefined;\n\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\tconst finish = (code: number) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\tif (forceKillTimer) clearTimeout(forceKillTimer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", terminate);\n\t\t\tresolve({\n\t\t\t\tstdout: Buffer.concat(stdout).toString(\"utf8\"),\n\t\t\t\tstderr: Buffer.concat(stderr).toString(\"utf8\"),\n\t\t\t\tcode,\n\t\t\t\tkilled,\n\t\t\t});\n\t\t};\n\n\t\tconst signalProcessTree = (signal: NodeJS.Signals) => {\n\t\t\tconst pid = child.pid;\n\t\t\tif (pid === undefined) return;\n\t\t\tif (process.platform !== \"win32\") {\n\t\t\t\ttry {\n\t\t\t\t\tprocess.kill(-pid, signal);\n\t\t\t\t\treturn;\n\t\t\t\t} catch {\n\t\t\t\t\tchild.kill(signal);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst killer = spawn(\"taskkill.exe\", [\"/pid\", String(pid), \"/t\", \"/f\"], {\n\t\t\t\t\tstdio: \"ignore\",\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t});\n\t\t\t\tkiller.once(\"error\", () => child.kill(signal));\n\t\t\t\tkiller.unref();\n\t\t\t} catch {\n\t\t\t\tchild.kill(signal);\n\t\t\t}\n\t\t};\n\n\t\tfunction terminate() {\n\t\t\tif (killed || settled) return;\n\t\t\tkilled = true;\n\t\t\tsignalProcessTree(\"SIGTERM\");\n\t\t\tforceKillTimer = setTimeout(() => {\n\t\t\t\tsignalProcessTree(\"SIGKILL\");\n\t\t\t\tchild.stdout?.destroy();\n\t\t\t\tchild.stderr?.destroy();\n\t\t\t\tfinish(1);\n\t\t\t}, FORCE_KILL_DELAY_MS);\n\t\t}\n\n\t\tconst collect = (target: Buffer[]) => (data: Buffer | string) => {\n\t\t\tconst chunk = Buffer.isBuffer(data) ? data : Buffer.from(data);\n\t\t\tconst remaining = Math.max(0, options.maxOutputBytes - outputBytes);\n\t\t\tif (remaining > 0) target.push(chunk.subarray(0, remaining));\n\t\t\toutputBytes += chunk.byteLength;\n\t\t\tif (outputBytes > options.maxOutputBytes) terminate();\n\t\t};\n\n\t\tchild.stdout?.on(\"data\", collect(stdout));\n\t\tchild.stderr?.on(\"data\", collect(stderr));\n\t\tchild.once(\"error\", () => {\n\t\t\tif (!killed) finish(1);\n\t\t});\n\t\tchild.once(\"close\", (code) => {\n\t\t\tif (!killed) finish(code ?? 1);\n\t\t});\n\t\toptions.signal?.addEventListener(\"abort\", terminate, { once: true });\n\t\tif (options.signal?.aborted) terminate();\n\t\ttimeoutTimer = setTimeout(terminate, options.timeout);\n\t});\n\nfunction explicitEnvironment(\n\tsource: Readonly<Record<string, string | undefined>>,\n): NodeJS.ProcessEnv {\n\tconst result: NodeJS.ProcessEnv = Object.create(null);\n\tfor (const [name, value] of Object.entries(source)) {\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name) || value === undefined || value.includes(\"\\0\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tObject.defineProperty(result, name, {\n\t\t\tvalue,\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\treturn result;\n}\n", "import type { GithubPrSnapshot, GithubPrState } from \"../modules/types.js\";\nimport type { WorkspaceExec } from \"./types.js\";\n\nconst GH_TIMEOUT_MS = 10_000;\nconst MAX_GH_OUTPUT_BYTES = 128 * 1024;\nconst MAX_URL_LENGTH = 4_096;\nconst MAX_CHECKS = 1_000;\nconst MAX_FIELD_LENGTH = 128;\nconst RFC3339_TIMESTAMP =\n\t/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d{1,9})?(?:Z|[+-](\\d{2}):(\\d{2}))$/u;\nexport const TERMINAL_PR_LIFETIME_MS = 24 * 60 * 60 * 1_000;\n\nconst GH_PR_FIELDS = [\n\t\"number\",\n\t\"isDraft\",\n\t\"url\",\n\t\"state\",\n\t\"closedAt\",\n\t\"mergedAt\",\n\t\"reviewDecision\",\n\t\"statusCheckRollup\",\n] as const;\n\ninterface GithubPrQueryOptions {\n\tplatform?: NodeJS.Platform;\n\tenvironment?: Readonly<Record<string, string | undefined>>;\n}\n\ninterface CheckSummary {\n\tfailed: number;\n\tpending: number;\n\ttotal: number;\n}\n\ntype PullRequestState = \"OPEN\" | \"CLOSED\" | \"MERGED\";\ntype ReviewDecision = \"APPROVED\" | \"CHANGES_REQUESTED\" | \"REVIEW_REQUIRED\" | \"\";\n\nexport function ghPrViewInvocation(platform: NodeJS.Platform = process.platform): {\n\tcommand: string;\n\targs: string[];\n} {\n\treturn {\n\t\tcommand: platform === \"win32\" ? \"gh.exe\" : \"gh\",\n\t\targs: [\"pr\", \"view\", \"--json\", GH_PR_FIELDS.join(\",\")],\n\t};\n}\n\nexport function githubPrEnvironment(\n\tsource: Readonly<Record<string, string | undefined>> = process.env,\n): Record<string, string | undefined> {\n\tconst environment: Record<string, string | undefined> = Object.create(null);\n\tfor (const [name, value] of Object.entries(source)) {\n\t\tconst normalized = name.toUpperCase();\n\t\tif (normalized === \"GH_HOST\" || normalized === \"GH_REPO\") continue;\n\t\tObject.defineProperty(environment, name, {\n\t\t\tvalue,\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\treturn environment;\n}\n\nexport async function queryGithubPr(\n\texec: WorkspaceExec,\n\tcwd: string,\n\tsignal?: AbortSignal,\n\tnow = Date.now(),\n\toptions: GithubPrQueryOptions = {},\n): Promise<GithubPrSnapshot | undefined> {\n\tconst invocation = ghPrViewInvocation(options.platform);\n\ttry {\n\t\tconst result = await exec(invocation.command, invocation.args, {\n\t\t\tcwd,\n\t\t\tsignal,\n\t\t\ttimeout: GH_TIMEOUT_MS,\n\t\t\tmaxOutputBytes: MAX_GH_OUTPUT_BYTES,\n\t\t\tenvironment: githubPrEnvironment(options.environment),\n\t\t});\n\t\tif (result.killed || result.code !== 0) return undefined;\n\t\tif (Buffer.byteLength(result.stdout) > MAX_GH_OUTPUT_BYTES) return undefined;\n\t\treturn buildGithubPrSnapshot(JSON.parse(result.stdout), now);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function buildGithubPrSnapshot(\n\tvalue: unknown,\n\tnow = Date.now(),\n): GithubPrSnapshot | undefined {\n\ttry {\n\t\tconst pr = record(value);\n\t\tconst number = positiveInteger(pr.number);\n\t\tconst isDraft = requiredBoolean(pr.isDraft);\n\t\tconst url = requiredBoundedString(pr.url, MAX_URL_LENGTH, true);\n\t\tconst state = pullRequestState(pr.state);\n\t\tconst closedAt = optionalTimestamp(pr.closedAt);\n\t\tconst mergedAt = optionalTimestamp(pr.mergedAt);\n\t\tconst reviewDecision = reviewDecisionValue(pr.reviewDecision);\n\t\tconst checks = summarizeChecks(pr.statusCheckRollup);\n\t\tconst expiresAt = terminalExpiry(state, closedAt, mergedAt);\n\t\tif (state !== \"OPEN\" && (expiresAt === undefined || now >= expiresAt)) return undefined;\n\n\t\tconst presentationState: GithubPrState =\n\t\t\tstate === \"MERGED\" ? \"merged\" : state === \"CLOSED\" ? \"closed\" : isDraft ? \"draft\" : \"open\";\n\t\tconst checksText = formatChecks(checks);\n\t\tconst review = formatReview(reviewDecision);\n\t\tconst status = compactStatus(presentationState, checks, checksText, review);\n\t\tconst snapshot: GithubPrSnapshot = {\n\t\t\tnumber: String(number),\n\t\t\tlink: osc8Link(url, `#${number}`),\n\t\t\tstate: presentationState,\n\t\t\tchecks: checksText,\n\t\t\treview,\n\t\t\tstatus,\n\t\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t\t};\n\t\treturn Object.freeze(snapshot);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function githubPrSnapshotEqual(\n\tleft: GithubPrSnapshot | undefined,\n\tright: GithubPrSnapshot | undefined,\n): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction terminalExpiry(\n\tstate: PullRequestState,\n\tclosedAt: number | undefined,\n\tmergedAt: number | undefined,\n): number | undefined {\n\tif (state === \"OPEN\") return undefined;\n\tconst terminalAt = state === \"MERGED\" ? mergedAt : closedAt;\n\treturn terminalAt === undefined ? undefined : terminalAt + TERMINAL_PR_LIFETIME_MS;\n}\n\nfunction summarizeChecks(value: unknown): CheckSummary {\n\tif (!Array.isArray(value) || value.length > MAX_CHECKS) throw new Error(\"Invalid PR checks\");\n\tconst summary: CheckSummary = { failed: 0, pending: 0, total: value.length };\n\tfor (const item of value) {\n\t\tconst check = record(item);\n\t\tconst state = optionalUppercase(check.state);\n\t\tconst status = optionalUppercase(check.status);\n\t\tconst conclusion = optionalUppercase(check.conclusion);\n\t\tif (state === \"SUCCESS\") continue;\n\t\tif (state === \"FAILURE\" || state === \"ERROR\") {\n\t\t\tsummary.failed += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (state === \"PENDING\" || state === \"EXPECTED\") {\n\t\t\tsummary.pending += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (status && status !== \"COMPLETED\") {\n\t\t\tsummary.pending += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (conclusion === \"SUCCESS\" || conclusion === \"SKIPPED\" || conclusion === \"NEUTRAL\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tconclusion === \"FAILURE\" ||\n\t\t\tconclusion === \"CANCELLED\" ||\n\t\t\tconclusion === \"TIMED_OUT\" ||\n\t\t\tconclusion === \"ACTION_REQUIRED\" ||\n\t\t\tconclusion === \"STARTUP_FAILURE\"\n\t\t) {\n\t\t\tsummary.failed += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tsummary.pending += 1;\n\t}\n\treturn summary;\n}\n\nfunction formatChecks(checks: CheckSummary): string {\n\tif (checks.total === 0) return \"-\";\n\tconst passed = checks.total - checks.failed - checks.pending;\n\treturn [\n\t\tcompactCount(\"\u2713\", passed),\n\t\tcompactCount(\"\u00D7\", checks.failed),\n\t\tcompactCount(\"\u2026\", checks.pending),\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n}\n\nfunction compactCount(symbol: string, count: number): string {\n\treturn count > 0 ? `${symbol}${count}` : \"\";\n}\n\nfunction formatReview(review: ReviewDecision): string {\n\tif (review === \"APPROVED\") return \"R\u2713\";\n\tif (review === \"CHANGES_REQUESTED\") return \"R\u00D7\";\n\tif (review === \"REVIEW_REQUIRED\") return \"R?\";\n\treturn \"\";\n}\n\nfunction compactStatus(\n\tstate: GithubPrState,\n\tchecks: CheckSummary,\n\tchecksText: string,\n\treview: string,\n): string {\n\tif (state === \"merged\") return \"M\";\n\tif (state === \"closed\") return \"C\";\n\tif (state === \"draft\") return \"D\";\n\tif (checks.failed > 0) return compactCount(\"\u00D7\", checks.failed);\n\tif (review === \"R\u00D7\") return review;\n\tif (checks.pending > 0) return compactCount(\"\u2026\", checks.pending);\n\tif (review === \"R\u2713\" || review === \"R?\") return review;\n\treturn checksText;\n}\n\nfunction osc8Link(value: string, label: string): string {\n\tif (hasTerminalControls(value)) return label;\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif ((url.protocol !== \"http:\" && url.protocol !== \"https:\") || url.username || url.password) {\n\t\t\treturn label;\n\t\t}\n\t\tconst normalized = url.toString();\n\t\tif (normalized.length > MAX_URL_LENGTH || hasTerminalControls(normalized)) return label;\n\t\treturn `\\u001b]8;;${normalized}\\u0007${label}\\u001b]8;;\\u0007`;\n\t} catch {\n\t\treturn label;\n\t}\n}\n\nfunction hasTerminalControls(value: string): boolean {\n\treturn Array.from(value).some((character) => {\n\t\tconst codePoint = character.codePointAt(0) ?? 0;\n\t\treturn (\n\t\t\tcodePoint <= 0x1f ||\n\t\t\t(codePoint >= 0x7f && codePoint <= 0x9f) ||\n\t\t\t(codePoint >= 0xd800 && codePoint <= 0xdfff)\n\t\t);\n\t});\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(\"Expected PR object\");\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction positiveInteger(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) {\n\t\tthrow new Error(\"Invalid PR number\");\n\t}\n\treturn value;\n}\n\nfunction requiredBoolean(value: unknown): boolean {\n\tif (typeof value !== \"boolean\") throw new Error(\"Invalid PR boolean\");\n\treturn value;\n}\n\nfunction requiredBoundedString(value: unknown, maxLength: number, allowEmpty = false): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.length > maxLength ||\n\t\t(!allowEmpty && value.length === 0)\n\t) {\n\t\tthrow new Error(\"Invalid PR string\");\n\t}\n\treturn value;\n}\n\nfunction optionalUppercase(value: unknown): string | undefined {\n\tif (value === null || value === undefined || value === \"\") return undefined;\n\treturn requiredBoundedString(value, MAX_FIELD_LENGTH).toUpperCase();\n}\n\nfunction optionalTimestamp(value: unknown): number | undefined {\n\tif (value === null || value === undefined || value === \"\") return undefined;\n\tconst text = requiredBoundedString(value, MAX_FIELD_LENGTH);\n\tconst match = RFC3339_TIMESTAMP.exec(text);\n\tif (!match) throw new Error(\"Invalid PR timestamp\");\n\tconst [\n\t\t,\n\t\tyearText,\n\t\tmonthText,\n\t\tdayText,\n\t\thourText,\n\t\tminuteText,\n\t\tsecondText,\n\t\toffsetHourText,\n\t\toffsetMinuteText,\n\t] = match;\n\tconst year = Number(yearText);\n\tconst month = Number(monthText);\n\tconst day = Number(dayText);\n\tconst hour = Number(hourText);\n\tconst minute = Number(minuteText);\n\tconst second = Number(secondText);\n\tconst offsetHour = Number(offsetHourText ?? 0);\n\tconst offsetMinute = Number(offsetMinuteText ?? 0);\n\tif (\n\t\tmonth < 1 ||\n\t\tmonth > 12 ||\n\t\tday < 1 ||\n\t\tday > daysInMonth(year, month) ||\n\t\thour > 23 ||\n\t\tminute > 59 ||\n\t\tsecond > 59 ||\n\t\toffsetHour > 23 ||\n\t\toffsetMinute > 59\n\t) {\n\t\tthrow new Error(\"Invalid PR timestamp\");\n\t}\n\tconst timestamp = Date.parse(text);\n\tif (!Number.isFinite(timestamp)) throw new Error(\"Invalid PR timestamp\");\n\treturn timestamp;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n\tif (month === 2) {\n\t\tconst leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n\t\treturn leapYear ? 29 : 28;\n\t}\n\treturn month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;\n}\n\nfunction pullRequestState(value: unknown): PullRequestState {\n\tif (value === \"OPEN\" || value === \"CLOSED\" || value === \"MERGED\") return value;\n\tthrow new Error(\"Invalid PR state\");\n}\n\nfunction reviewDecisionValue(value: unknown): ReviewDecision {\n\tif (value === null || value === undefined || value === \"\" || value === \"UNKNOWN\") return \"\";\n\tif (value === \"APPROVED\" || value === \"CHANGES_REQUESTED\" || value === \"REVIEW_REQUIRED\") {\n\t\treturn value;\n\t}\n\tthrow new Error(\"Invalid PR review decision\");\n}\n", "export interface AsyncRefreshControllerOptions<Input, Snapshot> {\n\tread(input: Input, signal: AbortSignal): Promise<Snapshot>;\n\tequal(left: Snapshot | undefined, right: Snapshot): boolean;\n\tpublish(snapshot: Snapshot): void;\n\tonError?(error: unknown): void;\n}\n\ninterface RefreshRequest<Input> {\n\tgeneration: number;\n\trequestId: number;\n\tinput: Input;\n}\n\ninterface ActiveRefresh<Input> {\n\trequest: RefreshRequest<Input>;\n\tcontroller: AbortController;\n}\n\n/** Coalesces refreshes to one active read plus the latest pending request. */\nexport class AsyncRefreshController<Input, Snapshot> {\n\tprivate generation: number | undefined;\n\tprivate requestId = 0;\n\tprivate active: ActiveRefresh<Input> | undefined;\n\tprivate pending: RefreshRequest<Input> | undefined;\n\tprivate current: Snapshot | undefined;\n\n\tconstructor(private readonly options: AsyncRefreshControllerOptions<Input, Snapshot>) {}\n\n\tstart(generation: number): void {\n\t\tthis.cancelActive(\"Refresh generation replaced\");\n\t\tthis.generation = generation;\n\t\tthis.requestId += 1;\n\t\tthis.pending = undefined;\n\t\tthis.current = undefined;\n\t}\n\n\tclear(): void {\n\t\tthis.current = undefined;\n\t}\n\n\trequest(input: Input): void {\n\t\tif (this.generation === undefined) return;\n\t\tconst request = {\n\t\t\tgeneration: this.generation,\n\t\t\trequestId: ++this.requestId,\n\t\t\tinput,\n\t\t};\n\t\tif (this.active) {\n\t\t\tthis.pending = request;\n\t\t\treturn;\n\t\t}\n\t\tthis.run(request);\n\t}\n\n\tstop(): void {\n\t\tthis.generation = undefined;\n\t\tthis.requestId += 1;\n\t\tthis.pending = undefined;\n\t\tthis.current = undefined;\n\t\tthis.cancelActive(\"Refresh controller stopped\");\n\t}\n\n\tprivate run(request: RefreshRequest<Input>): void {\n\t\tif (!this.isCurrentTarget(request)) return;\n\t\tconst active: ActiveRefresh<Input> = {\n\t\t\trequest,\n\t\t\tcontroller: new AbortController(),\n\t\t};\n\t\tthis.active = active;\n\t\tvoid this.options\n\t\t\t.read(request.input, active.controller.signal)\n\t\t\t.then((snapshot) => {\n\t\t\t\tif (this.active !== active || !this.isCurrentRequest(request)) return;\n\t\t\t\tif (this.options.equal(this.current, snapshot)) return;\n\t\t\t\tthis.current = snapshot;\n\t\t\t\tthis.options.publish(snapshot);\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\tthis.active === active &&\n\t\t\t\t\tthis.isCurrentRequest(request) &&\n\t\t\t\t\t!active.controller.signal.aborted\n\t\t\t\t) {\n\t\t\t\t\tthis.options.onError?.(error);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (this.active !== active) return;\n\t\t\t\tthis.active = undefined;\n\t\t\t\tconst pending = this.pending;\n\t\t\t\tthis.pending = undefined;\n\t\t\t\tif (pending) this.run(pending);\n\t\t\t});\n\t}\n\n\tprivate cancelActive(reason: string): void {\n\t\tthis.active?.controller.abort(new DOMException(reason, \"AbortError\"));\n\t}\n\n\tprivate isCurrentTarget(request: RefreshRequest<Input>): boolean {\n\t\treturn this.generation !== undefined && request.generation === this.generation;\n\t}\n\n\tprivate isCurrentRequest(request: RefreshRequest<Input>): boolean {\n\t\treturn this.isCurrentTarget(request) && request.requestId === this.requestId;\n\t}\n}\n", "import type { ModuleName } from \"../modules/catalog.js\";\nimport { reachableModuleRequirements } from \"../modules/render.js\";\nimport type { WorkspaceSnapshot } from \"../modules/types.js\";\nimport { createFileSystem } from \"./helpers.js\";\nimport {\n\ttype CollectorContext,\n\ttype MutableModuleSnapshot,\n\tPRIVATE_STYLE_SELECTOR,\n\ttype WorkspaceEntry,\n\ttype WorkspaceRefreshInput,\n} from \"./types.js\";\n\nexport type { WorkspaceExec, WorkspaceExecResult, WorkspaceRefreshInput } from \"./types.js\";\n\nexport async function collectWorkspaceSnapshot(\n\tinput: WorkspaceRefreshInput,\n): Promise<WorkspaceSnapshot> {\n\tconst requirements = reachableModuleRequirements(input.config);\n\tif (input.signal?.aborted || !hasWorkspaceRequirement(requirements)) return freezeSnapshot({});\n\tconst fs = createFileSystem(input);\n\tlet listing: Promise<readonly WorkspaceEntry[]> | undefined;\n\tconst context: CollectorContext = {\n\t\tinput,\n\t\tfs,\n\t\trequirements,\n\t\tentries() {\n\t\t\tlisting ??= fs.readDirectory(input.cwd);\n\t\t\treturn listing;\n\t\t},\n\t\toptions(name) {\n\t\t\treturn input.config.modules[name].options;\n\t\t},\n\t\tneeds(name, variable) {\n\t\t\tconst variables = requirements.get(name);\n\t\t\treturn Boolean(variables && (variable === undefined || variables.has(variable)));\n\t\t},\n\t};\n\tconst modules: MutableModuleSnapshot = {};\n\tif (requirements.has(\"package\")) {\n\t\tconst { collectPackage } = await import(\"./package.js\");\n\t\tif (input.signal?.aborted) return freezeSnapshot({});\n\t\tconst packageValues = await collectPackage(context);\n\t\tif (input.signal?.aborted) return freezeSnapshot({});\n\t\tif (packageValues) modules.package = packageValues;\n\t}\n\tfor (const descriptor of COLLECTOR_GROUPS) {\n\t\tif (!descriptor.modules.some((name) => requirements.has(name))) continue;\n\t\tif (input.signal?.aborted) return freezeSnapshot({});\n\t\tconst collector = await descriptor.load();\n\t\tif (input.signal?.aborted) return freezeSnapshot({});\n\t\tmergeModules(modules, await collector(context));\n\t}\n\treturn input.signal?.aborted ? freezeSnapshot({}) : freezeSnapshot(modules);\n}\n\nexport function workspaceSnapshotEqual(\n\tleft: WorkspaceSnapshot | undefined,\n\tright: WorkspaceSnapshot | undefined,\n): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction hasWorkspaceRequirement(\n\trequirements: ReadonlyMap<ModuleName, ReadonlySet<string>>,\n): boolean {\n\treturn [...requirements.keys()].some((name) => !BUILT_IN_ONLY_MODULES.has(name));\n}\n\ntype WorkspaceCollector = (context: CollectorContext) => Promise<MutableModuleSnapshot>;\n\nconst COLLECTOR_GROUPS: readonly {\n\tmodules: readonly ModuleName[];\n\tload(): Promise<WorkspaceCollector>;\n}[] = [\n\t{\n\t\tmodules: [\"nodejs\", \"python\", \"rust\", \"golang\", \"bun\", \"deno\"],\n\t\tload: async () => (await import(\"./languages.js\")).collectLanguages,\n\t},\n\t{\n\t\tmodules: [\"mise\", \"direnv\", \"pixi\", \"conda\", \"nix_shell\", \"guix_shell\"],\n\t\tload: async () => (await import(\"./development.js\")).collectDevelopment,\n\t},\n\t{\n\t\tmodules: [\"docker_context\", \"kubernetes\", \"terraform\"],\n\t\tload: async () => (await import(\"./deployment.js\")).collectDeployment,\n\t},\n\t{\n\t\tmodules: [\"aws\", \"gcloud\", \"azure\", \"openstack\"],\n\t\tload: async () => (await import(\"./cloud.js\")).collectCloud,\n\t},\n\t{\n\t\tmodules: [\"container\", \"hostname\", \"os\", \"username\"],\n\t\tload: async () => (await import(\"./execution.js\")).collectExecution,\n\t},\n];\n\nconst BUILT_IN_ONLY_MODULES = new Set<ModuleName>([\n\t\"brand\",\n\t\"provider\",\n\t\"model\",\n\t\"thinking\",\n\t\"directory\",\n\t\"git_worktree\",\n\t\"git_branch\",\n\t\"github_pr\",\n\t\"git_commit\",\n\t\"git_state\",\n\t\"git_metrics\",\n\t\"git_status\",\n\t\"activity\",\n\t\"context\",\n\t\"tokens\",\n\t\"cost\",\n\t\"time\",\n\t\"turn\",\n\t\"fill\",\n\t\"extension_status\",\n]);\n\nfunction mergeModules(target: MutableModuleSnapshot, source: MutableModuleSnapshot): void {\n\tfor (const [name, values] of Object.entries(source)) {\n\t\tObject.defineProperty(target, name, {\n\t\t\tvalue: values,\n\t\t\twritable: true,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n}\n\nfunction freezeSnapshot(modules: MutableModuleSnapshot): WorkspaceSnapshot {\n\tconst styleSelectors: Record<string, string> = {};\n\tfor (const [name, values] of Object.entries(modules)) {\n\t\tconst selector = Object.hasOwn(values, PRIVATE_STYLE_SELECTOR)\n\t\t\t? values[PRIVATE_STYLE_SELECTOR]\n\t\t\t: undefined;\n\t\tdelete values[PRIVATE_STYLE_SELECTOR];\n\t\tif (selector !== undefined) styleSelectors[name] = selector;\n\t\tObject.freeze(values);\n\t}\n\treturn Object.freeze({\n\t\tmodules: Object.freeze(modules),\n\t\t...(Object.keys(styleSelectors).length > 0\n\t\t\t? { styleSelectors: Object.freeze(styleSelectors) }\n\t\t\t: {}),\n\t});\n}\n", "import type { SessionEntry } from \"@earendil-works/pi-coding-agent\";\n\ninterface UsageLike {\n\tinput?: number;\n\toutput?: number;\n\tcacheRead?: number;\n\tcacheWrite?: number;\n\tcost?: { total?: number };\n}\n\nexport interface FooterUsageSummary {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tlatestCacheHitRate?: number;\n}\n\nexport function summarizeFooterUsage(entries: readonly SessionEntry[]): FooterUsageSummary {\n\tconst totals: FooterUsageSummary = {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\tcost: 0,\n\t};\n\n\tfor (const entry of entries) {\n\t\tlet usage: UsageLike | undefined;\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tusage = entry.message.usage;\n\t\t\tconst input = usage.input ?? 0;\n\t\t\tconst cacheRead = usage.cacheRead ?? 0;\n\t\t\tconst cacheWrite = usage.cacheWrite ?? 0;\n\t\t\tconst promptTokens = input + cacheRead + cacheWrite;\n\t\t\ttotals.latestCacheHitRate = promptTokens > 0 ? (cacheRead / promptTokens) * 100 : undefined;\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"toolResult\") {\n\t\t\tusage = entry.message.usage;\n\t\t} else if (entry.type === \"compaction\" || entry.type === \"branch_summary\") {\n\t\t\tusage = entry.usage;\n\t\t}\n\t\tif (!usage) continue;\n\n\t\ttotals.input += usage.input ?? 0;\n\t\ttotals.output += usage.output ?? 0;\n\t\ttotals.cacheRead += usage.cacheRead ?? 0;\n\t\ttotals.cacheWrite += usage.cacheWrite ?? 0;\n\t\ttotals.cost += usage.cost?.total ?? 0;\n\t}\n\n\treturn totals;\n}\n"],
  "mappings": "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",
  "names": ["resolve"]
}
