@v1nvn/statusline 0.30.3 → 0.30.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/render.mjs +10 -3
- package/dist/render.mjs.map +1 -1
- package/package.json +2 -2
package/dist/render.mjs
CHANGED
|
@@ -542,6 +542,11 @@ function fmtFixed(x, d) {
|
|
|
542
542
|
function pad2(n) {
|
|
543
543
|
return String(n).padStart(2, "0");
|
|
544
544
|
}
|
|
545
|
+
function fmtDuration(minutes) {
|
|
546
|
+
if (minutes < 60) return `${minutes}m`;
|
|
547
|
+
if (minutes < 1440) return `${Math.trunc(minutes / 60)}h${pad2(minutes % 60)}m`;
|
|
548
|
+
return `${Math.trunc(minutes / 1440)}d${pad2(Math.trunc(minutes / 60) % 24)}h`;
|
|
549
|
+
}
|
|
545
550
|
function fmtK(n, d) {
|
|
546
551
|
return `${fmtFixed(n / 1e3, d)}k`;
|
|
547
552
|
}
|
|
@@ -758,6 +763,7 @@ function barFlatAt(input, w) {
|
|
|
758
763
|
const pct = input.row.pct;
|
|
759
764
|
let f = trunc(pct * w / 100);
|
|
760
765
|
if (f > w) f = w;
|
|
766
|
+
if (pct > 0 && f === 0) f = 1;
|
|
761
767
|
return `${pct >= 90 ? RED$1 : pct >= 70 ? YELLOW$1 : GREEN$1}${"█".repeat(f)}${"░".repeat(w - f)}${RESET$1}`;
|
|
762
768
|
}
|
|
763
769
|
function barFlat(input) {
|
|
@@ -852,11 +858,12 @@ function costBurn(input) {
|
|
|
852
858
|
return out;
|
|
853
859
|
}
|
|
854
860
|
function durationClock({ row }) {
|
|
855
|
-
return
|
|
861
|
+
return fmtDuration(trunc(row.durationMs / 6e4));
|
|
856
862
|
}
|
|
857
863
|
function durationHours({ row }) {
|
|
858
864
|
const m = trunc(row.durationMs / 6e4);
|
|
859
|
-
return `${trunc(m / 60)}h${pad2(m % 60)}m`;
|
|
865
|
+
if (m < 1440) return `${trunc(m / 60)}h${pad2(m % 60)}m`;
|
|
866
|
+
return `${trunc(m / 1440)}d${pad2(trunc(m / 60) % 24)}h${pad2(m % 60)}m`;
|
|
860
867
|
}
|
|
861
868
|
function linesDiffstat({ row }) {
|
|
862
869
|
if (row.la <= 0 && row.lr <= 0) return "";
|
|
@@ -1220,7 +1227,7 @@ function duration(startText, now) {
|
|
|
1220
1227
|
const seconds = start > MS_THRESHOLD ? Math.trunc(start / 1e3) : start;
|
|
1221
1228
|
const elapsed = Math.trunc(now) - seconds;
|
|
1222
1229
|
if (elapsed < 0) return "";
|
|
1223
|
-
return
|
|
1230
|
+
return fmtDuration(Math.trunc(elapsed / 60));
|
|
1224
1231
|
}
|
|
1225
1232
|
function rowFormats(fields, now) {
|
|
1226
1233
|
const tokens = intValue(fields.tokens) ?? 0;
|
package/dist/render.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.mjs","names":[],"sources":["../src/render/items.ts","../src/render/argv.ts","../src/render/capture.ts","../src/render/git.ts","../src/render/layout.ts","../src/render/jq.ts","../src/render/payload.ts","../src/render/awk.ts","../src/render/segments.ts","../src/render/engine.ts","../src/render/panel.ts","../src/themes.ts","../src/render/theme.ts","../src/render/entry.ts"],"sourcesContent":["export interface ItemSpec {\n readonly alternatives: readonly string[];\n readonly default: string;\n readonly item: string;\n}\n\n// The one item registry, shared by the renderer and the CLI: 16 items in\n// paint order, including the three rungs no component header ever declared\n// (branch=none, bar=flat6, bar=flat4).\nexport const ITEMS: readonly ItemSpec[] = [\n {\n alternatives: ['plain', 'block', 'pill', 'zen'],\n default: 'plain',\n item: 'model',\n },\n {\n alternatives: ['plain', 'dim', 'hidden'],\n default: 'plain',\n item: 'effort',\n },\n { alternatives: ['none', 'pills'], default: 'none', item: 'state' },\n {\n alternatives: ['init', 'full', 'tail', 'base', 'icon'],\n default: 'init',\n item: 'cwd',\n },\n {\n alternatives: ['initials', 'full', 'last', 'icon', 'none'],\n default: 'initials',\n item: 'branch',\n },\n {\n alternatives: ['counts', 'icons', 'none'],\n default: 'counts',\n item: 'status',\n },\n { alternatives: ['none', 'arrows'], default: 'none', item: 'ahead' },\n { alternatives: ['none', 'badge'], default: 'none', item: 'pr' },\n {\n alternatives: ['flat', 'gauge', 'percent', 'none', 'flat6', 'flat4'],\n default: 'flat',\n item: 'bar',\n },\n {\n alternatives: ['full', 'compact', 'free', 'none'],\n default: 'full',\n item: 'tokens',\n },\n {\n alternatives: ['hit', 'coldin', 'fuse', 'none'],\n default: 'hit',\n item: 'cache',\n },\n { alternatives: ['plain', 'burn', 'none'], default: 'plain', item: 'cost' },\n {\n alternatives: ['clock', 'hours', 'none'],\n default: 'clock',\n item: 'duration',\n },\n { alternatives: ['none', 'diffstat'], default: 'none', item: 'lines' },\n { alternatives: ['none', 'strip'], default: 'none', item: 'rate' },\n {\n alternatives: ['plain', 'dots', 'dim', 'bare'],\n default: 'plain',\n item: 'style',\n },\n];\n\nexport const DEFAULT_LAYOUT =\n '{model effort state} {cwd branch status ahead pr} {bar tokens cache} {cost} {duration} {lines} {rate}';\n\n// The registry's lookup door — every module that asks \"is this item known,\n// is this alt offered\" comes through here, never a Map of its own.\nconst BY_ITEM = new Map(ITEMS.map(spec => [spec.item, spec]));\n\nexport function specFor(item: string): ItemSpec | undefined {\n return BY_ITEM.get(item);\n}\n\nexport const ITEM_IDS: readonly string[] = ITEMS.map(spec => spec.item);\n\nexport const DEFAULT_PICKS: Readonly<Record<string, string>> =\n Object.fromEntries(ITEMS.map(({ default: alt, item }) => [item, alt]));\n\nexport const RUNG_ORDERS: Readonly<Partial<Record<string, readonly string[]>>> =\n {\n bar: ['flat', 'flat6', 'flat4', 'percent', 'none'],\n branch: ['icon', 'full', 'initials', 'last', 'none'],\n cache: ['hit', 'coldin', 'none'],\n cwd: ['icon', 'full', 'init', 'tail', 'base'],\n duration: ['clock', 'hours', 'none'],\n effort: ['plain', 'dim', 'hidden'],\n status: ['counts', 'icons', 'none'],\n tokens: ['full', 'free', 'compact', 'none'],\n };\n\nexport type FitStep = readonly [item: string, alt: string];\n\nexport const FULL_STEPS: readonly FitStep[] = [\n ['duration', 'none'],\n ['cache', 'none'],\n ['tokens', 'compact'],\n ['bar', 'flat6'],\n ['status', 'none'],\n ['branch', 'initials'],\n ['cwd', 'init'],\n ['branch', 'last'],\n ['bar', 'flat4'],\n ['model', 'strip'],\n ['bar', 'percent'],\n ['branch', 'none'],\n ['cwd', 'tail'],\n ['effort', 'hidden'],\n ['cwd', 'base'],\n ['tokens', 'none'],\n];\n\nexport const L1_STEPS: readonly FitStep[] = [\n ['status', 'none'],\n ['branch', 'initials'],\n ['cwd', 'init'],\n ['branch', 'last'],\n ['model', 'strip'],\n ['branch', 'none'],\n ['cwd', 'tail'],\n ['effort', 'hidden'],\n ['cwd', 'base'],\n];\n\nexport const L2_STEPS: readonly FitStep[] = [\n ['duration', 'none'],\n ['cache', 'none'],\n ['tokens', 'compact'],\n ['bar', 'flat6'],\n ['bar', 'flat4'],\n ['tokens', 'none'],\n ['bar', 'percent'],\n];\n","import { parseArgs } from 'node:util';\n\nimport { specFor } from './items.js';\n\n// The render.mjs argv grammar — node:util parseArgs, never commander and\n// never @v1nvn/agentic-core; the CLI and the renderer share only the registry\n// data. Grammar only: theme and layout values pass through unresolved.\n\nexport interface ArgvResult {\n readonly layout?: string;\n readonly mode: 'line' | 'panel';\n readonly now?: number;\n readonly picks: Record<string, string>;\n readonly theme?: string;\n readonly warnings: string[];\n}\n\nfunction warn(warnings: string[], message: string): void {\n warnings.push(message);\n}\n\nexport function parseArgv(argv: readonly string[]): ArgvResult {\n const parsed = parseArgs({\n allowPositionals: true,\n args: [...argv],\n options: {\n layout: { type: 'string' },\n now: { type: 'string' },\n theme: { type: 'string' },\n },\n strict: false,\n });\n const warnings: string[] = [];\n const picks: Record<string, string> = {};\n let mode: 'line' | 'panel' = 'line';\n let theme: string | undefined;\n let layout: string | undefined;\n let now: number | undefined;\n\n for (const positional of parsed.positionals) {\n if (positional === 'panel') {\n mode = 'panel';\n } else {\n warn(\n warnings,\n `statusline: unexpected argument '${positional}', ignored`,\n );\n }\n }\n\n for (const [name, value] of Object.entries(parsed.values)) {\n if (typeof value !== 'string') {\n warn(warnings, `statusline: --${name} needs a value, ignored`);\n continue;\n }\n if (name === 'theme') {\n theme = value;\n continue;\n }\n if (name === 'layout') {\n layout = value;\n continue;\n }\n if (name === 'now') {\n const epoch = Number(value);\n if (Number.isFinite(epoch) && value.trim() !== '') {\n now = epoch;\n } else {\n warn(warnings, `statusline: --now=${value} is not a number, ignored`);\n }\n continue;\n }\n const spec = specFor(name);\n if (spec === undefined) {\n warn(warnings, `statusline: --${name} is not a known flag, ignored`);\n continue;\n }\n if (spec.alternatives.includes(value)) {\n picks[name] = value;\n } else {\n warn(\n warnings,\n `statusline: ${name}=${value} is not available, using ${name}=${spec.default}`,\n );\n }\n }\n\n return {\n mode,\n picks,\n warnings,\n ...(theme === undefined ? {} : { theme }),\n ...(layout === undefined ? {} : { layout }),\n ...(now === undefined ? {} : { now }),\n };\n}\n","import { mkdirSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nexport const DATA_DIR = join(\n '.claude',\n 'plugins',\n 'data',\n 'statusline-agentic',\n);\n\n// The capture tee: the raw stdin bytes tee to the data dir, written to a temp\n// name and renamed so a reader never sees a half-written payload.\nexport function capturePayload(\n home: string,\n surface: 'main' | 'tick',\n payload: string,\n): void {\n const dest = join(home, DATA_DIR, 'captures', `${surface}.json`);\n try {\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(`${dest}.tmp`, payload);\n renameSync(`${dest}.tmp`, dest);\n } catch {\n // The tee is debug telemetry; a failed write must not kill the paint.\n }\n}\n","import { spawnSync } from 'node:child_process';\n\nexport interface GitFacts {\n readonly ahead: number;\n readonly behind: number;\n readonly branch: string;\n readonly modified: number;\n readonly staged: number;\n readonly stashes: number;\n readonly untracked: number;\n}\n\nexport interface GitEnv {\n readonly home: string;\n}\n\nconst BRANCH_HEAD = '# branch.head ';\n// `# branch.ab +2 -3` rides the porcelain status only when an upstream\n// exists — absent lines read as the zeros a failed rev-list counted.\nconst BRANCH_AB = /^# branch\\.ab \\+(\\d+) -(\\d+)$/;\n\nfunction gitEnv(env: GitEnv): Readonly<Record<string, string>> {\n return {\n HOME: env.home,\n LC_ALL: 'C',\n PATH: process.env.PATH ?? '',\n };\n}\n\nfunction gitText(\n dir: string,\n args: readonly string[],\n env: GitEnv,\n): null | string {\n const run = spawnSync('git', ['-C', dir, ...args], {\n encoding: 'utf8',\n env: gitEnv(env),\n });\n return run.status === 0 ? run.stdout : null;\n}\n\nfunction lineCount(text: null | string): number {\n return text === null || text === '' ? 0 : (text.match(/\\n/g) ?? []).length;\n}\n\nfunction count(text: null | string): number {\n const parsed = text === null ? NaN : Number(text.trim());\n return Number.isFinite(parsed) ? Math.trunc(parsed) : 0;\n}\n\nexport function readGit(dir: string, env: GitEnv): GitFacts {\n const facts = {\n ahead: 0,\n behind: 0,\n branch: '',\n modified: 0,\n staged: 0,\n stashes: 0,\n untracked: 0,\n };\n if (dir === '') {\n return facts;\n }\n const probe = spawnSync('git', ['-C', dir, 'rev-parse', '--git-dir'], {\n encoding: 'utf8',\n env: gitEnv(env),\n });\n if (probe.status !== 0) {\n return facts;\n }\n const status = gitText(dir, ['status', '--porcelain=v2', '--branch'], env);\n for (const line of (status ?? '').split('\\n')) {\n if (line.startsWith(BRANCH_HEAD)) {\n facts.branch = line.slice(BRANCH_HEAD.length);\n continue;\n }\n const ab = BRANCH_AB.exec(line);\n if (ab !== null) {\n facts.ahead = count(ab[1]);\n facts.behind = count(ab[2]);\n } else if (\n (line.startsWith('1 ') || line.startsWith('2 ')) &&\n line.length >= 4\n ) {\n if (line[2] !== '.') {\n facts.staged += 1;\n }\n if (line[3] !== '.') {\n facts.modified += 1;\n }\n }\n }\n if (facts.branch === '(detached)') {\n facts.branch = '';\n }\n facts.untracked = lineCount(\n gitText(dir, ['ls-files', '--others', '--exclude-standard'], env),\n );\n facts.stashes = lineCount(gitText(dir, ['stash', 'list'], env));\n return facts;\n}\n","// The layout grammar — brace clusters of item ids — parsed once for every\n// door: the writer validates through layoutItems, the status row collects\n// through layoutItemsOf, and the engine renders the clusters it returns.\n\nexport function parseClusters(layout: string): string[][] {\n const clusters: string[][] = [];\n let words: string[] = [];\n let word = '';\n let open = false;\n function pushWord(): void {\n if (word !== '') {\n words.push(word);\n word = '';\n }\n }\n for (const c of layout) {\n if (c === '{') {\n if (open) {\n throw new Error(`layout '${layout}': '{' inside a cluster`);\n }\n open = true;\n words = [];\n } else if (c === '}') {\n if (!open) {\n throw new Error(`layout '${layout}': '}' outside a cluster`);\n }\n pushWord();\n open = false;\n if (words.length > 0) {\n clusters.push(words);\n }\n } else if (c === ' ') {\n if (open) {\n pushWord();\n } else if (word !== '') {\n throw new Error(`layout '${layout}': '${word}' sits outside a cluster`);\n }\n } else if (/[a-z0-9]/.test(c)) {\n word += c;\n } else {\n throw new Error(\n `layout '${layout}': '${c}' is not layout grammar (braces, item ids, spaces)`,\n );\n }\n }\n if (open) {\n throw new Error(`layout '${layout}': unterminated cluster`);\n }\n if (word !== '') {\n throw new Error(`layout '${layout}': '${word}' sits outside a cluster`);\n }\n if (clusters.length === 0) {\n throw new Error(`layout '${layout}': no clusters`);\n }\n return clusters;\n}\n\n// The items a layout names, in first-appearance order — tolerant of names the\n// registry does not know.\nexport function layoutItemsOf(layout: string): string[] {\n const items: string[] = [];\n for (const cluster of parseClusters(layout)) {\n for (const item of cluster) {\n if (!items.includes(item)) {\n items.push(item);\n }\n }\n }\n return items;\n}\n\nexport function layoutItems(\n layout: string,\n valid: readonly string[],\n): string[] {\n const known = new Set(valid);\n const items = layoutItemsOf(layout);\n for (const item of items) {\n if (!known.has(item)) {\n throw new Error(\n `unknown layout item '${item}' — valid items: ${valid.join(' ')}`,\n );\n }\n }\n return items;\n}\n","// jq semantics the two payload parsers share — the line and the panel were\n// separate jq pipelines in bash and must keep their exact behaviors, but the\n// meaning of `//`, tostring, and @tsv is one thing, written once.\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// jq's `//`: only null, false, and a missing member fall through.\nexport function orElse(value: unknown, fallback: unknown): unknown {\n return value === undefined || value === null || value === false\n ? fallback\n : value;\n}\n\n// jq's tostring: scalars as text, containers as JSON.\nexport function jqText(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return JSON.stringify(value);\n}\n\n// jq's @tsv: backslash, tab, newline, and carriage return survive as their\n// two-character escapes.\nexport function tsvEscape(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n}\n","import { isRecord, orElse } from './jq.js';\n\nexport interface RateRow {\n readonly label: string;\n readonly pctText: string;\n readonly resets: number;\n}\n\nexport interface Row {\n readonly agent: string;\n readonly cost: number;\n readonly ctxSize: number;\n readonly dir: string;\n readonly durationMs: number;\n readonly effort: string;\n readonly expires: number;\n readonly hit: null | number;\n readonly la: number;\n readonly lr: number;\n readonly model: string;\n readonly pct: number;\n readonly prn: string;\n readonly prs: string;\n readonly rateRows: readonly RateRow[];\n readonly styleName: string;\n readonly think: boolean;\n readonly tokens: number;\n readonly ttl: string;\n readonly vim: string;\n readonly warm: boolean;\n readonly wt: string;\n}\n\nfunction member(source: unknown, key: string): unknown {\n return isRecord(source) ? source[key] : undefined;\n}\n\nfunction field(source: unknown, path: string): unknown {\n let current: unknown = source;\n for (const key of path.split('.')) {\n current = member(current, key);\n }\n return current;\n}\n\n// The line's bash side never saw a container in a scalar field; one reads\n// as empty text, not as JSON.\nfunction textOf(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return '';\n}\n\nfunction scalar(source: unknown, path: string, fallback: string): string {\n return textOf(orElse(field(source, path), fallback));\n}\n\nfunction numberField(source: unknown, path: string): number {\n return Number(scalar(source, path, '0'));\n}\n\n// `${PCT%%.*}`: the used-percentage text up to its first decimal point.\nfunction pctField(source: unknown): number {\n const intPart = scalar(source, 'context_window.used_percentage', '0').split(\n '.',\n )[0];\n return intPart === '' ? 0 : Number(intPart);\n}\n\nconst RATE_LIMITS: readonly (readonly [label: string, key: string])[] = [\n ['5h', 'five_hour'],\n ['7d', 'seven_day'],\n ['spend', 'spend_limit'],\n];\n\nfunction rateRows(source: unknown): RateRow[] {\n const limits = field(source, 'rate_limits');\n const rows: RateRow[] = [];\n for (const [label, key] of RATE_LIMITS) {\n const limit = member(limits, key);\n if (!isRecord(limit) || Object.keys(limit).length === 0) {\n continue;\n }\n rows.push({\n label,\n pctText: scalar(limit, 'used_percentage', '0'),\n resets: Number(scalar(limit, 'resets_at', '0')),\n });\n }\n return rows;\n}\n\nexport function parseRow(payload: string): Row {\n const root: unknown = JSON.parse(payload);\n const hitText = scalar(root, 'prompt_cache.hit_ratio', '');\n return {\n agent: scalar(root, 'agent.name', ''),\n cost: numberField(root, 'cost.total_cost_usd'),\n ctxSize: numberField(root, 'context_window.context_window_size'),\n dir: scalar(root, 'workspace.current_dir', ''),\n durationMs: numberField(root, 'cost.total_duration_ms'),\n effort: scalar(root, 'effort.level', ''),\n expires: numberField(root, 'prompt_cache.expires_at'),\n hit: hitText === '' ? null : Number(hitText),\n la: numberField(root, 'cost.total_lines_added'),\n lr: numberField(root, 'cost.total_lines_removed'),\n model: scalar(root, 'model.display_name', ''),\n pct: pctField(root),\n prn: scalar(root, 'pr.number', ''),\n prs: scalar(root, 'pr.review_state', ''),\n rateRows: rateRows(root),\n think: scalar(root, 'thinking.enabled', 'false') === 'true',\n tokens: numberField(root, 'context_window.total_input_tokens'),\n ttl: scalar(root, 'prompt_cache.ttl', ''),\n vim: scalar(root, 'vim.mode', ''),\n warm: scalar(root, 'prompt_cache.warm', 'false') === 'true',\n wt: scalar(root, 'worktree.name', ''),\n styleName: scalar(root, 'output_style.name', ''),\n };\n}\n","// The bash renderers format numbers with awk printf (\"%.1fk\", n/1000,\n// \"$%.2f\", c), which rounds the value's exact IEEE bits to even at a decimal\n// tie. toFixed rounds ties away from zero — 1250 prints \"1.2k\" here, \"1.3k\"\n// there — so fmtFixed is the one door for printf-style decimal formatting,\n// and the rounding is done on the double's exact bits, never in floating\n// arithmetic.\n\nconst TEN = 10n;\n\nfunction exactParts(ax: number): { exp: number; mant: bigint } {\n const view = new DataView(new ArrayBuffer(8));\n view.setFloat64(0, ax);\n const hi = view.getUint32(0);\n const lo = view.getUint32(4);\n const biased = (hi >>> 20) & 0x7ff;\n const frac = (BigInt(hi & 0xfffff) << 32n) | BigInt(lo);\n if (biased === 0) {\n return { exp: -1074, mant: frac };\n }\n return { exp: biased - 1075, mant: frac | (1n << 52n) };\n}\n\n// ax * 10^d rounded to an integer, ties to even.\nfunction roundScaled(ax: number, d: number): bigint {\n const { exp, mant } = exactParts(ax);\n const pow10 = TEN ** BigInt(d);\n const num = exp >= 0 ? (mant << BigInt(exp)) * pow10 : mant * pow10;\n const den = exp >= 0 ? 1n : 1n << BigInt(-exp);\n const q = num / den;\n const twice = (num % den) * 2n;\n if (twice > den || (twice === den && q % 2n === 1n)) {\n return q + 1n;\n }\n return q;\n}\n\nexport function fmtFixed(x: number, d: number): string {\n const q = roundScaled(Math.abs(x), d);\n const sign = x < 0 && q !== 0n ? '-' : '';\n const digits = q.toString();\n if (d === 0) {\n return `${sign}${digits}`;\n }\n const intPart = digits.length <= d ? '0' : digits.slice(0, digits.length - d);\n const fracPart = digits.padStart(d + 1, '0').slice(-d);\n return `${sign}${intPart}.${fracPart}`;\n}\n\nexport function pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nexport function fmtK(n: number, d: number): string {\n return `${fmtFixed(n / 1000, d)}k`;\n}\n\nexport function fmtM(n: number): string {\n return `${fmtFixed(n / 1_000_000, 0)}M`;\n}\n","import type { GitFacts } from './git.js';\nimport type { Row } from './payload.js';\n\nimport { fmtFixed, fmtK, fmtM, pad2 } from './awk.js';\n\nexport interface SegmentInput {\n readonly git: GitFacts;\n readonly home: string;\n readonly model: string;\n readonly now: number;\n readonly row: Row;\n}\n\ntype Segment = (input: SegmentInput) => string;\n\nconst BLUE = '\\x1b[34m';\nconst CYAN = '\\x1b[36m';\nconst DIM = '\\x1b[2m';\nconst GREEN = '\\x1b[32m';\nconst PURPLE = '\\x1b[35m';\nconst RED = '\\x1b[31m';\nconst RESET = '\\x1b[0m';\nconst YELLOW = '\\x1b[33m';\nconst BOLD = '\\x1b[1m';\nconst GRAY = '\\x1b[38;2;68;71;90m';\nconst MARK = '\\x1b[1;97m';\n\nconst SHORT_AT = 15;\nconst PART = ['▏', '▎', '▍', '▌', '▋', '▊', '▉', '█'];\nconst HEAT = [\n '\\x1b[38;2;48;242;36m',\n '\\x1b[38;2;63;242;36m',\n '\\x1b[38;2;79;242;36m',\n '\\x1b[38;2;95;242;36m',\n '\\x1b[38;2;111;242;36m',\n '\\x1b[38;2;126;242;36m',\n '\\x1b[38;2;142;242;36m',\n '\\x1b[38;2;158;242;36m',\n '\\x1b[38;2;173;242;36m',\n '\\x1b[38;2;189;242;36m',\n '\\x1b[38;2;205;242;36m',\n '\\x1b[38;2;220;242;36m',\n '\\x1b[38;2;236;242;36m',\n '\\x1b[38;2;242;232;36m',\n '\\x1b[38;2;242;216;36m',\n '\\x1b[38;2;242;200;36m',\n '\\x1b[38;2;242;185;36m',\n '\\x1b[38;2;242;169;36m',\n '\\x1b[38;2;242;153;36m',\n '\\x1b[38;2;242;138;36m',\n '\\x1b[38;2;242;122;36m',\n '\\x1b[38;2;242;106;36m',\n '\\x1b[38;2;242;91;36m',\n '\\x1b[38;2;242;75;36m',\n '\\x1b[38;2;242;59;36m',\n '\\x1b[38;2;242;44;36m',\n];\n\nfunction trunc(n: number): number {\n return Math.trunc(n);\n}\n\nfunction modelPlain({ model }: SegmentInput): string {\n return model === '' ? '' : `${CYAN}${model}${RESET}`;\n}\n\nfunction modelBlock({ model }: SegmentInput): string {\n return model === '' ? '' : `\\x1b[48;5;61m\\x1b[38;5;231m ${model} \\x1b[0m`;\n}\n\nfunction modelPill({ model }: SegmentInput): string {\n return model === ''\n ? ''\n : `\\x1b[48;5;61m\\x1b[38;5;231m\\u{e0b6} ${model} \\u{e0b4}\\x1b[0m`;\n}\n\nfunction modelZen({ model }: SegmentInput): string {\n return model === ''\n ? ''\n : `${DIM}${model.replace(/[A-Z]/g, c => c.toLowerCase())}${RESET}`;\n}\n\nfunction effortPlain({ row }: SegmentInput): string {\n return row.effort === '' ? '' : `${CYAN}${row.effort}${RESET}`;\n}\n\nfunction effortDim({ row }: SegmentInput): string {\n return row.effort === '' ? '' : `${DIM}${row.effort}${RESET}`;\n}\n\nfunction statePill(label: string, bg: number, fg: number): string {\n return `\\x1b[48;5;${bg}m\\x1b[38;5;${fg}m\\u{e0b6} ${label} \\u{e0b4}\\x1b[0m`;\n}\n\nfunction statePills({ row }: SegmentInput): string {\n let out = '';\n if (row.vim !== '') {\n out =\n row.vim === 'INSERT'\n ? statePill(row.vim, 97, 16)\n : statePill(row.vim, 240, 231);\n }\n if (row.think) {\n out += ` ${statePill('THINK', 66, 16)}`;\n }\n if (row.agent !== '') {\n out += ` ${statePill(row.agent, 60, 231)}`;\n }\n if (row.wt !== '') {\n out += ` ${statePill(`wt:${row.wt}`, 131, 231)}`;\n }\n if (row.styleName !== '' && row.styleName !== 'default') {\n out += ` ${statePill(row.styleName, 95, 16)}`;\n }\n return out;\n}\n\ninterface SplitPath {\n readonly lead: string;\n readonly parts: readonly string[];\n readonly text: string;\n}\n\nfunction splitPath(raw: string, home: string): SplitPath {\n let p = raw;\n if (home !== '' && p.startsWith(home)) {\n p = `~${p.slice(home.length)}`;\n }\n return {\n lead: p.startsWith('/') ? '/' : '',\n parts: p.split('/').filter(part => part !== ''),\n text: p,\n };\n}\n\nfunction pathInit(raw: string, home: string): string {\n const { lead, parts, text } = splitPath(raw, home);\n const n = parts.length;\n if (n <= 2) {\n return text;\n }\n let out = `${lead}${parts[0]}`;\n for (let i = 1; i < n - 1; i++) {\n const ini = parts[i].startsWith('.')\n ? parts[i].slice(0, 2)\n : parts[i].slice(0, 1);\n out += `/${ini}`;\n }\n return `${out}/${parts[n - 1]}`;\n}\n\nfunction pathTail(raw: string, home: string, lim: number): string {\n const { lead, parts, text } = splitPath(raw, home);\n const cnt = parts.length;\n if (cnt <= lim || cnt <= 1) {\n return text;\n }\n let out = `${lead}${parts[0]}/…`;\n for (let i = cnt - lim; i < cnt; i++) {\n out += `/${parts[i]}`;\n }\n return out;\n}\n\nfunction cwdInit({ home, row }: SegmentInput): string {\n const { text } = splitPath(row.dir, home);\n return Buffer.byteLength(text, 'utf8') > SHORT_AT\n ? pathInit(row.dir, home)\n : text;\n}\n\nfunction cwdFull({ home, row }: SegmentInput): string {\n return splitPath(row.dir, home).text;\n}\n\nfunction cwdTail({ home, row }: SegmentInput): string {\n return pathTail(row.dir, home, 1);\n}\n\nfunction baseName(dir: string): string {\n return dir.slice(dir.lastIndexOf('/') + 1);\n}\n\nfunction cwdBase({ row }: SegmentInput): string {\n return baseName(row.dir);\n}\n\nfunction cwdIcon({ row }: SegmentInput): string {\n return `\\u{f07b} ${baseName(row.dir)}`;\n}\n\nfunction branchInitials({ git }: SegmentInput): string {\n const branch = git.branch;\n if (branch === '') {\n return '';\n }\n if (Buffer.byteLength(branch, 'utf8') <= SHORT_AT) {\n return branch;\n }\n const parts = branch.split('/').filter(part => part !== '');\n if (parts.length <= 1) {\n return branch;\n }\n let out = '';\n for (let i = 0; i < parts.length - 1; i++) {\n out += `${parts[i].slice(0, 1)}/`;\n }\n return `${out}${parts[parts.length - 1]}`;\n}\n\nfunction branchFull({ git }: SegmentInput): string {\n return git.branch;\n}\n\nfunction branchLast({ git }: SegmentInput): string {\n return git.branch.slice(git.branch.lastIndexOf('/') + 1);\n}\n\nfunction branchIcon({ git }: SegmentInput): string {\n return git.branch === '' ? '' : `\\u{e0a0} ${git.branch}`;\n}\n\nfunction statusCounts({ git }: SegmentInput): string {\n if (git.branch === '') {\n return '';\n }\n let c = '';\n if (git.staged > 0) {\n c = `${GREEN}+${git.staged}${RESET}`;\n }\n if (git.modified > 0) {\n c = `${c} ${YELLOW}~${git.modified}${RESET}`;\n }\n return c;\n}\n\nfunction statusIcons({ git }: SegmentInput): string {\n if (git.branch === '') {\n return '';\n }\n let out = '';\n let sep = '';\n if (git.staged > 0) {\n out += `${GREEN}●${git.staged}${RESET}`;\n sep = ' ';\n }\n if (git.modified > 0) {\n out += `${sep}${YELLOW}✎${git.modified}${RESET}`;\n sep = ' ';\n }\n if (git.untracked > 0) {\n out += `${sep}${CYAN}+${git.untracked}${RESET}`;\n sep = ' ';\n }\n if (git.stashes > 0) {\n out += `${sep}${PURPLE}⚑${git.stashes}${RESET}`;\n }\n return out;\n}\n\nfunction aheadArrows({ git }: SegmentInput): string {\n let out = '';\n if (git.ahead > 0) {\n out = `${GREEN}↑${git.ahead}${RESET}`;\n }\n if (git.behind > 0) {\n out += ` ${RED}↓${git.behind}${RESET}`;\n }\n return out;\n}\n\nfunction prBadge({ row }: SegmentInput): string {\n if (row.prn === '') {\n return '';\n }\n let col: string;\n let mark: string;\n switch (row.prs) {\n case 'approved':\n col = GREEN;\n mark = '✓';\n break;\n case 'changes_requested':\n col = RED;\n mark = '✗';\n break;\n case 'pending':\n col = YELLOW;\n mark = '⏳';\n break;\n default:\n col = '\\x1b[90m';\n mark = '◌';\n }\n return `${BLUE}#${row.prn}${RESET} ${col}${mark} ${row.prs}${RESET}`;\n}\n\nfunction barFlatAt(input: SegmentInput, w: number): string {\n const pct = input.row.pct;\n let f = trunc((pct * w) / 100);\n if (f > w) {\n f = w;\n }\n const col = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;\n return `${col}${'█'.repeat(f)}${'░'.repeat(w - f)}${RESET}`;\n}\n\nfunction barFlat(input: SegmentInput): string {\n return barFlatAt(input, 10);\n}\n\nfunction barGauge({ row }: SegmentInput): string {\n const pct = row.pct;\n const p = Math.max(0, Math.min(100, pct));\n const full = trunc((p * 26) / 100);\n const idx = trunc((((p * 26) % 100) * 8) / 100);\n const lead =\n p >= 50\n ? `\\x1b[38;2;242;${trunc((4845 * (15000 + 1683 * (100 - p))) / 2000000)};36m`\n : `\\x1b[38;2;${trunc((4845 * (185000 - 1683 * (100 - p))) / 2000000)};242;36m`;\n const moon = ['○', '◔', '◑', '◕', '●'][Math.min(trunc(p / 20), 4)];\n let bar = '';\n for (let i = 0; i < 26; i++) {\n let col: string;\n let cell: string;\n if (i === 20) {\n col = MARK;\n cell = i <= full ? '┃' : '│';\n } else if (i <= full) {\n col = HEAT[i];\n cell = i === full ? PART[idx] : '█';\n } else {\n col = GRAY;\n cell = '░';\n }\n bar += `${col}${cell}`;\n }\n return `${moon} ${lead}${bar}${RESET} ${MARK}${pct}%${RESET}`;\n}\n\nfunction tokensFull({ row }: SegmentInput): string {\n const t = row.tokens >= 1000 ? fmtK(row.tokens, 1) : String(row.tokens);\n let c = String(row.ctxSize);\n if (row.ctxSize >= 1000000) {\n c = fmtM(row.ctxSize);\n } else if (row.ctxSize >= 1000) {\n c = fmtK(row.ctxSize, 0);\n }\n return `${t}/${c}`;\n}\n\nfunction tokensCompact({ row }: SegmentInput): string {\n return row.tokens >= 1000 ? fmtK(row.tokens, 0) : String(row.tokens);\n}\n\nfunction tokensFree({ row }: SegmentInput): string {\n const free = row.ctxSize - row.tokens;\n return `${DIM}${free >= 1000 ? fmtK(free, 0) : String(free)} free${RESET}`;\n}\n\nfunction cacheHitPct(row: Row): null | number {\n return row.hit === null ? null : trunc(row.hit * 100);\n}\n\nfunction cacheHCol(hp: number): string {\n return hp >= 90 ? GREEN : hp >= 50 ? YELLOW : RED;\n}\n\nfunction cacheHit({ row }: SegmentInput): string {\n const hp = cacheHitPct(row);\n return hp === null ? '' : `${cacheHCol(hp)}⚡${hp}%${RESET}`;\n}\n\nfunction cacheColdin({ now, row }: SegmentInput): string {\n const hp = cacheHitPct(row);\n if (hp === null) {\n return '';\n }\n if (row.warm && row.expires > now) {\n const mins = trunc((row.expires - now) / 60);\n return `${cacheHCol(hp)}⚡${hp}%${RESET} ${DIM}· cold in ${mins}m${RESET}`;\n }\n return `❄ ${DIM}cold · ${hp}%${RESET}`;\n}\n\nfunction cacheFuse({ now, row }: SegmentInput): string {\n if (row.ttl === '' || row.expires === 0) {\n return '';\n }\n const span = row.ttl === '1h' ? 3600 : 300;\n let left = row.expires - now;\n if (left < 0) {\n left = 0;\n }\n if (left <= 0) {\n return `${RED}❄ cold${RESET}`;\n }\n const full = trunc((left * 10) / span);\n const rem = (left * 10) % span;\n const col = left * 4 > span ? GREEN : left * 25 > span * 2 ? YELLOW : RED;\n let bar = col;\n for (let i = 0; i < 10; i++) {\n if (i < full) {\n bar += '▰';\n } else if (i === full && rem * 20 > span) {\n bar += PART[trunc((rem * 8) / span)];\n } else {\n bar += `${DIM}▱`;\n }\n }\n return `${bar}${RESET} ${DIM}${pad2(trunc(left / 60))}:${pad2(left % 60)}${RESET}`;\n}\n\nfunction costPlain({ row }: SegmentInput): string {\n return row.cost >= 0.005 ? `${YELLOW}$${fmtFixed(row.cost, 2)}${RESET}` : '';\n}\n\nfunction costBurn(input: SegmentInput): string {\n const hr = input.row.durationMs / 3600000;\n // awk's else branch prints \"0\", never \"0.00\", so a sub-threshold burn rate\n // still appends \"$0/hr\" — ported as-is.\n const burn = hr > 0.02 ? fmtFixed(input.row.cost / hr, 2) : '0';\n let out = costPlain(input);\n if (burn !== '0.00') {\n out += ` ${DIM}· $${burn}/hr${RESET}`;\n }\n return out;\n}\n\nfunction durationClock({ row }: SegmentInput): string {\n return `${trunc(row.durationMs / 60000)}m${pad2(trunc((row.durationMs % 60000) / 1000))}s`;\n}\n\nfunction durationHours({ row }: SegmentInput): string {\n const m = trunc(row.durationMs / 60000);\n return `${trunc(m / 60)}h${pad2(m % 60)}m`;\n}\n\nfunction linesDiffstat({ row }: SegmentInput): string {\n if (row.la <= 0 && row.lr <= 0) {\n return '';\n }\n return `${GREEN}+${row.la}${RESET}${DIM}/${RESET}${RED}−${row.lr}${RESET}`;\n}\n\nfunction rateStrip({ now, row }: SegmentInput): string {\n const segs: string[] = [];\n for (const limit of row.rateRows) {\n const [intpText, fracp = ''] = limit.pctText.split('.');\n let f = 0;\n let scale = 1;\n for (const digit of fracp) {\n f = f * 10 + Number(digit);\n scale *= 10;\n }\n const intp = Number(intpText);\n const value = intp * scale + f;\n const col = value < 70 * scale ? GREEN : value < 90 * scale ? YELLOW : RED;\n const full = trunc((value * 14) / (100 * scale));\n const rem = (value * 14) % (100 * scale);\n const idx = trunc((rem * 8) / (100 * scale));\n let bar = col;\n for (let i = 0; i < 14; i++) {\n if (i < full) {\n bar += '█';\n } else if (i === full) {\n bar += PART[idx];\n } else {\n bar += `${DIM}░`;\n }\n }\n const lbl =\n fracp === '' || f * 2 < scale\n ? intp\n : f * 2 > scale\n ? intp + 1\n : intp + (intp % 2);\n const s = limit.resets - now;\n let dur: string;\n if (s >= 3600) {\n dur = `${trunc(s / 3600)}h${pad2(trunc((s % 3600) / 60))}m`;\n } else {\n const sec = ((s % 60) + 60) % 60;\n dur = `${trunc((s - sec) / 60)}m${pad2(sec)}s`;\n }\n segs.push(\n `${DIM}${limit.label}${RESET} ${bar}${RESET} ${BOLD}${lbl}%${RESET} ${DIM}· resets ${dur}${RESET}`,\n );\n }\n return segs.join(` ${DIM}│${RESET} `);\n}\n\nfunction emptySegment(): string {\n return '';\n}\n\nfunction barFlat6(input: SegmentInput): string {\n return barFlatAt(input, 6);\n}\n\nfunction barFlat4(input: SegmentInput): string {\n return barFlatAt(input, 4);\n}\n\nfunction barPercent({ row }: SegmentInput): string {\n return `${row.pct}%`;\n}\n\nexport const SEGMENTS: Readonly<\n Partial<Record<string, Readonly<Record<string, Segment>>>>\n> = {\n ahead: { arrows: aheadArrows, none: emptySegment },\n bar: {\n flat4: barFlat4,\n flat6: barFlat6,\n flat: barFlat,\n gauge: barGauge,\n none: emptySegment,\n percent: barPercent,\n },\n branch: {\n full: branchFull,\n icon: branchIcon,\n initials: branchInitials,\n last: branchLast,\n none: emptySegment,\n },\n cache: {\n coldin: cacheColdin,\n fuse: cacheFuse,\n hit: cacheHit,\n none: emptySegment,\n },\n cost: { burn: costBurn, none: emptySegment, plain: costPlain },\n cwd: {\n base: cwdBase,\n full: cwdFull,\n icon: cwdIcon,\n init: cwdInit,\n tail: cwdTail,\n },\n duration: { clock: durationClock, hours: durationHours, none: emptySegment },\n effort: { dim: effortDim, hidden: emptySegment, plain: effortPlain },\n lines: { diffstat: linesDiffstat, none: emptySegment },\n model: {\n block: modelBlock,\n pill: modelPill,\n plain: modelPlain,\n zen: modelZen,\n },\n pr: { badge: prBadge, none: emptySegment },\n rate: { none: emptySegment, strip: rateStrip },\n state: { none: emptySegment, pills: statePills },\n status: { counts: statusCounts, icons: statusIcons, none: emptySegment },\n tokens: {\n compact: tokensCompact,\n full: tokensFull,\n free: tokensFree,\n none: emptySegment,\n },\n};\n\nexport function renderSegment(\n item: string,\n alt: string,\n input: SegmentInput,\n): string {\n const segment = SEGMENTS[item]?.[alt];\n return segment === undefined ? '' : segment(input);\n}\n\nexport interface Separators {\n readonly join: string;\n readonly sep: string;\n}\n\nexport function styleSeparators(alt: string): Separators {\n switch (alt) {\n case 'bare':\n return { join: ' ', sep: ' ' };\n case 'dim':\n return { join: ' ', sep: `${DIM} │ ${RESET}` };\n case 'dots':\n return { join: ' · ', sep: ' · ' };\n default:\n return { join: ' ', sep: ' │ ' };\n }\n}\n","import { readGit } from './git.js';\nimport {\n DEFAULT_LAYOUT,\n type FitStep,\n FULL_STEPS,\n ITEMS,\n L1_STEPS,\n L2_STEPS,\n RUNG_ORDERS,\n} from './items.js';\nimport { parseClusters } from './layout.js';\nimport { parseRow } from './payload.js';\nimport {\n renderSegment,\n type SegmentInput,\n styleSeparators,\n} from './segments.js';\n\nexport interface RenderInput {\n readonly columns?: number;\n readonly home: string;\n readonly layout?: string;\n readonly noColor?: boolean;\n readonly now: number;\n readonly payload: string;\n readonly picks?: Readonly<Record<string, string>>;\n}\n\ntype Mode = 'full' | 'l1' | 'l2';\n\nconst RUNG_ITEMS = Object.keys(RUNG_ORDERS);\n\nexport function stripSgr(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n// The bash vlen counts bytes minus UTF-8 continuation bytes — one per\n// codepoint — then adds one more per ⚡, which renders two cells wide.\nexport function vlen(text: string): number {\n const plain = stripSgr(text);\n let n = Array.from(plain).length;\n for (const ch of plain) {\n if (ch === '⚡') {\n n += 1;\n }\n }\n return n;\n}\n\nexport function warn(message: string): void {\n process.stderr.write(`${message}\\n`);\n}\n\n// The `[...]` suffix a fit step strips from the model name — shared by both\n// engines so the two ports keep the same cut.\nexport function stripModelSuffix(name: string): string {\n const at = name.lastIndexOf('[');\n const cut = at === -1 ? name : name.slice(0, at);\n return cut.endsWith(' ') ? cut.slice(0, -1) : cut;\n}\n\nfunction resolvePicks(\n picks: Readonly<Record<string, string>> | undefined,\n): Record<string, string> {\n const resolved: Record<string, string> = {};\n for (const spec of ITEMS) {\n const pick = picks?.[spec.item] ?? spec.default;\n if (spec.alternatives.includes(pick)) {\n resolved[spec.item] = pick;\n } else {\n warn(\n `statusline: ${spec.item}=${pick} is not available, using ${spec.item}=${spec.default}`,\n );\n resolved[spec.item] = spec.default;\n }\n }\n return resolved;\n}\n\n// The writer's grammar parser, degraded for paint: malformed grammar renders\n// nothing (configure never writes one), unknown item names warn and skip.\nfunction parseLayout(\n layout: string,\n known: ReadonlySet<string>,\n): readonly (readonly string[])[] {\n let parsed: readonly string[][];\n try {\n parsed = parseClusters(layout);\n } catch (e) {\n warn(`statusline: ${(e as Error).message}`);\n return [];\n }\n const clusters: (readonly string[])[] = [];\n for (const words of parsed) {\n const kept = words.filter(word => {\n if (known.has(word)) {\n return true;\n }\n warn(`statusline: layout item '${word}' is not available, skipped`);\n return false;\n });\n if (kept.length > 0) {\n clusters.push(kept);\n }\n }\n return clusters;\n}\n\nexport function renderStatusline(input: RenderInput): string {\n const row = parseRow(input.payload);\n const git = readGit(row.dir, { home: input.home });\n const picks = resolvePicks(input.picks);\n const { join, sep } = styleSeparators(picks.style);\n const clusters = parseLayout(\n input.layout ?? DEFAULT_LAYOUT,\n new Set(ITEMS.map(spec => spec.item)),\n );\n const wrapAt = clusters.length > 2 ? 2 : 1;\n\n let width = input.columns;\n if (width === undefined || !Number.isInteger(width) || width < 0) {\n width = 200;\n }\n if (width < 20) {\n width = 20;\n }\n const avail = width - 3;\n\n let model = row.model;\n const initialRungs = RUNG_ITEMS.map(item => [item, picks[item]] as const);\n\n function segmentInput(): SegmentInput {\n return { git, home: input.home, model, now: input.now, row };\n }\n\n function compose(mode: Mode): string {\n const from = mode === 'l2' ? wrapAt : 0;\n const to = mode === 'l1' ? wrapAt : clusters.length;\n let line = '';\n let first = true;\n for (let ci = from; ci < to; ci++) {\n let cseg = '';\n let cf = true;\n for (const item of clusters[ci]) {\n const out = renderSegment(item, picks[item], segmentInput());\n if (out === '') {\n continue;\n }\n if (cf) {\n cseg = out;\n cf = false;\n } else {\n cseg += join + out;\n }\n }\n if (cseg === '') {\n continue;\n }\n if (first) {\n line = cseg;\n first = false;\n } else {\n line += sep + cseg;\n }\n }\n return line;\n }\n\n function fits(line: string): boolean {\n return vlen(line) <= avail;\n }\n\n function demote(item: string, target: string): void {\n const order = RUNG_ORDERS[item];\n if (order === undefined) {\n return;\n }\n const at = order.indexOf(picks[item]);\n if (at === -1) {\n return;\n }\n if (order.slice(at + 1).includes(target)) {\n picks[item] = target;\n }\n }\n\n function resetRungs(): void {\n model = row.model;\n for (const [item, pick] of initialRungs) {\n picks[item] = pick;\n }\n }\n\n function applyStep(step: FitStep): void {\n if (step[0] === 'model' && step[1] === 'strip') {\n model = stripModelSuffix(model);\n } else {\n demote(step[0], step[1]);\n }\n }\n\n function fit(mode: Mode, steps: readonly FitStep[]): string {\n let out = compose(mode);\n if (fits(out)) {\n return out;\n }\n for (const step of steps) {\n applyStep(step);\n out = compose(mode);\n if (fits(out)) {\n return out;\n }\n }\n return out;\n }\n\n function emit(line: string): string {\n const text = input.noColor === true ? stripSgr(line) : line;\n return `${text}\\n`;\n }\n\n const full = fit('full', FULL_STEPS);\n if (fits(full)) {\n return emit(full);\n }\n resetRungs();\n const l1 = fit('l1', L1_STEPS);\n const l2 = fit('l2', L2_STEPS);\n return emit(l1) + emit(l2);\n}\n","import { fmtK, fmtM, pad2 } from './awk.js';\nimport { stripModelSuffix, stripSgr, warn } from './engine.js';\nimport { specFor } from './items.js';\nimport { isRecord, jqText, orElse, tsvEscape } from './jq.js';\nimport { styleSeparators } from './segments.js';\n\n// The agent panel, ported exact from the bash subagent renderer it replaced —\n// a second renderer by ruling: its vlen counts codepoints (jq `length`), not\n// the main engine's bytes, and its fit ladder is its own. Never unify them.\n\nconst CYAN = '\\x1b[36m';\nconst GREEN = '\\x1b[32m';\nconst RED = '\\x1b[31m';\nconst RESET = '\\x1b[0m';\nconst YELLOW = '\\x1b[33m';\n\nconst MS_THRESHOLD = 200_000_000_000;\n\nexport interface PanelInput {\n readonly noColor?: boolean;\n readonly now: number;\n readonly payload: string;\n readonly picks?: Readonly<Record<string, string>>;\n}\n\ninterface TaskFields {\n readonly ctx: string;\n readonly desc: string;\n readonly effort: string;\n readonly id: string;\n readonly label: string;\n readonly model: string;\n readonly name: string;\n readonly start: string;\n readonly tokens: string;\n}\n\ninterface RowFormats {\n readonly ctx: string;\n readonly dur: string;\n readonly tickTok: string;\n readonly tokens: string;\n}\n\ninterface FitState {\n barb: number;\n descd: number;\n durd: number;\n modeld: number;\n statd: number;\n}\n\nconst STEPS: readonly (readonly [keyof FitState, number])[] = [\n ['descd', 1],\n ['durd', 1],\n ['statd', 1],\n ['barb', 6],\n ['modeld', 1],\n ['barb', 4],\n ['barb', 0],\n ['modeld', 2],\n ['statd', 2],\n];\n\nfunction field(\n source: Record<string, unknown>,\n key: string,\n fallback: unknown,\n): unknown {\n return orElse(source[key], fallback);\n}\n\nfunction cell(value: unknown): string {\n return tsvEscape(jqText(value));\n}\n\n// jq's truncation: a description longer than 24 codepoints keeps its first 23\n// plus an ellipsis.\nfunction truncateDesc(desc: string): string {\n const chars = Array.from(desc);\n return chars.length > 24 ? `${chars.slice(0, 23).join('')}…` : desc;\n}\n\nfunction intValue(text: string): null | number {\n return /^-?\\d+$/.test(text) ? Number(text) : null;\n}\n\nfunction stylePick(\n picks: Readonly<Record<string, string>> | undefined,\n): string {\n const spec = specFor('style');\n if (spec === undefined) {\n return 'plain';\n }\n const wanted = picks?.style ?? '';\n const alt = wanted === '' ? spec.default : wanted;\n if (!spec.alternatives.includes(alt)) {\n warn(\n `statusline: style=${alt} is not available, using style=${spec.default}`,\n );\n return spec.default;\n }\n return alt;\n}\n\n// Width rides the payload's own columns field: jq's `// 200` default, then\n// the bash string rule (non-digit -> 200), the floor 20, minus one.\nfunction availColumns(tick: unknown): number {\n const value = isRecord(tick) ? field(tick, 'columns', 200) : 200;\n const text = jqText(value);\n const columns = /^\\d+$/.test(text) ? Number(text) : 200;\n return Math.max(columns, 20) - 1;\n}\n\nfunction extractFields(task: Record<string, unknown>): TaskFields {\n return {\n ctx: cell(field(task, 'contextWindowSize', 0)),\n desc: cell(truncateDesc(jqText(field(task, 'description', '')))),\n effort: cell(field(task, 'effort', '')),\n id: cell(field(task, 'id', '')),\n label: cell(field(task, 'label', '')),\n model: cell(field(task, 'model', '')),\n name: cell(field(task, 'name', '')),\n start: cell(field(task, 'startTime', 0)),\n tokens: cell(field(task, 'tokenCount', 0)),\n };\n}\n\nfunction makeBar(pct: number, width: number): string {\n let f = Math.trunc((pct * width) / 100);\n if (f > width) {\n f = width;\n }\n let bar = '';\n for (let i = 0; i < width; i++) {\n bar += i < f ? '█' : '░';\n }\n return bar;\n}\n\n// The startTime heuristic: milliseconds above the threshold become seconds\n// (truncated), and only a start at or before now yields a duration.\nfunction duration(startText: string, now: number): string {\n const start = intValue(startText);\n if (start === null || start <= 0) {\n return '';\n }\n const seconds = start > MS_THRESHOLD ? Math.trunc(start / 1000) : start;\n const elapsed = Math.trunc(now) - seconds;\n if (elapsed < 0) {\n return '';\n }\n return `${Math.trunc(elapsed / 60)}m${pad2(Math.trunc(elapsed % 60))}s`;\n}\n\nfunction rowFormats(fields: TaskFields, now: number): RowFormats {\n const tokens = intValue(fields.tokens) ?? 0;\n const ctx = intValue(fields.ctx) ?? 0;\n let ctxText = fields.ctx;\n if (ctx >= 1_000_000) {\n ctxText = fmtM(ctx);\n } else if (ctx >= 1000) {\n ctxText = fmtK(ctx, 0);\n }\n return {\n ctx: ctxText,\n dur: duration(fields.start, now),\n tickTok: tokens >= 1000 ? fmtK(tokens, 0) : String(tokens),\n tokens: tokens >= 1000 ? fmtK(tokens, 1) : String(tokens),\n };\n}\n\nfunction renderRow(\n fields: TaskFields,\n formats: RowFormats,\n state: FitState,\n sep: string,\n): string {\n let s = fields.label === '' ? fields.name : fields.label;\n if (fields.desc !== '' && fields.desc !== fields.label && state.descd === 0) {\n s += ` ${fields.desc}`;\n }\n if (fields.model !== '') {\n let name = fields.model;\n if (state.modeld >= 1) {\n name = stripModelSuffix(name);\n }\n const effort = state.modeld >= 2 ? '' : fields.effort;\n if (effort !== '') {\n name += ` ${effort}`;\n }\n s += `${sep}${CYAN}${name}${RESET}`;\n }\n const ctx = intValue(fields.ctx);\n if (ctx !== null && ctx > 0) {\n const tokens = intValue(fields.tokens) ?? 0;\n const pct = Math.trunc((tokens * 100) / ctx);\n const barColor = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;\n if (state.barb > 0) {\n s += `${sep}${barColor}${makeBar(pct, state.barb)}${RESET} ${pct}%`;\n } else {\n s += `${sep}${barColor}${pct}%${RESET}`;\n }\n const stats =\n state.statd === 1\n ? formats.tickTok\n : state.statd === 2\n ? ''\n : `${formats.tokens}/${formats.ctx}`;\n if (stats !== '') {\n s += ` ${stats}`;\n }\n }\n if (formats.dur !== '' && state.durd === 0) {\n s += `${sep}${formats.dur}`;\n }\n return s;\n}\n\n// The panel's own vlen: codepoints of the SGR-stripped row.\nfunction vlen(text: string): number {\n return Array.from(stripSgr(text)).length;\n}\n\nfunction fitRow(\n fields: TaskFields,\n formats: RowFormats,\n sep: string,\n avail: number,\n): string {\n const state: FitState = { barb: 10, descd: 0, durd: 0, modeld: 0, statd: 0 };\n let out = renderRow(fields, formats, state, sep);\n if (vlen(out) <= avail) {\n return out;\n }\n for (const [key, value] of STEPS) {\n state[key] = value;\n out = renderRow(fields, formats, state, sep);\n if (vlen(out) <= avail) {\n return out;\n }\n }\n return out;\n}\n\nfunction emitLine(id: string, content: string): string {\n return `{\"id\":${JSON.stringify(id)},\"content\":${JSON.stringify(content)}}`;\n}\n\nexport function renderPanel(input: PanelInput): string {\n const tick: unknown = JSON.parse(input.payload);\n const avail = availColumns(tick);\n const sep = styleSeparators(stylePick(input.picks)).sep;\n const tasks = isRecord(tick) && Array.isArray(tick.tasks) ? tick.tasks : [];\n let out = '';\n for (const task of tasks) {\n if (!isRecord(task)) {\n continue;\n }\n const fields = extractFields(task);\n if (fields.id === '') {\n continue;\n }\n const formats = rowFormats(fields, input.now);\n const row = fitRow(fields, formats, sep, avail);\n const content = input.noColor === true ? stripSgr(row) : row;\n out += `${emitLine(fields.id, content)}\\n`;\n }\n return out;\n}\n","import { DEFAULT_LAYOUT } from './render/items.js';\n\nexport const THEME_NAMES = [\n 'classic',\n 'custom',\n 'lean',\n 'quiet',\n 'rich',\n] as const;\n\nexport type ThemeName = (typeof THEME_NAMES)[number];\n\nexport interface Theme {\n readonly layout: string;\n readonly summary: string;\n readonly variants: Readonly<Record<string, string>>;\n}\n\n// The record's key order is the listing order catalog and the wizard print.\nexport const THEMES: Readonly<Record<ThemeName, Theme>> = {\n quiet: {\n layout: '{model cwd}',\n summary: 'model and directory, nothing else',\n variants: { cwd: 'tail', model: 'zen', style: 'bare' },\n },\n // The shipped defaults, named: an empty variants record resolves exactly\n // like no theme at all.\n classic: {\n layout: DEFAULT_LAYOUT,\n summary: 'the shipped defaults, named',\n variants: {},\n },\n lean: {\n layout: DEFAULT_LAYOUT,\n summary: 'text only, no graphics',\n variants: {\n model: 'plain',\n effort: 'dim',\n state: 'none',\n cwd: 'init',\n branch: 'initials',\n status: 'counts',\n ahead: 'arrows',\n pr: 'badge',\n bar: 'percent',\n tokens: 'full',\n cache: 'hit',\n cost: 'plain',\n duration: 'clock',\n lines: 'diffstat',\n rate: 'none',\n style: 'dots',\n },\n },\n rich: {\n layout: DEFAULT_LAYOUT,\n summary: 'every gauge and counter',\n variants: {\n model: 'pill',\n effort: 'plain',\n state: 'pills',\n cwd: 'icon',\n branch: 'icon',\n status: 'icons',\n ahead: 'arrows',\n pr: 'badge',\n bar: 'gauge',\n tokens: 'full',\n cache: 'fuse',\n cost: 'burn',\n duration: 'clock',\n lines: 'diffstat',\n rate: 'strip',\n style: 'plain',\n },\n },\n custom: {\n layout: DEFAULT_LAYOUT,\n summary: 'bare; you decide everything',\n variants: {\n model: 'zen',\n effort: 'hidden',\n state: 'none',\n cwd: 'base',\n branch: 'none',\n status: 'none',\n ahead: 'none',\n pr: 'none',\n bar: 'none',\n tokens: 'none',\n cache: 'none',\n cost: 'none',\n duration: 'none',\n lines: 'none',\n rate: 'none',\n style: 'bare',\n },\n },\n};\n","import { type Theme, THEMES } from '../themes.js';\nimport { warn } from './engine.js';\nimport { DEFAULT_LAYOUT } from './items.js';\n\n// One resolver, two doors: the render entry resolves here at paint, and the\n// CLI's catalog/status/wizard import the same function for display — there is\n// no second resolution path. Precedence: item flags beat the theme, --layout\n// beats the theme's layout, no theme leaves the registry defaults.\n\ninterface PaintInput {\n readonly layout?: string;\n readonly picks?: Readonly<Record<string, string>>;\n readonly theme?: string;\n}\n\ninterface PaintSelection {\n readonly layout: string;\n readonly picks: Readonly<Record<string, string>>;\n}\n\nexport function resolvePaint(input: PaintInput): PaintSelection {\n const name = input.theme;\n const theme =\n name === undefined\n ? undefined\n : (THEMES as Readonly<Record<string, Theme | undefined>>)[name];\n if (name !== undefined && theme === undefined) {\n warn(`statusline: theme=${name} is not a known theme, ignored`);\n }\n return {\n layout: input.layout ?? theme?.layout ?? DEFAULT_LAYOUT,\n picks: { ...(theme?.variants ?? {}), ...input.picks },\n };\n}\n","import { parseArgv } from './argv.js';\nimport { capturePayload } from './capture.js';\nimport { renderStatusline } from './engine.js';\nimport { renderPanel } from './panel.js';\nimport { resolvePaint } from './theme.js';\n\n// The render.mjs entry the settings keys spawn: decisions ride argv, ambient\n// state rides env — NO_COLOR, COLUMNS, HOME stay environment because the\n// host shell owns them.\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let payload = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk: string) => {\n payload += chunk;\n });\n process.stdin.on('end', () => {\n resolve(payload);\n });\n process.stdin.on('error', reject);\n });\n}\n\n// The bash string rule on COLUMNS (unset, empty, or non-digit -> the engine's\n// 200) survives the port: Claude Code exports width as a string env var.\nfunction columnsFromEnv(text: string | undefined): number | undefined {\n if (text === undefined || text === '' || !/^\\d+$/.test(text)) {\n return undefined;\n }\n return Number(text);\n}\n\nasync function main(): Promise<void> {\n const argv = parseArgv(process.argv.slice(2));\n for (const warning of argv.warnings) {\n process.stderr.write(`${warning}\\n`);\n }\n const payload = await readStdin();\n const env = process.env;\n const home = env.HOME ?? '';\n const noColor = (env.NO_COLOR ?? '') !== '';\n const now = argv.now ?? Math.floor(Date.now() / 1000);\n const paint = resolvePaint(argv);\n if (argv.mode === 'panel') {\n capturePayload(home, 'tick', payload);\n process.stdout.write(\n renderPanel({ now, payload, picks: paint.picks, noColor }),\n );\n return;\n }\n capturePayload(home, 'main', payload);\n const columns = columnsFromEnv(env.COLUMNS);\n process.stdout.write(\n renderStatusline({\n home,\n now,\n payload,\n picks: paint.picks,\n noColor,\n layout: paint.layout,\n ...(columns === undefined ? {} : { columns }),\n }),\n );\n}\n\nawait main();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"render.mjs","names":[],"sources":["../src/render/items.ts","../src/render/argv.ts","../src/render/capture.ts","../src/render/git.ts","../src/render/layout.ts","../src/render/jq.ts","../src/render/payload.ts","../src/render/awk.ts","../src/render/segments.ts","../src/render/engine.ts","../src/render/panel.ts","../src/themes.ts","../src/render/theme.ts","../src/render/entry.ts"],"sourcesContent":["export interface ItemSpec {\n readonly alternatives: readonly string[];\n readonly default: string;\n readonly item: string;\n}\n\n// The one item registry, shared by the renderer and the CLI: 16 items in\n// paint order, including the three rungs no component header ever declared\n// (branch=none, bar=flat6, bar=flat4).\nexport const ITEMS: readonly ItemSpec[] = [\n {\n alternatives: ['plain', 'block', 'pill', 'zen'],\n default: 'plain',\n item: 'model',\n },\n {\n alternatives: ['plain', 'dim', 'hidden'],\n default: 'plain',\n item: 'effort',\n },\n { alternatives: ['none', 'pills'], default: 'none', item: 'state' },\n {\n alternatives: ['init', 'full', 'tail', 'base', 'icon'],\n default: 'init',\n item: 'cwd',\n },\n {\n alternatives: ['initials', 'full', 'last', 'icon', 'none'],\n default: 'initials',\n item: 'branch',\n },\n {\n alternatives: ['counts', 'icons', 'none'],\n default: 'counts',\n item: 'status',\n },\n { alternatives: ['none', 'arrows'], default: 'none', item: 'ahead' },\n { alternatives: ['none', 'badge'], default: 'none', item: 'pr' },\n {\n alternatives: ['flat', 'gauge', 'percent', 'none', 'flat6', 'flat4'],\n default: 'flat',\n item: 'bar',\n },\n {\n alternatives: ['full', 'compact', 'free', 'none'],\n default: 'full',\n item: 'tokens',\n },\n {\n alternatives: ['hit', 'coldin', 'fuse', 'none'],\n default: 'hit',\n item: 'cache',\n },\n { alternatives: ['plain', 'burn', 'none'], default: 'plain', item: 'cost' },\n {\n alternatives: ['clock', 'hours', 'none'],\n default: 'clock',\n item: 'duration',\n },\n { alternatives: ['none', 'diffstat'], default: 'none', item: 'lines' },\n { alternatives: ['none', 'strip'], default: 'none', item: 'rate' },\n {\n alternatives: ['plain', 'dots', 'dim', 'bare'],\n default: 'plain',\n item: 'style',\n },\n];\n\nexport const DEFAULT_LAYOUT =\n '{model effort state} {cwd branch status ahead pr} {bar tokens cache} {cost} {duration} {lines} {rate}';\n\n// The registry's lookup door — every module that asks \"is this item known,\n// is this alt offered\" comes through here, never a Map of its own.\nconst BY_ITEM = new Map(ITEMS.map(spec => [spec.item, spec]));\n\nexport function specFor(item: string): ItemSpec | undefined {\n return BY_ITEM.get(item);\n}\n\nexport const ITEM_IDS: readonly string[] = ITEMS.map(spec => spec.item);\n\nexport const DEFAULT_PICKS: Readonly<Record<string, string>> =\n Object.fromEntries(ITEMS.map(({ default: alt, item }) => [item, alt]));\n\nexport const RUNG_ORDERS: Readonly<Partial<Record<string, readonly string[]>>> =\n {\n bar: ['flat', 'flat6', 'flat4', 'percent', 'none'],\n branch: ['icon', 'full', 'initials', 'last', 'none'],\n cache: ['hit', 'coldin', 'none'],\n cwd: ['icon', 'full', 'init', 'tail', 'base'],\n duration: ['clock', 'hours', 'none'],\n effort: ['plain', 'dim', 'hidden'],\n status: ['counts', 'icons', 'none'],\n tokens: ['full', 'free', 'compact', 'none'],\n };\n\nexport type FitStep = readonly [item: string, alt: string];\n\nexport const FULL_STEPS: readonly FitStep[] = [\n ['duration', 'none'],\n ['cache', 'none'],\n ['tokens', 'compact'],\n ['bar', 'flat6'],\n ['status', 'none'],\n ['branch', 'initials'],\n ['cwd', 'init'],\n ['branch', 'last'],\n ['bar', 'flat4'],\n ['model', 'strip'],\n ['bar', 'percent'],\n ['branch', 'none'],\n ['cwd', 'tail'],\n ['effort', 'hidden'],\n ['cwd', 'base'],\n ['tokens', 'none'],\n];\n\nexport const L1_STEPS: readonly FitStep[] = [\n ['status', 'none'],\n ['branch', 'initials'],\n ['cwd', 'init'],\n ['branch', 'last'],\n ['model', 'strip'],\n ['branch', 'none'],\n ['cwd', 'tail'],\n ['effort', 'hidden'],\n ['cwd', 'base'],\n];\n\nexport const L2_STEPS: readonly FitStep[] = [\n ['duration', 'none'],\n ['cache', 'none'],\n ['tokens', 'compact'],\n ['bar', 'flat6'],\n ['bar', 'flat4'],\n ['tokens', 'none'],\n ['bar', 'percent'],\n];\n","import { parseArgs } from 'node:util';\n\nimport { specFor } from './items.js';\n\n// The render.mjs argv grammar — node:util parseArgs, never commander and\n// never @v1nvn/agentic-core; the CLI and the renderer share only the registry\n// data. Grammar only: theme and layout values pass through unresolved.\n\nexport interface ArgvResult {\n readonly layout?: string;\n readonly mode: 'line' | 'panel';\n readonly now?: number;\n readonly picks: Record<string, string>;\n readonly theme?: string;\n readonly warnings: string[];\n}\n\nfunction warn(warnings: string[], message: string): void {\n warnings.push(message);\n}\n\nexport function parseArgv(argv: readonly string[]): ArgvResult {\n const parsed = parseArgs({\n allowPositionals: true,\n args: [...argv],\n options: {\n layout: { type: 'string' },\n now: { type: 'string' },\n theme: { type: 'string' },\n },\n strict: false,\n });\n const warnings: string[] = [];\n const picks: Record<string, string> = {};\n let mode: 'line' | 'panel' = 'line';\n let theme: string | undefined;\n let layout: string | undefined;\n let now: number | undefined;\n\n for (const positional of parsed.positionals) {\n if (positional === 'panel') {\n mode = 'panel';\n } else {\n warn(\n warnings,\n `statusline: unexpected argument '${positional}', ignored`,\n );\n }\n }\n\n for (const [name, value] of Object.entries(parsed.values)) {\n if (typeof value !== 'string') {\n warn(warnings, `statusline: --${name} needs a value, ignored`);\n continue;\n }\n if (name === 'theme') {\n theme = value;\n continue;\n }\n if (name === 'layout') {\n layout = value;\n continue;\n }\n if (name === 'now') {\n const epoch = Number(value);\n if (Number.isFinite(epoch) && value.trim() !== '') {\n now = epoch;\n } else {\n warn(warnings, `statusline: --now=${value} is not a number, ignored`);\n }\n continue;\n }\n const spec = specFor(name);\n if (spec === undefined) {\n warn(warnings, `statusline: --${name} is not a known flag, ignored`);\n continue;\n }\n if (spec.alternatives.includes(value)) {\n picks[name] = value;\n } else {\n warn(\n warnings,\n `statusline: ${name}=${value} is not available, using ${name}=${spec.default}`,\n );\n }\n }\n\n return {\n mode,\n picks,\n warnings,\n ...(theme === undefined ? {} : { theme }),\n ...(layout === undefined ? {} : { layout }),\n ...(now === undefined ? {} : { now }),\n };\n}\n","import { mkdirSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nexport const DATA_DIR = join(\n '.claude',\n 'plugins',\n 'data',\n 'statusline-agentic',\n);\n\n// The capture tee: the raw stdin bytes tee to the data dir, written to a temp\n// name and renamed so a reader never sees a half-written payload.\nexport function capturePayload(\n home: string,\n surface: 'main' | 'tick',\n payload: string,\n): void {\n const dest = join(home, DATA_DIR, 'captures', `${surface}.json`);\n try {\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(`${dest}.tmp`, payload);\n renameSync(`${dest}.tmp`, dest);\n } catch {\n // The tee is debug telemetry; a failed write must not kill the paint.\n }\n}\n","import { spawnSync } from 'node:child_process';\n\nexport interface GitFacts {\n readonly ahead: number;\n readonly behind: number;\n readonly branch: string;\n readonly modified: number;\n readonly staged: number;\n readonly stashes: number;\n readonly untracked: number;\n}\n\nexport interface GitEnv {\n readonly home: string;\n}\n\nconst BRANCH_HEAD = '# branch.head ';\n// `# branch.ab +2 -3` rides the porcelain status only when an upstream\n// exists — absent lines read as the zeros a failed rev-list counted.\nconst BRANCH_AB = /^# branch\\.ab \\+(\\d+) -(\\d+)$/;\n\nfunction gitEnv(env: GitEnv): Readonly<Record<string, string>> {\n return {\n HOME: env.home,\n LC_ALL: 'C',\n PATH: process.env.PATH ?? '',\n };\n}\n\nfunction gitText(\n dir: string,\n args: readonly string[],\n env: GitEnv,\n): null | string {\n const run = spawnSync('git', ['-C', dir, ...args], {\n encoding: 'utf8',\n env: gitEnv(env),\n });\n return run.status === 0 ? run.stdout : null;\n}\n\nfunction lineCount(text: null | string): number {\n return text === null || text === '' ? 0 : (text.match(/\\n/g) ?? []).length;\n}\n\nfunction count(text: null | string): number {\n const parsed = text === null ? NaN : Number(text.trim());\n return Number.isFinite(parsed) ? Math.trunc(parsed) : 0;\n}\n\nexport function readGit(dir: string, env: GitEnv): GitFacts {\n const facts = {\n ahead: 0,\n behind: 0,\n branch: '',\n modified: 0,\n staged: 0,\n stashes: 0,\n untracked: 0,\n };\n if (dir === '') {\n return facts;\n }\n const probe = spawnSync('git', ['-C', dir, 'rev-parse', '--git-dir'], {\n encoding: 'utf8',\n env: gitEnv(env),\n });\n if (probe.status !== 0) {\n return facts;\n }\n const status = gitText(dir, ['status', '--porcelain=v2', '--branch'], env);\n for (const line of (status ?? '').split('\\n')) {\n if (line.startsWith(BRANCH_HEAD)) {\n facts.branch = line.slice(BRANCH_HEAD.length);\n continue;\n }\n const ab = BRANCH_AB.exec(line);\n if (ab !== null) {\n facts.ahead = count(ab[1]);\n facts.behind = count(ab[2]);\n } else if (\n (line.startsWith('1 ') || line.startsWith('2 ')) &&\n line.length >= 4\n ) {\n if (line[2] !== '.') {\n facts.staged += 1;\n }\n if (line[3] !== '.') {\n facts.modified += 1;\n }\n }\n }\n if (facts.branch === '(detached)') {\n facts.branch = '';\n }\n facts.untracked = lineCount(\n gitText(dir, ['ls-files', '--others', '--exclude-standard'], env),\n );\n facts.stashes = lineCount(gitText(dir, ['stash', 'list'], env));\n return facts;\n}\n","// The layout grammar — brace clusters of item ids — parsed once for every\n// door: the writer validates through layoutItems, the status row collects\n// through layoutItemsOf, and the engine renders the clusters it returns.\n\nexport function parseClusters(layout: string): string[][] {\n const clusters: string[][] = [];\n let words: string[] = [];\n let word = '';\n let open = false;\n function pushWord(): void {\n if (word !== '') {\n words.push(word);\n word = '';\n }\n }\n for (const c of layout) {\n if (c === '{') {\n if (open) {\n throw new Error(`layout '${layout}': '{' inside a cluster`);\n }\n open = true;\n words = [];\n } else if (c === '}') {\n if (!open) {\n throw new Error(`layout '${layout}': '}' outside a cluster`);\n }\n pushWord();\n open = false;\n if (words.length > 0) {\n clusters.push(words);\n }\n } else if (c === ' ') {\n if (open) {\n pushWord();\n } else if (word !== '') {\n throw new Error(`layout '${layout}': '${word}' sits outside a cluster`);\n }\n } else if (/[a-z0-9]/.test(c)) {\n word += c;\n } else {\n throw new Error(\n `layout '${layout}': '${c}' is not layout grammar (braces, item ids, spaces)`,\n );\n }\n }\n if (open) {\n throw new Error(`layout '${layout}': unterminated cluster`);\n }\n if (word !== '') {\n throw new Error(`layout '${layout}': '${word}' sits outside a cluster`);\n }\n if (clusters.length === 0) {\n throw new Error(`layout '${layout}': no clusters`);\n }\n return clusters;\n}\n\n// The items a layout names, in first-appearance order — tolerant of names the\n// registry does not know.\nexport function layoutItemsOf(layout: string): string[] {\n const items: string[] = [];\n for (const cluster of parseClusters(layout)) {\n for (const item of cluster) {\n if (!items.includes(item)) {\n items.push(item);\n }\n }\n }\n return items;\n}\n\nexport function layoutItems(\n layout: string,\n valid: readonly string[],\n): string[] {\n const known = new Set(valid);\n const items = layoutItemsOf(layout);\n for (const item of items) {\n if (!known.has(item)) {\n throw new Error(\n `unknown layout item '${item}' — valid items: ${valid.join(' ')}`,\n );\n }\n }\n return items;\n}\n","// jq semantics the two payload parsers share — the line and the panel were\n// separate jq pipelines in bash and must keep their exact behaviors, but the\n// meaning of `//`, tostring, and @tsv is one thing, written once.\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// jq's `//`: only null, false, and a missing member fall through.\nexport function orElse(value: unknown, fallback: unknown): unknown {\n return value === undefined || value === null || value === false\n ? fallback\n : value;\n}\n\n// jq's tostring: scalars as text, containers as JSON.\nexport function jqText(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return JSON.stringify(value);\n}\n\n// jq's @tsv: backslash, tab, newline, and carriage return survive as their\n// two-character escapes.\nexport function tsvEscape(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n}\n","import { isRecord, orElse } from './jq.js';\n\nexport interface RateRow {\n readonly label: string;\n readonly pctText: string;\n readonly resets: number;\n}\n\nexport interface Row {\n readonly agent: string;\n readonly cost: number;\n readonly ctxSize: number;\n readonly dir: string;\n readonly durationMs: number;\n readonly effort: string;\n readonly expires: number;\n readonly hit: null | number;\n readonly la: number;\n readonly lr: number;\n readonly model: string;\n readonly pct: number;\n readonly prn: string;\n readonly prs: string;\n readonly rateRows: readonly RateRow[];\n readonly styleName: string;\n readonly think: boolean;\n readonly tokens: number;\n readonly ttl: string;\n readonly vim: string;\n readonly warm: boolean;\n readonly wt: string;\n}\n\nfunction member(source: unknown, key: string): unknown {\n return isRecord(source) ? source[key] : undefined;\n}\n\nfunction field(source: unknown, path: string): unknown {\n let current: unknown = source;\n for (const key of path.split('.')) {\n current = member(current, key);\n }\n return current;\n}\n\n// The line's bash side never saw a container in a scalar field; one reads\n// as empty text, not as JSON.\nfunction textOf(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return '';\n}\n\nfunction scalar(source: unknown, path: string, fallback: string): string {\n return textOf(orElse(field(source, path), fallback));\n}\n\nfunction numberField(source: unknown, path: string): number {\n return Number(scalar(source, path, '0'));\n}\n\n// `${PCT%%.*}`: the used-percentage text up to its first decimal point.\nfunction pctField(source: unknown): number {\n const intPart = scalar(source, 'context_window.used_percentage', '0').split(\n '.',\n )[0];\n return intPart === '' ? 0 : Number(intPart);\n}\n\nconst RATE_LIMITS: readonly (readonly [label: string, key: string])[] = [\n ['5h', 'five_hour'],\n ['7d', 'seven_day'],\n ['spend', 'spend_limit'],\n];\n\nfunction rateRows(source: unknown): RateRow[] {\n const limits = field(source, 'rate_limits');\n const rows: RateRow[] = [];\n for (const [label, key] of RATE_LIMITS) {\n const limit = member(limits, key);\n if (!isRecord(limit) || Object.keys(limit).length === 0) {\n continue;\n }\n rows.push({\n label,\n pctText: scalar(limit, 'used_percentage', '0'),\n resets: Number(scalar(limit, 'resets_at', '0')),\n });\n }\n return rows;\n}\n\nexport function parseRow(payload: string): Row {\n const root: unknown = JSON.parse(payload);\n const hitText = scalar(root, 'prompt_cache.hit_ratio', '');\n return {\n agent: scalar(root, 'agent.name', ''),\n cost: numberField(root, 'cost.total_cost_usd'),\n ctxSize: numberField(root, 'context_window.context_window_size'),\n dir: scalar(root, 'workspace.current_dir', ''),\n durationMs: numberField(root, 'cost.total_duration_ms'),\n effort: scalar(root, 'effort.level', ''),\n expires: numberField(root, 'prompt_cache.expires_at'),\n hit: hitText === '' ? null : Number(hitText),\n la: numberField(root, 'cost.total_lines_added'),\n lr: numberField(root, 'cost.total_lines_removed'),\n model: scalar(root, 'model.display_name', ''),\n pct: pctField(root),\n prn: scalar(root, 'pr.number', ''),\n prs: scalar(root, 'pr.review_state', ''),\n rateRows: rateRows(root),\n think: scalar(root, 'thinking.enabled', 'false') === 'true',\n tokens: numberField(root, 'context_window.total_input_tokens'),\n ttl: scalar(root, 'prompt_cache.ttl', ''),\n vim: scalar(root, 'vim.mode', ''),\n warm: scalar(root, 'prompt_cache.warm', 'false') === 'true',\n wt: scalar(root, 'worktree.name', ''),\n styleName: scalar(root, 'output_style.name', ''),\n };\n}\n","// The bash renderers format numbers with awk printf (\"%.1fk\", n/1000,\n// \"$%.2f\", c), which rounds the value's exact IEEE bits to even at a decimal\n// tie. toFixed rounds ties away from zero — 1250 prints \"1.2k\" here, \"1.3k\"\n// there — so fmtFixed is the one door for printf-style decimal formatting,\n// and the rounding is done on the double's exact bits, never in floating\n// arithmetic.\n\nconst TEN = 10n;\n\nfunction exactParts(ax: number): { exp: number; mant: bigint } {\n const view = new DataView(new ArrayBuffer(8));\n view.setFloat64(0, ax);\n const hi = view.getUint32(0);\n const lo = view.getUint32(4);\n const biased = (hi >>> 20) & 0x7ff;\n const frac = (BigInt(hi & 0xfffff) << 32n) | BigInt(lo);\n if (biased === 0) {\n return { exp: -1074, mant: frac };\n }\n return { exp: biased - 1075, mant: frac | (1n << 52n) };\n}\n\n// ax * 10^d rounded to an integer, ties to even.\nfunction roundScaled(ax: number, d: number): bigint {\n const { exp, mant } = exactParts(ax);\n const pow10 = TEN ** BigInt(d);\n const num = exp >= 0 ? (mant << BigInt(exp)) * pow10 : mant * pow10;\n const den = exp >= 0 ? 1n : 1n << BigInt(-exp);\n const q = num / den;\n const twice = (num % den) * 2n;\n if (twice > den || (twice === den && q % 2n === 1n)) {\n return q + 1n;\n }\n return q;\n}\n\nexport function fmtFixed(x: number, d: number): string {\n const q = roundScaled(Math.abs(x), d);\n const sign = x < 0 && q !== 0n ? '-' : '';\n const digits = q.toString();\n if (d === 0) {\n return `${sign}${digits}`;\n }\n const intPart = digits.length <= d ? '0' : digits.slice(0, digits.length - d);\n const fracPart = digits.padStart(d + 1, '0').slice(-d);\n return `${sign}${intPart}.${fracPart}`;\n}\n\nexport function pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nexport function fmtDuration(minutes: number): string {\n if (minutes < 60) {\n return `${minutes}m`;\n }\n if (minutes < 1440) {\n return `${Math.trunc(minutes / 60)}h${pad2(minutes % 60)}m`;\n }\n return `${Math.trunc(minutes / 1440)}d${pad2(Math.trunc(minutes / 60) % 24)}h`;\n}\n\nexport function fmtK(n: number, d: number): string {\n return `${fmtFixed(n / 1000, d)}k`;\n}\n\nexport function fmtM(n: number): string {\n return `${fmtFixed(n / 1_000_000, 0)}M`;\n}\n","import type { GitFacts } from './git.js';\nimport type { Row } from './payload.js';\n\nimport { fmtDuration, fmtFixed, fmtK, fmtM, pad2 } from './awk.js';\n\nexport interface SegmentInput {\n readonly git: GitFacts;\n readonly home: string;\n readonly model: string;\n readonly now: number;\n readonly row: Row;\n}\n\ntype Segment = (input: SegmentInput) => string;\n\nconst BLUE = '\\x1b[34m';\nconst CYAN = '\\x1b[36m';\nconst DIM = '\\x1b[2m';\nconst GREEN = '\\x1b[32m';\nconst PURPLE = '\\x1b[35m';\nconst RED = '\\x1b[31m';\nconst RESET = '\\x1b[0m';\nconst YELLOW = '\\x1b[33m';\nconst BOLD = '\\x1b[1m';\nconst GRAY = '\\x1b[38;2;68;71;90m';\nconst MARK = '\\x1b[1;97m';\n\nconst SHORT_AT = 15;\nconst PART = ['▏', '▎', '▍', '▌', '▋', '▊', '▉', '█'];\nconst HEAT = [\n '\\x1b[38;2;48;242;36m',\n '\\x1b[38;2;63;242;36m',\n '\\x1b[38;2;79;242;36m',\n '\\x1b[38;2;95;242;36m',\n '\\x1b[38;2;111;242;36m',\n '\\x1b[38;2;126;242;36m',\n '\\x1b[38;2;142;242;36m',\n '\\x1b[38;2;158;242;36m',\n '\\x1b[38;2;173;242;36m',\n '\\x1b[38;2;189;242;36m',\n '\\x1b[38;2;205;242;36m',\n '\\x1b[38;2;220;242;36m',\n '\\x1b[38;2;236;242;36m',\n '\\x1b[38;2;242;232;36m',\n '\\x1b[38;2;242;216;36m',\n '\\x1b[38;2;242;200;36m',\n '\\x1b[38;2;242;185;36m',\n '\\x1b[38;2;242;169;36m',\n '\\x1b[38;2;242;153;36m',\n '\\x1b[38;2;242;138;36m',\n '\\x1b[38;2;242;122;36m',\n '\\x1b[38;2;242;106;36m',\n '\\x1b[38;2;242;91;36m',\n '\\x1b[38;2;242;75;36m',\n '\\x1b[38;2;242;59;36m',\n '\\x1b[38;2;242;44;36m',\n];\n\nfunction trunc(n: number): number {\n return Math.trunc(n);\n}\n\nfunction modelPlain({ model }: SegmentInput): string {\n return model === '' ? '' : `${CYAN}${model}${RESET}`;\n}\n\nfunction modelBlock({ model }: SegmentInput): string {\n return model === '' ? '' : `\\x1b[48;5;61m\\x1b[38;5;231m ${model} \\x1b[0m`;\n}\n\nfunction modelPill({ model }: SegmentInput): string {\n return model === ''\n ? ''\n : `\\x1b[48;5;61m\\x1b[38;5;231m\\u{e0b6} ${model} \\u{e0b4}\\x1b[0m`;\n}\n\nfunction modelZen({ model }: SegmentInput): string {\n return model === ''\n ? ''\n : `${DIM}${model.replace(/[A-Z]/g, c => c.toLowerCase())}${RESET}`;\n}\n\nfunction effortPlain({ row }: SegmentInput): string {\n return row.effort === '' ? '' : `${CYAN}${row.effort}${RESET}`;\n}\n\nfunction effortDim({ row }: SegmentInput): string {\n return row.effort === '' ? '' : `${DIM}${row.effort}${RESET}`;\n}\n\nfunction statePill(label: string, bg: number, fg: number): string {\n return `\\x1b[48;5;${bg}m\\x1b[38;5;${fg}m\\u{e0b6} ${label} \\u{e0b4}\\x1b[0m`;\n}\n\nfunction statePills({ row }: SegmentInput): string {\n let out = '';\n if (row.vim !== '') {\n out =\n row.vim === 'INSERT'\n ? statePill(row.vim, 97, 16)\n : statePill(row.vim, 240, 231);\n }\n if (row.think) {\n out += ` ${statePill('THINK', 66, 16)}`;\n }\n if (row.agent !== '') {\n out += ` ${statePill(row.agent, 60, 231)}`;\n }\n if (row.wt !== '') {\n out += ` ${statePill(`wt:${row.wt}`, 131, 231)}`;\n }\n if (row.styleName !== '' && row.styleName !== 'default') {\n out += ` ${statePill(row.styleName, 95, 16)}`;\n }\n return out;\n}\n\ninterface SplitPath {\n readonly lead: string;\n readonly parts: readonly string[];\n readonly text: string;\n}\n\nfunction splitPath(raw: string, home: string): SplitPath {\n let p = raw;\n if (home !== '' && p.startsWith(home)) {\n p = `~${p.slice(home.length)}`;\n }\n return {\n lead: p.startsWith('/') ? '/' : '',\n parts: p.split('/').filter(part => part !== ''),\n text: p,\n };\n}\n\nfunction pathInit(raw: string, home: string): string {\n const { lead, parts, text } = splitPath(raw, home);\n const n = parts.length;\n if (n <= 2) {\n return text;\n }\n let out = `${lead}${parts[0]}`;\n for (let i = 1; i < n - 1; i++) {\n const ini = parts[i].startsWith('.')\n ? parts[i].slice(0, 2)\n : parts[i].slice(0, 1);\n out += `/${ini}`;\n }\n return `${out}/${parts[n - 1]}`;\n}\n\nfunction pathTail(raw: string, home: string, lim: number): string {\n const { lead, parts, text } = splitPath(raw, home);\n const cnt = parts.length;\n if (cnt <= lim || cnt <= 1) {\n return text;\n }\n let out = `${lead}${parts[0]}/…`;\n for (let i = cnt - lim; i < cnt; i++) {\n out += `/${parts[i]}`;\n }\n return out;\n}\n\nfunction cwdInit({ home, row }: SegmentInput): string {\n const { text } = splitPath(row.dir, home);\n return Buffer.byteLength(text, 'utf8') > SHORT_AT\n ? pathInit(row.dir, home)\n : text;\n}\n\nfunction cwdFull({ home, row }: SegmentInput): string {\n return splitPath(row.dir, home).text;\n}\n\nfunction cwdTail({ home, row }: SegmentInput): string {\n return pathTail(row.dir, home, 1);\n}\n\nfunction baseName(dir: string): string {\n return dir.slice(dir.lastIndexOf('/') + 1);\n}\n\nfunction cwdBase({ row }: SegmentInput): string {\n return baseName(row.dir);\n}\n\nfunction cwdIcon({ row }: SegmentInput): string {\n return `\\u{f07b} ${baseName(row.dir)}`;\n}\n\nfunction branchInitials({ git }: SegmentInput): string {\n const branch = git.branch;\n if (branch === '') {\n return '';\n }\n if (Buffer.byteLength(branch, 'utf8') <= SHORT_AT) {\n return branch;\n }\n const parts = branch.split('/').filter(part => part !== '');\n if (parts.length <= 1) {\n return branch;\n }\n let out = '';\n for (let i = 0; i < parts.length - 1; i++) {\n out += `${parts[i].slice(0, 1)}/`;\n }\n return `${out}${parts[parts.length - 1]}`;\n}\n\nfunction branchFull({ git }: SegmentInput): string {\n return git.branch;\n}\n\nfunction branchLast({ git }: SegmentInput): string {\n return git.branch.slice(git.branch.lastIndexOf('/') + 1);\n}\n\nfunction branchIcon({ git }: SegmentInput): string {\n return git.branch === '' ? '' : `\\u{e0a0} ${git.branch}`;\n}\n\nfunction statusCounts({ git }: SegmentInput): string {\n if (git.branch === '') {\n return '';\n }\n let c = '';\n if (git.staged > 0) {\n c = `${GREEN}+${git.staged}${RESET}`;\n }\n if (git.modified > 0) {\n c = `${c} ${YELLOW}~${git.modified}${RESET}`;\n }\n return c;\n}\n\nfunction statusIcons({ git }: SegmentInput): string {\n if (git.branch === '') {\n return '';\n }\n let out = '';\n let sep = '';\n if (git.staged > 0) {\n out += `${GREEN}●${git.staged}${RESET}`;\n sep = ' ';\n }\n if (git.modified > 0) {\n out += `${sep}${YELLOW}✎${git.modified}${RESET}`;\n sep = ' ';\n }\n if (git.untracked > 0) {\n out += `${sep}${CYAN}+${git.untracked}${RESET}`;\n sep = ' ';\n }\n if (git.stashes > 0) {\n out += `${sep}${PURPLE}⚑${git.stashes}${RESET}`;\n }\n return out;\n}\n\nfunction aheadArrows({ git }: SegmentInput): string {\n let out = '';\n if (git.ahead > 0) {\n out = `${GREEN}↑${git.ahead}${RESET}`;\n }\n if (git.behind > 0) {\n out += ` ${RED}↓${git.behind}${RESET}`;\n }\n return out;\n}\n\nfunction prBadge({ row }: SegmentInput): string {\n if (row.prn === '') {\n return '';\n }\n let col: string;\n let mark: string;\n switch (row.prs) {\n case 'approved':\n col = GREEN;\n mark = '✓';\n break;\n case 'changes_requested':\n col = RED;\n mark = '✗';\n break;\n case 'pending':\n col = YELLOW;\n mark = '⏳';\n break;\n default:\n col = '\\x1b[90m';\n mark = '◌';\n }\n return `${BLUE}#${row.prn}${RESET} ${col}${mark} ${row.prs}${RESET}`;\n}\n\nfunction barFlatAt(input: SegmentInput, w: number): string {\n const pct = input.row.pct;\n let f = trunc((pct * w) / 100);\n if (f > w) {\n f = w;\n }\n if (pct > 0 && f === 0) {\n f = 1;\n }\n const col = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;\n return `${col}${'█'.repeat(f)}${'░'.repeat(w - f)}${RESET}`;\n}\n\nfunction barFlat(input: SegmentInput): string {\n return barFlatAt(input, 10);\n}\n\nfunction barGauge({ row }: SegmentInput): string {\n const pct = row.pct;\n const p = Math.max(0, Math.min(100, pct));\n const full = trunc((p * 26) / 100);\n const idx = trunc((((p * 26) % 100) * 8) / 100);\n const lead =\n p >= 50\n ? `\\x1b[38;2;242;${trunc((4845 * (15000 + 1683 * (100 - p))) / 2000000)};36m`\n : `\\x1b[38;2;${trunc((4845 * (185000 - 1683 * (100 - p))) / 2000000)};242;36m`;\n const moon = ['○', '◔', '◑', '◕', '●'][Math.min(trunc(p / 20), 4)];\n let bar = '';\n for (let i = 0; i < 26; i++) {\n let col: string;\n let cell: string;\n if (i === 20) {\n col = MARK;\n cell = i <= full ? '┃' : '│';\n } else if (i <= full) {\n col = HEAT[i];\n cell = i === full ? PART[idx] : '█';\n } else {\n col = GRAY;\n cell = '░';\n }\n bar += `${col}${cell}`;\n }\n return `${moon} ${lead}${bar}${RESET} ${MARK}${pct}%${RESET}`;\n}\n\nfunction tokensFull({ row }: SegmentInput): string {\n const t = row.tokens >= 1000 ? fmtK(row.tokens, 1) : String(row.tokens);\n let c = String(row.ctxSize);\n if (row.ctxSize >= 1000000) {\n c = fmtM(row.ctxSize);\n } else if (row.ctxSize >= 1000) {\n c = fmtK(row.ctxSize, 0);\n }\n return `${t}/${c}`;\n}\n\nfunction tokensCompact({ row }: SegmentInput): string {\n return row.tokens >= 1000 ? fmtK(row.tokens, 0) : String(row.tokens);\n}\n\nfunction tokensFree({ row }: SegmentInput): string {\n const free = row.ctxSize - row.tokens;\n return `${DIM}${free >= 1000 ? fmtK(free, 0) : String(free)} free${RESET}`;\n}\n\nfunction cacheHitPct(row: Row): null | number {\n return row.hit === null ? null : trunc(row.hit * 100);\n}\n\nfunction cacheHCol(hp: number): string {\n return hp >= 90 ? GREEN : hp >= 50 ? YELLOW : RED;\n}\n\nfunction cacheHit({ row }: SegmentInput): string {\n const hp = cacheHitPct(row);\n return hp === null ? '' : `${cacheHCol(hp)}⚡${hp}%${RESET}`;\n}\n\nfunction cacheColdin({ now, row }: SegmentInput): string {\n const hp = cacheHitPct(row);\n if (hp === null) {\n return '';\n }\n if (row.warm && row.expires > now) {\n const mins = trunc((row.expires - now) / 60);\n return `${cacheHCol(hp)}⚡${hp}%${RESET} ${DIM}· cold in ${mins}m${RESET}`;\n }\n return `❄ ${DIM}cold · ${hp}%${RESET}`;\n}\n\nfunction cacheFuse({ now, row }: SegmentInput): string {\n if (row.ttl === '' || row.expires === 0) {\n return '';\n }\n const span = row.ttl === '1h' ? 3600 : 300;\n let left = row.expires - now;\n if (left < 0) {\n left = 0;\n }\n if (left <= 0) {\n return `${RED}❄ cold${RESET}`;\n }\n const full = trunc((left * 10) / span);\n const rem = (left * 10) % span;\n const col = left * 4 > span ? GREEN : left * 25 > span * 2 ? YELLOW : RED;\n let bar = col;\n for (let i = 0; i < 10; i++) {\n if (i < full) {\n bar += '▰';\n } else if (i === full && rem * 20 > span) {\n bar += PART[trunc((rem * 8) / span)];\n } else {\n bar += `${DIM}▱`;\n }\n }\n return `${bar}${RESET} ${DIM}${pad2(trunc(left / 60))}:${pad2(left % 60)}${RESET}`;\n}\n\nfunction costPlain({ row }: SegmentInput): string {\n return row.cost >= 0.005 ? `${YELLOW}$${fmtFixed(row.cost, 2)}${RESET}` : '';\n}\n\nfunction costBurn(input: SegmentInput): string {\n const hr = input.row.durationMs / 3600000;\n // awk's else branch prints \"0\", never \"0.00\", so a sub-threshold burn rate\n // still appends \"$0/hr\" — ported as-is.\n const burn = hr > 0.02 ? fmtFixed(input.row.cost / hr, 2) : '0';\n let out = costPlain(input);\n if (burn !== '0.00') {\n out += ` ${DIM}· $${burn}/hr${RESET}`;\n }\n return out;\n}\n\nfunction durationClock({ row }: SegmentInput): string {\n return fmtDuration(trunc(row.durationMs / 60000));\n}\n\nfunction durationHours({ row }: SegmentInput): string {\n const m = trunc(row.durationMs / 60000);\n if (m < 1440) {\n return `${trunc(m / 60)}h${pad2(m % 60)}m`;\n }\n return `${trunc(m / 1440)}d${pad2(trunc(m / 60) % 24)}h${pad2(m % 60)}m`;\n}\n\nfunction linesDiffstat({ row }: SegmentInput): string {\n if (row.la <= 0 && row.lr <= 0) {\n return '';\n }\n return `${GREEN}+${row.la}${RESET}${DIM}/${RESET}${RED}−${row.lr}${RESET}`;\n}\n\nfunction rateStrip({ now, row }: SegmentInput): string {\n const segs: string[] = [];\n for (const limit of row.rateRows) {\n const [intpText, fracp = ''] = limit.pctText.split('.');\n let f = 0;\n let scale = 1;\n for (const digit of fracp) {\n f = f * 10 + Number(digit);\n scale *= 10;\n }\n const intp = Number(intpText);\n const value = intp * scale + f;\n const col = value < 70 * scale ? GREEN : value < 90 * scale ? YELLOW : RED;\n const full = trunc((value * 14) / (100 * scale));\n const rem = (value * 14) % (100 * scale);\n const idx = trunc((rem * 8) / (100 * scale));\n let bar = col;\n for (let i = 0; i < 14; i++) {\n if (i < full) {\n bar += '█';\n } else if (i === full) {\n bar += PART[idx];\n } else {\n bar += `${DIM}░`;\n }\n }\n const lbl =\n fracp === '' || f * 2 < scale\n ? intp\n : f * 2 > scale\n ? intp + 1\n : intp + (intp % 2);\n const s = limit.resets - now;\n let dur: string;\n if (s >= 3600) {\n dur = `${trunc(s / 3600)}h${pad2(trunc((s % 3600) / 60))}m`;\n } else {\n const sec = ((s % 60) + 60) % 60;\n dur = `${trunc((s - sec) / 60)}m${pad2(sec)}s`;\n }\n segs.push(\n `${DIM}${limit.label}${RESET} ${bar}${RESET} ${BOLD}${lbl}%${RESET} ${DIM}· resets ${dur}${RESET}`,\n );\n }\n return segs.join(` ${DIM}│${RESET} `);\n}\n\nfunction emptySegment(): string {\n return '';\n}\n\nfunction barFlat6(input: SegmentInput): string {\n return barFlatAt(input, 6);\n}\n\nfunction barFlat4(input: SegmentInput): string {\n return barFlatAt(input, 4);\n}\n\nfunction barPercent({ row }: SegmentInput): string {\n return `${row.pct}%`;\n}\n\nexport const SEGMENTS: Readonly<\n Partial<Record<string, Readonly<Record<string, Segment>>>>\n> = {\n ahead: { arrows: aheadArrows, none: emptySegment },\n bar: {\n flat4: barFlat4,\n flat6: barFlat6,\n flat: barFlat,\n gauge: barGauge,\n none: emptySegment,\n percent: barPercent,\n },\n branch: {\n full: branchFull,\n icon: branchIcon,\n initials: branchInitials,\n last: branchLast,\n none: emptySegment,\n },\n cache: {\n coldin: cacheColdin,\n fuse: cacheFuse,\n hit: cacheHit,\n none: emptySegment,\n },\n cost: { burn: costBurn, none: emptySegment, plain: costPlain },\n cwd: {\n base: cwdBase,\n full: cwdFull,\n icon: cwdIcon,\n init: cwdInit,\n tail: cwdTail,\n },\n duration: { clock: durationClock, hours: durationHours, none: emptySegment },\n effort: { dim: effortDim, hidden: emptySegment, plain: effortPlain },\n lines: { diffstat: linesDiffstat, none: emptySegment },\n model: {\n block: modelBlock,\n pill: modelPill,\n plain: modelPlain,\n zen: modelZen,\n },\n pr: { badge: prBadge, none: emptySegment },\n rate: { none: emptySegment, strip: rateStrip },\n state: { none: emptySegment, pills: statePills },\n status: { counts: statusCounts, icons: statusIcons, none: emptySegment },\n tokens: {\n compact: tokensCompact,\n full: tokensFull,\n free: tokensFree,\n none: emptySegment,\n },\n};\n\nexport function renderSegment(\n item: string,\n alt: string,\n input: SegmentInput,\n): string {\n const segment = SEGMENTS[item]?.[alt];\n return segment === undefined ? '' : segment(input);\n}\n\nexport interface Separators {\n readonly join: string;\n readonly sep: string;\n}\n\nexport function styleSeparators(alt: string): Separators {\n switch (alt) {\n case 'bare':\n return { join: ' ', sep: ' ' };\n case 'dim':\n return { join: ' ', sep: `${DIM} │ ${RESET}` };\n case 'dots':\n return { join: ' · ', sep: ' · ' };\n default:\n return { join: ' ', sep: ' │ ' };\n }\n}\n","import { readGit } from './git.js';\nimport {\n DEFAULT_LAYOUT,\n type FitStep,\n FULL_STEPS,\n ITEMS,\n L1_STEPS,\n L2_STEPS,\n RUNG_ORDERS,\n} from './items.js';\nimport { parseClusters } from './layout.js';\nimport { parseRow } from './payload.js';\nimport {\n renderSegment,\n type SegmentInput,\n styleSeparators,\n} from './segments.js';\n\nexport interface RenderInput {\n readonly columns?: number;\n readonly home: string;\n readonly layout?: string;\n readonly noColor?: boolean;\n readonly now: number;\n readonly payload: string;\n readonly picks?: Readonly<Record<string, string>>;\n}\n\ntype Mode = 'full' | 'l1' | 'l2';\n\nconst RUNG_ITEMS = Object.keys(RUNG_ORDERS);\n\nexport function stripSgr(text: string): string {\n // eslint-disable-next-line no-control-regex\n return text.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n// The bash vlen counts bytes minus UTF-8 continuation bytes — one per\n// codepoint — then adds one more per ⚡, which renders two cells wide.\nexport function vlen(text: string): number {\n const plain = stripSgr(text);\n let n = Array.from(plain).length;\n for (const ch of plain) {\n if (ch === '⚡') {\n n += 1;\n }\n }\n return n;\n}\n\nexport function warn(message: string): void {\n process.stderr.write(`${message}\\n`);\n}\n\n// The `[...]` suffix a fit step strips from the model name — shared by both\n// engines so the two ports keep the same cut.\nexport function stripModelSuffix(name: string): string {\n const at = name.lastIndexOf('[');\n const cut = at === -1 ? name : name.slice(0, at);\n return cut.endsWith(' ') ? cut.slice(0, -1) : cut;\n}\n\nfunction resolvePicks(\n picks: Readonly<Record<string, string>> | undefined,\n): Record<string, string> {\n const resolved: Record<string, string> = {};\n for (const spec of ITEMS) {\n const pick = picks?.[spec.item] ?? spec.default;\n if (spec.alternatives.includes(pick)) {\n resolved[spec.item] = pick;\n } else {\n warn(\n `statusline: ${spec.item}=${pick} is not available, using ${spec.item}=${spec.default}`,\n );\n resolved[spec.item] = spec.default;\n }\n }\n return resolved;\n}\n\n// The writer's grammar parser, degraded for paint: malformed grammar renders\n// nothing (configure never writes one), unknown item names warn and skip.\nfunction parseLayout(\n layout: string,\n known: ReadonlySet<string>,\n): readonly (readonly string[])[] {\n let parsed: readonly string[][];\n try {\n parsed = parseClusters(layout);\n } catch (e) {\n warn(`statusline: ${(e as Error).message}`);\n return [];\n }\n const clusters: (readonly string[])[] = [];\n for (const words of parsed) {\n const kept = words.filter(word => {\n if (known.has(word)) {\n return true;\n }\n warn(`statusline: layout item '${word}' is not available, skipped`);\n return false;\n });\n if (kept.length > 0) {\n clusters.push(kept);\n }\n }\n return clusters;\n}\n\nexport function renderStatusline(input: RenderInput): string {\n const row = parseRow(input.payload);\n const git = readGit(row.dir, { home: input.home });\n const picks = resolvePicks(input.picks);\n const { join, sep } = styleSeparators(picks.style);\n const clusters = parseLayout(\n input.layout ?? DEFAULT_LAYOUT,\n new Set(ITEMS.map(spec => spec.item)),\n );\n const wrapAt = clusters.length > 2 ? 2 : 1;\n\n let width = input.columns;\n if (width === undefined || !Number.isInteger(width) || width < 0) {\n width = 200;\n }\n if (width < 20) {\n width = 20;\n }\n const avail = width - 3;\n\n let model = row.model;\n const initialRungs = RUNG_ITEMS.map(item => [item, picks[item]] as const);\n\n function segmentInput(): SegmentInput {\n return { git, home: input.home, model, now: input.now, row };\n }\n\n function compose(mode: Mode): string {\n const from = mode === 'l2' ? wrapAt : 0;\n const to = mode === 'l1' ? wrapAt : clusters.length;\n let line = '';\n let first = true;\n for (let ci = from; ci < to; ci++) {\n let cseg = '';\n let cf = true;\n for (const item of clusters[ci]) {\n const out = renderSegment(item, picks[item], segmentInput());\n if (out === '') {\n continue;\n }\n if (cf) {\n cseg = out;\n cf = false;\n } else {\n cseg += join + out;\n }\n }\n if (cseg === '') {\n continue;\n }\n if (first) {\n line = cseg;\n first = false;\n } else {\n line += sep + cseg;\n }\n }\n return line;\n }\n\n function fits(line: string): boolean {\n return vlen(line) <= avail;\n }\n\n function demote(item: string, target: string): void {\n const order = RUNG_ORDERS[item];\n if (order === undefined) {\n return;\n }\n const at = order.indexOf(picks[item]);\n if (at === -1) {\n return;\n }\n if (order.slice(at + 1).includes(target)) {\n picks[item] = target;\n }\n }\n\n function resetRungs(): void {\n model = row.model;\n for (const [item, pick] of initialRungs) {\n picks[item] = pick;\n }\n }\n\n function applyStep(step: FitStep): void {\n if (step[0] === 'model' && step[1] === 'strip') {\n model = stripModelSuffix(model);\n } else {\n demote(step[0], step[1]);\n }\n }\n\n function fit(mode: Mode, steps: readonly FitStep[]): string {\n let out = compose(mode);\n if (fits(out)) {\n return out;\n }\n for (const step of steps) {\n applyStep(step);\n out = compose(mode);\n if (fits(out)) {\n return out;\n }\n }\n return out;\n }\n\n function emit(line: string): string {\n const text = input.noColor === true ? stripSgr(line) : line;\n return `${text}\\n`;\n }\n\n const full = fit('full', FULL_STEPS);\n if (fits(full)) {\n return emit(full);\n }\n resetRungs();\n const l1 = fit('l1', L1_STEPS);\n const l2 = fit('l2', L2_STEPS);\n return emit(l1) + emit(l2);\n}\n","import { fmtDuration, fmtK, fmtM } from './awk.js';\nimport { stripModelSuffix, stripSgr, warn } from './engine.js';\nimport { specFor } from './items.js';\nimport { isRecord, jqText, orElse, tsvEscape } from './jq.js';\nimport { styleSeparators } from './segments.js';\n\n// The agent panel, ported exact from the bash subagent renderer it replaced —\n// a second renderer by ruling: its vlen counts codepoints (jq `length`), not\n// the main engine's bytes, and its fit ladder is its own. Never unify them.\n\nconst CYAN = '\\x1b[36m';\nconst GREEN = '\\x1b[32m';\nconst RED = '\\x1b[31m';\nconst RESET = '\\x1b[0m';\nconst YELLOW = '\\x1b[33m';\n\nconst MS_THRESHOLD = 200_000_000_000;\n\nexport interface PanelInput {\n readonly noColor?: boolean;\n readonly now: number;\n readonly payload: string;\n readonly picks?: Readonly<Record<string, string>>;\n}\n\ninterface TaskFields {\n readonly ctx: string;\n readonly desc: string;\n readonly effort: string;\n readonly id: string;\n readonly label: string;\n readonly model: string;\n readonly name: string;\n readonly start: string;\n readonly tokens: string;\n}\n\ninterface RowFormats {\n readonly ctx: string;\n readonly dur: string;\n readonly tickTok: string;\n readonly tokens: string;\n}\n\ninterface FitState {\n barb: number;\n descd: number;\n durd: number;\n modeld: number;\n statd: number;\n}\n\nconst STEPS: readonly (readonly [keyof FitState, number])[] = [\n ['descd', 1],\n ['durd', 1],\n ['statd', 1],\n ['barb', 6],\n ['modeld', 1],\n ['barb', 4],\n ['barb', 0],\n ['modeld', 2],\n ['statd', 2],\n];\n\nfunction field(\n source: Record<string, unknown>,\n key: string,\n fallback: unknown,\n): unknown {\n return orElse(source[key], fallback);\n}\n\nfunction cell(value: unknown): string {\n return tsvEscape(jqText(value));\n}\n\n// jq's truncation: a description longer than 24 codepoints keeps its first 23\n// plus an ellipsis.\nfunction truncateDesc(desc: string): string {\n const chars = Array.from(desc);\n return chars.length > 24 ? `${chars.slice(0, 23).join('')}…` : desc;\n}\n\nfunction intValue(text: string): null | number {\n return /^-?\\d+$/.test(text) ? Number(text) : null;\n}\n\nfunction stylePick(\n picks: Readonly<Record<string, string>> | undefined,\n): string {\n const spec = specFor('style');\n if (spec === undefined) {\n return 'plain';\n }\n const wanted = picks?.style ?? '';\n const alt = wanted === '' ? spec.default : wanted;\n if (!spec.alternatives.includes(alt)) {\n warn(\n `statusline: style=${alt} is not available, using style=${spec.default}`,\n );\n return spec.default;\n }\n return alt;\n}\n\n// Width rides the payload's own columns field: jq's `// 200` default, then\n// the bash string rule (non-digit -> 200), the floor 20, minus one.\nfunction availColumns(tick: unknown): number {\n const value = isRecord(tick) ? field(tick, 'columns', 200) : 200;\n const text = jqText(value);\n const columns = /^\\d+$/.test(text) ? Number(text) : 200;\n return Math.max(columns, 20) - 1;\n}\n\nfunction extractFields(task: Record<string, unknown>): TaskFields {\n return {\n ctx: cell(field(task, 'contextWindowSize', 0)),\n desc: cell(truncateDesc(jqText(field(task, 'description', '')))),\n effort: cell(field(task, 'effort', '')),\n id: cell(field(task, 'id', '')),\n label: cell(field(task, 'label', '')),\n model: cell(field(task, 'model', '')),\n name: cell(field(task, 'name', '')),\n start: cell(field(task, 'startTime', 0)),\n tokens: cell(field(task, 'tokenCount', 0)),\n };\n}\n\nfunction makeBar(pct: number, width: number): string {\n let f = Math.trunc((pct * width) / 100);\n if (f > width) {\n f = width;\n }\n let bar = '';\n for (let i = 0; i < width; i++) {\n bar += i < f ? '█' : '░';\n }\n return bar;\n}\n\n// The startTime heuristic: milliseconds above the threshold become seconds\n// (truncated), and only a start at or before now yields a duration.\nfunction duration(startText: string, now: number): string {\n const start = intValue(startText);\n if (start === null || start <= 0) {\n return '';\n }\n const seconds = start > MS_THRESHOLD ? Math.trunc(start / 1000) : start;\n const elapsed = Math.trunc(now) - seconds;\n if (elapsed < 0) {\n return '';\n }\n return fmtDuration(Math.trunc(elapsed / 60));\n}\n\nfunction rowFormats(fields: TaskFields, now: number): RowFormats {\n const tokens = intValue(fields.tokens) ?? 0;\n const ctx = intValue(fields.ctx) ?? 0;\n let ctxText = fields.ctx;\n if (ctx >= 1_000_000) {\n ctxText = fmtM(ctx);\n } else if (ctx >= 1000) {\n ctxText = fmtK(ctx, 0);\n }\n return {\n ctx: ctxText,\n dur: duration(fields.start, now),\n tickTok: tokens >= 1000 ? fmtK(tokens, 0) : String(tokens),\n tokens: tokens >= 1000 ? fmtK(tokens, 1) : String(tokens),\n };\n}\n\nfunction renderRow(\n fields: TaskFields,\n formats: RowFormats,\n state: FitState,\n sep: string,\n): string {\n let s = fields.label === '' ? fields.name : fields.label;\n if (fields.desc !== '' && fields.desc !== fields.label && state.descd === 0) {\n s += ` ${fields.desc}`;\n }\n if (fields.model !== '') {\n let name = fields.model;\n if (state.modeld >= 1) {\n name = stripModelSuffix(name);\n }\n const effort = state.modeld >= 2 ? '' : fields.effort;\n if (effort !== '') {\n name += ` ${effort}`;\n }\n s += `${sep}${CYAN}${name}${RESET}`;\n }\n const ctx = intValue(fields.ctx);\n if (ctx !== null && ctx > 0) {\n const tokens = intValue(fields.tokens) ?? 0;\n const pct = Math.trunc((tokens * 100) / ctx);\n const barColor = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;\n if (state.barb > 0) {\n s += `${sep}${barColor}${makeBar(pct, state.barb)}${RESET} ${pct}%`;\n } else {\n s += `${sep}${barColor}${pct}%${RESET}`;\n }\n const stats =\n state.statd === 1\n ? formats.tickTok\n : state.statd === 2\n ? ''\n : `${formats.tokens}/${formats.ctx}`;\n if (stats !== '') {\n s += ` ${stats}`;\n }\n }\n if (formats.dur !== '' && state.durd === 0) {\n s += `${sep}${formats.dur}`;\n }\n return s;\n}\n\n// The panel's own vlen: codepoints of the SGR-stripped row.\nfunction vlen(text: string): number {\n return Array.from(stripSgr(text)).length;\n}\n\nfunction fitRow(\n fields: TaskFields,\n formats: RowFormats,\n sep: string,\n avail: number,\n): string {\n const state: FitState = { barb: 10, descd: 0, durd: 0, modeld: 0, statd: 0 };\n let out = renderRow(fields, formats, state, sep);\n if (vlen(out) <= avail) {\n return out;\n }\n for (const [key, value] of STEPS) {\n state[key] = value;\n out = renderRow(fields, formats, state, sep);\n if (vlen(out) <= avail) {\n return out;\n }\n }\n return out;\n}\n\nfunction emitLine(id: string, content: string): string {\n return `{\"id\":${JSON.stringify(id)},\"content\":${JSON.stringify(content)}}`;\n}\n\nexport function renderPanel(input: PanelInput): string {\n const tick: unknown = JSON.parse(input.payload);\n const avail = availColumns(tick);\n const sep = styleSeparators(stylePick(input.picks)).sep;\n const tasks = isRecord(tick) && Array.isArray(tick.tasks) ? tick.tasks : [];\n let out = '';\n for (const task of tasks) {\n if (!isRecord(task)) {\n continue;\n }\n const fields = extractFields(task);\n if (fields.id === '') {\n continue;\n }\n const formats = rowFormats(fields, input.now);\n const row = fitRow(fields, formats, sep, avail);\n const content = input.noColor === true ? stripSgr(row) : row;\n out += `${emitLine(fields.id, content)}\\n`;\n }\n return out;\n}\n","import { DEFAULT_LAYOUT } from './render/items.js';\n\nexport const THEME_NAMES = [\n 'classic',\n 'custom',\n 'lean',\n 'quiet',\n 'rich',\n] as const;\n\nexport type ThemeName = (typeof THEME_NAMES)[number];\n\nexport interface Theme {\n readonly layout: string;\n readonly summary: string;\n readonly variants: Readonly<Record<string, string>>;\n}\n\n// The record's key order is the listing order catalog and the wizard print.\nexport const THEMES: Readonly<Record<ThemeName, Theme>> = {\n quiet: {\n layout: '{model cwd}',\n summary: 'model and directory, nothing else',\n variants: { cwd: 'tail', model: 'zen', style: 'bare' },\n },\n // The shipped defaults, named: an empty variants record resolves exactly\n // like no theme at all.\n classic: {\n layout: DEFAULT_LAYOUT,\n summary: 'the shipped defaults, named',\n variants: {},\n },\n lean: {\n layout: DEFAULT_LAYOUT,\n summary: 'text only, no graphics',\n variants: {\n model: 'plain',\n effort: 'dim',\n state: 'none',\n cwd: 'init',\n branch: 'initials',\n status: 'counts',\n ahead: 'arrows',\n pr: 'badge',\n bar: 'percent',\n tokens: 'full',\n cache: 'hit',\n cost: 'plain',\n duration: 'clock',\n lines: 'diffstat',\n rate: 'none',\n style: 'dots',\n },\n },\n rich: {\n layout: DEFAULT_LAYOUT,\n summary: 'every gauge and counter',\n variants: {\n model: 'pill',\n effort: 'plain',\n state: 'pills',\n cwd: 'icon',\n branch: 'icon',\n status: 'icons',\n ahead: 'arrows',\n pr: 'badge',\n bar: 'gauge',\n tokens: 'full',\n cache: 'fuse',\n cost: 'burn',\n duration: 'clock',\n lines: 'diffstat',\n rate: 'strip',\n style: 'plain',\n },\n },\n custom: {\n layout: DEFAULT_LAYOUT,\n summary: 'bare; you decide everything',\n variants: {\n model: 'zen',\n effort: 'hidden',\n state: 'none',\n cwd: 'base',\n branch: 'none',\n status: 'none',\n ahead: 'none',\n pr: 'none',\n bar: 'none',\n tokens: 'none',\n cache: 'none',\n cost: 'none',\n duration: 'none',\n lines: 'none',\n rate: 'none',\n style: 'bare',\n },\n },\n};\n","import { type Theme, THEMES } from '../themes.js';\nimport { warn } from './engine.js';\nimport { DEFAULT_LAYOUT } from './items.js';\n\n// One resolver, two doors: the render entry resolves here at paint, and the\n// CLI's catalog/status/wizard import the same function for display — there is\n// no second resolution path. Precedence: item flags beat the theme, --layout\n// beats the theme's layout, no theme leaves the registry defaults.\n\ninterface PaintInput {\n readonly layout?: string;\n readonly picks?: Readonly<Record<string, string>>;\n readonly theme?: string;\n}\n\ninterface PaintSelection {\n readonly layout: string;\n readonly picks: Readonly<Record<string, string>>;\n}\n\nexport function resolvePaint(input: PaintInput): PaintSelection {\n const name = input.theme;\n const theme =\n name === undefined\n ? undefined\n : (THEMES as Readonly<Record<string, Theme | undefined>>)[name];\n if (name !== undefined && theme === undefined) {\n warn(`statusline: theme=${name} is not a known theme, ignored`);\n }\n return {\n layout: input.layout ?? theme?.layout ?? DEFAULT_LAYOUT,\n picks: { ...(theme?.variants ?? {}), ...input.picks },\n };\n}\n","import { parseArgv } from './argv.js';\nimport { capturePayload } from './capture.js';\nimport { renderStatusline } from './engine.js';\nimport { renderPanel } from './panel.js';\nimport { resolvePaint } from './theme.js';\n\n// The render.mjs entry the settings keys spawn: decisions ride argv, ambient\n// state rides env — NO_COLOR, COLUMNS, HOME stay environment because the\n// host shell owns them.\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let payload = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk: string) => {\n payload += chunk;\n });\n process.stdin.on('end', () => {\n resolve(payload);\n });\n process.stdin.on('error', reject);\n });\n}\n\n// The bash string rule on COLUMNS (unset, empty, or non-digit -> the engine's\n// 200) survives the port: Claude Code exports width as a string env var.\nfunction columnsFromEnv(text: string | undefined): number | undefined {\n if (text === undefined || text === '' || !/^\\d+$/.test(text)) {\n return undefined;\n }\n return Number(text);\n}\n\nasync function main(): Promise<void> {\n const argv = parseArgv(process.argv.slice(2));\n for (const warning of argv.warnings) {\n process.stderr.write(`${warning}\\n`);\n }\n const payload = await readStdin();\n const env = process.env;\n const home = env.HOME ?? '';\n const noColor = (env.NO_COLOR ?? '') !== '';\n const now = argv.now ?? Math.floor(Date.now() / 1000);\n const paint = resolvePaint(argv);\n if (argv.mode === 'panel') {\n capturePayload(home, 'tick', payload);\n process.stdout.write(\n renderPanel({ now, payload, picks: paint.picks, noColor }),\n );\n return;\n }\n capturePayload(home, 'main', payload);\n const columns = columnsFromEnv(env.COLUMNS);\n process.stdout.write(\n renderStatusline({\n home,\n now,\n payload,\n picks: paint.picks,\n noColor,\n layout: paint.layout,\n ...(columns === undefined ? {} : { columns }),\n }),\n );\n}\n\nawait main();\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@v1nvn/statusline",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.5",
|
|
4
4
|
"description": "Browse statusline variants and configure the live status line and agent panel — the statusline CLI behind the statusline plugin.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": "dist/index.js",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"node": ">=22"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@v1nvn/agentic-core": "^0.30.
|
|
38
|
+
"@v1nvn/agentic-core": "^0.30.5",
|
|
39
39
|
"commander": "^15.0.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|