@promptctl/cc-candybar 1.116.1 → 1.117.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
@@ -36,7 +36,7 @@ That single command (re-run it any time to update to the latest release):
36
36
  2. On macOS, builds `~/Applications/CCCandybarURLHandler.app` and registers the `cc-candybar://` URL scheme with Launch Services.
37
37
  3. Writes the staged `bin/cc-candybar` path as the statusline command into `~/.claude/settings.json` (skipped with a notice if you've customized the command; `--force` overwrites).
38
38
 
39
- Restart Claude Code. The statusline appears with the bundled default layout — an identity row (directory, gitaculous) over a status row (model, context, ceiling, autocompact, cacheTimer, block, weekly, activity). On macOS, Cmd-clicking clickable cells fires `cc-candybar://` URL verbs that the daemon dispatches (via the URL handler registered in step 2).
39
+ Restart Claude Code. The statusline appears with the bundled default layout — an identity row (directory, gitaculous, ticket) over a status row (model, context, ceiling, autocompact, cacheTimer, block, weekly, activity). On macOS, Cmd-clicking clickable cells fires `cc-candybar://` URL verbs that the daemon dispatches (via the URL handler registered in step 2).
40
40
 
41
41
  ## Customization
42
42
 
@@ -119,6 +119,7 @@ These are the segment names `DEFAULT_DSL_CONFIG` declares, each available to a u
119
119
  | `ceiling` | `⌈` the [memento](https://github.com/promptctl/memento) context ceiling this session hands off at; `−`/`+` move it by 100K, `∞` lifts it, `↺` drops the session's own setting (memento's `ceiling set/clear session`). Placed beside `context` | when memento is installed |
120
120
  | `autocompact` | `⇲` Claude Code's auto-compact window — `auto`, or the tokens `/autocompact` last set; `−`/`+` move it by 100K up to the model's context window, `↺` returns it to `auto`. Each click types `/autocompact` into the session, so the controls show only inside tmux. Placed beside `ceiling` | always |
121
121
  | `metrics` | `Δ` last response time, `⧖` response time, `⧗` session duration, `◆` message count, lines changed | when any of those exist |
122
+ | `ticket` | `🎫` the lit ticket this session started with `lit start` (click copies the id); the `▸` expands it to the workflow phase (`prep`, `impl`, `review`, `groom`, `handoff`) and the epic's `done/total` once lit has printed it | after a `lit start` in this session |
122
123
  | `activity` | `⌘` the slash command that opened the turn, `☐` the in-progress todo with its position, `⟳` tools in flight and `✓` tools finished this turn | while the session is doing something |
123
124
 
124
125
  Each segment is a DSL declaration with a `template` (text + interpolation + style functions), a `bg`/`fg` palette spec, and optional `when` predicate. Templates compose freely — every formatter in the bundled function library (`formatCost`, `formatTokens`, `formatLongTimeRemaining`, `budgetStatus`, `link`, `urlEncode`, the sprig string/list/dict library, …) is available in every segment.
package/dist/index.mjs CHANGED
@@ -163,7 +163,7 @@ Config tooling:
163
163
  `)||null}function lE(e){switch(e.kind){case`file`:case`default`:return e.unchecked.map(e=>`Config location could not be checked: ${e.path} — ${e.error}`);case`missing`:return[`Config file not found: ${e.path} — rendering the bundled default until it appears`];case`unreadable`:return[`Config file could not be read: ${e.path} — ${e.error} — rendering the bundled default until it can be`]}}function uE(e,t,n){let i=new Map;for(let a of iE(e,t,n)){if(nE(a)!==`present`)continue;let e=r.realpathSync(c.dirname(a));i.has(e)||i.set(e,a)}return[...i.values()].slice(1)}function dE(e,t){let n=iE(e,t).filter(e=>nE(e)===`present`),r=new Map;for(let e of n){let t=c.dirname(e),n=c.basename(e).replace(/\.(json5|json)$/,``),i=c.join(t,n);r.has(i)||r.set(i,[]),r.get(i).push(e)}let i=[...r.values()].filter(e=>e.length>1);return i.length===0?null:`config-extension collision: ${i.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function fE(e,t,n){return e===null?{...mE,config:Hc(mE.raw,t)}:pE(e,r.readFileSync(e,`utf-8`),t,n)}function pE(e,t,n,r){let i={source:t,..._E(e,t,r,Ku(n))};return{...i,config:Hc(i.raw,n)}}const mE={raw:{},source:``,warnings:[]};function hE({config:e,raw:t,source:n},r=`<config>`,i=new Set($a())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(MT(o,e,t),$T(o,e),a.length>0)throw new Cs(r,a);let s=q_(e,a);if(a.length>0)throw new Cs(r,a);return kw(YC(s))}function gE(e,t,n=new Set($a()),r=vE){return _E(e,t,n,r).raw}function _E(e,t,n,r){let i=yE(e,t),a=Es(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set($a()),groups:[]};if(!ic(i))throw new Cs(e,[{path:``,message:`Config root must be an object, got ${ac(i)}`}],o);let l=bE(c,i,r);if(s.length>0)throw new Cs(e,s,o);return{raw:l,warnings:o}}const vE=new Set;function yE(e,t){try{return rt.default.parse(t)}catch(t){let n=t;throw new Cs(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function bE(e,t,n){for(let n of Object.keys(t))xE.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...xE].join(`, `)}`,line:G(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Dl(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=ql(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=qu(e,t.segments,n)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported — use "root" with the A-grammar instead.
164
164
  Replace: layout: [["seg1", "seg2"], ["seg3"]]
165
165
  With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
166
- Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=gd(e,`root`,t.root)),t.actions!==void 0&&(r.actions=Nw(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" — move the block under styles: { … } (and globals.look to globals.style)`,line:G(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=CT(e,t.styles)),t.presets!==void 0&&(r.presets=TT(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Al(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=ET(e,t.helpers)),wd(e,r),G_(e,r),sv(e,r),Au(e,r,Eu,`the global settings menu`),r}const xE=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function SE(e){let t=OE(e.termCols),n=OE(e.termRows),r=kE(e.ssh),i=EE(e.tmux),a=TE(e.configEnv),o=wE(e.claudeConfigDir),s=CE(e.mementoEnv);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o},...s!==void 0&&{mementoEnv:s}}}function CE(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=Ze.filter(e=>t[e]!==void 0);return n.every(e=>wE(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function wE(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function TE(e){return typeof e==`string`&&e!==``?rE(e):void 0}function EE(e){if(e===null)return null;if(typeof e!=`object`)return;let{socket:t,pane:n,truecolor:r}=e;if(!(typeof t!=`string`||t===``)&&!(typeof n!=`string`||n===``)&&!(r!==null&&(typeof r!=`string`||r===``)))return{socket:t,pane:n,truecolor:r}}const DE=1e4;function OE(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>DE?DE:t}function kE(e){return typeof e==`boolean`?e:void 0}function AE(e){return typeof e==`string`&&e!==``&&e.length<=64?e:null}var jE=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function ME(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function NE(e,t){let n=Buffer.alloc(0);return function(r){for(n=Buffer.concat([n,r]);n.length>=4;){let r=n.readUInt32BE(0);if(r>16777216){t(new jE(`frame too large: ${r}`));return}if(n.length<4+r)return;let i=n.subarray(4,4+r);n=n.subarray(4+r);try{e(JSON.parse(i.toString(`utf8`)))}catch(e){let n=new jE(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function PE(e,t,n){return new Promise((r,i)=>{let a=!1,o=t=>{if(!a){a=!0,clearTimeout(s),e.removeAllListeners();try{t()}catch{}}},s=setTimeout(()=>{o(()=>{e.destroy(),i(Error(`TIMEOUT`))})},n),c=NE(e=>o(()=>r(e)),e=>o(()=>i(e)));e.on(`data`,c),e.on(`error`,e=>o(()=>i(e))),e.on(`close`,()=>o(()=>i(Error(`socket closed before response`)))),e.write(ME(t))})}async function FE(e,t,n){let r=null;try{r=await BE(Le(),t.connectMs);let i=await PE(r,{v:3,...e},t.budgetMs);return RE(e.kind,i,n)}catch(e){return zE(e)}finally{r&&r.destroy()}}function IE(e,t){return typeof e==`string`?e:t}function LE(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function RE(e,t,n){let r=t;if(r.ok===!0){let r=n(t);return r===void 0?{kind:`permanent`,cause:`malformed_response`,message:`ok response without payload for "${e}" request`}:{kind:`ok`,value:r}}let i=IE(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:LE(r.daemonV)};case`TIMEOUT`:return{kind:`transient`,cause:`timeout`,message:i};case`BAD_REQUEST`:return{kind:`permanent`,cause:`bad_request`,message:i};case`RENDER_FAILED`:return{kind:`permanent`,cause:`render_failed`,message:i};default:return{kind:`permanent`,cause:`malformed_response`,message:`unknown error code: ${String(r.code)}`}}}function zE(e){if(e instanceof jE||e instanceof SyntaxError)return{kind:`permanent`,cause:`malformed_response`,message:e instanceof Error?e.message:String(e)};let t=e instanceof Error?e.message:String(e);return t===`CONNECT_TIMEOUT`||t===`TIMEOUT`?{kind:`transient`,cause:`timeout`,message:t}:t.includes(`ECONNREFUSED`)||t.includes(`ENOENT`)||t.includes(`ENOTSOCK`)?{kind:`transient`,cause:`unreachable`,message:t}:{kind:`transient`,cause:`io_error`,message:t}}function BE(e,t){return new Promise((n,r)=>{let i=b.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function VE(e){if(e.kind===`transient`)return`daemon unavailable (${e.cause}: ${e.message})\nHint: daemon may not be running. Run \`cc-candybar\` once to spawn it.`;switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`daemon protocol mismatch (client v${e.clientV} ≠ daemon ${t})`}case`bad_request`:case`render_failed`:case`malformed_response`:return`daemon error (${e.cause}): ${e.message}`}}const HE=`1.116.1`,UE={connectMs:50,budgetMs:150},WE={connectMs:50,budgetMs:200};function GE(e){let t=e.output;return typeof t==`string`?t:void 0}function KE(e,t,n,r){return FE({kind:`render`,hookData:e,args:t,cwd:n,...r},UE,GE)}function qE(e,t){return FE({kind:`click`,verb:e,value:t,clientVersion:HE},WE,GE)}function JE(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable — ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
166
+ Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=gd(e,`root`,t.root)),t.actions!==void 0&&(r.actions=Nw(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" — move the block under styles: { … } (and globals.look to globals.style)`,line:G(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=CT(e,t.styles)),t.presets!==void 0&&(r.presets=TT(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Al(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=ET(e,t.helpers)),wd(e,r),G_(e,r),sv(e,r),Au(e,r,Eu,`the global settings menu`),r}const xE=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function SE(e){let t=OE(e.termCols),n=OE(e.termRows),r=kE(e.ssh),i=EE(e.tmux),a=TE(e.configEnv),o=wE(e.claudeConfigDir),s=CE(e.mementoEnv);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o},...s!==void 0&&{mementoEnv:s}}}function CE(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=Ze.filter(e=>t[e]!==void 0);return n.every(e=>wE(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function wE(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function TE(e){return typeof e==`string`&&e!==``?rE(e):void 0}function EE(e){if(e===null)return null;if(typeof e!=`object`)return;let{socket:t,pane:n,truecolor:r}=e;if(!(typeof t!=`string`||t===``)&&!(typeof n!=`string`||n===``)&&!(r!==null&&(typeof r!=`string`||r===``)))return{socket:t,pane:n,truecolor:r}}const DE=1e4;function OE(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>DE?DE:t}function kE(e){return typeof e==`boolean`?e:void 0}function AE(e){return typeof e==`string`&&e!==``&&e.length<=64?e:null}var jE=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function ME(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function NE(e,t){let n=Buffer.alloc(0);return function(r){for(n=Buffer.concat([n,r]);n.length>=4;){let r=n.readUInt32BE(0);if(r>16777216){t(new jE(`frame too large: ${r}`));return}if(n.length<4+r)return;let i=n.subarray(4,4+r);n=n.subarray(4+r);try{e(JSON.parse(i.toString(`utf8`)))}catch(e){let n=new jE(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function PE(e,t,n){return new Promise((r,i)=>{let a=!1,o=t=>{if(!a){a=!0,clearTimeout(s),e.removeAllListeners();try{t()}catch{}}},s=setTimeout(()=>{o(()=>{e.destroy(),i(Error(`TIMEOUT`))})},n),c=NE(e=>o(()=>r(e)),e=>o(()=>i(e)));e.on(`data`,c),e.on(`error`,e=>o(()=>i(e))),e.on(`close`,()=>o(()=>i(Error(`socket closed before response`)))),e.write(ME(t))})}async function FE(e,t,n){let r=null;try{r=await BE(Le(),t.connectMs);let i=await PE(r,{v:3,...e},t.budgetMs);return RE(e.kind,i,n)}catch(e){return zE(e)}finally{r&&r.destroy()}}function IE(e,t){return typeof e==`string`?e:t}function LE(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function RE(e,t,n){let r=t;if(r.ok===!0){let r=n(t);return r===void 0?{kind:`permanent`,cause:`malformed_response`,message:`ok response without payload for "${e}" request`}:{kind:`ok`,value:r}}let i=IE(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:LE(r.daemonV)};case`TIMEOUT`:return{kind:`transient`,cause:`timeout`,message:i};case`BAD_REQUEST`:return{kind:`permanent`,cause:`bad_request`,message:i};case`RENDER_FAILED`:return{kind:`permanent`,cause:`render_failed`,message:i};default:return{kind:`permanent`,cause:`malformed_response`,message:`unknown error code: ${String(r.code)}`}}}function zE(e){if(e instanceof jE||e instanceof SyntaxError)return{kind:`permanent`,cause:`malformed_response`,message:e instanceof Error?e.message:String(e)};let t=e instanceof Error?e.message:String(e);return t===`CONNECT_TIMEOUT`||t===`TIMEOUT`?{kind:`transient`,cause:`timeout`,message:t}:t.includes(`ECONNREFUSED`)||t.includes(`ENOENT`)||t.includes(`ENOTSOCK`)?{kind:`transient`,cause:`unreachable`,message:t}:{kind:`transient`,cause:`io_error`,message:t}}function BE(e,t){return new Promise((n,r)=>{let i=b.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function VE(e){if(e.kind===`transient`)return`daemon unavailable (${e.cause}: ${e.message})\nHint: daemon may not be running. Run \`cc-candybar\` once to spawn it.`;switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`daemon protocol mismatch (client v${e.clientV} ≠ daemon ${t})`}case`bad_request`:case`render_failed`:case`malformed_response`:return`daemon error (${e.cause}): ${e.message}`}}const HE=`1.117.0`,UE={connectMs:50,budgetMs:150},WE={connectMs:50,budgetMs:200};function GE(e){let t=e.output;return typeof t==`string`?t:void 0}function KE(e,t,n,r){return FE({kind:`render`,hookData:e,args:t,cwd:n,...r},UE,GE)}function qE(e,t){return FE({kind:`click`,verb:e,value:t,clientVersion:HE},WE,GE)}function JE(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable — ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
167
167
  `)}function YE(e,t){return e===`darwin`?[XE(`footprint`,[`-p`,String(t)]),XE(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[ZE(`/proc/self/smaps_rollup`),ZE(`/proc/self/status`)]:[]}function XE(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=Ae({bin:e,args:[...t],timeoutMs:5e3,category:`limits.memory-report`});return n.ok?n.stdout.trim().length>0?{kind:`text`,text:n.stdout}:{kind:`unavailable`,reason:`exited 0 but printed nothing`}:{kind:`unavailable`,reason:`${n.reason}${n.error===void 0?``:`: ${n.error}`}${QE(n.stderr)}`}}}}function ZE(e){return{name:e,read:()=>{try{let t=r.readFileSync(e,`utf8`);return t.trim().length>0?{kind:`text`,text:t}:{kind:`unavailable`,reason:`empty file`}}catch(e){return{kind:`unavailable`,reason:e.message}}}}}function QE(e){let t=e.split(`
168
168
  `).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const $E=`CC_CANDYBAR_RSS_LIMIT_MB`;function eD(e){let t=e[$E];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${$E} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function tD(e){return eD(e)*2}const nD=1024*1024;function rD(e){return eD(e)*nD}const iD={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function aD(e,t,n){let{prefix:r,suffix:i}=iD[t];return c.join(e,`${r}${n}${i}`)}function oD(e){for(let t of Object.keys(iD)){let{prefix:n,suffix:r}=iD[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function sD(e){let t=e.rssLimitBytes??512*nD,n=e.snapshotsKeep??3,r=!1;function i(){if(r)return!0;let{rss:i,heapTotal:a}=e.memoryBytes();if(i<=t)return!1;r=!0,e.log(`warn`,`RSS ${i} > limit ${t} (v8 heap ${a}); recording memory then shutting down`);let o=`${new Date(e.now()).toISOString().replace(/[:.]/g,`-`)}-${e.pid}`;return cD(e.log,`memory report`,()=>{let t=aD(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),cD(e.log,`heap snapshot`,()=>{let t=aD(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),cD(e.log,`artifact rotation`,()=>{uD(e.listArtifacts(),n,e.removeFile)}),e.shutdown(0),!0}function a(){let{rss:n,heapTotal:r}=e.memoryBytes();return n>t*.75?`rss ${n} approaching limit ${t} (v8 heap ${r})`:null}function o(e=6e4){let t=setInterval(()=>{i()},e);return t.unref(),{disarm:()=>clearInterval(t)}}return{checkRss:i,describeNextRestart:a,arm:o}}function cD(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function lD(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=oD(t);if(n===null)return t;let{prefix:r,suffix:i}=iD[n];return t.slice(r.length,t.length-i.length)}function uD(e,t,n){let r=new Map;for(let t of e){let e=lD(t),n=r.get(e);n===void 0?r.set(e,[t]):n.push(t)}let i=[...r.keys()].sort((e,t)=>t.localeCompare(e));for(let e of i.slice(t))for(let t of r.get(e)??[])try{n(t)}catch{}}function dD(e,t,n={}){let i=Ie();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Z,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>JE(YE(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>ne.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>oD(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function fD(e={}){if(OD()!==null)return;let n=e.spawn??kD,r=TD();if(r.kind===`contended`){let e=mD();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),pD(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),pD(n);return}try{pD(n)}finally{DD()}}function pD(e){xD()&&hD(e)}function mD(){try{let e=r.statSync(Ke());return Date.now()-e.mtimeMs}catch{return null}}function hD(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
169
169
  `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function gD(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function _D(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function vD(e){try{let t=r.readFileSync(e,`utf8`).trim(),n=Number(t);return!Number.isInteger(n)||n<0?0:Math.min(n,5)}catch{return 0}}function yD(e,n){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,String(n),{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.backoff: ${e.message}\n`)}}function bD(){try{r.unlinkSync(Je())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function xD(){let e=qe(),n=Je(),r=vD(n),i=gD(SD(e),_D(r));return i.kind===`deny`?!1:(i.kind===`allow-future-garbage`&&t.stderr.write(`cc-candybar: spawn.cooldown mtime is ${i.futureMs}ms in the future — ignoring and spawning\n`),CD(e),yD(n,Math.min(r+1,5)),!0)}function SD(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function CD(e){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,`${t.pid} ${Date.now()}\n`,{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.cooldown: ${e.message}\n`)}}let wD=null;function TD(){let e=Ke();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return wD={fd:n,path:e},{kind:`held`}}catch(t){let n=t.code;if(n!==`EEXIST`)return{kind:`error`,reason:`openSync(${e}): ${n??t.message}`}}if(!ED(e))return{kind:`contended`};try{r.unlinkSync(e)}catch(e){if(e.code!==`ENOENT`)return{kind:`error`,reason:`unlink stale spawn.lock: ${e.message}`}}}return{kind:`contended`}}function ED(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function DD(){if(!wD)return;let{fd:e,path:t}=wD;wD=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function OD(){try{return r.mkdirSync(Ie(),{recursive:!0}),null}catch(e){return`mkdir ${Ie()}: ${e.message}`}}function kD(){let e=t.execPath,n=t.argv[1];return n?k({bin:e,args:[`--max-old-space-size=${tD(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const AD=`cc-candybar`,jD=`dispatch`,MD=`set-state`,ND=`step-state`,PD=`copy`,FD=`open-vscode`,ID=`toolbar-toggle`,LD=`show-config-error`,RD=`show-config-warning`,zD=`set-config`,BD=`step-config`,VD=`save`,HD=`save-preset`,UD=`delete-preset`,WD=`reset-config`,GD=`apply-layout-op`,KD=`undo`,qD=`redo`,JD=`back`,YD=`rewind`,XD=`apply-update`,ZD=`doctor-run`,QD=`doctor-fix`,$D=`doctor-probe`,eO=`ceiling`,tO=`slash`;function nO(e){return e.map(encodeURIComponent).join(`/`)}function rO(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function iO(e){return`${AD}://${jD}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${nO(e.args)}`)}`).join(`&`)}`}function aO(e){return new ie(e).getAll(`e`).map(lO)}const oO=new Set([MD,WD]);function sO(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&cO(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function cO(e,t){if(e.verb!==t.verb||!oO.has(e.verb))return;let[n,r]=[lO(e.value),lO(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function lO(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const uO=/^[A-Za-z0-9_./,:@%+-][A-Za-z0-9_./,:@%+=-]*$/;function dO(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function fO(e){return uO.test(e)?e:dO(e)}const pO=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function mO(e){let t=pO.exec(e);return t?{kind:`ok`,value:[Number(t[1]),Number(t[2]),Number(t[3])]}:{kind:`failed`,reason:`"${e}" is not a release version (expected MAJOR.MINOR.PATCH)`}}function hO(e){return e.join(`.`)}function gO([e,t,n],[r,i,a]){return e-r||t-i||n-a}const _O=`@promptctl/cc-candybar`;async function vO(e,t,n){let r=`${n}/-/package/${encodeURIComponent(e)}/dist-tags`;try{let e=await t(r,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return X(`registry responded ${e.status} for ${r}`);let n=await e.json();return typeof n.latest==`string`?mO(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function yO(e,t){let n=mO(e);if(n.kind===`failed`)return{kind:`unchecked`,installed:e,reason:n.reason};switch(t.kind){case`failed`:return{kind:`unchecked`,installed:e,reason:t.reason};case`absent`:return{kind:`unchecked`,installed:e,reason:"the registry lists no `latest` dist-tag"};case`ok`:{let e=gO(n.value,t.value);return e<0?{kind:`stale`,installed:n.value,latest:t.value}:e>0?{kind:`ahead`,installed:n.value,latest:t.value}:{kind:`current`,installed:n.value}}}}function bO(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${hO(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${hO(t.installed)} is newer than the registry's latest release (${hO(t.latest)}): an unpublished build.\n`};case`stale`:{let n=hO(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${hO(t.installed)} was staged, but the latest release is ${n}.\n pnpm's release-age gate (minimumReleaseAge) and its dlx cache can both\n resolve \`@latest\` to an older release without saying so.\n To install ${n} now, name it explicitly:\n pnpm dlx ${e}@${n} install\n`}}case`unchecked`:return{stream:`stderr`,text:`⚠ Could not check for a cc-candybar release newer than ${t.installed} (${t.reason}); the registry check was skipped.\n`}}}const xO=`CCCandybarURLHandler`,SO=[],CO={"darwin-arm64":`@promptctl/cc-candybar-darwin-arm64`,"darwin-x64":`@promptctl/cc-candybar-darwin-x64`,"linux-x64":`@promptctl/cc-candybar-linux-x64`,"linux-arm64":`@promptctl/cc-candybar-linux-arm64`};function wO(e,t){return[e,...t].map(fO).join(` `)}function TO(){return c.join(m.homedir(),`Applications`,`${xO}.app`)}function EO(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function DO(){if(process.platform===`darwin`)return c.join(m.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(m.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function OO(){return c.join(DO(),`bin`,`cc-candybar`)}function kO(){return c.join(DO(),`dist`,`index.mjs`)}function AO(e,t){return[`on open location L`,`\tdo shell script "'${e.replace(/"/g,`\\"`)}' '${t.replace(/"/g,`\\"`)}' url-handle " & quoted form of L`,`end open location`].join(`
@@ -177,7 +177,7 @@ Config tooling:
177
177
  `))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function Mk(e){return Math.min(20,e??20)}const Nk={heading:`ERROR`,glyph:`⚠`,colors:Sk},Pk={heading:`WARNING`,glyph:`⚠`,colors:Ck},Fk={heading:`UPDATE`,glyph:`⬆`,colors:Ck};function Ik(e,t){return{text:_k(e),link:t}}function Lk(e,t,n){let[r,...i]=[Rk(e,Nk,LD),t,Rk(n,Pk,RD)].flat();return r===void 0?null:{channels:[r,...i]}}function Rk(e,t,n){let r=iO([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>Ik(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function zk(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
178
178
  `)}function Bk(e,t,n,r){if(t===null)return e;let i=Vk(r),a=t.channels.flatMap(e=>Hk(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[Uk(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
179
179
  `);return e?`${l}\n${e}`:l}function Vk(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function Hk(e,t){let n=new V({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Ht(Math.max(2,t.width-1)),i=(e,t)=>new W(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>jk([i(o===0?e.severity.glyph:` `,n.withLink(a[0].link)),...a.flatMap(e=>{let t=n.withLink(e.link);return e.text.split(` `).flatMap(e=>Kt(e,r)).map(e=>i(e,t))})],t).split(`
180
- `))}function Uk(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new V({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new W(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(E(a.path).href)):c(`full text unavailable: ${_k(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(_k(o),s.withLink(E(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=W.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,jk([m],r)}const Wk=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function Gk(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function Kk(e,t){return r.readdirSync(t).filter(Wk).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?Kk(e,i):[[c.relative(e,i).split(c.sep).join(`/`),Gk(i,a)]]})}function qk(e){let t=ae.createHash(`sha256`);for(let[n,r]of Kk(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const Jk=e=>e.slice(0,7);function Yk(e){return c.dirname(c.dirname(e))}function Xk(){return{version:HE,digest:`6aab4cafab526bc9a995f62e645d81659bf0635a4bb0863a9785933e26e205bc`}}function Zk(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function Qk(e,t){try{let n=Yk(T(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=qk(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:Zk(n),digest:o},running:a}}catch(e){return{kind:`unchecked`,reason:e.message}}}var $=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function $k(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function eA(e){let t=e.split(`:`);return t[0]===`remove`&&t.length===2&&t[1]?{op:`remove`,target:t[1]}:t[0]===`insert`&&t.length===4&&t[1]&&t[2]&&(t[3]===`before`||t[3]===`after`)?{op:`insert`,segment:t[1],anchor:t[2],relation:t[3]}:null}function tA(e,t,n){let r=Ms(e,new Set(n.map(js).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const nA=/^-?\d+$/;function rA(e,t,n=`set-state`){let r=e.filter(e=>e.includes(`/`));if(r.length>0)throw Error(`makeAllowListValidator(${t}): values contain "/" — the ${n} wire shape splits values on "/" so slash-bearing options cannot be addressed. Offending values: ${r.join(`, `)}`);if(e.includes(``))throw Error(`makeAllowListValidator(${t}): empty string is not a writable option — the validator rejects empty input before the allow-list check, so an "" in the allowed list could be rendered but never delivered. Remove "" from the allowed list.`);let i=new Set(e),a=[...e];return e=>e?i.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown ${t} "${e}" (have: ${a.join(`, `)})`}:{ok:!1,reason:`${t} value is required`}}function iA(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!nA.test(t))return{ok:!1,reason:`${e} must be an integer, got "${t}"`};let n=t[0]===`-`,r=(n?t.slice(1):t).replace(/^0+/,``);return r===``?{ok:!0,value:`0`}:{ok:!0,value:n?`-${r}`:r}}}function aA(e,t,n){return r=>r?nA.test(r)?{ok:!0,value:String(Math.max(e,Math.min(t,parseInt(r,10))))}:{ok:!1,reason:`${n} must be an integer, got "${r}"`}:{ok:!1,reason:`${n} value is required`}}function oA(e,t,n=`state`){let r=t.filter(e=>e.kind===`range`),i=t.some(e=>e.kind===`int`),a=t.flatMap(e=>e.kind===`allow-list`?e.allowed:[]);if(r.length===0&&!i)return{kind:`allow-list`,allowed:[...new Set(a)]};let o=a.filter(e=>!nA.test(e));if(o.length>0)throw Error(`${n} action table: key "${e}" is an integer spec (a paged cursor or a bounded value) but a click writes non-integer value(s) to it (${o.join(`, `)}). A ${n} key has one key shape — point that click at a distinct key, or write an integer.`);if(i&&r.length>0)throw Error(`${n} action table: key "${e}" is declared as both a paged cursor (int) and a bounded value (range) — a ${n} key has one key shape. Use distinct keys.`);if(r.length>0){let t=Math.min(...r.map(e=>e.min)),i=Math.max(...r.map(e=>e.max)),o=a.filter(e=>{let n=parseInt(e,10);return n<t||n>i});if(o.length>0)throw Error(`${n} action table: key "${e}" is a bounded range [${t},${i}] but a click writes out-of-range value(s) to it (${o.join(`, `)}). The range gate would clamp them, storing a different value than the click renders — write an in-range integer, or point that click at a distinct key.`);return{kind:`range`,min:t,max:i}}return{kind:`int`}}function sA(e){return e===`config`?`set-config`:`set-state`}function cA(e,t,n){return t.kind===`int`?iA(`menu page "${e}"`):t.kind===`range`?aA(t.min,t.max,`${n} stepper "${e}"`):rA(t.allowed,`${n} "${e}"`,sA(n))}function lA(e,t=`state`){let n=new Map;for(let{key:t,spec:r}of e){let e=n.get(t);e?e.push(r):n.set(t,[r])}return[...n].map(([e,n])=>({key:e,spec:oA(e,n,t)}))}function uA(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of lA(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,cA(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function dA(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};uA(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=uA(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const fA=dA({},`config`,yA);function pA(e,t){return fA.register(e,t)}function mA(e){return fA.gateFor(e)}function hA(e,t){return`persist`in e?`to`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:dx(e.from,t).members}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[$k({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[$k({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:dx(e.insertSegmentFrom,t).members.map(t=>$k({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function gA(e,t){let n=Fl(e).get(t);return n===void 0?null:String(n)}function _A(e){let t=new Set;for(let n of Object.values(e.actions)){`reset`in n&&t.add(n.reset);let e=`persist`in n?Tx(n.persist):null;e?.scope===`preset-root`&&t.add(Cx(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function vA(e){let t=dw(e);return[..._A(e),...Object.values(e.actions).flatMap(e=>hA(e,t))]}function yA(e){return lA(vA(e),`config`)}const bA=pS(`commands.`),xA=ES(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),SA=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,CA=`{{ \$dir := .current_dir }}{{ if and (ne .home "") (or (eq .home .current_dir) (hasPrefix (printf "%s/" .home) .current_dir)) }}{{ \$dir = printf "~%s" (trimPrefix .home .current_dir) }}{{ else }}{{ if or (eq .project_dir .current_dir) (hasPrefix (printf "%s/" .project_dir) .current_dir) }}{{ $dir = ternary (${SA}) (basename .project_dir) (ne (${SA}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,wA=`{{ ${Rx} }}`,TA={min:0,max:100,step:5},EA={warnAt:{label:`warning at %`,domain:TA,default:50},errorAt:{label:`error at %`,domain:{...TA,atLeast:`warnAt`},default:80}};function DA(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:TA,default:80}}}const OA={globals:{palette:`tokyo-night`},variables:{...bA.variables,...Lb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project. Click to copy the full path.",template:CA},model:{group:`model-context`,description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:wA,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:nS(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:bA.template,when:bA.when},themeSwitcher:{group:`session-tools`,description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:DA(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:DA(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:EA,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:EA,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${Aa} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:xA.template,bg:xA.bg,when:xA.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...nS(``).actions,...bA.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},...xA.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${Aa}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:DS(`.`),formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}×{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},kA=new Set([OA.globals.palette,...Object.values(OA.segments).map(e=>e.palette)].filter(e=>e!==void 0)),AA=Hc(gE(`<default>`,JSON.stringify(OA),kA),OA),jA=j_(AA.presets);function MA(e){return jA.includes(e)}function NA(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const PA=new class{slots;head=null;tail=null;constructor(e){this.slots=e}async run(e){await this.acquire();try{return await e()}finally{this.release()}}async acquire(){if(this.slots>0){this.slots--;return}await new Promise(e=>{let t={wake:e,next:null};this.tail?this.tail.next=t:this.head=t,this.tail=t})}release(){let e=this.head;if(!e){this.slots++;return}this.head=e.next,this.head||(this.tail=null),e.wake()}}(8);function FA(e){return((...t)=>PA.run(()=>e(...t)))}const IA=FA(C),LA=FA(S),RA=FA(w);async function zA(e,t){return PA.run(async()=>{let n=null;try{n=await x(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function BA(e,t){return PA.run(async()=>{let n=null;try{n=await x(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const VA=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function HA(e){let t;try{t=JSON.parse(e)}catch{return null}let n=t.message?.usage;if(!((n?.cache_read_input_tokens??0)>0||(n?.cache_creation_input_tokens??0)>0))return null;let r=t.timestamp==null?NaN:Date.parse(t.timestamp);return Number.isNaN(r)?null:r}async function UA(e){let t=await WA(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function WA(e){for(let t of[65536,1048576]){let n=await BA(e,t);if(n.kind!==`ok`)return n;let r=GA(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function GA(e,t){let n=e.toString(`utf8`).split(`
180
+ `))}function Uk(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new V({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new W(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(E(a.path).href)):c(`full text unavailable: ${_k(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(_k(o),s.withLink(E(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=W.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,jk([m],r)}const Wk=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function Gk(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function Kk(e,t){return r.readdirSync(t).filter(Wk).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?Kk(e,i):[[c.relative(e,i).split(c.sep).join(`/`),Gk(i,a)]]})}function qk(e){let t=ae.createHash(`sha256`);for(let[n,r]of Kk(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const Jk=e=>e.slice(0,7);function Yk(e){return c.dirname(c.dirname(e))}function Xk(){return{version:HE,digest:`a24e911eaff8efc7018364a607b501bdd5c6ef89fae905b36bf325fd12284d0a`}}function Zk(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function Qk(e,t){try{let n=Yk(T(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=qk(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:Zk(n),digest:o},running:a}}catch(e){return{kind:`unchecked`,reason:e.message}}}var $=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function $k(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function eA(e){let t=e.split(`:`);return t[0]===`remove`&&t.length===2&&t[1]?{op:`remove`,target:t[1]}:t[0]===`insert`&&t.length===4&&t[1]&&t[2]&&(t[3]===`before`||t[3]===`after`)?{op:`insert`,segment:t[1],anchor:t[2],relation:t[3]}:null}function tA(e,t,n){let r=Ms(e,new Set(n.map(js).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const nA=/^-?\d+$/;function rA(e,t,n=`set-state`){let r=e.filter(e=>e.includes(`/`));if(r.length>0)throw Error(`makeAllowListValidator(${t}): values contain "/" — the ${n} wire shape splits values on "/" so slash-bearing options cannot be addressed. Offending values: ${r.join(`, `)}`);if(e.includes(``))throw Error(`makeAllowListValidator(${t}): empty string is not a writable option — the validator rejects empty input before the allow-list check, so an "" in the allowed list could be rendered but never delivered. Remove "" from the allowed list.`);let i=new Set(e),a=[...e];return e=>e?i.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown ${t} "${e}" (have: ${a.join(`, `)})`}:{ok:!1,reason:`${t} value is required`}}function iA(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!nA.test(t))return{ok:!1,reason:`${e} must be an integer, got "${t}"`};let n=t[0]===`-`,r=(n?t.slice(1):t).replace(/^0+/,``);return r===``?{ok:!0,value:`0`}:{ok:!0,value:n?`-${r}`:r}}}function aA(e,t,n){return r=>r?nA.test(r)?{ok:!0,value:String(Math.max(e,Math.min(t,parseInt(r,10))))}:{ok:!1,reason:`${n} must be an integer, got "${r}"`}:{ok:!1,reason:`${n} value is required`}}function oA(e,t,n=`state`){let r=t.filter(e=>e.kind===`range`),i=t.some(e=>e.kind===`int`),a=t.flatMap(e=>e.kind===`allow-list`?e.allowed:[]);if(r.length===0&&!i)return{kind:`allow-list`,allowed:[...new Set(a)]};let o=a.filter(e=>!nA.test(e));if(o.length>0)throw Error(`${n} action table: key "${e}" is an integer spec (a paged cursor or a bounded value) but a click writes non-integer value(s) to it (${o.join(`, `)}). A ${n} key has one key shape — point that click at a distinct key, or write an integer.`);if(i&&r.length>0)throw Error(`${n} action table: key "${e}" is declared as both a paged cursor (int) and a bounded value (range) — a ${n} key has one key shape. Use distinct keys.`);if(r.length>0){let t=Math.min(...r.map(e=>e.min)),i=Math.max(...r.map(e=>e.max)),o=a.filter(e=>{let n=parseInt(e,10);return n<t||n>i});if(o.length>0)throw Error(`${n} action table: key "${e}" is a bounded range [${t},${i}] but a click writes out-of-range value(s) to it (${o.join(`, `)}). The range gate would clamp them, storing a different value than the click renders — write an in-range integer, or point that click at a distinct key.`);return{kind:`range`,min:t,max:i}}return{kind:`int`}}function sA(e){return e===`config`?`set-config`:`set-state`}function cA(e,t,n){return t.kind===`int`?iA(`menu page "${e}"`):t.kind===`range`?aA(t.min,t.max,`${n} stepper "${e}"`):rA(t.allowed,`${n} "${e}"`,sA(n))}function lA(e,t=`state`){let n=new Map;for(let{key:t,spec:r}of e){let e=n.get(t);e?e.push(r):n.set(t,[r])}return[...n].map(([e,n])=>({key:e,spec:oA(e,n,t)}))}function uA(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of lA(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,cA(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function dA(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};uA(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=uA(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const fA=dA({},`config`,yA);function pA(e,t){return fA.register(e,t)}function mA(e){return fA.gateFor(e)}function hA(e,t){return`persist`in e?`to`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:dx(e.from,t).members}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[$k({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[$k({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:dx(e.insertSegmentFrom,t).members.map(t=>$k({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function gA(e,t){let n=Fl(e).get(t);return n===void 0?null:String(n)}function _A(e){let t=new Set;for(let n of Object.values(e.actions)){`reset`in n&&t.add(n.reset);let e=`persist`in n?Tx(n.persist):null;e?.scope===`preset-root`&&t.add(Cx(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function vA(e){let t=dw(e);return[..._A(e),...Object.values(e.actions).flatMap(e=>hA(e,t))]}function yA(e){return lA(vA(e),`config`)}const bA=pS(`commands.`),xA=ES(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),SA=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,CA=`{{ \$dir := .current_dir }}{{ if and (ne .home "") (or (eq .home .current_dir) (hasPrefix (printf "%s/" .home) .current_dir)) }}{{ \$dir = printf "~%s" (trimPrefix .home .current_dir) }}{{ else }}{{ if or (eq .project_dir .current_dir) (hasPrefix (printf "%s/" .project_dir) .current_dir) }}{{ $dir = ternary (${SA}) (basename .project_dir) (ne (${SA}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,wA=`{{ ${Rx} }}`,TA={min:0,max:100,step:5},EA={warnAt:{label:`warning at %`,domain:TA,default:50},errorAt:{label:`error at %`,domain:{...TA,atLeast:`warnAt`},default:80}};function DA(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:TA,default:80}}}const OA={globals:{palette:`tokyo-night`},variables:{...bA.variables,...Lb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``},"activity.ticket.id":{kind:`input`,path:`activity.ticket.id`,type:`string`,default:``},"activity.ticket.phase":{kind:`input`,path:`activity.ticket.phase`,type:`string`,default:``},"activity.ticket.epic.done":{kind:`input`,path:`activity.ticket.epic.done`,type:`number`,default:0},"activity.ticket.epic.total":{kind:`input`,path:`activity.ticket.epic.total`,type:`number`,default:0},"activity.ticket.unread":{kind:`input`,path:`activity.ticket.unread`,type:`string`,default:``},"ticket.detail":{kind:`state`,key:`ticket-detail`,default:`collapsed`}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project. Click to copy the full path.",template:CA},model:{group:`model-context`,description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:wA,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:nS(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:bA.template,when:bA.when},themeSwitcher:{group:`session-tools`,description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:DA(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:DA(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:EA,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:EA,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${Aa} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:xA.template,bg:xA.bg,when:xA.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},ticket:{group:`activity`,description:`The lit ticket this session started; expands to its workflow phase and its epic's done/total.`,template:`🎫 {{ action "copyTicket" .activity.ticket.id }}{{ if eq .ticket.detail "expanded" }} · {{ .activity.ticket.phase }}{{ if .activity.ticket.epic.total }} · epic {{ .activity.ticket.epic.done }}/{{ .activity.ticket.epic.total }}{{ end }}{{ if .activity.ticket.unread }} · ⚠ unreadable {{ abbrev 40 .activity.ticket.unread }}{{ end }}{{ end }} {{ action "ticketDetail" "▸" "◂" }}`,when:`{{ ne .activity.ticket.id "" }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`ticket`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...nS(``).actions,...bA.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},ticketDetail:{set:`ticket-detail`,cycle:[`collapsed`,`expanded`]},copyTicket:{copy:`{{ .activity.ticket.id }}`},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},...xA.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${Aa}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:DS(`.`),formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}×{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},kA=new Set([OA.globals.palette,...Object.values(OA.segments).map(e=>e.palette)].filter(e=>e!==void 0)),AA=Hc(gE(`<default>`,JSON.stringify(OA),kA),OA),jA=j_(AA.presets);function MA(e){return jA.includes(e)}function NA(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const PA=new class{slots;head=null;tail=null;constructor(e){this.slots=e}async run(e){await this.acquire();try{return await e()}finally{this.release()}}async acquire(){if(this.slots>0){this.slots--;return}await new Promise(e=>{let t={wake:e,next:null};this.tail?this.tail.next=t:this.head=t,this.tail=t})}release(){let e=this.head;if(!e){this.slots++;return}this.head=e.next,this.head||(this.tail=null),e.wake()}}(8);function FA(e){return((...t)=>PA.run(()=>e(...t)))}const IA=FA(C),LA=FA(S),RA=FA(w);async function zA(e,t){return PA.run(async()=>{let n=null;try{n=await x(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function BA(e,t){return PA.run(async()=>{let n=null;try{n=await x(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const VA=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function HA(e){let t;try{t=JSON.parse(e)}catch{return null}let n=t.message?.usage;if(!((n?.cache_read_input_tokens??0)>0||(n?.cache_creation_input_tokens??0)>0))return null;let r=t.timestamp==null?NaN:Date.parse(t.timestamp);return Number.isNaN(r)?null:r}async function UA(e){let t=await WA(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function WA(e){for(let t of[65536,1048576]){let n=await BA(e,t);if(n.kind!==`ok`)return n;let r=GA(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function GA(e,t){let n=e.toString(`utf8`).split(`
181
181
  `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!VA.test(t))continue;let r=HA(t);if(r!=null)return r}return null}function KA(e,t){return{...e,claudeConfigDir:hS(t.claudeConfigDir),env:t.mementoEnv}}const qA=c.join(`lib`,`ceiling_config.py`),JA=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function YA(e,t){let n=typeof e==`object`&&e?e.plugins:void 0;if(typeof n!=`object`||!n)throw Error(`${t} has no "plugins" object`);return Object.entries(n).filter(([e])=>e.split(`@`)[0]===`memento`).flatMap(([e,n])=>{if(!Array.isArray(n))throw Error(`${t}: "${e}" is not a list of installs`);return n.map(n=>{let{scope:r,installPath:i,projectPath:a}=n??{};if(typeof r!=`string`||typeof i!=`string`)throw Error(`${t}: an install of "${e}" has no scope/path`);return typeof a==`string`?{key:e,scope:r,installPath:i,projectPath:a}:{key:e,scope:r,installPath:i}})})}function XA(e,t){let n=!0;for(let i of e){if(!r.existsSync(i))continue;let e;try{e=JSON.parse(r.readFileSync(i,`utf8`))?.enabledPlugins?.[t]}catch(e){return X(`memento lookup: ${i}: ${e.message}`)}typeof e==`boolean`&&(n=e)}return J(n)}function ZA(e,t){if(!r.existsSync(e))return Y;let n;try{n=YA(JSON.parse(r.readFileSync(e,`utf8`)),e)}catch(e){return X(`memento lookup: ${e.message}`)}let i=n.find(e=>e.projectPath===t)??n.find(e=>e.scope===`user`);if(i===void 0)return Y;let a=XA([c.join(c.dirname(c.dirname(e)),`settings.json`),c.join(t,`.claude`,`settings.json`),c.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[qA,JA].filter(e=>!r.existsSync(c.join(i.installPath,e)));return o.length===0?J(i.installPath):X(`memento at ${i.installPath} has no ${o.join(` or `)} — upgrade the plugin`)}function QA(e,t=process.env){let n=new Set([`CLAUDE_PROJECT_DIR`,`CLAUDE_CODE_SESSION_ID`,...e.env===void 0?[]:Ze]);return{...Object.fromEntries(Object.entries(t).filter(([e])=>!n.has(e))),...e.env,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function $A(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function ej(e){let t;try{t=JSON.parse(e)}catch{return X(`memento read: not JSON: ${e.trim()}`)}let{ceiling:n,session:r}=t??{},i=n===`off`||typeof n==`number`&&n>=0?n:void 0;return i!==void 0&&(r===null||typeof r==`string`)?J({ceiling:i,session:r}):X(`memento read: unexpected answer: ${e.trim()}`)}async function tj(e,t){let n=await ke({bin:`python3`,args:[`-c`,`
182
182
  import json, math, sys
183
183
  sys.path.insert(0, sys.argv[1])
@@ -188,39 +188,39 @@ layer = ceiling_in(directory / CONFIG_NAME)
188
188
  print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
189
189
  "session": layer.text if layer else None}))
190
190
  `,c.join(e,`lib`),t.sessionId,t.cwd],env:QA(t),timeoutMs:3e3,category:`memento.read`});return n.ok?ej(n.stdout):X($A(n))}function nj(e,t,n){let r=Ae({bin:c.join(e,JA),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:QA(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error($A(r))}function rj(){return{locate:e=>ZA(_S(e.claudeConfigDir),e.projectDir),read:tj,move:nj}}function ij(e,t,n){let r=n===void 0?``:`CLAUDE_CONFIG_DIR=${fO(n)} `,i=e.added_dirs.map(e=>` --add-dir ${fO(e)}`).join(``);return`cd ${fO(e.project_dir)} && ${r}claude --resume ${fO(t)}${i}`}function aj(e,t,n){let r=M_(t(`preset`),e.globals.preset,e.presets),i=F_(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:rx(a.palette,t(`theme`),i.palette),style:fo(a.style,t(`style`),i.style,e.styles),endcaps:ho(a.endcaps,t(`endcaps`),i.endcaps),variation:So(a.variation,t(`variation`),i.variation),separator:a.default_separator??i.default_separator,autoWrap:Ao(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:Mo(a.padding,t(`padding`),i.padding),charset:a.charset??i.charset??`unicode`,updateNotice:jo(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:a.colorCompatibility??i.colorCompatibility??`truecolor`}}function oj(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function sj(e){return{theme:e.theme,style:e.style,preset:e.preset,variation:e.variation}}function cj(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:MA(e.preset)},endcaps:{effective:e.endcaps},variation:{effective:e.variation},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding},updateNotice:{effective:e.updateNotice}}}const lj=10*1e3;function uj(e,t,n,r){let i=n-(t*1e3-r);if(i<3e5||e<=0)return;let a=e/i,o=(100-e)/a;return Math.max(0,Math.round(o/6e4))}function dj(e,t){if(!(t<60))return e*3600/t}function fj(e,t,n,r){let i=r-t;if(i<50||i>lj)return;let a=n-e;if(!(a<=0))return a*1e3/i}function pj(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=fj(t.input,t.atMs,n.input,n.atMs),i=fj(t.output,t.atMs,n.output,n.atMs),a=fj(t.total,t.atMs,n.total,n.atMs);if(!(r===void 0&&i===void 0&&a===void 0))return{...r!==void 0&&{input:r},...i!==void 0&&{output:i},...a!==void 0&&{total:a}}}function mj(e){let{samples:t}=e,n=[];for(let e=1;e<t.length;e++){let r=t[e-1],i=t[e],a=i.atMs-r.atMs;if(a<50||a>lj)continue;let o=fj(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function hj(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function gj(e){let t=[],n=(e,n)=>{try{let e=n();return e===``?void 0:e}catch(n){t.push(`host.${e}: ${String(n)}`);return}},r=n(`name`,()=>hj(m.hostname())),i=n(`user`,()=>m.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function _j(e,t){let n=new Map;for(let[t,r]of Object.entries(e.variables))n.set(t,r);for(let[t,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))n.set(`${t}.${e}`,i);let r=[],i=new Set,a=t=>xv(t,e.helpers).keys(),o=F_(e,t);for(let e of io){let t=o[e];if(ao(t))for(let e of a(t))r.push(e)}for(let n of Ps(P_(e,t).node)){if(n.when)for(let e of a(n.when))r.push(e);if(n.kind!==`segment`)continue;let t=e.segments[n.name];if(t){for(let e of[t.template,t.when,t.bg,t.fg])if(e)for(let t of a(e))r.push(t)}}let s=new Set;for(;r.length>0;){let e=r.pop();for(let t of yj(n,e)){if(i.has(t))continue;i.add(t);let e=n.get(t);if(e){if(e.kind===`input`)s.add(e.path);else if(e.kind===`template`)for(let t of a(e.template))r.push(t)}}}return s}function vj(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=_j(e,n);return t.set(n,i),i}}function yj(e,t){let n=t;for(;n.length>0;){if(e.has(n))return[n];let t=n.lastIndexOf(`.`);if(t<0)break;n=n.slice(0,t)}let r=`${t}.`,i=[];for(let t of e.keys())t.startsWith(r)&&i.push(t);return i}function bj(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function xj(e){let t=t=>e.has(t),n=t(`git.staged`)||t(`git.unstaged`)||t(`git.untracked`)||t(`git.conflicts`);return{...t(`git.sha`)&&{showSha:!0},...n&&{showWorkingTree:!0},...t(`git.stash`)&&{showStashCount:!0},...t(`git.upstream`)&&{showUpstream:!0},...t(`git.repoName`)&&{showRepoName:!0},...t(`git.repoUrl`)&&{showRepoUrl:!0},...t(`git.operation`)&&{showOperation:!0},...t(`git.timeSinceCommit`)&&{showTimeSinceCommit:!0},...(t(`git.prNumber`)||t(`git.prState`)||t(`git.prUrl`)||t(`git.prError`))&&{showPullRequest:!0}}}async function Sj(e,t,n,r,i,a,{configPath:o,...s}){let c=e=>bj(r,e),l=(t.clock??(()=>new Date))().getTime(),u=a.tmux??null,d=(e,t,n)=>t?n().catch(t=>X(`${e}: ${String(t)}`)):Promise.resolve(Y),[f,p,m,h,g,_,v,y,b,x,S]=await Promise.all([d(`git`,c(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,xj(r),e.workspace?.project_dir)),d(`session`,c(`session.cost`)||c(`session.tokens`)||c(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),d(`today`,c(`today`),()=>t.usageStore.getTodayInfo(e,a.claudeConfigDir)),d(`context`,c(`context`)||c(`autocompact`),()=>t.contextProvider.getContextInfo(e)),d(`metrics`,c(`metrics`)||c(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),d(`activity`,c(`activity`),()=>t.activityProvider.getActivityInfo(e.session_id,e)),d(`tmux`,c(`tmux.session`),()=>u===null?Promise.resolve(Y):t.tmuxService.getSessionName(u)),d(`cache`,c(`cache`),()=>UA(e.transcript_path)),d(`speed`,c(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,l)),d(`memento`,c(`memento`),()=>t.mementoProvider.getCeiling(KA({sessionId:e.session_id,projectDir:e.workspace?.project_dir??``,cwd:n??e.workspace?.current_dir??``},a))),d(`autocompact`,c(`autocompact`),()=>Promise.resolve(t.autoCompact(gS(hS(a.claudeConfigDir)))))]),C=[],w=e=>{if(e.kind===`failed`){C.push(e.reason);return}return e.kind===`ok`?e.value:void 0},ee=Aj(f);C.push(...ee.failures);let te=gj(a);C.push(...te.failures);let ne=w(p),re=w(m),ie=w(h),T=w(g),E=w(_),ae=w(v),oe=w(y),se=Tj(x);x.kind===`failed`&&C.push(`memento: ${x.reason}`);let ce=Cj(S,ie?.maxTokens);S.kind===`failed`&&C.push(`autocompact: ${S.reason}`);for(let e of C)t.log(`warn`,`provider fetch failed: ${e}`);let D=e.rate_limits?.five_hour,le=e.rate_limits?.seven_day,ue=D?uj(D.used_percentage,D.resets_at,18e6,l):void 0,de=le?uj(le.used_percentage,le.resets_at,6048e5,l):void 0,fe=ne?.session.cost,pe=T?.sessionDuration,me=c(`burn`)&&fe!=null&&pe!=null?dj(fe,pe):void 0,he=w(b),ge=he===void 0?void 0:pj(he),_e=he===void 0?void 0:mj(he),ve=ge!==void 0||_e!==void 0?{...ge,..._e!==void 0&&{history:_e}}:void 0,O=kj(process.env.HOME??process.env.USERPROFILE),ye=e.workspace?{...e.workspace,current_dir:kj(e.workspace.current_dir)??``,project_dir:kj(e.workspace.project_dir)??``,added_dirs:(e.workspace.added_dirs??[]).map(e=>kj(e)??e)}:e.workspace,be=ne===void 0?void 0:Oj({cost:ne.session.cost,tokens:ne.session.tokens}),xe=re===void 0?void 0:{cost:re.cost,tokens:re.tokens},Se=T===void 0?void 0:Oj({lastResponseTime:T.lastResponseTime,responseTime:T.responseTime,sessionDuration:T.sessionDuration,messageCount:T.messageCount,linesAdded:T.linesAdded,linesRemoved:T.linesRemoved}),Ce=E===void 0?void 0:Ej(E);return{...e,...ye!==void 0&&{workspace:ye},...O!==void 0&&{home:O},...ee.git!==void 0&&{git:ee.git},...u!==null&&{tmux:{pane:u.pane,...ae!==void 0&&{session:ae}}},host:te.host,...cj(i),history:t.history(e.session_id),navigation:{back:t.navigation(e.session_id)},...s,...o!==null&&{configPath:o},resumeCommand:ij(ye,e.session_id,a.claudeConfigDir),...be!==void 0&&{session:be},...xe!==void 0&&{today:xe},...me!==void 0&&{burn:{costPerHour:me}},...ve!==void 0&&{speed:ve},...c(`block`)&&D!==void 0&&{block:{nativeUtilization:D.used_percentage,resetsAt:D.resets_at,...ue!==void 0&&{etaMinutes:ue}}},...le!==void 0&&{weekly:{percentage:le.used_percentage,resetsAt:le.resets_at,...de!==void 0&&{etaMinutes:de}}},...oe!==void 0&&{cache:{expiresAt:oe}},...ie!==void 0&&{context:{totalTokens:ie.totalTokens,contextLeft:ie.contextLeftPercentage}},...Se!==void 0&&{metrics:Se},...Ce!==void 0&&{activity:Ce},...se!==void 0&&{memento:se},...ce!==void 0&&{autocompact:ce}}}function Cj(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return TS(e.value,t)}}const wj=e=>e.trim().split(`
191
- `).at(-1).trim();function Tj(e){switch(e.kind){case`absent`:return;case`failed`:return{error:wj(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function Ej(e){let t=e.todos.findIndex(e=>e.active),n=e.todos.length===0?void 0:{total:e.todos.length,completed:e.todos.filter(e=>e.done).length,...t>=0&&{position:t+1,active:e.todos[t].text}},r=Dj(e.running),i=Dj(e.done),a=r===void 0&&i===void 0?void 0:{...r!==void 0&&{running:r},...i!==void 0&&{done:i}};if(!(e.command===null&&n===void 0&&a===void 0))return{...e.command!==null&&{command:e.command},...n!==void 0&&{todo:n},...a!==void 0&&{tool:a}}}function Dj(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function Oj(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function kj(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function Aj(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const jj={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,autoWrap:e=>e.autoWrap?Co:wo,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?Co:wo},Mj=Object.entries(zb),Nj=new Set(Bb.map(e=>e.sessionKey)),Pj=()=>!1;function Fj(e,t){return aj(e,e=>Nj.has(e)?t(e):null,Pj)}function Ij(e,t,n,r){return e.flatMap(([e,i])=>{let a=jj[e](t);return a===null||a===jj[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function Lj(e,t,n){return jj[n](Fj(e,t))}function Rj(e,t){let n=Fj(e,t),r=aj(e,()=>null,Pj),i=aj(e,e=>e===zb.preset.sessionKey?n.preset:null,Pj);return Ij(Mj,n,e=>e===`preset`?r:i,t=>zj(e,n.preset,t.configKey))}function zj(e,t,n){return n in(N_(e.presets,t).globals??{})?wx(t,n):n}function Bj(e,t,n){let r=M_(t(zb.preset.sessionKey),e.globals.preset,e.presets),i=Tx(n);return{key:i?.scope===`globals`?zj(e,r,i.field):n,globals:F_(e,r)}}function Vj(e,t){let{preset:n}=Fj(e,t);return Wj(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Ys(a,s);return c===void 0||Js(c)===Js(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function Hj(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return j_(e.presets).flatMap(n=>{let i=Wj(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Ks(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:Ys(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const Uj=new WeakMap;function Wj(e,t){let n=Uj.get(e)??new Map;Uj.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...Ps(P_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Ws(e.segments[t.name])[n];return{id:r,setting:n,key:i,decl:a,saved:t.settings?.[n]??a.default}})),a=[...new Map(i.map(e=>[e.key,e])).values()];return n.set(t,a),a}function Gj(e,t){let n=Fj(e,t),r=aj(e,e=>e===zb.preset.sessionKey?n.preset:null,Pj);return{from:n.preset,globals:N_(e.presets,n.preset).globals??{},picks:Ij(Mj.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:Vj(e,t)}}function Kj(e){return{sessionKeys:Bb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...Tl(e)?jA.map(t=>wx(t,e)):[]]}}function qj(e){return new Set(Bb.map(e=>e.configKey).filter(t=>Kj(t).fileKeys.some(t=>Xj(e,Yj(t)))))}function Jj(e,t,n){let r=Rj(e,n),i=new Set(r.map(e=>e.configKey)),a=Gb(e=>i.has(zb[e].configKey)||t.has(zb[e].configKey));return{unsaved:r.length+Vj(e,n).length,resettable:a}}function Yj(e){let t=Tx(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return Ex(t)}function Xj(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&Xj(e[n],r)}const Zj=$a(),Qj=new Set(Zj),$j=new Set(po),eM=e=>e?Qj.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${Zj.join(`, `)})`}:{ok:!1,reason:`theme name is required`},tM=e=>e?$j.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${po.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},nM=new Set([`1`,`true`]),rM=new Set([`0`,`false`]),iM={endcaps:tM,theme:eM,"toolbar-expanded":e=>nM.has(e)?{ok:!0,value:`1`}:rM.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}},aM=dA(iM,`state`,fM);function oM(e,t){return aM.register(e,t)}function sM(e){return aM.gateFor(e)}function cM(e,t){return`set`in e?`to`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:dx(e.from,t).members}}]:`int`in e?[{key:e.set,spec:{kind:`int`}}]:`cycle`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:e.cycle}}]:[{key:e.set,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function lM(e){return e.filter(e=>e.spec.kind!==`allow-list`||!Object.hasOwn(iM,e.key))}function uM(e,t,n){let r=Kb.get(n);if(r!==void 0)return Lj(e,t,r);let i=Object.values(e.variables).find(e=>e.kind===`state`&&e.key===n);return i?.kind===`state`?i.default??null:null}function dM(e){let t=dw(e);return lM(Object.values(e.actions).flatMap(e=>cM(e,t)))}function fM(e){return lA(dM(e))}const pM=`update.dismissed`,mM=`updateNotice`,hM=zb.updateNotice.sessionKey;function gM(e){return e.kind===`source`?e.newer.digest:hO(e.newer)}const _M=e=>`${e.version} [${Jk(e.digest)}]`;function vM(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:_M(e.newer),running:_M(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:hO(e.newer),running:hO(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${_O}@${hO(e.newer)}`,`install`]}}}}const yM={kind:`idle`},bM={kind:`running`};function xM(e,t,n){if(e===null)return[];let r=gM(e);if(!n.enabled||n.dismissed===r)return[];let i=vM(e),a=`${i.headline}: ${i.newer}. You're on ${i.running}.`,o=t.kind===`failed`&&t.identity===r?[`${i.act} failed: ${t.reason}`]:[],s=[a,...o].join(`
192
- `),c=iO([{verb:RD,args:[s]}]),l=t.kind===`running`?Ik(`[${i.busy}]`,c):Ik(`[${i.act}]`,iO([{verb:XD,args:[n.sessionId]}]));return[{severity:Fk,message:s,lines:[[Ik(a,c),l,Ik(`[dismiss]`,iO([{verb:MD,args:[n.sessionId,pM,r]}])),Ik(`[disable]`,iO([{verb:zD,args:[n.sessionId,mM,`false`]},{verb:MD,args:[n.sessionId,hM,`false`]}]))],...o.map(e=>[Ik(e,c)])]}]}function SM(e,t){return e.kind===`stale`?{kind:`source`,root:e.root,newer:e.source,running:e.running}:e.kind===`not-source-checkout`&&t!==null&&t.kind===`stale`?{kind:`release`,newer:t.latest,running:t.installed}:null}function CM(e){switch(e.kind){case`current`:return[`info`,`build: current ${_M(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${_M(e.source)}, running ${_M(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function wM(e){switch(e.kind){case`current`:return[`info`,`release: current ${hO(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${hO(e.latest)}, running ${hO(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${hO(e.installed)}, latest ${hO(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function TM(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const EM=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function DM(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=EM(e.stderr)??e.error??EM(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function OM(){let e=[pA(mM,[`false`]),oM(hM,[`false`]),oM(pM,[])];return()=>e.forEach(e=>e())}function kM(e){let{entryUrl:t,intervalMs:n,releaseIntervalMs:r,registryUrl:i,fetchImpl:a,onApplied:o,log:s}=e,c={kind:`unchecked`,reason:`not sampled yet`},l=null,u=yM,d=null,f=TM(s),p=TM(s),m=()=>SM(c,l);function h(){let e=m(),t=e===null?null:gM(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:oM(pM,[t])})}function g(){c=Qk(t,Xk),f(CM(c)),h()}async function _(){l=yO(HE,await vO(_O,a,i)),p(wM(l)),h()}return{arm(){OM(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>xM(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=vM(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=bM,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),ke({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=yM,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=DM(n);u={kind:`failed`,identity:gM(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var AM=class{static CACHE_DIR=Fe();static USAGE_CACHE_DIR=c.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=c.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=c.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return O(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(O(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(O(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return O(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=c.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),O(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await D(50);else throw e}return O(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=c.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),O(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&O(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){O(`Failed to create cache directories:`,e)}}static createProjectHash(e){return oe(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=c.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){O(`Cache for ${e} is locked, waiting...`),await D(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(O(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(O(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return O(`No shared ${e} usage cache found`),null;O(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await D(75)}}return O(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){O(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=c.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),O(`[CACHE-SET] ${e} disk cache stored`)}catch(t){O(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const jM={"claude-haiku-4-5-20251001":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-opus-4-20250514":{name:`Claude Opus 4`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1-20250805":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-sonnet-4-20250514":{name:`Claude Sonnet 4`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-4-opus-20250514":{name:`Claude 4 Opus`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-4-sonnet-20250514":{name:`Claude 4 Sonnet`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-opus-4-5":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-5-20251101":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6-20260205":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-sonnet-4-6":{name:`Claude Sonnet 4.6`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3}};var MM=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL=`https://raw.githubusercontent.com/promptctl/cc-candybar/main/pricing.json`;static async loadDiskCache(){let e=Date.now()-1440*60*1e3;return await AM.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await AM.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new re(this.GITHUB_PRICING_URL),n=ce({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){O(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){O(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(O(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),O(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(O(`Invalid pricing data structure`),e(null))}catch(t){O(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{O(`Response error:`,t),e(null)})});n.on(`error`,t=>{O(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{O(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return O(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return O(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),O(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(O(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(jM).length} models`),this.executionCache=jM,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(jM).length} models`),jM)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return O(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),O(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const NM=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function PM(e){if(typeof e==`string`)return NM.exec(e)?.[1]}function FM(e){let t=e?.todos;if(!Array.isArray(t))return;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let{content:t,activeForm:r,status:i}=e,a=i===`in_progress`,o=a&&typeof r==`string`?r:t;typeof o==`string`&&n.push({text:o,active:a,done:i===`completed`})}return n}function IM(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o;if(typeof t==`string`)o=t;else if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;switch(t.type){case`tool_use`:{let{id:e,name:n}=t;if(typeof e!=`string`||typeof n!=`string`)break;r.push({id:e,name:n}),n===`TodoWrite`&&(a=FM(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id;typeof e==`string`&&i.push(e);break}case`text`:o??=t.text;break;default:break}}let s=n?PM(o):void 0;if(!(r.length===0&&i.length===0&&a===void 0&&s===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...s!==void 0&&{command:s}}}function LM(e){if(e!==void 0)return[e];let t=h();return[f(t,`.config`,`claude`),f(t,`.claude`)].filter(e=>a(e))}async function RM(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await IA(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=f(e,r.name);t.push(n)}}catch(t){O(`Failed to read projects directory ${e}:`,t)}}return t}async function zM(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await IA(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=f(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await LA(t,`utf-8`)).split(`
193
- `)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{O(`Failed to check agent file ${t}`)}}}catch(e){O(`Failed to read subagents directory ${i}:`,e)}return r}function BM(e){let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.firstContentType===`tool_result`;return t===`user`&&!n}const VM=new Map;async function HM(e){try{let t=await RA(e),n=t.size,r=VM.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),VM.delete(e),VM.set(e,r),r.entries;let i;return n>1048576?(O(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await qM(e)):i=await GM(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(VM.delete(e),VM.size>=16&&VM.delete(VM.keys().next().value),VM.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return O(`Transcript not present yet: ${e}`),[];throw t}}function UM(e){if(!e.timestamp)return null;let t=e.message,n=t?.usage,r=t?.content,i=Array.isArray(r)&&typeof r[0]==`object`&&r[0]?r[0]:void 0;return{timestamp:new Date(e.timestamp),type:typeof e.type==`string`?e.type:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n,role:typeof t.role==`string`?t.role:void 0,type:typeof t.type==`string`?t.type:void 0,firstContentType:typeof i?.type==`string`?i.type:void 0}:void 0,costUSD:typeof e.costUSD==`number`?e.costUSD:void 0,isSidechain:e.isSidechain===!0,activity:IM(e),raw:{model:typeof e.model==`string`?e.model:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n}:void 0,requestId:typeof e.requestId==`string`?e.requestId:void 0}}}function WM(e){let t=[];for(let n of e.split(`
194
- `))if(n.trim())try{let e=UM(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function GM(e){return WM(await LA(e,`utf-8`))}async function KM(e,t){let n=await zA(e,t===void 0?void 0:{offset:t.offset,ino:t.ino});if(n.kind!==`ok`)return n;let{buf:r,start:i,mtimeMs:a,ino:o,reset:s}=n.value,c=r.lastIndexOf(10);return J(c<0?{entries:[],cursor:{offset:i,mtimeMs:a,ino:o},reset:s}:{entries:WM(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function qM(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=le({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=UM(JSON.parse(t));e&&r.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{O(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{O(`File stream error for ${e}:`,t),n(t)})})}var JM=class{inflight=new Map;run(e,t){return this.inflight.get(e)??this.start(e,t)}start(e,t){let n=t();this.inflight.set(e,n);let r=()=>{this.inflight.get(e)===n&&this.inflight.delete(e)};return n.then(r,r),n}get size(){return this.inflight.size}};function YM(e,t){let n=e?e.input+e.cacheCreation+e.cacheRead:0,r=e?e.output:0;return{input:n,output:r,total:n+r,atMs:t}}const XM=new Map,ZM={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},QM={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function $M(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function eN(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function tN(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function nN(e,t,n,r){let i=$M(new Date(eN())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:tN(),l=new Map;if(a)for(let[e,t]of a.days)e>=i&&l.set(e,{...t});for(let e of n){let t=e.message?.usage;if(!t)continue;o++;let n=e.costUSD??await MM.calculateCostForEntry(e.raw);s+=n,c.input+=t.input_tokens||0,c.output+=t.output_tokens||0,c.cacheCreation+=t.cache_creation_input_tokens||0,c.cacheRead+=t.cache_read_input_tokens||0;let r=$M(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...ZM};a.cost+=n,a.input+=t.input_tokens||0,a.output+=t.output_tokens||0,a.cacheCreation+=t.cache_creation_input_tokens||0,a.cacheRead+=t.cache_read_input_tokens||0,l.set(r,a)}return{cursor:r,entries:o,cost:s,breakdown:c,days:l}}function rN(e){let t=0,n=0,r=tN(),i=new Map;for(let a of e.values()){t+=a.entries,n+=a.cost,r.input+=a.breakdown.input,r.output+=a.breakdown.output,r.cacheCreation+=a.breakdown.cacheCreation,r.cacheRead+=a.breakdown.cacheRead;for(let[e,t]of a.days){let n=i.get(e)??{...ZM};n.cost+=t.cost,n.input+=t.input,n.output+=t.output,n.cacheCreation+=t.cacheCreation,n.cacheRead+=t.cacheRead,i.set(e,n)}}if(t===0)return{sessionInfo:QM,days:i};let a=r.input+r.output+r.cacheCreation+r.cacheRead;return{sessionInfo:{cost:n,calculatedCost:n,officialCost:null,tokens:a,tokenBreakdown:r},days:i}}async function iN(e,t,n){let r=0,i=async()=>{for(;r<e.length;){let t=e[r++];await n(t)}},a=Math.min(t,e.length);await Promise.all(Array.from({length:a},i))}var aN=class{entries=new Map;flight=new JM;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new JM;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??ib,this.maxEntries=e.maxEntries??256,this.staleAgeMs=e.staleAgeMs??864e5;let t=e.sweepIntervalMs??3e5;t>0&&(this.sweepTimer=setInterval(()=>this.sweepStale(),t),this.sweepTimer.unref())}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,sweeps:this.sweeps,seeds:this.seeds}}async getUsageInfo(e,t){let n=await this.ingest(e,t?.transcript_path);if(n.kind===`failed`)return n;let r=n.kind===`ok`?n.value.sessionInfo:QM,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t){let n=$M(new Date),r=LM(t);try{await this.ensureSeeded(n,r)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let i=await this.ingest(e?.session_id??``,e?.transcript_path);if(i.kind===`failed`)return i;let a=r.map(e=>f(e,`projects`)+p),o={...ZM},s=!1;for(let[t,r]of this.entries){let i=r.transcriptPath??``,c=t===e?.session_id||a.some(e=>i.startsWith(e))?r.days:XM;s||=c.has(n);let l=c.get(n)??ZM;o.cost+=l.cost,o.input+=l.input,o.output+=l.output,o.cacheCreation+=l.cacheCreation,o.cacheRead+=l.cacheRead}return s?J({cost:o.cost,tokens:o.input+o.output+o.cacheCreation+o.cacheRead,tokenBreakdown:{input:o.input,output:o.output,cacheCreation:o.cacheCreation,cacheRead:o.cacheRead},date:n}):Y}async observeSpeed(e,t,n){let r=NA(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=YM(i.kind===`ok`?i.value.sessionInfo.tokenBreakdown:null,n),o=this.speedRings.get(e)??[],s;for(let e of o)e.atMs<a.atMs&&(s===void 0||e.atMs>s.atMs)&&(s=e);return o.push(a),o.sort((e,t)=>e.atMs-t.atMs),o.length>64&&o.shift(),this.speedRings.set(e,o),J({...s!==void 0&&{prev:s},cur:a,samples:[...o]})})}async ingest(e,t,n){if(!e)return Y;let r=n??NA(t),i=this.entries.get(e);if(i&&r!==0&&i.transcriptMtime===r)return i.lastSeenAt=Date.now(),this.entries.delete(e),this.entries.set(e,i),this.hits++,J(i);if(!t)return i?J(i):Y;this.misses++;let a;try{a=await this.flight.run(`${e}:${r}`,()=>this.refold(e,t,this.entries.get(e)))}catch(t){return X(`usage refold (${e}): ${t instanceof Error?t.message:String(t)}`)}if(a.kind!==`ok`)return a;let o={files:a.value.files,sessionInfo:a.value.sessionInfo,days:a.value.days,transcriptMtime:a.value.mainMtime,transcriptPath:t,lastSeenAt:Date.now()};return this.entries.delete(e),this.entries.set(e,o),this.evictIfNeeded(),J(o)}async refold(e,t,n){let r=await zM(e,u(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await KM(e,r?.cursor);if(o.kind===`failed`)return o;if(o.kind===`absent`){r&&i.set(e,r);continue}let{entries:s,cursor:c,reset:l}=o.value;i.set(e,await nN(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...rN(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=eN(),n=await RM(e),r=[];for(let e of n){let n;try{n=await IA(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await RA(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await iN(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},oN=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return O(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);O(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{O(`Calculating context tokens from transcript: ${e}`);let n=await HM(e);if(n.length===0)return O(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,O(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return O(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},sN=class{states=new Map;constructor(e,t,n=256){this.empty=e,this.step=t,this.maxSessions=n}async read(e,t){let n=this.states.get(e),r=NA(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await KM(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:n?.value??this.empty};let{entries:a,cursor:o,reset:s}=i.value,c=s||n===void 0?this.empty:n.value;for(let e of a)c=this.step(c,e);for(this.touch(e,{cursor:o,value:c});this.states.size>this.maxSessions;){let e=this.states.keys().next().value;if(e===void 0)break;this.states.delete(e)}return{kind:`ok`,value:c}}touch(e,t){this.states.delete(e),this.states.set(e,t)}};const cN={messageCount:0,recent:[]};function lN(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!BM(t),recent:n.length>20?n.slice(-20):n}}function uN(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(BM(r))t=r.timestamp;else if(e===`assistant`&&t){let e=(r.timestamp.getTime()-t.getTime())/1e3;e>.1&&e<300&&(n=e)}}return n}var dN=class{fold=new sN(cN,lN);async getMetricsInfo(e,t){if(O(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:uN(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};const fN={command:null,todos:[],pending:[],done:[]};function pN(e,t){let n=e.findIndex(e=>e.name===t);return n<0?[...e,{name:t,count:1}]:e.map((e,t)=>t===n?{name:e.name,count:e.count+1}:e)}function mN(e,t){if(t.isSidechain)return e;let n=BM(t)?{...e,command:t.activity?.command??null,pending:[],done:[]}:e,r=t.activity;if(r===void 0)return n;let i=n.pending,a=n.done;r.started!==void 0&&(i=[...i,...r.started]);for(let e of r.finished??[]){let t=i.findIndex(t=>t.id===e);t<0||(a=pN(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos}}function hN(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>pN(e,t.name),[]),done:e.done}}var gN=class{fold=new sN(fN,mN);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(hN(n.value))}};function _N(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function vN(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function yN(e,t,n,r){return vN(Ae(_N(e,t,n,r)),n)}async function bN(e,t,n){return vN(await ke(_N(e,t,n)),n)}const xN=e=>`${e.socket}\n${e.pane}`;var SN=class{names=new Map;asking=new JM;constructor(e=Date.now){this.now=e}getSessionName(e){let t=xN(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){O(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await bN(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const CN=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:Ze.map(t=>e.env?.[t]??null)]);var wN=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=CN(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=CN(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function TN(e){return{gitProvider:new pb({watchers:e.watchers,logger:e.logger}),usageStore:new aN({logger:e.logger}),contextProvider:new oN,metricsProvider:new dN,activityProvider:new gN,tmuxService:new SN,mementoProvider:new wN(rj()),autoCompact:wS,log:e.logger}}function EN(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function DN(e,t){let n=W.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function ON(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function kN({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function AN(e){let t=kN(e);if(t.length===1)return e.text;let n=DN(t);return n.style=e.text.style,n}function jN(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,lead:s=[],trail:c=[]}=t;if(e.length===0)return[];let l=DN(e,a).pad(o),u=new W(` `.repeat(o)),d={...s.length>0&&{lead:DN([u,...s],a)},...c.length>0&&{trail:DN([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(ON(l,n,f),[{text:l,...d}])}const MN=RegExp(`\\x1b\\[[0-9;]*m|${xi.source}`,`g`);function NN(e){return M(e.replace(MN,``))}function PN(e,t){let n=e.map(AN),r=[];if(e.forEach(({fill:e},t)=>{e!==void 0&&r.push({at:t,how:e})}),r.length===0||!Number.isFinite(t.width))return n;let i=jk(n,t).split(`
195
- `);if(i.length>1)return n;let a=Math.max(0,t.width-NN(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:i},a)=>{let c=o+(a===r.length-1?s:0),{text:l}=e[t];ON(l,l.cellLength+c,i),n[t]=AN(e[t])}),n}function FN(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=IN(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(RN(a.style).link){i();let e=IN([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function IN(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>LN(e,t)):e,r=W.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function LN(e,t){let n=e.copy();return n.style=t.add(RN(e.style)),n}function RN(e){return e instanceof V?e:V.parse(e)}function zN(e,t,n,r){let i=new Map,a=Object.entries(t);for(let[t,o]of[...a.filter(([,e])=>!(`do`in e)),...a.filter(([,e])=>`do`in e)])i.set(t,BN(e,t,o,n,r,i));return i}function BN(e,t,n,r,i,a){if(`set`in n){let e=r.get(n.set)??n.set;if(`to`in n)return{kind:`set-literal`,key:n.set,value:n.to,stateVar:e};if(`from`in n){let t=dx(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Ub.get(n.persist)??n.persist;if(`to`in n)return{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e};if(`from`in n){let t=dx(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=dx(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:UN(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:UN(e,n.open,t)};if(`reset`in n)return{kind:`reset`,key:n.reset};if(`doctor`in n)return n.doctor===`run`?{kind:`doctor-run`}:{kind:`doctor-fix`,check:n.check};if(`ceiling`in n)return{kind:`ceiling`,args:jw(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:UN(e,n.name,t)};let[o,...s]=n.do.map(e=>{let n=a.get(e);if(n===void 0)throw Error(`action "${t}" fires "${e}", which is not declared in this config`);return n});return{kind:`do`,head:o,rest:s}}function VN(e){return e.kind===`do`?VN(e.head):e}function HN(e){switch(VN(e).kind){case`set-option`:case`set-int`:case`persist-option`:case`layout-op-option`:return!0;case`set-literal`:case`set-bounded`:case`set-cycle`:case`copy`:case`open`:case`persist-literal`:case`persist-bounded`:case`persist-cycle`:case`reset`:case`layout-op`:case`undo`:case`redo`:case`back`:case`rewind`:case`save`:case`preset-save`:case`preset-delete`:case`doctor-run`:case`doctor-fix`:case`ceiling`:case`slash`:case`do`:return!1}}function UN(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function WN(e,t){return e.has(t)?Fv(e.read(t)):``}function GN(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function KN(e,t,n,r){let i=new W(e,{style:V.combine([r,new V({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function qN(e,t){return Math.max(e.members.indexOf(WN(t,e.stateVar)),0)}function JN(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=WN(r,e.stateVar);return{effects:[{verb:MD,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=WN(r,e.stateVar);return{effects:[{verb:MD,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=WN(r,e.stateVar);return{effects:[{verb:MD,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(qN(e,r)+1)%e.members.length];return{effects:[{verb:MD,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:ND,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:PD,args:[GN(e.text,Dy(r))]}],active:!1};case`open`:return{effects:[{verb:FD,args:[GN(e.target,Dy(r))]}],active:!1};case`persist-literal`:{let t=WN(r,e.stateVar);return{effects:[{verb:zD,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=WN(r,e.stateVar);return{effects:[{verb:zD,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(qN(e,r)+1)%e.members.length];return{effects:[{verb:zD,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:BD,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:WD,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:KD,args:[i]}],active:!1};case`redo`:return{effects:[{verb:qD,args:[i]}],active:!1};case`back`:return{effects:[{verb:JD,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:YD,args:[i]}],active:!1};case`save`:return{effects:[{verb:VD,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:HD,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:UD,args:[i,GN(e.name,Dy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:ZD,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:QD,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:eO,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:tO,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:GD,args:[i,e.key,$k(e.op)]}],active:!1};case`do`:{let a=JN(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>JN(e,t,void 0,r,i).effects)],active:a.active}}case`layout-op-option`:{let r={op:`insert`,segment:n??t,anchor:e.anchor,relation:e.relation};return{effects:[{verb:GD,args:[i,e.key,$k(r)]}],active:!1}}}}function YN(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:Yc(`action "${e}"`,n,t.members.length,qN(t,r)),boundValue:void 0};if(n.length>2)throw Error(`action "${e}" takes a display and an optional bound value, got ${n.length} arguments (per-state displays are a cycle action's form)`);return{display:n[0],boundValue:n[1]}}function XN(e,t,n){let r=n.compiled.get(e);if(!r)throw Error(`action "${e}" is not declared in this config`);let i=n.store,{display:a,boundValue:o}=YN(e,VN(r),t,i),{effects:s,active:c}=JN(r,a,o,i,WN(i,`session.id`));return KN(a,iO(s),c)}function ZN(e){return{action:{fn:(t,...n)=>XN(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function QN(e,t){return KN(`✕`,iO([{verb:MD,args:[WN(e,`session.id`),t,Kc]}]),!1)}function $N(e,t,n){return new V({bgcolor:L.fromRgba(t),color:L.fromRgba(ja(e,t,n))})}function eP(e,t,n){return new V({color:L.fromRgba(cr(xa(e,`warning`),t,Aa,n))})}function tP(e,t,n){return V.combine([$N(e,t,n),eP(e,t,n)])}function nP(e,t,n){return $N(e.palette,Wa(e.palette,e.disclosure,[t],n),n)}function rP(e,t,n,r,i,a){return r===void 0?n=>nP(e,{...n,distribution:t},i):(e,t)=>iP(r(t,n),a,i)}function iP(e,t,n){return new V({bgcolor:L.fromRgba(t),color:L.fromRgba(cr(xa(e,`primary`),t,4.5,n))})}function aP(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>oP(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function oP(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function sP(e,t){return new W(e).truncate(t,{marker:`…`}).plain}function cP(e){return{current:null,drawnAt:e}}function lP(e,t,n,r,i,a){let o={segName:t,placementId:n,palette:r,disclosure:i,tint:a,bg:void 0,drops:[]};return e.current=o,o}function uP(e,t){let n=e.current;if(n===null)throw Error(`${t} is only available inside a segment's templates — there is no active segment here. Segment-scoped functions cannot be used in variable declarations or layout-node "when" predicates, which are evaluated outside any segment.`);return n}function dP(e){return new W(e).cellLength}function fP(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function pP(e){return Math.max(1,fP(e)-(dP(`✕`)+2*e.padding+e.seamCols))}function mP(e,t,n){if(!Number.isFinite(t))return e.length>0?[e.map((e,t)=>t)]:[];let r=Math.max(1,t-n),i=[],a=[],o=0;for(let t=0;t<e.length;t++){let n=e[t];a.length===0?(a=[t],o=n):o+1+n<=r?(a.push(t),o+=1+n):(i.push(a),a=[t],o=n)}return a.length>0&&i.push(a),i}function hP(e,t,n){let r=dP(`←`)+1+dP(`→`)+1,i=mP(e,t,n);return(i.length>1?mP(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function gP(e,t){let n=[];for(let t of e)n.length>0&&n.push(new W(` `)),n.push(t);let r=W.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function _P(e,t,n,r){let i=e.compiled.get(t);if(!i||i.kind!==n)throw Error(`picker references action "${t}" which must be ${r}, got ${i?`a ${i.kind} action`:`no such action`}`);return i}function vP(e,t,n){let r=e.compiled.get(t),i=r&&VN(r);if(!i||i.kind!==`set-option`&&i.kind!==`persist-option`&&i.kind!==`layout-op-option`)throw Error(`${n} references action "${t}" which must be a set-option, persist-option, or layout-op-option action ({ set, from }, { persist, from }, or { persist, insertSegmentFrom, anchor, relation }), got ${i?`a ${i.kind} action`:`no such action`}`);return i}function yP(e,t,n,r,i,a,o){let s=vP(i,e,`picker`),c=i.compiled.get(e),l=i.store,u=WN(l,`session.id`),d=`stateVar`in s?WN(l,s.stateVar):void 0,f=r?n.kind===`led`?pP(i):fP(i):1/0,p=n.kind===`led`?0:dP(`✕`)+1,m=s.library&&{groups:s.library.groups,entries:s.options.map(s.library.entry)},h=m===void 0?hP(s.options.map(dP),f,p):aP(m.entries,m.groups,r),g=parseInt(WN(l,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>iO([{verb:MD,args:[u,t.key,String(e)]}]),b=n.kind===`led`?[]:[{verb:MD,args:[u,...n.writes.flatMap(([e,t])=>[e,t])]}],x=n.kind===`own`&&n.onPick?b:[],S=e=>iO([...JN(c,e,e,l,u).effects,...x]),C=(e,t)=>{let n=s.options[e];return KN(t,S(n),n===d,a({index:e,count:s.options.length},n))},w=n.kind===`led`?[]:[KN(`✕`,iO(b),!1,o)];_>0&&w.push(KN(`←`,y(_-1),!1));let ee=_<h.length-1?[KN(`→`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[gP([...w,...e.map(e=>C(e,s.options[e])),...ee],r)]}let te=new V({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new W(`${v[0].label}${ne}`,{style:te})]:[],ie=[gP([...w,...re,...ee],r)];for(let e of v){v.length>1&&ie.push(gP([new W(e.label,{style:te})],r));let t=Math.max(...e.indices.map(e=>dP(s.options[e])));for(let n of e.indices){let e=s.options[n],i=m.entries[n].description,a=i===void 0?void 0:_k(i),o=` `.repeat(t-dP(e)+2),c=a===void 0?e:`${e}${o}${a}`;ie.push(gP([C(n,sP(c,f))],r))}}return ie}function bP(e,t){return{picker:{fn:(n,r,i,a,o,...s)=>{xy(`picker "${n}"`,[`closeOnPick`,`paged`,`inBody`],s);let c=_P(e,r,`set-int`,`an int action ({ set, int: true })`);if(o===!0&&i===!0)throw Error(`{{ picker "${n}" … }} sets both closeOnPick and inBody; a picker in a body is closed by the body's ✕, so it has no close to fold into a pick`);let l=vP(e,n,`picker`);if(l.library!==void 0)throw Error(`{{ picker "${n}" … }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let u=uP(t,`{{ picker }}`);if(u.bg===void 0)throw Error(`{{ picker }} is not available while segments.${u.segName}'s own "bg:" is being evaluated — a picker is drawn on that background`);let[d]=yP(n,{key:c.key,stateVar:c.stateVar},o===!0?{kind:`led`}:{kind:`own`,writes:[[c.key,`-1`]],onPick:i===!0},a===!0,e,rP(u,ma(void 0),e,l.paletteOf,t.drawnAt(),u.bg),eP(u.palette,u.bg,t.drawnAt()));return d},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function xP(e,t,n,r,i){let a=Math.min(Math.floor((t-1)/2),i),o=n,s=0;for(;s<a;){let t=o+dP(e(-(s+1)))+1+dP(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function SP(e,t,n,r,i,a){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let o=n.store;if(!o.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let s=n.compiled.get(e),c=WN(o,`session.id`),{options:l}=t,u=l.length;if(u===0)return gP([],!0);let d=WN(o,t.stateVar),f=Math.max(l.indexOf(d),0),p=e=>((f+e)%u+u)%u,m=e=>l[p(e)],h=new Map,g=e=>{let t=h.get(e);if(t!==void 0)return t;let n=iO(JN(s,m(e),m(e),o,c).effects);return h.set(e,n),n},_=e=>KN(m(e),g(e),m(e)===d,r({index:p(e),count:u},m(e))),v=a===void 0?_(0):KN(m(0),iO(JN(n.compiled.get(a),m(0),void 0,o,c).effects),!1),y=xP(m,u,dP(`◀`)+1+v.cellLength+1+dP(`▶`),pP(n),i),b=e=>Array.from({length:y},(t,n)=>_(e*(n+1)));return gP([...b(-1).reverse(),KN(`◀`,g(-1),!1),v,KN(`▶`,g(1),!1),...b(1)],!0)}function CP(e,t){return{carousel:{fn:(n,...r)=>{let[i,a,...o]=r;if(xy(`carousel "${n}"`,[`neighbours`,`centre`],o),i!==void 0&&!(Number.isInteger(i)&&i>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(i)}`);if(a!==void 0&&!(typeof a==`string`&&e.compiled.has(a)))throw Error(`carousel "${n}": centre must name a declared action, got ${JSON.stringify(a)}`);if(a!==void 0&&HN(e.compiled.get(a)))throw Error(`carousel "${n}": centre "${a}" writes a value the template binds, and the centre binds none — name an action that writes a fixed value, a cycle, or a do of them`);let s=i??1/0,c=vP(e,n,`carousel`),l=uP(t,`{{ carousel }}`);if(l.bg===void 0)throw Error(`{{ carousel }} is not available while segments.${l.segName}'s own "bg:" is being evaluated — a carousel is drawn on that background`);return SP(n,c,e,rP(l,ma(void 0),e,c.paletteOf,t.drawnAt(),l.bg),s,a)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}const wP=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function TP(e,t,n){let r=La(e,{hue:sa,depth:0},n);return[ca(t.hues).map((t,n)=>({text:wP[n%wP.length],colour:Sa(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:xa(e,`warning`)},{text:`error`,colour:xa(e,`error`)}]]}function EP(e,t,n,r){let i=TP(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new W(` ${t} `,{style:$N(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new W(e)),a.push(t)}let s=W.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function DP(e,t){return{themePreview:{fn:()=>EP(e.palette,e.variation,t.drawnAt(),pP(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const OP=e=>e.slice(e.lastIndexOf(`.`)+1),kP=(e,t)=>{let n=new W(OP(e));return n.truncate(t,{marker:`…`}),n.plain};function AP(e,t){let n=e.map(e=>e.map(({name:e})=>dP(OP(e)))),r=e=>n.every(n=>n.reduce((t,n)=>t+Math.min(n,e)+2,0)<=t),i=Math.max(1,...n.flat());for(;i>1&&!r(i);)--i;return i}function jP(e,t,n,r){let i=AP(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new W(` ${kP(s,i)} `,{style:$N(l,Ja(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=W.fromFragments(a.flatMap((e,t)=>t===0?e:[new W(`
196
- `),...e]));return o.overflow=`ignore`,o.end=``,o}function MP(e,t){return{layoutPreview:{fn:()=>jP(e.layout(),e.variation,t.drawnAt(),pP(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function NP(e,t,n,r){let i=uP(r.activeSegment,`{{ menu }}`),a=r.action,o=x_(i.placementId,e,n.key),s=w_(o),c=b_(e),l=WN(a.store,o)===c,u=WN(a.store,`session.id`),d=l?Kc:c,f=KN(Yc(`{{ menu "${e}" }}`,t,2,+!!l),iO([{verb:MD,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?(()=>{let t=r.activeSegment.drawnAt(),c=La(i.palette,i.disclosure,t).plane;return yP(e,{key:s,stateVar:s},{kind:`own`,writes:[[o,Kc],[s,`0`]],onPick:n.closeOnPick},n.paged,a,rP(i,n.distribution,a,vP(a,e,`menu`).paletteOf,t,c),eP(i.palette,c,t))})():[]),f}const PP=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function FP(e,t){let n=t[t.length-1],r=PP(n)?n:void 0,i=r===void 0?t:t.slice(0,-1),a=i.findIndex(e=>typeof e!=`string`);if(a!==-1)throw Error(`{{ menu "${e}" }} display #${a+1} is not text (${JSON.stringify(i[a])}) — a menu binds its trigger text, then an optional trailing (dict …) of options`);return{displays:i,options:O_(r??{})}}function IP(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=FP(t,n);return NP(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function LP(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=RP(t,n,r),c=[];for(let e=0;e<r;e++){let t=e<s,l=t&&o!==void 0?o(e*n/r):void 0;c.push(new W(t?i:a,{style:l===void 0?void 0:new V({color:l})}))}let l=W.fromFragments(c);return l.end=``,l.overflow=`ignore`,l}function RP(e,t,n){return!Number.isFinite(e)||!Number.isFinite(t)||t<=0?0:Math.min(n,Math.max(0,Math.round(e/t*n)))}function zP(e){let t={fn:(()=>{let t=uP(e,`{{ bgOf }}`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],arity:{kind:`exact`},returnType:`string`},n={fn:(()=>uP(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=sy(()=>uP(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...BP(s)];return LP({value:e,max:t,width:n,filled:i,empty:a,colourAt:c===void 0?void 0:e=>String(r.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function BP(e){return e.flatMap(e=>{let t=e.indexOf(`:`),n=t<0?NaN:Number(e.slice(0,t));if(!Number.isFinite(n))throw Error(`{{ gauge }} stop "${e}" must be "<position>:<colour>", e.g. "80:error" or "80:#ff0000"`);return[n,e.slice(t+1)]})}function VP(e){let t=[],n=[];for(let r of e){if(!r.contains(`
191
+ `).at(-1).trim();function Tj(e){switch(e.kind){case`absent`:return;case`failed`:return{error:wj(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function Ej(e){let t=e.todos.findIndex(e=>e.active),n=e.todos.length===0?void 0:{total:e.todos.length,completed:e.todos.filter(e=>e.done).length,...t>=0&&{position:t+1,active:e.todos[t].text}},r=Dj(e.running),i=Dj(e.done),a=r===void 0&&i===void 0?void 0:{...r!==void 0&&{running:r},...i!==void 0&&{done:i}},o=e.ticket===null?void 0:{id:e.ticket.id,phase:e.ticket.phase,...e.ticket.epic!==null&&{epic:e.ticket.epic},...e.ticket.unread!==null&&{unread:e.ticket.unread}};if(!(o===void 0&&e.command===null&&n===void 0&&a===void 0))return{...o!==void 0&&{ticket:o},...e.command!==null&&{command:e.command},...n!==void 0&&{todo:n},...a!==void 0&&{tool:a}}}function Dj(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function Oj(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function kj(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function Aj(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const jj={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,autoWrap:e=>e.autoWrap?Co:wo,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?Co:wo},Mj=Object.entries(zb),Nj=new Set(Bb.map(e=>e.sessionKey)),Pj=()=>!1;function Fj(e,t){return aj(e,e=>Nj.has(e)?t(e):null,Pj)}function Ij(e,t,n,r){return e.flatMap(([e,i])=>{let a=jj[e](t);return a===null||a===jj[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function Lj(e,t,n){return jj[n](Fj(e,t))}function Rj(e,t){let n=Fj(e,t),r=aj(e,()=>null,Pj),i=aj(e,e=>e===zb.preset.sessionKey?n.preset:null,Pj);return Ij(Mj,n,e=>e===`preset`?r:i,t=>zj(e,n.preset,t.configKey))}function zj(e,t,n){return n in(N_(e.presets,t).globals??{})?wx(t,n):n}function Bj(e,t,n){let r=M_(t(zb.preset.sessionKey),e.globals.preset,e.presets),i=Tx(n);return{key:i?.scope===`globals`?zj(e,r,i.field):n,globals:F_(e,r)}}function Vj(e,t){let{preset:n}=Fj(e,t);return Wj(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Ys(a,s);return c===void 0||Js(c)===Js(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function Hj(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return j_(e.presets).flatMap(n=>{let i=Wj(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Ks(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:Ys(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const Uj=new WeakMap;function Wj(e,t){let n=Uj.get(e)??new Map;Uj.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...Ps(P_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Ws(e.segments[t.name])[n];return{id:r,setting:n,key:i,decl:a,saved:t.settings?.[n]??a.default}})),a=[...new Map(i.map(e=>[e.key,e])).values()];return n.set(t,a),a}function Gj(e,t){let n=Fj(e,t),r=aj(e,e=>e===zb.preset.sessionKey?n.preset:null,Pj);return{from:n.preset,globals:N_(e.presets,n.preset).globals??{},picks:Ij(Mj.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:Vj(e,t)}}function Kj(e){return{sessionKeys:Bb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...Tl(e)?jA.map(t=>wx(t,e)):[]]}}function qj(e){return new Set(Bb.map(e=>e.configKey).filter(t=>Kj(t).fileKeys.some(t=>Xj(e,Yj(t)))))}function Jj(e,t,n){let r=Rj(e,n),i=new Set(r.map(e=>e.configKey)),a=Gb(e=>i.has(zb[e].configKey)||t.has(zb[e].configKey));return{unsaved:r.length+Vj(e,n).length,resettable:a}}function Yj(e){let t=Tx(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return Ex(t)}function Xj(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&Xj(e[n],r)}const Zj=$a(),Qj=new Set(Zj),$j=new Set(po),eM=e=>e?Qj.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${Zj.join(`, `)})`}:{ok:!1,reason:`theme name is required`},tM=e=>e?$j.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${po.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},nM=new Set([`1`,`true`]),rM=new Set([`0`,`false`]),iM={endcaps:tM,theme:eM,"toolbar-expanded":e=>nM.has(e)?{ok:!0,value:`1`}:rM.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}},aM=dA(iM,`state`,fM);function oM(e,t){return aM.register(e,t)}function sM(e){return aM.gateFor(e)}function cM(e,t){return`set`in e?`to`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:dx(e.from,t).members}}]:`int`in e?[{key:e.set,spec:{kind:`int`}}]:`cycle`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:e.cycle}}]:[{key:e.set,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function lM(e){return e.filter(e=>e.spec.kind!==`allow-list`||!Object.hasOwn(iM,e.key))}function uM(e,t,n){let r=Kb.get(n);if(r!==void 0)return Lj(e,t,r);let i=Object.values(e.variables).find(e=>e.kind===`state`&&e.key===n);return i?.kind===`state`?i.default??null:null}function dM(e){let t=dw(e);return lM(Object.values(e.actions).flatMap(e=>cM(e,t)))}function fM(e){return lA(dM(e))}const pM=`update.dismissed`,mM=`updateNotice`,hM=zb.updateNotice.sessionKey;function gM(e){return e.kind===`source`?e.newer.digest:hO(e.newer)}const _M=e=>`${e.version} [${Jk(e.digest)}]`;function vM(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:_M(e.newer),running:_M(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:hO(e.newer),running:hO(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${_O}@${hO(e.newer)}`,`install`]}}}}const yM={kind:`idle`},bM={kind:`running`};function xM(e,t,n){if(e===null)return[];let r=gM(e);if(!n.enabled||n.dismissed===r)return[];let i=vM(e),a=`${i.headline}: ${i.newer}. You're on ${i.running}.`,o=t.kind===`failed`&&t.identity===r?[`${i.act} failed: ${t.reason}`]:[],s=[a,...o].join(`
192
+ `),c=iO([{verb:RD,args:[s]}]),l=t.kind===`running`?Ik(`[${i.busy}]`,c):Ik(`[${i.act}]`,iO([{verb:XD,args:[n.sessionId]}]));return[{severity:Fk,message:s,lines:[[Ik(a,c),l,Ik(`[dismiss]`,iO([{verb:MD,args:[n.sessionId,pM,r]}])),Ik(`[disable]`,iO([{verb:zD,args:[n.sessionId,mM,`false`]},{verb:MD,args:[n.sessionId,hM,`false`]}]))],...o.map(e=>[Ik(e,c)])]}]}function SM(e,t){return e.kind===`stale`?{kind:`source`,root:e.root,newer:e.source,running:e.running}:e.kind===`not-source-checkout`&&t!==null&&t.kind===`stale`?{kind:`release`,newer:t.latest,running:t.installed}:null}function CM(e){switch(e.kind){case`current`:return[`info`,`build: current ${_M(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${_M(e.source)}, running ${_M(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function wM(e){switch(e.kind){case`current`:return[`info`,`release: current ${hO(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${hO(e.latest)}, running ${hO(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${hO(e.installed)}, latest ${hO(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function TM(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const EM=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function DM(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=EM(e.stderr)??e.error??EM(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function OM(){let e=[pA(mM,[`false`]),oM(hM,[`false`]),oM(pM,[])];return()=>e.forEach(e=>e())}function kM(e){let{entryUrl:t,intervalMs:n,releaseIntervalMs:r,registryUrl:i,fetchImpl:a,onApplied:o,log:s}=e,c={kind:`unchecked`,reason:`not sampled yet`},l=null,u=yM,d=null,f=TM(s),p=TM(s),m=()=>SM(c,l);function h(){let e=m(),t=e===null?null:gM(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:oM(pM,[t])})}function g(){c=Qk(t,Xk),f(CM(c)),h()}async function _(){l=yO(HE,await vO(_O,a,i)),p(wM(l)),h()}return{arm(){OM(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>xM(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=vM(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=bM,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),ke({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=yM,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=DM(n);u={kind:`failed`,identity:gM(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var AM=class{static CACHE_DIR=Fe();static USAGE_CACHE_DIR=c.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=c.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=c.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return O(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(O(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(O(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return O(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=c.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),O(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await D(50);else throw e}return O(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=c.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),O(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&O(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){O(`Failed to create cache directories:`,e)}}static createProjectHash(e){return oe(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=c.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){O(`Cache for ${e} is locked, waiting...`),await D(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(O(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(O(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return O(`No shared ${e} usage cache found`),null;O(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await D(75)}}return O(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){O(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=c.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),O(`[CACHE-SET] ${e} disk cache stored`)}catch(t){O(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const jM={"claude-haiku-4-5-20251001":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-opus-4-20250514":{name:`Claude Opus 4`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1-20250805":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-sonnet-4-20250514":{name:`Claude Sonnet 4`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-4-opus-20250514":{name:`Claude 4 Opus`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-4-sonnet-20250514":{name:`Claude 4 Sonnet`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-opus-4-5":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-5-20251101":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6-20260205":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-sonnet-4-6":{name:`Claude Sonnet 4.6`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3}};var MM=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL=`https://raw.githubusercontent.com/promptctl/cc-candybar/main/pricing.json`;static async loadDiskCache(){let e=Date.now()-1440*60*1e3;return await AM.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await AM.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new re(this.GITHUB_PRICING_URL),n=ce({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){O(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){O(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(O(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),O(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(O(`Invalid pricing data structure`),e(null))}catch(t){O(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{O(`Response error:`,t),e(null)})});n.on(`error`,t=>{O(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{O(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return O(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return O(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),O(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(O(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(jM).length} models`),this.executionCache=jM,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(jM).length} models`),jM)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return O(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),O(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const NM=String.raw`(?:^|[\s;&|(])`,PM=e=>RegExp(`(?:^|:)(?:${e})$`),FM=[{phase:`impl`,tool:`Edit`,match:/^/},{phase:`impl`,tool:`MultiEdit`,match:/^/},{phase:`impl`,tool:`Write`,match:/^/},{phase:`impl`,tool:`NotebookEdit`,match:/^/},{phase:`review`,tool:`Bash`,match:RegExp(`${NM}gh\\s+pr\\s+create\\b`)},{phase:`review`,tool:`Skill`,match:PM(`code-review|simplify`)},{phase:`groom`,tool:`Bash`,match:RegExp(`${NM}lit\\s+(done|close)\\b`)},{phase:`groom`,tool:`Skill`,match:PM(`groom-backlog`)},{phase:`handoff`,tool:`Skill`,match:PM(`message-in-a-bottle`)}],IM=e=>RegExp(`${NM}lit\\s+(?:${e})(?:\\s+(?:--?[\\w-]+(?:=\\S*)?|''))*\\s+([A-Za-z0-9][\\w.-]*)`),LM=[{verb:IM(`start`),to:`in_progress`},{verb:IM(`done|close`),to:`closed`}];function RM(e){return FM.find(t=>t.tool===e.tool&&t.match.test(e.subject))?.phase}function zM(e,t){if(t.tool===`Bash`)for(let{verb:n,to:r}of LM){let i=n.exec(t.subject)?.[1];if(i!==void 0)return{call:e,id:i,to:r}}}const BM=/^lit:state (.*)$/gm;function VM(e){return[...e.matchAll(BM)].map(([e,t])=>HM(t)??{kind:`unreadable`,line:e.trim()})}function HM(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!=`object`||!t)return;let{id:n,status:r,epic:i}=t;if(typeof n!=`string`||typeof r!=`string`)return;if(i===null)return{kind:`state`,id:n,status:r,epic:null};if(typeof i!=`object`||i===void 0)return;let a=i;if(!(typeof a.id!=`string`||typeof a.done!=`number`||typeof a.total!=`number`))return{kind:`state`,id:n,status:r,epic:{id:a.id,done:a.done,total:a.total}}}function UM(e,t){let n=t??{};return{tool:e,subject:e===`Bash`&&typeof n.command==`string`?KM(n.command):e===`Skill`&&typeof n.skill==`string`?n.skill:e}}const WM=/(<<-?\s*(['"]?)(\w+)\2[^\n]*\n)[\s\S]*?\n\s*\3(?=\n|$)/g,GM=/'[^']*'|"(?:[^"\\]|\\.)*"/g;function KM(e){return e.replace(WM,`$1`).replace(GM,`''`)}function qM(e){return typeof e==`string`?[e]:Array.isArray(e)?e.flatMap(e=>typeof e==`object`&&e&&typeof e.text==`string`?[e.text]:[]):[]}const JM=/^(\S+) \[(open|in_progress|closed)\//gm,YM=/^Ticket (\S+) has been closed\./gm,XM={sentinels:[],said:[]};function ZM(e){let t;for(let n of qM(e)){let e=n.includes(`lit:state `),r=n.includes(` [`),i=n.includes(`has been closed.`);if(!(!e&&!r&&!i)){if(t??={sentinels:[],said:[]},e&&t.sentinels.push(...VM(n)),r)for(let[,e,r]of n.matchAll(JM))t.said.push({id:e,status:r});if(i)for(let[,e]of n.matchAll(YM))t.said.push({id:e,status:`closed`})}}if(t===void 0)return XM;for(let e of t.sentinels)e.kind===`state`&&t.said.push({id:e.id,status:e.status});return t}const QM=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function $M(e){if(typeof e==`string`)return QM.exec(e)?.[1]}function eN(e){let t=e?.todos;if(!Array.isArray(t))return;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let{content:t,activeForm:r,status:i}=e,a=i===`in_progress`,o=a&&typeof r==`string`?r:t;typeof o==`string`&&n.push({text:o,active:a,done:i===`completed`})}return n}function tN(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o,s=[],c=[],l,u=[];if(typeof t==`string`)o=t;else if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;switch(t.type){case`tool_use`:{let{id:e,name:n}=t;if(typeof e!=`string`||typeof n!=`string`)break;r.push({id:e,name:n});let i=UM(n,t.input),o=zM(e,i);o!==void 0&&s.push(o),l=RM(i)??l,n===`TodoWrite`&&(a=eN(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id,n=ZM(t.content);if(u.push(...n.sentinels),typeof e==`string`){i.push(e);for(let t of n.said)c.push({call:e,...t})}break}case`text`:o??=t.text;break;default:break}}let d=n?$M(o):void 0,f=s.length===0&&l===void 0&&u.length===0&&c.length===0?void 0:{...s.length>0&&{claims:s},...l!==void 0&&{phase:l},...u.length>0&&{sentinels:u},...c.length>0&&{said:c}};if(!(r.length===0&&i.length===0&&a===void 0&&d===void 0&&f===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...d!==void 0&&{command:d},...f!==void 0&&{lit:f}}}function nN(e){if(e!==void 0)return[e];let t=h();return[f(t,`.config`,`claude`),f(t,`.claude`)].filter(e=>a(e))}async function rN(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await IA(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=f(e,r.name);t.push(n)}}catch(t){O(`Failed to read projects directory ${e}:`,t)}}return t}async function iN(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await IA(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=f(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await LA(t,`utf-8`)).split(`
193
+ `)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{O(`Failed to check agent file ${t}`)}}}catch(e){O(`Failed to read subagents directory ${i}:`,e)}return r}function aN(e){let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.firstContentType===`tool_result`;return t===`user`&&!n}const oN=new Map;async function sN(e){try{let t=await RA(e),n=t.size,r=oN.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),oN.delete(e),oN.set(e,r),r.entries;let i;return n>1048576?(O(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await fN(e)):i=await uN(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(oN.delete(e),oN.size>=16&&oN.delete(oN.keys().next().value),oN.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return O(`Transcript not present yet: ${e}`),[];throw t}}function cN(e){if(!e.timestamp)return null;let t=e.message,n=t?.usage,r=t?.content,i=Array.isArray(r)&&typeof r[0]==`object`&&r[0]?r[0]:void 0;return{timestamp:new Date(e.timestamp),type:typeof e.type==`string`?e.type:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n,role:typeof t.role==`string`?t.role:void 0,type:typeof t.type==`string`?t.type:void 0,firstContentType:typeof i?.type==`string`?i.type:void 0}:void 0,costUSD:typeof e.costUSD==`number`?e.costUSD:void 0,isSidechain:e.isSidechain===!0,activity:tN(e),raw:{model:typeof e.model==`string`?e.model:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n}:void 0,requestId:typeof e.requestId==`string`?e.requestId:void 0}}}function lN(e){let t=[];for(let n of e.split(`
194
+ `))if(n.trim())try{let e=cN(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function uN(e){return lN(await LA(e,`utf-8`))}async function dN(e,t){let n=await zA(e,t===void 0?void 0:{offset:t.offset,ino:t.ino});if(n.kind!==`ok`)return n;let{buf:r,start:i,mtimeMs:a,ino:o,reset:s}=n.value,c=r.lastIndexOf(10);return J(c<0?{entries:[],cursor:{offset:i,mtimeMs:a,ino:o},reset:s}:{entries:lN(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function fN(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=le({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=cN(JSON.parse(t));e&&r.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{O(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{O(`File stream error for ${e}:`,t),n(t)})})}var pN=class{inflight=new Map;run(e,t){return this.inflight.get(e)??this.start(e,t)}start(e,t){let n=t();this.inflight.set(e,n);let r=()=>{this.inflight.get(e)===n&&this.inflight.delete(e)};return n.then(r,r),n}get size(){return this.inflight.size}};function mN(e,t){let n=e?e.input+e.cacheCreation+e.cacheRead:0,r=e?e.output:0;return{input:n,output:r,total:n+r,atMs:t}}const hN=new Map,gN={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},_N={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function vN(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function yN(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function bN(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function xN(e,t,n,r){let i=vN(new Date(yN())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:bN(),l=new Map;if(a)for(let[e,t]of a.days)e>=i&&l.set(e,{...t});for(let e of n){let t=e.message?.usage;if(!t)continue;o++;let n=e.costUSD??await MM.calculateCostForEntry(e.raw);s+=n,c.input+=t.input_tokens||0,c.output+=t.output_tokens||0,c.cacheCreation+=t.cache_creation_input_tokens||0,c.cacheRead+=t.cache_read_input_tokens||0;let r=vN(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...gN};a.cost+=n,a.input+=t.input_tokens||0,a.output+=t.output_tokens||0,a.cacheCreation+=t.cache_creation_input_tokens||0,a.cacheRead+=t.cache_read_input_tokens||0,l.set(r,a)}return{cursor:r,entries:o,cost:s,breakdown:c,days:l}}function SN(e){let t=0,n=0,r=bN(),i=new Map;for(let a of e.values()){t+=a.entries,n+=a.cost,r.input+=a.breakdown.input,r.output+=a.breakdown.output,r.cacheCreation+=a.breakdown.cacheCreation,r.cacheRead+=a.breakdown.cacheRead;for(let[e,t]of a.days){let n=i.get(e)??{...gN};n.cost+=t.cost,n.input+=t.input,n.output+=t.output,n.cacheCreation+=t.cacheCreation,n.cacheRead+=t.cacheRead,i.set(e,n)}}if(t===0)return{sessionInfo:_N,days:i};let a=r.input+r.output+r.cacheCreation+r.cacheRead;return{sessionInfo:{cost:n,calculatedCost:n,officialCost:null,tokens:a,tokenBreakdown:r},days:i}}async function CN(e,t,n){let r=0,i=async()=>{for(;r<e.length;){let t=e[r++];await n(t)}},a=Math.min(t,e.length);await Promise.all(Array.from({length:a},i))}var wN=class{entries=new Map;flight=new pN;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new pN;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??ib,this.maxEntries=e.maxEntries??256,this.staleAgeMs=e.staleAgeMs??864e5;let t=e.sweepIntervalMs??3e5;t>0&&(this.sweepTimer=setInterval(()=>this.sweepStale(),t),this.sweepTimer.unref())}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,sweeps:this.sweeps,seeds:this.seeds}}async getUsageInfo(e,t){let n=await this.ingest(e,t?.transcript_path);if(n.kind===`failed`)return n;let r=n.kind===`ok`?n.value.sessionInfo:_N,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t){let n=vN(new Date),r=nN(t);try{await this.ensureSeeded(n,r)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let i=await this.ingest(e?.session_id??``,e?.transcript_path);if(i.kind===`failed`)return i;let a=r.map(e=>f(e,`projects`)+p),o={...gN},s=!1;for(let[t,r]of this.entries){let i=r.transcriptPath??``,c=t===e?.session_id||a.some(e=>i.startsWith(e))?r.days:hN;s||=c.has(n);let l=c.get(n)??gN;o.cost+=l.cost,o.input+=l.input,o.output+=l.output,o.cacheCreation+=l.cacheCreation,o.cacheRead+=l.cacheRead}return s?J({cost:o.cost,tokens:o.input+o.output+o.cacheCreation+o.cacheRead,tokenBreakdown:{input:o.input,output:o.output,cacheCreation:o.cacheCreation,cacheRead:o.cacheRead},date:n}):Y}async observeSpeed(e,t,n){let r=NA(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=mN(i.kind===`ok`?i.value.sessionInfo.tokenBreakdown:null,n),o=this.speedRings.get(e)??[],s;for(let e of o)e.atMs<a.atMs&&(s===void 0||e.atMs>s.atMs)&&(s=e);return o.push(a),o.sort((e,t)=>e.atMs-t.atMs),o.length>64&&o.shift(),this.speedRings.set(e,o),J({...s!==void 0&&{prev:s},cur:a,samples:[...o]})})}async ingest(e,t,n){if(!e)return Y;let r=n??NA(t),i=this.entries.get(e);if(i&&r!==0&&i.transcriptMtime===r)return i.lastSeenAt=Date.now(),this.entries.delete(e),this.entries.set(e,i),this.hits++,J(i);if(!t)return i?J(i):Y;this.misses++;let a;try{a=await this.flight.run(`${e}:${r}`,()=>this.refold(e,t,this.entries.get(e)))}catch(t){return X(`usage refold (${e}): ${t instanceof Error?t.message:String(t)}`)}if(a.kind!==`ok`)return a;let o={files:a.value.files,sessionInfo:a.value.sessionInfo,days:a.value.days,transcriptMtime:a.value.mainMtime,transcriptPath:t,lastSeenAt:Date.now()};return this.entries.delete(e),this.entries.set(e,o),this.evictIfNeeded(),J(o)}async refold(e,t,n){let r=await iN(e,u(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await dN(e,r?.cursor);if(o.kind===`failed`)return o;if(o.kind===`absent`){r&&i.set(e,r);continue}let{entries:s,cursor:c,reset:l}=o.value;i.set(e,await xN(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...SN(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=yN(),n=await rN(e),r=[];for(let e of n){let n;try{n=await IA(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await RA(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await CN(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},TN=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return O(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);O(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{O(`Calculating context tokens from transcript: ${e}`);let n=await sN(e);if(n.length===0)return O(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,O(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return O(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},EN=class{states=new Map;constructor(e,t,n=256){this.empty=e,this.step=t,this.maxSessions=n}async read(e,t){let n=this.states.get(e),r=NA(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await dN(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:n?.value??this.empty};let{entries:a,cursor:o,reset:s}=i.value,c=s||n===void 0?this.empty:n.value;for(let e of a)c=this.step(c,e);for(this.touch(e,{cursor:o,value:c});this.states.size>this.maxSessions;){let e=this.states.keys().next().value;if(e===void 0)break;this.states.delete(e)}return{kind:`ok`,value:c}}touch(e,t){this.states.delete(e),this.states.set(e,t)}};const DN={messageCount:0,recent:[]};function ON(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!aN(t),recent:n.length>20?n.slice(-20):n}}function kN(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(aN(r))t=r.timestamp;else if(e===`assistant`&&t){let e=(r.timestamp.getTime()-t.getTime())/1e3;e>.1&&e<300&&(n=e)}}return n}var AN=class{fold=new EN(DN,ON);async getMetricsInfo(e,t){if(O(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:kN(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};function jN(e,t,n){return n.some(e=>e.call===t.call&&e.id===t.id&&e.status===t.to)?t.to===`closed`?e?.id===t.id?null:e:{id:t.id,phase:`prep`,epic:e?.id===t.id?e.epic:null,unread:null}:e}function MN(e,t,n){let r=[...e.claims,...t?.claims??[]],i=e=>n.includes(e.call),a=r.filter(i).reduce((e,n)=>jN(e,n,t?.said??[]),e.ticket),o=r.filter(e=>!i(e));if(a===null||t===void 0)return{claims:o,ticket:a};let s=t.sentinels??[],c=s.findLast(e=>e.kind===`state`&&e.id===a.id),l=s.findLast(e=>e.kind===`unreadable`);return{claims:o,ticket:{id:a.id,phase:t.phase??a.phase,epic:c?.kind===`state`?c.epic:a.epic,unread:l?.kind===`unreadable`?l.line:a.unread}}}const NN={ticket:null,claims:[],command:null,todos:[],pending:[],done:[]};function PN(e,t){let n=e.findIndex(e=>e.name===t);return n<0?[...e,{name:t,count:1}]:e.map((e,t)=>t===n?{name:e.name,count:e.count+1}:e)}function FN(e,t){if(t.isSidechain)return e;let n=aN(t)?{...e,command:t.activity?.command??null,pending:[],done:[]}:e,r=t.activity;if(r===void 0)return n;let i=n.pending,a=n.done;r.started!==void 0&&(i=[...i,...r.started]);for(let e of r.finished??[]){let t=i.findIndex(t=>t.id===e);t<0||(a=PN(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos,...MN(n,r.lit,r.finished??[])}}function IN(e){return{ticket:e.ticket,command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>PN(e,t.name),[]),done:e.done}}var LN=class{fold=new EN(NN,FN);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(IN(n.value))}};function RN(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function zN(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function BN(e,t,n,r){return zN(Ae(RN(e,t,n,r)),n)}async function VN(e,t,n){return zN(await ke(RN(e,t,n)),n)}const HN=e=>`${e.socket}\n${e.pane}`;var UN=class{names=new Map;asking=new pN;constructor(e=Date.now){this.now=e}getSessionName(e){let t=HN(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){O(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await VN(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const WN=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:Ze.map(t=>e.env?.[t]??null)]);var GN=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=WN(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=WN(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function KN(e){return{gitProvider:new pb({watchers:e.watchers,logger:e.logger}),usageStore:new wN({logger:e.logger}),contextProvider:new TN,metricsProvider:new AN,activityProvider:new LN,tmuxService:new UN,mementoProvider:new GN(rj()),autoCompact:wS,log:e.logger}}function qN(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function JN(e,t){let n=W.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function YN(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function XN({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function ZN(e){let t=XN(e);if(t.length===1)return e.text;let n=JN(t);return n.style=e.text.style,n}function QN(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,lead:s=[],trail:c=[]}=t;if(e.length===0)return[];let l=JN(e,a).pad(o),u=new W(` `.repeat(o)),d={...s.length>0&&{lead:JN([u,...s],a)},...c.length>0&&{trail:JN([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(YN(l,n,f),[{text:l,...d}])}const $N=RegExp(`\\x1b\\[[0-9;]*m|${xi.source}`,`g`);function eP(e){return M(e.replace($N,``))}function tP(e,t){let n=e.map(ZN),r=[];if(e.forEach(({fill:e},t)=>{e!==void 0&&r.push({at:t,how:e})}),r.length===0||!Number.isFinite(t.width))return n;let i=jk(n,t).split(`
195
+ `);if(i.length>1)return n;let a=Math.max(0,t.width-eP(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:i},a)=>{let c=o+(a===r.length-1?s:0),{text:l}=e[t];YN(l,l.cellLength+c,i),n[t]=ZN(e[t])}),n}function nP(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=rP(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(aP(a.style).link){i();let e=rP([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function rP(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>iP(e,t)):e,r=W.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function iP(e,t){let n=e.copy();return n.style=t.add(aP(e.style)),n}function aP(e){return e instanceof V?e:V.parse(e)}function oP(e,t,n,r){let i=new Map,a=Object.entries(t);for(let[t,o]of[...a.filter(([,e])=>!(`do`in e)),...a.filter(([,e])=>`do`in e)])i.set(t,sP(e,t,o,n,r,i));return i}function sP(e,t,n,r,i,a){if(`set`in n){let e=r.get(n.set)??n.set;if(`to`in n)return{kind:`set-literal`,key:n.set,value:n.to,stateVar:e};if(`from`in n){let t=dx(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Ub.get(n.persist)??n.persist;if(`to`in n)return{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e};if(`from`in n){let t=dx(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=dx(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:uP(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:uP(e,n.open,t)};if(`reset`in n)return{kind:`reset`,key:n.reset};if(`doctor`in n)return n.doctor===`run`?{kind:`doctor-run`}:{kind:`doctor-fix`,check:n.check};if(`ceiling`in n)return{kind:`ceiling`,args:jw(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:uP(e,n.name,t)};let[o,...s]=n.do.map(e=>{let n=a.get(e);if(n===void 0)throw Error(`action "${t}" fires "${e}", which is not declared in this config`);return n});return{kind:`do`,head:o,rest:s}}function cP(e){return e.kind===`do`?cP(e.head):e}function lP(e){switch(cP(e).kind){case`set-option`:case`set-int`:case`persist-option`:case`layout-op-option`:return!0;case`set-literal`:case`set-bounded`:case`set-cycle`:case`copy`:case`open`:case`persist-literal`:case`persist-bounded`:case`persist-cycle`:case`reset`:case`layout-op`:case`undo`:case`redo`:case`back`:case`rewind`:case`save`:case`preset-save`:case`preset-delete`:case`doctor-run`:case`doctor-fix`:case`ceiling`:case`slash`:case`do`:return!1}}function uP(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function dP(e,t){return e.has(t)?Fv(e.read(t)):``}function fP(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function pP(e,t,n,r){let i=new W(e,{style:V.combine([r,new V({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function mP(e,t){return Math.max(e.members.indexOf(dP(t,e.stateVar)),0)}function hP(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=dP(r,e.stateVar);return{effects:[{verb:MD,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=dP(r,e.stateVar);return{effects:[{verb:MD,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=dP(r,e.stateVar);return{effects:[{verb:MD,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(mP(e,r)+1)%e.members.length];return{effects:[{verb:MD,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:ND,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:PD,args:[fP(e.text,Dy(r))]}],active:!1};case`open`:return{effects:[{verb:FD,args:[fP(e.target,Dy(r))]}],active:!1};case`persist-literal`:{let t=dP(r,e.stateVar);return{effects:[{verb:zD,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=dP(r,e.stateVar);return{effects:[{verb:zD,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(mP(e,r)+1)%e.members.length];return{effects:[{verb:zD,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:BD,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:WD,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:KD,args:[i]}],active:!1};case`redo`:return{effects:[{verb:qD,args:[i]}],active:!1};case`back`:return{effects:[{verb:JD,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:YD,args:[i]}],active:!1};case`save`:return{effects:[{verb:VD,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:HD,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:UD,args:[i,fP(e.name,Dy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:ZD,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:QD,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:eO,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:tO,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:GD,args:[i,e.key,$k(e.op)]}],active:!1};case`do`:{let a=hP(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>hP(e,t,void 0,r,i).effects)],active:a.active}}case`layout-op-option`:{let r={op:`insert`,segment:n??t,anchor:e.anchor,relation:e.relation};return{effects:[{verb:GD,args:[i,e.key,$k(r)]}],active:!1}}}}function gP(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:Yc(`action "${e}"`,n,t.members.length,mP(t,r)),boundValue:void 0};if(n.length>2)throw Error(`action "${e}" takes a display and an optional bound value, got ${n.length} arguments (per-state displays are a cycle action's form)`);return{display:n[0],boundValue:n[1]}}function _P(e,t,n){let r=n.compiled.get(e);if(!r)throw Error(`action "${e}" is not declared in this config`);let i=n.store,{display:a,boundValue:o}=gP(e,cP(r),t,i),{effects:s,active:c}=hP(r,a,o,i,dP(i,`session.id`));return pP(a,iO(s),c)}function vP(e){return{action:{fn:(t,...n)=>_P(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function yP(e,t){return pP(`✕`,iO([{verb:MD,args:[dP(e,`session.id`),t,Kc]}]),!1)}function bP(e,t,n){return new V({bgcolor:L.fromRgba(t),color:L.fromRgba(ja(e,t,n))})}function xP(e,t,n){return new V({color:L.fromRgba(cr(xa(e,`warning`),t,Aa,n))})}function SP(e,t,n){return V.combine([bP(e,t,n),xP(e,t,n)])}function CP(e,t,n){return bP(e.palette,Wa(e.palette,e.disclosure,[t],n),n)}function wP(e,t,n,r,i,a){return r===void 0?n=>CP(e,{...n,distribution:t},i):(e,t)=>TP(r(t,n),a,i)}function TP(e,t,n){return new V({bgcolor:L.fromRgba(t),color:L.fromRgba(cr(xa(e,`primary`),t,4.5,n))})}function EP(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>DP(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function DP(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function OP(e,t){return new W(e).truncate(t,{marker:`…`}).plain}function kP(e){return{current:null,drawnAt:e}}function AP(e,t,n,r,i,a){let o={segName:t,placementId:n,palette:r,disclosure:i,tint:a,bg:void 0,drops:[]};return e.current=o,o}function jP(e,t){let n=e.current;if(n===null)throw Error(`${t} is only available inside a segment's templates — there is no active segment here. Segment-scoped functions cannot be used in variable declarations or layout-node "when" predicates, which are evaluated outside any segment.`);return n}function MP(e){return new W(e).cellLength}function NP(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function PP(e){return Math.max(1,NP(e)-(MP(`✕`)+2*e.padding+e.seamCols))}function FP(e,t,n){if(!Number.isFinite(t))return e.length>0?[e.map((e,t)=>t)]:[];let r=Math.max(1,t-n),i=[],a=[],o=0;for(let t=0;t<e.length;t++){let n=e[t];a.length===0?(a=[t],o=n):o+1+n<=r?(a.push(t),o+=1+n):(i.push(a),a=[t],o=n)}return a.length>0&&i.push(a),i}function IP(e,t,n){let r=MP(`←`)+1+MP(`→`)+1,i=FP(e,t,n);return(i.length>1?FP(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function LP(e,t){let n=[];for(let t of e)n.length>0&&n.push(new W(` `)),n.push(t);let r=W.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function RP(e,t,n,r){let i=e.compiled.get(t);if(!i||i.kind!==n)throw Error(`picker references action "${t}" which must be ${r}, got ${i?`a ${i.kind} action`:`no such action`}`);return i}function zP(e,t,n){let r=e.compiled.get(t),i=r&&cP(r);if(!i||i.kind!==`set-option`&&i.kind!==`persist-option`&&i.kind!==`layout-op-option`)throw Error(`${n} references action "${t}" which must be a set-option, persist-option, or layout-op-option action ({ set, from }, { persist, from }, or { persist, insertSegmentFrom, anchor, relation }), got ${i?`a ${i.kind} action`:`no such action`}`);return i}function BP(e,t,n,r,i,a,o){let s=zP(i,e,`picker`),c=i.compiled.get(e),l=i.store,u=dP(l,`session.id`),d=`stateVar`in s?dP(l,s.stateVar):void 0,f=r?n.kind===`led`?PP(i):NP(i):1/0,p=n.kind===`led`?0:MP(`✕`)+1,m=s.library&&{groups:s.library.groups,entries:s.options.map(s.library.entry)},h=m===void 0?IP(s.options.map(MP),f,p):EP(m.entries,m.groups,r),g=parseInt(dP(l,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>iO([{verb:MD,args:[u,t.key,String(e)]}]),b=n.kind===`led`?[]:[{verb:MD,args:[u,...n.writes.flatMap(([e,t])=>[e,t])]}],x=n.kind===`own`&&n.onPick?b:[],S=e=>iO([...hP(c,e,e,l,u).effects,...x]),C=(e,t)=>{let n=s.options[e];return pP(t,S(n),n===d,a({index:e,count:s.options.length},n))},w=n.kind===`led`?[]:[pP(`✕`,iO(b),!1,o)];_>0&&w.push(pP(`←`,y(_-1),!1));let ee=_<h.length-1?[pP(`→`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[LP([...w,...e.map(e=>C(e,s.options[e])),...ee],r)]}let te=new V({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new W(`${v[0].label}${ne}`,{style:te})]:[],ie=[LP([...w,...re,...ee],r)];for(let e of v){v.length>1&&ie.push(LP([new W(e.label,{style:te})],r));let t=Math.max(...e.indices.map(e=>MP(s.options[e])));for(let n of e.indices){let e=s.options[n],i=m.entries[n].description,a=i===void 0?void 0:_k(i),o=` `.repeat(t-MP(e)+2),c=a===void 0?e:`${e}${o}${a}`;ie.push(LP([C(n,OP(c,f))],r))}}return ie}function VP(e,t){return{picker:{fn:(n,r,i,a,o,...s)=>{xy(`picker "${n}"`,[`closeOnPick`,`paged`,`inBody`],s);let c=RP(e,r,`set-int`,`an int action ({ set, int: true })`);if(o===!0&&i===!0)throw Error(`{{ picker "${n}" … }} sets both closeOnPick and inBody; a picker in a body is closed by the body's ✕, so it has no close to fold into a pick`);let l=zP(e,n,`picker`);if(l.library!==void 0)throw Error(`{{ picker "${n}" … }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let u=jP(t,`{{ picker }}`);if(u.bg===void 0)throw Error(`{{ picker }} is not available while segments.${u.segName}'s own "bg:" is being evaluated — a picker is drawn on that background`);let[d]=BP(n,{key:c.key,stateVar:c.stateVar},o===!0?{kind:`led`}:{kind:`own`,writes:[[c.key,`-1`]],onPick:i===!0},a===!0,e,wP(u,ma(void 0),e,l.paletteOf,t.drawnAt(),u.bg),xP(u.palette,u.bg,t.drawnAt()));return d},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function HP(e,t,n,r,i){let a=Math.min(Math.floor((t-1)/2),i),o=n,s=0;for(;s<a;){let t=o+MP(e(-(s+1)))+1+MP(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function UP(e,t,n,r,i,a){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let o=n.store;if(!o.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let s=n.compiled.get(e),c=dP(o,`session.id`),{options:l}=t,u=l.length;if(u===0)return LP([],!0);let d=dP(o,t.stateVar),f=Math.max(l.indexOf(d),0),p=e=>((f+e)%u+u)%u,m=e=>l[p(e)],h=new Map,g=e=>{let t=h.get(e);if(t!==void 0)return t;let n=iO(hP(s,m(e),m(e),o,c).effects);return h.set(e,n),n},_=e=>pP(m(e),g(e),m(e)===d,r({index:p(e),count:u},m(e))),v=a===void 0?_(0):pP(m(0),iO(hP(n.compiled.get(a),m(0),void 0,o,c).effects),!1),y=HP(m,u,MP(`◀`)+1+v.cellLength+1+MP(`▶`),PP(n),i),b=e=>Array.from({length:y},(t,n)=>_(e*(n+1)));return LP([...b(-1).reverse(),pP(`◀`,g(-1),!1),v,pP(`▶`,g(1),!1),...b(1)],!0)}function WP(e,t){return{carousel:{fn:(n,...r)=>{let[i,a,...o]=r;if(xy(`carousel "${n}"`,[`neighbours`,`centre`],o),i!==void 0&&!(Number.isInteger(i)&&i>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(i)}`);if(a!==void 0&&!(typeof a==`string`&&e.compiled.has(a)))throw Error(`carousel "${n}": centre must name a declared action, got ${JSON.stringify(a)}`);if(a!==void 0&&lP(e.compiled.get(a)))throw Error(`carousel "${n}": centre "${a}" writes a value the template binds, and the centre binds none — name an action that writes a fixed value, a cycle, or a do of them`);let s=i??1/0,c=zP(e,n,`carousel`),l=jP(t,`{{ carousel }}`);if(l.bg===void 0)throw Error(`{{ carousel }} is not available while segments.${l.segName}'s own "bg:" is being evaluated — a carousel is drawn on that background`);return UP(n,c,e,wP(l,ma(void 0),e,c.paletteOf,t.drawnAt(),l.bg),s,a)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}const GP=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function KP(e,t,n){let r=La(e,{hue:sa,depth:0},n);return[ca(t.hues).map((t,n)=>({text:GP[n%GP.length],colour:Sa(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:xa(e,`warning`)},{text:`error`,colour:xa(e,`error`)}]]}function qP(e,t,n,r){let i=KP(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new W(` ${t} `,{style:bP(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new W(e)),a.push(t)}let s=W.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function JP(e,t){return{themePreview:{fn:()=>qP(e.palette,e.variation,t.drawnAt(),PP(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const YP=e=>e.slice(e.lastIndexOf(`.`)+1),XP=(e,t)=>{let n=new W(YP(e));return n.truncate(t,{marker:`…`}),n.plain};function ZP(e,t){let n=e.map(e=>e.map(({name:e})=>MP(YP(e)))),r=e=>n.every(n=>n.reduce((t,n)=>t+Math.min(n,e)+2,0)<=t),i=Math.max(1,...n.flat());for(;i>1&&!r(i);)--i;return i}function QP(e,t,n,r){let i=ZP(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new W(` ${XP(s,i)} `,{style:bP(l,Ja(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=W.fromFragments(a.flatMap((e,t)=>t===0?e:[new W(`
196
+ `),...e]));return o.overflow=`ignore`,o.end=``,o}function $P(e,t){return{layoutPreview:{fn:()=>QP(e.layout(),e.variation,t.drawnAt(),PP(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function eF(e,t,n,r){let i=jP(r.activeSegment,`{{ menu }}`),a=r.action,o=x_(i.placementId,e,n.key),s=w_(o),c=b_(e),l=dP(a.store,o)===c,u=dP(a.store,`session.id`),d=l?Kc:c,f=pP(Yc(`{{ menu "${e}" }}`,t,2,+!!l),iO([{verb:MD,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?(()=>{let t=r.activeSegment.drawnAt(),c=La(i.palette,i.disclosure,t).plane;return BP(e,{key:s,stateVar:s},{kind:`own`,writes:[[o,Kc],[s,`0`]],onPick:n.closeOnPick},n.paged,a,wP(i,n.distribution,a,zP(a,e,`menu`).paletteOf,t,c),xP(i.palette,c,t))})():[]),f}const tF=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function nF(e,t){let n=t[t.length-1],r=tF(n)?n:void 0,i=r===void 0?t:t.slice(0,-1),a=i.findIndex(e=>typeof e!=`string`);if(a!==-1)throw Error(`{{ menu "${e}" }} display #${a+1} is not text (${JSON.stringify(i[a])}) — a menu binds its trigger text, then an optional trailing (dict …) of options`);return{displays:i,options:O_(r??{})}}function rF(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=nF(t,n);return eF(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function iF(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=aF(t,n,r),c=[];for(let e=0;e<r;e++){let t=e<s,l=t&&o!==void 0?o(e*n/r):void 0;c.push(new W(t?i:a,{style:l===void 0?void 0:new V({color:l})}))}let l=W.fromFragments(c);return l.end=``,l.overflow=`ignore`,l}function aF(e,t,n){return!Number.isFinite(e)||!Number.isFinite(t)||t<=0?0:Math.min(n,Math.max(0,Math.round(e/t*n)))}function oF(e){let t={fn:(()=>{let t=jP(e,`{{ bgOf }}`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],arity:{kind:`exact`},returnType:`string`},n={fn:(()=>jP(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=sy(()=>jP(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...sF(s)];return iF({value:e,max:t,width:n,filled:i,empty:a,colourAt:c===void 0?void 0:e=>String(r.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function sF(e){return e.flatMap(e=>{let t=e.indexOf(`:`),n=t<0?NaN:Number(e.slice(0,t));if(!Number.isFinite(n))throw Error(`{{ gauge }} stop "${e}" must be "<position>:<colour>", e.g. "80:error" or "80:#ff0000"`);return[n,e.slice(t+1)]})}function cF(e){let t=[],n=[];for(let r of e){if(!r.contains(`
197
197
  `)){n.push(r);continue}let e=r.split(`
198
- `);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function HP(e,t){let n=t.flatMap(e=>e.filter(e=>e.place===`above`)),r=t.map(e=>e.filter(e=>e.place===`flow`));return[...n,...UP(e,r)]}function UP(e,t){switch(e){case`vertical`:return t.flatMap(e=>e);case`horizontal`:return t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,place:`flow`},...t.flatMap(e=>e.slice(1))]}}function WP(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:HP(e.direction,e.children.map((t,i)=>n(t,[...r,GP(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function GP(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:ks[e.direction]}}const KP={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:ma(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Fs(t.path,n)))}},render(e,t){return HP(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,GP(e,r))))}},qP={drop:e=>e.place,above:()=>`above`},JP={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},YP={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:As(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Qc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Is(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render(e,t){let n=t.lookupSegment(e.name);if(!n)throw Error(`Layout segment "${e.name}" has no matching segment`);let{seg:r,compiled:i}=n;if(!t.visible)return[];let a=ky(t.scope,e.settings);try{if(!EN(i.when,a))return[];let n=Qb(e.settings.theme,t.palette),o=e.opens!==void 0&&EN(e.opens.open,t.scope),{styles:s,fragments:c,lead:l,trail:u,drops:d,open:f}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},o),p=f?s.trigger:s.closed,m={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:p,padding:t.padding},h=e.opens,g=h===void 0?[]:t.renderBody(h.body,o,s.disclosure).map(e=>({...e,place:qP[h.placement](e)})),_=VP(FN(c,p)).map((e,t)=>({cells:jN(e,{...m,lead:t===0?FN(l,p):[],trail:t===0?FN(u,p):[]}),band:`own`,place:`flow`})),v=d.map(e=>({cells:jN(FN([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),y=(e,t,n)=>jN(FN([e],t),{...m,width:`auto`,baseStyle:t,padding:n}),b=g.findIndex(e=>e.band===`own`),{lead:x,stays:S}=h!==void 0&&b!==-1?JP[h.placement](_,()=>y(t.closeDisclosure(h.key),s.close,t.padding)):{lead:[],stays:_},C=x.flatMap(e=>y(new W(` `.repeat(kN(e).reduce((e,t)=>e+t.cellLength,0))),s.trigger,0)),w=(e,t)=>e.band===`own`?t===b?x:C:[],ee=g.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),te=[...S,...v];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...te.flatMap(e=>e.cells),...g.flatMap(w)].flatMap(kN)),[...te,...ee]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:jN([new W(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:XP(e.lead,e,a,t),trail:XP(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function XP(e,t,n,r){if(e===void 0)return[];try{return r.evaluateSegment(t,n,r.palette,r.region,{bg:void 0,fg:void 0,body:e,lead:void 0,trail:void 0},!1).fragments}catch(e){return r.onSegmentError?.(t.id,e.message??String(e)),[]}}const ZP={container:KP,segment:YP};function QP(e){return ZP[e]}function $P(e){if(`ttl`in e)return{kind:`ttl`,durationMs:yb(e.ttl)};if(`watch_file`in e)return{kind:`watch_file`,path:e.watch_file};if(`depends_on`in e)return{kind:`depends_on`,varNames:e.depends_on};if(`key`in e)return{kind:`key`,template:e.key};if(`never`in e)return{kind:`never`};throw Error(`Unknown CacheDecl discriminator — loader invariant violated: ${JSON.stringify(e)}`)}function eF(e,t){switch(zs(e)){case`json`:return{kind:`json`,default:t};case`regex`:return{kind:`regex`,regex:new RegExp(e.regex),default:t};case`text`:return{kind:`text`,default:t}}}function tF(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`input`:e.declareInput(t,n.path,n.type??`string`,n.default);break;case`env`:e.declareEnv(t,n.name,n.default);break;case`file`:e.declareFile(t,n.path,{readMode:n.readMode,cache:$P(n.cache),parse:eF(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:$P(n.cache),parse:eF(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,ttlMs:n.cache?yb(n.cache.ttl):void 0,varDefault:n.default});break;case`git`:e.declareGit(t,{field:n.field,cwd:r,varDefault:n.default});break;case`state`:e.declareState(t,{key:n.key,...n.default!==void 0&&{varDefault:n.default}});break}}function nF(e,t){let n=$d.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}const rF=e=>So(void 0,null,e.globals.variation);function iF(e,t,n){let r=n.cwd,i=ax(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:kk({endcaps:`powerline`,charset:_o}),width:80,basePalette:i,palette:i,variation:oa[rF(e)],padding:1,seamCols:Ak({endcaps:`powerline`,charset:_o}),layout:()=>[]},o=cP(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=j_(e.presets),u=dw(e),d=Ey({...ZN(a),...bP(a,o),...CP(a,o),...DP(a,o),...MP(a,o),...IP(s),...zP(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=nF(d,e.helpers),p=e=>d.parse(e,f),m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=p(e);return m.set(e,n),n},g=new Map;for(let[t,n]of Wb)n in e.variables&&g.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!g.has(n.key)&&g.set(n.key,t);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))r.kind===`state`&&!g.has(r.key)&&g.set(r.key,`${t}.${e}`);a.compiled=zN(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{tF(t,n,i,r)}catch(e){_.push(`Variable "${n}": ${e.message??String(e)}`)}for(let[n,i]of Object.entries(e.segments))if(i.vars)for(let[e,a]of Object.entries(i.vars))try{tF(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Ws(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>Ys(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return QP(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=P_(e,t);C.set(t,S(n,r))}let w=new Map(io.map(e=>[e,new Map])),ee=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of ee)for(let n of io){let r=t[n];if(!ao(r))continue;let i=`${e}.${n}`,a=w.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:aF(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:w,loadWarnings:_}}function aF(e,t,n){try{return e(n)}catch(e){throw Error(`${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function oF(e,t,n){let r=e.globalExpressions.get(t).get(n);if(r===void 0)throw Error(`the ${t} rule ${JSON.stringify(n)} reached the render but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r}function sF(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function cF(e,t){return e.kind===`decided`?e.name:t}function lF(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(yo(a.colorCompatibility));let{preset:d=k_}=s??{},f=F_(e,d),p=oa[s?.variation??So(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??uo(`none`,e.styles),h=s?.theme??rx(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(cF(h,Za),cF(m,co))),t.menuRuntime.action.chromeCols=kk(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=Ak(a);let _=Dy(n),v=so(h,e=>{let n=oF(t,`palette`,e);return nx(sF(n,_),n.where,e=>u?.(e))}),y=so(m,n=>uo(sF(oF(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=ex(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,disclosure:u}=Ja(i,a,c),d=lP(t.activeSegment,e.name,e.id,i,u,l),f=Mx(d,c,o.bg,o.fg,n),p=()=>La(i,u,c).state;s&&(d.bg=p());let m=o.body.evaluate(n),h=d.drops.length>0||s;h&&(d.bg=p());let g=o.lead?.evaluate(n)??[],_=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return $N(i,p(),c)},get band(){return $N(i,La(i,u,c).plane,c)},get close(){return tP(i,p(),c)},disclosure:u},fragments:m,lead:g,trail:_,drops:d.drops,open:h}}finally{t.activeSegment.current=null}},w=(e,t,r)=>{let i=t&&EN(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>w(e,t,Ka(r,n)),renderBody:(e,t,n)=>w(e,i&&t,qa(n)),closeDisclosure:e=>QN(n,e)};return QP(e.kind).render(e,o)},ee=t.roots.get(d);if(ee===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${k_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let te=e=>{if(!EN(e.when,_))return!1;if(e.kind===`container`)return!0;if(Sw(e.name)===void 0)return!1;try{return EN(t.segments[e.name].when,ky(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>WP(ee,te).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Sw(e);return r===void 0?[]:[{name:r,address:t,palette:Qb(n.theme,x)}]})),w(ee,!0,Ga(p)).map(e=>jk(PN(e.cells,a),a)).join(`
199
- `)}function*uF(e){yield*Object.entries(e.variables??{});for(let[t,n]of Object.entries(e.segments??{}))for(let[e,r]of Object.entries(n.vars??{}))yield[`${t}.${e}`,r]}function*dF(e){for(let t of Object.values(e.segments))for(let e of[t.template,t.bg,t.fg,t.when])e!==void 0&&(yield e);for(let t of j_(e.presets)){for(let n of Ps(P_(e,t).node))n.when!==void 0&&(yield n.when);let n=F_(e,t);for(let e of io){let t=n[e];ao(t)&&(yield t)}}for(let[,t]of uF(e))t.kind===`template`&&(yield t.template),Vs(t)&&t.cache&&`key`in t.cache&&(yield t.cache.key);for(let t of Object.values(e.actions))`copy`in t&&(yield t.copy),`open`in t&&(yield t.open),`preset`in t&&t.preset===`delete`&&(yield t.name)}function fF(e,t){return e===t||t.startsWith(`${e}.`)||e.startsWith(`${t}.`)}function pF(e,t){let n=new Set,r=new Set,i=new Set;for(let e of dF(t)){for(let r of xv(e,t.helpers).keys())n.add(r);for(let{name:n}of Tv(e,t.helpers))r.add(n);for(let n of Ev(e,t.helpers))i.add(n)}for(let[,e]of uF(t))if(Vs(e)&&e.cache&&`depends_on`in e.cache)for(let t of e.cache.depends_on)n.add(t);let a=new Set(r);for(let e of r){let n=t.actions[e];if(n!==void 0&&`do`in n)for(let e of n.do)a.add(e)}let o=new Set,s=new Set;for(let e of a){let n=t.actions[e];if(n!==void 0&&(`set`in n&&o.add(n.set),`insertSegment`in n&&s.add(n.insertSegment),`insertSegmentFrom`in n&&Array.isArray(n.insertSegmentFrom)))for(let e of n.insertSegmentFrom)s.add(e)}for(let e of j_(t.presets))for(let n of Ps(P_(t,e).node))n.kind===`segment`&&s.add(n.name);let c=(e,t)=>[...n].some(t=>fF(t,e))||t.kind===`state`&&o.has(t.key),l=e=>[...e].filter(e=>!Ou(e)),u=(e,t,n)=>l(t).filter(e=>!n(e)).map(t=>({kind:e,name:t})),d=new Map(uF(e));return[...u(`variable`,d.keys(),e=>c(e,d.get(e))),...u(`action`,Object.keys(e.actions??{}),e=>a.has(e)),...u(`helper`,Object.keys(e.helpers??{}),e=>i.has(e)),...u(`segment`,Object.keys(e.segments??{}),e=>s.has(e))]}var mF=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,bF(e,t,n,`initial value`),this.cell=Mv.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){bF(this.name,this.type,e,`set value`),!Object.is(this.cell.get(),e)&&(this.cell.set(e),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}},hF=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,Mv.computed)(()=>{let e=n();return bF(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},gF=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=Mv.observable.box(yF(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=yF(e);vF(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function _F(e){return JSON.stringify(e)}function vF(e,t){return _F(e)===_F(t)}function yF(e){return e.kind===`ok`?{kind:`ok`,value:Nv(e.value)}:e}function bF(e,t,n,r){let i=Pv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var xF=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new mF(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new gF(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new hF(e,t,()=>n(r)))}read(e){return this.requireVar(e).read()}readDocument(e){let t=this.requireNode(e);if(t.kind!==`document`)throw TypeError(`Variable "${e}" is a ${t.kind}, not a document`);return t.read()}setDocument(e,t){let n=this.requireNode(e);if(n.kind!==`document`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a document (use defineDocument to create one)`);(0,Mv.runInAction)(()=>n.set(t))}setBox(e,t){let n=this.requireNode(e);if(n.kind!==`box`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a box (use defineBox to create a settable variable)`);(0,Mv.runInAction)(()=>n.set(t))}runInAction(e){(0,Mv.runInAction)(e)}has(e){return this.nodes.has(e)}getType(e){return this.requireVar(e).type}getKind(e){return this.requireNode(e).kind}changeKey(e){let t=this.requireNode(e);if(t.kind===`document`)return _F(t.read());try{return String(t.read())}catch(e){return`failed:${e instanceof Error?e.message:String(e)}`}}getNode(e){let t=this.requireNode(e);return t.kind===`document`?{name:t.name,kind:t.kind,read:()=>t.read(),lastUpdatedMs:()=>t.lastUpdatedMs()}:{name:t.name,type:t.type,kind:t.kind,read:()=>t.read(),lastUpdatedMs:()=>t.lastUpdatedMs()}}names(){return[...this.nodes.keys()]}requireNode(e){let t=this.nodes.get(e);if(!t)throw ReferenceError(`Unknown variable "${e}"`);return t}requireVar(e){let t=this.requireNode(e);if(t.kind===`document`)throw TypeError(`Variable "${e}" is a document; read its fields by path (.${e}.<field>)`);return t}assertNotDefined(e){if(this.nodes.has(e))throw Error(`Variable "${e}" is already declared`)}};function SF(e,t,n){return e+`\0`+t+`\0`+(n??``)}function CF(e,t){return new Set(j_(e.presets).filter(n=>P_(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function wF(e){let t=c.basename(e),n=c.dirname(e);for(;!r.existsSync(n);)t=c.basename(n),n=c.dirname(n);return{dir:n,name:t}}function TF(e,t){let n=new Map;for(let t of iE(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=wF(t);n.has(e)||n.set(e,new Set),n.get(e).add(r)}return{files:t===null?[]:[t],dirs:[...n.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({path:e,filenames:[...t].sort()}))}}function EF(e){return e.filter(Boolean).join(`
200
- `)||null}function DF(e,t,n,r){let i=fE(t,AA),{config:a,raw:o}=i;n.push(...i.warnings);let s=hE(i,t??`<default>`),c=new xF,l=new Ib(c,s.globals.default_empty_value??``,r.gitService,r.sessionState),u;try{u=iF(s,l,{cwd:e}),n.push(...u.loadWarnings),sM(s),mA(s)}catch(e){throw l.dispose(),e}return{config:s,store:c,registry:l,compiled:u,neededInputPaths:vj(s),lastRenderCellsBySegment:new Map,authoredRoots:CF(a,o),fileHeldSettings:qj(o),unused:pF(o,a)}}function OF(e,t,n,r){let i=oE(e,t,n),a=i.kind===`file`?i.path:null,o=[dE(e,t),cE(i)],s;try{s=DF(t,a,o,r)}catch(e){return e instanceof Cs&&o.push(...e.warnings),{resolvedPath:a,warning:EF(o),state:null,error:e instanceof Cs||e instanceof Error?e.message:String(e)}}return{resolvedPath:a,warning:EF(o),state:s,error:null}}var kF=class{entries=new Map;deps;maxEntries;observers;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256,this.observers=t.observers??{}}getOrCreate(e,t,n){let r=SF(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=OF(e,t,n,this.deps),o={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:a.error,lastWarning:a.warning,state:a.state??DF(t,null,[],this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a.resolvedPath),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=OF(e.projectDir,e.cwd,e.configFile,this.deps);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(e.state.registry.dispose(),e.state=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}refreshWatcher(e,t){e.configFilePath=t;let n=TF(e,t),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const AF=16384;var jF=class{startedAt=new Date;requestsTotal=0;requestsErrored=0;requestsTimedOut=0;inFlight=0;watchersOpened=0;watchersClosed=0;watchersEvicted=0;subprocessTotal=0;subprocessInFlight=0;subprocessCount=new Map;subprocessHistogram=new Map;subprocessHistogramRotator=new Map;rollingTimestamps=[];rollingHead=0;launchStats={onStart:e=>{this.subprocessTotal++,this.subprocessInFlight++,this.subprocessCount.set(e,(this.subprocessCount.get(e)??0)+1),this.recordRollingNow()},onEnd:(e,t)=>{this.subprocessInFlight=Math.max(0,this.subprocessInFlight-1),this.recordDuration(e,t)}};recordRollingNow(){let e=Date.now();if(this.rollingTimestamps.length<AF){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%AF}recordDuration(e,t){let n=this.subprocessHistogram.get(e);if(n||(n=[],this.subprocessHistogram.set(e,n)),n.length<16){n.push(t);return}let r=(this.subprocessHistogramRotator.get(e)??0)%16;n[r]=t,this.subprocessHistogramRotator.set(e,r+1)}snapshotSubprocesses(){let e=Date.now()-6e4,t=0;for(let n of this.rollingTimestamps)n>=e&&t++;let n={};for(let[e,t]of this.subprocessCount)t>0&&(n[e]=t);let r={},i={};for(let[e,t]of this.subprocessHistogram){if(t.length===0)continue;let n=[...t].sort((e,t)=>e-t),a=Math.floor(n.length*.5),o=Math.min(n.length-1,Math.floor(n.length*.99)),s=n[a],c=n[o];s!==void 0&&(r[e]=s),c!==void 0&&(i[e]=c)}return{total:this.subprocessTotal,inFlight:this.subprocessInFlight,lastMinute:t,byCategory:n,p50DurationMs:r,p99DurationMs:i}}snapshot(e){let t=process.memoryUsage();return{pid:process.pid,version:HE,protocolVersion:3,startedAt:this.startedAt.toISOString(),uptimeSec:Math.floor((Date.now()-this.startedAt.getTime())/1e3),rssBytes:t.rss,heapUsedBytes:t.heapUsed,heapTotalBytes:t.heapTotal,externalBytes:t.external,arrayBuffersBytes:t.arrayBuffers,requests:{total:this.requestsTotal,errored:this.requestsErrored,timedOut:this.requestsTimedOut,inFlight:this.inFlight},gitCache:e.gitCache,usageCache:e.usageCache,renderCache:{size:e.renderCacheSize},watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null,handlerProbes:e.handlerProbes}}};function MF(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const NF={load:()=>({}),save:()=>{},flush:()=>{}};function PF(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var FF=class{sessions;storage;atom=(0,Mv.createAtom)(`SessionState`);constructor(e=NF,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=PF(this.storage.load()),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.get(t)??null):null}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,Mv.runInAction)(()=>{let n=this.sessions.get(e)??new Map;for(let{key:e,value:r}of t)n.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,Mv.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.delete(t),n.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,Mv.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};function IF(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let t of Object.values(e)){if(typeof t!=`object`||!t||Array.isArray(t))return!1;for(let e of Object.values(t))if(typeof e!=`string`)return!1}return!0}var LF=class{timer=null;pending=null;constructor(e,t=500,n=ib){this.filePath=e,this.debounceMs=t,this.logger=n}load(){let e;try{e=r.readFileSync(this.filePath,`utf8`)}catch(e){let t=e.code;return t!==`ENOENT`&&this.logger(`warn`,`session-state read failed (${t}); starting empty`),{}}try{let t=JSON.parse(e);return IF(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(c.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const RF={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,preset:`string`,endcaps:`string`,variation:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},zF=new Set([`1`,`true`]),BF=new Set([`0`,`false`,``]);function VF(e,t){let n=fI(e),r=n.scope===`segment-palette`?`string`:RF[n.field];if(r===`string`)return JSON.stringify(t);if(r===`number`){let n=Number(t);if(!Number.isFinite(n))throw Error(`persistValueText: "${e}" expects a number, got "${t}"`);return String(n)}if(zF.has(t))return`true`;if(BF.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function HF(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function UF(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),Me(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function WF(e){return/^\s*$/.test(e)?null:zo(e)}function GF(e,t){return e!==null&&Vo(e,t)!==void 0}function KF(e){if(e.kind===`segment`)return e.when===void 0?e.name:{seg:e.name,when:e.when};if(e.kind===`container`){let{kind:t,direction:n,children:r,...i}=e;return{[n===`horizontal`?`h`:`v`]:r.map(KF),...i}}return e}function qF(e){if(!Pc(e))return KF(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,KF(t)])),...n}}const JF=OA,YF=JF.segments,XF=JF.presets,ZF=JF.root;function QF(e,t,n,r){if(!GF(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function $F(e,t){let n=Ex(t);return t.scope===`segment-palette`&&QF(e,[`segments`,t.segment],YF[t.segment],n.join(`.`)),n}function eI(e){return zo(Yo(e))}function tI(){return Object.entries(ZF.rows).map(([e,t])=>{let n=KF(t);return{path:[`root`],fragment:eI({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function nI(e,t){let n=e===null?void 0:Vo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function rI(e,t){if(t===void 0)return null;let n=qF(t);return{path:e,fragment:eI(n),unit:{path:e,value:n}}}function iI(e,t){let n=[`presets`,t],r=[...n,`root`],i=XF[t];QF(e,n,i,r.join(`.`));let a=nI(e,r)??rI(r,i?.root);return a!==null&&gs(a.fragment)?a:null}function aI(e,t){let n=hs(t.fragment);return n===null?new Map([[`#`,{path:t.path,unit:t.unit,node:t.fragment}]]):new Map([...e,...n.map(e=>[e.key,{path:[...t.path,`rows`,e.key],unit:t.unit,node:e.value}])])}function oI(e,t){return[...tI(),nI(e,[`root`]),iI(e,t)].filter(e=>e!==null).reduce(aI,new Map)}function sI(e,t,n){for(let{node:r,...i}of oI(e,t).values())if(vs(r,n))return i;throw new $(`${cI(e,t).join(`.`)} holds no placement "${n}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`)}function cI(e,t){return iI(e,t)?.path??[`root`]}function lI(e,t){return t.scope===`preset-root`?cI(e,t.preset):Ex(t)}function uI(e,{unit:t}){return t===null?e:ls(e,t.path,Yo(t.value),qo)}function dI(e){let t=Tx(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function fI(e){let t=dI(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function pI(e,t,n,r){mI(t,r),UF(t,r,e.logger),e.record(t,n,r)}function mI(e,t){try{return hE(pE(e,t,AA),e)}catch(e){throw e instanceof Cs?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function hI(e,t){let n=fI(t),r=WF(HF(e)??``),i=r===null?void 0:Vo(r,Ex(n));return i!==void 0&&`value`in i?i.value:void 0}function gI(e,t,n){_I(e,t,n,[])}function _I(e,t,n,r){let i=HF(t);pI(e,t,i,vI(n.reduce((e,[t,n])=>ls(e,$F(WF(e),fI(t)),VF(t,n),qo),i??``),t,r,e=>e))}function vI(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=sI(WF(s),n,i),l=Ss(uI(s,c),c.path,i,a,Yo(o));if(l===null)throw new $(`${c.path.join(`.`)} in ${t} has no placement "${i}" — the bar you clicked is stale (it reloads on the next render)`);return l},e)}function yI(e,t,n){let r=WF(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of oI(r,t)){if(!vs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Uo(e,c):Yo(s.value);if(a!==`#`)return ls(e,[...i,`rows`,a],l,qo);if(iI(r,t)!==null)throw new $(`cannot give preset "${t}" its own copy of ${o.join(`.`)}: it already stages rows of its own over that tree`);return ls(e,i,l,qo)}return e}function bI(e,t){return ds(e,t,t[0]===`presets`&&t.length>2&&!MA(t[1])?2:0)}function xI(e,t,n){let r=n.map(dI),i=HF(t);if(i===null)return;let a=r.reduce((e,t)=>bI(e,lI(WF(e),t)),i);a!==i&&pI(e,t,i,a)}function SI(e){let t=e===null?void 0:Vo(e,[`presets`]),n=new Set([...jA,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(Su));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(Su(e)))}function CI(e,t,n,r,i,a){let o=HF(t),s=WF(o??``),c=SI(s),l=[`presets`,c],u=iI(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Uo(o??``,u.fragment):Yo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],Yo(r)]]],f=i.map(([e,t])=>{let n=wx(c,e);return[$F(s,fI(n)),VF(n,t)]});return pI(e,t,o,vI([...d,...f].reduce((e,[t,n])=>ls(e,t,n,qo),ls(o??``,l,`{}`,qo)),t,a.map(e=>({...e,preset:c})),yI)),c}function wI(e,t,n){if(MA(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=HF(t),a=WF(i??``);if(i===null||a===null||Vo(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=Vo(a,[`globals`,`preset`]);pI(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>bI(e,t),i))}function TI(e,t,n,r){let i=dI(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=HF(t),o=r.op===`remove`?r.target:r.anchor,s=sI(WF(a??``),i.preset,o),c=uI(a??``,s),{after:l,placed:u}=EI(c,s.path,r,()=>{let e=mI(t,c);return j_(e.presets).map(t=>P_(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return pI(e,t,a,l),u}function EI(e,t,n,r){switch(n.op){case`remove`:return{after:bs(e,t,n.target),placed:null};case`insert`:{let i=tA(n.segment,n.anchor,r());return{after:xs(e,t,i,n.anchor,n.relation),placed:i}}}}const DI={load:()=>({}),save:()=>{}},OI=new Set(Bb.map(e=>e.sessionKey)),kI=e=>OI.has(e)||e.startsWith(tv),AI=8*1024*1024,jI={past:[],future:[]},MI=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var NI=class{state=new Map;constructor(e,t,n=DI){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??jI;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??jI}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(MI(n));r.set(MI(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:MF(this.sessionState,e=>kI(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:VI(i,n),o=r.get(e),s=o===void 0?a:GI(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,UI(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint — nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(MI)),a=n.net.filter(e=>!i.has(MI(e))),o=II(KI(WI(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(JI).join(`, `)} changed since edit mode opened — kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=II(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...RI(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(MI)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:KI(n,t),future:KI(i,t),...a!==void 0&&{savepoint:{at:KI([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(MI(e))),below:KI(a.below,t)}}}),new $(`${r}: ${o.map(JI).join(`, `)} changed since that edit — refusing to overwrite it; this session's undo history no longer steps it`)}let s=[];try{for(let r of t)this.write(e,r,r[n]),s.push(r);this.put(e,i)}catch(t){try{for(let t of s.reverse())this.write(e,t,t[a])}catch(e){throw Error(`${t.message}; and putting the step back failed, so it is half-applied: ${e.message}`)}throw t}}read(e,t){return t.kind===`session`?this.sessionState.get(e,t.key):HF(t.file)}write(e,t,n){t.kind===`file`?UF(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||PI(n)>AI;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,FI(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${AI} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function PI(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function FI({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...RI(n,1,[])}:{past:e,future:t.slice(1),...RI(n,0,[])}}function II(e){return e.slice(-50)}const LI=e=>e===rv.member;function RI(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:zI(e.net,n),below:e.below}}}function zI(e,t){let n=new Map(e.map(e=>[MI(e),e]));for(let e of t){let t=n.get(MI(e));n.set(MI(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const BI=e=>e.map(e=>({...e,before:e.after,after:e.before}));function VI(e,t){let n=[...e.past,t],r=II(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...RI(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...HI(e.future,a),...i.below]},n.length-r.length,t)}}function HI(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function UI(e,t){return{past:e.past.slice(0,-1),future:II([...e.future,t]),...RI(e.savepoint,0,BI(t))}}function WI(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...HI(r,t.at-i.length),...t.below]}function GI(e,t){if(LI(t.after)&&!LI(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!LI(t.after)&&LI(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function KI(e,t){return e.map(e=>e.filter(e=>!t.has(MI(e)))).filter(e=>e.length>0)}function qI(e){return e.map(JI).join(`, `)}function JI(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function YI(e){if(typeof e!=`object`||!e)return!1;let t=e,n=e=>e===null||typeof e==`string`;return(t.kind===`session`&&typeof t.key==`string`||t.kind===`file`&&typeof t.file==`string`)&&n(t.before)&&n(t.after)}function XI(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(YI))}function ZI(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(YI)&&XI(t.below)}function QI(e){if(typeof e!=`object`||!e)return!1;let t=e;return XI(t.past)&&XI(t.future)&&(t.savepoint===void 0||ZI(t.savepoint))}function $I(e,t){let n=e=>e.kind===`file`||kI(e.key)?!0:(t.add(e.key),!1),r=e=>e.map(e=>e.filter(n)).filter(e=>e.length>0),{savepoint:i}=e,a=r(e.past),o=r(e.future);return i===void 0?{past:a,future:o}:{past:a,future:o,savepoint:{at:r(e.past.slice(0,i.at)).length,net:i.net.filter(n),below:r(i.below)}}}function eL(e,t){return{load:()=>{let n;try{n=r.readFileSync(e,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`settings-history read failed (${n}); starting empty`),{}}try{let e=JSON.parse(n);if(typeof e==`object`&&e&&!Array.isArray(e)&&Object.values(e).every(QI)){let n=new Set,r=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,$I(t,n)]));return n.size>0&&t(`warn`,`settings-history load: dropped the changes to ${[...n].map(e=>`"${e}"`).join(`, `)}, no longer a setting`),r}}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),Me(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}const tL=e=>!kI(e)&&!oS(e)&&e!==`update.dismissed`;var nL=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:MF(e,tL,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,Mv.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function rL(e){let t=yN(e,`doctor.tmux`,[`display`,`-p`,`-t`,e.pane,`#{client_termfeatures}`]);return t.kind===`ok`?{kind:`ok`,value:t.stdout.trim().split(`,`).filter(e=>e!==``)}:{kind:`failed`,reason:t.reason}}function iL(e){return{probeTmux:rL,loadConfig:e}}function aL(e,t){let n=e.loadConfig(t),r={path:n.path,warnings:n.warning===null?[]:n.warning.split(`
201
- `)};return n.error===null?{...r,kind:`loaded`,shadowed:uE(t.projectDir,t.cwd,t.configFile??void 0),unused:n.unused}:{...r,kind:`failed`,error:n.error}}function oL(e){let t=yS(e).env;if(t===void 0)return{path:e,env:{}};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: \`env\` is not an object`);return{path:e,env:t}}function sL(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function cL(e){return{kind:`arrived`,handler:e,bar:HE}}function lL(e,t,n){return{tmux:sL(e,t.tmux),config:aL(e,n),claudeSettings:oL(gS(hS(t.claudeConfigDir)))}}function uL(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ls(vS(n),[`env`,e.name],JSON.stringify(e.value),Jo);return r.mkdirSync(c.dirname(n),{recursive:!0}),Me(n,i),{...t,claudeSettings:oL(n)}}default:return e.kind}}const dL={connectMs:200,budgetMs:500};async function fL(e){let n=e.includes(`--json`),r=await pL();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${VE(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
202
- `);return}t.stdout.write(_L(r.value))}function pL(){return FE({kind:`stats`},dL,e=>`stats`in e?e.stats:void 0)}function mL(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function hL(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function gL(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m${e%60}s`:`${Math.floor(e/3600)}h${Math.floor(e%3600/60)}m`}function _L(e){let t=[];t.push(`cc-candybar daemon stats`),t.push(``),t.push(`process`),t.push(` pid ${e.pid}`),t.push(` version ${e.version}`),t.push(` protocol ${e.protocolVersion}`),t.push(` startedAt ${e.startedAt}`),t.push(` uptime ${gL(e.uptimeSec)}`),t.push(` rss ${mL(e.rssBytes)}`),t.push(` heapUsed ${mL(e.heapUsedBytes)}`),t.push(` heapTotal ${mL(e.heapTotalBytes)}`),t.push(` external ${mL(e.externalBytes)}`),t.push(` arrayBuffers ${mL(e.arrayBuffersBytes)}`),t.push(``),t.push(`requests`),t.push(` total ${e.requests.total}`),t.push(` errored ${e.requests.errored}`),t.push(` timedOut ${e.requests.timedOut}`),t.push(` inFlight ${e.requests.inFlight}`),t.push(``),t.push(`gitCache`),t.push(` size ${e.gitCache.size}`),t.push(` hit rate ${hL(e.gitCache.hits,e.gitCache.misses)} (${e.gitCache.hits} / ${e.gitCache.hits+e.gitCache.misses})`),t.push(` invalidations ${e.gitCache.invalidations}`),t.push(``),t.push(`usageCache`),t.push(` size ${e.usageCache.size}`),t.push(` hit rate ${hL(e.usageCache.hits,e.usageCache.misses)} (${e.usageCache.hits} / ${e.usageCache.hits+e.usageCache.misses})`),t.push(` sweeps ${e.usageCache.sweeps}`),t.push(``),t.push(`renderCache`),t.push(` size ${e.renderCache.size}`),t.push(`watchers`),t.push(` active ${e.watchers.active}`),t.push(` opened ${e.watchers.opened}`),t.push(` closed ${e.watchers.closed}`),t.push(` evicted ${e.watchers.evicted}`),t.push(``),t.push(`subprocesses`),t.push(` total ${e.subprocesses.total}`),t.push(` inFlight ${e.subprocesses.inFlight}`),t.push(` lastMinute ${e.subprocesses.lastMinute}`);let n=Object.entries(e.subprocesses.byCategory),r=n.reduce((e,[t])=>Math.max(e,t.length),13);for(let[i,a]of n){let n=e.subprocesses.p50DurationMs[i],o=e.subprocesses.p99DurationMs[i],s=n!==void 0&&o!==void 0?` (p50 ${n}ms · p99 ${o}ms)`:``;t.push(` ${i.padEnd(r)} ${a}${s}`)}return e.nextRestartReason&&(t.push(``),t.push(`nextRestart ${e.nextRestartReason}`)),t.join(`
198
+ `);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function lF(e,t){let n=t.flatMap(e=>e.filter(e=>e.place===`above`)),r=t.map(e=>e.filter(e=>e.place===`flow`));return[...n,...uF(e,r)]}function uF(e,t){switch(e){case`vertical`:return t.flatMap(e=>e);case`horizontal`:return t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,place:`flow`},...t.flatMap(e=>e.slice(1))]}}function dF(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:lF(e.direction,e.children.map((t,i)=>n(t,[...r,fF(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function fF(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:ks[e.direction]}}const pF={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:ma(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Fs(t.path,n)))}},render(e,t){return lF(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,fF(e,r))))}},mF={drop:e=>e.place,above:()=>`above`},hF={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},gF={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:As(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Qc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Is(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render(e,t){let n=t.lookupSegment(e.name);if(!n)throw Error(`Layout segment "${e.name}" has no matching segment`);let{seg:r,compiled:i}=n;if(!t.visible)return[];let a=ky(t.scope,e.settings);try{if(!qN(i.when,a))return[];let n=Qb(e.settings.theme,t.palette),o=e.opens!==void 0&&qN(e.opens.open,t.scope),{styles:s,fragments:c,lead:l,trail:u,drops:d,open:f}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},o),p=f?s.trigger:s.closed,m={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:p,padding:t.padding},h=e.opens,g=h===void 0?[]:t.renderBody(h.body,o,s.disclosure).map(e=>({...e,place:mF[h.placement](e)})),_=cF(nP(c,p)).map((e,t)=>({cells:QN(e,{...m,lead:t===0?nP(l,p):[],trail:t===0?nP(u,p):[]}),band:`own`,place:`flow`})),v=d.map(e=>({cells:QN(nP([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),y=(e,t,n)=>QN(nP([e],t),{...m,width:`auto`,baseStyle:t,padding:n}),b=g.findIndex(e=>e.band===`own`),{lead:x,stays:S}=h!==void 0&&b!==-1?hF[h.placement](_,()=>y(t.closeDisclosure(h.key),s.close,t.padding)):{lead:[],stays:_},C=x.flatMap(e=>y(new W(` `.repeat(XN(e).reduce((e,t)=>e+t.cellLength,0))),s.trigger,0)),w=(e,t)=>e.band===`own`?t===b?x:C:[],ee=g.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),te=[...S,...v];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...te.flatMap(e=>e.cells),...g.flatMap(w)].flatMap(XN)),[...te,...ee]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:QN([new W(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:_F(e.lead,e,a,t),trail:_F(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function _F(e,t,n,r){if(e===void 0)return[];try{return r.evaluateSegment(t,n,r.palette,r.region,{bg:void 0,fg:void 0,body:e,lead:void 0,trail:void 0},!1).fragments}catch(e){return r.onSegmentError?.(t.id,e.message??String(e)),[]}}const vF={container:pF,segment:gF};function yF(e){return vF[e]}function bF(e){if(`ttl`in e)return{kind:`ttl`,durationMs:yb(e.ttl)};if(`watch_file`in e)return{kind:`watch_file`,path:e.watch_file};if(`depends_on`in e)return{kind:`depends_on`,varNames:e.depends_on};if(`key`in e)return{kind:`key`,template:e.key};if(`never`in e)return{kind:`never`};throw Error(`Unknown CacheDecl discriminator — loader invariant violated: ${JSON.stringify(e)}`)}function xF(e,t){switch(zs(e)){case`json`:return{kind:`json`,default:t};case`regex`:return{kind:`regex`,regex:new RegExp(e.regex),default:t};case`text`:return{kind:`text`,default:t}}}function SF(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`input`:e.declareInput(t,n.path,n.type??`string`,n.default);break;case`env`:e.declareEnv(t,n.name,n.default);break;case`file`:e.declareFile(t,n.path,{readMode:n.readMode,cache:bF(n.cache),parse:xF(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:bF(n.cache),parse:xF(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,ttlMs:n.cache?yb(n.cache.ttl):void 0,varDefault:n.default});break;case`git`:e.declareGit(t,{field:n.field,cwd:r,varDefault:n.default});break;case`state`:e.declareState(t,{key:n.key,...n.default!==void 0&&{varDefault:n.default}});break}}function CF(e,t){let n=$d.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}const wF=e=>So(void 0,null,e.globals.variation);function TF(e,t,n){let r=n.cwd,i=ax(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:kk({endcaps:`powerline`,charset:_o}),width:80,basePalette:i,palette:i,variation:oa[wF(e)],padding:1,seamCols:Ak({endcaps:`powerline`,charset:_o}),layout:()=>[]},o=kP(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=j_(e.presets),u=dw(e),d=Ey({...vP(a),...VP(a,o),...WP(a,o),...JP(a,o),...$P(a,o),...rF(s),...oF(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=CF(d,e.helpers),p=e=>d.parse(e,f),m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=p(e);return m.set(e,n),n},g=new Map;for(let[t,n]of Wb)n in e.variables&&g.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!g.has(n.key)&&g.set(n.key,t);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))r.kind===`state`&&!g.has(r.key)&&g.set(r.key,`${t}.${e}`);a.compiled=oP(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{SF(t,n,i,r)}catch(e){_.push(`Variable "${n}": ${e.message??String(e)}`)}for(let[n,i]of Object.entries(e.segments))if(i.vars)for(let[e,a]of Object.entries(i.vars))try{SF(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Ws(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>Ys(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return yF(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=P_(e,t);C.set(t,S(n,r))}let w=new Map(io.map(e=>[e,new Map])),ee=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of ee)for(let n of io){let r=t[n];if(!ao(r))continue;let i=`${e}.${n}`,a=w.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:EF(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:w,loadWarnings:_}}function EF(e,t,n){try{return e(n)}catch(e){throw Error(`${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function DF(e,t,n){let r=e.globalExpressions.get(t).get(n);if(r===void 0)throw Error(`the ${t} rule ${JSON.stringify(n)} reached the render but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r}function OF(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function kF(e,t){return e.kind===`decided`?e.name:t}function AF(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(yo(a.colorCompatibility));let{preset:d=k_}=s??{},f=F_(e,d),p=oa[s?.variation??So(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??uo(`none`,e.styles),h=s?.theme??rx(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(kF(h,Za),kF(m,co))),t.menuRuntime.action.chromeCols=kk(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=Ak(a);let _=Dy(n),v=so(h,e=>{let n=DF(t,`palette`,e);return nx(OF(n,_),n.where,e=>u?.(e))}),y=so(m,n=>uo(OF(DF(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=ex(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,disclosure:u}=Ja(i,a,c),d=AP(t.activeSegment,e.name,e.id,i,u,l),f=Mx(d,c,o.bg,o.fg,n),p=()=>La(i,u,c).state;s&&(d.bg=p());let m=o.body.evaluate(n),h=d.drops.length>0||s;h&&(d.bg=p());let g=o.lead?.evaluate(n)??[],_=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return bP(i,p(),c)},get band(){return bP(i,La(i,u,c).plane,c)},get close(){return SP(i,p(),c)},disclosure:u},fragments:m,lead:g,trail:_,drops:d.drops,open:h}}finally{t.activeSegment.current=null}},w=(e,t,r)=>{let i=t&&qN(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>w(e,t,Ka(r,n)),renderBody:(e,t,n)=>w(e,i&&t,qa(n)),closeDisclosure:e=>yP(n,e)};return yF(e.kind).render(e,o)},ee=t.roots.get(d);if(ee===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${k_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let te=e=>{if(!qN(e.when,_))return!1;if(e.kind===`container`)return!0;if(Sw(e.name)===void 0)return!1;try{return qN(t.segments[e.name].when,ky(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>dF(ee,te).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Sw(e);return r===void 0?[]:[{name:r,address:t,palette:Qb(n.theme,x)}]})),w(ee,!0,Ga(p)).map(e=>jk(tP(e.cells,a),a)).join(`
199
+ `)}function*jF(e){yield*Object.entries(e.variables??{});for(let[t,n]of Object.entries(e.segments??{}))for(let[e,r]of Object.entries(n.vars??{}))yield[`${t}.${e}`,r]}function*MF(e){for(let t of Object.values(e.segments))for(let e of[t.template,t.bg,t.fg,t.when])e!==void 0&&(yield e);for(let t of j_(e.presets)){for(let n of Ps(P_(e,t).node))n.when!==void 0&&(yield n.when);let n=F_(e,t);for(let e of io){let t=n[e];ao(t)&&(yield t)}}for(let[,t]of jF(e))t.kind===`template`&&(yield t.template),Vs(t)&&t.cache&&`key`in t.cache&&(yield t.cache.key);for(let t of Object.values(e.actions))`copy`in t&&(yield t.copy),`open`in t&&(yield t.open),`preset`in t&&t.preset===`delete`&&(yield t.name)}function NF(e,t){return e===t||t.startsWith(`${e}.`)||e.startsWith(`${t}.`)}function PF(e,t){let n=new Set,r=new Set,i=new Set;for(let e of MF(t)){for(let r of xv(e,t.helpers).keys())n.add(r);for(let{name:n}of Tv(e,t.helpers))r.add(n);for(let n of Ev(e,t.helpers))i.add(n)}for(let[,e]of jF(t))if(Vs(e)&&e.cache&&`depends_on`in e.cache)for(let t of e.cache.depends_on)n.add(t);let a=new Set(r);for(let e of r){let n=t.actions[e];if(n!==void 0&&`do`in n)for(let e of n.do)a.add(e)}let o=new Set,s=new Set;for(let e of a){let n=t.actions[e];if(n!==void 0&&(`set`in n&&o.add(n.set),`insertSegment`in n&&s.add(n.insertSegment),`insertSegmentFrom`in n&&Array.isArray(n.insertSegmentFrom)))for(let e of n.insertSegmentFrom)s.add(e)}for(let e of j_(t.presets))for(let n of Ps(P_(t,e).node))n.kind===`segment`&&s.add(n.name);let c=(e,t)=>[...n].some(t=>NF(t,e))||t.kind===`state`&&o.has(t.key),l=e=>[...e].filter(e=>!Ou(e)),u=(e,t,n)=>l(t).filter(e=>!n(e)).map(t=>({kind:e,name:t})),d=new Map(jF(e));return[...u(`variable`,d.keys(),e=>c(e,d.get(e))),...u(`action`,Object.keys(e.actions??{}),e=>a.has(e)),...u(`helper`,Object.keys(e.helpers??{}),e=>i.has(e)),...u(`segment`,Object.keys(e.segments??{}),e=>s.has(e))]}var FF=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,VF(e,t,n,`initial value`),this.cell=Mv.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){VF(this.name,this.type,e,`set value`),!Object.is(this.cell.get(),e)&&(this.cell.set(e),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}},IF=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,Mv.computed)(()=>{let e=n();return VF(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},LF=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=Mv.observable.box(BF(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=BF(e);zF(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function RF(e){return JSON.stringify(e)}function zF(e,t){return RF(e)===RF(t)}function BF(e){return e.kind===`ok`?{kind:`ok`,value:Nv(e.value)}:e}function VF(e,t,n,r){let i=Pv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var HF=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new FF(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new LF(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new IF(e,t,()=>n(r)))}read(e){return this.requireVar(e).read()}readDocument(e){let t=this.requireNode(e);if(t.kind!==`document`)throw TypeError(`Variable "${e}" is a ${t.kind}, not a document`);return t.read()}setDocument(e,t){let n=this.requireNode(e);if(n.kind!==`document`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a document (use defineDocument to create one)`);(0,Mv.runInAction)(()=>n.set(t))}setBox(e,t){let n=this.requireNode(e);if(n.kind!==`box`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a box (use defineBox to create a settable variable)`);(0,Mv.runInAction)(()=>n.set(t))}runInAction(e){(0,Mv.runInAction)(e)}has(e){return this.nodes.has(e)}getType(e){return this.requireVar(e).type}getKind(e){return this.requireNode(e).kind}changeKey(e){let t=this.requireNode(e);if(t.kind===`document`)return RF(t.read());try{return String(t.read())}catch(e){return`failed:${e instanceof Error?e.message:String(e)}`}}getNode(e){let t=this.requireNode(e);return t.kind===`document`?{name:t.name,kind:t.kind,read:()=>t.read(),lastUpdatedMs:()=>t.lastUpdatedMs()}:{name:t.name,type:t.type,kind:t.kind,read:()=>t.read(),lastUpdatedMs:()=>t.lastUpdatedMs()}}names(){return[...this.nodes.keys()]}requireNode(e){let t=this.nodes.get(e);if(!t)throw ReferenceError(`Unknown variable "${e}"`);return t}requireVar(e){let t=this.requireNode(e);if(t.kind===`document`)throw TypeError(`Variable "${e}" is a document; read its fields by path (.${e}.<field>)`);return t}assertNotDefined(e){if(this.nodes.has(e))throw Error(`Variable "${e}" is already declared`)}};function UF(e,t,n){return e+`\0`+t+`\0`+(n??``)}function WF(e,t){return new Set(j_(e.presets).filter(n=>P_(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function GF(e){let t=c.basename(e),n=c.dirname(e);for(;!r.existsSync(n);)t=c.basename(n),n=c.dirname(n);return{dir:n,name:t}}function KF(e,t){let n=new Map;for(let t of iE(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=GF(t);n.has(e)||n.set(e,new Set),n.get(e).add(r)}return{files:t===null?[]:[t],dirs:[...n.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({path:e,filenames:[...t].sort()}))}}function qF(e){return e.filter(Boolean).join(`
200
+ `)||null}function JF(e,t,n,r){let i=fE(t,AA),{config:a,raw:o}=i;n.push(...i.warnings);let s=hE(i,t??`<default>`),c=new HF,l=new Ib(c,s.globals.default_empty_value??``,r.gitService,r.sessionState),u;try{u=TF(s,l,{cwd:e}),n.push(...u.loadWarnings),sM(s),mA(s)}catch(e){throw l.dispose(),e}return{config:s,store:c,registry:l,compiled:u,neededInputPaths:vj(s),lastRenderCellsBySegment:new Map,authoredRoots:WF(a,o),fileHeldSettings:qj(o),unused:PF(o,a)}}function YF(e,t,n,r){let i=oE(e,t,n),a=i.kind===`file`?i.path:null,o=[dE(e,t),cE(i)],s;try{s=JF(t,a,o,r)}catch(e){return e instanceof Cs&&o.push(...e.warnings),{resolvedPath:a,warning:qF(o),state:null,error:e instanceof Cs||e instanceof Error?e.message:String(e)}}return{resolvedPath:a,warning:qF(o),state:s,error:null}}var XF=class{entries=new Map;deps;maxEntries;observers;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256,this.observers=t.observers??{}}getOrCreate(e,t,n){let r=UF(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=YF(e,t,n,this.deps),o={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:a.error,lastWarning:a.warning,state:a.state??JF(t,null,[],this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a.resolvedPath),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=YF(e.projectDir,e.cwd,e.configFile,this.deps);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(e.state.registry.dispose(),e.state=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}refreshWatcher(e,t){e.configFilePath=t;let n=KF(e,t),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const ZF=16384;var QF=class{startedAt=new Date;requestsTotal=0;requestsErrored=0;requestsTimedOut=0;inFlight=0;watchersOpened=0;watchersClosed=0;watchersEvicted=0;subprocessTotal=0;subprocessInFlight=0;subprocessCount=new Map;subprocessHistogram=new Map;subprocessHistogramRotator=new Map;rollingTimestamps=[];rollingHead=0;launchStats={onStart:e=>{this.subprocessTotal++,this.subprocessInFlight++,this.subprocessCount.set(e,(this.subprocessCount.get(e)??0)+1),this.recordRollingNow()},onEnd:(e,t)=>{this.subprocessInFlight=Math.max(0,this.subprocessInFlight-1),this.recordDuration(e,t)}};recordRollingNow(){let e=Date.now();if(this.rollingTimestamps.length<ZF){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%ZF}recordDuration(e,t){let n=this.subprocessHistogram.get(e);if(n||(n=[],this.subprocessHistogram.set(e,n)),n.length<16){n.push(t);return}let r=(this.subprocessHistogramRotator.get(e)??0)%16;n[r]=t,this.subprocessHistogramRotator.set(e,r+1)}snapshotSubprocesses(){let e=Date.now()-6e4,t=0;for(let n of this.rollingTimestamps)n>=e&&t++;let n={};for(let[e,t]of this.subprocessCount)t>0&&(n[e]=t);let r={},i={};for(let[e,t]of this.subprocessHistogram){if(t.length===0)continue;let n=[...t].sort((e,t)=>e-t),a=Math.floor(n.length*.5),o=Math.min(n.length-1,Math.floor(n.length*.99)),s=n[a],c=n[o];s!==void 0&&(r[e]=s),c!==void 0&&(i[e]=c)}return{total:this.subprocessTotal,inFlight:this.subprocessInFlight,lastMinute:t,byCategory:n,p50DurationMs:r,p99DurationMs:i}}snapshot(e){let t=process.memoryUsage();return{pid:process.pid,version:HE,protocolVersion:3,startedAt:this.startedAt.toISOString(),uptimeSec:Math.floor((Date.now()-this.startedAt.getTime())/1e3),rssBytes:t.rss,heapUsedBytes:t.heapUsed,heapTotalBytes:t.heapTotal,externalBytes:t.external,arrayBuffersBytes:t.arrayBuffers,requests:{total:this.requestsTotal,errored:this.requestsErrored,timedOut:this.requestsTimedOut,inFlight:this.inFlight},gitCache:e.gitCache,usageCache:e.usageCache,renderCache:{size:e.renderCacheSize},watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null,handlerProbes:e.handlerProbes}}};function $F(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const eI={load:()=>({}),save:()=>{},flush:()=>{}};function tI(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var nI=class{sessions;storage;atom=(0,Mv.createAtom)(`SessionState`);constructor(e=eI,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=tI(this.storage.load()),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.get(t)??null):null}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,Mv.runInAction)(()=>{let n=this.sessions.get(e)??new Map;for(let{key:e,value:r}of t)n.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,Mv.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.delete(t),n.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,Mv.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};function rI(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let t of Object.values(e)){if(typeof t!=`object`||!t||Array.isArray(t))return!1;for(let e of Object.values(t))if(typeof e!=`string`)return!1}return!0}var iI=class{timer=null;pending=null;constructor(e,t=500,n=ib){this.filePath=e,this.debounceMs=t,this.logger=n}load(){let e;try{e=r.readFileSync(this.filePath,`utf8`)}catch(e){let t=e.code;return t!==`ENOENT`&&this.logger(`warn`,`session-state read failed (${t}); starting empty`),{}}try{let t=JSON.parse(e);return rI(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(c.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const aI={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,preset:`string`,endcaps:`string`,variation:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},oI=new Set([`1`,`true`]),sI=new Set([`0`,`false`,``]);function cI(e,t){let n=NI(e),r=n.scope===`segment-palette`?`string`:aI[n.field];if(r===`string`)return JSON.stringify(t);if(r===`number`){let n=Number(t);if(!Number.isFinite(n))throw Error(`persistValueText: "${e}" expects a number, got "${t}"`);return String(n)}if(oI.has(t))return`true`;if(sI.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function lI(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function uI(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),Me(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function dI(e){return/^\s*$/.test(e)?null:zo(e)}function fI(e,t){return e!==null&&Vo(e,t)!==void 0}function pI(e){if(e.kind===`segment`)return e.when===void 0?e.name:{seg:e.name,when:e.when};if(e.kind===`container`){let{kind:t,direction:n,children:r,...i}=e;return{[n===`horizontal`?`h`:`v`]:r.map(pI),...i}}return e}function mI(e){if(!Pc(e))return pI(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,pI(t)])),...n}}const hI=OA,gI=hI.segments,_I=hI.presets,vI=hI.root;function yI(e,t,n,r){if(!fI(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function bI(e,t){let n=Ex(t);return t.scope===`segment-palette`&&yI(e,[`segments`,t.segment],gI[t.segment],n.join(`.`)),n}function xI(e){return zo(Yo(e))}function SI(){return Object.entries(vI.rows).map(([e,t])=>{let n=pI(t);return{path:[`root`],fragment:xI({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function CI(e,t){let n=e===null?void 0:Vo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function wI(e,t){if(t===void 0)return null;let n=mI(t);return{path:e,fragment:xI(n),unit:{path:e,value:n}}}function TI(e,t){let n=[`presets`,t],r=[...n,`root`],i=_I[t];yI(e,n,i,r.join(`.`));let a=CI(e,r)??wI(r,i?.root);return a!==null&&gs(a.fragment)?a:null}function EI(e,t){let n=hs(t.fragment);return n===null?new Map([[`#`,{path:t.path,unit:t.unit,node:t.fragment}]]):new Map([...e,...n.map(e=>[e.key,{path:[...t.path,`rows`,e.key],unit:t.unit,node:e.value}])])}function DI(e,t){return[...SI(),CI(e,[`root`]),TI(e,t)].filter(e=>e!==null).reduce(EI,new Map)}function OI(e,t,n){for(let{node:r,...i}of DI(e,t).values())if(vs(r,n))return i;throw new $(`${kI(e,t).join(`.`)} holds no placement "${n}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`)}function kI(e,t){return TI(e,t)?.path??[`root`]}function AI(e,t){return t.scope===`preset-root`?kI(e,t.preset):Ex(t)}function jI(e,{unit:t}){return t===null?e:ls(e,t.path,Yo(t.value),qo)}function MI(e){let t=Tx(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function NI(e){let t=MI(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function PI(e,t,n,r){FI(t,r),uI(t,r,e.logger),e.record(t,n,r)}function FI(e,t){try{return hE(pE(e,t,AA),e)}catch(e){throw e instanceof Cs?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function II(e,t){let n=NI(t),r=dI(lI(e)??``),i=r===null?void 0:Vo(r,Ex(n));return i!==void 0&&`value`in i?i.value:void 0}function LI(e,t,n){RI(e,t,n,[])}function RI(e,t,n,r){let i=lI(t);PI(e,t,i,zI(n.reduce((e,[t,n])=>ls(e,bI(dI(e),NI(t)),cI(t,n),qo),i??``),t,r,e=>e))}function zI(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=OI(dI(s),n,i),l=Ss(jI(s,c),c.path,i,a,Yo(o));if(l===null)throw new $(`${c.path.join(`.`)} in ${t} has no placement "${i}" — the bar you clicked is stale (it reloads on the next render)`);return l},e)}function BI(e,t,n){let r=dI(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of DI(r,t)){if(!vs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Uo(e,c):Yo(s.value);if(a!==`#`)return ls(e,[...i,`rows`,a],l,qo);if(TI(r,t)!==null)throw new $(`cannot give preset "${t}" its own copy of ${o.join(`.`)}: it already stages rows of its own over that tree`);return ls(e,i,l,qo)}return e}function VI(e,t){return ds(e,t,t[0]===`presets`&&t.length>2&&!MA(t[1])?2:0)}function HI(e,t,n){let r=n.map(MI),i=lI(t);if(i===null)return;let a=r.reduce((e,t)=>VI(e,AI(dI(e),t)),i);a!==i&&PI(e,t,i,a)}function UI(e){let t=e===null?void 0:Vo(e,[`presets`]),n=new Set([...jA,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(Su));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(Su(e)))}function WI(e,t,n,r,i,a){let o=lI(t),s=dI(o??``),c=UI(s),l=[`presets`,c],u=TI(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Uo(o??``,u.fragment):Yo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],Yo(r)]]],f=i.map(([e,t])=>{let n=wx(c,e);return[bI(s,NI(n)),cI(n,t)]});return PI(e,t,o,zI([...d,...f].reduce((e,[t,n])=>ls(e,t,n,qo),ls(o??``,l,`{}`,qo)),t,a.map(e=>({...e,preset:c})),BI)),c}function GI(e,t,n){if(MA(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=lI(t),a=dI(i??``);if(i===null||a===null||Vo(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=Vo(a,[`globals`,`preset`]);PI(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>VI(e,t),i))}function KI(e,t,n,r){let i=MI(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=lI(t),o=r.op===`remove`?r.target:r.anchor,s=OI(dI(a??``),i.preset,o),c=jI(a??``,s),{after:l,placed:u}=qI(c,s.path,r,()=>{let e=FI(t,c);return j_(e.presets).map(t=>P_(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return PI(e,t,a,l),u}function qI(e,t,n,r){switch(n.op){case`remove`:return{after:bs(e,t,n.target),placed:null};case`insert`:{let i=tA(n.segment,n.anchor,r());return{after:xs(e,t,i,n.anchor,n.relation),placed:i}}}}const JI={load:()=>({}),save:()=>{}},YI=new Set(Bb.map(e=>e.sessionKey)),XI=e=>YI.has(e)||e.startsWith(tv),ZI=8*1024*1024,QI={past:[],future:[]},$I=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var eL=class{state=new Map;constructor(e,t,n=JI){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??QI;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??QI}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get($I(n));r.set($I(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:$F(this.sessionState,e=>XI(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:cL(i,n),o=r.get(e),s=o===void 0?a:fL(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,uL(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint — nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map($I)),a=n.net.filter(e=>!i.has($I(e))),o=rL(pL(dL(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(hL).join(`, `)} changed since edit mode opened — kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=rL(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...aL(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map($I)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:pL(n,t),future:pL(i,t),...a!==void 0&&{savepoint:{at:pL([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has($I(e))),below:pL(a.below,t)}}}),new $(`${r}: ${o.map(hL).join(`, `)} changed since that edit — refusing to overwrite it; this session's undo history no longer steps it`)}let s=[];try{for(let r of t)this.write(e,r,r[n]),s.push(r);this.put(e,i)}catch(t){try{for(let t of s.reverse())this.write(e,t,t[a])}catch(e){throw Error(`${t.message}; and putting the step back failed, so it is half-applied: ${e.message}`)}throw t}}read(e,t){return t.kind===`session`?this.sessionState.get(e,t.key):lI(t.file)}write(e,t,n){t.kind===`file`?uI(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||tL(n)>ZI;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,nL(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${ZI} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function tL(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function nL({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...aL(n,1,[])}:{past:e,future:t.slice(1),...aL(n,0,[])}}function rL(e){return e.slice(-50)}const iL=e=>e===rv.member;function aL(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:oL(e.net,n),below:e.below}}}function oL(e,t){let n=new Map(e.map(e=>[$I(e),e]));for(let e of t){let t=n.get($I(e));n.set($I(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const sL=e=>e.map(e=>({...e,before:e.after,after:e.before}));function cL(e,t){let n=[...e.past,t],r=rL(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...aL(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...lL(e.future,a),...i.below]},n.length-r.length,t)}}function lL(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function uL(e,t){return{past:e.past.slice(0,-1),future:rL([...e.future,t]),...aL(e.savepoint,0,sL(t))}}function dL(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...lL(r,t.at-i.length),...t.below]}function fL(e,t){if(iL(t.after)&&!iL(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!iL(t.after)&&iL(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function pL(e,t){return e.map(e=>e.filter(e=>!t.has($I(e)))).filter(e=>e.length>0)}function mL(e){return e.map(hL).join(`, `)}function hL(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function gL(e){if(typeof e!=`object`||!e)return!1;let t=e,n=e=>e===null||typeof e==`string`;return(t.kind===`session`&&typeof t.key==`string`||t.kind===`file`&&typeof t.file==`string`)&&n(t.before)&&n(t.after)}function _L(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(gL))}function vL(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(gL)&&_L(t.below)}function yL(e){if(typeof e!=`object`||!e)return!1;let t=e;return _L(t.past)&&_L(t.future)&&(t.savepoint===void 0||vL(t.savepoint))}function bL(e,t){let n=e=>e.kind===`file`||XI(e.key)?!0:(t.add(e.key),!1),r=e=>e.map(e=>e.filter(n)).filter(e=>e.length>0),{savepoint:i}=e,a=r(e.past),o=r(e.future);return i===void 0?{past:a,future:o}:{past:a,future:o,savepoint:{at:r(e.past.slice(0,i.at)).length,net:i.net.filter(n),below:r(i.below)}}}function xL(e,t){return{load:()=>{let n;try{n=r.readFileSync(e,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`settings-history read failed (${n}); starting empty`),{}}try{let e=JSON.parse(n);if(typeof e==`object`&&e&&!Array.isArray(e)&&Object.values(e).every(yL)){let n=new Set,r=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,bL(t,n)]));return n.size>0&&t(`warn`,`settings-history load: dropped the changes to ${[...n].map(e=>`"${e}"`).join(`, `)}, no longer a setting`),r}}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),Me(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}const SL=e=>!XI(e)&&!oS(e)&&e!==`update.dismissed`;var CL=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:$F(e,SL,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,Mv.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function wL(e){let t=BN(e,`doctor.tmux`,[`display`,`-p`,`-t`,e.pane,`#{client_termfeatures}`]);return t.kind===`ok`?{kind:`ok`,value:t.stdout.trim().split(`,`).filter(e=>e!==``)}:{kind:`failed`,reason:t.reason}}function TL(e){return{probeTmux:wL,loadConfig:e}}function EL(e,t){let n=e.loadConfig(t),r={path:n.path,warnings:n.warning===null?[]:n.warning.split(`
201
+ `)};return n.error===null?{...r,kind:`loaded`,shadowed:uE(t.projectDir,t.cwd,t.configFile??void 0),unused:n.unused}:{...r,kind:`failed`,error:n.error}}function DL(e){let t=yS(e).env;if(t===void 0)return{path:e,env:{}};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: \`env\` is not an object`);return{path:e,env:t}}function OL(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function kL(e){return{kind:`arrived`,handler:e,bar:HE}}function AL(e,t,n){return{tmux:OL(e,t.tmux),config:EL(e,n),claudeSettings:DL(gS(hS(t.claudeConfigDir)))}}function jL(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ls(vS(n),[`env`,e.name],JSON.stringify(e.value),Jo);return r.mkdirSync(c.dirname(n),{recursive:!0}),Me(n,i),{...t,claudeSettings:DL(n)}}default:return e.kind}}const ML={connectMs:200,budgetMs:500};async function NL(e){let n=e.includes(`--json`),r=await PL();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${VE(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
202
+ `);return}t.stdout.write(RL(r.value))}function PL(){return FE({kind:`stats`},ML,e=>`stats`in e?e.stats:void 0)}function FL(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function IL(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function LL(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m${e%60}s`:`${Math.floor(e/3600)}h${Math.floor(e%3600/60)}m`}function RL(e){let t=[];t.push(`cc-candybar daemon stats`),t.push(``),t.push(`process`),t.push(` pid ${e.pid}`),t.push(` version ${e.version}`),t.push(` protocol ${e.protocolVersion}`),t.push(` startedAt ${e.startedAt}`),t.push(` uptime ${LL(e.uptimeSec)}`),t.push(` rss ${FL(e.rssBytes)}`),t.push(` heapUsed ${FL(e.heapUsedBytes)}`),t.push(` heapTotal ${FL(e.heapTotalBytes)}`),t.push(` external ${FL(e.externalBytes)}`),t.push(` arrayBuffers ${FL(e.arrayBuffersBytes)}`),t.push(``),t.push(`requests`),t.push(` total ${e.requests.total}`),t.push(` errored ${e.requests.errored}`),t.push(` timedOut ${e.requests.timedOut}`),t.push(` inFlight ${e.requests.inFlight}`),t.push(``),t.push(`gitCache`),t.push(` size ${e.gitCache.size}`),t.push(` hit rate ${IL(e.gitCache.hits,e.gitCache.misses)} (${e.gitCache.hits} / ${e.gitCache.hits+e.gitCache.misses})`),t.push(` invalidations ${e.gitCache.invalidations}`),t.push(``),t.push(`usageCache`),t.push(` size ${e.usageCache.size}`),t.push(` hit rate ${IL(e.usageCache.hits,e.usageCache.misses)} (${e.usageCache.hits} / ${e.usageCache.hits+e.usageCache.misses})`),t.push(` sweeps ${e.usageCache.sweeps}`),t.push(``),t.push(`renderCache`),t.push(` size ${e.renderCache.size}`),t.push(`watchers`),t.push(` active ${e.watchers.active}`),t.push(` opened ${e.watchers.opened}`),t.push(` closed ${e.watchers.closed}`),t.push(` evicted ${e.watchers.evicted}`),t.push(``),t.push(`subprocesses`),t.push(` total ${e.subprocesses.total}`),t.push(` inFlight ${e.subprocesses.inFlight}`),t.push(` lastMinute ${e.subprocesses.lastMinute}`);let n=Object.entries(e.subprocesses.byCategory),r=n.reduce((e,[t])=>Math.max(e,t.length),13);for(let[i,a]of n){let n=e.subprocesses.p50DurationMs[i],o=e.subprocesses.p99DurationMs[i],s=n!==void 0&&o!==void 0?` (p50 ${n}ms · p99 ${o}ms)`:``;t.push(` ${i.padEnd(r)} ${a}${s}`)}return e.nextRestartReason&&(t.push(``),t.push(`nextRestart ${e.nextRestartReason}`)),t.join(`
203
203
  `)+`
204
- `}const vL=e=>({kind:`ok`,value:e}),yL=e=>({kind:`failed`,reason:e});var bL=class{arrivals=[];arrive(e){this.arrivals=[...this.arrivals,e].slice(-16)}list(){return this.arrivals}};const xL=/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;function SL(e){return xL.test(e)?e:null}function CL(e){let t=e.opener();if(t.kind===`failed`)return t;if(t.value===null)return vL(null);let n=t.value,r=e.script(n);if(r.kind===`failed`)return vL({app:n,missing:yL(`its script could not be read (${r.reason})`)});let i=jO(r.value);return vL({app:n,missing:i===null?yL("its script is not one `cc-candybar install` wrote"):vL([i.node,i.script].filter(t=>!e.exists(t)))})}async function wL(e,t){let n=e.now()+5e3;for(;e.now()<n;){await e.pause();let n=await e.daemon(),r=n.kind===`ok`?n.value.arrivals.find(e=>e.nonce===t):void 0;if(n.kind===`ok`&&r!==void 0)return{kind:`arrived`,handler:r.handler,bar:n.value.version}}return null}async function TL(e){if(e.platform!==`darwin`)return{kind:`unsupported`};if(e.sockets.own!==e.sockets.handler)return{kind:`unprobed`,reason:`this shell's daemon is at ${e.sockets.own} (CC_CANDYBAR_SOCKET); the URL handler delivers links to ${e.sockets.handler}`};let t=await e.daemon();if(t.kind===`failed`)return{kind:`unprobed`,reason:`the daemon could not be asked whether a link arrives: ${t.reason}`};let n=e.nonce(),r=e.open(`${AD}://${$D}/${n}`);return(r===null?await wL(e,n):null)??{kind:`lost`,unopened:r,opener:CL(e)}}function EL(e,t,n){let r=Ae({bin:t,args:[...n],category:e,timeoutMs:5e3});return r.ok?vL(r.stdout):yL(r.stderr.trim()||r.error||r.reason)}const DL=`ObjC.import("AppKit");var u = $.NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL($.NSURL.URLWithString("${AD}://probe"));u.isNil() ? "" : u.path.js`;async function OL(){let e=await pL();if(e.kind!==`ok`)return yL(VE(e).split(`
205
- `).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?vL({version:t,arrivals:n}):yL(`the running daemon (${t}) predates this check`)}function kL(){return{platform:process.platform,sockets:{own:Le(),handler:Re()},now:Date.now,nonce:se,daemon:OL,open:e=>{let t=EL(`doctor.open`,`/usr/bin/open`,[`-g`,e]);return t.kind===`ok`?null:t.reason},pause:()=>new Promise(e=>setTimeout(e,100)),opener:()=>{let e=EL(`doctor.launch-services`,`/usr/bin/osascript`,[`-l`,`JavaScript`,`-e`,DL]);if(e.kind===`failed`)return e;let t=e.value.trim();return vL(t===``?null:t)},script:e=>EL(`doctor.osadecompile`,`/usr/bin/osadecompile`,[MO(e)]),exists:r.existsSync}}const AL=/^─{20,}/,jL=/^❯(\s|$)/,ML=/›\s*stashed$/;function NL(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>AL.test(e)?[t]:[]).at(-2);return n===void 0||!jL.test(t[n+1]??``)?{kind:`no-prompt`}:ML.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const PL={"in-mode":`the Claude Code pane is in tmux copy mode — leave it (q) and click again`,stashed:`Claude Code is holding a stashed prompt (ctrl+s) — restore or send it, then click again`,"no-prompt":`Claude Code is not at its prompt (a dialog or picker is open) — close it and click again`};function FL(e,t,n){if(t===void 0)return{kind:`refused`,reason:`this session's statusline client reports no tmux facts (it predates this daemon) — rebuild or reinstall cc-candybar`};if(t===null)return{kind:`refused`,reason:`this Claude Code is not running inside tmux — the bar can only type into a tmux pane`};let r=NL(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:PL[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const IL=`cc-candybar-slash`;function LL(e,t,n,r){let i=yN(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function RL(e){let t=LL(e,`claude-input.read`,[`display`,`-p`,`-t`,e.pane,`#{pane_in_mode}`,`;`,`capture-pane`,`-p`,`-t`,e.pane]);if(t.kind===`rate-limited`)throw Error(t.reason);let[n=``,...r]=t.stdout.split(`
206
- `);return{inMode:n!==`0`,screen:r}}function zL(e,t){let n=LL(e,`claude-input.type`,[`load-buffer`,`-b`,IL,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,IL,`-t`,e.pane,`;`,`send-keys`,`-t`,e.pane,`Enter`],t);return n.kind===`ok`?{kind:`typed`}:{kind:`refused`,reason:`cc-candybar typed a command moments ago — click again in a second (${n.reason})`}}function BL(){return{read:RL,type:zL}}function VL(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function HL(e){return UL(()=>decodeURIComponent(e))}function UL(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function WL(e,t){let n=Ae({bin:`/usr/bin/pbcopy`,stdinInput:e,category:`click.pbcopy`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.pbcopy rate-limited: ${n.error??``}`);return}throw Error(`pbcopy failed (${n.reason}, exit ${n.exitCode??`null`})`)}}const GL=(e,t)=>WL(HL(e),t),KL=(e,t)=>{let n=Ae({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,HL(e)],category:`click.open`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.open rate-limited: ${n.error??``}`);return}throw Error(`open -a "Visual Studio Code" failed (${n.reason}, exit ${n.exitCode??`null`})`)}},qL=(e,t)=>WL(HL(e),t),JL=(e,t)=>WL(HL(e),t),YL=(e,t)=>{let n=VL(HL(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},XL=(e,t)=>{let[n=``,...r]=UL(()=>rO(e)),i=VL(n),a=sM(cR(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}eR(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},ZL=/^-?\d+$/;function QL(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const $L=(e,t)=>{let[n=``,r=``,i=``]=UL(()=>rO(e)),a=VL(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!ZL.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=cR(t,a),c=sM(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&ZL.test(u)?tR(l,parseInt(u,10)):nR(`step-state`,r,l,uM(s,e=>t.sessionState.get(a,e),r)),f=QL(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);eR(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}→${p.value} (by ${o}, session=${a})`)};function eR(e,t,n,r){let i=r.filter(e=>e.key.startsWith(tv));if(i.length===0)return;let a=Hj(cR(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function tR(e,t){return Math.max(e.min,Math.min(e.max,t))}function nR(e,t,n,r){if(r===null)return n.min;if(!ZL.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return tR(n,parseInt(r,10))}const rR=`render-origin`;function iR(e){return JSON.stringify(e)}function aR(e){let t;try{t=JSON.parse(e)}catch{throw new $(`render origin is not JSON: ${e}`)}if(typeof t!=`object`||!t)throw new $(`render origin is not an object: ${e}`);let{projectDir:n,cwd:r,configFile:i}=t;if(typeof n!=`string`||typeof r!=`string`||i!==null&&typeof i!=`string`)throw new $(`render origin has the wrong shape: ${e}`);return{projectDir:n,cwd:r,configFile:i}}function oR(e,t){let n=e.sessionState.get(t,rR);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return aR(n)}function sR(e,t,n){let r=e.sessionState.get(t,rR);if(r===null)return;let i=aR(r),a=lR(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function cR(e,t){return e.configFor(oR(e,t))}function lR(e){return sE(e.projectDir,e.cwd,e.configFile??void 0)}function uR(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const dR=(e,t)=>{let[n=``,r=``,i=``]=UL(()=>rO(e)),a=VL(n),o=oR(t,a),s=t.configFor(o),c=mA(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=lR(o),d=Bj(s,e=>t.sessionState.get(a,e),r);gI(uR(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u} (session=${a})`)},fR=(e,t)=>{let[n=``,r=``,i=``]=UL(()=>rO(e)),a=VL(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!ZL.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=oR(t,a),c=t.configFor(s),l=mA(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=lR(s),f=Bj(c,e=>t.sessionState.get(a,e),r),p=hI(d,f.key),m=typeof p==`number`?tR(u,p):nR(`step-config`,r,u,gA(f.globals,r)),h=QL(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);gI(uR(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}→${g.value} (by ${o}) → ${d} (session=${a})`)},pR=(e,t)=>{let[n=``]=UL(()=>rO(e)),r=VL(n),i=oR(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=Rj(a,o),c=Vj(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=sM(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});hR(`save`,l,c);let d=lR(i);_I(uR(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map(mR)].join(` `)} → ${d} (session=${r})`)},mR=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Js(e.value)}`;function hR(e,t,n){for(let r of n){let n=t.validate(r.key,Js(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const gR=(e,t)=>{let[n=``]=UL(()=>rO(e)),r=VL(n),i=oR(t,r),a=t.configFor(i),o=Gj(a,e=>t.sessionState.get(r,e)),s=sM(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});hR(`save-preset`,s,o.placements);let l=lR(i),u=CI(uR(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...Bb.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,zb.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(mR)].join(` `)} → ${l} (session=${r})`)},_R=(e,t)=>{let[n=``,r=``]=UL(()=>rO(e)),i=VL(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=oR(t,i),o=lR(a);wI(uR(t,i),o,r),t.reloadConfig(a);let s=zb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},vR=(e,t)=>{let[n=``,...r]=UL(()=>rO(e)),i=VL(n),a=oR(t,i),o=mA(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=lR(a),l=r.map(Kj),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);xI(uR(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} ← ${c} (session=${i})`)};function yR(e,t){let n=(e,t)=>[...Ps(P_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(j_(t.presets).flatMap(e=>n(t,e).map(t=>nv(Su(e),As(t)))));return j_(e.presets).flatMap(t=>n(e,t).map(e=>({member:nv(Su(t),As(e)),node:e})).filter(({member:e})=>!r.has(e)))}function bR(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[X_]:[]])}const xR=(e,t)=>{let[n=``,r=``,i=``]=UL(()=>rO(e)),a=VL(n),o=oR(t,a),s=t.configFor(o),c=mA(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=eA(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=lR(o),f=TI(uR(t,a),d,r,u);t.reloadConfig(o);let p=bR(yR(s,t.configFor(o)),t.sessionState.get(a,X_)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} → ${d} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},SR=(e,t)=>{let[n=``]=UL(()=>rO(e)),r=VL(n);t.journal.commit();let i=t.history.undo(r);sR(t,r,i),t.dlog(`info`,`undo: restored ${qI(i)} (session=${r})`)},CR=(e,t)=>{let n=VL(HL(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,sM(cR(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},wR=(e,t)=>{let n=VL(HL(e));t.journal.commit();let r=t.history.rewind(n);sR(t,n,r),t.dlog(`info`,`rewind: put back ${qI(r)||`nothing`} as edit mode found it (session=${n})`)},TR=(e,t)=>{let[n=``]=UL(()=>rO(e)),r=VL(n);t.journal.commit();let i=t.history.redo(r);sR(t,r,i),t.dlog(`info`,`redo: re-applied ${qI(i)} (session=${r})`)},ER=(e,t)=>{VL(HL(e)),t.applyUpdate()},DR=`client-hints`;function OR(e,t){let n=e.sessionState.get(t,DR);if(n===null)throw new $(`session ${t} has not rendered yet — no client facts are recorded for it`);let r;try{r=JSON.parse(n)}catch{throw new $(`client hints record is not JSON: ${n}`)}if(typeof r!=`object`||!r)throw new $(`client hints record is not an object: ${n}`);return SE(r)}function kR(e,t,n){let r=Yx(n);e.sessionState.setBatch(t,eS(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed(${1+(e.verdict.more?.length??0)})`}`).join(` `)} (session=${t})`)}function AR(e,t){return{...lL(e.doctor,OR(e,t),oR(e,t)),urlHandler:cL(e.clientVersion)}}const jR=(e,t)=>{let n=VL(HL(e));kR(t,n,AR(t,n))},MR=(e,t)=>{let n=SL(HL(e));if(n===null)throw new $(`doctor-probe: the value is not a probe nonce`);t.probes.arrive({nonce:n,handler:t.clientVersion}),t.dlog(`info`,`doctor-probe: arrived nonce=${n} handler=${t.clientVersion??`unreported`}`)},NR=(e,t)=>{let[n=``,r=``]=UL(()=>rO(e)),i=VL(n),a=Xx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=AR(t,i),s=a.probe(o);if(s.ok||s.fix===void 0)throw new $(`doctor-fix: ${a.label} — ${s.ok?`nothing to fix`:s.reason}`);let c=uL(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),kR(t,i,c)},PR=(e,t)=>{let[n=``,...r]=UL(()=>rO(e)),i=VL(n),a=oR(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=jw(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=KA({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},OR(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},FR=(e,t)=>{let[n=``,r=``]=UL(()=>rO(e)),i=VL(n),a=Object.values(t.configFor(oR(t,i)).actions).filter(e=>`slash`in e),o=a.find(e=>e.slash===r);if(o===void 0)throw new $(`${JSON.stringify(r)} is not a command this config declares (it declares: ${[...new Set(a.map(e=>e.slash))].join(`, `)||`none`})`);let s=FL(t.claudeInput,OR(t,i).tmux,o.slash);if(s.kind===`refused`)throw t.dlog(`warn`,`slash: ${r} refused — ${s.reason} (session=${i})`),new $(`${r} was not typed: ${s.reason}`);t.dlog(`info`,`slash: typed ${r} into ${s.pane} (session=${i})`)},IR=`config-override`,LR=new Map([[PD,GL],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=VL(UL(()=>decodeURIComponent(e.slice(0,n)))),i=UL(()=>decodeURIComponent(e.slice(n+1))).trim();if(i!==``){if(!i.startsWith(`/`))throw new $(`load-config: path must be absolute, got "${i}"`);if(!/\.(json5?|json)$/.test(i))throw new $(`load-config: path must end with .json5 or .json, got "${i}"`)}i===``?(t.sessionState.clear(r,IR),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,IR,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[FD,KL],[MD,XL],[ND,$L],[zD,dR],[BD,fR],[WD,vR],[VD,pR],[HD,gR],[UD,_R],[GD,xR],[KD,SR],[qD,TR],[JD,CR],[YD,wR],[LD,qL],[RD,JL],[ID,YL],[XD,ER],[ZD,jR],[QD,NR],[$D,MR],[eO,PR],[tO,FR]]),RR=new Set([MD,ND,zD,BD,WD,VD,HD,UD,GD,KD,qD,JD,YD,ID,XD,ZD,QD,eO,tO]),zR=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of sO(aO(e))){if(!i&&RR.has(a)){let e=rO(o);e.length>0&&e[0]&&(i=e[0])}let e=LR.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof $||(r=!0),n.push(`${a}: ${e instanceof Error?e.message:String(e)}`)}}if(n.length>0){i&&t.sessionState.set(i,`click.error`,n.join(`
207
- `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function BR(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const VR=new Map([...LR,[jD,zR]].map(([e,t])=>[e,BR(t)]));Object.freeze([...VR.keys()]);const HR=new Set([`hook_event_name`,`session_id`,`session_name`,`transcript_path`,`cwd`,`model`,`workspace`,`version`,`output_style`,`cost`,`context_window`,`exceeds_200k_tokens`,`effort`,`thinking`,`rate_limits`,`vim`,`agent`,`worktree`]),UR=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]],WR=[[`workspace.added_dirs`,`string-list`]];function GR(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of UR){let i=JR(n,e);if(i==null)t.missingRequired.push(e);else{let n=KR(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of WR){let i=JR(n,e),a=i===void 0?r:qR(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))HR.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function KR(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function qR(e){return Array.isArray(e)&&e.every(e=>KR(e)===`string`)?`string-list`:KR(e)}function JR(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=n[e]}return n}function YR(e,t){switch(e){case`vars`:return{what:e,vars:XR(t)};case`segments`:return{what:e,segments:tz(t)};case`config`:return{what:e,config:az(t)}}}function XR(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=$R(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...ZR(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:QR(r.lastUpdatedMs())})}return o}function ZR(e){if(e.kind!==`document`)try{return{type:e.type,value:e.read()}}catch(t){return{type:e.type,value:t instanceof Error?t.message:String(t)}}let t=e.read();switch(t.kind){case`ok`:return{type:`document`,value:JSON.stringify(t.value)};case`absent`:return{type:`document`,value:`(not yet scanned)`};case`failed`:return{type:`document`,value:t.reason}}}function QR(e){return e===null?null:Math.max(0,Date.now()-e)}function $R(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,ez(r));for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,ez(i));return t}function ez(e){return e.kind}function tz(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=rz(n),o=nz(n),s=[];for(let e of a){let t=n.segments[e];t&&s.push({name:e,description:t.description??null,template:t.template,referencedVars:iz(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function nz(e){let t=new Map;for(let n of j_(e.presets))for(let r of Ps(P_(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=As(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function rz(e){let t=[],n=new Set;for(let r of Ps(Lc(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function iz(e,t,n){let r=new Set;for(let i of xv(e,t).keys()){if(n.has(i)){r.add(i);continue}let e=i.split(`.`);for(;e.length>1;){e.pop();let t=e.join(`.`);if(n.has(t)){r.add(t);break}}}return Array.from(r).sort()}function az(e){return e===null?null:e.config}const oz=[`vars`,`segments`,`config`];function sz(e){return typeof e==`string`&&oz.includes(e)}function cz(e){return Math.max(1,e-2)}var lz=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return c.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const uz=new jF,dz=new bL;De(uz.launchStats);const fz=new ob({counters:uz,logger:Z}),pz=TN({watchers:fz,logger:Z}),{gitProvider:mz,usageStore:hz,mementoProvider:gz}=pz,_z=new FF,vz=new NI(_z,Z),yz=new nL,bz=new lz(Ye()),xz=new kF({gitService:mz,sessionState:_z,watchers:fz},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} file=${e.configFilePath??`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),Sz=60*1e3;function Cz(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(T(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),zz(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,Sz),a.unref())},checkNow:o}}const wz=Cz(),Tz=kM({entryUrl:import.meta.url,intervalMs:Sz,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>wz.checkNow(),log:Z});let Ez=null,Dz=null,Oz=0;function kz(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),zz(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),zz(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),zz(0)});try{Oz=rD(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),zz(1);return}Ez=rk(t.pid);let e=pk(hk(Ez));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),zz(1);return}Dz=e.registryPath,r.mkdirSync(Ie(),{recursive:!0}),Be(Le()),_z.useStorage(new LF(Ue(),500,Z)),vz.useStorage(eL(We(),Z)),ok({anchor:ak(t.env),isAlive:sk,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),zz(0)}}),Az(b.createServer({allowHalfOpen:!1},e=>{Bz(e)}),Le(),!1)}function Az(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),zz(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}jz(e,n)}),e.listen(n,()=>Mz(n))}function jz(e,n){let i=qO(JO(Ve(n)),(e,t)=>nk(e,t,{readStartTime:tk,pidAlive:sk}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),zz(1);return}}Az(e,n,!0)}function Mz(e){let n=ZO(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),zz(0);return}Iz(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(ne.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(Oz/1048576)}MB`),bD();let i=bz.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),wz.arm(),Tz.arm(),Fz(),Nz(e,n.identity)}function Nz(e,n){ek({bound:n,myPid:t.pid,readIdentity:()=>ZO(e),readLease:()=>JO(Ve(e)),shutdown:e=>zz(e),log:Z}).arm()}let Pz=null;function Fz(){Pz=sD(dD(uz.startedAt.getTime(),e=>zz(e),{rssLimitBytes:Oz})),Pz.arm()}function Iz(e){let n=YO(Ve(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:Ez});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let Lz=0,Rz=!1;function zz(e){if(!Rz){Rz=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{mz.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{hz.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{fz.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{_z.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}XO(He(),t.pid),Dz!==null&&mk(Dz,t.pid,dk,e=>r.unlinkSync(e)),t.exit(e)}}function Bz(e){Lz++,uz.inFlight=Lz;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>zz(r);try{e.end(ME(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{uz.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=NE(e=>{Hz(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),Lz=Math.max(0,Lz-1),uz.inFlight=Lz})}const Vz=e=>({resp:e,exitAfterFlush:null});async function Hz(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return Vz({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale — staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return Vz({ok:!0,stats:uz.snapshot({gitCache:mz.getStats(),usageCache:hz.getStats(),renderCacheSize:xz.size,watchersActive:fz.size(),nextRestartReason:Pz?.describeNextRestart()??null,handlerProbes:dz.list()})});if(e.kind===`render`){uz.requestsTotal++;let t=Date.now();try{let{report:n}=GR(e.hookData);for(let e of n.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let r=[];for(let e of n.missingRequired)r.push(`missing required field '${e}'`);for(let{path:e,expected:t,got:i}of n.typeMismatches)r.push(`field '${e}' expected ${t}, got ${i}`);if(e.cwd===``&&r.push(`request 'cwd' is empty`),r.length>0)return uz.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),Vz({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=Uz(e.args),s=e.hookData.session_id,c=SE(e),l=JSON.stringify(c);_z.get(s,`client-hints`)!==l&&_z.set(s,DR,l);let u=_z.get(s,`config-override`)??a??c.configEnv,d=xz.getOrCreate(i,e.cwd,u),f=iR({projectDir:i,cwd:e.cwd,configFile:u??null});_z.get(s,`render-origin`)!==f&&_z.set(s,rR,f);let p=c.termCols,m=cz(p??120),h=Mk(c.termRows),{authoredRoots:g}=d.state,_=t=>_z.get(e.hookData.session_id,t),v=aj(d.state.config,_,e=>g.has(e)),y=await Sj(e.hookData,{...Jz,navigation:e=>yz.depth(e,_z,sM(d.state.config))},e.cwd,d.state.neededInputPaths(v.preset),v,c,{...Jj(d.state.config,d.state.fileHeldSettings,_),configPath:d.configFilePath}),b=[],x=oj(v,m),S=lF(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},sj(v)),C=_z.get(e.hookData.session_id,`click.error`);C&&_z.clear(e.hookData.session_id,`click.error`);let w=[o,d.lastError,C].filter(Boolean).join(`
208
- `),ee=Tz.notice({sessionId:s,dismissed:_z.get(s,pM),enabled:v.updateNotice}),te=d.lastError===null?null:d.configFilePath,ne=Lk(w,ee,[d.lastWarning??``,...b].filter(Boolean).join(`
209
- `)),re=bz.sync(s,ne===null?null:zk(ne));re!==null&&Z(`warn`,`diagnostic dump failed: ${re}`);let ie=Bk(S,ne,{fullText:re===null?{kind:`file`,path:bz.pathFor(s)}:{kind:`unavailable`,reason:re},failedConfigFile:te},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=mz.getStats(),ae=hz.getStats();return Z(`info`,`render sid=${e.hookData.session_id??`?`} took=${T}ms termCols=${p??`?`} termRows=${c.termRows??`?`} width=${m} git=${E.size}/${E.hits}h/${E.misses}m usage=${ae.size}/${ae.hits}h/${ae.misses}m err=${w?`Y`:`N`} upd=${ee.length} warn=${d.lastWarning?`Y`:`N`}`),Vz({ok:!0,output:ie+`
210
- `})}catch(e){throw uz.requestsErrored++,e}}if(e.kind===`click`)return Vz(Yz(e.verb,e.value,AE(e.clientVersion)));if(e.kind===`debug`){if(!sz(e.what))return Vz({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${oz.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=xz.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?qz(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):Kz};return Vz({ok:!0,debug:YR(e.what,n)})}return Vz({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function Uz(e){let{values:t,tokens:n}=v({args:e.slice(1),options:{config:{type:`string`}},strict:!1,tokens:!0,allowPositionals:!0}),r=[...new Set((n??[]).filter(e=>e.kind===`option`&&e.name!==`config`).map(e=>`--${e.name}`))];return{configFile:TE(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const Wz={sessionState:_z,dlog:Z,applyUpdate:()=>Tz.act(),doctor:iL(e=>{let t=[e.projectDir,e.cwd,e.configFile??void 0];xz.reload(...t);let n=xz.getOrCreate(...t);return{path:n.configFilePath,error:n.lastError,warning:n.lastWarning,unused:n.state.unused}}),probes:dz,memento:gz,claudeInput:BL(),history:vz,navigation:yz,configFor:e=>xz.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>xz.reload(e.projectDir,e.cwd,e.configFile??void 0)};Wz.reloadConfig;const Gz={endcaps:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:_o,width:1/0},Kz=new Map;function qz(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,jk(a,{...Gz,charset:t,colorCompatibility:n}));return r}const Jz={...pz,clock:()=>new Date,history:e=>vz.depth(e)};function Yz(e,t,n){let r=VR.get(e);if(!r)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return r(t,{...Wz,clientVersion:n}),{ok:!0,output:``}}catch(e){let t=e instanceof $?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const Xz={connectMs:200,budgetMs:500};async function Zz(e,n){let r=n.includes(`--json`),i=await Qz(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${VE(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
211
- `);return}t.stdout.write($z(i.value))}function Qz(e){return FE({kind:`debug`,what:e},Xz,e=>`debug`in e?e.debug:void 0)}function $z(e){switch(e.what){case`vars`:return eB(e.vars);case`segments`:return tB(e.segments);case`config`:return nB(e.config);default:return e}}function eB(e){if(e.length===0)return`no variables (DSL not active)
212
- `;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`—`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${iB(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${rB(a.value)}${e}${o}`)}return t.join(`
204
+ `}const zL=e=>({kind:`ok`,value:e}),BL=e=>({kind:`failed`,reason:e});var VL=class{arrivals=[];arrive(e){this.arrivals=[...this.arrivals,e].slice(-16)}list(){return this.arrivals}};const HL=/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;function UL(e){return HL.test(e)?e:null}function WL(e){let t=e.opener();if(t.kind===`failed`)return t;if(t.value===null)return zL(null);let n=t.value,r=e.script(n);if(r.kind===`failed`)return zL({app:n,missing:BL(`its script could not be read (${r.reason})`)});let i=jO(r.value);return zL({app:n,missing:i===null?BL("its script is not one `cc-candybar install` wrote"):zL([i.node,i.script].filter(t=>!e.exists(t)))})}async function GL(e,t){let n=e.now()+5e3;for(;e.now()<n;){await e.pause();let n=await e.daemon(),r=n.kind===`ok`?n.value.arrivals.find(e=>e.nonce===t):void 0;if(n.kind===`ok`&&r!==void 0)return{kind:`arrived`,handler:r.handler,bar:n.value.version}}return null}async function KL(e){if(e.platform!==`darwin`)return{kind:`unsupported`};if(e.sockets.own!==e.sockets.handler)return{kind:`unprobed`,reason:`this shell's daemon is at ${e.sockets.own} (CC_CANDYBAR_SOCKET); the URL handler delivers links to ${e.sockets.handler}`};let t=await e.daemon();if(t.kind===`failed`)return{kind:`unprobed`,reason:`the daemon could not be asked whether a link arrives: ${t.reason}`};let n=e.nonce(),r=e.open(`${AD}://${$D}/${n}`);return(r===null?await GL(e,n):null)??{kind:`lost`,unopened:r,opener:WL(e)}}function qL(e,t,n){let r=Ae({bin:t,args:[...n],category:e,timeoutMs:5e3});return r.ok?zL(r.stdout):BL(r.stderr.trim()||r.error||r.reason)}const JL=`ObjC.import("AppKit");var u = $.NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL($.NSURL.URLWithString("${AD}://probe"));u.isNil() ? "" : u.path.js`;async function YL(){let e=await PL();if(e.kind!==`ok`)return BL(VE(e).split(`
205
+ `).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?zL({version:t,arrivals:n}):BL(`the running daemon (${t}) predates this check`)}function XL(){return{platform:process.platform,sockets:{own:Le(),handler:Re()},now:Date.now,nonce:se,daemon:YL,open:e=>{let t=qL(`doctor.open`,`/usr/bin/open`,[`-g`,e]);return t.kind===`ok`?null:t.reason},pause:()=>new Promise(e=>setTimeout(e,100)),opener:()=>{let e=qL(`doctor.launch-services`,`/usr/bin/osascript`,[`-l`,`JavaScript`,`-e`,JL]);if(e.kind===`failed`)return e;let t=e.value.trim();return zL(t===``?null:t)},script:e=>qL(`doctor.osadecompile`,`/usr/bin/osadecompile`,[MO(e)]),exists:r.existsSync}}const ZL=/^─{20,}/,QL=/^❯(\s|$)/,$L=/›\s*stashed$/;function eR(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>ZL.test(e)?[t]:[]).at(-2);return n===void 0||!QL.test(t[n+1]??``)?{kind:`no-prompt`}:$L.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const tR={"in-mode":`the Claude Code pane is in tmux copy mode — leave it (q) and click again`,stashed:`Claude Code is holding a stashed prompt (ctrl+s) — restore or send it, then click again`,"no-prompt":`Claude Code is not at its prompt (a dialog or picker is open) — close it and click again`};function nR(e,t,n){if(t===void 0)return{kind:`refused`,reason:`this session's statusline client reports no tmux facts (it predates this daemon) — rebuild or reinstall cc-candybar`};if(t===null)return{kind:`refused`,reason:`this Claude Code is not running inside tmux — the bar can only type into a tmux pane`};let r=eR(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:tR[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const rR=`cc-candybar-slash`;function iR(e,t,n,r){let i=BN(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function aR(e){let t=iR(e,`claude-input.read`,[`display`,`-p`,`-t`,e.pane,`#{pane_in_mode}`,`;`,`capture-pane`,`-p`,`-t`,e.pane]);if(t.kind===`rate-limited`)throw Error(t.reason);let[n=``,...r]=t.stdout.split(`
206
+ `);return{inMode:n!==`0`,screen:r}}function oR(e,t){let n=iR(e,`claude-input.type`,[`load-buffer`,`-b`,rR,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,rR,`-t`,e.pane,`;`,`send-keys`,`-t`,e.pane,`Enter`],t);return n.kind===`ok`?{kind:`typed`}:{kind:`refused`,reason:`cc-candybar typed a command moments ago — click again in a second (${n.reason})`}}function sR(){return{read:aR,type:oR}}function cR(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function lR(e){return uR(()=>decodeURIComponent(e))}function uR(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function dR(e,t){let n=Ae({bin:`/usr/bin/pbcopy`,stdinInput:e,category:`click.pbcopy`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.pbcopy rate-limited: ${n.error??``}`);return}throw Error(`pbcopy failed (${n.reason}, exit ${n.exitCode??`null`})`)}}const fR=(e,t)=>dR(lR(e),t),pR=(e,t)=>{let n=Ae({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,lR(e)],category:`click.open`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.open rate-limited: ${n.error??``}`);return}throw Error(`open -a "Visual Studio Code" failed (${n.reason}, exit ${n.exitCode??`null`})`)}},mR=(e,t)=>dR(lR(e),t),hR=(e,t)=>dR(lR(e),t),gR=(e,t)=>{let n=cR(lR(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},_R=(e,t)=>{let[n=``,...r]=uR(()=>rO(e)),i=cR(n),a=sM(kR(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}xR(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},vR=/^-?\d+$/;function yR(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const bR=(e,t)=>{let[n=``,r=``,i=``]=uR(()=>rO(e)),a=cR(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!vR.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=kR(t,a),c=sM(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&vR.test(u)?SR(l,parseInt(u,10)):CR(`step-state`,r,l,uM(s,e=>t.sessionState.get(a,e),r)),f=yR(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);xR(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}→${p.value} (by ${o}, session=${a})`)};function xR(e,t,n,r){let i=r.filter(e=>e.key.startsWith(tv));if(i.length===0)return;let a=Hj(kR(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function SR(e,t){return Math.max(e.min,Math.min(e.max,t))}function CR(e,t,n,r){if(r===null)return n.min;if(!vR.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return SR(n,parseInt(r,10))}const wR=`render-origin`;function TR(e){return JSON.stringify(e)}function ER(e){let t;try{t=JSON.parse(e)}catch{throw new $(`render origin is not JSON: ${e}`)}if(typeof t!=`object`||!t)throw new $(`render origin is not an object: ${e}`);let{projectDir:n,cwd:r,configFile:i}=t;if(typeof n!=`string`||typeof r!=`string`||i!==null&&typeof i!=`string`)throw new $(`render origin has the wrong shape: ${e}`);return{projectDir:n,cwd:r,configFile:i}}function DR(e,t){let n=e.sessionState.get(t,wR);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return ER(n)}function OR(e,t,n){let r=e.sessionState.get(t,wR);if(r===null)return;let i=ER(r),a=AR(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function kR(e,t){return e.configFor(DR(e,t))}function AR(e){return sE(e.projectDir,e.cwd,e.configFile??void 0)}function jR(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const MR=(e,t)=>{let[n=``,r=``,i=``]=uR(()=>rO(e)),a=cR(n),o=DR(t,a),s=t.configFor(o),c=mA(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=AR(o),d=Bj(s,e=>t.sessionState.get(a,e),r);LI(jR(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u} (session=${a})`)},NR=(e,t)=>{let[n=``,r=``,i=``]=uR(()=>rO(e)),a=cR(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!vR.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=DR(t,a),c=t.configFor(s),l=mA(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=AR(s),f=Bj(c,e=>t.sessionState.get(a,e),r),p=II(d,f.key),m=typeof p==`number`?SR(u,p):CR(`step-config`,r,u,gA(f.globals,r)),h=yR(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);LI(jR(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}→${g.value} (by ${o}) → ${d} (session=${a})`)},PR=(e,t)=>{let[n=``]=uR(()=>rO(e)),r=cR(n),i=DR(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=Rj(a,o),c=Vj(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=sM(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});IR(`save`,l,c);let d=AR(i);RI(jR(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map(FR)].join(` `)} → ${d} (session=${r})`)},FR=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Js(e.value)}`;function IR(e,t,n){for(let r of n){let n=t.validate(r.key,Js(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const LR=(e,t)=>{let[n=``]=uR(()=>rO(e)),r=cR(n),i=DR(t,r),a=t.configFor(i),o=Gj(a,e=>t.sessionState.get(r,e)),s=sM(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});IR(`save-preset`,s,o.placements);let l=AR(i),u=WI(jR(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...Bb.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,zb.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(FR)].join(` `)} → ${l} (session=${r})`)},RR=(e,t)=>{let[n=``,r=``]=uR(()=>rO(e)),i=cR(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=DR(t,i),o=AR(a);GI(jR(t,i),o,r),t.reloadConfig(a);let s=zb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},zR=(e,t)=>{let[n=``,...r]=uR(()=>rO(e)),i=cR(n),a=DR(t,i),o=mA(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=AR(a),l=r.map(Kj),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);HI(jR(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} ← ${c} (session=${i})`)};function BR(e,t){let n=(e,t)=>[...Ps(P_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(j_(t.presets).flatMap(e=>n(t,e).map(t=>nv(Su(e),As(t)))));return j_(e.presets).flatMap(t=>n(e,t).map(e=>({member:nv(Su(t),As(e)),node:e})).filter(({member:e})=>!r.has(e)))}function VR(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[X_]:[]])}const HR=(e,t)=>{let[n=``,r=``,i=``]=uR(()=>rO(e)),a=cR(n),o=DR(t,a),s=t.configFor(o),c=mA(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=eA(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=AR(o),f=KI(jR(t,a),d,r,u);t.reloadConfig(o);let p=VR(BR(s,t.configFor(o)),t.sessionState.get(a,X_)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} → ${d} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},UR=(e,t)=>{let[n=``]=uR(()=>rO(e)),r=cR(n);t.journal.commit();let i=t.history.undo(r);OR(t,r,i),t.dlog(`info`,`undo: restored ${mL(i)} (session=${r})`)},WR=(e,t)=>{let n=cR(lR(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,sM(kR(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},GR=(e,t)=>{let n=cR(lR(e));t.journal.commit();let r=t.history.rewind(n);OR(t,n,r),t.dlog(`info`,`rewind: put back ${mL(r)||`nothing`} as edit mode found it (session=${n})`)},KR=(e,t)=>{let[n=``]=uR(()=>rO(e)),r=cR(n);t.journal.commit();let i=t.history.redo(r);OR(t,r,i),t.dlog(`info`,`redo: re-applied ${mL(i)} (session=${r})`)},qR=(e,t)=>{cR(lR(e)),t.applyUpdate()},JR=`client-hints`;function YR(e,t){let n=e.sessionState.get(t,JR);if(n===null)throw new $(`session ${t} has not rendered yet — no client facts are recorded for it`);let r;try{r=JSON.parse(n)}catch{throw new $(`client hints record is not JSON: ${n}`)}if(typeof r!=`object`||!r)throw new $(`client hints record is not an object: ${n}`);return SE(r)}function XR(e,t,n){let r=Yx(n);e.sessionState.setBatch(t,eS(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed(${1+(e.verdict.more?.length??0)})`}`).join(` `)} (session=${t})`)}function ZR(e,t){return{...AL(e.doctor,YR(e,t),DR(e,t)),urlHandler:kL(e.clientVersion)}}const QR=(e,t)=>{let n=cR(lR(e));XR(t,n,ZR(t,n))},$R=(e,t)=>{let n=UL(lR(e));if(n===null)throw new $(`doctor-probe: the value is not a probe nonce`);t.probes.arrive({nonce:n,handler:t.clientVersion}),t.dlog(`info`,`doctor-probe: arrived nonce=${n} handler=${t.clientVersion??`unreported`}`)},ez=(e,t)=>{let[n=``,r=``]=uR(()=>rO(e)),i=cR(n),a=Xx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=ZR(t,i),s=a.probe(o);if(s.ok||s.fix===void 0)throw new $(`doctor-fix: ${a.label} — ${s.ok?`nothing to fix`:s.reason}`);let c=jL(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),XR(t,i,c)},tz=(e,t)=>{let[n=``,...r]=uR(()=>rO(e)),i=cR(n),a=DR(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=jw(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=KA({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},YR(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},nz=(e,t)=>{let[n=``,r=``]=uR(()=>rO(e)),i=cR(n),a=Object.values(t.configFor(DR(t,i)).actions).filter(e=>`slash`in e),o=a.find(e=>e.slash===r);if(o===void 0)throw new $(`${JSON.stringify(r)} is not a command this config declares (it declares: ${[...new Set(a.map(e=>e.slash))].join(`, `)||`none`})`);let s=nR(t.claudeInput,YR(t,i).tmux,o.slash);if(s.kind===`refused`)throw t.dlog(`warn`,`slash: ${r} refused — ${s.reason} (session=${i})`),new $(`${r} was not typed: ${s.reason}`);t.dlog(`info`,`slash: typed ${r} into ${s.pane} (session=${i})`)},rz=`config-override`,iz=new Map([[PD,fR],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=cR(uR(()=>decodeURIComponent(e.slice(0,n)))),i=uR(()=>decodeURIComponent(e.slice(n+1))).trim();if(i!==``){if(!i.startsWith(`/`))throw new $(`load-config: path must be absolute, got "${i}"`);if(!/\.(json5?|json)$/.test(i))throw new $(`load-config: path must end with .json5 or .json, got "${i}"`)}i===``?(t.sessionState.clear(r,rz),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,rz,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[FD,pR],[MD,_R],[ND,bR],[zD,MR],[BD,NR],[WD,zR],[VD,PR],[HD,LR],[UD,RR],[GD,HR],[KD,UR],[qD,KR],[JD,WR],[YD,GR],[LD,mR],[RD,hR],[ID,gR],[XD,qR],[ZD,QR],[QD,ez],[$D,$R],[eO,tz],[tO,nz]]),az=new Set([MD,ND,zD,BD,WD,VD,HD,UD,GD,KD,qD,JD,YD,ID,XD,ZD,QD,eO,tO]),oz=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of sO(aO(e))){if(!i&&az.has(a)){let e=rO(o);e.length>0&&e[0]&&(i=e[0])}let e=iz.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof $||(r=!0),n.push(`${a}: ${e instanceof Error?e.message:String(e)}`)}}if(n.length>0){i&&t.sessionState.set(i,`click.error`,n.join(`
207
+ `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function sz(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const cz=new Map([...iz,[jD,oz]].map(([e,t])=>[e,sz(t)]));Object.freeze([...cz.keys()]);const lz=new Set([`hook_event_name`,`session_id`,`session_name`,`transcript_path`,`cwd`,`model`,`workspace`,`version`,`output_style`,`cost`,`context_window`,`exceeds_200k_tokens`,`effort`,`thinking`,`rate_limits`,`vim`,`agent`,`worktree`]),uz=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]],dz=[[`workspace.added_dirs`,`string-list`]];function fz(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of uz){let i=hz(n,e);if(i==null)t.missingRequired.push(e);else{let n=pz(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of dz){let i=hz(n,e),a=i===void 0?r:mz(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))lz.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function pz(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function mz(e){return Array.isArray(e)&&e.every(e=>pz(e)===`string`)?`string-list`:pz(e)}function hz(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=n[e]}return n}function gz(e,t){switch(e){case`vars`:return{what:e,vars:_z(t)};case`segments`:return{what:e,segments:Sz(t)};case`config`:return{what:e,config:Ez(t)}}}function _z(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=bz(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...vz(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:yz(r.lastUpdatedMs())})}return o}function vz(e){if(e.kind!==`document`)try{return{type:e.type,value:e.read()}}catch(t){return{type:e.type,value:t instanceof Error?t.message:String(t)}}let t=e.read();switch(t.kind){case`ok`:return{type:`document`,value:JSON.stringify(t.value)};case`absent`:return{type:`document`,value:`(not yet scanned)`};case`failed`:return{type:`document`,value:t.reason}}}function yz(e){return e===null?null:Math.max(0,Date.now()-e)}function bz(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,xz(r));for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,xz(i));return t}function xz(e){return e.kind}function Sz(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=wz(n),o=Cz(n),s=[];for(let e of a){let t=n.segments[e];t&&s.push({name:e,description:t.description??null,template:t.template,referencedVars:Tz(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function Cz(e){let t=new Map;for(let n of j_(e.presets))for(let r of Ps(P_(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=As(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function wz(e){let t=[],n=new Set;for(let r of Ps(Lc(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function Tz(e,t,n){let r=new Set;for(let i of xv(e,t).keys()){if(n.has(i)){r.add(i);continue}let e=i.split(`.`);for(;e.length>1;){e.pop();let t=e.join(`.`);if(n.has(t)){r.add(t);break}}}return Array.from(r).sort()}function Ez(e){return e===null?null:e.config}const Dz=[`vars`,`segments`,`config`];function Oz(e){return typeof e==`string`&&Dz.includes(e)}function kz(e){return Math.max(1,e-2)}var Az=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return c.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const jz=new QF,Mz=new VL;De(jz.launchStats);const Nz=new ob({counters:jz,logger:Z}),Pz=KN({watchers:Nz,logger:Z}),{gitProvider:Fz,usageStore:Iz,mementoProvider:Lz}=Pz,Rz=new nI,zz=new eL(Rz,Z),Bz=new CL,Vz=new Az(Ye()),Hz=new XF({gitService:Fz,sessionState:Rz,watchers:Nz},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} file=${e.configFilePath??`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),Uz=60*1e3;function Wz(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(T(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),oB(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,Uz),a.unref())},checkNow:o}}const Gz=Wz(),Kz=kM({entryUrl:import.meta.url,intervalMs:Uz,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>Gz.checkNow(),log:Z});let qz=null,Jz=null,Yz=0;function Xz(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),oB(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),oB(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),oB(0)});try{Yz=rD(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),oB(1);return}qz=rk(t.pid);let e=pk(hk(qz));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),oB(1);return}Jz=e.registryPath,r.mkdirSync(Ie(),{recursive:!0}),Be(Le()),Rz.useStorage(new iI(Ue(),500,Z)),zz.useStorage(xL(We(),Z)),ok({anchor:ak(t.env),isAlive:sk,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),oB(0)}}),Zz(b.createServer({allowHalfOpen:!1},e=>{sB(e)}),Le(),!1)}function Zz(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),oB(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}Qz(e,n)}),e.listen(n,()=>$z(n))}function Qz(e,n){let i=qO(JO(Ve(n)),(e,t)=>nk(e,t,{readStartTime:tk,pidAlive:sk}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),oB(1);return}}Zz(e,n,!0)}function $z(e){let n=ZO(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),oB(0);return}rB(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(ne.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(Yz/1048576)}MB`),bD();let i=Vz.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),Gz.arm(),Kz.arm(),nB(),eB(e,n.identity)}function eB(e,n){ek({bound:n,myPid:t.pid,readIdentity:()=>ZO(e),readLease:()=>JO(Ve(e)),shutdown:e=>oB(e),log:Z}).arm()}let tB=null;function nB(){tB=sD(dD(jz.startedAt.getTime(),e=>oB(e),{rssLimitBytes:Yz})),tB.arm()}function rB(e){let n=YO(Ve(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:qz});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let iB=0,aB=!1;function oB(e){if(!aB){aB=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{Fz.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{Iz.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{Nz.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{Rz.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}XO(He(),t.pid),Jz!==null&&mk(Jz,t.pid,dk,e=>r.unlinkSync(e)),t.exit(e)}}function sB(e){iB++,jz.inFlight=iB;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>oB(r);try{e.end(ME(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{jz.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=NE(e=>{lB(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),iB=Math.max(0,iB-1),jz.inFlight=iB})}const cB=e=>({resp:e,exitAfterFlush:null});async function lB(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return cB({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale — staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return cB({ok:!0,stats:jz.snapshot({gitCache:Fz.getStats(),usageCache:Iz.getStats(),renderCacheSize:Hz.size,watchersActive:Nz.size(),nextRestartReason:tB?.describeNextRestart()??null,handlerProbes:Mz.list()})});if(e.kind===`render`){jz.requestsTotal++;let t=Date.now();try{let{report:n}=fz(e.hookData);for(let e of n.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let r=[];for(let e of n.missingRequired)r.push(`missing required field '${e}'`);for(let{path:e,expected:t,got:i}of n.typeMismatches)r.push(`field '${e}' expected ${t}, got ${i}`);if(e.cwd===``&&r.push(`request 'cwd' is empty`),r.length>0)return jz.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),cB({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=uB(e.args),s=e.hookData.session_id,c=SE(e),l=JSON.stringify(c);Rz.get(s,`client-hints`)!==l&&Rz.set(s,JR,l);let u=Rz.get(s,`config-override`)??a??c.configEnv,d=Hz.getOrCreate(i,e.cwd,u),f=TR({projectDir:i,cwd:e.cwd,configFile:u??null});Rz.get(s,`render-origin`)!==f&&Rz.set(s,wR,f);let p=c.termCols,m=kz(p??120),h=Mk(c.termRows),{authoredRoots:g}=d.state,_=t=>Rz.get(e.hookData.session_id,t),v=aj(d.state.config,_,e=>g.has(e)),y=await Sj(e.hookData,{...hB,navigation:e=>Bz.depth(e,Rz,sM(d.state.config))},e.cwd,d.state.neededInputPaths(v.preset),v,c,{...Jj(d.state.config,d.state.fileHeldSettings,_),configPath:d.configFilePath}),b=[],x=oj(v,m),S=AF(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},sj(v)),C=Rz.get(e.hookData.session_id,`click.error`);C&&Rz.clear(e.hookData.session_id,`click.error`);let w=[o,d.lastError,C].filter(Boolean).join(`
208
+ `),ee=Kz.notice({sessionId:s,dismissed:Rz.get(s,pM),enabled:v.updateNotice}),te=d.lastError===null?null:d.configFilePath,ne=Lk(w,ee,[d.lastWarning??``,...b].filter(Boolean).join(`
209
+ `)),re=Vz.sync(s,ne===null?null:zk(ne));re!==null&&Z(`warn`,`diagnostic dump failed: ${re}`);let ie=Bk(S,ne,{fullText:re===null?{kind:`file`,path:Vz.pathFor(s)}:{kind:`unavailable`,reason:re},failedConfigFile:te},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=Fz.getStats(),ae=Iz.getStats();return Z(`info`,`render sid=${e.hookData.session_id??`?`} took=${T}ms termCols=${p??`?`} termRows=${c.termRows??`?`} width=${m} git=${E.size}/${E.hits}h/${E.misses}m usage=${ae.size}/${ae.hits}h/${ae.misses}m err=${w?`Y`:`N`} upd=${ee.length} warn=${d.lastWarning?`Y`:`N`}`),cB({ok:!0,output:ie+`
210
+ `})}catch(e){throw jz.requestsErrored++,e}}if(e.kind===`click`)return cB(gB(e.verb,e.value,AE(e.clientVersion)));if(e.kind===`debug`){if(!Oz(e.what))return cB({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${Dz.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=Hz.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?mB(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):pB};return cB({ok:!0,debug:gz(e.what,n)})}return cB({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function uB(e){let{values:t,tokens:n}=v({args:e.slice(1),options:{config:{type:`string`}},strict:!1,tokens:!0,allowPositionals:!0}),r=[...new Set((n??[]).filter(e=>e.kind===`option`&&e.name!==`config`).map(e=>`--${e.name}`))];return{configFile:TE(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const dB={sessionState:Rz,dlog:Z,applyUpdate:()=>Kz.act(),doctor:TL(e=>{let t=[e.projectDir,e.cwd,e.configFile??void 0];Hz.reload(...t);let n=Hz.getOrCreate(...t);return{path:n.configFilePath,error:n.lastError,warning:n.lastWarning,unused:n.state.unused}}),probes:Mz,memento:Lz,claudeInput:sR(),history:zz,navigation:Bz,configFor:e=>Hz.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>Hz.reload(e.projectDir,e.cwd,e.configFile??void 0)};dB.reloadConfig;const fB={endcaps:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:_o,width:1/0},pB=new Map;function mB(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,jk(a,{...fB,charset:t,colorCompatibility:n}));return r}const hB={...Pz,clock:()=>new Date,history:e=>zz.depth(e)};function gB(e,t,n){let r=cz.get(e);if(!r)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return r(t,{...dB,clientVersion:n}),{ok:!0,output:``}}catch(e){let t=e instanceof $?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const _B={connectMs:200,budgetMs:500};async function vB(e,n){let r=n.includes(`--json`),i=await yB(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${VE(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
211
+ `);return}t.stdout.write(bB(i.value))}function yB(e){return FE({kind:`debug`,what:e},_B,e=>`debug`in e?e.debug:void 0)}function bB(e){switch(e.what){case`vars`:return xB(e.vars);case`segments`:return SB(e.segments);case`config`:return CB(e.config);default:return e}}function xB(e){if(e.length===0)return`no variables (DSL not active)
212
+ `;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`—`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${TB(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${wB(a.value)}${e}${o}`)}return t.join(`
213
213
  `)+`
214
- `}function tB(e){if(e.length===0)return`no segments (DSL not active)
214
+ `}function SB(e){if(e.length===0)return`no segments (DSL not active)
215
215
  `;let t=[`segments (${e.length})`,``];for(let n of e){t.push(` ${n.name}`),n.description!==null&&t.push(` shows ${n.description}`),t.push(` template ${n.template}`),n.referencedVars.length>0&&t.push(` vars ${n.referencedVars.join(`, `)}`);for(let{id:e,lastRender:r}of n.placements)r!==null&&t.push(` last ${e}: ${r}`)}return t.join(`
216
216
  `)+`
217
- `}function nB(e){return e===null?`config: DSL not active
217
+ `}function CB(e){return e===null?`config: DSL not active
218
218
  `:JSON.stringify(e,null,2)+`
219
- `}function rB(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function iB(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function aB(){let e=sB();return e===null?null:r.readFileSync(e,`utf-8`)}function oB(){let e;try{e=aB()}catch(e){t.stderr.write(`schema: cannot read bundled schema: ${e instanceof Error?e.message:String(e)}\n`),t.exit(2)}e===null&&(t.stderr.write("schema: bundled schema not found (expected schema/cc-candybar.schema.json). Run `pnpm gen:schema` from a source checkout.\n"),t.exit(2)),t.stdout.write(e),t.exit(0)}function sB(){let e=c.join(`schema`,`cc-candybar.schema.json`),n=t.argv[1];if(n===void 0)return null;let i=c.dirname(c.resolve(n));for(;;){let t=c.join(i,e);if(r.existsSync(t))return t;let n=c.dirname(i);if(n===i)return null;i=n}}function cB(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const lB=5e3;function uB(e,t){let n=`/home/tester`,r=Math.floor(Date.now()/1e3),i=`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,a={current_dir:`${n}/code/cc-candybar/src`,project_dir:`${n}/code/cc-candybar`,added_dirs:[]};return{hook_event_name:`Status`,session_id:i,version:`1.15.0`,home:n,cwd:`${n}/code/cc-candybar/src`,transcript_path:`${n}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:a,git:{repoName:`cc-candybar`,repoUrl:`https://github.com/promptctl/cc-candybar`,branch:`main`,sha:`abc1234`,ahead:2,behind:1,staged:3,unstaged:2,untracked:1,conflicts:0,upstream:`origin/main`,stash:1,status:`dirty`,operation:`rebase`,timeSinceCommit:780},session:{cost:.39,tokens:241400},today:{cost:12.5,tokens:34e5},context:{totalTokens:48487,contextLeft:24},metrics:{lastResponseTime:8.2,responseTime:4.2,sessionDuration:930,messageCount:8,linesAdded:512,linesRemoved:88},block:{nativeUtilization:63,resetsAt:r+2*3600},weekly:{percentage:21,resetsAt:r+5*86400},cache:{expiresAt:r+900},tmux:{pane:`%0`,session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:TS(4e5,1e6),...cj(e),history:{undo:1,redo:1,sinceEdit:1},navigation:{back:1},unsaved:1,resettable:Gb(()=>!0),resumeCommand:ij(a,i,void 0),configPath:t??`${n}/.config/cc-candybar/config.json5`}}function dB(e,t){let n=oE(e,e),r=cE(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function fB(e,n=t.cwd()){let i=[],a=e===void 0?dB(n,i):c.resolve(rE(e));if(e!==void 0&&a!==null){let e;try{e=r.statSync(a,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:a,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:a,message:`not a file`}}let o=dE(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await hB(a,n,i)}}catch(e){let t=e;return a!==null&&typeof t==`object`&&t&&typeof t.code==`string`&&t.path===a&&typeof t.message==`string`?{kind:`unreadable`,path:a,message:t.message}:(e instanceof Cs&&i.push(...e.warnings),{kind:`fatal`,configPath:a,message:e instanceof Cs||e instanceof Error?e.message:String(e),warnings:i})}}async function pB(e,t,n){let r=fE(e,AA);n.push(...r.warnings);let i=hE(r,e??`<default>`),a=new xF,o=new Ib(a,i.globals.default_empty_value??``,void 0,new FF);try{let r=iF(i,o,{cwd:t});n.push(...r.loadWarnings);let s=await o.settled(lB);return s.length>0&&n.push(`source${s.length===1?``:`s`} still running after ${lB} ms, rendered with fallback values: ${s.join(`, `)}`),{configPath:e,config:i,compiled:r,store:a,registry:o}}catch(e){throw o.dispose(),e}}function mB({configPath:e,config:t,compiled:n,store:r,registry:i},a,o){let s=new Map;return{rendered:lF(t,n,r,i,uB(a,e),oj(a,o),{onSegmentError:(e,t)=>s.set(`segment "${e}"`,t),onRenderWarning:e=>s.set(`theme rule`,e)},sj(a)),failures:s}}async function hB(e,t,n){let r=await pB(e,t,n),{config:i}=r;try{let e=OM();try{sM(i),mA(i)}finally{e()}let t=M_(null,i.globals.preset,i.presets),n=(e,t)=>{let n=aj(i,t=>t===`preset`?e:null,()=>t),a;try{a=mB(r,n,200)}catch(e){a={failures:new Map([[`render`,e instanceof Error?e.message:String(e)]])}}return{preset:e,customized:t,...a}},a=n(t,!1),o=[a,n(t,!0),...j_(i.presets).filter(e=>e!==t).flatMap(e=>[n(e,!1),n(e,!0)])],s=new Map;for(let{preset:e,customized:t,failures:n}of o)for(let[r,i]of n){let n=`${r}: ${i}`,a=s.get(n)??new Map;a.set(e,(a.get(e)??new Set).add(t)),s.set(n,a)}let c=[...s].map(([e,n])=>n.get(t)?.has(!1)?e:`${e} (under ${[...n].map(([e,n])=>[...e===t?[]:[`preset "${e}"`],...n.has(!1)?[]:[`.preset.customized = true`]].join(`, `)).join(`; `)})`),l=a.rendered;if(c.length>0||l===void 0)throw Error(`config renders with ${c.length} render error${c.length===1?``:`s`} (the daemon would show them on the bar):\n`+c.map(e=>` ${e}`).join(`
220
- `));return l}finally{r.registry.dispose()}}function gB(e){return e.map(e=>`warning: ${e}\n`).join(``)}function _B(e,t=!1){switch(e.kind){case`clean`:return{stdout:`✓ ${e.configPath??`bundled default (no config file found)`}: config OK${e.warnings.length>0?` (${e.warnings.length} warning${e.warnings.length===1?``:`s`})`:``}\n`+(t?`${e.rendered}\n`:``),stderr:gB(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:gB(e.warnings)+`✗ ${e.configPath??`<default>`}\n${e.message}\n`,code:1};case`unreadable`:return{stdout:``,stderr:`check: cannot read ${e.path}: ${e.message}\n`,code:2}}}const vB=`--render`,yB=`Usage: cc-candybar check [${vB}] [config-file]\n`;function bB(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==vB);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${yB}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${yB}`}:{kind:`run`,target:n[0],render:t.includes(vB)}}async function xB(e){let n=bB(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:_B(await fB(n.target??cB(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const SB=`${bk}${yk}`;function CB(e){return`${SB}⚠ cc-candybar: ${wB(e)}\n`}function wB(e){switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`protocol mismatch (client v${e.clientV} ≠ daemon ${t})`}case`bad_request`:return`daemon rejected request: ${vk(e.message,60)}`;case`render_failed`:return`render failed: ${vk(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${vk(e.message,60)}`}}function TB(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
221
- `,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:CB(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function EB(e,t){if(e!==void 0&&/^\+?\d+$/.test(e)){let t=Number(e);if(t>0&&t<=4294967295)return t}if(t&&t>0)return t}const DB=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`];function OB(e,t,n){return{termCols:EB(e.COLUMNS,n.columns),termRows:EB(e.LINES,n.rows),ssh:DB.some(t=>(e[t]??``)!==``),tmux:Bx(e),configEnv:cB(e),claudeConfigDir:mS(e,t),mementoEnv:Qe(e,t)}}const kB=` (fix: click the settings menu (${qc} by default) › 🧰 tools › 🩺 doctor, then [fix] on the bar)`;function AB({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:kB}\n`+(t.more??[]).map(e=>` ${e}\n`).join(``)}function jB(e){let t=OF(e.projectDir,e.cwd,e.configFile??void 0,{sessionState:new FF});return t.state?.registry.dispose(),{path:t.resolvedPath,error:t.error,warning:t.warning,unused:t.state?.unused??[]}}async function MB(e,t,n,r,i=void 0){let a;try{a={...lL(e,{tmux:Bx(n),claudeConfigDir:mS(n,r)},{projectDir:r,cwd:r,configFile:TE(i??cB(n))??null}),urlHandler:await TL(t)}}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let o=Yx(a);return{stdout:o.map(AB).join(``),stderr:``,code:+!o.every(e=>e.verdict.ok)}}async function NB(e){(e.length>1||e[0]===``||e[0]?.startsWith(`--`))&&(t.stderr.write(`doctor: expected at most one config file
219
+ `}function wB(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function TB(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function EB(){let e=OB();return e===null?null:r.readFileSync(e,`utf-8`)}function DB(){let e;try{e=EB()}catch(e){t.stderr.write(`schema: cannot read bundled schema: ${e instanceof Error?e.message:String(e)}\n`),t.exit(2)}e===null&&(t.stderr.write("schema: bundled schema not found (expected schema/cc-candybar.schema.json). Run `pnpm gen:schema` from a source checkout.\n"),t.exit(2)),t.stdout.write(e),t.exit(0)}function OB(){let e=c.join(`schema`,`cc-candybar.schema.json`),n=t.argv[1];if(n===void 0)return null;let i=c.dirname(c.resolve(n));for(;;){let t=c.join(i,e);if(r.existsSync(t))return t;let n=c.dirname(i);if(n===i)return null;i=n}}function kB(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const AB=5e3;function jB(e,t){let n=`/home/tester`,r=Math.floor(Date.now()/1e3),i=`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,a={current_dir:`${n}/code/cc-candybar/src`,project_dir:`${n}/code/cc-candybar`,added_dirs:[]};return{hook_event_name:`Status`,session_id:i,version:`1.15.0`,home:n,cwd:`${n}/code/cc-candybar/src`,transcript_path:`${n}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:a,git:{repoName:`cc-candybar`,repoUrl:`https://github.com/promptctl/cc-candybar`,branch:`main`,sha:`abc1234`,ahead:2,behind:1,staged:3,unstaged:2,untracked:1,conflicts:0,upstream:`origin/main`,stash:1,status:`dirty`,operation:`rebase`,timeSinceCommit:780},session:{cost:.39,tokens:241400},today:{cost:12.5,tokens:34e5},context:{totalTokens:48487,contextLeft:24},metrics:{lastResponseTime:8.2,responseTime:4.2,sessionDuration:930,messageCount:8,linesAdded:512,linesRemoved:88},block:{nativeUtilization:63,resetsAt:r+2*3600},weekly:{percentage:21,resetsAt:r+5*86400},cache:{expiresAt:r+900},tmux:{pane:`%0`,session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:TS(4e5,1e6),...cj(e),history:{undo:1,redo:1,sinceEdit:1},navigation:{back:1},unsaved:1,resettable:Gb(()=>!0),resumeCommand:ij(a,i,void 0),configPath:t??`${n}/.config/cc-candybar/config.json5`}}function MB(e,t){let n=oE(e,e),r=cE(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function NB(e,n=t.cwd()){let i=[],a=e===void 0?MB(n,i):c.resolve(rE(e));if(e!==void 0&&a!==null){let e;try{e=r.statSync(a,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:a,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:a,message:`not a file`}}let o=dE(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await IB(a,n,i)}}catch(e){let t=e;return a!==null&&typeof t==`object`&&t&&typeof t.code==`string`&&t.path===a&&typeof t.message==`string`?{kind:`unreadable`,path:a,message:t.message}:(e instanceof Cs&&i.push(...e.warnings),{kind:`fatal`,configPath:a,message:e instanceof Cs||e instanceof Error?e.message:String(e),warnings:i})}}async function PB(e,t,n){let r=fE(e,AA);n.push(...r.warnings);let i=hE(r,e??`<default>`),a=new HF,o=new Ib(a,i.globals.default_empty_value??``,void 0,new nI);try{let r=TF(i,o,{cwd:t});n.push(...r.loadWarnings);let s=await o.settled(AB);return s.length>0&&n.push(`source${s.length===1?``:`s`} still running after ${AB} ms, rendered with fallback values: ${s.join(`, `)}`),{configPath:e,config:i,compiled:r,store:a,registry:o}}catch(e){throw o.dispose(),e}}function FB({configPath:e,config:t,compiled:n,store:r,registry:i},a,o){let s=new Map;return{rendered:AF(t,n,r,i,jB(a,e),oj(a,o),{onSegmentError:(e,t)=>s.set(`segment "${e}"`,t),onRenderWarning:e=>s.set(`theme rule`,e)},sj(a)),failures:s}}async function IB(e,t,n){let r=await PB(e,t,n),{config:i}=r;try{let e=OM();try{sM(i),mA(i)}finally{e()}let t=M_(null,i.globals.preset,i.presets),n=(e,t)=>{let n=aj(i,t=>t===`preset`?e:null,()=>t),a;try{a=FB(r,n,200)}catch(e){a={failures:new Map([[`render`,e instanceof Error?e.message:String(e)]])}}return{preset:e,customized:t,...a}},a=n(t,!1),o=[a,n(t,!0),...j_(i.presets).filter(e=>e!==t).flatMap(e=>[n(e,!1),n(e,!0)])],s=new Map;for(let{preset:e,customized:t,failures:n}of o)for(let[r,i]of n){let n=`${r}: ${i}`,a=s.get(n)??new Map;a.set(e,(a.get(e)??new Set).add(t)),s.set(n,a)}let c=[...s].map(([e,n])=>n.get(t)?.has(!1)?e:`${e} (under ${[...n].map(([e,n])=>[...e===t?[]:[`preset "${e}"`],...n.has(!1)?[]:[`.preset.customized = true`]].join(`, `)).join(`; `)})`),l=a.rendered;if(c.length>0||l===void 0)throw Error(`config renders with ${c.length} render error${c.length===1?``:`s`} (the daemon would show them on the bar):\n`+c.map(e=>` ${e}`).join(`
220
+ `));return l}finally{r.registry.dispose()}}function LB(e){return e.map(e=>`warning: ${e}\n`).join(``)}function RB(e,t=!1){switch(e.kind){case`clean`:return{stdout:`✓ ${e.configPath??`bundled default (no config file found)`}: config OK${e.warnings.length>0?` (${e.warnings.length} warning${e.warnings.length===1?``:`s`})`:``}\n`+(t?`${e.rendered}\n`:``),stderr:LB(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:LB(e.warnings)+`✗ ${e.configPath??`<default>`}\n${e.message}\n`,code:1};case`unreadable`:return{stdout:``,stderr:`check: cannot read ${e.path}: ${e.message}\n`,code:2}}}const zB=`--render`,BB=`Usage: cc-candybar check [${zB}] [config-file]\n`;function VB(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==zB);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${BB}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${BB}`}:{kind:`run`,target:n[0],render:t.includes(zB)}}async function HB(e){let n=VB(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:RB(await NB(n.target??kB(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const UB=`${bk}${yk}`;function WB(e){return`${UB}⚠ cc-candybar: ${GB(e)}\n`}function GB(e){switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`protocol mismatch (client v${e.clientV} ≠ daemon ${t})`}case`bad_request`:return`daemon rejected request: ${vk(e.message,60)}`;case`render_failed`:return`render failed: ${vk(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${vk(e.message,60)}`}}function KB(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
221
+ `,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:WB(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function qB(e,t){if(e!==void 0&&/^\+?\d+$/.test(e)){let t=Number(e);if(t>0&&t<=4294967295)return t}if(t&&t>0)return t}const JB=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`];function YB(e,t,n){return{termCols:qB(e.COLUMNS,n.columns),termRows:qB(e.LINES,n.rows),ssh:JB.some(t=>(e[t]??``)!==``),tmux:Bx(e),configEnv:kB(e),claudeConfigDir:mS(e,t),mementoEnv:Qe(e,t)}}const XB=` (fix: click the settings menu (${qc} by default) › 🧰 tools › 🩺 doctor, then [fix] on the bar)`;function ZB({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:XB}\n`+(t.more??[]).map(e=>` ${e}\n`).join(``)}function QB(e){let t=YF(e.projectDir,e.cwd,e.configFile??void 0,{sessionState:new nI});return t.state?.registry.dispose(),{path:t.resolvedPath,error:t.error,warning:t.warning,unused:t.state?.unused??[]}}async function $B(e,t,n,r,i=void 0){let a;try{a={...AL(e,{tmux:Bx(n),claudeConfigDir:mS(n,r)},{projectDir:r,cwd:r,configFile:TE(i??kB(n))??null}),urlHandler:await KL(t)}}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let o=Yx(a);return{stdout:o.map(ZB).join(``),stderr:``,code:+!o.every(e=>e.verdict.ok)}}async function eV(e){(e.length>1||e[0]===``||e[0]?.startsWith(`--`))&&(t.stderr.write(`doctor: expected at most one config file
222
222
  Usage: cc-candybar doctor [config-file]
223
- `),t.exit(2));let n=t.cwd(),r=await MB(iL(jB),kL(),t.env,n,e[0]===void 0?void 0:c.resolve(n,rE(e[0])));t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const PB=e=>e.some(e=>t.argv.includes(e));function FB(){console.log(Lx)}async function IB(){try{PB(Fx.help)&&(FB(),t.exit(0)),PB(Fx.version)&&(console.log(`cc-candybar ${HE}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await GO(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(BO(),t.exit(0)),e===`url-handle`){await HO(t.argv[3]);return}if(e===`daemon`){kz();return}if(e===`daemon-stats`&&(await fL(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await xB(t.argv.slice(3));return}if(e===`schema`){oB();return}if(e===`doctor`){await NB(t.argv.slice(3));return}sz(e)&&(await Zz(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
223
+ `),t.exit(2));let n=t.cwd(),r=await $B(TL(QB),XL(),t.env,n,e[0]===void 0?void 0:c.resolve(n,rE(e[0])));t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const tV=e=>e.some(e=>t.argv.includes(e));function nV(){console.log(Lx)}async function rV(){try{tV(Fx.help)&&(nV(),t.exit(0)),tV(Fx.version)&&(console.log(`cc-candybar ${HE}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await GO(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(BO(),t.exit(0)),e===`url-handle`){await HO(t.argv[3]);return}if(e===`daemon`){Xz();return}if(e===`daemon-stats`&&(await NL(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await HB(t.argv.slice(3));return}if(e===`schema`){DB();return}if(e===`doctor`){await eV(t.argv.slice(3));return}Oz(e)&&(await vB(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
224
224
 
225
225
  cc-candybar is designed to be used as a Claude Code statusLine command.
226
226
  It reads hook data from stdin and outputs formatted statusline.
@@ -236,4 +236,4 @@ Add to ~/.claude/settings.json:
236
236
  Run with --help for more options.
237
237
 
238
238
  To test output manually:
239
- echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar`),t.exit(1)),O(`Working directory: ${t.cwd()}`),O(`Process args:`,t.argv);let r=await n(t.stdin);O(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),FB(),t.exit(1));let i=TB(await KE(r,t.argv,t.cwd(),OB(t.env,t.cwd(),t.stderr)));i.debug!==null&&O(i.debug),i.kick&&fD(),t.stdout.write(i.output),t.exit(0)}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`Error generating statusline:`,n),t.exit(1)}}IB();export{};
239
+ echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar`),t.exit(1)),O(`Working directory: ${t.cwd()}`),O(`Process args:`,t.argv);let r=await n(t.stdin);O(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),nV(),t.exit(1));let i=KB(await KE(r,t.argv,t.cwd(),YB(t.env,t.cwd(),t.stderr)));i.debug!==null&&O(i.debug),i.kick&&fD(),t.stdout.write(i.output),t.exit(0)}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`Error generating statusline:`,n),t.exit(1)}}rV();export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.116.1",
3
+ "version": "1.117.0",
4
4
  "description": "Statusline renderer for Claude Code — a JSON5-configurable DSL with daemon-cached data sources, byte-clean palette-aware composition, and OSC8 click verbs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -101,9 +101,9 @@
101
101
  "typescript": "^5.0.0"
102
102
  },
103
103
  "optionalDependencies": {
104
- "@promptctl/cc-candybar-darwin-arm64": "1.116.1",
105
- "@promptctl/cc-candybar-darwin-x64": "1.116.1",
106
- "@promptctl/cc-candybar-linux-x64": "1.116.1",
107
- "@promptctl/cc-candybar-linux-arm64": "1.116.1"
104
+ "@promptctl/cc-candybar-darwin-arm64": "1.117.0",
105
+ "@promptctl/cc-candybar-darwin-x64": "1.117.0",
106
+ "@promptctl/cc-candybar-linux-x64": "1.117.0",
107
+ "@promptctl/cc-candybar-linux-arm64": "1.117.0"
108
108
  }
109
109
  }
@@ -668,6 +668,9 @@
668
668
  "metrics": {
669
669
  "$ref": "#/definitions/SegmentDelta"
670
670
  },
671
+ "ticket": {
672
+ "$ref": "#/definitions/SegmentDelta"
673
+ },
671
674
  "activity": {
672
675
  "$ref": "#/definitions/SegmentDelta"
673
676
  }