@v1nvn/statusline 0.29.0 → 0.30.0

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 CHANGED
@@ -22,7 +22,7 @@ offers the picker in chat, and writes the pick.
22
22
  In a terminal outside Claude Code — the wizard, the terminal guide:
23
23
 
24
24
  ```sh
25
- npx -y @v1nvn/statusline@0.29.0 configure
25
+ npx -y @v1nvn/statusline@0.30.0 configure
26
26
  ```
27
27
 
28
28
  Pass one stacks the five theme bars: `j/k` focus · `w` width · enter picks.
@@ -44,12 +44,12 @@ another home instead of `$HOME`.
44
44
  | `restore` | both keys back to their pre-lab values from `backup.json`, then deletes the lab data — `--dry-run` prints the plan; `--force` splices over a key changed after the takeover |
45
45
 
46
46
  ```sh
47
- npx -y @v1nvn/statusline@0.29.0 preview --theme rich --plain # chat-safe sketch, nothing written
48
- npx -y @v1nvn/statusline@0.29.0 configure --theme rich # the write — live on the next paint
49
- npx -y @v1nvn/statusline@0.29.0 configure --theme rich --bar percent # one swap on top of the theme
50
- npx -y @v1nvn/statusline@0.29.0 catalog --themes
51
- npx -y @v1nvn/statusline@0.29.0 status
52
- npx -y @v1nvn/statusline@0.29.0 restore
47
+ npx -y @v1nvn/statusline@0.30.0 preview --theme rich --plain # chat-safe sketch, nothing written
48
+ npx -y @v1nvn/statusline@0.30.0 configure --theme rich # the write — live on the next paint
49
+ npx -y @v1nvn/statusline@0.30.0 configure --theme rich --bar percent # one swap on top of the theme
50
+ npx -y @v1nvn/statusline@0.30.0 catalog --themes
51
+ npx -y @v1nvn/statusline@0.30.0 status
52
+ npx -y @v1nvn/statusline@0.30.0 restore
53
53
  ```
54
54
 
55
55
  ## Develop
