@narumitw/pi-statusline 0.49.0 → 0.49.3

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/statusline.ts", "../src/extension-status.ts", "../src/powerline.ts", "../src/ansi.ts", "../src/git-status.ts", "../src/directory.ts", "../src/terminal.ts", "../src/usage.ts", "../src/render.ts"],
4
+ "sourcesContent": ["import { homedir } from \"node:os\";\nimport {\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\tgetAgentDir,\n} from \"@earendil-works/pi-coding-agent\";\nimport { completeStatuslineArguments } from \"./command-contract.js\";\nimport type { StatuslineCommandOptions } from \"./commands.js\";\nimport {\n\tbuildExtensionStatusIconAliases,\n\ttype ExtensionStatusIconAliasMap,\n\tfindDuplicateExtensions,\n\treadInstalledExtensionPackages,\n} from \"./extension-status.js\";\nimport { type GitStatusSummary, gitStatusSummaryEqual, readGitStatus } from \"./git-status.js\";\nimport { type RuntimeState, renderExtensionStatusline, renderStatusline } from \"./render.js\";\nimport {\n\tconsumeStatuslineSettingsNotice,\n\ttype LoadedStatuslineSettings,\n\tloadStatuslineSettings,\n\tloadStatuslineSettingsForAgent,\n\tsettingsFilePath,\n} from \"./settings.js\";\nimport type { PalettePreset } from \"./types.js\";\n\nconst STATUSLINE_KEY = \"statusline\";\nconst GIT_STATUS_REFRESH_INTERVAL_MS = 30_000;\nconst GIT_STATUS_EVENT_DEBOUNCE_MS = 250;\nconst EMPTY_EXTENSION_STATUS_ICON_ALIASES: ExtensionStatusIconAliasMap = new Map();\n\ntype StatuslineCommands = typeof import(\"./commands.js\");\nlet statuslineCommandsPromise: Promise<StatuslineCommands> | undefined;\n\nfunction loadStatuslineCommands(): Promise<StatuslineCommands> {\n\tif (!statuslineCommandsPromise) {\n\t\tstatuslineCommandsPromise = import(\"./commands.js\").catch((error) => {\n\t\t\tstatuslineCommandsPromise = undefined;\n\t\t\tthrow error;\n\t\t});\n\t}\n\treturn statuslineCommandsPromise;\n}\n\nexport default function statusline(pi: ExtensionAPI) {\n\tlet loaded: LoadedStatuslineSettings | undefined;\n\tlet previewPalettePreset: PalettePreset | undefined;\n\tlet activeSessionManager: ExtensionContext[\"sessionManager\"] | undefined;\n\tconst runtime: RuntimeState = {\n\t\tturnCount: 0,\n\t\tactiveTools: new Map(),\n\t\tisStreaming: false,\n\t\tthinkingLevel: \"off\",\n\t\tduplicateExtensions: [],\n\t\textensionStatusIconAliases: EMPTY_EXTENSION_STATUS_ICON_ALIASES,\n\t};\n\n\tlet sessionGeneration = 0;\n\tlet menuController = new AbortController();\n\tlet gitStatusRequestId = 0;\n\tlet activeGitStatusTarget: { cwd: string; generation: number } | undefined;\n\tlet gitStatusRefreshInFlight = false;\n\tlet gitStatusAbortController: AbortController | undefined;\n\tlet gitStatusDebounceTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet pendingGitStatusRefresh: { cwd: string; generation: number; requestId: number } | undefined;\n\n\tconst refresh = () => runtime.requestRender?.();\n\tconst ownsRuntime = (ctx: ExtensionContext) => ctx.sessionManager === activeSessionManager;\n\n\tconst setGitStatus = (summary: GitStatusSummary | undefined) => {\n\t\tif (gitStatusSummaryEqual(runtime.gitStatus, summary)) return;\n\t\truntime.gitStatus = summary;\n\t\trefresh();\n\t};\n\n\tconst clearGitStatusDebounce = () => {\n\t\tif (!gitStatusDebounceTimer) return;\n\t\tclearTimeout(gitStatusDebounceTimer);\n\t\tgitStatusDebounceTimer = undefined;\n\t};\n\n\tconst abortGitStatusRefresh = (reason: string) => {\n\t\tgitStatusAbortController?.abort(new DOMException(reason, \"AbortError\"));\n\t};\n\n\tconst isActiveGitStatusTarget = (cwd: string, generation: number) =>\n\t\tactiveGitStatusTarget?.cwd === cwd &&\n\t\tactiveGitStatusTarget.generation === generation &&\n\t\tgeneration === sessionGeneration;\n\n\tconst isCurrentGitStatusRequest = (cwd: string, generation: number, requestId: number) =>\n\t\tisActiveGitStatusTarget(cwd, generation) && requestId === gitStatusRequestId;\n\n\tconst runGitStatusRefresh = (cwd: string, generation: number, requestId: number) => {\n\t\tif (!isCurrentGitStatusRequest(cwd, generation, requestId)) return;\n\t\tif (gitStatusRefreshInFlight) {\n\t\t\tpendingGitStatusRefresh = { cwd, generation, requestId };\n\t\t\treturn;\n\t\t}\n\n\t\tgitStatusRefreshInFlight = true;\n\t\tconst abortController = new AbortController();\n\t\tgitStatusAbortController = abortController;\n\t\tvoid (async () => {\n\t\t\ttry {\n\t\t\t\tconst summary = await readGitStatus(pi, cwd, abortController.signal);\n\t\t\t\tif (isCurrentGitStatusRequest(cwd, generation, requestId)) setGitStatus(summary);\n\t\t\t} catch {\n\t\t\t\tif (isCurrentGitStatusRequest(cwd, generation, requestId)) setGitStatus(undefined);\n\t\t\t} finally {\n\t\t\t\tgitStatusRefreshInFlight = false;\n\t\t\t\tif (gitStatusAbortController === abortController) gitStatusAbortController = undefined;\n\t\t\t\tconst pending = pendingGitStatusRefresh;\n\t\t\t\tpendingGitStatusRefresh = undefined;\n\t\t\t\tif (pending) runGitStatusRefresh(pending.cwd, pending.generation, pending.requestId);\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst refreshGitStatus = (cwd: string, generation = sessionGeneration) => {\n\t\tif (!isActiveGitStatusTarget(cwd, generation)) return;\n\t\trunGitStatusRefresh(cwd, generation, ++gitStatusRequestId);\n\t};\n\n\tconst scheduleGitStatusRefresh = (cwd: string, generation = sessionGeneration) => {\n\t\tif (!isActiveGitStatusTarget(cwd, generation)) return;\n\t\tconst requestId = ++gitStatusRequestId;\n\t\tclearGitStatusDebounce();\n\t\tgitStatusDebounceTimer = setTimeout(() => {\n\t\t\tgitStatusDebounceTimer = undefined;\n\t\t\trunGitStatusRefresh(cwd, generation, requestId);\n\t\t}, GIT_STATUS_EVENT_DEBOUNCE_MS);\n\t};\n\n\tconst scheduleGitStatusRefreshForContext = (ctx: ExtensionContext) => {\n\t\tif (!activeGitStatusTarget || activeGitStatusTarget.cwd !== ctx.cwd) return;\n\t\tscheduleGitStatusRefresh(activeGitStatusTarget.cwd, activeGitStatusTarget.generation);\n\t};\n\n\tconst installFooter = (ctx: ExtensionContext) => {\n\t\tconst generation = ++sessionGeneration;\n\t\tmenuController.abort(new DOMException(\"Statusline session context replaced\", \"AbortError\"));\n\t\tmenuController = new AbortController();\n\t\tconst cwd = ctx.cwd;\n\t\tactiveSessionManager = ctx.sessionManager;\n\t\truntime.homeDir = homedir();\n\t\tpreviewPalettePreset = undefined;\n\t\tabortGitStatusRefresh(\"Statusline session context replaced\");\n\t\tclearGitStatusDebounce();\n\t\tactiveGitStatusTarget = ctx.mode === \"tui\" ? { cwd, generation } : undefined;\n\t\truntime.gitStatus = undefined;\n\t\truntime.duplicateExtensions = [];\n\t\truntime.extensionStatusIconAliases = EMPTY_EXTENSION_STATUS_ICON_ALIASES;\n\t\tctx.ui.setStatus(STATUSLINE_KEY, undefined);\n\t\tif (!activeGitStatusTarget || !loaded) return;\n\t\tconst installedPackages = readInstalledExtensionPackages(cwd);\n\t\truntime.duplicateExtensions = findDuplicateExtensions(installedPackages);\n\t\truntime.extensionStatusIconAliases = buildExtensionStatusIconAliases(installedPackages);\n\t\tctx.ui.setFooter((tui, theme, footerData) => {\n\t\t\truntime.requestRender = () => tui.requestRender();\n\n\t\t\tconst refreshFooterGitStatus = () => refreshGitStatus(cwd, generation);\n\t\t\tconst branchUnsubscribe = footerData.onBranchChange(() => {\n\t\t\t\truntime.gitStatus = undefined;\n\t\t\t\tabortGitStatusRefresh(\"Statusline Git branch changed\");\n\t\t\t\tclearGitStatusDebounce();\n\t\t\t\trefreshFooterGitStatus();\n\t\t\t\ttui.requestRender();\n\t\t\t});\n\t\t\tconst clock = setInterval(() => {\n\t\t\t\tclearGitStatusDebounce();\n\t\t\t\trefreshFooterGitStatus();\n\t\t\t\ttui.requestRender();\n\t\t\t}, GIT_STATUS_REFRESH_INTERVAL_MS);\n\n\t\t\treturn {\n\t\t\t\tdispose() {\n\t\t\t\t\tbranchUnsubscribe();\n\t\t\t\t\tclearInterval(clock);\n\t\t\t\t\tif (isActiveGitStatusTarget(cwd, generation)) {\n\t\t\t\t\t\tactiveGitStatusTarget = undefined;\n\t\t\t\t\t\tabortGitStatusRefresh(\"Statusline footer disposed\");\n\t\t\t\t\t\tclearGitStatusDebounce();\n\t\t\t\t\t\tpendingGitStatusRefresh = undefined;\n\t\t\t\t\t\truntime.gitStatus = undefined;\n\t\t\t\t\t\truntime.duplicateExtensions = [];\n\t\t\t\t\t\truntime.extensionStatusIconAliases = EMPTY_EXTENSION_STATUS_ICON_ALIASES;\n\t\t\t\t\t\truntime.requestRender = 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\tif (!loaded) return [];\n\t\t\t\t\tconst config = previewPalettePreset\n\t\t\t\t\t\t? { ...loaded.config, palettePreset: previewPalettePreset }\n\t\t\t\t\t\t: loaded.config;\n\t\t\t\t\tconst mainLine = renderStatusline(width, ctx, footerData, theme, config, runtime);\n\t\t\t\t\tconst lines = mainLine ? mainLine.split(\"\\n\") : [];\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t...renderExtensionStatusline(width, footerData, theme, config, runtime, mainLine),\n\t\t\t\t\t);\n\t\t\t\t\treturn lines;\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t\trefreshGitStatus(cwd, generation);\n\t};\n\n\tconst agentDir = getAgentDir();\n\tconst configPath = settingsFilePath(agentDir);\n\tconst commandOptions: StatuslineCommandOptions = {\n\t\tsettingsPath: configPath,\n\t\tgetLoaded: () => loaded ?? loadStatuslineSettings(configPath),\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 (ctx.sessionManager !== activeSessionManager) return;\n\t\t\tpreviewPalettePreset = undefined;\n\t\t\tloaded = next;\n\t\t\trefresh();\n\t\t},\n\t\tpreview(palettePreset, ctx) {\n\t\t\tif (ctx.sessionManager !== activeSessionManager) return;\n\t\t\tpreviewPalettePreset = palettePreset;\n\t\t\trefresh();\n\t\t},\n\t};\n\tpi.registerCommand(\"statusline\", {\n\t\tdescription: \"Open or inspect the statusline settings\",\n\t\tgetArgumentCompletions: completeStatuslineArguments,\n\t\thandler: async (args, ctx) => {\n\t\t\tconst commands = await loadStatuslineCommands();\n\t\t\tif (ctx.sessionManager !== activeSessionManager) return;\n\t\t\tawait commands.handleStatuslineCommand(args, ctx, commandOptions);\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\truntime.turnCount = 0;\n\t\truntime.activeTools.clear();\n\t\truntime.isStreaming = false;\n\t\tloaded = loadStatuslineSettingsForAgent(agentDir);\n\t\tconst settingsNotice = consumeStatuslineSettingsNotice();\n\t\tif (settingsNotice) ctx.ui.notify(settingsNotice, \"warning\");\n\t\tif (loaded.diagnostics.length > 0) {\n\t\t\tctx.ui.notify(formatSettingsDiagnostics(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 (!ownsRuntime(ctx)) return;\n\t\tsessionGeneration += 1;\n\t\tmenuController.abort(new DOMException(\"Statusline session shut down\", \"AbortError\"));\n\t\tactiveSessionManager = undefined;\n\t\tpreviewPalettePreset = undefined;\n\t\tactiveGitStatusTarget = undefined;\n\t\tabortGitStatusRefresh(\"Statusline session shut down\");\n\t\tclearGitStatusDebounce();\n\t\tpendingGitStatusRefresh = undefined;\n\t\truntime.gitStatus = undefined;\n\t\truntime.activeTools.clear();\n\t\truntime.isStreaming = false;\n\t\truntime.duplicateExtensions = [];\n\t\truntime.extensionStatusIconAliases = EMPTY_EXTENSION_STATUS_ICON_ALIASES;\n\t\tctx.ui.setFooter(undefined);\n\t\tctx.ui.setStatus(STATUSLINE_KEY, undefined);\n\t\truntime.requestRender = undefined;\n\t});\n\n\tpi.on(\"model_select\", () => refresh());\n\n\tpi.on(\"thinking_level_select\", (event) => {\n\t\truntime.thinkingLevel = event.level;\n\t\trefresh();\n\t});\n\n\tpi.on(\"agent_start\", (_event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\truntime.isStreaming = true;\n\t\trefresh();\n\t});\n\n\tpi.on(\"agent_end\", (_event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\truntime.activeTools.clear();\n\t\tscheduleGitStatusRefreshForContext(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\truntime.isStreaming = false;\n\t\truntime.activeTools.clear();\n\t\trefresh();\n\t});\n\n\tpi.on(\"turn_start\", (_event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\truntime.turnCount += 1;\n\t\truntime.isStreaming = true;\n\t\trefresh();\n\t});\n\n\tpi.on(\"turn_end\", (_event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\tscheduleGitStatusRefreshForContext(ctx);\n\t\trefresh();\n\t});\n\n\tpi.on(\"tool_execution_start\", (event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\tconst currentCount = runtime.activeTools.get(event.toolName) ?? 0;\n\t\truntime.activeTools.set(event.toolName, currentCount + 1);\n\t\trefresh();\n\t});\n\n\tpi.on(\"tool_execution_end\", (event, ctx) => {\n\t\tif (!ownsRuntime(ctx)) return;\n\t\tconst currentCount = runtime.activeTools.get(event.toolName) ?? 0;\n\t\tif (currentCount <= 1) runtime.activeTools.delete(event.toolName);\n\t\telse runtime.activeTools.set(event.toolName, currentCount - 1);\n\n\t\tscheduleGitStatusRefreshForContext(ctx);\n\t\trefresh();\n\t});\n}\n\nfunction formatSettingsDiagnostics(loaded: LoadedStatuslineSettings): 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-statusline settings: ${details.join(\"; \")}`,\n\t\t...(remaining > 0 ? [`+${remaining} more`] : []),\n\t].join(\" \");\n}\n\nexport {\n\tbuildExtensionStatusIconAliases,\n\ttype ExtensionStatusIconAliasMap,\n\textensionColor,\n\tformatExtensionStatus,\n\tnpmPackageName,\n\tsimplifyExtensionStatusText,\n\tsplitExtensionStatusIcon,\n\tstripExtensionStatusPrefix,\n\twrapExtensionStatusline,\n} from \"./extension-status.js\";\nexport {\n\tformatGitBranchText,\n\tformatGitBranchValue,\n\tformatGitStatusSummary,\n\ttype GitStatusSummary,\n\tparseGitRoot,\n\tparseGitStatusPorcelain,\n\treadGitStatus,\n} from \"./git-status.js\";\nexport {\n\tcontextColor,\n\tformatCount,\n\tformatToolActivity,\n\tprContextFromStatuses,\n\tprLinkFromStatuses,\n\tshortenModel,\n} from \"./render.js\";\nexport { normalizeStatuslineSettings, readStatuslineSettings } from \"./settings.js\";\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport type { Theme, ThemeColor } from \"@earendil-works/pi-coding-agent\";\nimport { wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport { powerlineExtensionSeparator } from \"./powerline.js\";\nimport { DEFAULT_EXTENSION_STATUS_ICONS } from \"./settings.js\";\nimport type { StatuslineConfig } from \"./types.js\";\n\nexport type ExtensionStatusIconAliasMap = ReadonlyMap<string, readonly string[]>;\nexport interface ExtensionStatusRuntime {\n\tduplicateExtensions: string[];\n\textensionStatusIconAliases: ExtensionStatusIconAliasMap;\n}\n\nconst STATUSLINE_KEY = \"statusline\";\nconst COMPATIBLE_STATUS_ICON_KEYS: Readonly<Record<string, string>> = {\n\tretry: \"unknown-error-retry\",\n\tsync: \"pisync\",\n\t\"unknown-error-retry\": \"retry\",\n\tpisync: \"sync\",\n};\nconst EMPTY_EXTENSION_STATUS_ICON_ALIASES: ExtensionStatusIconAliasMap = new Map();\nfunction extensionStatusSeparator(config: StatuslineConfig, theme: Theme): string {\n\treturn powerlineExtensionSeparator(theme, config.palettePreset);\n}\n\nexport function formatExtensionStatuses(\n\tstatuses: ReadonlyMap<string, string>,\n\ttheme: Theme,\n\tconfig: StatuslineConfig,\n\truntime: ExtensionStatusRuntime,\n\thiddenKeys: ReadonlySet<string> = new Set(),\n): string {\n\tconst separator = extensionStatusSeparator(config, theme);\n\tconst visibleStatuses = [\n\t\t...formatDuplicateExtensionStatus(runtime, theme),\n\t\t...[...statuses.entries()]\n\t\t\t.filter(\n\t\t\t\t([key, value]) => key !== STATUSLINE_KEY && !hiddenKeys.has(key) && value.trim().length > 0,\n\t\t\t)\n\t\t\t.map(([key, value]) =>\n\t\t\t\tformatExtensionStatus(key, value, theme, config, runtime.extensionStatusIconAliases),\n\t\t\t),\n\t].slice(0, 5);\n\n\treturn visibleStatuses.join(separator);\n}\n\nexport function formatExtensionStatus(\n\tkey: string,\n\tvalue: string,\n\ttheme: Theme,\n\tconfig: Pick<StatuslineConfig, \"extensionStatusIcons\">,\n\textensionStatusIconAliases: ExtensionStatusIconAliasMap = EMPTY_EXTENSION_STATUS_ICON_ALIASES,\n): string {\n\tconst status = splitExtensionStatusIcon(stripExtensionStatusPrefix(key, value));\n\tconst text = simplifyExtensionStatusText(status.text);\n\tconst color = extensionColor(key, value);\n\tconst textColor = color === \"warning\" ? \"warning\" : \"muted\";\n\tconst icon = extensionStatusIcon(\n\t\tkey,\n\t\tstatus.icon,\n\t\tconfig.extensionStatusIcons,\n\t\textensionStatusIconAliases,\n\t);\n\tconst renderedText = theme.fg(textColor, text);\n\treturn icon ? `${theme.fg(color, icon)} ${renderedText}` : renderedText;\n}\n\nfunction extensionStatusIcon(\n\tkey: string,\n\tleadingIcon: string | undefined,\n\tconfiguredIcons: Record<string, string>,\n\textensionStatusIconAliases: ExtensionStatusIconAliasMap,\n) {\n\tif (Object.hasOwn(configuredIcons, key)) return configuredIcons[key];\n\tconst namespaceIcon = configuredNamespaceIcon(key, configuredIcons);\n\tif (namespaceIcon !== undefined) return namespaceIcon;\n\tconst compatibleKey = COMPATIBLE_STATUS_ICON_KEYS[key];\n\tif (compatibleKey && Object.hasOwn(configuredIcons, compatibleKey)) {\n\t\treturn configuredIcons[compatibleKey];\n\t}\n\tfor (const alias of extensionStatusAliasesForKey(key, extensionStatusIconAliases)) {\n\t\tif (Object.hasOwn(configuredIcons, alias)) return configuredIcons[alias];\n\t}\n\treturn leadingIcon ?? DEFAULT_EXTENSION_STATUS_ICONS[key] ?? \"\uD83D\uDD0C\";\n}\n\nfunction configuredNamespaceIcon(\n\tkey: string,\n\tconfiguredIcons: Readonly<Record<string, string>>,\n): string | undefined {\n\tlet match: { baseLength: number; icon: string } | undefined;\n\tfor (const [selector, icon] of Object.entries(configuredIcons)) {\n\t\tif (!selector.endsWith(\":*\")) continue;\n\t\tconst base = selector.slice(0, -2);\n\t\tif (!base || !key.startsWith(`${base}:`)) continue;\n\t\tif (!match || base.length > match.baseLength) match = { baseLength: base.length, icon };\n\t}\n\treturn match?.icon;\n}\n\nfunction extensionStatusAliasesForKey(\n\tkey: string,\n\textensionStatusIconAliases: ExtensionStatusIconAliasMap,\n): readonly string[] {\n\tfor (const [statusBase, aliases] of extensionStatusIconAliases) {\n\t\tif (statusKeyMatchesStatusBase(key, statusBase)) return aliases;\n\t}\n\treturn [];\n}\n\nfunction statusKeyMatchesStatusBase(key: string, statusBase: string): boolean {\n\treturn key === statusBase || key.startsWith(`${statusBase}:`) || key.startsWith(`${statusBase}/`);\n}\n\nexport function wrapExtensionStatusline(status: string, width: number): string[] {\n\tif (!status || width <= 0) return [];\n\treturn wrapTextWithAnsi(status, width);\n}\n\nfunction formatDuplicateExtensionStatus(runtime: ExtensionStatusRuntime, theme: Theme): string[] {\n\tif (runtime.duplicateExtensions.length === 0) return [];\n\tconst names = runtime.duplicateExtensions.slice(0, 2).join(\", \");\n\tconst suffix =\n\t\truntime.duplicateExtensions.length > 2 ? ` +${runtime.duplicateExtensions.length - 2}` : \"\";\n\treturn [`${theme.fg(\"warning\", \"\u26A0\uFE0F\")} ${theme.fg(\"warning\", `dup ${names}${suffix}`)}`];\n}\n\nexport function splitExtensionStatusIcon(value: string): { icon?: string; text: string } {\n\tconst trimmed = value.trim();\n\tconst [firstToken, ...restTokens] = trimmed.split(/\\s+/);\n\tif (firstToken && isEmojiOnlyToken(firstToken)) {\n\t\treturn { icon: firstToken, text: restTokens.join(\" \") };\n\t}\n\treturn { text: trimmed };\n}\n\nfunction isEmojiOnlyToken(value: string): boolean {\n\treturn /^(?=.*(?:\\p{Extended_Pictographic}|\\p{Regional_Indicator}|[0-9#*]\\ufe0f?\\u20e3))(?:\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|\\p{Regional_Indicator}|\\u200d|\\ufe0f|[0-9#*]\\ufe0f?\\u20e3)+$/u.test(\n\t\tvalue,\n\t);\n}\n\nexport function extensionColor(key: string, value: string): ThemeColor {\n\tconst normalized = `${key} ${value}`.toLowerCase();\n\tif (/missing|error|fail|conflict|duplicate|unavailable/.test(normalized)) return \"warning\";\n\tif (normalized.includes(\"codex\")) return \"accent\";\n\tif (/ready|active|running|enabled|awake|ok/.test(normalized)) return \"success\";\n\treturn \"muted\";\n}\n\nexport function stripExtensionStatusPrefix(key: string, value: string): string {\n\treturn value.trim().replace(new RegExp(`^${escapeRegExp(key)}\\\\s*:\\\\s*`, \"iu\"), \"\");\n}\n\nexport function simplifyExtensionStatusText(value: string): string {\n\treturn value\n\t\t.trim()\n\t\t.replace(/\\bready\\b/giu, \"\u2713\")\n\t\t.replace(/\\bmissing\\b/giu, \"\u2717\")\n\t\t.replace(/,\\s*/g, \" \")\n\t\t.replace(/\\s+\\([^)]*\\)\\s*$/, \"\")\n\t\t.replace(/\\s+/g, \" \");\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ninterface InstalledExtensionPackage {\n\tpackageName: string;\n\tsource: string;\n\tidentity: string;\n}\n\nexport function readInstalledExtensionPackages(cwd: string): InstalledExtensionPackage[] {\n\tconst packages: InstalledExtensionPackage[] = [];\n\tconst settingsFiles = extensionSettingsFiles(cwd);\n\n\tfor (const settingsFile of settingsFiles) {\n\t\tconst baseDirectory = dirname(settingsFile);\n\t\tfor (const rawSource of readPackageSources(settingsFile)) {\n\t\t\tconst source = rawSource.trim();\n\t\t\tif (!source) continue;\n\t\t\tconst packageName = packageNameForSource(source, baseDirectory);\n\t\t\tif (!packageName) continue;\n\t\t\tpackages.push({ packageName, source, identity: sourceIdentity(source, baseDirectory) });\n\t\t}\n\t}\n\n\treturn packages;\n}\n\nfunction extensionSettingsFiles(cwd: string): string[] {\n\treturn [\n\t\tjoin(process.env.HOME ?? \"\", \".pi\", \"agent\", \"settings.json\"),\n\t\tjoin(cwd, \".pi\", \"settings.json\"),\n\t].filter((file) => existsSync(file));\n}\n\nexport function findDuplicateExtensions(\n\tinstalledPackages: readonly InstalledExtensionPackage[],\n): string[] {\n\tconst sourcesByPackage = new Map<string, Set<string>>();\n\n\tfor (const extensionPackage of installedPackages) {\n\t\tconst sources = sourcesByPackage.get(extensionPackage.packageName) ?? new Set<string>();\n\t\tsources.add(extensionPackage.identity);\n\t\tsourcesByPackage.set(extensionPackage.packageName, sources);\n\t}\n\n\treturn [...sourcesByPackage.entries()]\n\t\t.filter(([, sources]) => sources.size > 1)\n\t\t.map(([packageName]) => packageName.replace(/^@[^/]+\\//, \"\").replace(/^pi-/, \"\"));\n}\n\nexport function buildExtensionStatusIconAliases(\n\tinstalledPackages: readonly { packageName: string; source?: string }[],\n): Map<string, string[]> {\n\tconst packageAliasesByStatusBase = new Map<string, Map<string, string[]>>();\n\n\tfor (const extensionPackage of installedPackages) {\n\t\tconst candidate = extensionStatusIconAliasCandidate(\n\t\t\textensionPackage.packageName,\n\t\t\textensionPackage.source,\n\t\t);\n\t\tif (!candidate) continue;\n\t\tconst aliasesByPackage =\n\t\t\tpackageAliasesByStatusBase.get(candidate.statusBase) ?? new Map<string, string[]>();\n\t\tconst existingAliases = aliasesByPackage.get(extensionPackage.packageName) ?? [];\n\t\taliasesByPackage.set(\n\t\t\textensionPackage.packageName,\n\t\t\tuniqueStrings([...existingAliases, ...candidate.aliases]),\n\t\t);\n\t\tpackageAliasesByStatusBase.set(candidate.statusBase, aliasesByPackage);\n\t}\n\n\tconst aliases = new Map<string, string[]>();\n\tfor (const [statusBase, aliasesByPackage] of packageAliasesByStatusBase) {\n\t\tif (aliasesByPackage.size === 1)\n\t\t\taliases.set(statusBase, [...aliasesByPackage.values()][0] ?? []);\n\t}\n\treturn aliases;\n}\n\nfunction extensionStatusIconAliasCandidate(\n\tpackageName: string,\n\tsource?: string,\n): { statusBase: string; aliases: string[] } | undefined {\n\tconst packageBase = packageBaseName(packageName);\n\tconst statusBase = statusBaseFromPackageBase(packageBase);\n\tif (!statusBase) return undefined;\n\n\tconst sourceAliases = source?.startsWith(\"npm:\") ? [source, `npm:${npmPackageName(source)}`] : [];\n\treturn {\n\t\tstatusBase,\n\t\taliases: uniqueStrings([...sourceAliases, packageName, packageBase, statusBase]),\n\t};\n}\n\nfunction packageBaseName(packageName: string): string {\n\tconst slashIndex = packageName.lastIndexOf(\"/\");\n\treturn slashIndex === -1 ? packageName : packageName.slice(slashIndex + 1);\n}\n\nfunction statusBaseFromPackageBase(packageBase: string): string {\n\treturn packageBase.startsWith(\"pi-\") && packageBase.length > \"pi-\".length\n\t\t? packageBase.slice(\"pi-\".length)\n\t\t: packageBase;\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n\treturn [...new Set(values.filter((value) => value.length > 0))];\n}\n\nfunction readPackageSources(settingsFile: string): string[] {\n\ttry {\n\t\tconst settings = JSON.parse(readFileSync(settingsFile, \"utf8\")) as { packages?: unknown[] };\n\t\treturn (settings.packages ?? [])\n\t\t\t.map((entry) => {\n\t\t\t\tif (typeof entry === \"string\") return entry;\n\t\t\t\tif (\n\t\t\t\t\tentry &&\n\t\t\t\t\ttypeof entry === \"object\" &&\n\t\t\t\t\ttypeof (entry as { source?: unknown }).source === \"string\"\n\t\t\t\t) {\n\t\t\t\t\treturn (entry as { source: string }).source;\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t})\n\t\t\t.filter((source): source is string => source !== undefined);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction packageNameForSource(source: string, baseDirectory: string): string | undefined {\n\tif (source.startsWith(\"npm:\")) return npmPackageName(source);\n\tconst packageJson = join(resolveSourcePath(source, baseDirectory), \"package.json\");\n\ttry {\n\t\tconst packageData = JSON.parse(readFileSync(packageJson, \"utf8\")) as { name?: unknown };\n\t\treturn typeof packageData.name === \"string\" ? packageData.name : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function npmPackageName(source: string): string {\n\tconst spec = source.slice(\"npm:\".length);\n\tif (spec.startsWith(\"@\")) return spec.split(\"@\").slice(0, 2).join(\"@\");\n\treturn spec.split(\"@\")[0] ?? spec;\n}\n\nfunction sourceIdentity(source: string, baseDirectory: string): string {\n\tif (source.startsWith(\"npm:\")) return `npm:${npmPackageName(source)}`;\n\treturn resolveSourcePath(source, baseDirectory);\n}\n\nfunction resolveSourcePath(source: string, baseDirectory: string): string {\n\treturn isAbsolute(source) ? source : resolve(baseDirectory, source);\n}\n", "import type { Theme } from \"@earendil-works/pi-coding-agent\";\nimport { visibleWidth } from \"@earendil-works/pi-tui\";\nimport { ansiStyle } from \"./ansi.js\";\nimport { resolvePreset } from \"./presets/index.js\";\nimport type { BlockColors, PowerlinePreset } from \"./presets/types.js\";\nimport {\n\tLINE_BREAK_SEGMENT_NAME,\n\ttype PalettePreset,\n\ttype PowerlineBlockName,\n\ttype RenderItem,\n\ttype RenderSegment,\n\ttype SegmentPalette,\n\ttype SeparatorName,\n\ttype StatuslineConfig,\n} from \"./types.js\";\n\ninterface PowerlineBlock {\n\tbaseBlock: PowerlineBlockName;\n\tcolors: BlockColors;\n\tsegments: RenderSegment[];\n}\n\nexport function renderPowerlineStatusline(\n\twidth: number,\n\titems: RenderItem[],\n\tconfig: Pick<StatuslineConfig, \"palettePreset\" | \"palette\" | \"density\" | \"separator\">,\n): string {\n\tif (items.length === 0 || width <= 0) return \"\";\n\treturn splitLines(items)\n\t\t.map((segments) => fitPowerlineSegments(segments, width, config))\n\t\t.join(\"\\n\");\n}\n\nfunction splitLines(items: RenderItem[]): RenderSegment[][] {\n\tconst lines: RenderSegment[][] = [[]];\n\tfor (const item of items) {\n\t\tif (item.name === LINE_BREAK_SEGMENT_NAME) lines.push([]);\n\t\telse lines.at(-1)?.push(item);\n\t}\n\treturn lines;\n}\n\nconst SEGMENT_RETENTION_PRIORITY: Readonly<Record<RenderSegment[\"name\"], number>> = {\n\tcontext: 120,\n\tmodel: 110,\n\tbranch: 100,\n\ttools: 90,\n\tcwd: 80,\n\tthinking: 70,\n\tcost: 60,\n\tprovider: 50,\n\tcache: 45,\n\ttokens: 40,\n\ttime: 30,\n\tturn: 20,\n\tbrand: 10,\n};\n\nfunction fitPowerlineSegments(\n\tsegments: readonly RenderSegment[],\n\twidth: number,\n\tconfig: Pick<StatuslineConfig, \"palettePreset\" | \"palette\" | \"density\" | \"separator\">,\n): string {\n\tif (segments.length === 0) return \"\";\n\tconst fitted = [...segments];\n\twhile (fitted.length > 1) {\n\t\tconst rendered = joinPowerlineSegments(fitted, config);\n\t\tif (visibleWidth(rendered) <= width) return rendered;\n\t\tlet removalIndex = 0;\n\t\tfor (let index = 1; index < fitted.length; index += 1) {\n\t\t\tconst candidate = fitted[index];\n\t\t\tconst current = fitted[removalIndex];\n\t\t\tif (\n\t\t\t\tcandidate &&\n\t\t\t\tcurrent &&\n\t\t\t\tSEGMENT_RETENTION_PRIORITY[candidate.name] < SEGMENT_RETENTION_PRIORITY[current.name]\n\t\t\t) {\n\t\t\t\tremovalIndex = index;\n\t\t\t}\n\t\t}\n\t\tfitted.splice(removalIndex, 1);\n\t}\n\tconst rendered = joinPowerlineSegments(fitted, config);\n\treturn visibleWidth(rendered) <= width ? rendered : \"\";\n}\n\nexport function powerlineExtensionSeparator(\n\t_theme: Theme,\n\tpalettePreset: PalettePreset = \"tokyo-night\",\n): string {\n\treturn ansiStyle(\" \u2022 \", { fg: resolvePreset(palettePreset).extensionSeparator });\n}\n\nfunction joinPowerlineSegments(\n\tsegments: RenderSegment[],\n\tconfig: Pick<StatuslineConfig, \"palettePreset\" | \"palette\" | \"density\" | \"separator\">,\n): string {\n\tconst preset = resolvePreset(config.palettePreset);\n\tconst blocks = contiguousBlocks(segments, preset, config.palettePreset, config.palette);\n\tlet line = ansiStyle(\"\u2591\u2592\u2593\", { fg: preset.lead });\n\n\tfor (const [index, block] of blocks.entries()) {\n\t\tconst previous = index === 0 ? undefined : blocks[index - 1]?.colors;\n\t\tif (previous) line += ansiStyle(\"\uE0B4\", { fg: previous.bg, bg: block.colors.bg });\n\t\tline += ansiStyle(formatBlockText(block, config), block.colors);\n\t}\n\n\tconst lastBlock = blocks.at(-1);\n\tif (lastBlock) line += ansiStyle(\"\uE0B4\", { fg: lastBlock.colors.bg });\n\treturn line;\n}\n\nfunction contiguousBlocks(\n\tsegments: RenderSegment[],\n\tpreset: PowerlinePreset,\n\tpalettePreset: PalettePreset,\n\tconfiguredPalette: SegmentPalette,\n): PowerlineBlock[] {\n\tconst blocks: PowerlineBlock[] = [];\n\tconst usesConfiguredColors = palettePreset === \"custom\";\n\tfor (const segment of segments) {\n\t\tconst colors = usesConfiguredColors\n\t\t\t? (configuredPalette[segment.name] ?? {})\n\t\t\t: preset.blocks[segment.block];\n\t\tconst previous = blocks.at(-1);\n\t\tconst matchesPrevious =\n\t\t\tprevious !== undefined &&\n\t\t\t(usesConfiguredColors\n\t\t\t\t? colorsEqual(previous.colors, colors)\n\t\t\t\t: previous.baseBlock === segment.block);\n\t\tif (matchesPrevious) previous.segments.push(segment);\n\t\telse blocks.push({ baseBlock: segment.block, colors, segments: [segment] });\n\t}\n\treturn blocks;\n}\n\nfunction colorsEqual(left: BlockColors, right: BlockColors): boolean {\n\treturn left.fg === right.fg && left.bg === right.bg;\n}\n\nfunction formatBlockText(\n\tblock: PowerlineBlock,\n\tconfig: Pick<StatuslineConfig, \"density\" | \"separator\">,\n): string {\n\tconst texts = block.segments.map(formatSegmentText);\n\tconst separator = separatorText(config.separator, config.density === \"cozy\");\n\tconst leading = config.density === \"cozy\" ? \" \" : \" \";\n\tconst trailing = config.density === \"cozy\" ? \" \" : \"\";\n\treturn `${leading}${texts.join(separator)}${trailing}`;\n}\n\nfunction formatSegmentText(segment: RenderSegment): string {\n\treturn segment.emphasis ? `\\u001b[1m${segment.text}\\u001b[22m` : segment.text;\n}\n\nfunction separatorText(separator: SeparatorName, cozy: boolean): string {\n\tconst padding = cozy ? \" \" : \" \";\n\tswitch (separator) {\n\t\tcase \"dot\":\n\t\t\treturn `${padding}\u2022${padding}`;\n\t\tcase \"bar\":\n\t\t\treturn `${padding}\u2502${padding}`;\n\t\tcase \"powerline\":\n\t\t\treturn `${padding}\uE0B1${padding}`;\n\t\tcase \"round\":\n\t\t\treturn `${padding}\u276F${padding}`;\n\t\tcase \"none\":\n\t\t\treturn padding;\n\t}\n}\n", "export function ansiStyle(text: string, colors: { fg?: string; bg?: string }): string {\n\tconst codes = [\n\t\tcolors.fg ? truecolorCode(\"38\", colors.fg) : undefined,\n\t\tcolors.bg ? truecolorCode(\"48\", colors.bg) : undefined,\n\t].filter((code): code is string => code !== undefined);\n\tif (codes.length === 0) return text;\n\treturn `\\u001b[${codes.join(\";\")}m${text}\\u001b[0m`;\n}\n\nexport function ansiFg(hex: string, text: string): string {\n\treturn ansiStyle(text, { fg: hex });\n}\n\nfunction truecolorCode(prefix: \"38\" | \"48\", hex: string): string {\n\tconst { red, green, blue } = hexToRgb(hex);\n\treturn `${prefix};2;${red};${green};${blue}`;\n}\n\nfunction hexToRgb(hex: string): { red: number; green: number; blue: number } {\n\tconst normalized = hex.replace(/^#/, \"\");\n\treturn {\n\t\tred: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tgreen: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tblue: Number.parseInt(normalized.slice(4, 6), 16),\n\t};\n}\n", "import { isAbsolute } from \"node:path\";\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\n\nconst GIT_STATUS_TIMEOUT_MS = 3_000;\n\nexport interface GitStatusSummary {\n\troot?: string;\n\tahead: number;\n\tbehind: number;\n\tstaged: number;\n\tmodified: number;\n\tuntracked: number;\n\tconflicts: number;\n}\n\nexport async function readGitStatus(\n\tpi: ExtensionAPI,\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<GitStatusSummary | undefined> {\n\tconst [statusResult, rootResult] = await Promise.all([\n\t\tpi.exec(\n\t\t\t\"git\",\n\t\t\t[\"--no-optional-locks\", \"status\", \"--porcelain=v1\", \"--branch\", \"--untracked-files=normal\"],\n\t\t\t{ cwd, timeout: GIT_STATUS_TIMEOUT_MS, signal },\n\t\t),\n\t\tpi\n\t\t\t.exec(\"git\", [\"rev-parse\", \"--path-format=absolute\", \"--show-toplevel\"], {\n\t\t\t\tcwd,\n\t\t\t\ttimeout: GIT_STATUS_TIMEOUT_MS,\n\t\t\t\tsignal,\n\t\t\t})\n\t\t\t.catch(() => undefined),\n\t]);\n\tif (statusResult.code !== 0 || statusResult.killed) return undefined;\n\tconst summary = parseGitStatusPorcelain(statusResult.stdout);\n\tif (rootResult && rootResult.code === 0 && !rootResult.killed) {\n\t\tconst root = parseGitRoot(rootResult.stdout);\n\t\tif (root) summary.root = root;\n\t}\n\treturn summary;\n}\n\nexport function parseGitStatusPorcelain(output: string): GitStatusSummary {\n\tconst summary: GitStatusSummary = {\n\t\tahead: 0,\n\t\tbehind: 0,\n\t\tstaged: 0,\n\t\tmodified: 0,\n\t\tuntracked: 0,\n\t\tconflicts: 0,\n\t};\n\tfor (const line of output.split(/\\r?\\n/)) {\n\t\tif (!line) continue;\n\t\tif (line.startsWith(\"## \")) {\n\t\t\tconst ahead = line.match(/\\bahead (\\d+)/u);\n\t\t\tconst behind = line.match(/\\bbehind (\\d+)/u);\n\t\t\tsummary.ahead = ahead ? Number(ahead[1]) : 0;\n\t\t\tsummary.behind = behind ? 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\tsummary.untracked += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isConflictStatus(indexStatus, worktreeStatus)) {\n\t\t\tsummary.conflicts += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isChangedStatus(indexStatus)) summary.staged += 1;\n\t\tif (isChangedStatus(worktreeStatus)) summary.modified += 1;\n\t}\n\treturn summary;\n}\n\nfunction isConflictStatus(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\nfunction isChangedStatus(status: string): boolean {\n\treturn status !== \" \" && status !== \"?\" && status !== \"!\";\n}\n\nexport function parseGitRoot(output: string): string | undefined {\n\tconst root = output.split(/\\r?\\n/u)[0]?.trim();\n\treturn root && isAbsolute(root) ? root : undefined;\n}\n\nexport function formatGitStatusSummary(summary: GitStatusSummary | undefined): string {\n\tif (!summary) return \"\";\n\tconst tokens = [\n\t\t[\"\u21E1\", summary.ahead],\n\t\t[\"\u21E3\", summary.behind],\n\t\t[\"+\", summary.staged],\n\t\t[\"~\", summary.modified],\n\t\t[\"?\", summary.untracked],\n\t\t[\"!\", summary.conflicts],\n\t] as const;\n\treturn tokens\n\t\t.filter(([, count]) => count > 0)\n\t\t.map(([prefix, count]) => `${prefix}${formatCount(count)}`)\n\t\t.join(\" \");\n}\n\nexport function formatGitBranchValue(\n\tbranch: string | null,\n\tstatus: GitStatusSummary | undefined,\n\tpr?: string,\n): string {\n\tif (!branch) return \"no-git\";\n\tconst suffixes = [formatGitStatusSummary(status), pr ? `(${pr})` : \"\"].filter(Boolean);\n\treturn suffixes.length > 0 ? `${branch} ${suffixes.join(\" \")}` : branch;\n}\n\nexport function formatGitBranchText(\n\tbranch: string | null,\n\tstatus: GitStatusSummary | undefined,\n\tpr?: string,\n): string {\n\treturn `\uD83C\uDF3F ${formatGitBranchValue(branch, status, pr)}`;\n}\n\nexport function gitStatusSummaryEqual(\n\tleft: GitStatusSummary | undefined,\n\tright: GitStatusSummary | undefined,\n): boolean {\n\tif (!left || !right) return left === right;\n\treturn (\n\t\tleft.root === right.root &&\n\t\tleft.ahead === right.ahead &&\n\t\tleft.behind === right.behind &&\n\t\tleft.staged === right.staged &&\n\t\tleft.modified === right.modified &&\n\t\tleft.untracked === right.untracked &&\n\t\tleft.conflicts === right.conflicts\n\t);\n}\n\nfunction formatCount(value: number): string {\n\treturn Intl.NumberFormat(\"en\", { notation: \"compact\", maximumFractionDigits: 1 }).format(value);\n}\n", "import { basename, isAbsolute, relative, sep } from \"node:path\";\nimport { sanitizeTerminalText } from \"./terminal.js\";\n\nconst DEFAULT_TRUNCATION_LENGTH = 3;\nconst DEFAULT_HOME_SYMBOL = \"~\";\n\n/** Apply Starship's default directory presentation without exposing a format language. */\nexport function formatDirectoryPath(\n\tcwd: string,\n\thomeDir: string | undefined,\n\tgitRoot: string | undefined,\n): string {\n\tconst contracted =\n\t\tgitRoot && (!homeDir || !samePath(gitRoot, homeDir))\n\t\t\t? (contractRepositoryPath(cwd, gitRoot) ?? contractPath(cwd, homeDir, DEFAULT_HOME_SYMBOL))\n\t\t\t: contractPath(cwd, homeDir, DEFAULT_HOME_SYMBOL);\n\tconst safeContracted = sanitizeTerminalText(contracted);\n\tconst components = safeContracted.split(\"/\").filter((component) => component.length > 0);\n\tconst displayed =\n\t\tcomponents.length > DEFAULT_TRUNCATION_LENGTH\n\t\t\t? components.slice(-DEFAULT_TRUNCATION_LENGTH).join(\"/\")\n\t\t\t: safeContracted;\n\tconst native = sep === \"/\" ? displayed : displayed.replaceAll(\"/\", sep);\n\treturn sanitizeTerminalText(native || basename(cwd) || cwd);\n}\n\nfunction toSlashPath(value: string): string {\n\treturn sep === \"\\\\\" ? value.replaceAll(\"\\\\\", \"/\") : value;\n}\n\nfunction contractPath(path: string, root: string | undefined, replacement: string): string {\n\tif (!root) return toSlashPath(path);\n\tconst child = relativeWithin(path, root);\n\tif (child === undefined) return toSlashPath(path);\n\treturn child ? `${replacement}/${child}` : replacement;\n}\n\nfunction contractRepositoryPath(path: string, root: string): string | undefined {\n\tconst child = relativeWithin(path, root);\n\tif (child === undefined) return undefined;\n\tconst name = basename(root) || toSlashPath(root);\n\treturn child ? `${name}/${child}` : name;\n}\n\nfunction relativeWithin(path: string, root: string): string | undefined {\n\tconst child = relative(root, path);\n\tif (child === \"\") return \"\";\n\tif (child === \"..\" || child.startsWith(`..${sep}`) || isAbsolute(child)) return undefined;\n\treturn toSlashPath(child);\n}\n\nfunction samePath(left: string, right: string): boolean {\n\treturn relative(left, right) === \"\";\n}\n", "export function sanitizeTerminalText(value: string): string {\n\tlet result = \"\";\n\tfor (let index = 0; index < value.length; ) {\n\t\tconst codePoint = value.codePointAt(index) ?? 0;\n\t\tconst character = String.fromCodePoint(codePoint);\n\t\tif (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n\t\t\tindex = skipTerminalEscape(value, index, codePoint);\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tcodePoint <= 0x1f ||\n\t\t\t(codePoint >= 0x7f && codePoint <= 0x9f) ||\n\t\t\tcodePoint === 0x2028 ||\n\t\t\tcodePoint === 0x2029\n\t\t) {\n\t\t\tif (\n\t\t\t\tcodePoint === 0x09 ||\n\t\t\t\tcodePoint === 0x0a ||\n\t\t\t\tcodePoint === 0x0d ||\n\t\t\t\tcodePoint === 0x85 ||\n\t\t\t\tcodePoint === 0x2028 ||\n\t\t\t\tcodePoint === 0x2029\n\t\t\t) {\n\t\t\t\tresult += \" \";\n\t\t\t}\n\t\t\tindex += character.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += character;\n\t\tindex += character.length;\n\t}\n\treturn result;\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n\tlet index = start + 1;\n\tconst next = value.charCodeAt(index);\n\tconst isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n\tif (isOsc) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tif (current === 0x07 || current === 0x9c) return index + 1;\n\t\t\tif (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n\t\t\tindex += 1;\n\t\t}\n\t\treturn index;\n\t}\n\tconst isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n\tif (isCsi) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tindex += 1;\n\t\t\tif (current >= 0x40 && current <= 0x7e) break;\n\t\t}\n\t\treturn index;\n\t}\n\treturn Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\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", "import type {\n\tExtensionAPI,\n\tExtensionContext,\n\tReadonlyFooterDataProvider,\n\tTheme,\n\tThemeColor,\n} from \"@earendil-works/pi-coding-agent\";\nimport { formatDirectoryPath } from \"./directory.js\";\nimport {\n\ttype ExtensionStatusRuntime,\n\tformatExtensionStatuses,\n\twrapExtensionStatusline,\n} from \"./extension-status.js\";\nimport { formatGitBranchValue, type GitStatusSummary } from \"./git-status.js\";\nimport { renderPowerlineStatusline } from \"./powerline.js\";\nimport { sanitizeTerminalText } from \"./terminal.js\";\nimport {\n\tLINE_BREAK_SEGMENT_NAME,\n\ttype PowerlineBlockName,\n\ttype RenderItem,\n\ttype RenderSegment,\n\ttype SegmentName,\n\ttype StatuslineConfig,\n\ttype TruncationDirection,\n} from \"./types.js\";\nimport { type FooterUsageSummary, summarizeFooterUsage } from \"./usage.js\";\n\ntype ThinkingLevel = ReturnType<ExtensionAPI[\"getThinkingLevel\"]>;\nexport interface RuntimeState extends ExtensionStatusRuntime {\n\thomeDir?: string;\n\tturnCount: number;\n\tactiveTools: Map<string, number>;\n\tisStreaming: boolean;\n\tthinkingLevel: ThinkingLevel;\n\tgitStatus?: GitStatusSummary;\n\trequestRender?: () => void;\n}\nconst GITHUB_PR_KEY = \"github-pr\";\nconst GITHUB_PR_STATUS_KEYS = new Set([GITHUB_PR_KEY]);\nexport function renderStatusline(\n\twidth: number,\n\tctx: ExtensionContext,\n\tfooterData: ReadonlyFooterDataProvider,\n\t_theme: Theme,\n\tconfig: StatuslineConfig,\n\truntime: RuntimeState,\n): string {\n\tif (width <= 0) return \"\";\n\n\tconst usageSummary = summarizeFooterUsage(ctx.sessionManager.getEntries());\n\tconst rows: Array<{ configuredSegments: number; segments: RenderSegment[] }> = [\n\t\t{ configuredSegments: 0, segments: [] },\n\t];\n\tfor (const name of config.segments) {\n\t\tif (name === LINE_BREAK_SEGMENT_NAME) {\n\t\t\trows.push({ configuredSegments: 0, segments: [] });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst row = rows.at(-1);\n\t\tif (!row) continue;\n\t\trow.configuredSegments += 1;\n\t\tconst rendered = buildSegment(name, ctx, footerData, config, runtime, usageSummary);\n\t\tif (rendered && rendered.text.length > 0) row.segments.push(rendered);\n\t}\n\n\tconst segments: RenderItem[] = [];\n\tconst renderedRows = rows.filter(\n\t\t(row) => row.configuredSegments === 0 || row.segments.length > 0,\n\t);\n\tfor (const [index, row] of renderedRows.entries()) {\n\t\tif (index > 0) segments.push({ name: LINE_BREAK_SEGMENT_NAME });\n\t\tsegments.push(...row.segments);\n\t}\n\n\treturn renderPowerlineStatusline(width, segments, config);\n}\n\nexport function renderExtensionStatusline(\n\twidth: number,\n\tfooterData: ReadonlyFooterDataProvider,\n\ttheme: Theme,\n\tconfig: StatuslineConfig,\n\truntime: RuntimeState,\n\tmainLine: string,\n): string[] {\n\tconst statuses = footerData.getExtensionStatuses();\n\tconst prContext = prContextFromStatuses(statuses);\n\tconst rendersPrInline = prContext !== undefined && mainLine.includes(prContext);\n\tconst status = formatExtensionStatuses(\n\t\tstatuses,\n\t\ttheme,\n\t\tconfig,\n\t\truntime,\n\t\trendersPrInline ? GITHUB_PR_STATUS_KEYS : undefined,\n\t);\n\treturn wrapExtensionStatusline(status, width);\n}\n\nfunction buildSegment(\n\tname: SegmentName,\n\tctx: ExtensionContext,\n\tfooterData: ReadonlyFooterDataProvider,\n\tconfig: StatuslineConfig,\n\truntime: RuntimeState,\n\tusageSummary: FooterUsageSummary,\n): RenderSegment | undefined {\n\tswitch (name) {\n\t\tcase \"brand\":\n\t\t\treturn segment(name, \"\u03C0\", config, \"accent\", \"header\", true);\n\t\tcase \"provider\":\n\t\t\treturn segment(name, ctx.model?.provider ?? \"no-provider\", config, \"accent\", \"header\");\n\t\tcase \"model\": {\n\t\t\tconst presentation = config.segmentText.model;\n\t\t\tconst model = truncateModel(\n\t\t\t\tshortenModel(ctx.model?.id ?? \"no-model\"),\n\t\t\t\tpresentation.truncationLength,\n\t\t\t\tpresentation.truncationSymbol,\n\t\t\t\tpresentation.truncationDirection,\n\t\t\t);\n\t\t\treturn segment(name, model, config, \"accent\", \"header\");\n\t\t}\n\t\tcase \"thinking\":\n\t\t\treturn segment(\n\t\t\t\tname,\n\t\t\t\truntime.thinkingLevel,\n\t\t\t\tconfig,\n\t\t\t\tthinkingColor(runtime.thinkingLevel),\n\t\t\t\t\"header\",\n\t\t\t);\n\t\tcase \"branch\": {\n\t\t\tconst branch = footerData.getGitBranch();\n\t\t\tconst pr = branch ? prContextFromStatuses(footerData.getExtensionStatuses()) : undefined;\n\t\t\treturn segment(\n\t\t\t\tname,\n\t\t\t\tformatGitBranchValue(branch, runtime.gitStatus, pr),\n\t\t\t\tconfig,\n\t\t\t\t\"accent\",\n\t\t\t\t\"git\",\n\t\t\t);\n\t\t}\n\t\tcase \"cwd\":\n\t\t\treturn segment(\n\t\t\t\tname,\n\t\t\t\tformatDirectoryPath(ctx.cwd, runtime.homeDir, runtime.gitStatus?.root),\n\t\t\t\tconfig,\n\t\t\t\t\"accent\",\n\t\t\t\t\"directory\",\n\t\t\t);\n\t\tcase \"tools\": {\n\t\t\tconst activity = formatToolActivity(runtime);\n\t\t\treturn activity ? segment(name, activity, config, \"accent\", \"runtime\") : undefined;\n\t\t}\n\t\tcase \"context\": {\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst percentage =\n\t\t\t\tusage?.percent === null || usage?.percent === undefined\n\t\t\t\t\t? \"?\"\n\t\t\t\t\t: `${usage.percent.toFixed(1)}%`;\n\t\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? 0;\n\t\t\treturn segment(\n\t\t\t\tname,\n\t\t\t\t`${percentage}/${formatCount(contextWindow)}`,\n\t\t\t\tconfig,\n\t\t\t\tcontextColor(usage?.percent),\n\t\t\t\t\"runtime\",\n\t\t\t);\n\t\t}\n\t\tcase \"tokens\": {\n\t\t\tconst value =\n\t\t\t\tusageSummary.input === 0 && usageSummary.output === 0\n\t\t\t\t\t? \"tok 0\"\n\t\t\t\t\t: `\u2191${formatCount(usageSummary.input)} \u2193${formatCount(usageSummary.output)}`;\n\t\t\treturn segment(name, value, config, \"accent\", \"runtime\");\n\t\t}\n\t\tcase \"cache\": {\n\t\t\tif (usageSummary.cacheRead === 0 && usageSummary.cacheWrite === 0) return undefined;\n\t\t\tconst values: string[] = [];\n\t\t\tif (usageSummary.cacheRead > 0) values.push(`R${formatCount(usageSummary.cacheRead)}`);\n\t\t\tif (usageSummary.cacheWrite > 0) values.push(`W${formatCount(usageSummary.cacheWrite)}`);\n\t\t\tif (usageSummary.latestCacheHitRate !== undefined) {\n\t\t\t\tvalues.push(`CH${usageSummary.latestCacheHitRate.toFixed(1)}%`);\n\t\t\t}\n\t\t\treturn segment(name, values.join(\" \"), config, \"accent\", \"runtime\");\n\t\t}\n\t\tcase \"cost\": {\n\t\t\tconst subscription = isSubscriptionBacked(ctx) ? \" (sub)\" : \"\";\n\t\t\treturn segment(\n\t\t\t\tname,\n\t\t\t\t`${usageSummary.cost.toFixed(usageSummary.cost >= 1 ? 2 : 3)}${subscription}`,\n\t\t\t\tconfig,\n\t\t\t\t\"accent\",\n\t\t\t\t\"meter\",\n\t\t\t);\n\t\t}\n\t\tcase \"time\":\n\t\t\treturn segment(name, formatTime(), config, \"accent\", \"meter\");\n\t\tcase \"turn\":\n\t\t\treturn segment(name, `${runtime.turnCount}`, config, \"accent\", \"meter\");\n\t}\n}\n\nfunction segment(\n\tname: SegmentName,\n\tvalue: string,\n\tconfig: StatuslineConfig,\n\tcolor: RenderSegment[\"color\"],\n\tblock: PowerlineBlockName,\n\temphasis = false,\n): RenderSegment {\n\treturn { name, text: formatConfiguredSegment(name, value, config), color, block, emphasis };\n}\n\nexport function formatConfiguredSegment(\n\tname: SegmentName,\n\tvalue: string,\n\tconfig: Pick<StatuslineConfig, \"segmentText\">,\n): string {\n\tconst presentation = config.segmentText[name];\n\treturn `${presentation.prefix}${value}${presentation.suffix}`;\n}\n\nfunction thinkingColor(level: ThinkingLevel): ThemeColor {\n\tswitch (level as string) {\n\t\tcase \"off\":\n\t\t\treturn \"dim\";\n\t\tcase \"minimal\":\n\t\t\treturn \"thinkingMinimal\";\n\t\tcase \"low\":\n\t\t\treturn \"thinkingLow\";\n\t\tcase \"medium\":\n\t\t\treturn \"thinkingMedium\";\n\t\tcase \"high\":\n\t\t\treturn \"thinkingHigh\";\n\t\tcase \"xhigh\":\n\t\t\treturn \"thinkingXhigh\";\n\t\tcase \"max\":\n\t\t\treturn \"thinkingMax\" as ThemeColor;\n\t\tdefault:\n\t\t\treturn \"dim\";\n\t}\n}\n\nexport function contextColor(percent: number | null | undefined): ThemeColor {\n\tif (percent === null || percent === undefined) return \"dim\";\n\tif (percent >= 90) return \"error\";\n\tif (percent >= 70) return \"warning\";\n\treturn \"success\";\n}\n\nexport function formatToolActivity(runtime: RuntimeState): string | undefined {\n\tconst active = [...runtime.activeTools.entries()];\n\tif (active.length > 0) {\n\t\tconst [name, count] = active[0] ?? [\"tool\", 1];\n\t\tconst suffix = count > 1 ? `\u00D7${count}` : active.length > 1 ? `+${active.length - 1}` : \"\";\n\t\treturn `\u2699 ${name}${suffix}`;\n\t}\n\n\treturn runtime.isStreaming ? \"\uD83D\uDCAD thinking\" : undefined;\n}\n\nexport function prLinkFromStatuses(statuses: ReadonlyMap<string, string>): string | undefined {\n\tconst value = statuses.get(GITHUB_PR_KEY);\n\tif (!value) return undefined;\n\t// Extract the OSC 8 hyperlink span (the clickable \"#123\"); skip non-PR states\n\t// like \"PR gh missing\" that carry no link. github-pr emits exactly one link, so the\n\t// first OSC 8 span is the PR number.\n\tconst open = value.indexOf(\"\\x1b]8;;\");\n\tif (open === -1) return undefined;\n\tconst closeMarker = \"\\x1b]8;;\\x07\";\n\tconst close = value.indexOf(closeMarker, open + 1);\n\treturn close === -1 ? undefined : value.slice(open, close + closeMarker.length);\n}\n\nexport function prContextFromStatuses(statuses: ReadonlyMap<string, string>): string | undefined {\n\tconst value = statuses.get(GITHUB_PR_KEY);\n\tconst link = prLinkFromStatuses(statuses);\n\tif (!value || !link) return undefined;\n\n\tconst state = compactPrState(value.replace(link, \"\"));\n\treturn state ? `${link} \u00B7 ${state}` : undefined;\n}\n\nfunction compactPrState(value: string): string | undefined {\n\tif (/:\\s*merged\\s*$/.test(value)) return \"merged\";\n\tif (/:\\s*closed\\s*$/.test(value)) return \"closed\";\n\tif (/\\bdraft\\b/.test(value)) return \"draft\";\n\n\tconst failing = /\\bchecks failing \\((\\d+)\\)/.exec(value);\n\tif (failing) return `${failing[1]} failing`;\n\tif (/\\bchanges requested\\b/.test(value)) return \"changes requested\";\n\n\tconst pending = /\\bchecks pending \\((\\d+)\\)/.exec(value);\n\tif (pending) return `${pending[1]} pending`;\n\tif (/\\bapproved\\b/.test(value)) return \"approved\";\n\tif (/\\breview required\\b/.test(value)) return \"review required\";\n\tif (/\\bchecks passing\\b/.test(value)) return \"checks passing\";\n\tif (/\\bno checks\\b/.test(value)) return \"no checks\";\n\treturn undefined;\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\nexport function formatCount(value: number): string {\n\tif (value < 1000) return `${value}`;\n\tif (value < 1_000_000) return `${(value / 1000).toFixed(value < 10_000 ? 1 : 0)}k`;\n\treturn `${(value / 1_000_000).toFixed(1)}m`;\n}\n\nfunction formatTime(): string {\n\tconst now = new Date();\n\tconst hours = now.getHours().toString().padStart(2, \"0\");\n\tconst minutes = now.getMinutes().toString().padStart(2, \"0\");\n\treturn `${hours}:${minutes}`;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function truncateModel(\n\tmodel: string,\n\tlength: number,\n\tsymbol: string,\n\tdirection: TruncationDirection,\n): string {\n\tconst safeModel = sanitizeTerminalText(model);\n\tif (length === 0) return safeModel;\n\tconst graphemes = [...graphemeSegmenter.segment(safeModel)].map(({ segment }) => segment);\n\tif (graphemes.length <= length) return safeModel;\n\tconst safeSymbol = sanitizeTerminalText(symbol);\n\n\tswitch (direction) {\n\t\tcase \"start\":\n\t\t\treturn `${safeSymbol}${graphemes.slice(-length).join(\"\")}`;\n\t\tcase \"middle\": {\n\t\t\tconst headLength = Math.ceil(length / 2);\n\t\t\tconst tailLength = Math.floor(length / 2);\n\t\t\tconst tail = tailLength > 0 ? graphemes.slice(-tailLength).join(\"\") : \"\";\n\t\t\treturn `${graphemes.slice(0, headLength).join(\"\")}${safeSymbol}${tail}`;\n\t\t}\n\t\tcase \"end\":\n\t\t\treturn `${graphemes.slice(0, length).join(\"\")}${safeSymbol}`;\n\t}\n}\n\nexport function shortenModel(model: string): string {\n\treturn model\n\t\t.replace(/^claude-/, \"\")\n\t\t.replace(/^gpt-/, \"gpt \")\n\t\t.replace(/-20\\d{6}$/, \"\")\n\t\t.replace(/-latest$/, \"\");\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["rendered", "segment", "isAbsolute", "isAbsolute", "isAbsolute", "formatCount", "segment", "STATUSLINE_KEY", "EMPTY_EXTENSION_STATUS_ICON_ALIASES"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narumitw/pi-statusline",
3
- "version": "0.49.0",
3
+ "version": "0.49.3",
4
4
  "description": "Pi extension that replaces the footer with an information-rich statusline.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -13,7 +13,8 @@
13
13
  "footer"
14
14
  ],