package/dist/index.js CHANGED
@@ -1325,7 +1325,7 @@ function catalog(options) {
1325
1325
  //#region src/cli.ts
1326
1326
  var VERSION = {
1327
1327
  name: "@v1nvn/statusline",
1328
- version: "0.29.0",
1328
+ version: "0.30.0",
1329
1329
  description: "Browse statusline variants and configure the live status line and agent panel — the statusline CLI behind the statusline plugin.",
1330
1330
  type: "module",
1331
1331
  bin: "dist/index.js",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../core/dist/index.js","../src/render/git.ts","../src/render/items.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/themes.ts","../src/render/theme.ts","../src/render/capture.ts","../src/resolve.ts","../src/catalog.ts","../package.json","../src/cli.ts","../src/configure.ts","../src/demo-repo.ts","../src/render/panel.ts","../src/payloads.ts","../src/preview.ts","../src/restore.ts","../src/status.ts","../src/wizard-tui.ts","../src/wizard.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n//#region src/input.ts\nfunction readAll(stream) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet data = \"\";\n\t\tstream.setEncoding(\"utf8\");\n\t\tstream.on(\"data\", (chunk) => {\n\t\t\tdata += chunk;\n\t\t});\n\t\tstream.on(\"end\", () => {\n\t\t\tresolve(data);\n\t\t});\n\t\tstream.on(\"error\", reject);\n\t});\n}\nfunction readStdin(stream = process.stdin) {\n\treturn readAll(stream);\n}\n/** A markdown file's contents, with the CLI's no-such-file error. */\nfunction readMarkdownFile(path) {\n\tif (!statSync(path, { throwIfNoEntry: false })?.isFile()) throw new Error(`no such file: ${path}`);\n\treturn readFileSync(path, \"utf8\");\n}\n//#endregion\n//#region src/hook.ts\n/**\n* Read the Claude Code hook event JSON from stdin; empty or unparseable input\n* yields an empty event, never a thrown error — a hook must always answer.\n*/\nfunction readHookEvent(stream = process.stdin) {\n\treturn readAll(stream).then((data) => {\n\t\ttry {\n\t\t\treturn JSON.parse(data);\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}, () => ({}));\n}\n/**\n* Which transcript lastReply should read, per the hook event: transcript_path\n* when it names a real file, else session_id, else nothing (lastReply then\n* falls back to the newest session for the current project).\n*/\nfunction replyTarget(event) {\n\tif (event.transcript_path !== void 0 && isFile(event.transcript_path)) return event.transcript_path;\n\treturn event.session_id || void 0;\n}\nfunction isFile(path) {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n/**\n* Print the UserPromptExpansion decision for a zero-token command: `block`\n* keeps the command from reaching the model, with the output as the `reason`.\n*/\nfunction emitHookBlock(reason) {\n\tprocess.stdout.write(`${JSON.stringify({\n\t\tdecision: \"block\",\n\t\treason\n\t})}\\n`);\n}\n//#endregion\n//#region src/cli.ts\nfunction parseQuietly(program, args, recover) {\n\ttry {\n\t\tprogram.allowExcessArguments(false).exitOverride().configureOutput({\n\t\t\twriteOut: () => void 0,\n\t\t\twriteErr: () => void 0\n\t\t}).parse([...args], { from: \"user\" });\n\t\treturn program;\n\t} catch (err) {\n\t\treturn recover?.(err);\n\t}\n}\nfunction printUsageAndExit(program) {\n\tconsole.error(program.helpInformation());\n\tprocess.exit(1);\n}\nasync function hookOrPrint(hook, failure, run, stdin = process.stdin) {\n\tif (hook) {\n\t\tlet reason;\n\t\ttry {\n\t\t\treason = await run(await readHookEvent(stdin));\n\t\t} catch (e) {\n\t\t\treason = `${failure}: ${e.message}`;\n\t\t}\n\t\temitHookBlock(reason);\n\t\treturn;\n\t}\n\ttry {\n\t\tconsole.log(await run(void 0));\n\t} catch (e) {\n\t\tconsole.error(e.message);\n\t\tprocess.exit(1);\n\t}\n}\n//#endregion\n//#region src/dev.ts\nvar RELOAD_DEBOUNCE_MS = 150;\nvar IGNORED_SEGMENTS = [\n\t\"/node_modules/\",\n\t\"/dist/\",\n\t\"/.git/\",\n\t\"/coverage/\"\n];\nfunction shouldReload(file) {\n\treturn IGNORED_SEGMENTS.every((seg) => !file.includes(seg));\n}\n/**\n* Debounced file-change reloads, serialized via a promise chain: concurrent\n* saves never overlap, and a mid-reload save still produces a follow-up.\n*/\nfunction watchWithReload(vite, reload) {\n\tlet chain = Promise.resolve();\n\tlet timer;\n\tvite.watcher.on(\"change\", (file) => {\n\t\tif (!shouldReload(file)) return;\n\t\tif (timer) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = void 0;\n\t\t\tchain = chain.then(reload);\n\t\t}, RELOAD_DEBOUNCE_MS);\n\t});\n}\n//#endregion\n//#region src/last-reply.ts\nfunction textBlocks(entry) {\n\tconst content = entry.message?.content;\n\tif (entry.type !== \"assistant\" || !Array.isArray(content)) return;\n\tconst blocks = content.filter((b) => typeof b === \"object\" && b !== null && b.type === \"text\");\n\treturn blocks.length > 0 ? blocks : void 0;\n}\nfunction claudeProjectsDir() {\n\tconst claudeDir = process.env.CLAUDE_DIR ?? join(homedir(), \".claude\");\n\treturn join(claudeDir, \"projects\");\n}\n/**\n* The last assistant text reply from a Claude Code session, reproducing Claude\n* Code's `/copy` byte-for-byte: the last assistant entry that contains a\n* `text` block, only its `text` block(s) (tool_use / thinking dropped), blocks\n* joined with a blank line, and no trailing newline.\n*\n* @param arg a transcript file, a session UUID under the project dir, or\n* nothing to use the newest session for the current project.\n*/\nfunction lastReply(arg) {\n\tconst proj = (process.env.CLAUDE_PROJECT_DIR ?? process.cwd()).replaceAll(\"/\", \"-\");\n\tconst projDir = join(claudeProjectsDir(), proj);\n\tlet file;\n\tif (arg !== void 0) file = isFile(arg) ? arg : join(projDir, `${arg}.jsonl`);\n\telse if (existsSync(projDir)) {\n\t\tconst newest = readdirSync(projDir).filter((f) => f.endsWith(\".jsonl\")).map((f) => ({\n\t\t\tf,\n\t\t\tmtimeMs: statSync(join(projDir, f)).mtimeMs\n\t\t})).sort((a, b) => b.mtimeMs - a.mtimeMs).at(0);\n\t\tif (newest) file = join(projDir, newest.f);\n\t}\n\tif (file === void 0 || !isFile(file)) throw new Error(`no session transcript found in ${projDir}`);\n\tlet last;\n\tfor (const line of readFileSync(file, \"utf8\").split(\"\\n\")) {\n\t\tif (!line.includes(\"\\\"assistant\\\"\")) continue;\n\t\tlet entry;\n\t\ttry {\n\t\t\tentry = JSON.parse(line);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tconst blocks = textBlocks(entry);\n\t\tif (blocks) last = blocks;\n\t}\n\treturn (last ?? []).map((b) => b.text ?? \"\").join(\"\\n\\n\");\n}\n//#endregion\n//#region src/logger.ts\nvar LEVEL_RANK = {\n\tdebug: 10,\n\tinfo: 20,\n\twarn: 30,\n\terror: 40,\n\tsilent: Number.MAX_SAFE_INTEGER\n};\nfunction levelEnabled(active, wanted) {\n\treturn LEVEL_RANK[wanted] >= LEVEL_RANK[active];\n}\nvar LEVEL_LABEL = {\n\tdebug: \"DEBUG\",\n\terror: \"ERROR\",\n\tinfo: \"INFO\",\n\twarn: \"WARN\"\n};\nvar Logger = class {\n\tactiveLevel;\n\tstderr;\n\tconstructor(activeLevel, stderr = (line) => process.stderr.write(`${line}\\n`)) {\n\t\tthis.activeLevel = activeLevel;\n\t\tthis.stderr = stderr;\n\t}\n\tdebug(message) {\n\t\tthis.log(\"debug\", message);\n\t}\n\terror(message) {\n\t\tthis.log(\"error\", message);\n\t}\n\tinfo(message) {\n\t\tthis.log(\"info\", message);\n\t}\n\twarn(message) {\n\t\tthis.log(\"warn\", message);\n\t}\n\tlog(level, message) {\n\t\tif (levelEnabled(this.activeLevel, level)) this.stderr(`${LEVEL_LABEL[level]} ${message}`);\n\t}\n};\n//#endregion\n//#region src/shutdown.ts\n/** Close each closable in order (best-effort), then force-exit. */\nfunction shutdownOnSignals(closables, signals = [\"SIGINT\", \"SIGTERM\"]) {\n\tfunction shutdown() {\n\t\tclosables.reduce((acc, closable) => acc.then(async () => {\n\t\t\ttry {\n\t\t\t\tawait closable.close();\n\t\t\t} catch {}\n\t\t}), Promise.resolve()).finally(() => {\n\t\t\tprocess.exit(0);\n\t\t});\n\t}\n\tfor (const signal of signals) process.on(signal, shutdown);\n}\n//#endregion\n//#region src/text-format.ts\n/**\n* Plain-text rendering primitives shared by the zai and tokens report\n* renderers. Output targets a monospace terminal / hook-block `reason`, so\n* everything here is fixed-width: padding, block-glyph bars, and compact\n* number formatting.\n*/\nvar MONTHS = [\n\t\"Jan\",\n\t\"Feb\",\n\t\"Mar\",\n\t\"Apr\",\n\t\"May\",\n\t\"Jun\",\n\t\"Jul\",\n\t\"Aug\",\n\t\"Sep\",\n\t\"Oct\",\n\t\"Nov\",\n\t\"Dec\"\n];\nvar EIGHTHS = [\n\t\"\",\n\t\"▏\",\n\t\"▎\",\n\t\"▍\",\n\t\"▌\",\n\t\"▋\",\n\t\"▊\",\n\t\"▉\"\n];\nvar RULE_WIDTH = 68;\nfunction rule() {\n\treturn \"─\".repeat(68);\n}\nfunction pad2(n) {\n\treturn String(n).padStart(2, \"0\");\n}\n/** Local-time `YYYY-MM-DD` key. */\nfunction ymd(date) {\n\treturn `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;\n}\nfunction fmtTokens(n) {\n\tif (n == null || Number.isNaN(n)) return \"—\";\n\tif (n >= 1e9) return (n / 1e9).toFixed(1) + \"B\";\n\tif (n >= 1e6) return (n / 1e6).toFixed(1) + \"M\";\n\tif (n >= 1e3) return (n / 1e3).toFixed(1) + \"K\";\n\treturn String(n);\n}\nfunction fmtNum(n) {\n\treturn (n || 0).toLocaleString(\"en-US\");\n}\nfunction padR(s, n) {\n\treturn s.length >= n ? s : s + \" \".repeat(n - s.length);\n}\nfunction padL(s, n) {\n\treturn s.length >= n ? s : \" \".repeat(n - s.length) + s;\n}\n/** Fixed-width bar field (width cols): █ blocks + an eighth-fraction + trailing spaces. */\nfunction barField(v, max, width) {\n\tif (!v || v <= 0 || max <= 0) return \" \".repeat(width);\n\tconst scaled = v / max * width;\n\tlet full = Math.floor(scaled);\n\tlet fi = Math.round((scaled - full) * 8);\n\tif (fi === 8) {\n\t\tfull += 1;\n\t\tfi = 0;\n\t}\n\tif (full === 0 && fi === 0) fi = 1;\n\tlet s = \"█\".repeat(Math.min(full, width));\n\tif (full < width && fi > 0) s += EIGHTHS[fi];\n\tif (s.length < width) s += \" \".repeat(width - s.length);\n\treturn s.slice(0, width);\n}\n/** Filled/empty meter: █ for used, ░ for remaining. */\nfunction meter(pct, width) {\n\tlet filled = Math.round((pct || 0) / 100 * width);\n\tfilled = Math.max(0, Math.min(width, filled));\n\treturn \"█\".repeat(filled) + \"░\".repeat(width - filled);\n}\n//#endregion\nexport { Logger, MONTHS, RULE_WIDTH, barField, claudeProjectsDir, emitHookBlock, fmtNum, fmtTokens, hookOrPrint, isFile, lastReply, levelEnabled, meter, pad2, padL, padR, parseQuietly, printUsageAndExit, readAll, readHookEvent, readMarkdownFile, readStdin, replyTarget, rule, shutdownOnSignals, watchWithReload, ymd };\n\n//# sourceMappingURL=index.js.map","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","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","// 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 { 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 { 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 { readFileSync } from 'node:fs';\nimport { join, sep } from 'node:path';\n\nimport { DATA_DIR } from './render/capture.js';\n\nexport function capturePath(home: string, surface: 'main' | 'tick'): string {\n return join(home, DATA_DIR, 'captures', `${surface}.json`);\n}\n\nexport function backupPath(home: string): string {\n return join(home, DATA_DIR, 'backup.json');\n}\n\nexport function renderMjsPath(home: string): string {\n return join(home, DATA_DIR, 'render.mjs');\n}\n\nexport interface ScriptConfig {\n readonly layout: null | string;\n readonly theme?: string;\n readonly values: Readonly<Record<string, string>>;\n}\n\n// The program the settings keys spawn: plain node on the data-dir renderer the\n// CLI syncs, `$HOME` expanded by the host shell. Flags may follow in any\n// order — the assignments-hug-the-command rule died with the env wall.\nconst RENDER_PROGRAM = `node \"$HOME/${DATA_DIR.split(sep).join('/')}/render.mjs\"`;\nconst PANEL_PROGRAM = `${RENDER_PROGRAM} panel`;\nconst KEY_SUFFIX = ' || true';\n\n// The one spelling of a settings key: program, --theme, a quoted --layout,\n// the differing flags, the swallow-everything suffix.\nfunction keyValue(\n program: string,\n theme: null | string,\n layout: null | string,\n flags: readonly string[],\n): string {\n return `${[\n program,\n ...(theme === null ? [] : [`--theme=${theme}`]),\n ...(layout === null ? [] : [`--layout='${layout}'`]),\n ...flags,\n ].join(' ')}${KEY_SUFFIX}`;\n}\n\nexport function mainKeyValue(\n theme: null | string,\n layout: null | string,\n flags: readonly string[],\n): string {\n return keyValue(RENDER_PROGRAM, theme, layout, flags);\n}\n\nexport function panelKeyValue(\n theme: null | string,\n flags: readonly string[],\n): string {\n return keyValue(PANEL_PROGRAM, theme, null, flags);\n}\n\n// The flags span between program and suffix — null unless the command is\n// ours-shaped (nothing after the program but flags).\nfunction commandMiddle(program: string, command: string): null | string {\n if (!command.startsWith(program) || !command.endsWith(KEY_SUFFIX)) {\n return null;\n }\n const middle = command.slice(\n program.length,\n command.length - KEY_SUFFIX.length,\n );\n return middle === '' || middle.startsWith(' --') ? middle : null;\n}\n\nexport function isOurMainCommand(command: string): boolean {\n return commandMiddle(RENDER_PROGRAM, command) !== null;\n}\n\nexport function isOurPanelCommand(command: string): boolean {\n return commandMiddle(PANEL_PROGRAM, command) !== null;\n}\n\nconst NO_DECISIONS: ScriptConfig = { layout: null, values: {} };\n\nfunction settingsCommand(home: string): null | string {\n let raw: string;\n try {\n raw = readFileSync(join(home, '.claude', 'settings.json'), 'utf8');\n } catch {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n const member = (parsed as null | { statusLine?: unknown })?.statusLine;\n if (typeof member !== 'object' || member === null) {\n return null;\n }\n const command = (member as { command?: unknown }).command;\n return typeof command === 'string' ? command : null;\n}\n\n// The flags a settings key carries parsed back into the decisions it\n// records: --theme as the name, --<item>=<alt> as values, a quoted --layout.\n// A null layout means no explicit --layout — a theme key leaves the layout\n// to the theme. Unknown item names survive to surface as drift.\nfunction parseKeyFlags(flags: string): ScriptConfig {\n const values: Record<string, string> = {};\n let theme: string | undefined;\n for (const [, name, alt] of flags.matchAll(\n /(?:^| )--([a-z][a-z0-9]*)=([a-z0-9]+)/g,\n )) {\n if (name === 'theme') {\n theme = alt;\n } else if (name !== 'now' && name !== 'layout') {\n values[name] = alt;\n }\n }\n const layout = /--layout='([^']*)'/.exec(flags);\n return {\n layout: layout === null ? null : layout[1],\n values,\n ...(theme === undefined ? {} : { theme }),\n };\n}\n\n// The main key's decisions. A missing settings member or a foreign key reads\n// the same way, with no theme and no values.\nexport function readKeyConfig(home: string): ScriptConfig {\n const command = settingsCommand(home);\n const flags =\n command === null ? null : commandMiddle(RENDER_PROGRAM, command);\n return flags === null ? NO_DECISIONS : parseKeyFlags(flags);\n}\n\n// The panel key's decisions — the theme it carries, a style pick when one\n// rides. An absent or foreign member reads as no decisions.\nexport function parsePanelCommand(command: null | string): ScriptConfig {\n const flags = command === null ? null : commandMiddle(PANEL_PROGRAM, command);\n return flags === null ? NO_DECISIONS : parseKeyFlags(flags);\n}\n","import { ITEM_IDS, specFor } from './render/index.js';\nimport { resolvePaint } from './render/theme.js';\nimport { readKeyConfig } from './resolve.js';\nimport { THEMES } from './themes.js';\n\nexport interface CatalogOptions {\n readonly home: string;\n readonly items?: readonly string[];\n readonly themes?: boolean;\n}\n\nexport function catalog(options: CatalogOptions): string {\n if (options.themes === true && options.items !== undefined) {\n throw new Error('--themes cannot combine with item flags');\n }\n const key = readKeyConfig(options.home);\n const block = Object.entries(THEMES).map(\n ([name, theme]) =>\n `${name}${key.theme === name ? '*' : ''}: ${theme.summary}`,\n );\n if (options.themes === true) {\n return block.join('\\n');\n }\n const resolved = resolvePaint({\n layout: key.layout ?? undefined,\n picks: key.values,\n theme: key.theme,\n });\n const wanted = options.items ?? ITEM_IDS;\n const itemLines = wanted.map(item => {\n const entry = specFor(item);\n if (entry === undefined) {\n throw new Error(\n `unknown item '${item}' — valid items: ${ITEM_IDS.join(' ')}`,\n );\n }\n const current = resolved.picks[item] ?? entry.default;\n return `${item}: ${entry.alternatives\n .map(alt => (alt === current ? `${alt}*` : alt))\n .join(' | ')}`;\n });\n return [...block, '', ...itemLines].join('\\n');\n}\n","{\n \"name\": \"@v1nvn/statusline\",\n \"version\": \"0.29.0\",\n \"description\": \"Browse statusline variants and configure the live status line and agent panel — the statusline CLI behind the statusline plugin.\",\n \"type\": \"module\",\n \"bin\": \"dist/index.js\",\n \"scripts\": {\n \"build\": \"vite build && vite build --mode render\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"keywords\": [\n \"claude-code\",\n \"statusline\",\n \"cli\"\n ],\n \"author\": {\n \"name\": \"v1nvn\",\n \"email\": \"v1n@outlook.com\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/v1nvn/agentic.git\",\n \"directory\": \"packages/statusline\"\n },\n \"files\": [\n \"dist\",\n \"assets\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"dependencies\": {\n \"@v1nvn/agentic-core\": \"workspace:^\",\n \"commander\": \"^15.0.0\"\n },\n \"devDependencies\": {\n \"vite\": \"^8.1.4\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","import { parseQuietly } from '@v1nvn/agentic-core';\nimport { Command } from 'commander';\n\nimport pkg from '../package.json' with { type: 'json' };\nimport { ITEM_IDS } from './render/items.js';\n\nexport const VERSION = pkg.version;\n\n// The flag surface is the render registry's item ids — one registry, shared\n// with the data-dir renderer.\n\nexport type Subcommand =\n 'catalog' | 'configure' | 'preview' | 'restore' | 'status';\n\nexport interface ParsedArgs {\n readonly command?: Subcommand;\n readonly dryRun?: boolean;\n readonly force?: boolean;\n readonly help?: Subcommand;\n readonly home?: string;\n readonly items?: readonly string[];\n readonly layout?: string;\n readonly plain?: boolean;\n readonly theme?: string;\n readonly themes?: boolean;\n readonly variants?: Readonly<Record<string, string>>;\n readonly version: boolean;\n}\n\ntype SubcommandOptions = Record<string, unknown>;\n\nconst QUIET = { writeOut: () => undefined, writeErr: () => undefined };\n\nclass HelpRequested extends Error {\n constructor(readonly command: Subcommand) {\n super(`${command} --help`);\n }\n}\n\nfunction quiet(name: Subcommand, command: Command): Command {\n return command\n .exitOverride(err => {\n const code = (err as { code?: string }).code;\n if (code === 'commander.help' || code === 'commander.helpDisplayed') {\n throw new HelpRequested(name);\n }\n throw err;\n })\n .configureOutput(QUIET)\n .allowExcessArguments(false);\n}\n\nexport function buildProgram(\n onSubcommand?: (command: Subcommand, options: SubcommandOptions) => void,\n): Command {\n const catalog = quiet('catalog', new Command('catalog'))\n .description(\n 'print the themes block (* marks the live theme) then one line per item — * marks the live variant',\n )\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--themes', 'cut the listing to the themes block');\n for (const item of ITEM_IDS) {\n catalog.option(`--${item}`, `cut the listing to the ${item} item`);\n }\n catalog.action((options: SubcommandOptions) =>\n onSubcommand?.('catalog', options),\n );\n\n const LAYOUT_HELP =\n \"brace clusters of item ids, e.g. '{cwd branch} {model effort}'\";\n const THEME_HELP =\n 'base design the item flags override: quiet, lean, classic, rich, custom';\n\n const configure = quiet('configure', new Command('configure'))\n .description('write both settings keys with the inline lab commands')\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--layout <spec>', LAYOUT_HELP)\n .option('--theme <name>', THEME_HELP)\n .option('--force', 'take over foreign settings keys');\n for (const item of ITEM_IDS) {\n configure.option(`--${item} <alt>`, `variant for the ${item} item`);\n }\n configure.action((options: SubcommandOptions) =>\n onSubcommand?.('configure', options),\n );\n\n const preview = quiet('preview', new Command('preview'))\n .description('render a candidate line and panel row; nothing is written')\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--layout <spec>', LAYOUT_HELP)\n .option('--theme <name>', THEME_HELP)\n .option('--plain', 'strip the color escapes so glyphs survive chat');\n for (const item of ITEM_IDS) {\n preview.option(`--${item} <alt>`, `variant for the ${item} item`);\n }\n preview.action((options: SubcommandOptions) =>\n onSubcommand?.('preview', options),\n );\n\n const restore = quiet('restore', new Command('restore'))\n .description(\n 'revert both settings keys to their pre-lab values, clean the data dir',\n )\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--dry-run', 'print the plan, write nothing')\n .option(\n '--force',\n 'splice the saved value over a key changed after the takeover',\n );\n restore.action((options: SubcommandOptions) =>\n onSubcommand?.('restore', options),\n );\n\n const status = quiet('status', new Command('status'))\n .description(\n 'check install, keys, config, and backup — exit 0 healthy, 1 when a row needs action',\n )\n .option('--home <dir>', 'operate on this home instead of $HOME');\n status.action((options: SubcommandOptions) =>\n onSubcommand?.('status', options),\n );\n\n return new Command()\n .name('statusline')\n .description('Configure the status line and agent panel designs')\n .option('-V, --version', 'print the version and exit')\n .action(() => undefined)\n .addCommand(catalog)\n .addCommand(configure)\n .addCommand(preview)\n .addCommand(restore)\n .addCommand(status);\n}\n\nexport function subcommandHelp(name: Subcommand): string {\n const command = buildProgram().commands.find(c => c.name() === name);\n if (command === undefined) {\n throw new Error(`no '${name}' command to describe`);\n }\n return command.helpInformation();\n}\n\nexport function parseArgs(args: readonly string[]): ParsedArgs | undefined {\n let chosen:\n | undefined\n | { readonly command: Subcommand; readonly options: SubcommandOptions };\n const program = buildProgram((command, options) => {\n chosen = { command, options };\n });\n const parsed = parseQuietly(program, args, err =>\n err instanceof HelpRequested ? { help: err.command } : undefined,\n );\n if (parsed === undefined) {\n return undefined;\n }\n if (!(parsed instanceof Command)) {\n return { version: false, help: parsed.help };\n }\n const { version } = program.opts<{ version: boolean | undefined }>();\n if (version) {\n return { version: true };\n }\n if (chosen === undefined) {\n return undefined;\n }\n const options = chosen.options;\n if (chosen.command === 'catalog') {\n const items = ITEM_IDS.filter(item => options[item] === true);\n return {\n version: false,\n command: 'catalog',\n ...(items.length > 0 ? { items } : {}),\n ...(typeof options.themes === 'boolean'\n ? { themes: options.themes }\n : {}),\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n };\n }\n if (chosen.command === 'restore') {\n return {\n version: false,\n command: 'restore',\n ...(typeof options.dryRun === 'boolean'\n ? { dryRun: options.dryRun }\n : {}),\n ...(typeof options.force === 'boolean' ? { force: options.force } : {}),\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n };\n }\n if (chosen.command === 'status') {\n return {\n version: false,\n command: 'status',\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n };\n }\n const variants: Record<string, string> = {};\n for (const item of ITEM_IDS) {\n if (typeof options[item] === 'string') {\n variants[item] = options[item];\n }\n }\n const common = {\n version: false as const,\n command: chosen.command,\n ...(Object.keys(variants).length > 0 ? { variants } : {}),\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n ...(typeof options.layout === 'string' ? { layout: options.layout } : {}),\n ...(typeof options.theme === 'string' ? { theme: options.theme } : {}),\n };\n return chosen.command === 'configure'\n ? {\n ...common,\n ...(typeof options.force === 'boolean' ? { force: options.force } : {}),\n }\n : {\n ...common,\n ...(typeof options.plain === 'boolean' ? { plain: options.plain } : {}),\n };\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport {\n DEFAULT_LAYOUT,\n DEFAULT_PICKS,\n ITEM_IDS,\n ITEMS,\n specFor,\n} from './render/index.js';\nimport { layoutItems } from './render/layout.js';\nimport {\n backupPath,\n isOurMainCommand,\n isOurPanelCommand,\n mainKeyValue,\n panelKeyValue,\n renderMjsPath,\n} from './resolve.js';\nimport { type Theme, THEME_NAMES, type ThemeName, THEMES } from './themes.js';\n\nexport interface ConfigureOptions {\n readonly force?: boolean;\n readonly home: string;\n readonly layout?: string;\n readonly theme?: string;\n readonly variants?: Readonly<Record<string, string>>;\n}\n\n// The renderer the settings keys spawn, as vite emits it beside the CLI bundle.\n// ../dist resolves to the package's dist/ from both src/ (tests) and the\n// bundled dist/index.js — both sit one level below dist/.\nexport const BUNDLED_RENDERER = fileURLToPath(\n new URL('../dist/render.mjs', import.meta.url),\n);\n\nexport function syncRenderer(home: string): void {\n const source = readFileSync(BUNDLED_RENDERER);\n const dest = renderMjsPath(home);\n if (existsSync(dest) && readFileSync(dest).equals(source)) {\n return;\n }\n mkdirSync(dirname(dest), { recursive: true });\n const tmp = `${dest}.tmp`;\n writeFileSync(tmp, source);\n renameSync(tmp, dest);\n}\n\nexport type SettingsKey = 'statusLine' | 'subagentStatusLine';\n\nexport const SETTINGS_KEYS = ['statusLine', 'subagentStatusLine'] as const;\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function readOrNull(file: string): null | string {\n try {\n return readFileSync(file, 'utf8');\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n}\n\nexport function parseSettings(\n file: string,\n raw: string,\n): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n throw new Error(`${file} is not valid JSON`, { cause: e });\n }\n if (!isObject(parsed)) {\n throw new Error(`${file} does not hold a settings object`);\n }\n return parsed;\n}\n\nexport function memberCommand(value: unknown): null | string {\n if (!isObject(value) || value.type !== 'command') {\n return null;\n }\n return typeof value.command === 'string' ? value.command : null;\n}\n\nexport function isOurMember(key: SettingsKey, value: unknown): boolean {\n const command = memberCommand(value);\n if (command === null) {\n return false;\n }\n return key === 'statusLine'\n ? isOurMainCommand(command)\n : isOurPanelCommand(command);\n}\n\ninterface SettingsPlan {\n readonly adds: readonly (readonly [SettingsKey, string])[];\n readonly file: string;\n readonly raw: null | string;\n readonly repoints: readonly (readonly [SettingsKey, string])[];\n}\n\nfunction planSettings(\n home: string,\n commands: Readonly<Record<SettingsKey, string>>,\n force: boolean,\n): SettingsPlan {\n const file = join(home, '.claude', 'settings.json');\n const wanted = commands;\n const raw = readOrNull(file);\n if (raw === null) {\n return {\n adds: SETTINGS_KEYS.map(key => [key, wanted[key]] as const),\n file,\n raw: null,\n repoints: [],\n };\n }\n const parsed = parseSettings(file, raw);\n const adds: (readonly [SettingsKey, string])[] = [];\n const repoints: (readonly [SettingsKey, string])[] = [];\n for (const key of SETTINGS_KEYS) {\n const command = wanted[key];\n const value = parsed[key];\n if (value === undefined) {\n adds.push([key, command]);\n } else if (memberCommand(value) === command) {\n continue;\n } else if (isOurMember(key, value) || force) {\n repoints.push([key, command]);\n } else {\n throw new Error(\n `settings.json ${key} is foreign — rerun with --force added to your configuration flags to take it over`,\n );\n }\n }\n return { adds, file, raw, repoints };\n}\n\nexport function settingsValue(command: string): string {\n return JSON.stringify({ command, type: 'command' });\n}\n\nfunction skipString(raw: string, at: number): number {\n let i = at + 1;\n while (i < raw.length) {\n if (raw[i] === '\\\\') {\n i += 2;\n } else if (raw[i] === '\"') {\n return i + 1;\n } else {\n i += 1;\n }\n }\n throw new Error('unterminated string in settings.json');\n}\n\nfunction skipValue(raw: string, at: number): number {\n const first = raw[at];\n if (first === '\"') {\n return skipString(raw, at);\n }\n if (first === '{' || first === '[') {\n let depth = 0;\n let i = at;\n while (i < raw.length) {\n const c = raw[i];\n if (c === '\"') {\n i = skipString(raw, i);\n } else if (c === '{' || c === '[') {\n depth += 1;\n i += 1;\n } else if (c === '}' || c === ']') {\n depth -= 1;\n i += 1;\n if (depth === 0) {\n return i;\n }\n } else {\n i += 1;\n }\n }\n throw new Error('unterminated container in settings.json');\n }\n let i = at;\n while (\n i < raw.length &&\n !',}]'.includes(raw[i] ?? '') &&\n !/\\s/.test(raw[i] ?? '~')\n ) {\n i += 1;\n }\n return i;\n}\n\ninterface RootMember {\n readonly name: string;\n readonly nameStart: number;\n readonly valueEnd: number;\n readonly valueStart: number;\n}\n\nfunction rootMembers(raw: string): readonly RootMember[] {\n const members: RootMember[] = [];\n let i = raw.indexOf('{') + 1;\n while (i < raw.length) {\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n if (raw[i] === '}') {\n break;\n }\n if (raw[i] !== '\"') {\n throw new Error('malformed member in settings.json');\n }\n const nameStart = i;\n const nameEnd = skipString(raw, i);\n const name = JSON.parse(raw.slice(i, nameEnd)) as string;\n i = nameEnd;\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n if (raw[i] !== ':') {\n throw new Error('malformed member in settings.json');\n }\n i += 1;\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n const valueStart = i;\n const valueEnd = skipValue(raw, i);\n members.push({ name, nameStart, valueEnd, valueStart });\n i = valueEnd;\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n if (raw[i] === ',') {\n i += 1;\n } else if (raw[i] !== '}') {\n throw new Error('malformed member in settings.json');\n }\n }\n return members;\n}\n\nexport function rootMemberValueSpan(\n raw: string,\n key: string,\n): null | readonly [number, number] {\n const member = rootMembers(raw).find(m => m.name === key);\n return member === undefined ? null : [member.valueStart, member.valueEnd];\n}\n\nexport function removeMembers(raw: string, keys: readonly string[]): string {\n let text = raw;\n for (const key of keys) {\n const members = rootMembers(text);\n const at = members.findIndex(m => m.name === key);\n if (at === -1) {\n throw new Error(\n `cannot find the \"${key}\" member to remove in settings.json`,\n );\n }\n if (members.length === 1) {\n return '{}';\n }\n const member = members[at];\n if (at > 0) {\n let start = member.nameStart;\n while (/\\s/.test(text[start - 1] ?? '~')) {\n start -= 1;\n }\n text = `${text.slice(0, start - 1)}${text.slice(member.valueEnd)}`;\n } else {\n text = `${text.slice(0, member.nameStart)}${text.slice(members[1].nameStart)}`;\n }\n }\n return text;\n}\n\nexport function insertMembers(\n raw: string,\n members: readonly (readonly [SettingsKey, string])[],\n): string {\n const close = raw.lastIndexOf('}');\n if (close === -1) {\n throw new Error('settings.json has no closing brace to splice into');\n }\n let at = close;\n while (/\\s/.test(raw[at - 1] ?? '~')) {\n at -= 1;\n }\n const comma = raw.replace(/\\s/g, '') === '{}' ? '' : ',';\n return `${raw.slice(0, at)}${comma}\\n ${renderMembers(members)}${raw.slice(at)}`;\n}\n\nfunction renderMembers(\n members: readonly (readonly [string, string])[],\n): string {\n return members\n .map(([key, command]) => `\"${key}\": ${settingsValue(command)}`)\n .join(',\\n ');\n}\n\n/** Splice each rendered value over its root member. */\nexport function repointRootMembers(\n raw: string,\n entries: readonly { key: string; value: string }[],\n): string {\n let text = raw;\n for (const { key, value } of entries) {\n const span = rootMemberValueSpan(text, key);\n if (span === null) {\n throw new Error(`cannot find the \"${key}\" member in settings.json`);\n }\n text = `${text.slice(0, span[0])}${value}${text.slice(span[1])}`;\n }\n return text;\n}\n\nfunction splicedSettings(raw: string, plan: SettingsPlan): string {\n const text = plan.adds.length > 0 ? insertMembers(raw, plan.adds) : raw;\n return repointRootMembers(\n text,\n plan.repoints.map(([key, command]) => ({\n key,\n value: settingsValue(command),\n })),\n );\n}\n\nexport interface SettingsBackup {\n readonly createdFile: boolean;\n readonly keys: Readonly<Partial<Record<SettingsKey, string>>>;\n}\n\nfunction writeBackupIfAbsent(home: string, plan: SettingsPlan): void {\n const file = backupPath(home);\n if (existsSync(file)) {\n return;\n }\n const keys: Partial<Record<SettingsKey, string>> = {};\n if (plan.raw !== null) {\n for (const key of SETTINGS_KEYS) {\n const span = rootMemberValueSpan(plan.raw, key);\n if (span === null) {\n continue;\n }\n const memberRaw = plan.raw.slice(span[0], span[1]);\n if (isOurMember(key, JSON.parse(memberRaw))) {\n continue;\n }\n keys[key] = memberRaw;\n }\n }\n const dir = dirname(file);\n mkdirSync(dir, { recursive: true });\n const tmp = `${file}.tmp`;\n writeFileSync(\n tmp,\n `${JSON.stringify({ createdFile: plan.raw === null, keys }, null, 2)}\\n`,\n );\n renameSync(tmp, file);\n}\n\nfunction commitSettings(plan: SettingsPlan): void {\n if (plan.raw === null) {\n mkdirSync(dirname(plan.file), { recursive: true });\n const members = plan.adds\n .map(([key, command]) => `\"${key}\": ${settingsValue(command)}`)\n .join(',\\n ');\n writeFileSync(plan.file, `{\\n ${members}\\n}\\n`);\n return;\n }\n if (plan.adds.length === 0 && plan.repoints.length === 0) {\n return;\n }\n writeFileSync(plan.file, splicedSettings(plan.raw, plan));\n}\n\nfunction themeNamed(\n name: string,\n themes: Readonly<Record<ThemeName, Theme>>,\n): Theme {\n const theme: Theme | undefined = (\n themes as Readonly<Record<string, Theme | undefined>>\n )[name];\n if (theme === undefined) {\n throw new Error(\n `unknown theme '${name}' — valid themes: ${THEME_NAMES.join(' ')}`,\n );\n }\n return theme;\n}\n\n// Validation only: the theme name is in the table, the overrides are picks\n// the registry offers, the layout's items are known — and some layout source\n// exists. The renderer resolves theme plus overrides at paint\n// (src/render/theme.ts); the writer below records the decisions, never\n// resolved output. Returns the named theme so its caller resolves it once.\nexport function validateSelection(\n options: Pick<ConfigureOptions, 'layout' | 'theme' | 'variants'>,\n): Theme | undefined {\n const theme =\n options.theme === undefined ? undefined : themeNamed(options.theme, THEMES);\n\n const layout = options.layout ?? theme?.layout;\n if (layout === undefined) {\n throw new Error('no layout — pass --layout <spec> or --theme <name>');\n }\n layoutItems(layout, ITEM_IDS);\n for (const [item, alt] of Object.entries(options.variants ?? {})) {\n const entry = specFor(item);\n if (entry === undefined) {\n throw new Error(\n `unknown item '${item}' — valid items: ${ITEM_IDS.join(' ')}`,\n );\n }\n if (!entry.alternatives.includes(alt)) {\n throw new Error(\n `unknown variant '${alt}' for item '${item}' — valid: ${entry.alternatives.join(' | ')}`,\n );\n }\n }\n return theme;\n}\n\n// A key records only the decisions that differ from the picks its base\n// already carries — registry defaults with the theme's variants over them;\n// the renderer resolves absent picks at paint.\nfunction decisionFlags(\n base: Readonly<Record<string, string>>,\n decisions: Readonly<Partial<Record<string, string>>>,\n): string[] {\n return ITEMS.flatMap(({ item }) => {\n const pick = decisions[item];\n return pick === undefined || pick === base[item]\n ? []\n : [`--${item}=${pick}`];\n });\n}\n\nexport function configure(options: ConfigureOptions): void {\n if (\n options.theme === undefined &&\n options.layout === undefined &&\n Object.keys(options.variants ?? {}).length === 0\n ) {\n throw new Error(\n \"no theme and no item flags — on a terminal run 'statusline configure' for the wizard; in Claude Code use the /lab skill\",\n );\n }\n\n const theme = validateSelection(options);\n const base = { ...DEFAULT_PICKS, ...theme?.variants };\n const decisions = options.variants ?? {};\n const baseLayout = theme?.layout ?? DEFAULT_LAYOUT;\n const layout =\n options.layout === undefined || options.layout === baseLayout\n ? null\n : options.layout;\n const flags = decisionFlags(base, decisions);\n const plan = planSettings(\n options.home,\n {\n statusLine: mainKeyValue(options.theme ?? null, layout, flags),\n // The panel consumes one decision — style.\n subagentStatusLine: panelKeyValue(\n options.theme ?? null,\n flags.filter(flag => flag.startsWith('--style=')),\n ),\n },\n options.force ?? false,\n );\n if (plan.adds.length > 0 || plan.repoints.length > 0) {\n writeBackupIfAbsent(options.home, plan);\n }\n commitSettings(plan);\n syncRenderer(options.home);\n}\n","import { execFileSync } from 'node:child_process';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst NAME = 'Lab';\nconst EMAIL = 'lab@local';\nconst D_INIT = '2026-09-01T10:00:00+00:00';\nconst D_REMOTE = '2026-09-01T11:00:00+00:00';\nconst D_LOCAL1 = '2026-09-02T09:00:00+00:00';\nconst D_LOCAL2 = '2026-09-02T09:30:00+00:00';\nconst D_STASH = '2026-09-02T10:00:00+00:00';\n\nconst API_INIT = \"export const api = {\\n host: 'demo.local',\\n};\\n\";\n\nexport function materializeDemoRepo(home: string): string {\n const dir = join(home, 'demo', 'atlas-web');\n for (const sub of ['src', 'docs', 'scratch', 'scripts']) {\n mkdirSync(join(dir, sub), { recursive: true });\n }\n function git(args: string[], date?: string): string {\n return execFileSync('git', ['-c', 'commit.gpgsign=false', ...args], {\n cwd: dir,\n encoding: 'utf8',\n // execFileSync inherits stderr by default; git checkout chatter must\n // not print over a wizard frame.\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n PATH: process.env.PATH ?? '',\n HOME: home,\n LC_ALL: 'C',\n TZ: 'UTC',\n GIT_AUTHOR_NAME: NAME,\n GIT_AUTHOR_EMAIL: EMAIL,\n GIT_COMMITTER_NAME: NAME,\n GIT_COMMITTER_EMAIL: EMAIL,\n ...(date ? { GIT_AUTHOR_DATE: date, GIT_COMMITTER_DATE: date } : {}),\n },\n });\n }\n function write(rel: string, body: string): void {\n writeFileSync(join(dir, rel), body);\n }\n function commit(message: string, date: string): void {\n git(['add', '-A']);\n git(['commit', '-m', message], date);\n }\n\n git(['init', '-b', 'main']);\n git(['config', 'user.name', NAME]);\n git(['config', 'user.email', EMAIL]);\n write('README.md', 'atlas-web demo repo\\n');\n write('src/index.js', 'export function start() {}\\n');\n write('src/api.js', API_INIT);\n write('src/style.css', 'body { margin: 0; }\\n');\n write('src/util.js', 'export const id = (x) => x;\\n');\n commit('init', D_INIT);\n\n write('src/api.js', `${API_INIT}// remote: pinned host\\n`);\n commit('remote1', D_REMOTE);\n const originMain = git(['rev-parse', 'HEAD']).trim();\n\n git(['checkout', '-b', 'feature/login-flow', 'HEAD~1']);\n write(\n 'src/util.js',\n 'export const id = (x) => x;\\nexport const tag = (x) => x;\\n',\n );\n commit('local1', D_LOCAL1);\n write('src/render.js', 'export function render() {}\\n');\n commit('local2', D_LOCAL2);\n git(['update-ref', 'refs/remotes/origin/main', originMain]);\n git(['config', 'remote.origin.url', '../atlas-web.git']);\n git(['config', 'remote.origin.fetch', '+refs/heads/*:refs/remotes/origin/*']);\n git(['config', 'branch.feature/login-flow.remote', 'origin']);\n git(['config', 'branch.feature/login-flow.merge', 'refs/heads/main']);\n\n write('README.md', 'atlas-web demo repo (wip)\\n');\n git(\n ['stash', 'push', '-m', 'wip: context refactor', '--', 'README.md'],\n D_STASH,\n );\n\n write('README.md', 'atlas-web demo repo\\n\\nstaged: pin the render loop\\n');\n write(\n 'src/index.js',\n 'export function start() {\\n return Promise.resolve();\\n}\\n',\n );\n git(['add', 'README.md', 'src/index.js']);\n write('src/api.js', `${API_INIT}// local tweak\\n`);\n write('src/style.css', 'body { margin: 0; padding: 0; }\\n');\n write('docs/wip.txt', '');\n write('scratch/todo.md', '');\n write('scripts/deploy.sh', '');\n write('note1.md', '');\n write('note2.md', '');\n return dir;\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 { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isObject } from './configure.js';\nimport { materializeDemoRepo } from './demo-repo.js';\nimport { renderStatusline } from './render/index.js';\nimport { renderPanel } from './render/panel.js';\nimport { resolvePaint } from './render/theme.js';\nimport { capturePath } from './resolve.js';\n\nconst PAYLOADS_DIR = fileURLToPath(\n new URL('../assets/payloads', import.meta.url),\n);\nconst TICKS_DIR = fileURLToPath(new URL('../assets/ticks', import.meta.url));\n\nconst P1_WARM_IN = 1920;\nconst P1_RESETS_IN: Readonly<Record<string, number>> = {\n five_hour: 13830,\n seven_day: 518400,\n spend_limit: 950400,\n};\nconst PANEL_STEP_S = 300;\n\nexport interface PreviewSources {\n readonly cleanup: () => void;\n readonly main: string;\n readonly tick: string;\n}\n\ntype Loose = Record<string, unknown>;\n\nfunction anchoredP1(repoDir: string, now: number): string {\n const payload = JSON.parse(\n readFileSync(join(PAYLOADS_DIR, 'p1.json'), 'utf8'),\n ) as Loose;\n const cache = payload.prompt_cache;\n if (isObject(cache)) {\n if (cache.warm === true) {\n cache.expires_at = now + P1_WARM_IN;\n cache.last_miss_at = now + P1_WARM_IN - 3900;\n } else {\n cache.expires_at = now - 10;\n delete cache.last_miss_at;\n }\n }\n const limits = payload.rate_limits;\n if (isObject(limits)) {\n for (const [limitKey, offset] of Object.entries(P1_RESETS_IN)) {\n const limit = limits[limitKey];\n if (isObject(limit)) {\n limit.resets_at = now + offset;\n }\n }\n }\n (payload.workspace as { current_dir: string }).current_dir = repoDir;\n return `${JSON.stringify(payload, null, 2)}\\n`;\n}\n\nfunction hasStart(value: unknown): boolean {\n return typeof value === 'number' && Number.isFinite(value) && value > 0;\n}\n\n// The panel drops a row's duration unless its start is at or before NOW\n// (the elapsed >= 0 guard), so the demo schedule staggers every started row\n// strictly into the past — ids and order ride over untouched.\nfunction anchoredTick(now: number): string {\n const tick = JSON.parse(\n readFileSync(join(TICKS_DIR, 'multi.json'), 'utf8'),\n ) as Loose;\n const tasks = (Array.isArray(tick.tasks) ? tick.tasks : []) as Loose[];\n let started = 0;\n const staggered = {\n ...tick,\n tasks: tasks.map(task => {\n if (!hasStart(task.startTime)) {\n return task;\n }\n started += 1;\n return { ...task, startTime: now - PANEL_STEP_S * started };\n }),\n };\n return `${JSON.stringify(staggered, null, 2)}\\n`;\n}\n\n// A capture renders verbatim; a shipped fixture is anchored to the render\n// moment and pointed at a freshly materialized demo repo so the git segments\n// preview. The repo is torn down with the preview's last render.\nexport function previewSources(home: string, now: number): PreviewSources {\n const mainCapture = capturePath(home, 'main');\n if (existsSync(mainCapture)) {\n const tickCapture = capturePath(home, 'tick');\n return {\n cleanup: () => undefined,\n main: readFileSync(mainCapture, 'utf8'),\n tick: existsSync(tickCapture)\n ? readFileSync(tickCapture, 'utf8')\n : anchoredTick(now),\n };\n }\n const demoHome = mkdtempSync(join(tmpdir(), 'statusline-preview-'));\n return {\n cleanup: () => {\n rmSync(demoHome, { recursive: true, force: true });\n },\n main: anchoredP1(materializeDemoRepo(demoHome), now),\n tick: anchoredTick(now),\n };\n}\n\n// The panel answers with one {\"id\",\"content\"} JSON line per task; a frame\n// carries the first row's content.\nfunction firstPanelRow(output: string): string {\n const [row] = output.split('\\n');\n if (row === '') {\n return '';\n }\n const content = (JSON.parse(row) as { content?: unknown }).content;\n return typeof content === 'string' ? content : '';\n}\n\nexport interface PreviewRender {\n readonly home: string;\n readonly layout?: string;\n readonly main: string;\n readonly now: string;\n readonly plain?: boolean;\n readonly theme?: string;\n readonly tick: string;\n readonly values?: Readonly<Record<string, string>>;\n readonly width?: number;\n}\n\nexport interface PreviewSurfaces {\n readonly line: string;\n readonly panel: string;\n}\n\n// Both surfaces render in-process from one resolution — theme plus overrides\n// resolve exactly as the render entry does at paint, then feed the packaged\n// engine and panel. The panel reads its width from the tick's own columns;\n// the line reads the bag's.\nexport function renderPreview(bag: PreviewRender): PreviewSurfaces {\n const plain = bag.plain === true || (process.env.NO_COLOR ?? '') !== '';\n const paint = resolvePaint({\n layout: bag.layout,\n picks: bag.values,\n theme: bag.theme,\n });\n const line = renderStatusline({\n home: bag.home,\n layout: paint.layout,\n noColor: plain,\n now: Number(bag.now),\n payload: bag.main,\n picks: paint.picks,\n ...(bag.width === undefined ? {} : { columns: bag.width }),\n }).replace(/\\n+$/, '');\n const panel = firstPanelRow(\n renderPanel({\n noColor: plain,\n now: Number(bag.now),\n payload: bag.tick,\n picks: paint.picks,\n }).replace(/\\n+$/, ''),\n );\n return { line, panel };\n}\n","import { validateSelection } from './configure.js';\nimport { previewSources, renderPreview } from './payloads.js';\n\nexport interface PreviewOptions {\n readonly home: string;\n readonly layout?: string;\n readonly now: string;\n readonly plain?: boolean;\n readonly theme?: string;\n readonly variants?: Readonly<Record<string, string>>;\n}\n\nexport function preview(options: PreviewOptions): string {\n validateSelection(options);\n const sources = previewSources(options.home, Number(options.now));\n try {\n const { line, panel } = renderPreview({\n home: options.home,\n layout: options.layout,\n main: sources.main,\n now: options.now,\n plain: options.plain ?? !process.stdout.isTTY,\n tick: sources.tick,\n theme: options.theme,\n values: options.variants,\n });\n return `preview at 200 columns — nothing written\\n${line}\\npanel ${panel}\\n`;\n } finally {\n sources.cleanup();\n }\n}\n","import {\n existsSync,\n readdirSync,\n rmdirSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport {\n isObject,\n isOurMember,\n readOrNull,\n removeMembers,\n repointRootMembers,\n rootMemberValueSpan,\n SETTINGS_KEYS,\n type SettingsBackup,\n type SettingsKey,\n} from './configure.js';\nimport { DATA_DIR } from './render/capture.js';\nimport { backupPath, renderMjsPath } from './resolve.js';\n\nexport interface RestoreOptions {\n readonly dryRun?: boolean;\n readonly force?: boolean;\n readonly home: string;\n}\n\nexport type RestoreResult =\n | { mode: 'dry-run'; text: string }\n | { mode: 'nothing'; text: string }\n | { mode: 'restored'; text: string };\n\ntype KeyAction =\n | { readonly key: SettingsKey; readonly kind: 'remove' }\n | {\n readonly key: SettingsKey;\n readonly kind: 'splice';\n readonly text: string;\n };\n\nexport function readBackup(home: string): null | SettingsBackup {\n const file = backupPath(home);\n const raw = readOrNull(file);\n if (raw === null) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n throw new Error(`${file} is not valid JSON`, { cause: e });\n }\n if (\n !isObject(parsed) ||\n typeof parsed.createdFile !== 'boolean' ||\n !isObject(parsed.keys)\n ) {\n throw new Error(`${file} is not a lab backup`);\n }\n const keys: Partial<Record<SettingsKey, string>> = {};\n for (const key of SETTINGS_KEYS) {\n const saved = parsed.keys[key];\n if (typeof saved === 'string') {\n keys[key] = saved;\n }\n }\n return { createdFile: parsed.createdFile, keys };\n}\n\nfunction rmdirIfEmpty(dir: string): void {\n try {\n rmdirSync(dir);\n } catch (e) {\n const code = (e as NodeJS.ErrnoException).code;\n if (code !== 'ENOTEMPTY' && code !== 'ENOENT' && code !== 'ENOTDIR') {\n throw e;\n }\n }\n}\n\nfunction clearCaptures(dir: string): void {\n if (!existsSync(dir)) {\n return;\n }\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile()) {\n rmSync(join(dir, entry.name), { force: true });\n }\n }\n rmdirIfEmpty(dir);\n}\n\nfunction planActions(\n raw: string,\n backup: null | SettingsBackup,\n force: boolean,\n): readonly KeyAction[] {\n const actions: KeyAction[] = [];\n for (const key of SETTINGS_KEYS) {\n const span = rootMemberValueSpan(raw, key);\n if (span === null) {\n continue;\n }\n const memberRaw = raw.slice(span[0], span[1]);\n const saved = backup === null ? undefined : backup.keys[key];\n if (isOurMember(key, JSON.parse(memberRaw))) {\n actions.push(\n saved === undefined\n ? { kind: 'remove', key }\n : { kind: 'splice', key, text: saved },\n );\n } else if (saved !== undefined && memberRaw !== saved) {\n if (!force) {\n throw new Error(\n `settings.json ${key} changed since the lab took it over — rerun with --force to put the saved value back`,\n );\n }\n actions.push({ kind: 'splice', key, text: saved });\n }\n }\n return actions;\n}\n\nexport function restore(options: RestoreOptions): RestoreResult {\n const settings = join(options.home, '.claude', 'settings.json');\n const backup = readBackup(options.home);\n const raw = readOrNull(settings);\n\n const actions =\n raw === null ? [] : planActions(raw, backup, options.force ?? false);\n const removals: SettingsKey[] = [];\n const splices: { key: SettingsKey; text: string }[] = [];\n for (const action of actions) {\n if (action.kind === 'remove') {\n removals.push(action.key);\n } else {\n splices.push(action);\n }\n }\n\n let next: null | string = raw;\n let deleteFile = false;\n if (actions.length > 0 && raw !== null) {\n const stripped = removals.length > 0 ? removeMembers(raw, removals) : raw;\n const text = repointRootMembers(\n stripped,\n splices.map(({ key, text: value }) => ({ key, value })),\n );\n const membersLeft = Object.keys(JSON.parse(text) as object).length;\n if (backup !== null && backup.createdFile && membersLeft === 0) {\n deleteFile = true;\n next = null;\n } else {\n next = text;\n }\n }\n\n const dataDir = join(options.home, DATA_DIR);\n const capturesDir = join(dataDir, 'captures');\n const backupFile = backupPath(options.home);\n const rendererFile = renderMjsPath(options.home);\n if (\n actions.length === 0 &&\n !existsSync(backupFile) &&\n !existsSync(capturesDir) &&\n !existsSync(rendererFile)\n ) {\n return {\n mode: 'nothing',\n text: 'nothing to restore — no lab keys in settings.json, no backup, no captures, no renderer',\n };\n }\n\n if (options.dryRun) {\n const lines = ['restore plan — nothing written'];\n for (const action of actions) {\n lines.push(\n action.kind === 'remove'\n ? ` remove ${action.key} (absent before the lab)`\n : ` splice the saved ${action.key} value back`,\n );\n }\n if (deleteFile) {\n lines.push(\n ' delete settings.json (the lab created it and it is now empty)',\n );\n }\n if (existsSync(capturesDir)) {\n lines.push(' delete captures/');\n }\n if (existsSync(rendererFile)) {\n lines.push(' delete render.mjs');\n }\n if (existsSync(backupFile)) {\n lines.push(' delete backup.json');\n }\n lines.push(' remove the data dir if empty');\n return { mode: 'dry-run', text: lines.join('\\n') };\n }\n\n if (deleteFile) {\n rmSync(settings, { force: true });\n } else if (next !== null && actions.length > 0) {\n writeFileSync(settings, next);\n }\n clearCaptures(capturesDir);\n rmSync(rendererFile, { force: true });\n rmSync(backupFile, { force: true });\n rmdirIfEmpty(dataDir);\n let line: string;\n if (deleteFile) {\n line = 'restored — settings.json is gone, exactly as before the lab';\n } else if (actions.length > 0) {\n line = 'keys restored — settings.json holds its pre-lab values again';\n } else {\n line = 'lab data cleaned — no lab keys in settings.json';\n }\n return { mode: 'restored', text: line };\n}\n","import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { delimiter, join } from 'node:path';\n\nimport {\n BUNDLED_RENDERER,\n isOurMember,\n memberCommand,\n parseSettings,\n readOrNull,\n SETTINGS_KEYS,\n type SettingsBackup,\n type SettingsKey,\n} from './configure.js';\nimport { DATA_DIR } from './render/capture.js';\nimport { specFor } from './render/index.js';\nimport { layoutItemsOf } from './render/layout.js';\nimport {\n capturePath,\n parsePanelCommand,\n readKeyConfig,\n renderMjsPath,\n type ScriptConfig,\n} from './resolve.js';\nimport { readBackup } from './restore.js';\n\nexport interface StatusOptions {\n readonly home: string;\n readonly path?: string;\n}\n\nexport interface StatusResult {\n readonly healthy: boolean;\n readonly rows: readonly string[];\n}\n\ntype KeyState =\n | { readonly command: null | string; readonly kind: 'foreign' }\n | { readonly kind: 'absent' }\n | { readonly kind: 'ours' };\n\nfunction keyState(key: SettingsKey, value: unknown): KeyState {\n if (value === undefined) {\n return { kind: 'absent' };\n }\n if (isOurMember(key, value)) {\n return { kind: 'ours' };\n }\n return { kind: 'foreign', command: memberCommand(value) };\n}\n\nfunction keyRow(key: SettingsKey, state: KeyState, detail = ''): string {\n if (state.kind === 'ours') {\n return `${key}: ours${detail === '' ? '' : ` — ${detail}`}`;\n }\n if (state.kind === 'absent') {\n return `${key}: absent — fix: rerun configure --theme classic`;\n }\n return `${key}: foreign${state.command === null ? '' : ` (${state.command})`} — fix: rerun configure --force --theme classic`;\n}\n\n// A layout-less key (the theme or the default carries its layout) still has\n// its flagged decisions to show and check.\nfunction keyItems(config: ScriptConfig): readonly string[] {\n const layout = config.layout === null ? [] : layoutItemsOf(config.layout);\n return [...new Set([...layout, ...Object.keys(config.values)])];\n}\n\nfunction configDetail(config: ScriptConfig): string {\n const assignments = keyItems(config)\n .filter(item => Object.hasOwn(config.values, item))\n .map(item => `${item}=${config.values[item]}`);\n return [\n ...(config.layout === null ? [] : [`layout='${config.layout}'`]),\n ...assignments,\n ].join(' ');\n}\n\nfunction panelDetail(config: ScriptConfig): string {\n return [\n ...(config.theme === undefined ? [] : [`theme=${config.theme}`]),\n ...Object.entries(config.values).map(([item, alt]) => `${item}=${alt}`),\n ].join(' ');\n}\n\n// The row names what the key names — the theme plus the swaps it carries,\n// never a pick-matching derivation.\nfunction themeRow(config: ScriptConfig): readonly string[] {\n if (config.theme === undefined) {\n return [];\n }\n const swaps = Object.entries(config.values).map(\n ([item, alt]) => `+${item}=${alt}`,\n );\n return [`theme: ${[config.theme, ...swaps].join(' ')}`];\n}\n\ntype DriftFinding =\n | {\n readonly alt: string;\n readonly item: string;\n readonly kind: 'unknown-variant';\n }\n | { readonly item: string; readonly kind: 'unknown-item' };\n\nfunction findingText(finding: DriftFinding): string {\n return finding.kind === 'unknown-item'\n ? `unknown item '${finding.item}'`\n : `unknown variant '${finding.alt}' for '${finding.item}'`;\n}\n\nfunction driftFindings(config: ScriptConfig): readonly DriftFinding[] {\n const findings: DriftFinding[] = [];\n for (const item of keyItems(config)) {\n const entry = specFor(item);\n if (entry === undefined) {\n findings.push({ item, kind: 'unknown-item' });\n continue;\n }\n const alt = Object.hasOwn(config.values, item) ? config.values[item] : null;\n if (alt !== null && !entry.alternatives.includes(alt)) {\n findings.push({ alt, item, kind: 'unknown-variant' });\n }\n }\n return findings;\n}\n\n// The settings keys spawn plain `node`, not this CLI's runtime — PATH is the\n// one thing the paint needs that the CLI cannot vouch for.\nexport function nodeOnPath(pathVar: string): null | string {\n const found = pathVar\n .split(delimiter)\n .filter(dir => dir !== '')\n .map(dir => join(dir, 'node'))\n .find(existsSync);\n return found ?? null;\n}\n\nexport function rendererHash(bytes: Buffer): string {\n return createHash('sha256').update(bytes).digest('hex').slice(0, 12);\n}\n\ntype RendererState =\n | { readonly cli: string; readonly data: string; readonly kind: 'stale' }\n | { readonly hash: string; readonly kind: 'current' }\n | { readonly kind: 'missing' }\n | { readonly kind: 'no-bundle' };\n\nfunction rendererState(home: string): RendererState {\n if (!existsSync(BUNDLED_RENDERER)) {\n return { kind: 'no-bundle' };\n }\n const cli = readFileSync(BUNDLED_RENDERER);\n const dataFile = renderMjsPath(home);\n if (!existsSync(dataFile)) {\n return { kind: 'missing' };\n }\n const data = readFileSync(dataFile);\n const hash = rendererHash(data);\n return hash === rendererHash(cli)\n ? { hash, kind: 'current' }\n : { cli: rendererHash(cli), data: hash, kind: 'stale' };\n}\n\nfunction rendererRow(state: RendererState): string {\n if (state.kind === 'current') {\n return `renderer: current — ${state.hash}`;\n }\n // --force so the fix also completes on a home holding foreign keys.\n if (state.kind === 'stale') {\n return `renderer: stale — data ${state.data}, this CLI ${state.cli} — fix: rerun configure --force --theme classic`;\n }\n if (state.kind === 'no-bundle') {\n return 'renderer: this CLI ships no render.mjs — fix: rerun /lab to refresh the CLI';\n }\n return 'renderer: missing — fix: rerun configure --force --theme classic';\n}\n\nfunction configRow(findings: readonly DriftFinding[]): string {\n if (findings.length === 0) {\n return 'config: no drift';\n }\n return `config: drift — ${findings.map(findingText).join(', ')} — fix: rerun configure --theme classic`;\n}\n\nfunction backupRow(home: string): string {\n let backup: null | SettingsBackup;\n try {\n backup = readBackup(home);\n } catch {\n return `backup: unreadable — fix: delete ~/${DATA_DIR}/backup.json`;\n }\n if (backup === null) {\n return 'backup: absent';\n }\n const saved = SETTINGS_KEYS.filter(key => backup.keys[key] !== undefined);\n const parts = [\n ...(backup.createdFile ? ['created settings.json'] : []),\n saved.length > 0 ? `saved ${saved.join(', ')}` : 'saved nothing',\n ];\n return `backup: present — ${parts.join(', ')}`;\n}\n\nfunction ageText(ms: number): string {\n const minutes = Math.floor(ms / 60000);\n if (minutes < 1) {\n return `${Math.floor(ms / 1000)}s`;\n }\n if (minutes < 60) {\n return `${minutes}m`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n return `${Math.floor(hours / 24)}d`;\n}\n\nfunction captureText(home: string, surface: 'main' | 'tick'): string {\n try {\n const age = ageText(\n Date.now() - statSync(capturePath(home, surface)).mtimeMs,\n );\n return `${age} ago`;\n } catch {\n return 'absent';\n }\n}\n\nfunction capturesRow(home: string): string {\n const surfaces = (['main', 'tick'] as const).map(\n surface => `${surface} ${captureText(home, surface)}`,\n );\n return `captures: ${surfaces.join(', ')}`;\n}\n\nfunction settingsMembers(home: string): Record<string, unknown> {\n const file = join(home, '.claude', 'settings.json');\n const raw = readOrNull(file);\n return raw === null ? {} : parseSettings(file, raw);\n}\n\nexport function status(options: StatusOptions): StatusResult {\n const members = settingsMembers(options.home);\n const main = keyState('statusLine', members.statusLine);\n const subagent = keyState('subagentStatusLine', members.subagentStatusLine);\n const config = readKeyConfig(options.home);\n const panelConfig = parsePanelCommand(\n memberCommand(members.subagentStatusLine),\n );\n const findings = main.kind === 'ours' ? driftFindings(config) : [];\n const node = nodeOnPath(options.path ?? process.env.PATH ?? '');\n const renderer = rendererState(options.home);\n\n const rows = [\n node === null\n ? 'node: missing — fix: install node ≥ 18 from nodejs.org, then restart Claude Code'\n : `node: on PATH (${node})`,\n rendererRow(renderer),\n keyRow('statusLine', main, configDetail(config)),\n keyRow('subagentStatusLine', subagent, panelDetail(panelConfig)),\n ...(main.kind === 'ours' ? [configRow(findings), ...themeRow(config)] : []),\n backupRow(options.home),\n capturesRow(options.home),\n ];\n const healthy =\n node !== null &&\n renderer.kind === 'current' &&\n main.kind === 'ours' &&\n subagent.kind === 'ours' &&\n findings.length === 0;\n return { healthy, rows: [...rows, healthy ? 'healthy' : 'unhealthy'] };\n}\n","import type { PreviewRender, PreviewSurfaces } from './payloads.js';\nimport type { WizardDeps } from './wizard.js';\n\nimport { renderPreview } from './payloads.js';\n\nfunction nextKey(buffer: string): readonly [string, string] | undefined {\n if (buffer === '') {\n return undefined;\n }\n const head = buffer[0];\n if (head !== '\\x1b') {\n return [head, buffer.slice(1)];\n }\n if (buffer.length < 3) {\n return undefined;\n }\n if (buffer[1] === '[' && 'ABCD'.includes(buffer[2])) {\n return [buffer.slice(0, 3), buffer.slice(3)];\n }\n return ['', buffer.slice(1)];\n}\n\nexport function terminalDeps(\n input: NodeJS.ReadStream = process.stdin,\n output: NodeJS.WriteStream = process.stdout,\n): WizardDeps {\n return {\n async *readKeys(): AsyncGenerator<string> {\n const chunks: string[] = [];\n const waiters: (() => void)[] = [];\n const state = { closed: false };\n function notify(): void {\n for (const wake of waiters.splice(0)) {\n wake();\n }\n }\n function onData(chunk: Buffer): void {\n chunks.push(chunk.toString('utf8'));\n notify();\n }\n function onEnd(): void {\n state.closed = true;\n notify();\n }\n input.on('data', onData);\n input.on('end', onEnd);\n input.on('close', onEnd);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n input.resume();\n try {\n let buffer = '';\n for (;;) {\n for (\n let chunk = chunks.shift();\n chunk !== undefined;\n chunk = chunks.shift()\n ) {\n buffer += chunk;\n }\n while (buffer !== '') {\n const next = nextKey(buffer);\n if (next === undefined) {\n break;\n }\n buffer = next[1];\n if (next[0] !== '') {\n yield next[0];\n }\n }\n if (state.closed && chunks.length === 0) {\n return;\n }\n await new Promise<void>(resolve => {\n waiters.push(resolve);\n });\n }\n } finally {\n if (input.isTTY) {\n input.setRawMode(false);\n }\n input.pause();\n input.off('data', onData);\n input.off('end', onEnd);\n input.off('close', onEnd);\n }\n },\n render(frame: string): void {\n output.write(`\\x1b[2J\\x1b[H${frame}\\n`);\n },\n preview(bag: PreviewRender): PreviewSurfaces {\n return renderPreview(bag);\n },\n };\n}\n","import type { PreviewRender, PreviewSurfaces } from './payloads.js';\n\nimport { VERSION } from './cli.js';\nimport { configure, type ConfigureOptions } from './configure.js';\nimport { previewSources } from './payloads.js';\nimport { DEFAULT_PICKS, ITEM_IDS, specFor } from './render/items.js';\nimport { layoutItems } from './render/layout.js';\nimport { type ThemeName, THEMES } from './themes.js';\n\nexport interface WizardDeps {\n preview(bag: PreviewRender): PreviewSurfaces;\n readKeys(): AsyncGenerator<string>;\n render(frame: string): void;\n}\n\nexport type WizardOutcome = 'cancelled' | 'save-failed' | 'saved';\n\nexport interface WizardOptions {\n readonly force?: boolean;\n readonly home: string;\n readonly now: string;\n}\n\nconst WIDTHS: readonly number[] = [80, 120, 200];\ntype Pass = 'refine' | 'themes';\nconst THEME_KEYMAP = 'j/k focus · w width · enter pick · q cancel';\nconst REFINE_KEYMAP =\n 'j/k move · h/l variant · s none · t themes · w width · enter save · q cancel';\n// The one registry item no layout paints; its refine sample is the panel row.\nconst STYLE = 'style';\n\n// index.ts routes its interactive branch through this predicate — the entry\n// executes the CLI on import, so the gate's one door is a wizard export.\nexport function opensWizard(\n args: Pick<ConfigureOptions, 'layout' | 'theme' | 'variants'>,\n isTty: boolean,\n): boolean {\n return (\n isTty &&\n args.layout === undefined &&\n args.theme === undefined &&\n args.variants === undefined\n );\n}\n\nexport async function createWizard(\n options: WizardOptions,\n deps: WizardDeps,\n): Promise<WizardOutcome> {\n const names = Object.keys(THEMES) as ThemeName[];\n const sources = previewSources(options.home, Number(options.now));\n const tickBase = JSON.parse(sources.tick) as Record<string, unknown>;\n\n let pass: Pass = 'themes';\n let themeAt = 0;\n let picked: ThemeName = names[0];\n let base: Readonly<Record<string, string>> = DEFAULT_PICKS;\n let offered: {\n readonly alternatives: readonly string[];\n readonly item: string;\n }[] = [];\n const overrides = new Map<string, string>();\n let focus = 0;\n let widthAt = 0;\n\n function bag(\n theme: string,\n layout?: string,\n values: Readonly<Record<string, string>> = {},\n ): PreviewRender {\n return {\n home: options.home,\n ...(layout === undefined ? {} : { layout }),\n main: sources.main,\n now: options.now,\n tick: `${JSON.stringify(\n { ...tickBase, columns: WIDTHS[widthAt] },\n null,\n 2,\n )}\\n`,\n theme,\n values,\n width: WIDTHS[widthAt],\n };\n }\n\n function enterRefine(name: ThemeName): void {\n picked = name;\n base = { ...DEFAULT_PICKS, ...THEMES[name].variants };\n const items = layoutItems(THEMES[name].layout, ITEM_IDS);\n offered = [...new Set([...items, STYLE])].flatMap(item => {\n const entry = specFor(item);\n return entry === undefined\n ? []\n : [{ alternatives: entry.alternatives, item }];\n });\n overrides.clear();\n focus = 0;\n }\n\n function effectivePick(item: string): string {\n return overrides.get(item) ?? base[item];\n }\n\n // An override lives only while it differs from the theme's own pick — the\n // save records the name plus true differences, never a resolved draft.\n function setPick(item: string, alt: string): void {\n if (alt === base[item]) {\n overrides.delete(item);\n } else {\n overrides.set(item, alt);\n }\n }\n\n function cycle(delta: number): void {\n const focused = offered.at(focus);\n if (focused === undefined || focused.alternatives.length === 0) {\n return;\n }\n const alts = focused.alternatives;\n const at = alts.indexOf(effectivePick(focused.item));\n setPick(focused.item, alts[(at + delta + alts.length) % alts.length]);\n }\n\n function step(key: string): Pass {\n const down = key === '\\x1b[B' || key === 'j';\n const up = key === '\\x1b[A' || key === 'k';\n if (key === 'w') {\n widthAt = (widthAt + 1) % WIDTHS.length;\n } else if (pass === 'themes') {\n if (down) {\n themeAt = (themeAt + 1) % names.length;\n } else if (up) {\n themeAt = (themeAt + names.length - 1) % names.length;\n }\n } else if (key === 't') {\n return 'themes';\n } else if (down) {\n focus = (focus + 1) % offered.length;\n } else if (up) {\n focus = (focus + offered.length - 1) % offered.length;\n } else if (key === '\\x1b[C' || key === 'l') {\n cycle(1);\n } else if (key === '\\x1b[D' || key === 'h') {\n cycle(-1);\n } else if (key === 's') {\n const focused = offered.at(focus);\n if (focused?.alternatives.includes('none')) {\n setPick(focused.item, 'none');\n }\n }\n return pass;\n }\n\n function drawThemes(): void {\n const rows: string[] = [];\n let panel = '';\n for (let at = 0; at < names.length; at += 1) {\n const name = names[at];\n const theme = THEMES[name];\n const surfaces = deps.preview(bag(name));\n const focused = at === themeAt;\n if (focused) {\n panel = surfaces.panel;\n }\n rows.push(`${focused ? '>' : ' '} ${name}: ${theme.summary}`);\n rows.push(` ${surfaces.line}`);\n }\n deps.render(\n [\n `statusline configure · ${WIDTHS[widthAt]} columns (w cycles)`,\n '',\n ...rows,\n '',\n `panel ${panel}`,\n '',\n THEME_KEYMAP,\n ].join('\\n'),\n );\n }\n\n function drawRefine(): void {\n const focused = offered.at(focus);\n if (focused === undefined) {\n return;\n }\n const values = Object.fromEntries(overrides);\n const samples = focused.alternatives.map(alt => {\n const surfaces = deps.preview(\n bag(picked, focused.item === STYLE ? undefined : `{${focused.item}}`, {\n ...values,\n [focused.item]: alt,\n }),\n );\n return focused.item === STYLE ? surfaces.panel : surfaces.line;\n });\n const full = deps.preview(bag(picked, undefined, values));\n const rows = offered.map(\n (entry, at) =>\n `${at === focus ? '>' : ' '} ${entry.item.padEnd(9)} ${effectivePick(entry.item)}`,\n );\n deps.render(\n [\n `statusline configure · ${WIDTHS[widthAt]} columns (w cycles)`,\n '',\n ` ${full.line}`,\n ` panel ${full.panel}`,\n '',\n `${focused.item}: ${focused.alternatives.join(' | ')}`,\n ...focused.alternatives.map(\n (alt, at) =>\n ` ${alt === effectivePick(focused.item) ? '*' : ' '} ${samples[at]}`,\n ),\n '',\n ...rows,\n '',\n REFINE_KEYMAP,\n ].join('\\n'),\n );\n }\n\n function draw(): void {\n if (pass === 'themes') {\n drawThemes();\n } else {\n drawRefine();\n }\n }\n\n function finish(): WizardOutcome {\n try {\n configure({\n force: options.force,\n home: options.home,\n theme: picked,\n variants: Object.fromEntries(overrides),\n });\n } catch (e) {\n deps.render(\n `save failed: ${(e as Error).message}\\nfix it and rerun: npx -y @v1nvn/statusline@${VERSION} configure\\n`,\n );\n return 'save-failed';\n }\n deps.render('saved — live on the next paint\\n');\n return 'saved';\n }\n\n try {\n const keys = deps.readKeys();\n draw();\n for await (const key of keys) {\n if (key === '\\r') {\n if (pass === 'themes') {\n enterRefine(names[themeAt]);\n pass = 'refine';\n draw();\n continue;\n }\n return finish();\n }\n if (key === 'q' || key === '\\x03') {\n break;\n }\n pass = step(key);\n draw();\n }\n deps.render('cancelled — nothing written\\n');\n return 'cancelled';\n } finally {\n sources.cleanup();\n }\n}\n","import { printUsageAndExit } from '@v1nvn/agentic-core';\n\nimport { catalog } from './catalog.js';\nimport { buildProgram, parseArgs, subcommandHelp, VERSION } from './cli.js';\nimport { configure } from './configure.js';\nimport { preview } from './preview.js';\nimport { restore } from './restore.js';\nimport { status } from './status.js';\nimport { terminalDeps } from './wizard-tui.js';\nimport { createWizard, opensWizard } from './wizard.js';\n\nconst parsed =\n parseArgs(process.argv.slice(2)) ?? printUsageAndExit(buildProgram());\n\nfunction homeOf(flag: string | undefined): string {\n const home = flag ?? process.env.HOME;\n if (home === undefined || home === '') {\n throw new Error('no home to operate on: set $HOME or pass --home');\n }\n return home;\n}\n\nfunction run(job: () => void): void {\n try {\n job();\n } catch (e) {\n console.error((e as Error).message);\n process.exitCode = 1;\n }\n}\n\nif (parsed.help !== undefined) {\n console.log(subcommandHelp(parsed.help));\n} else if (parsed.version) {\n console.log(VERSION);\n} else if (parsed.command === 'catalog') {\n run(() => {\n console.log(\n catalog({\n home: homeOf(parsed.home),\n items: parsed.items,\n themes: parsed.themes,\n }),\n );\n });\n} else if (parsed.command === 'configure') {\n const home = homeOf(parsed.home);\n if (opensWizard(parsed, process.stdin.isTTY)) {\n const outcome = await createWizard(\n {\n force: parsed.force,\n home,\n now: String(Math.floor(Date.now() / 1000)),\n },\n terminalDeps(),\n );\n if (outcome === 'save-failed') {\n process.exitCode = 1;\n }\n } else {\n run(() => {\n configure({\n force: parsed.force,\n home,\n layout: parsed.layout,\n theme: parsed.theme,\n variants: parsed.variants,\n });\n console.log('configured — live on the next paint');\n });\n }\n} else if (parsed.command === 'preview') {\n run(() => {\n console.log(\n preview({\n home: homeOf(parsed.home),\n layout: parsed.layout,\n now: String(Math.floor(Date.now() / 1000)),\n plain: parsed.plain,\n theme: parsed.theme,\n variants: parsed.variants,\n }),\n );\n });\n} else if (parsed.command === 'restore') {\n run(() => {\n const result = restore({\n dryRun: parsed.dryRun,\n force: parsed.force,\n home: homeOf(parsed.home),\n });\n console.log(result.text);\n });\n} else if (parsed.command === 'status') {\n run(() => {\n const result = status({ home: homeOf(parsed.home) });\n console.log(result.rows.join('\\n'));\n process.exitCode = result.healthy ? 0 : 1;\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../core/dist/index.js","../src/render/git.ts","../src/render/items.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/themes.ts","../src/render/theme.ts","../src/render/capture.ts","../src/resolve.ts","../src/catalog.ts","../package.json","../src/cli.ts","../src/configure.ts","../src/demo-repo.ts","../src/render/panel.ts","../src/payloads.ts","../src/preview.ts","../src/restore.ts","../src/status.ts","../src/wizard-tui.ts","../src/wizard.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n//#region src/input.ts\nfunction readAll(stream) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet data = \"\";\n\t\tstream.setEncoding(\"utf8\");\n\t\tstream.on(\"data\", (chunk) => {\n\t\t\tdata += chunk;\n\t\t});\n\t\tstream.on(\"end\", () => {\n\t\t\tresolve(data);\n\t\t});\n\t\tstream.on(\"error\", reject);\n\t});\n}\nfunction readStdin(stream = process.stdin) {\n\treturn readAll(stream);\n}\n/** A markdown file's contents, with the CLI's no-such-file error. */\nfunction readMarkdownFile(path) {\n\tif (!statSync(path, { throwIfNoEntry: false })?.isFile()) throw new Error(`no such file: ${path}`);\n\treturn readFileSync(path, \"utf8\");\n}\n//#endregion\n//#region src/hook.ts\n/**\n* Read the Claude Code hook event JSON from stdin; empty or unparseable input\n* yields an empty event, never a thrown error — a hook must always answer.\n*/\nfunction readHookEvent(stream = process.stdin) {\n\treturn readAll(stream).then((data) => {\n\t\ttry {\n\t\t\treturn JSON.parse(data);\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}, () => ({}));\n}\n/**\n* Which transcript lastReply should read, per the hook event: transcript_path\n* when it names a real file, else session_id, else nothing (lastReply then\n* falls back to the newest session for the current project).\n*/\nfunction replyTarget(event) {\n\tif (event.transcript_path !== void 0 && isFile(event.transcript_path)) return event.transcript_path;\n\treturn event.session_id || void 0;\n}\nfunction isFile(path) {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n/**\n* Print the UserPromptExpansion decision for a zero-token command: `block`\n* keeps the command from reaching the model, with the output as the `reason`.\n*/\nfunction emitHookBlock(reason) {\n\tprocess.stdout.write(`${JSON.stringify({\n\t\tdecision: \"block\",\n\t\treason\n\t})}\\n`);\n}\n//#endregion\n//#region src/cli.ts\nfunction parseQuietly(program, args, recover) {\n\ttry {\n\t\tprogram.allowExcessArguments(false).exitOverride().configureOutput({\n\t\t\twriteOut: () => void 0,\n\t\t\twriteErr: () => void 0\n\t\t}).parse([...args], { from: \"user\" });\n\t\treturn program;\n\t} catch (err) {\n\t\treturn recover?.(err);\n\t}\n}\nfunction printUsageAndExit(program) {\n\tconsole.error(program.helpInformation());\n\tprocess.exit(1);\n}\nasync function hookOrPrint(hook, failure, run, stdin = process.stdin) {\n\tif (hook) {\n\t\tlet reason;\n\t\ttry {\n\t\t\treason = await run(await readHookEvent(stdin));\n\t\t} catch (e) {\n\t\t\treason = `${failure}: ${e.message}`;\n\t\t}\n\t\temitHookBlock(reason);\n\t\treturn;\n\t}\n\ttry {\n\t\tconsole.log(await run(void 0));\n\t} catch (e) {\n\t\tconsole.error(e.message);\n\t\tprocess.exit(1);\n\t}\n}\n//#endregion\n//#region src/dev.ts\nvar RELOAD_DEBOUNCE_MS = 150;\nvar IGNORED_SEGMENTS = [\n\t\"/node_modules/\",\n\t\"/dist/\",\n\t\"/.git/\",\n\t\"/coverage/\"\n];\nfunction shouldReload(file) {\n\treturn IGNORED_SEGMENTS.every((seg) => !file.includes(seg));\n}\n/**\n* Debounced file-change reloads, serialized via a promise chain: concurrent\n* saves never overlap, and a mid-reload save still produces a follow-up.\n*/\nfunction watchWithReload(vite, reload) {\n\tlet chain = Promise.resolve();\n\tlet timer;\n\tvite.watcher.on(\"change\", (file) => {\n\t\tif (!shouldReload(file)) return;\n\t\tif (timer) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = void 0;\n\t\t\tchain = chain.then(reload);\n\t\t}, RELOAD_DEBOUNCE_MS);\n\t});\n}\n//#endregion\n//#region src/last-reply.ts\nfunction textBlocks(entry) {\n\tconst content = entry.message?.content;\n\tif (entry.type !== \"assistant\" || !Array.isArray(content)) return;\n\tconst blocks = content.filter((b) => typeof b === \"object\" && b !== null && b.type === \"text\");\n\treturn blocks.length > 0 ? blocks : void 0;\n}\nfunction claudeProjectsDir() {\n\tconst claudeDir = process.env.CLAUDE_DIR ?? join(homedir(), \".claude\");\n\treturn join(claudeDir, \"projects\");\n}\n/**\n* The last assistant text reply from a Claude Code session, reproducing Claude\n* Code's `/copy` byte-for-byte: the last assistant entry that contains a\n* `text` block, only its `text` block(s) (tool_use / thinking dropped), blocks\n* joined with a blank line, and no trailing newline.\n*\n* @param arg a transcript file, a session UUID under the project dir, or\n* nothing to use the newest session for the current project.\n*/\nfunction lastReply(arg) {\n\tconst proj = (process.env.CLAUDE_PROJECT_DIR ?? process.cwd()).replaceAll(\"/\", \"-\");\n\tconst projDir = join(claudeProjectsDir(), proj);\n\tlet file;\n\tif (arg !== void 0) file = isFile(arg) ? arg : join(projDir, `${arg}.jsonl`);\n\telse if (existsSync(projDir)) {\n\t\tconst newest = readdirSync(projDir).filter((f) => f.endsWith(\".jsonl\")).map((f) => ({\n\t\t\tf,\n\t\t\tmtimeMs: statSync(join(projDir, f)).mtimeMs\n\t\t})).sort((a, b) => b.mtimeMs - a.mtimeMs).at(0);\n\t\tif (newest) file = join(projDir, newest.f);\n\t}\n\tif (file === void 0 || !isFile(file)) throw new Error(`no session transcript found in ${projDir}`);\n\tlet last;\n\tfor (const line of readFileSync(file, \"utf8\").split(\"\\n\")) {\n\t\tif (!line.includes(\"\\\"assistant\\\"\")) continue;\n\t\tlet entry;\n\t\ttry {\n\t\t\tentry = JSON.parse(line);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tconst blocks = textBlocks(entry);\n\t\tif (blocks) last = blocks;\n\t}\n\treturn (last ?? []).map((b) => b.text ?? \"\").join(\"\\n\\n\");\n}\n//#endregion\n//#region src/logger.ts\nvar LEVEL_RANK = {\n\tdebug: 10,\n\tinfo: 20,\n\twarn: 30,\n\terror: 40,\n\tsilent: Number.MAX_SAFE_INTEGER\n};\nfunction levelEnabled(active, wanted) {\n\treturn LEVEL_RANK[wanted] >= LEVEL_RANK[active];\n}\nvar LEVEL_LABEL = {\n\tdebug: \"DEBUG\",\n\terror: \"ERROR\",\n\tinfo: \"INFO\",\n\twarn: \"WARN\"\n};\nvar Logger = class {\n\tactiveLevel;\n\tstderr;\n\tconstructor(activeLevel, stderr = (line) => process.stderr.write(`${line}\\n`)) {\n\t\tthis.activeLevel = activeLevel;\n\t\tthis.stderr = stderr;\n\t}\n\tdebug(message) {\n\t\tthis.log(\"debug\", message);\n\t}\n\terror(message) {\n\t\tthis.log(\"error\", message);\n\t}\n\tinfo(message) {\n\t\tthis.log(\"info\", message);\n\t}\n\twarn(message) {\n\t\tthis.log(\"warn\", message);\n\t}\n\tlog(level, message) {\n\t\tif (levelEnabled(this.activeLevel, level)) this.stderr(`${LEVEL_LABEL[level]} ${message}`);\n\t}\n};\n//#endregion\n//#region src/shutdown.ts\n/** Close each closable in order (best-effort), then force-exit. */\nfunction shutdownOnSignals(closables, signals = [\"SIGINT\", \"SIGTERM\"]) {\n\tfunction shutdown() {\n\t\tclosables.reduce((acc, closable) => acc.then(async () => {\n\t\t\ttry {\n\t\t\t\tawait closable.close();\n\t\t\t} catch {}\n\t\t}), Promise.resolve()).finally(() => {\n\t\t\tprocess.exit(0);\n\t\t});\n\t}\n\tfor (const signal of signals) process.on(signal, shutdown);\n}\n//#endregion\n//#region src/text-format.ts\n/**\n* Plain-text rendering primitives shared by the zai and tokens report\n* renderers. Output targets a monospace terminal / hook-block `reason`, so\n* everything here is fixed-width: padding, block-glyph bars, and compact\n* number formatting.\n*/\nvar MONTHS = [\n\t\"Jan\",\n\t\"Feb\",\n\t\"Mar\",\n\t\"Apr\",\n\t\"May\",\n\t\"Jun\",\n\t\"Jul\",\n\t\"Aug\",\n\t\"Sep\",\n\t\"Oct\",\n\t\"Nov\",\n\t\"Dec\"\n];\nvar EIGHTHS = [\n\t\"\",\n\t\"▏\",\n\t\"▎\",\n\t\"▍\",\n\t\"▌\",\n\t\"▋\",\n\t\"▊\",\n\t\"▉\"\n];\nvar RULE_WIDTH = 68;\nfunction rule() {\n\treturn \"─\".repeat(68);\n}\nfunction pad2(n) {\n\treturn String(n).padStart(2, \"0\");\n}\n/** Local-time `YYYY-MM-DD` key. */\nfunction ymd(date) {\n\treturn `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;\n}\nfunction fmtTokens(n) {\n\tif (n == null || Number.isNaN(n)) return \"—\";\n\tif (n >= 1e9) return (n / 1e9).toFixed(1) + \"B\";\n\tif (n >= 1e6) return (n / 1e6).toFixed(1) + \"M\";\n\tif (n >= 1e3) return (n / 1e3).toFixed(1) + \"K\";\n\treturn String(n);\n}\nfunction fmtNum(n) {\n\treturn (n || 0).toLocaleString(\"en-US\");\n}\nfunction padR(s, n) {\n\treturn s.length >= n ? s : s + \" \".repeat(n - s.length);\n}\nfunction padL(s, n) {\n\treturn s.length >= n ? s : \" \".repeat(n - s.length) + s;\n}\n/** Fixed-width bar field (width cols): █ blocks + an eighth-fraction + trailing spaces. */\nfunction barField(v, max, width) {\n\tif (!v || v <= 0 || max <= 0) return \" \".repeat(width);\n\tconst scaled = v / max * width;\n\tlet full = Math.floor(scaled);\n\tlet fi = Math.round((scaled - full) * 8);\n\tif (fi === 8) {\n\t\tfull += 1;\n\t\tfi = 0;\n\t}\n\tif (full === 0 && fi === 0) fi = 1;\n\tlet s = \"█\".repeat(Math.min(full, width));\n\tif (full < width && fi > 0) s += EIGHTHS[fi];\n\tif (s.length < width) s += \" \".repeat(width - s.length);\n\treturn s.slice(0, width);\n}\n/** Filled/empty meter: █ for used, ░ for remaining. */\nfunction meter(pct, width) {\n\tlet filled = Math.round((pct || 0) / 100 * width);\n\tfilled = Math.max(0, Math.min(width, filled));\n\treturn \"█\".repeat(filled) + \"░\".repeat(width - filled);\n}\n//#endregion\nexport { Logger, MONTHS, RULE_WIDTH, barField, claudeProjectsDir, emitHookBlock, fmtNum, fmtTokens, hookOrPrint, isFile, lastReply, levelEnabled, meter, pad2, padL, padR, parseQuietly, printUsageAndExit, readAll, readHookEvent, readMarkdownFile, readStdin, replyTarget, rule, shutdownOnSignals, watchWithReload, ymd };\n\n//# sourceMappingURL=index.js.map","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","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","// 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 { 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 { 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 { readFileSync } from 'node:fs';\nimport { join, sep } from 'node:path';\n\nimport { DATA_DIR } from './render/capture.js';\n\nexport function capturePath(home: string, surface: 'main' | 'tick'): string {\n return join(home, DATA_DIR, 'captures', `${surface}.json`);\n}\n\nexport function backupPath(home: string): string {\n return join(home, DATA_DIR, 'backup.json');\n}\n\nexport function renderMjsPath(home: string): string {\n return join(home, DATA_DIR, 'render.mjs');\n}\n\nexport interface ScriptConfig {\n readonly layout: null | string;\n readonly theme?: string;\n readonly values: Readonly<Record<string, string>>;\n}\n\n// The program the settings keys spawn: plain node on the data-dir renderer the\n// CLI syncs, `$HOME` expanded by the host shell. Flags may follow in any\n// order — the assignments-hug-the-command rule died with the env wall.\nconst RENDER_PROGRAM = `node \"$HOME/${DATA_DIR.split(sep).join('/')}/render.mjs\"`;\nconst PANEL_PROGRAM = `${RENDER_PROGRAM} panel`;\nconst KEY_SUFFIX = ' || true';\n\n// The one spelling of a settings key: program, --theme, a quoted --layout,\n// the differing flags, the swallow-everything suffix.\nfunction keyValue(\n program: string,\n theme: null | string,\n layout: null | string,\n flags: readonly string[],\n): string {\n return `${[\n program,\n ...(theme === null ? [] : [`--theme=${theme}`]),\n ...(layout === null ? [] : [`--layout='${layout}'`]),\n ...flags,\n ].join(' ')}${KEY_SUFFIX}`;\n}\n\nexport function mainKeyValue(\n theme: null | string,\n layout: null | string,\n flags: readonly string[],\n): string {\n return keyValue(RENDER_PROGRAM, theme, layout, flags);\n}\n\nexport function panelKeyValue(\n theme: null | string,\n flags: readonly string[],\n): string {\n return keyValue(PANEL_PROGRAM, theme, null, flags);\n}\n\n// The flags span between program and suffix — null unless the command is\n// ours-shaped (nothing after the program but flags).\nfunction commandMiddle(program: string, command: string): null | string {\n if (!command.startsWith(program) || !command.endsWith(KEY_SUFFIX)) {\n return null;\n }\n const middle = command.slice(\n program.length,\n command.length - KEY_SUFFIX.length,\n );\n return middle === '' || middle.startsWith(' --') ? middle : null;\n}\n\nexport function isOurMainCommand(command: string): boolean {\n return commandMiddle(RENDER_PROGRAM, command) !== null;\n}\n\nexport function isOurPanelCommand(command: string): boolean {\n return commandMiddle(PANEL_PROGRAM, command) !== null;\n}\n\nconst NO_DECISIONS: ScriptConfig = { layout: null, values: {} };\n\nfunction settingsCommand(home: string): null | string {\n let raw: string;\n try {\n raw = readFileSync(join(home, '.claude', 'settings.json'), 'utf8');\n } catch {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n const member = (parsed as null | { statusLine?: unknown })?.statusLine;\n if (typeof member !== 'object' || member === null) {\n return null;\n }\n const command = (member as { command?: unknown }).command;\n return typeof command === 'string' ? command : null;\n}\n\n// The flags a settings key carries parsed back into the decisions it\n// records: --theme as the name, --<item>=<alt> as values, a quoted --layout.\n// A null layout means no explicit --layout — a theme key leaves the layout\n// to the theme. Unknown item names survive to surface as drift.\nfunction parseKeyFlags(flags: string): ScriptConfig {\n const values: Record<string, string> = {};\n let theme: string | undefined;\n for (const [, name, alt] of flags.matchAll(\n /(?:^| )--([a-z][a-z0-9]*)=([a-z0-9]+)/g,\n )) {\n if (name === 'theme') {\n theme = alt;\n } else if (name !== 'now' && name !== 'layout') {\n values[name] = alt;\n }\n }\n const layout = /--layout='([^']*)'/.exec(flags);\n return {\n layout: layout === null ? null : layout[1],\n values,\n ...(theme === undefined ? {} : { theme }),\n };\n}\n\n// The main key's decisions. A missing settings member or a foreign key reads\n// the same way, with no theme and no values.\nexport function readKeyConfig(home: string): ScriptConfig {\n const command = settingsCommand(home);\n const flags =\n command === null ? null : commandMiddle(RENDER_PROGRAM, command);\n return flags === null ? NO_DECISIONS : parseKeyFlags(flags);\n}\n\n// The panel key's decisions — the theme it carries, a style pick when one\n// rides. An absent or foreign member reads as no decisions.\nexport function parsePanelCommand(command: null | string): ScriptConfig {\n const flags = command === null ? null : commandMiddle(PANEL_PROGRAM, command);\n return flags === null ? NO_DECISIONS : parseKeyFlags(flags);\n}\n","import { ITEM_IDS, specFor } from './render/index.js';\nimport { resolvePaint } from './render/theme.js';\nimport { readKeyConfig } from './resolve.js';\nimport { THEMES } from './themes.js';\n\nexport interface CatalogOptions {\n readonly home: string;\n readonly items?: readonly string[];\n readonly themes?: boolean;\n}\n\nexport function catalog(options: CatalogOptions): string {\n if (options.themes === true && options.items !== undefined) {\n throw new Error('--themes cannot combine with item flags');\n }\n const key = readKeyConfig(options.home);\n const block = Object.entries(THEMES).map(\n ([name, theme]) =>\n `${name}${key.theme === name ? '*' : ''}: ${theme.summary}`,\n );\n if (options.themes === true) {\n return block.join('\\n');\n }\n const resolved = resolvePaint({\n layout: key.layout ?? undefined,\n picks: key.values,\n theme: key.theme,\n });\n const wanted = options.items ?? ITEM_IDS;\n const itemLines = wanted.map(item => {\n const entry = specFor(item);\n if (entry === undefined) {\n throw new Error(\n `unknown item '${item}' — valid items: ${ITEM_IDS.join(' ')}`,\n );\n }\n const current = resolved.picks[item] ?? entry.default;\n return `${item}: ${entry.alternatives\n .map(alt => (alt === current ? `${alt}*` : alt))\n .join(' | ')}`;\n });\n return [...block, '', ...itemLines].join('\\n');\n}\n","{\n \"name\": \"@v1nvn/statusline\",\n \"version\": \"0.30.0\",\n \"description\": \"Browse statusline variants and configure the live status line and agent panel — the statusline CLI behind the statusline plugin.\",\n \"type\": \"module\",\n \"bin\": \"dist/index.js\",\n \"scripts\": {\n \"build\": \"vite build && vite build --mode render\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"keywords\": [\n \"claude-code\",\n \"statusline\",\n \"cli\"\n ],\n \"author\": {\n \"name\": \"v1nvn\",\n \"email\": \"v1n@outlook.com\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/v1nvn/agentic.git\",\n \"directory\": \"packages/statusline\"\n },\n \"files\": [\n \"dist\",\n \"assets\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"dependencies\": {\n \"@v1nvn/agentic-core\": \"workspace:^\",\n \"commander\": \"^15.0.0\"\n },\n \"devDependencies\": {\n \"vite\": \"^8.1.4\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","import { parseQuietly } from '@v1nvn/agentic-core';\nimport { Command } from 'commander';\n\nimport pkg from '../package.json' with { type: 'json' };\nimport { ITEM_IDS } from './render/items.js';\n\nexport const VERSION = pkg.version;\n\n// The flag surface is the render registry's item ids — one registry, shared\n// with the data-dir renderer.\n\nexport type Subcommand =\n 'catalog' | 'configure' | 'preview' | 'restore' | 'status';\n\nexport interface ParsedArgs {\n readonly command?: Subcommand;\n readonly dryRun?: boolean;\n readonly force?: boolean;\n readonly help?: Subcommand;\n readonly home?: string;\n readonly items?: readonly string[];\n readonly layout?: string;\n readonly plain?: boolean;\n readonly theme?: string;\n readonly themes?: boolean;\n readonly variants?: Readonly<Record<string, string>>;\n readonly version: boolean;\n}\n\ntype SubcommandOptions = Record<string, unknown>;\n\nconst QUIET = { writeOut: () => undefined, writeErr: () => undefined };\n\nclass HelpRequested extends Error {\n constructor(readonly command: Subcommand) {\n super(`${command} --help`);\n }\n}\n\nfunction quiet(name: Subcommand, command: Command): Command {\n return command\n .exitOverride(err => {\n const code = (err as { code?: string }).code;\n if (code === 'commander.help' || code === 'commander.helpDisplayed') {\n throw new HelpRequested(name);\n }\n throw err;\n })\n .configureOutput(QUIET)\n .allowExcessArguments(false);\n}\n\nexport function buildProgram(\n onSubcommand?: (command: Subcommand, options: SubcommandOptions) => void,\n): Command {\n const catalog = quiet('catalog', new Command('catalog'))\n .description(\n 'print the themes block (* marks the live theme) then one line per item — * marks the live variant',\n )\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--themes', 'cut the listing to the themes block');\n for (const item of ITEM_IDS) {\n catalog.option(`--${item}`, `cut the listing to the ${item} item`);\n }\n catalog.action((options: SubcommandOptions) =>\n onSubcommand?.('catalog', options),\n );\n\n const LAYOUT_HELP =\n \"brace clusters of item ids, e.g. '{cwd branch} {model effort}'\";\n const THEME_HELP =\n 'base design the item flags override: quiet, lean, classic, rich, custom';\n\n const configure = quiet('configure', new Command('configure'))\n .description('write both settings keys with the inline lab commands')\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--layout <spec>', LAYOUT_HELP)\n .option('--theme <name>', THEME_HELP)\n .option('--force', 'take over foreign settings keys');\n for (const item of ITEM_IDS) {\n configure.option(`--${item} <alt>`, `variant for the ${item} item`);\n }\n configure.action((options: SubcommandOptions) =>\n onSubcommand?.('configure', options),\n );\n\n const preview = quiet('preview', new Command('preview'))\n .description('render a candidate line and panel row; nothing is written')\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--layout <spec>', LAYOUT_HELP)\n .option('--theme <name>', THEME_HELP)\n .option('--plain', 'strip the color escapes so glyphs survive chat');\n for (const item of ITEM_IDS) {\n preview.option(`--${item} <alt>`, `variant for the ${item} item`);\n }\n preview.action((options: SubcommandOptions) =>\n onSubcommand?.('preview', options),\n );\n\n const restore = quiet('restore', new Command('restore'))\n .description(\n 'revert both settings keys to their pre-lab values, clean the data dir',\n )\n .option('--home <dir>', 'operate on this home instead of $HOME')\n .option('--dry-run', 'print the plan, write nothing')\n .option(\n '--force',\n 'splice the saved value over a key changed after the takeover',\n );\n restore.action((options: SubcommandOptions) =>\n onSubcommand?.('restore', options),\n );\n\n const status = quiet('status', new Command('status'))\n .description(\n 'check install, keys, config, and backup — exit 0 healthy, 1 when a row needs action',\n )\n .option('--home <dir>', 'operate on this home instead of $HOME');\n status.action((options: SubcommandOptions) =>\n onSubcommand?.('status', options),\n );\n\n return new Command()\n .name('statusline')\n .description('Configure the status line and agent panel designs')\n .option('-V, --version', 'print the version and exit')\n .action(() => undefined)\n .addCommand(catalog)\n .addCommand(configure)\n .addCommand(preview)\n .addCommand(restore)\n .addCommand(status);\n}\n\nexport function subcommandHelp(name: Subcommand): string {\n const command = buildProgram().commands.find(c => c.name() === name);\n if (command === undefined) {\n throw new Error(`no '${name}' command to describe`);\n }\n return command.helpInformation();\n}\n\nexport function parseArgs(args: readonly string[]): ParsedArgs | undefined {\n let chosen:\n | undefined\n | { readonly command: Subcommand; readonly options: SubcommandOptions };\n const program = buildProgram((command, options) => {\n chosen = { command, options };\n });\n const parsed = parseQuietly(program, args, err =>\n err instanceof HelpRequested ? { help: err.command } : undefined,\n );\n if (parsed === undefined) {\n return undefined;\n }\n if (!(parsed instanceof Command)) {\n return { version: false, help: parsed.help };\n }\n const { version } = program.opts<{ version: boolean | undefined }>();\n if (version) {\n return { version: true };\n }\n if (chosen === undefined) {\n return undefined;\n }\n const options = chosen.options;\n if (chosen.command === 'catalog') {\n const items = ITEM_IDS.filter(item => options[item] === true);\n return {\n version: false,\n command: 'catalog',\n ...(items.length > 0 ? { items } : {}),\n ...(typeof options.themes === 'boolean'\n ? { themes: options.themes }\n : {}),\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n };\n }\n if (chosen.command === 'restore') {\n return {\n version: false,\n command: 'restore',\n ...(typeof options.dryRun === 'boolean'\n ? { dryRun: options.dryRun }\n : {}),\n ...(typeof options.force === 'boolean' ? { force: options.force } : {}),\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n };\n }\n if (chosen.command === 'status') {\n return {\n version: false,\n command: 'status',\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n };\n }\n const variants: Record<string, string> = {};\n for (const item of ITEM_IDS) {\n if (typeof options[item] === 'string') {\n variants[item] = options[item];\n }\n }\n const common = {\n version: false as const,\n command: chosen.command,\n ...(Object.keys(variants).length > 0 ? { variants } : {}),\n ...(typeof options.home === 'string' ? { home: options.home } : {}),\n ...(typeof options.layout === 'string' ? { layout: options.layout } : {}),\n ...(typeof options.theme === 'string' ? { theme: options.theme } : {}),\n };\n return chosen.command === 'configure'\n ? {\n ...common,\n ...(typeof options.force === 'boolean' ? { force: options.force } : {}),\n }\n : {\n ...common,\n ...(typeof options.plain === 'boolean' ? { plain: options.plain } : {}),\n };\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport {\n DEFAULT_LAYOUT,\n DEFAULT_PICKS,\n ITEM_IDS,\n ITEMS,\n specFor,\n} from './render/index.js';\nimport { layoutItems } from './render/layout.js';\nimport {\n backupPath,\n isOurMainCommand,\n isOurPanelCommand,\n mainKeyValue,\n panelKeyValue,\n renderMjsPath,\n} from './resolve.js';\nimport { type Theme, THEME_NAMES, type ThemeName, THEMES } from './themes.js';\n\nexport interface ConfigureOptions {\n readonly force?: boolean;\n readonly home: string;\n readonly layout?: string;\n readonly theme?: string;\n readonly variants?: Readonly<Record<string, string>>;\n}\n\n// The renderer the settings keys spawn, as vite emits it beside the CLI bundle.\n// ../dist resolves to the package's dist/ from both src/ (tests) and the\n// bundled dist/index.js — both sit one level below dist/.\nexport const BUNDLED_RENDERER = fileURLToPath(\n new URL('../dist/render.mjs', import.meta.url),\n);\n\nexport function syncRenderer(home: string): void {\n const source = readFileSync(BUNDLED_RENDERER);\n const dest = renderMjsPath(home);\n if (existsSync(dest) && readFileSync(dest).equals(source)) {\n return;\n }\n mkdirSync(dirname(dest), { recursive: true });\n const tmp = `${dest}.tmp`;\n writeFileSync(tmp, source);\n renameSync(tmp, dest);\n}\n\nexport type SettingsKey = 'statusLine' | 'subagentStatusLine';\n\nexport const SETTINGS_KEYS = ['statusLine', 'subagentStatusLine'] as const;\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function readOrNull(file: string): null | string {\n try {\n return readFileSync(file, 'utf8');\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n}\n\nexport function parseSettings(\n file: string,\n raw: string,\n): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n throw new Error(`${file} is not valid JSON`, { cause: e });\n }\n if (!isObject(parsed)) {\n throw new Error(`${file} does not hold a settings object`);\n }\n return parsed;\n}\n\nexport function memberCommand(value: unknown): null | string {\n if (!isObject(value) || value.type !== 'command') {\n return null;\n }\n return typeof value.command === 'string' ? value.command : null;\n}\n\nexport function isOurMember(key: SettingsKey, value: unknown): boolean {\n const command = memberCommand(value);\n if (command === null) {\n return false;\n }\n return key === 'statusLine'\n ? isOurMainCommand(command)\n : isOurPanelCommand(command);\n}\n\ninterface SettingsPlan {\n readonly adds: readonly (readonly [SettingsKey, string])[];\n readonly file: string;\n readonly raw: null | string;\n readonly repoints: readonly (readonly [SettingsKey, string])[];\n}\n\nfunction planSettings(\n home: string,\n commands: Readonly<Record<SettingsKey, string>>,\n force: boolean,\n): SettingsPlan {\n const file = join(home, '.claude', 'settings.json');\n const wanted = commands;\n const raw = readOrNull(file);\n if (raw === null) {\n return {\n adds: SETTINGS_KEYS.map(key => [key, wanted[key]] as const),\n file,\n raw: null,\n repoints: [],\n };\n }\n const parsed = parseSettings(file, raw);\n const adds: (readonly [SettingsKey, string])[] = [];\n const repoints: (readonly [SettingsKey, string])[] = [];\n for (const key of SETTINGS_KEYS) {\n const command = wanted[key];\n const value = parsed[key];\n if (value === undefined) {\n adds.push([key, command]);\n } else if (memberCommand(value) === command) {\n continue;\n } else if (isOurMember(key, value) || force) {\n repoints.push([key, command]);\n } else {\n throw new Error(\n `settings.json ${key} is foreign — rerun with --force added to your configuration flags to take it over`,\n );\n }\n }\n return { adds, file, raw, repoints };\n}\n\nexport function settingsValue(command: string): string {\n return JSON.stringify({ command, type: 'command' });\n}\n\nfunction skipString(raw: string, at: number): number {\n let i = at + 1;\n while (i < raw.length) {\n if (raw[i] === '\\\\') {\n i += 2;\n } else if (raw[i] === '\"') {\n return i + 1;\n } else {\n i += 1;\n }\n }\n throw new Error('unterminated string in settings.json');\n}\n\nfunction skipValue(raw: string, at: number): number {\n const first = raw[at];\n if (first === '\"') {\n return skipString(raw, at);\n }\n if (first === '{' || first === '[') {\n let depth = 0;\n let i = at;\n while (i < raw.length) {\n const c = raw[i];\n if (c === '\"') {\n i = skipString(raw, i);\n } else if (c === '{' || c === '[') {\n depth += 1;\n i += 1;\n } else if (c === '}' || c === ']') {\n depth -= 1;\n i += 1;\n if (depth === 0) {\n return i;\n }\n } else {\n i += 1;\n }\n }\n throw new Error('unterminated container in settings.json');\n }\n let i = at;\n while (\n i < raw.length &&\n !',}]'.includes(raw[i] ?? '') &&\n !/\\s/.test(raw[i] ?? '~')\n ) {\n i += 1;\n }\n return i;\n}\n\ninterface RootMember {\n readonly name: string;\n readonly nameStart: number;\n readonly valueEnd: number;\n readonly valueStart: number;\n}\n\nfunction rootMembers(raw: string): readonly RootMember[] {\n const members: RootMember[] = [];\n let i = raw.indexOf('{') + 1;\n while (i < raw.length) {\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n if (raw[i] === '}') {\n break;\n }\n if (raw[i] !== '\"') {\n throw new Error('malformed member in settings.json');\n }\n const nameStart = i;\n const nameEnd = skipString(raw, i);\n const name = JSON.parse(raw.slice(i, nameEnd)) as string;\n i = nameEnd;\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n if (raw[i] !== ':') {\n throw new Error('malformed member in settings.json');\n }\n i += 1;\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n const valueStart = i;\n const valueEnd = skipValue(raw, i);\n members.push({ name, nameStart, valueEnd, valueStart });\n i = valueEnd;\n while (/\\s/.test(raw[i] ?? '~')) {\n i += 1;\n }\n if (raw[i] === ',') {\n i += 1;\n } else if (raw[i] !== '}') {\n throw new Error('malformed member in settings.json');\n }\n }\n return members;\n}\n\nexport function rootMemberValueSpan(\n raw: string,\n key: string,\n): null | readonly [number, number] {\n const member = rootMembers(raw).find(m => m.name === key);\n return member === undefined ? null : [member.valueStart, member.valueEnd];\n}\n\nexport function removeMembers(raw: string, keys: readonly string[]): string {\n let text = raw;\n for (const key of keys) {\n const members = rootMembers(text);\n const at = members.findIndex(m => m.name === key);\n if (at === -1) {\n throw new Error(\n `cannot find the \"${key}\" member to remove in settings.json`,\n );\n }\n if (members.length === 1) {\n return '{}';\n }\n const member = members[at];\n if (at > 0) {\n let start = member.nameStart;\n while (/\\s/.test(text[start - 1] ?? '~')) {\n start -= 1;\n }\n text = `${text.slice(0, start - 1)}${text.slice(member.valueEnd)}`;\n } else {\n text = `${text.slice(0, member.nameStart)}${text.slice(members[1].nameStart)}`;\n }\n }\n return text;\n}\n\nexport function insertMembers(\n raw: string,\n members: readonly (readonly [SettingsKey, string])[],\n): string {\n const close = raw.lastIndexOf('}');\n if (close === -1) {\n throw new Error('settings.json has no closing brace to splice into');\n }\n let at = close;\n while (/\\s/.test(raw[at - 1] ?? '~')) {\n at -= 1;\n }\n const comma = raw.replace(/\\s/g, '') === '{}' ? '' : ',';\n return `${raw.slice(0, at)}${comma}\\n ${renderMembers(members)}${raw.slice(at)}`;\n}\n\nfunction renderMembers(\n members: readonly (readonly [string, string])[],\n): string {\n return members\n .map(([key, command]) => `\"${key}\": ${settingsValue(command)}`)\n .join(',\\n ');\n}\n\n/** Splice each rendered value over its root member. */\nexport function repointRootMembers(\n raw: string,\n entries: readonly { key: string; value: string }[],\n): string {\n let text = raw;\n for (const { key, value } of entries) {\n const span = rootMemberValueSpan(text, key);\n if (span === null) {\n throw new Error(`cannot find the \"${key}\" member in settings.json`);\n }\n text = `${text.slice(0, span[0])}${value}${text.slice(span[1])}`;\n }\n return text;\n}\n\nfunction splicedSettings(raw: string, plan: SettingsPlan): string {\n const text = plan.adds.length > 0 ? insertMembers(raw, plan.adds) : raw;\n return repointRootMembers(\n text,\n plan.repoints.map(([key, command]) => ({\n key,\n value: settingsValue(command),\n })),\n );\n}\n\nexport interface SettingsBackup {\n readonly createdFile: boolean;\n readonly keys: Readonly<Partial<Record<SettingsKey, string>>>;\n}\n\nfunction writeBackupIfAbsent(home: string, plan: SettingsPlan): void {\n const file = backupPath(home);\n if (existsSync(file)) {\n return;\n }\n const keys: Partial<Record<SettingsKey, string>> = {};\n if (plan.raw !== null) {\n for (const key of SETTINGS_KEYS) {\n const span = rootMemberValueSpan(plan.raw, key);\n if (span === null) {\n continue;\n }\n const memberRaw = plan.raw.slice(span[0], span[1]);\n if (isOurMember(key, JSON.parse(memberRaw))) {\n continue;\n }\n keys[key] = memberRaw;\n }\n }\n const dir = dirname(file);\n mkdirSync(dir, { recursive: true });\n const tmp = `${file}.tmp`;\n writeFileSync(\n tmp,\n `${JSON.stringify({ createdFile: plan.raw === null, keys }, null, 2)}\\n`,\n );\n renameSync(tmp, file);\n}\n\nfunction commitSettings(plan: SettingsPlan): void {\n if (plan.raw === null) {\n mkdirSync(dirname(plan.file), { recursive: true });\n const members = plan.adds\n .map(([key, command]) => `\"${key}\": ${settingsValue(command)}`)\n .join(',\\n ');\n writeFileSync(plan.file, `{\\n ${members}\\n}\\n`);\n return;\n }\n if (plan.adds.length === 0 && plan.repoints.length === 0) {\n return;\n }\n writeFileSync(plan.file, splicedSettings(plan.raw, plan));\n}\n\nfunction themeNamed(\n name: string,\n themes: Readonly<Record<ThemeName, Theme>>,\n): Theme {\n const theme: Theme | undefined = (\n themes as Readonly<Record<string, Theme | undefined>>\n )[name];\n if (theme === undefined) {\n throw new Error(\n `unknown theme '${name}' — valid themes: ${THEME_NAMES.join(' ')}`,\n );\n }\n return theme;\n}\n\n// Validation only: the theme name is in the table, the overrides are picks\n// the registry offers, the layout's items are known — and some layout source\n// exists. The renderer resolves theme plus overrides at paint\n// (src/render/theme.ts); the writer below records the decisions, never\n// resolved output. Returns the named theme so its caller resolves it once.\nexport function validateSelection(\n options: Pick<ConfigureOptions, 'layout' | 'theme' | 'variants'>,\n): Theme | undefined {\n const theme =\n options.theme === undefined ? undefined : themeNamed(options.theme, THEMES);\n\n const layout = options.layout ?? theme?.layout;\n if (layout === undefined) {\n throw new Error('no layout — pass --layout <spec> or --theme <name>');\n }\n layoutItems(layout, ITEM_IDS);\n for (const [item, alt] of Object.entries(options.variants ?? {})) {\n const entry = specFor(item);\n if (entry === undefined) {\n throw new Error(\n `unknown item '${item}' — valid items: ${ITEM_IDS.join(' ')}`,\n );\n }\n if (!entry.alternatives.includes(alt)) {\n throw new Error(\n `unknown variant '${alt}' for item '${item}' — valid: ${entry.alternatives.join(' | ')}`,\n );\n }\n }\n return theme;\n}\n\n// A key records only the decisions that differ from the picks its base\n// already carries — registry defaults with the theme's variants over them;\n// the renderer resolves absent picks at paint.\nfunction decisionFlags(\n base: Readonly<Record<string, string>>,\n decisions: Readonly<Partial<Record<string, string>>>,\n): string[] {\n return ITEMS.flatMap(({ item }) => {\n const pick = decisions[item];\n return pick === undefined || pick === base[item]\n ? []\n : [`--${item}=${pick}`];\n });\n}\n\nexport function configure(options: ConfigureOptions): void {\n if (\n options.theme === undefined &&\n options.layout === undefined &&\n Object.keys(options.variants ?? {}).length === 0\n ) {\n throw new Error(\n \"no theme and no item flags — on a terminal run 'statusline configure' for the wizard; in Claude Code use the /lab skill\",\n );\n }\n\n const theme = validateSelection(options);\n const base = { ...DEFAULT_PICKS, ...theme?.variants };\n const decisions = options.variants ?? {};\n const baseLayout = theme?.layout ?? DEFAULT_LAYOUT;\n const layout =\n options.layout === undefined || options.layout === baseLayout\n ? null\n : options.layout;\n const flags = decisionFlags(base, decisions);\n const plan = planSettings(\n options.home,\n {\n statusLine: mainKeyValue(options.theme ?? null, layout, flags),\n // The panel consumes one decision — style.\n subagentStatusLine: panelKeyValue(\n options.theme ?? null,\n flags.filter(flag => flag.startsWith('--style=')),\n ),\n },\n options.force ?? false,\n );\n if (plan.adds.length > 0 || plan.repoints.length > 0) {\n writeBackupIfAbsent(options.home, plan);\n }\n commitSettings(plan);\n syncRenderer(options.home);\n}\n","import { execFileSync } from 'node:child_process';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst NAME = 'Lab';\nconst EMAIL = 'lab@local';\nconst D_INIT = '2026-09-01T10:00:00+00:00';\nconst D_REMOTE = '2026-09-01T11:00:00+00:00';\nconst D_LOCAL1 = '2026-09-02T09:00:00+00:00';\nconst D_LOCAL2 = '2026-09-02T09:30:00+00:00';\nconst D_STASH = '2026-09-02T10:00:00+00:00';\n\nconst API_INIT = \"export const api = {\\n host: 'demo.local',\\n};\\n\";\n\nexport function materializeDemoRepo(home: string): string {\n const dir = join(home, 'demo', 'atlas-web');\n for (const sub of ['src', 'docs', 'scratch', 'scripts']) {\n mkdirSync(join(dir, sub), { recursive: true });\n }\n function git(args: string[], date?: string): string {\n return execFileSync('git', ['-c', 'commit.gpgsign=false', ...args], {\n cwd: dir,\n encoding: 'utf8',\n // execFileSync inherits stderr by default; git checkout chatter must\n // not print over a wizard frame.\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n PATH: process.env.PATH ?? '',\n HOME: home,\n LC_ALL: 'C',\n TZ: 'UTC',\n GIT_AUTHOR_NAME: NAME,\n GIT_AUTHOR_EMAIL: EMAIL,\n GIT_COMMITTER_NAME: NAME,\n GIT_COMMITTER_EMAIL: EMAIL,\n ...(date ? { GIT_AUTHOR_DATE: date, GIT_COMMITTER_DATE: date } : {}),\n },\n });\n }\n function write(rel: string, body: string): void {\n writeFileSync(join(dir, rel), body);\n }\n function commit(message: string, date: string): void {\n git(['add', '-A']);\n git(['commit', '-m', message], date);\n }\n\n git(['init', '-b', 'main']);\n git(['config', 'user.name', NAME]);\n git(['config', 'user.email', EMAIL]);\n write('README.md', 'atlas-web demo repo\\n');\n write('src/index.js', 'export function start() {}\\n');\n write('src/api.js', API_INIT);\n write('src/style.css', 'body { margin: 0; }\\n');\n write('src/util.js', 'export const id = (x) => x;\\n');\n commit('init', D_INIT);\n\n write('src/api.js', `${API_INIT}// remote: pinned host\\n`);\n commit('remote1', D_REMOTE);\n const originMain = git(['rev-parse', 'HEAD']).trim();\n\n git(['checkout', '-b', 'feature/login-flow', 'HEAD~1']);\n write(\n 'src/util.js',\n 'export const id = (x) => x;\\nexport const tag = (x) => x;\\n',\n );\n commit('local1', D_LOCAL1);\n write('src/render.js', 'export function render() {}\\n');\n commit('local2', D_LOCAL2);\n git(['update-ref', 'refs/remotes/origin/main', originMain]);\n git(['config', 'remote.origin.url', '../atlas-web.git']);\n git(['config', 'remote.origin.fetch', '+refs/heads/*:refs/remotes/origin/*']);\n git(['config', 'branch.feature/login-flow.remote', 'origin']);\n git(['config', 'branch.feature/login-flow.merge', 'refs/heads/main']);\n\n write('README.md', 'atlas-web demo repo (wip)\\n');\n git(\n ['stash', 'push', '-m', 'wip: context refactor', '--', 'README.md'],\n D_STASH,\n );\n\n write('README.md', 'atlas-web demo repo\\n\\nstaged: pin the render loop\\n');\n write(\n 'src/index.js',\n 'export function start() {\\n return Promise.resolve();\\n}\\n',\n );\n git(['add', 'README.md', 'src/index.js']);\n write('src/api.js', `${API_INIT}// local tweak\\n`);\n write('src/style.css', 'body { margin: 0; padding: 0; }\\n');\n write('docs/wip.txt', '');\n write('scratch/todo.md', '');\n write('scripts/deploy.sh', '');\n write('note1.md', '');\n write('note2.md', '');\n return dir;\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 { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isObject } from './configure.js';\nimport { materializeDemoRepo } from './demo-repo.js';\nimport { renderStatusline } from './render/index.js';\nimport { renderPanel } from './render/panel.js';\nimport { resolvePaint } from './render/theme.js';\nimport { capturePath } from './resolve.js';\n\nconst PAYLOADS_DIR = fileURLToPath(\n new URL('../assets/payloads', import.meta.url),\n);\nconst TICKS_DIR = fileURLToPath(new URL('../assets/ticks', import.meta.url));\n\nconst P1_WARM_IN = 1920;\nconst P1_RESETS_IN: Readonly<Record<string, number>> = {\n five_hour: 13830,\n seven_day: 518400,\n spend_limit: 950400,\n};\nconst PANEL_STEP_S = 300;\n\nexport interface PreviewSources {\n readonly cleanup: () => void;\n readonly main: string;\n readonly tick: string;\n}\n\ntype Loose = Record<string, unknown>;\n\nfunction anchoredP1(repoDir: string, now: number): string {\n const payload = JSON.parse(\n readFileSync(join(PAYLOADS_DIR, 'p1.json'), 'utf8'),\n ) as Loose;\n const cache = payload.prompt_cache;\n if (isObject(cache)) {\n if (cache.warm === true) {\n cache.expires_at = now + P1_WARM_IN;\n cache.last_miss_at = now + P1_WARM_IN - 3900;\n } else {\n cache.expires_at = now - 10;\n delete cache.last_miss_at;\n }\n }\n const limits = payload.rate_limits;\n if (isObject(limits)) {\n for (const [limitKey, offset] of Object.entries(P1_RESETS_IN)) {\n const limit = limits[limitKey];\n if (isObject(limit)) {\n limit.resets_at = now + offset;\n }\n }\n }\n (payload.workspace as { current_dir: string }).current_dir = repoDir;\n return `${JSON.stringify(payload, null, 2)}\\n`;\n}\n\nfunction hasStart(value: unknown): boolean {\n return typeof value === 'number' && Number.isFinite(value) && value > 0;\n}\n\n// The panel drops a row's duration unless its start is at or before NOW\n// (the elapsed >= 0 guard), so the demo schedule staggers every started row\n// strictly into the past — ids and order ride over untouched.\nfunction anchoredTick(now: number): string {\n const tick = JSON.parse(\n readFileSync(join(TICKS_DIR, 'multi.json'), 'utf8'),\n ) as Loose;\n const tasks = (Array.isArray(tick.tasks) ? tick.tasks : []) as Loose[];\n let started = 0;\n const staggered = {\n ...tick,\n tasks: tasks.map(task => {\n if (!hasStart(task.startTime)) {\n return task;\n }\n started += 1;\n return { ...task, startTime: now - PANEL_STEP_S * started };\n }),\n };\n return `${JSON.stringify(staggered, null, 2)}\\n`;\n}\n\n// A capture renders verbatim; a shipped fixture is anchored to the render\n// moment and pointed at a freshly materialized demo repo so the git segments\n// preview. The repo is torn down with the preview's last render.\nexport function previewSources(home: string, now: number): PreviewSources {\n const mainCapture = capturePath(home, 'main');\n if (existsSync(mainCapture)) {\n const tickCapture = capturePath(home, 'tick');\n return {\n cleanup: () => undefined,\n main: readFileSync(mainCapture, 'utf8'),\n tick: existsSync(tickCapture)\n ? readFileSync(tickCapture, 'utf8')\n : anchoredTick(now),\n };\n }\n const demoHome = mkdtempSync(join(tmpdir(), 'statusline-preview-'));\n return {\n cleanup: () => {\n rmSync(demoHome, { recursive: true, force: true });\n },\n main: anchoredP1(materializeDemoRepo(demoHome), now),\n tick: anchoredTick(now),\n };\n}\n\n// The panel answers with one {\"id\",\"content\"} JSON line per task; a frame\n// carries the first row's content.\nfunction firstPanelRow(output: string): string {\n const [row] = output.split('\\n');\n if (row === '') {\n return '';\n }\n const content = (JSON.parse(row) as { content?: unknown }).content;\n return typeof content === 'string' ? content : '';\n}\n\nexport interface PreviewRender {\n readonly home: string;\n readonly layout?: string;\n readonly main: string;\n readonly now: string;\n readonly plain?: boolean;\n readonly theme?: string;\n readonly tick: string;\n readonly values?: Readonly<Record<string, string>>;\n readonly width?: number;\n}\n\nexport interface PreviewSurfaces {\n readonly line: string;\n readonly panel: string;\n}\n\n// Both surfaces render in-process from one resolution — theme plus overrides\n// resolve exactly as the render entry does at paint, then feed the packaged\n// engine and panel. The panel reads its width from the tick's own columns;\n// the line reads the bag's.\nexport function renderPreview(bag: PreviewRender): PreviewSurfaces {\n const plain = bag.plain === true || (process.env.NO_COLOR ?? '') !== '';\n const paint = resolvePaint({\n layout: bag.layout,\n picks: bag.values,\n theme: bag.theme,\n });\n const line = renderStatusline({\n home: bag.home,\n layout: paint.layout,\n noColor: plain,\n now: Number(bag.now),\n payload: bag.main,\n picks: paint.picks,\n ...(bag.width === undefined ? {} : { columns: bag.width }),\n }).replace(/\\n+$/, '');\n const panel = firstPanelRow(\n renderPanel({\n noColor: plain,\n now: Number(bag.now),\n payload: bag.tick,\n picks: paint.picks,\n }).replace(/\\n+$/, ''),\n );\n return { line, panel };\n}\n","import { validateSelection } from './configure.js';\nimport { previewSources, renderPreview } from './payloads.js';\n\nexport interface PreviewOptions {\n readonly home: string;\n readonly layout?: string;\n readonly now: string;\n readonly plain?: boolean;\n readonly theme?: string;\n readonly variants?: Readonly<Record<string, string>>;\n}\n\nexport function preview(options: PreviewOptions): string {\n validateSelection(options);\n const sources = previewSources(options.home, Number(options.now));\n try {\n const { line, panel } = renderPreview({\n home: options.home,\n layout: options.layout,\n main: sources.main,\n now: options.now,\n plain: options.plain ?? !process.stdout.isTTY,\n tick: sources.tick,\n theme: options.theme,\n values: options.variants,\n });\n return `preview at 200 columns — nothing written\\n${line}\\npanel ${panel}\\n`;\n } finally {\n sources.cleanup();\n }\n}\n","import {\n existsSync,\n readdirSync,\n rmdirSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport {\n isObject,\n isOurMember,\n readOrNull,\n removeMembers,\n repointRootMembers,\n rootMemberValueSpan,\n SETTINGS_KEYS,\n type SettingsBackup,\n type SettingsKey,\n} from './configure.js';\nimport { DATA_DIR } from './render/capture.js';\nimport { backupPath, renderMjsPath } from './resolve.js';\n\nexport interface RestoreOptions {\n readonly dryRun?: boolean;\n readonly force?: boolean;\n readonly home: string;\n}\n\nexport type RestoreResult =\n | { mode: 'dry-run'; text: string }\n | { mode: 'nothing'; text: string }\n | { mode: 'restored'; text: string };\n\ntype KeyAction =\n | { readonly key: SettingsKey; readonly kind: 'remove' }\n | {\n readonly key: SettingsKey;\n readonly kind: 'splice';\n readonly text: string;\n };\n\nexport function readBackup(home: string): null | SettingsBackup {\n const file = backupPath(home);\n const raw = readOrNull(file);\n if (raw === null) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n throw new Error(`${file} is not valid JSON`, { cause: e });\n }\n if (\n !isObject(parsed) ||\n typeof parsed.createdFile !== 'boolean' ||\n !isObject(parsed.keys)\n ) {\n throw new Error(`${file} is not a lab backup`);\n }\n const keys: Partial<Record<SettingsKey, string>> = {};\n for (const key of SETTINGS_KEYS) {\n const saved = parsed.keys[key];\n if (typeof saved === 'string') {\n keys[key] = saved;\n }\n }\n return { createdFile: parsed.createdFile, keys };\n}\n\nfunction rmdirIfEmpty(dir: string): void {\n try {\n rmdirSync(dir);\n } catch (e) {\n const code = (e as NodeJS.ErrnoException).code;\n if (code !== 'ENOTEMPTY' && code !== 'ENOENT' && code !== 'ENOTDIR') {\n throw e;\n }\n }\n}\n\nfunction clearCaptures(dir: string): void {\n if (!existsSync(dir)) {\n return;\n }\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile()) {\n rmSync(join(dir, entry.name), { force: true });\n }\n }\n rmdirIfEmpty(dir);\n}\n\nfunction planActions(\n raw: string,\n backup: null | SettingsBackup,\n force: boolean,\n): readonly KeyAction[] {\n const actions: KeyAction[] = [];\n for (const key of SETTINGS_KEYS) {\n const span = rootMemberValueSpan(raw, key);\n if (span === null) {\n continue;\n }\n const memberRaw = raw.slice(span[0], span[1]);\n const saved = backup === null ? undefined : backup.keys[key];\n if (isOurMember(key, JSON.parse(memberRaw))) {\n actions.push(\n saved === undefined\n ? { kind: 'remove', key }\n : { kind: 'splice', key, text: saved },\n );\n } else if (saved !== undefined && memberRaw !== saved) {\n if (!force) {\n throw new Error(\n `settings.json ${key} changed since the lab took it over — rerun with --force to put the saved value back`,\n );\n }\n actions.push({ kind: 'splice', key, text: saved });\n }\n }\n return actions;\n}\n\nexport function restore(options: RestoreOptions): RestoreResult {\n const settings = join(options.home, '.claude', 'settings.json');\n const backup = readBackup(options.home);\n const raw = readOrNull(settings);\n\n const actions =\n raw === null ? [] : planActions(raw, backup, options.force ?? false);\n const removals: SettingsKey[] = [];\n const splices: { key: SettingsKey; text: string }[] = [];\n for (const action of actions) {\n if (action.kind === 'remove') {\n removals.push(action.key);\n } else {\n splices.push(action);\n }\n }\n\n let next: null | string = raw;\n let deleteFile = false;\n if (actions.length > 0 && raw !== null) {\n const stripped = removals.length > 0 ? removeMembers(raw, removals) : raw;\n const text = repointRootMembers(\n stripped,\n splices.map(({ key, text: value }) => ({ key, value })),\n );\n const membersLeft = Object.keys(JSON.parse(text) as object).length;\n if (backup !== null && backup.createdFile && membersLeft === 0) {\n deleteFile = true;\n next = null;\n } else {\n next = text;\n }\n }\n\n const dataDir = join(options.home, DATA_DIR);\n const capturesDir = join(dataDir, 'captures');\n const backupFile = backupPath(options.home);\n const rendererFile = renderMjsPath(options.home);\n if (\n actions.length === 0 &&\n !existsSync(backupFile) &&\n !existsSync(capturesDir) &&\n !existsSync(rendererFile)\n ) {\n return {\n mode: 'nothing',\n text: 'nothing to restore — no lab keys in settings.json, no backup, no captures, no renderer',\n };\n }\n\n if (options.dryRun) {\n const lines = ['restore plan — nothing written'];\n for (const action of actions) {\n lines.push(\n action.kind === 'remove'\n ? ` remove ${action.key} (absent before the lab)`\n : ` splice the saved ${action.key} value back`,\n );\n }\n if (deleteFile) {\n lines.push(\n ' delete settings.json (the lab created it and it is now empty)',\n );\n }\n if (existsSync(capturesDir)) {\n lines.push(' delete captures/');\n }\n if (existsSync(rendererFile)) {\n lines.push(' delete render.mjs');\n }\n if (existsSync(backupFile)) {\n lines.push(' delete backup.json');\n }\n lines.push(' remove the data dir if empty');\n return { mode: 'dry-run', text: lines.join('\\n') };\n }\n\n if (deleteFile) {\n rmSync(settings, { force: true });\n } else if (next !== null && actions.length > 0) {\n writeFileSync(settings, next);\n }\n clearCaptures(capturesDir);\n rmSync(rendererFile, { force: true });\n rmSync(backupFile, { force: true });\n rmdirIfEmpty(dataDir);\n let line: string;\n if (deleteFile) {\n line = 'restored — settings.json is gone, exactly as before the lab';\n } else if (actions.length > 0) {\n line = 'keys restored — settings.json holds its pre-lab values again';\n } else {\n line = 'lab data cleaned — no lab keys in settings.json';\n }\n return { mode: 'restored', text: line };\n}\n","import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { delimiter, join } from 'node:path';\n\nimport {\n BUNDLED_RENDERER,\n isOurMember,\n memberCommand,\n parseSettings,\n readOrNull,\n SETTINGS_KEYS,\n type SettingsBackup,\n type SettingsKey,\n} from './configure.js';\nimport { DATA_DIR } from './render/capture.js';\nimport { specFor } from './render/index.js';\nimport { layoutItemsOf } from './render/layout.js';\nimport {\n capturePath,\n parsePanelCommand,\n readKeyConfig,\n renderMjsPath,\n type ScriptConfig,\n} from './resolve.js';\nimport { readBackup } from './restore.js';\n\nexport interface StatusOptions {\n readonly home: string;\n readonly path?: string;\n}\n\nexport interface StatusResult {\n readonly healthy: boolean;\n readonly rows: readonly string[];\n}\n\ntype KeyState =\n | { readonly command: null | string; readonly kind: 'foreign' }\n | { readonly kind: 'absent' }\n | { readonly kind: 'ours' };\n\nfunction keyState(key: SettingsKey, value: unknown): KeyState {\n if (value === undefined) {\n return { kind: 'absent' };\n }\n if (isOurMember(key, value)) {\n return { kind: 'ours' };\n }\n return { kind: 'foreign', command: memberCommand(value) };\n}\n\nfunction keyRow(key: SettingsKey, state: KeyState, detail = ''): string {\n if (state.kind === 'ours') {\n return `${key}: ours${detail === '' ? '' : ` — ${detail}`}`;\n }\n if (state.kind === 'absent') {\n return `${key}: absent — fix: rerun configure --theme classic`;\n }\n return `${key}: foreign${state.command === null ? '' : ` (${state.command})`} — fix: rerun configure --force --theme classic`;\n}\n\n// A layout-less key (the theme or the default carries its layout) still has\n// its flagged decisions to show and check.\nfunction keyItems(config: ScriptConfig): readonly string[] {\n const layout = config.layout === null ? [] : layoutItemsOf(config.layout);\n return [...new Set([...layout, ...Object.keys(config.values)])];\n}\n\nfunction configDetail(config: ScriptConfig): string {\n const assignments = keyItems(config)\n .filter(item => Object.hasOwn(config.values, item))\n .map(item => `${item}=${config.values[item]}`);\n return [\n ...(config.layout === null ? [] : [`layout='${config.layout}'`]),\n ...assignments,\n ].join(' ');\n}\n\nfunction panelDetail(config: ScriptConfig): string {\n return [\n ...(config.theme === undefined ? [] : [`theme=${config.theme}`]),\n ...Object.entries(config.values).map(([item, alt]) => `${item}=${alt}`),\n ].join(' ');\n}\n\n// The row names what the key names — the theme plus the swaps it carries,\n// never a pick-matching derivation.\nfunction themeRow(config: ScriptConfig): readonly string[] {\n if (config.theme === undefined) {\n return [];\n }\n const swaps = Object.entries(config.values).map(\n ([item, alt]) => `+${item}=${alt}`,\n );\n return [`theme: ${[config.theme, ...swaps].join(' ')}`];\n}\n\ntype DriftFinding =\n | {\n readonly alt: string;\n readonly item: string;\n readonly kind: 'unknown-variant';\n }\n | { readonly item: string; readonly kind: 'unknown-item' };\n\nfunction findingText(finding: DriftFinding): string {\n return finding.kind === 'unknown-item'\n ? `unknown item '${finding.item}'`\n : `unknown variant '${finding.alt}' for '${finding.item}'`;\n}\n\nfunction driftFindings(config: ScriptConfig): readonly DriftFinding[] {\n const findings: DriftFinding[] = [];\n for (const item of keyItems(config)) {\n const entry = specFor(item);\n if (entry === undefined) {\n findings.push({ item, kind: 'unknown-item' });\n continue;\n }\n const alt = Object.hasOwn(config.values, item) ? config.values[item] : null;\n if (alt !== null && !entry.alternatives.includes(alt)) {\n findings.push({ alt, item, kind: 'unknown-variant' });\n }\n }\n return findings;\n}\n\n// The settings keys spawn plain `node`, not this CLI's runtime — PATH is the\n// one thing the paint needs that the CLI cannot vouch for.\nexport function nodeOnPath(pathVar: string): null | string {\n const found = pathVar\n .split(delimiter)\n .filter(dir => dir !== '')\n .map(dir => join(dir, 'node'))\n .find(existsSync);\n return found ?? null;\n}\n\nexport function rendererHash(bytes: Buffer): string {\n return createHash('sha256').update(bytes).digest('hex').slice(0, 12);\n}\n\ntype RendererState =\n | { readonly cli: string; readonly data: string; readonly kind: 'stale' }\n | { readonly hash: string; readonly kind: 'current' }\n | { readonly kind: 'missing' }\n | { readonly kind: 'no-bundle' };\n\nfunction rendererState(home: string): RendererState {\n if (!existsSync(BUNDLED_RENDERER)) {\n return { kind: 'no-bundle' };\n }\n const cli = readFileSync(BUNDLED_RENDERER);\n const dataFile = renderMjsPath(home);\n if (!existsSync(dataFile)) {\n return { kind: 'missing' };\n }\n const data = readFileSync(dataFile);\n const hash = rendererHash(data);\n return hash === rendererHash(cli)\n ? { hash, kind: 'current' }\n : { cli: rendererHash(cli), data: hash, kind: 'stale' };\n}\n\nfunction rendererRow(state: RendererState): string {\n if (state.kind === 'current') {\n return `renderer: current — ${state.hash}`;\n }\n // --force so the fix also completes on a home holding foreign keys.\n if (state.kind === 'stale') {\n return `renderer: stale — data ${state.data}, this CLI ${state.cli} — fix: rerun configure --force --theme classic`;\n }\n if (state.kind === 'no-bundle') {\n return 'renderer: this CLI ships no render.mjs — fix: rerun /lab to refresh the CLI';\n }\n return 'renderer: missing — fix: rerun configure --force --theme classic';\n}\n\nfunction configRow(findings: readonly DriftFinding[]): string {\n if (findings.length === 0) {\n return 'config: no drift';\n }\n return `config: drift — ${findings.map(findingText).join(', ')} — fix: rerun configure --theme classic`;\n}\n\nfunction backupRow(home: string): string {\n let backup: null | SettingsBackup;\n try {\n backup = readBackup(home);\n } catch {\n return `backup: unreadable — fix: delete ~/${DATA_DIR}/backup.json`;\n }\n if (backup === null) {\n return 'backup: absent';\n }\n const saved = SETTINGS_KEYS.filter(key => backup.keys[key] !== undefined);\n const parts = [\n ...(backup.createdFile ? ['created settings.json'] : []),\n saved.length > 0 ? `saved ${saved.join(', ')}` : 'saved nothing',\n ];\n return `backup: present — ${parts.join(', ')}`;\n}\n\nfunction ageText(ms: number): string {\n const minutes = Math.floor(ms / 60000);\n if (minutes < 1) {\n return `${Math.floor(ms / 1000)}s`;\n }\n if (minutes < 60) {\n return `${minutes}m`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n return `${Math.floor(hours / 24)}d`;\n}\n\nfunction captureText(home: string, surface: 'main' | 'tick'): string {\n try {\n const age = ageText(\n Date.now() - statSync(capturePath(home, surface)).mtimeMs,\n );\n return `${age} ago`;\n } catch {\n return 'absent';\n }\n}\n\nfunction capturesRow(home: string): string {\n const surfaces = (['main', 'tick'] as const).map(\n surface => `${surface} ${captureText(home, surface)}`,\n );\n return `captures: ${surfaces.join(', ')}`;\n}\n\nfunction settingsMembers(home: string): Record<string, unknown> {\n const file = join(home, '.claude', 'settings.json');\n const raw = readOrNull(file);\n return raw === null ? {} : parseSettings(file, raw);\n}\n\nexport function status(options: StatusOptions): StatusResult {\n const members = settingsMembers(options.home);\n const main = keyState('statusLine', members.statusLine);\n const subagent = keyState('subagentStatusLine', members.subagentStatusLine);\n const config = readKeyConfig(options.home);\n const panelConfig = parsePanelCommand(\n memberCommand(members.subagentStatusLine),\n );\n const findings = main.kind === 'ours' ? driftFindings(config) : [];\n const node = nodeOnPath(options.path ?? process.env.PATH ?? '');\n const renderer = rendererState(options.home);\n\n const rows = [\n node === null\n ? 'node: missing — fix: install node ≥ 18 from nodejs.org, then restart Claude Code'\n : `node: on PATH (${node})`,\n rendererRow(renderer),\n keyRow('statusLine', main, configDetail(config)),\n keyRow('subagentStatusLine', subagent, panelDetail(panelConfig)),\n ...(main.kind === 'ours' ? [configRow(findings), ...themeRow(config)] : []),\n backupRow(options.home),\n capturesRow(options.home),\n ];\n const healthy =\n node !== null &&\n renderer.kind === 'current' &&\n main.kind === 'ours' &&\n subagent.kind === 'ours' &&\n findings.length === 0;\n return { healthy, rows: [...rows, healthy ? 'healthy' : 'unhealthy'] };\n}\n","import type { PreviewRender, PreviewSurfaces } from './payloads.js';\nimport type { WizardDeps } from './wizard.js';\n\nimport { renderPreview } from './payloads.js';\n\nfunction nextKey(buffer: string): readonly [string, string] | undefined {\n if (buffer === '') {\n return undefined;\n }\n const head = buffer[0];\n if (head !== '\\x1b') {\n return [head, buffer.slice(1)];\n }\n if (buffer.length < 3) {\n return undefined;\n }\n if (buffer[1] === '[' && 'ABCD'.includes(buffer[2])) {\n return [buffer.slice(0, 3), buffer.slice(3)];\n }\n return ['', buffer.slice(1)];\n}\n\nexport function terminalDeps(\n input: NodeJS.ReadStream = process.stdin,\n output: NodeJS.WriteStream = process.stdout,\n): WizardDeps {\n return {\n async *readKeys(): AsyncGenerator<string> {\n const chunks: string[] = [];\n const waiters: (() => void)[] = [];\n const state = { closed: false };\n function notify(): void {\n for (const wake of waiters.splice(0)) {\n wake();\n }\n }\n function onData(chunk: Buffer): void {\n chunks.push(chunk.toString('utf8'));\n notify();\n }\n function onEnd(): void {\n state.closed = true;\n notify();\n }\n input.on('data', onData);\n input.on('end', onEnd);\n input.on('close', onEnd);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n input.resume();\n try {\n let buffer = '';\n for (;;) {\n for (\n let chunk = chunks.shift();\n chunk !== undefined;\n chunk = chunks.shift()\n ) {\n buffer += chunk;\n }\n while (buffer !== '') {\n const next = nextKey(buffer);\n if (next === undefined) {\n break;\n }\n buffer = next[1];\n if (next[0] !== '') {\n yield next[0];\n }\n }\n if (state.closed && chunks.length === 0) {\n return;\n }\n await new Promise<void>(resolve => {\n waiters.push(resolve);\n });\n }\n } finally {\n if (input.isTTY) {\n input.setRawMode(false);\n }\n input.pause();\n input.off('data', onData);\n input.off('end', onEnd);\n input.off('close', onEnd);\n }\n },\n render(frame: string): void {\n output.write(`\\x1b[2J\\x1b[H${frame}\\n`);\n },\n preview(bag: PreviewRender): PreviewSurfaces {\n return renderPreview(bag);\n },\n };\n}\n","import type { PreviewRender, PreviewSurfaces } from './payloads.js';\n\nimport { VERSION } from './cli.js';\nimport { configure, type ConfigureOptions } from './configure.js';\nimport { previewSources } from './payloads.js';\nimport { DEFAULT_PICKS, ITEM_IDS, specFor } from './render/items.js';\nimport { layoutItems } from './render/layout.js';\nimport { type ThemeName, THEMES } from './themes.js';\n\nexport interface WizardDeps {\n preview(bag: PreviewRender): PreviewSurfaces;\n readKeys(): AsyncGenerator<string>;\n render(frame: string): void;\n}\n\nexport type WizardOutcome = 'cancelled' | 'save-failed' | 'saved';\n\nexport interface WizardOptions {\n readonly force?: boolean;\n readonly home: string;\n readonly now: string;\n}\n\nconst WIDTHS: readonly number[] = [80, 120, 200];\ntype Pass = 'refine' | 'themes';\nconst THEME_KEYMAP = 'j/k focus · w width · enter pick · q cancel';\nconst REFINE_KEYMAP =\n 'j/k move · h/l variant · s none · t themes · w width · enter save · q cancel';\n// The one registry item no layout paints; its refine sample is the panel row.\nconst STYLE = 'style';\n\n// index.ts routes its interactive branch through this predicate — the entry\n// executes the CLI on import, so the gate's one door is a wizard export.\nexport function opensWizard(\n args: Pick<ConfigureOptions, 'layout' | 'theme' | 'variants'>,\n isTty: boolean,\n): boolean {\n return (\n isTty &&\n args.layout === undefined &&\n args.theme === undefined &&\n args.variants === undefined\n );\n}\n\nexport async function createWizard(\n options: WizardOptions,\n deps: WizardDeps,\n): Promise<WizardOutcome> {\n const names = Object.keys(THEMES) as ThemeName[];\n const sources = previewSources(options.home, Number(options.now));\n const tickBase = JSON.parse(sources.tick) as Record<string, unknown>;\n\n let pass: Pass = 'themes';\n let themeAt = 0;\n let picked: ThemeName = names[0];\n let base: Readonly<Record<string, string>> = DEFAULT_PICKS;\n let offered: {\n readonly alternatives: readonly string[];\n readonly item: string;\n }[] = [];\n const overrides = new Map<string, string>();\n let focus = 0;\n let widthAt = 0;\n\n function bag(\n theme: string,\n layout?: string,\n values: Readonly<Record<string, string>> = {},\n ): PreviewRender {\n return {\n home: options.home,\n ...(layout === undefined ? {} : { layout }),\n main: sources.main,\n now: options.now,\n tick: `${JSON.stringify(\n { ...tickBase, columns: WIDTHS[widthAt] },\n null,\n 2,\n )}\\n`,\n theme,\n values,\n width: WIDTHS[widthAt],\n };\n }\n\n function enterRefine(name: ThemeName): void {\n picked = name;\n base = { ...DEFAULT_PICKS, ...THEMES[name].variants };\n const items = layoutItems(THEMES[name].layout, ITEM_IDS);\n offered = [...new Set([...items, STYLE])].flatMap(item => {\n const entry = specFor(item);\n return entry === undefined\n ? []\n : [{ alternatives: entry.alternatives, item }];\n });\n overrides.clear();\n focus = 0;\n }\n\n function effectivePick(item: string): string {\n return overrides.get(item) ?? base[item];\n }\n\n // An override lives only while it differs from the theme's own pick — the\n // save records the name plus true differences, never a resolved draft.\n function setPick(item: string, alt: string): void {\n if (alt === base[item]) {\n overrides.delete(item);\n } else {\n overrides.set(item, alt);\n }\n }\n\n function cycle(delta: number): void {\n const focused = offered.at(focus);\n if (focused === undefined || focused.alternatives.length === 0) {\n return;\n }\n const alts = focused.alternatives;\n const at = alts.indexOf(effectivePick(focused.item));\n setPick(focused.item, alts[(at + delta + alts.length) % alts.length]);\n }\n\n function step(key: string): Pass {\n const down = key === '\\x1b[B' || key === 'j';\n const up = key === '\\x1b[A' || key === 'k';\n if (key === 'w') {\n widthAt = (widthAt + 1) % WIDTHS.length;\n } else if (pass === 'themes') {\n if (down) {\n themeAt = (themeAt + 1) % names.length;\n } else if (up) {\n themeAt = (themeAt + names.length - 1) % names.length;\n }\n } else if (key === 't') {\n return 'themes';\n } else if (down) {\n focus = (focus + 1) % offered.length;\n } else if (up) {\n focus = (focus + offered.length - 1) % offered.length;\n } else if (key === '\\x1b[C' || key === 'l') {\n cycle(1);\n } else if (key === '\\x1b[D' || key === 'h') {\n cycle(-1);\n } else if (key === 's') {\n const focused = offered.at(focus);\n if (focused?.alternatives.includes('none')) {\n setPick(focused.item, 'none');\n }\n }\n return pass;\n }\n\n function drawThemes(): void {\n const rows: string[] = [];\n let panel = '';\n for (let at = 0; at < names.length; at += 1) {\n const name = names[at];\n const theme = THEMES[name];\n const surfaces = deps.preview(bag(name));\n const focused = at === themeAt;\n if (focused) {\n panel = surfaces.panel;\n }\n rows.push(`${focused ? '>' : ' '} ${name}: ${theme.summary}`);\n rows.push(` ${surfaces.line}`);\n }\n deps.render(\n [\n `statusline configure · ${WIDTHS[widthAt]} columns (w cycles)`,\n '',\n ...rows,\n '',\n `panel ${panel}`,\n '',\n THEME_KEYMAP,\n ].join('\\n'),\n );\n }\n\n function drawRefine(): void {\n const focused = offered.at(focus);\n if (focused === undefined) {\n return;\n }\n const values = Object.fromEntries(overrides);\n const samples = focused.alternatives.map(alt => {\n const surfaces = deps.preview(\n bag(picked, focused.item === STYLE ? undefined : `{${focused.item}}`, {\n ...values,\n [focused.item]: alt,\n }),\n );\n return focused.item === STYLE ? surfaces.panel : surfaces.line;\n });\n const full = deps.preview(bag(picked, undefined, values));\n const rows = offered.map(\n (entry, at) =>\n `${at === focus ? '>' : ' '} ${entry.item.padEnd(9)} ${effectivePick(entry.item)}`,\n );\n deps.render(\n [\n `statusline configure · ${WIDTHS[widthAt]} columns (w cycles)`,\n '',\n ` ${full.line}`,\n ` panel ${full.panel}`,\n '',\n `${focused.item}: ${focused.alternatives.join(' | ')}`,\n ...focused.alternatives.map(\n (alt, at) =>\n ` ${alt === effectivePick(focused.item) ? '*' : ' '} ${samples[at]}`,\n ),\n '',\n ...rows,\n '',\n REFINE_KEYMAP,\n ].join('\\n'),\n );\n }\n\n function draw(): void {\n if (pass === 'themes') {\n drawThemes();\n } else {\n drawRefine();\n }\n }\n\n function finish(): WizardOutcome {\n try {\n configure({\n force: options.force,\n home: options.home,\n theme: picked,\n variants: Object.fromEntries(overrides),\n });\n } catch (e) {\n deps.render(\n `save failed: ${(e as Error).message}\\nfix it and rerun: npx -y @v1nvn/statusline@${VERSION} configure\\n`,\n );\n return 'save-failed';\n }\n deps.render('saved — live on the next paint\\n');\n return 'saved';\n }\n\n try {\n const keys = deps.readKeys();\n draw();\n for await (const key of keys) {\n if (key === '\\r') {\n if (pass === 'themes') {\n enterRefine(names[themeAt]);\n pass = 'refine';\n draw();\n continue;\n }\n return finish();\n }\n if (key === 'q' || key === '\\x03') {\n break;\n }\n pass = step(key);\n draw();\n }\n deps.render('cancelled — nothing written\\n');\n return 'cancelled';\n } finally {\n sources.cleanup();\n }\n}\n","import { printUsageAndExit } from '@v1nvn/agentic-core';\n\nimport { catalog } from './catalog.js';\nimport { buildProgram, parseArgs, subcommandHelp, VERSION } from './cli.js';\nimport { configure } from './configure.js';\nimport { preview } from './preview.js';\nimport { restore } from './restore.js';\nimport { status } from './status.js';\nimport { terminalDeps } from './wizard-tui.js';\nimport { createWizard, opensWizard } from './wizard.js';\n\nconst parsed =\n parseArgs(process.argv.slice(2)) ?? printUsageAndExit(buildProgram());\n\nfunction homeOf(flag: string | undefined): string {\n const home = flag ?? process.env.HOME;\n if (home === undefined || home === '') {\n throw new Error('no home to operate on: set $HOME or pass --home');\n }\n return home;\n}\n\nfunction run(job: () => void): void {\n try {\n job();\n } catch (e) {\n console.error((e as Error).message);\n process.exitCode = 1;\n }\n}\n\nif (parsed.help !== undefined) {\n console.log(subcommandHelp(parsed.help));\n} else if (parsed.version) {\n console.log(VERSION);\n} else if (parsed.command === 'catalog') {\n run(() => {\n console.log(\n catalog({\n home: homeOf(parsed.home),\n items: parsed.items,\n themes: parsed.themes,\n }),\n );\n });\n} else if (parsed.command === 'configure') {\n const home = homeOf(parsed.home);\n if (opensWizard(parsed, process.stdin.isTTY)) {\n const outcome = await createWizard(\n {\n force: parsed.force,\n home,\n now: String(Math.floor(Date.now() / 1000)),\n },\n terminalDeps(),\n );\n if (outcome === 'save-failed') {\n process.exitCode = 1;\n }\n } else {\n run(() => {\n configure({\n force: parsed.force,\n home,\n layout: parsed.layout,\n theme: parsed.theme,\n variants: parsed.variants,\n });\n console.log('configured — live on the next paint');\n });\n }\n} else if (parsed.command === 'preview') {\n run(() => {\n console.log(\n preview({\n home: homeOf(parsed.home),\n layout: parsed.layout,\n now: String(Math.floor(Date.now() / 1000)),\n plain: parsed.plain,\n theme: parsed.theme,\n variants: parsed.variants,\n }),\n );\n });\n} else if (parsed.command === 'restore') {\n run(() => {\n const result = restore({\n dryRun: parsed.dryRun,\n force: parsed.force,\n home: homeOf(parsed.home),\n });\n console.log(result.text);\n });\n} else if (parsed.command === 'status') {\n run(() => {\n const result = status({ home: homeOf(parsed.home) });\n console.log(result.rows.join('\\n'));\n process.exitCode = result.healthy ? 0 : 1;\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@v1nvn/statusline",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
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.29.0",
38
+ "@v1nvn/agentic-core": "^0.30.0",
39
39
  "commander": "^15.0.0"
40
40
  },
41
41
  "devDependencies": {