15
15
  "files": [
16
- "src",
16
+ "src/index.ts",
17
+ "dist",
17
18
  "README.md",
18
19
  "LICENSE"
19
20
  ],
@@ -23,8 +24,10 @@
23
24
  ]
24
25
  },
25
26
  "scripts": {
26
- "check": "biome check --vcs-use-ignore-file=false src test package.json tsconfig.json README.md && npm run typecheck",
27
- "format": "biome check --write --vcs-use-ignore-file=false src test package.json tsconfig.json README.md",
27
+ "build": "node --test scripts/build-runtime.test.mjs && node scripts/build-runtime.mjs",
28
+ "check": "npm run build && biome check --vcs-use-ignore-file=false src test scripts package.json tsconfig.json README.md && npm run typecheck",
29
+ "format": "biome check --write --vcs-use-ignore-file=false src test scripts package.json tsconfig.json README.md",
30
+ "prepack": "npm run build",
28
31
  "typecheck": "tsc --noEmit"
29
32
  },
30
33
  "peerDependencies": {
@@ -32,10 +35,11 @@
32
35
  "@earendil-works/pi-tui": "*"
33
36
  },
34
37
  "devDependencies": {
35
- "@biomejs/biome": "2.5.6",
38
+ "@biomejs/biome": "2.5.7",
36
39
  "@earendil-works/pi-coding-agent": "0.83.0",
37
40
  "@earendil-works/pi-tui": "0.83.0",
38
41
  "@types/node": "26.1.2",
42
+ "esbuild": "0.28.1",
39
43
  "typescript": "7.0.2"
40
44
  },
41
45
  "repository": {
@@ -44,6 +48,6 @@
44
48
  "directory": "extensions/pi-statusline"
45
49
  },
46
50
  "dependencies": {
47
- "@narumitw/pi-tui-kit": "^0.46.0"
51
+ "@narumitw/pi-tui-kit": "^0.49.1"
48
52
  }
49
53
  }
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export { default } from "./statusline.js";
1
+ export { default } from "../dist/statusline.js";
package/src/ansi.ts DELETED
@@ -1,26 +0,0 @@
1
- export function ansiStyle(text: string, colors: { fg?: string; bg?: string }): string {
2
- const codes = [
3
- colors.fg ? truecolorCode("38", colors.fg) : undefined,
4
- colors.bg ? truecolorCode("48", colors.bg) : undefined,
5
- ].filter((code): code is string => code !== undefined);
6
- if (codes.length === 0) return text;
7
- return `\u001b[${codes.join(";")}m${text}\u001b[0m`;
8
- }
9
-
10
- export function ansiFg(hex: string, text: string): string {
11
- return ansiStyle(text, { fg: hex });
12
- }
13
-
14
- function truecolorCode(prefix: "38" | "48", hex: string): string {
15
- const { red, green, blue } = hexToRgb(hex);
16
- return `${prefix};2;${red};${green};${blue}`;
17
- }
18
-
19
- function hexToRgb(hex: string): { red: number; green: number; blue: number } {
20
- const normalized = hex.replace(/^#/, "");
21
- return {
22
- red: Number.parseInt(normalized.slice(0, 2), 16),
23
- green: Number.parseInt(normalized.slice(2, 4), 16),
24
- blue: Number.parseInt(normalized.slice(4, 6), 16),
25
- };
26
- }