@promptctl/cc-candybar 1.27.0 → 1.28.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/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import{createRequire as e}from"node:module";import t from"node:process";import{json as n}from"node:stream/consumers";import r,{createReadStream as i,existsSync as a,statSync as o,watch as s}from"node:fs";import c,{basename as l,dirname as u,join as d}from"node:path";import f,{homedir as p}from"node:os";import{spawn as m,spawnSync as h}from"node:child_process";import g from"node:net";import{URL as _,URLSearchParams as v,fileURLToPath as y}from"node:url";import{parseArgs as b}from"node:util";import{get as x}from"node:https";import{createHash as S}from"node:crypto";import{setTimeout as C}from"node:timers/promises";import{open as ee,readFile as te,readdir as w,stat as ne}from"node:fs/promises";import{createInterface as re}from"node:readline";import{clearInterval as ie,setInterval as T}from"node:timers";import E from"node:v8";var ae=Object.create,oe=Object.defineProperty,se=Object.getOwnPropertyDescriptor,ce=Object.getOwnPropertyNames,le=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty,de=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),fe=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ce(t),a=0,o=i.length,s;a<o;a++)s=i[a],!ue.call(e,s)&&s!==n&&oe(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=se(t,s))||r.enumerable});return e},pe=(e,t,n)=>(n=e==null?{}:ae(le(e)),fe(t||!e||!e.__esModule?oe(n,`default`,{value:e,enumerable:!0}):n,e));function D(e,...t){process.env.CC_CANDYBAR_DEBUG&&console.error(`[DEBUG] ${e}`,...t)}const me={"click.pbcopy":1e3,"click.open":1e3},he=new Map;function ge(e){let t=me[e];if(t===void 0)return{allowed:!0};let n=he.get(e);if(n===void 0)return{allowed:!0};let r=Date.now()-n;return r>=t?{allowed:!0}:{allowed:!1,minIntervalMs:t,sinceLastMs:r}}function _e(e){he.set(e,Date.now())}function O(e,t,n){return{ok:!1,reason:`rate-limited`,stdout:``,stderr:``,exitCode:null,signal:null,error:`rate-limited: ${e} min interval ${t}ms, last start ${n}ms ago`}}let ve=null;function ye(e){ve=e}async function be(e){let t=ge(e.category);if(!t.allowed)return O(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();return ve?.onStart(e.category),new Promise(t=>{let r;try{r=m(e.bin,e.args??[],{cwd:e.cwd,env:e.env,stdio:[`pipe`,`pipe`,`pipe`]})}catch(r){ve?.onEnd(e.category,Date.now()-n),t({ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:r instanceof Error?r.message:String(r)});return}let i=``,a=``,o=!1,s=null,c=null,l=!1,u=r=>{o||(o=!0,s&&clearTimeout(s),c&&clearTimeout(c),ve?.onEnd(e.category,Date.now()-n),t(r))};r.stdout?.on(`data`,e=>{i+=e.toString(`utf8`)}),r.stderr?.on(`data`,e=>{a+=e.toString(`utf8`)}),r.on(`error`,e=>{u({ok:!1,reason:`spawn-error`,stdout:i,stderr:a,exitCode:null,signal:null,error:e.message})}),r.on(`close`,(e,t)=>{if(l){u({ok:!1,reason:`timeout`,stdout:i,stderr:a,exitCode:e,signal:t});return}if(e===0){u({ok:!0,stdout:i,stderr:a,exitCode:e});return}u({ok:!1,reason:t?`signal`:`non-zero`,stdout:i,stderr:a,exitCode:e,signal:t})}),e.timeoutMs&&e.timeoutMs>0&&(s=setTimeout(()=>{l=!0,r.pid!==void 0&&(r.kill(`SIGTERM`),c=setTimeout(()=>{r.kill(`SIGKILL`)},250))},e.timeoutMs)),e.stdinInput!==void 0&&r.stdin?r.stdin.end(e.stdinInput):r.stdin&&r.stdin.end()})}function xe(e){let t=ge(e.category);if(!t.allowed)return O(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();ve?.onStart(e.category);let r=[`pipe`,`pipe`,`pipe`];try{let t=h(e.bin,e.args??[],{cwd:e.cwd,env:e.env,input:e.stdinInput,timeout:e.timeoutMs&&e.timeoutMs>0?e.timeoutMs:void 0,stdio:r,encoding:`utf8`});ve?.onEnd(e.category,Date.now()-n);let i=typeof t.stdout==`string`?t.stdout:``,a=typeof t.stderr==`string`?t.stderr:``;if(t.error)return{ok:!1,reason:t.error.code===`ETIMEDOUT`?`timeout`:`spawn-error`,stdout:i,stderr:a,exitCode:null,signal:t.signal??null,error:t.error.message};if(t.status===0)return{ok:!0,stdout:i,stderr:a,exitCode:t.status};let o=e.timeoutMs!==void 0&&e.timeoutMs>0;return{ok:!1,reason:t.signal?o&&t.signal===`SIGTERM`?`timeout`:`signal`:`non-zero`,stdout:i,stderr:a,exitCode:t.status,signal:t.signal??null}}catch(t){return ve?.onEnd(e.category,Date.now()-n),{ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:t instanceof Error?t.message:String(t)}}}function Se(e){let t=ge(e.category);if(!t.allowed)return O(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();ve?.onStart(e.category);let r=Ce(e);return ve?.onEnd(e.category,Date.now()-n),r}function Ce(e){let t;try{t=m(e.bin,e.args??[],{cwd:e.cwd,env:e.env,detached:!0,stdio:`ignore`})}catch(e){return{ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:e instanceof Error?e.message:String(e)}}return t.once(`error`,()=>{}),t.pid===void 0?{ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:`spawn(${e.bin}): no pid (binary not found or unexecutable)`}:(t.unref(),{ok:!0,stdout:``,stderr:``,exitCode:null})}function we(e){let t=process.env[e];return t&&t.length>0?t:void 0}function Te(){let e=we(`XDG_STATE_HOME`)??c.join(f.homedir(),`.local`,`state`);return c.join(e,`cc-candybar`)}function Ee(){let e=we(`XDG_CACHE_HOME`)??c.join(f.homedir(),`.cache`);return c.join(e,`cc-candybar`)}function De(){return Te()}function Oe(){let e=process.env.CC_CANDYBAR_SOCKET;if(e)return e;let t=f.userInfo().uid;return c.join(`/tmp`,`cc-candybar-${t}`,`socket`)}function ke(e){r.mkdirSync(e,{recursive:!0,mode:448});let t=r.lstatSync(e);if(t.isSymbolicLink())throw Error(`directory is a symlink: ${e}`);if(!t.isDirectory())throw Error(`not a directory: ${e}`);let n=f.userInfo().uid;if(typeof n==`number`&&t.uid!==n)throw Error(`directory is not owned by uid ${n}: ${e} (owner uid=${t.uid})`);if(t.mode&63)throw Error(`directory has unsafe permissions: ${e} (mode=${(t.mode&511).toString(8)}, expected 0700)`)}function Ae(e){ke(c.dirname(e));for(let t of[e,k(e)])try{if(r.lstatSync(t).isSymbolicLink())throw Error(`path is a symlink: ${t}`)}catch(e){if(e.code!==`ENOENT`)throw e}}function k(e){return`${e}.lease`}function je(){return k(Oe())}function Me(){return c.join(Te(),`session-state.json`)}function Ne(){return c.join(Te(),`config-overrides.json`)}function Pe(){let e=process.env.CC_CANDYBAR_DAEMON_REGISTRY_DIR;if(e)return e;let t=f.userInfo().uid;return c.join(`/tmp`,`cc-candybar-${t}`,`daemons`)}function Fe(){return c.join(Te(),`spawn.lock`)}function Ie(){return c.join(Te(),`spawn.cooldown`)}function Le(){return c.join(Te(),`spawn.backoff`)}function Re(){return c.join(Te(),`daemon.log`)}const ze=1e4;function Be(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>ze?ze:t}var Ve=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function He(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function Ue(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 Ve(`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 Ve(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function We(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=Ue(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(He(t))})}async function Ge(e,t,n){let r=null;try{r=await Xe(Oe(),t.connectMs);let i=await We(r,{v:3,...e},t.budgetMs);return Je(e.kind,i,n)}catch(e){return Ye(e)}finally{r&&r.destroy()}}function Ke(e,t){return typeof e==`string`?e:t}function qe(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function Je(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=Ke(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:qe(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 Ye(e){if(e instanceof Ve||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 Xe(e,t){return new Promise((n,r)=>{let i=g.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 Ze(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 Qe={connectMs:50,budgetMs:150},$e={connectMs:50,budgetMs:200};function et(e){let t=e.output;return typeof t==`string`?t:void 0}function tt(e,t,n,r){return Ge({kind:`render`,hookData:e,args:t,cwd:n,termCols:r},Qe,et)}function nt(e,t){return Ge({kind:`click`,verb:e,value:t},$e,et)}function rt(e={}){if(yt()!==null)return;let n=e.spawn??bt,r=gt();if(r.kind===`contended`){let e=at();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),it(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),it(n);return}try{it(n)}finally{vt()}}function it(e){ft()&&ot(e)}function at(){try{let e=r.statSync(Fe());return Date.now()-e.mtimeMs}catch{return null}}function ot(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
3
3
  `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function st(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function ct(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function lt(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 ut(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 dt(){try{r.unlinkSync(Le())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function ft(){let e=Ie(),n=Le(),r=lt(n),i=st(pt(e),ct(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`),mt(e),ut(n,Math.min(r+1,5)),!0)}function pt(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function mt(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 ht=null;function gt(){let e=Fe();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 ht={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(!_t(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 _t(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function vt(){if(!ht)return;let{fd:e,path:t}=ht;ht=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function yt(){try{return r.mkdirSync(De(),{recursive:!0}),null}catch(e){return`mkdir ${De()}: ${e.message}`}}function bt(){let e=t.execPath,n=t.argv[1];return n?Se({bin:e,args:[`--max-old-space-size=400`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const xt=`cc-candybar`,St=`dispatch`,Ct=`set-state`,wt=`step-state`,Tt=`copy`,Et=`open-vscode`,Dt=`show-config-error`,Ot=`show-config-warning`,kt=`set-config`,At=`step-config`,jt=`reset-config`;function Mt(e){return e.map(encodeURIComponent).join(`/`)}function Nt(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function Pt(e){return`${xt}://${St}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${Mt(e.args)}`)}`).join(`&`)}`}function Ft(e){return new v(e).getAll(`e`).map(A)}function A(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const It=`closed`;function j(e,t){return{kind:`state`,key:e,default:t}}function Lt(e,t){return{set:e,cycle:[It,t]}}const Rt=`@promptctl/cc-candybar`,zt=`CCCandybarURLHandler`,Bt=[],Vt={"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 Ht(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function Ut(e,t){return[e,...t].map(Ht).join(` `)}function Wt(){return c.join(f.homedir(),`Applications`,`${zt}.app`)}function Gt(){return c.join(f.homedir(),`.claude`,`settings.json`)}function Kt(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function qt(){if(process.platform===`darwin`)return c.join(f.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(f.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function Jt(){return c.join(qt(),`bin`,`cc-candybar`)}function Yt(){return c.join(qt(),`dist`,`index.mjs`)}function Xt(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(`
4
- `)}function Zt(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:c.resolve(c.dirname(e),`..`,`dist`,`index.mjs`)}function Qt(t){let n=Vt[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:c.resolve(c.dirname(t),`..`,`bin`,`cc-candybar`)}}function $t(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function en(e){let t=r.openSync(e,`r`);try{let n=Buffer.alloc(2),i=r.readSync(t,n,0,2,0);if(i<2)throw Error(`install: staged render entry at ${e} is truncated (${i} byte(s)). Re-run: pnpm dlx ${Rt}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function tn(){let e=Zt(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=Qt(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(Yt()),{recursive:!0}),r.mkdirSync(c.dirname(Jt()),{recursive:!0}),$t(e,Yt()),$t(t.sourcePath,Jt()),r.chmodSync(Jt(),493),r.rmSync(c.join(qt(),`url-handler.mjs`),{force:!0});let n=en(Jt());return process.stdout.write(`Staged cc-candybar v1.27.0 runtime at ${qt()}\n`+(n===`native`?` render entry: native binary (${process.platform}-${process.arch})\n`:` render entry: node shim (no native binary for ${process.platform}-${process.arch}; renders are correct but pay node startup)\n`)),{binPath:Jt(),distPath:Yt(),entryKind:n}}function nn(){return[{key:`CFBundleIdentifier`,xml:`<string>com.cccandybar.url-handler</string>`},{key:`CFBundleURLTypes`,xml:[`<array>`,` <dict>`,` <key>CFBundleURLName</key>`,` <string>Claude Powerline Click Action</string>`,` <key>CFBundleURLSchemes</key>`,` <array>`,` <string>${xt}</string>`,` </array>`,` </dict>`,`</array>`].join(`
4
+ `)}function Zt(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:c.resolve(c.dirname(e),`..`,`dist`,`index.mjs`)}function Qt(t){let n=Vt[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:c.resolve(c.dirname(t),`..`,`bin`,`cc-candybar`)}}function $t(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function en(e){let t=r.openSync(e,`r`);try{let n=Buffer.alloc(2),i=r.readSync(t,n,0,2,0);if(i<2)throw Error(`install: staged render entry at ${e} is truncated (${i} byte(s)). Re-run: pnpm dlx ${Rt}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function tn(){let e=Zt(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=Qt(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(Yt()),{recursive:!0}),r.mkdirSync(c.dirname(Jt()),{recursive:!0}),$t(e,Yt()),$t(t.sourcePath,Jt()),r.chmodSync(Jt(),493),r.rmSync(c.join(qt(),`url-handler.mjs`),{force:!0});let n=en(Jt());return process.stdout.write(`Staged cc-candybar v1.28.0 runtime at ${qt()}\n`+(n===`native`?` render entry: native binary (${process.platform}-${process.arch})\n`:` render entry: node shim (no native binary for ${process.platform}-${process.arch}; renders are correct but pay node startup)\n`)),{binPath:Jt(),distPath:Yt(),entryKind:n}}function nn(){return[{key:`CFBundleIdentifier`,xml:`<string>com.cccandybar.url-handler</string>`},{key:`CFBundleURLTypes`,xml:[`<array>`,` <dict>`,` <key>CFBundleURLName</key>`,` <string>Claude Powerline Click Action</string>`,` <key>CFBundleURLSchemes</key>`,` <array>`,` <string>${xt}</string>`,` </array>`,` </dict>`,`</array>`].join(`
5
5
  `)}]}function rn(e){let t=Wt();r.mkdirSync(c.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=xe({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,Xt(process.execPath,e)],category:`install.osacompile`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`osacompile failed (${n.reason})`);let i=c.join(t,`Contents`,`Info.plist`);for(let{key:e}of nn())xe({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of nn()){let n=xe({bin:`/usr/bin/plutil`,args:[`-insert`,e,`-xml`,t,i],category:`install.plutil`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`plutil -insert ${e} failed (${n.reason})`)}process.stdout.write(`Registering ${xt}:// with Launch Services\n`);let a=xe({bin:`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister`,args:[`-f`,t],category:`install.lsregister`});if(!a.ok)throw process.stderr.write(a.stderr),Error(`lsregister failed (${a.reason})`);process.stdout.write(`✓ ${zt}.app installed and registered.\n`),process.stdout.write(` Test: open '${xt}://hello-world' && pbpaste\n`)}function M(){Kt(),rn(tn().distPath)}function an(e,t=xt){let n=`${t}://`;if(!e.startsWith(n))throw Error(`expected ${n} scheme, got: ${e}`);let r=e.slice(n.length),i=r.indexOf(`/`);return i===-1?{verb:Tt,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function on(e){e||(process.stderr.write(`url-handle: missing URL argument.
6
6
  `),process.exit(1));let t;try{t=an(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await nt(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(rt(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(sn(n)+`
7
7
  `),process.exit(1)}function sn(e){switch(e.cause){case`version_mismatch`:return`url-handle: daemon rejected click (version mismatch: client v${e.clientV} ≠ daemon v${e.daemonV})`;case`bad_request`:return`url-handle: daemon rejected click (bad request: ${e.message})`;case`render_failed`:return`url-handle: daemon rejected click (handler failed: ${e.message})`;case`malformed_response`:return`url-handle: daemon rejected click (malformed response: ${e.message})`}}function cn(){return`✓ install complete.
@@ -97,39 +97,39 @@ Use 'override' annotation for methods overridden by subclass.`)}}var ta=oa(0),na
97
97
  `).map(e=>n+e).join(`
98
98
  `)}function xh(e){return e.split(/\s+/).filter(e=>e.length>0).map(e=>(e[0]??``).toUpperCase()).join(``)}function Sh(e,t){let n=[];for(let e of t){if(typeof e==`object`&&e)throw fm(`join`,2,`list of strings/primitives`,`list element of type ${Ch(e)}`);n.push(String(e))}return n.join(e)}function Ch(e){return Array.isArray(e)?`array`:e instanceof Map?`Map`:e instanceof Set?`Set`:`object`}function wh(e){return ph(e,`-`)}function Th(e){return e.toLowerCase()}function Eh(e,t){return`\n${bh(e,t)}`}function Dh(e){return e.replace(/\s+/g,``)}function Oh(e,t,n){return n===1?e:t}function kh(...e){return e.map(e=>`"${e}"`).join(` `)}function Ah(e){return e.replace(/[\\.+*?()|[\]{}^$]/g,`\\$&`)}function jh(e,t){return t.repeat(Math.max(0,e))}function Mh(e,t,n){return n.split(e).join(t)}function Nh(e){return ph(e,`_`)}function Ph(e,t){let n=t.split(e),r={};for(let e=0;e<n.length;e++)r[`_${e}`]=n[e];return r}function Fh(e,t){return t.split(e)}function Ih(e,t,n){let r=Lh(n,e,t),i={};for(let e=0;e<r.length;e++)i[`_${e}`]=r[e]??``;return i}function Lh(e,t,n){if(n===0)return[];let r=t===``?Array.from(e):e.split(t);if(n<0||r.length<=n)return r;let i=r.slice(0,n-1),a=r.slice(n-1).join(t);return[...i,a]}function Rh(...e){return e.map(e=>`'${e}'`).join(` `)}function zh(e,t,n){let r=t<0||t>n.length?n.length:t,i=Math.min(Math.max(0,e),r);return n.slice(i,r)}function Bh(e){let t=``;for(let n of e)Vh(n)?t+=n.toLowerCase():Hh(n)?t+=n.toUpperCase():t+=n;return t}function Vh(e){return e!==e.toLowerCase()&&e===e.toUpperCase()}function Hh(e){return e!==e.toUpperCase()&&e===e.toLowerCase()}function Uh(e){return e.replace(/\b([a-zA-Z])/g,e=>e.toUpperCase())}function Wh(e){return e.trim()}function Gh(e,t){if(e.length===0)return t;let n=new Set([...e]),r=0;for(;r<t.length&&n.has(t[r]);)r+=1;let i=t.length;for(;i>r&&n.has(t[i-1]);)--i;return t.slice(r,i)}function Kh(e,t){return t.startsWith(e)?t.slice(e.length):t}function qh(e,t){return t.endsWith(e)?t.slice(0,t.length-e.length):t}function Jh(e,t){if(e<0){let n=-e;return n>=t.length?t:t.slice(t.length-n)}return e>=t.length?t:t.slice(0,e)}function Yh(e){return e.replace(/\b([A-Z])/g,e=>e.toLowerCase())}function Xh(e){return e.toUpperCase()}function Zh(e,t){return Qh(e,`
99
99
  `,t)}function Qh(e,t,n){if(e<=0)return n;let r=[];for(let t of n.split(`
100
- `)){let n=``;for(let i of t.split(/\s+/))i.length!==0&&(n.length===0?n=i:n.length+1+i.length<=e?n+=` ${i}`:(r.push(n),n=i));n.length>0&&r.push(n)}return r.join(t)}function $h(e,t,n){return Qh(e,t,n)}function eg(){return{abbrev:{fn:(e,t)=>$m(e,t),argTypes:[`int`,`string`]},abbrevboth:{fn:(e,t,n)=>eh(e,t,n),argTypes:[`int`,`int`,`string`]},camelcase:{fn:e=>hh(e),argTypes:[`string`],returnType:`string`},cat:{fn:(...e)=>gh(...e),argTypes:[`string`]},contains:{fn:(e,t)=>_h(e,t),argTypes:[`string`,`string`]},hasPrefix:{fn:(e,t)=>vh(e,t),argTypes:[`string`,`string`]},hasSuffix:{fn:(e,t)=>yh(e,t),argTypes:[`string`,`string`]},indent:{fn:(e,t)=>bh(e,t),argTypes:[`int`,`string`]},initials:{fn:e=>xh(e),argTypes:[`string`]},join:{fn:(e,t)=>Sh(e,t),argTypes:[`string`,`list`]},kebabcase:{fn:e=>wh(e),argTypes:[`string`],returnType:`string`},lower:{fn:e=>Th(e),argTypes:[`string`]},nindent:{fn:(e,t)=>Eh(e,t),argTypes:[`int`,`string`]},nospace:{fn:e=>Dh(e),argTypes:[`string`],returnType:`string`},plural:{fn:(e,t,n)=>Oh(e,t,n),argTypes:[`string`,`string`,`int`],returnType:`string`},quote:{fn:(...e)=>kh(...e),argTypes:[`string`]},regexQuoteMeta:{fn:e=>Ah(e),argTypes:[`string`],returnType:`string`},repeat:{fn:(e,t)=>jh(e,t),argTypes:[`int`,`string`]},replace:{fn:(e,t,n)=>Mh(e,t,n),argTypes:[`string`,`string`,`string`]},snakecase:{fn:e=>Nh(e),argTypes:[`string`],returnType:`string`},split:{fn:(e,t)=>Ph(e,t),argTypes:[`string`,`string`]},splitList:{fn:(e,t)=>Fh(e,t),argTypes:[`string`,`string`]},splitn:{fn:(e,t,n)=>Ih(e,t,n),argTypes:[`string`,`int`,`string`],returnType:`dict`},squote:{fn:(...e)=>Rh(...e),argTypes:[`string`]},substr:{fn:(e,t,n)=>zh(e,t,n),argTypes:[`int`,`int`,`string`]},swapcase:{fn:e=>Bh(e),argTypes:[`string`],returnType:`string`},title:{fn:e=>Uh(e),argTypes:[`string`]},trim:{fn:e=>Wh(e),argTypes:[`string`]},trimAll:{fn:(e,t)=>Gh(e,t),argTypes:[`string`,`string`]},trimPrefix:{fn:(e,t)=>Kh(e,t),argTypes:[`string`,`string`]},trimSuffix:{fn:(e,t)=>qh(e,t),argTypes:[`string`,`string`]},trunc:{fn:(e,t)=>Jh(e,t),argTypes:[`int`,`string`]},untitle:{fn:e=>Yh(e),argTypes:[`string`]},upper:{fn:e=>Xh(e),argTypes:[`string`]},wrap:{fn:(e,t)=>Zh(e,t),argTypes:[`int`,`string`]},wrapWith:{fn:(e,t,n)=>$h(e,t,n),argTypes:[`int`,`string`,`string`]}}}const tg=`menus.`;function ng(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}function rg(e){return e}function ig(e,t,n){return n===void 0?tg+ng(e)+`.`+ng(t):tg+ng(n)}function ag(e,t){return e+`.`+t}function og(e){return e+`.page`}function sg(e){for(let t of Object.keys(e))if(t!==`closeOnPick`&&t!==`paged`&&t!==`key`)throw Error(`unknown {{ menu }} option "${t}" — the options dict takes "closeOnPick" (bool, default false), "paged" (bool, default true), "key" (string, accordion grouping)`);let t=(t,n)=>{let r=e[t];if(r===void 0)return n;if(typeof r!=`boolean`)throw Error(`{{ menu }} option "${t}" must be a boolean, got ${JSON.stringify(r)} (e.g. (dict "${t}" ${String(!n)}))`);return r},n=e.key;if(n!==void 0&&typeof n!=`string`)throw Error(`{{ menu }} option "key" must be a string naming the accordion group, got ${JSON.stringify(n)}`);if(n===``)throw Error(`{{ menu }} has an empty accordion key — a shared key must be a non-empty name (or omit "key" for an independent menu)`);return{closeOnPick:t(`closeOnPick`,!1),paged:t(`paged`,!0),key:n}}const cg=`menu`,lg=`the positional tail ("pageAction" closeOnPick paged "key") was removed: the page cursor is now synthesized from the menu's identity, and rare knobs are named options in ONE trailing dict — write {{ menu "applyTheme" }} or {{ menu "applyTheme" (dict "closeOnPick" true "paged" false "key" "pickers") }} (defaults: closeOnPick false, paged true, no key)`;function ug(e){let t=e=>({kind:`issue`,message:e}),[n,r]=e.argExprs;if(n===void 0)return t(`with no arguments — it takes an apply-action name (e.g. {{ menu "applyTheme" }})`);if(e.argExprs.length>2)return t(`with more than two arguments — ${lg}`);if(n.kind!==`literal`||typeof n.value!=`string`)return t(`whose apply action is not a string literal — a menu's identity is its apply-action name, which must be a literal so it can be gated at load (e.g. {{ menu "applyTheme" }})`);if(r!==void 0&&(r.kind!==`call`||r.name!==`dict`))return t(`whose second argument is not an options (dict …) — ${lg}`);let i=r===void 0?{}:Kp(r);if(i===null)return t(`whose options (dict …) is not fully literal — every option value must be a literal so the menu can be gated at load (a dynamic entry like (dict "key" .x) cannot)`);try{return{kind:`ok`,apply:n.value,options:sg(i)}}catch(e){return t(`with invalid options — ${e.message}`)}}function dg(e){let t=$d({fromString:e=>e});try{return t.parse(e).referencedCalls().filter(e=>e.name===cg).map(ug)}catch{return`parse-failed`}}function fg(e){let t=$d({fromString:e=>e});try{return t.parse(e).referencedFunctions().has(cg)}catch{return!1}}function pg(e,t,n){e.issues.push({path:t,message:n,line:Z(e.source,[`root`])})}function mg(e,t){ql(e,t,tg,`{{ menu }} helpers`);for(let[n,r]of Object.entries(t.helpers??{}))fg(r)&&e.issues.push({path:`helpers.${n}`,message:`helper "${n}" uses {{ menu }}, but a menu must live directly in a segment template — its identity is derived from the segment it sits in, which a shared helper does not have. Inline the {{ menu }} call into each segment that needs it.`,line:Z(e.source,[`helpers`,n])});let n=t.segments??{};for(let[t,r]of Object.entries(n))for(let n of[`bg`,`fg`,`when`]){let i=r[n];typeof i==`string`&&fg(i)&&pg(e,`segments.${t}.${n}`,`segment "${t}" uses {{ menu }} in its "${n}" — a menu is only valid in a segment's "template" (its placement is published only there; "${n}" needs a ${n===`when`?`predicate`:`color`}). Move the {{ menu }} into the template.`)}let r=new Map;if(t.root!==void 0)for(let n of Jr(t.root))typeof n.when==`string`&&fg(n.when)&&pg(e,`root`,`a layout node's "when" predicate uses {{ menu }} — a menu is only valid in a segment's "template", not a node predicate. Move it into a segment.`),n.kind===`segment`&&r.set(n.name,(r.get(n.name)??0)+1);for(let[t,i]of Object.entries(n))fg(i.template)&&(r.get(t)??0)>1&&pg(e,`segments.${t}`,`segment "${t}" hosts a {{ menu }} and is placed in the layout more than once — a menu's open-state is keyed by segment name, so the copies would share one state (clicking one would toggle both). Give each placement its own named segment.`);let i=new Set,a={},o=new Set,s=new Map;for(let[t,r]of Object.entries(n)){if(!fg(r.template))continue;let n=dg(r.template);if(n!==`parse-failed`)for(let r of n){if(r.kind===`issue`){pg(e,`segments.${t}`,`segment "${t}" has a {{ menu }} ${r.message}.`);continue}let{apply:n,options:c}=r;if(n===``){pg(e,`segments.${t}`,`segment "${t}" has a {{ menu }} with an empty apply-action name — an empty member aliases the absent-state sentinel ("") so the menu would render open before any click. Name the apply action.`);continue}let l=rg(n);if(l===`closed`){pg(e,`segments.${t}`,`segment "${t}" has a {{ menu }} whose apply action is named "${It}", which collides with the menu's closed-state sentinel and leaves it unopenable. Rename the action.`);continue}let u=ig(t,n,c.key),d=og(u),f=c.key===void 0?`ind${t}${n}`:`key${c.key}`,p=[u,d].find(e=>{let t=s.get(e);return t!==void 0&&t!==f});if(p!==void 0){pg(e,`segments.${t}`,`two {{ menu }} disclosures normalize to the same state key ("${p}") but were declared differently — distinct names that differ only by non-alphanumeric characters (e.g. "a-b" vs "a_b") collapse to one key and would silently share open-state. Rename so they don't collide.`);continue}s.set(u,f),s.set(d,f);let m=ag(u,l);if(o.has(m)){pg(e,`segments.${t}`,`two {{ menu }} disclosures resolve to the same identity ("${m}") — ${c.key===void 0?`a segment cannot contain two menus over the same apply action "${n}"`:`menus sharing key "${c.key}" must have distinct apply actions`}.`);continue}o.add(m),i.add(u),a[m]=Lt(u,l)}}if(i.size===0)return;let c={};for(let e of i){c[e]=j(e,It);let t=og(e);c[t]={kind:`state`,key:t,default:`0`},a[t]={set:t,int:!0}}t.variables={...t.variables??{},...c},t.actions={...t.actions??{},...a}}const hg=[`set`,`persist`,`copy`,`open`,`reset`];function gg(e){return`set`in e}function _g(e){return`persist`in e}function vg(e){return`reset`in e}function yg(e,t){if(t===void 0)return{};if(!Pc(t))return bg(e,`actions`,`actions must be an object, got ${Fc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=xg(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function bg(e,t,n){e.issues.push({path:t,message:n,line:Z(e.source,t.split(`.`))})}function xg(e,t,n){if(!Pc(n))return bg(e,t,`${t} must be an action object, got ${Fc(n)}`),null;let r=hg.filter(e=>e in n);return r.length===1?Sg[r[0]](e,t,n):(bg(e,t,`action must declare exactly one of: ${hg.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const Sg={set:(e,t,n)=>Hg(e,t,n,`set`,zg,`the SessionState key to write`),persist:(e,t,n)=>Hg(e,t,n,`persist`,Bg,`the config globals field to write`),copy:Cg(`copy`),open:Cg(`open`),reset:wg};function Cg(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&bg(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=kc(t,n,r,e);return i===null?null:{[e]:i}}}function wg(e,t,n){for(let r of Object.keys(n))r!==`reset`&&bg(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=Tg(e,t,`reset`,n,`reset key must be non-empty (the config globals field to clear)`,e=>`reset key "${e}" contains "/" — keys must be slash-free`);return r===null?null:{reset:r}}function Tg(e,t,n,r,i,a){let o=kc(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(bg(e,s,i),null):o.includes(`/`)?(bg(e,s,a(o)),null):o}function Eg(e,t,n,r,i){return Tg(e,t,r,n,`${r} key must be non-empty (${i})`,e=>`${r} key "${e}" contains "/" — keys must be slash-free`)}function Dg(e){return e===`set`?`set-state`:`set-config`}const Og={to:Ug(`set`)},kg={to:Ug(`persist`)},Ag={from:Wg(`set`)},jg={from:Wg(`persist`)},Mg={min:qg(),max:qg(),by:qg()},Ng={int:Kg()},Pg={cycle:Gg(`set`)},Fg={cycle:Gg(`persist`)},Ig={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},Lg={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function Rg(e,t,...n){let r=Object.keys(t),i=(e,n,r)=>Rc(e,t,n,r),a=Xc(t);return{detect:r,allowed:[e,...r],label:r.join(`/`),json:{type:`object`,properties:{[e]:{type:`string`},...a.properties},required:[e,...a.required??[]],additionalProperties:!1},parse:n.length?Uc(i,...n):i}}const zg=[Rg(`set`,Og),Rg(`set`,Ag),Rg(`set`,Mg,Ig,Lg),Rg(`set`,Ng),Rg(`set`,Pg)],Bg=[Rg(`persist`,kg),Rg(`persist`,jg),Rg(`persist`,Mg,Ig,Lg),Rg(`persist`,Fg)],Vg=e=>`a ${e} action declares exactly one value source: "to" (a literal value), "from" (an option domain — a registered domain name like "themes"/"styles"/"looks", or an inline array of literal values), "min"/"max"/"by" (a bounded step)${e===`set`?`, "int" (an unbounded integer cursor)`:``}, or "cycle" (an enumerated domain stepped in order)`;function Hg(e,t,n,r,i,a){let o=Eg(e,t,n,r,a),s=i.filter(e=>e.detect.some(e=>e in n));if(s.length!==1)return bg(e,t,`${Vg(r)}${s.length>1?` — found: ${s.map(e=>e.label).join(`, `)}`:``}`),null;let c=s[0];for(let i of Object.keys(n))c.allowed.includes(i)||bg(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${c.allowed.join(`, `)}`);let l=c.parse(e,t,n);return o===null||l===null?null:{[r]:o,...l}}function Ug(e){let t=Dg(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>Tg(n,r,i,a,`${e} value must be non-empty — an empty value cannot be delivered on the ${t} wire`,t=>`${e} value "${t}" contains "/" — ${e} values must be slash-free`)??void 0}}function Wg(e){let t=Dg(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){bg(n,s,`from must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){bg(n,s,`from must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){bg(n,s,`from array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let i=r.filter(e=>e.includes(`/`));if(i.length>0){bg(n,s,`from array member(s) ${i.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){bg(n,s,`from array members must be unique — a duplicated value would render the same picker option twice`);return}return r}bg(n,s,`from must be a domain name (a string) or an inline domain (an array of strings), got ${Ic(o)}`)}}}function Gg(e){let t=Dg(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){bg(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${Fc(o)}`);return}let c=o;if(c.length<2){bg(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){bg(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){bg(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){bg(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function Kg(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){bg(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${Ic(r[n])}`);return}return!0}}}function qg(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){bg(e,`${t}.${n}`,`${n} must be an integer, got ${Ic(i)}`);return}return i}}}const Jg={noun:`look key`,fields:{hueShift:Kc(),chromaScale:Kc({min:0}),lightnessScale:Kc(),lightnessShift:Kc()}};function Yg(e,t){if(!Pc(t))return e.issues.push({path:`looks`,message:`looks must be an object mapping look names to adaptation objects, got ${Fc(t)}`,line:Z(e.source,[`looks`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`looks.${r}`,message:`look name ${JSON.stringify(r)} must be non-empty and slash-free — a look picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:Z(e.source,[`looks`,r])});continue}let t=Lc(e,Jg,`looks.${r}`,i);t!==null&&(n[r]={...Sa,...t})}return n}const Xg={noun:`preset key`,fields:{root:{required:!1,json:{$ref:Jl},parse:(e,t,n,r)=>r[n]===void 0?void 0:ou(e,`${t}.${n}`,r[n])},globals:{required:!1,json:ul(),parse:(e,t,n,r)=>r[n]===void 0?void 0:ll(e,`${t}.${n}`,r[n])}}};function Zg(e,t){if(!Pc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${Fc(t)}`,line:Z(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty and slash-free — a preset picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:Z(e.source,[`presets`,r])});continue}let t=Lc(e,Xg,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function Qg(e,t){if(t===void 0)return{};if(!Pc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${Fc(t)}`,line:Z(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${Ic(i)}`,line:Z(e.source,[`helpers`,r])});continue}n[r]=i}return n}const $g=`default`,e_={};function t_(e){return[...new Set([$g,...Object.keys(e)])]}function n_(e,t,n){return _c(e,t,$g,n)}function r_(e,t){let n={[$g]:e_,...e}[t];if(n===void 0)throw Error(`Preset "${t}" is not declared in this config — effectivePresetName collapses unknown names to "${$g}", which always resolves; a miss here means a raw name reached this function without going through that resolution`);return n}function i_(e,t){let n=r_(e.presets,t).root;return n===void 0?{node:e.root,path:`root`}:{node:n,path:`presets.${t}.root`}}function a_(e,t){return{...e.globals,...r_(e.presets,t).globals}}const o_=new Map;function s_(e,t){o_.set(e,{permanent:!0,resolve:t})}s_(`themes`,()=>gc()),s_(`styles`,()=>bc),s_(`charsets`,()=>Cc),s_(`colorCompatibilities`,()=>wc);function c_(e){return new Map([[`looks`,Object.keys(e.looks)],[`presets`,t_(e.presets)]])}function l_(e){return[...new Set([...o_.keys(),...e.keys()])]}function u_(e,t){if(typeof e!=`string`)return e;let n=t.get(e);if(n)return n;let r=o_.get(e);if(r)return r.resolve();throw Error(`unknown option domain "${e}" (have: ${l_(t).join(`, `)})`)}const d_=/^segments\.([^.]+)\.palette$/;function f_(e){if(fl(e))return{scope:`globals`,field:e};let t=d_.exec(e);return t?{scope:`segment-palette`,segment:t[1]}:null}const p_=/{{([\s\S]*?)}}/g,m_=/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|`[^`]*`/g,h_=/(?<![A-Za-z0-9_)])\.([A-Za-z_][\w]*(?:\.[A-Za-z_][\w]*)*)/g;function g_(e){let t=new Set,n;for(p_.lastIndex=0;(n=p_.exec(e))!==null;){let e=n[1].replace(m_,``),r;for(h_.lastIndex=0;(r=h_.exec(e))!==null;)t.add(r[1])}return t}const __=/\baction\s+$/;function v_(e){let t=new Set;p_.lastIndex=0;let n;for(;(n=p_.exec(e))!==null;){let e=n[1],r=0,i;for(m_.lastIndex=0;(i=m_.exec(e))!==null;)__.test(e.slice(r,i.index))&&t.add(i[0].slice(1,-1)),r=i.index+i[0].length}return t}const y_=/\b(picker|menu)\s+$/;function b_(e){let t=new Set;p_.lastIndex=0;let n;for(;(n=p_.exec(e))!==null;){let e=n[1],r=0,i=0,a;for(m_.lastIndex=0;(a=m_.exec(e))!==null;){let n=y_.exec(e.slice(r,a.index));n!==null&&(i=n[1]===`picker`?2:1),i>0&&(t.add(a[0].slice(1,-1)),i--),r=a.index+a[0].length}}return t}function x_(e,t){if(t.has(e))return!0;let n=`${e}.`;for(let e of t)if(e.startsWith(n))return!0;return!1}const S_={gitTaculous:`gitaculous`};function C_(e,t){t.globals.look!==void 0&&!Object.prototype.hasOwnProperty.call(t.looks,t.globals.look)&&e.issues.push({path:`globals.look`,message:`globals.look "${t.globals.look}" does not match any declared look (have: ${Object.keys(t.looks).join(`, `)})`,line:Z(e.source,[`globals`,`look`])}),t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:Z(e.source,[`globals`,`preset`])});let n=c_(t);for(let[r,i]of Object.entries(t.actions))!(`set`in i)||!(`from`in i)||typeof i.from!=`string`||l_(n).includes(i.from)||e.issues.push({path:`actions.${r}.from`,message:`actions.${r} from: references unknown option domain "${i.from}" (have: ${l_(n).join(`, `)})`,line:Z(e.source,[`actions`,r,`from`])});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=f_(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${pl().join(`, `)}) or a "segments.<name>.palette" target`,line:Z(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})`,line:Z(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:Z(e.source,[`actions`,n,a])})}}let r=new Set(Object.keys(t.variables));for(let[e,n]of Object.entries(t.segments))if(n.vars)for(let t of Object.keys(n.vars))r.add(`${e}.${t}`);let i=(n,i,a)=>{for(let o of Jr(n))if(o.when!==void 0&&O_(e,`${i}.when`,o.when,r,{line:a}),o.kind===`segment`&&!Object.prototype.hasOwnProperty.call(t.segments,o.name)){let t=S_[o.name],n=t===void 0?``:` (the built-in segment "${o.name}" was renamed to "${t}" — update this reference)`;e.issues.push({path:i,message:`${i} entry "${o.name}" does not match any declared segment${n}`,line:a})}},a=k_(e.source);i(t.root,a,Z(e.source,[a]));for(let[n,r]of Object.entries(t.presets))r.root!==void 0&&i(r.root,`presets.${n}.root`,Z(e.source,[`presets`,n,`root`]));for(let[n,i]of Object.entries(t.variables))E_(e,`variables.${n}`,i,r);for(let[n,i]of Object.entries(t.segments)){if(i.vars)for(let[t,a]of Object.entries(i.vars))E_(e,`segments.${n}.vars.${t}`,a,r,n);for(let a of[`template`,`bg`,`fg`,`when`]){let o=i[a];if(typeof o==`string`){O_(e,`segments.${n}.${a}`,o,r,{segCtx:n});for(let r of v_(o))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"`,line:Z(e.source,[`segments`,n,a])});for(let r of b_(o))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}" (in a picker or menu)`,line:Z(e.source,[`segments`,n,a])})}}}for(let[n,i]of Object.entries(t.variables))D_(e,`variables.${n}`,i,r);for(let[n,i]of Object.entries(t.segments))if(i.vars)for(let[t,a]of Object.entries(i.vars))D_(e,`segments.${n}.vars.${t}`,a,r,n);(w_(t)||T_(t))&&!Object.prototype.hasOwnProperty.call(t.variables,`session.id`)&&e.issues.push({path:`variables.session.id`,message:`state reads and action set-writes require a global "session.id" variable (segment-local declarations do not satisfy this — declareState/set-state both read the global box; conventionally { kind: "input", path: "session_id" })`,line:Z(e.source,[`variables`])})}function w_(e){for(let t of Object.values(e.variables))if(t.kind===`state`)return!0;for(let t of Object.values(e.segments))if(t.vars){for(let e of Object.values(t.vars))if(e.kind===`state`)return!0}return!1}function T_(e){return Object.values(e.actions).some(e=>gg(e)||_g(e)||vg(e))}function E_(e,t,n,r,i){n.kind===`template`&&O_(e,`${t}.template`,n.template,r,{segCtx:i}),Xr(n)&&n.cache&&`key`in n.cache&&O_(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function D_(e,t,n,r,i){if(Xr(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.has(s)?` (segment-local vars are namespaced — write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:Z(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function O_(e,t,n,r,i){for(let a of g_(n)){if(x_(a,r))continue;let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,o=n!==void 0&&x_(n,r)?` (segment-local vars are namespaced — write ".${n}")`:``;e.issues.push({path:t,message:`Template references unknown variable ".${a}"${o}`,line:i?.line??Z(e.source,t.split(`.`))})}}function k_(e){try{let t=ai.default.parse(e);if(Pc(t)&&`root`in t)return`root`}catch{}return`layout`}function A_(e,t){let{graph:n,nodeInfo:r}=j_(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` → `)}`,line:Z(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function j_(e){let t=new Set(Object.keys(e.variables)),n=new Map;for(let t of Object.keys(e.variables))n.set(t,{declarationPath:`variables.${t}`,linePathParts:[`variables`,t]});for(let[r,i]of Object.entries(e.segments))if(i.vars)for(let e of Object.keys(i.vars)){let i=`${r}.${e}`;t.add(i),n.set(i,{declarationPath:`segments.${r}.vars.${e}`,linePathParts:[`segments`,r,`vars`,e]})}let r=new Map;for(let e of t)r.set(e,new Set);let i=(e,n)=>{for(let i of g_(n)){if(t.has(i)){r.get(e).add(i);continue}let n=i.split(`.`)[0];n!==i&&t.has(n)&&r.get(e).add(n)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),Xr(n)&&(n.cache&&`key`in n.cache&&i(e,n.cache.key),n.cache&&`depends_on`in n.cache))for(let i of n.cache.depends_on)t.has(i)&&r.get(e).add(i)};for(let[t,n]of Object.entries(e.variables))a(t,n);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))a(`${t}.${e}`,r);return{graph:r,nodeInfo:n}}const M_=[`json5`,`json`];function N_(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?f.homedir()+e.slice(1):e}function P_(e,t,n){if(n)return[n];let r=process.env.CC_CANDYBAR_CONFIG;if(r)return[N_(r)];let i=t??process.cwd(),a=process.env.XDG_CONFIG_HOME??c.join(f.homedir(),`.config`);return[...e?M_.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...M_.map(e=>c.join(i,`.cc-candybar.${e}`)),...M_.map(e=>c.join(a,`cc-candybar`,`config.${e}`))]}function F_(e,t,n){return P_(e,t,n).find(r.existsSync)??null}function I_(e,t){let n=P_(e,t),i=new Set,a=[];for(let e of n)i.has(e)||(i.add(e),r.existsSync(e)&&a.push(e));let o=new Map;for(let e of a){let t=c.dirname(e),n=c.basename(e).replace(/\.(json5|json)$/,``),r=c.join(t,n);o.has(r)||o.set(r,[]),o.get(r).push(e)}let s=[...o.values()].filter(e=>e.length>1);return s.length===0?null:`config-extension collision: ${s.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function L_(e,t,n){let i=e===null?``:r.readFileSync(e,`utf-8`);return{config:tl(e===null?{}:z_(e,i,n),t),source:i}}function R_(e,t=`<config>`,n=``,r=new Set(gc())){let i=[],a={source:n,issues:i,allowedPalettes:r,groups:[]};if(C_(a,e),A_(a,e),i.length>0)throw new Tc(t,i);return e}function z_(e,t,n=new Set(gc())){let r=B_(e,t),i=[],a={source:t,issues:i,allowedPalettes:n,groups:[]};if(!Pc(r))throw new Tc(e,[{path:``,message:`Config root must be an object, got ${Fc(r)}`}]);let o=V_(a,r);if(i.length>0)throw new Tc(e,i);return o}function B_(e,t){try{return ai.default.parse(t)}catch(t){let n=t;throw new Tc(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function V_(e,t){for(let n of Object.keys(t))H_.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...H_].join(`, `)}`,line:Z(e.source,[n])});let n={};return t.globals!==void 0&&(n.globals=cl(e,`globals`,t.globals)),t.variables!==void 0&&(n.variables=El(e,`variables`,t.variables)),t.segments!==void 0&&(n.segments=Ul(e,t.segments)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported — use "root" with the A-grammar instead.
100
+ `)){let n=``;for(let i of t.split(/\s+/))i.length!==0&&(n.length===0?n=i:n.length+1+i.length<=e?n+=` ${i}`:(r.push(n),n=i));n.length>0&&r.push(n)}return r.join(t)}function $h(e,t,n){return Qh(e,t,n)}function eg(){return{abbrev:{fn:(e,t)=>$m(e,t),argTypes:[`int`,`string`]},abbrevboth:{fn:(e,t,n)=>eh(e,t,n),argTypes:[`int`,`int`,`string`]},camelcase:{fn:e=>hh(e),argTypes:[`string`],returnType:`string`},cat:{fn:(...e)=>gh(...e),argTypes:[`string`]},contains:{fn:(e,t)=>_h(e,t),argTypes:[`string`,`string`]},hasPrefix:{fn:(e,t)=>vh(e,t),argTypes:[`string`,`string`]},hasSuffix:{fn:(e,t)=>yh(e,t),argTypes:[`string`,`string`]},indent:{fn:(e,t)=>bh(e,t),argTypes:[`int`,`string`]},initials:{fn:e=>xh(e),argTypes:[`string`]},join:{fn:(e,t)=>Sh(e,t),argTypes:[`string`,`list`]},kebabcase:{fn:e=>wh(e),argTypes:[`string`],returnType:`string`},lower:{fn:e=>Th(e),argTypes:[`string`]},nindent:{fn:(e,t)=>Eh(e,t),argTypes:[`int`,`string`]},nospace:{fn:e=>Dh(e),argTypes:[`string`],returnType:`string`},plural:{fn:(e,t,n)=>Oh(e,t,n),argTypes:[`string`,`string`,`int`],returnType:`string`},quote:{fn:(...e)=>kh(...e),argTypes:[`string`]},regexQuoteMeta:{fn:e=>Ah(e),argTypes:[`string`],returnType:`string`},repeat:{fn:(e,t)=>jh(e,t),argTypes:[`int`,`string`]},replace:{fn:(e,t,n)=>Mh(e,t,n),argTypes:[`string`,`string`,`string`]},snakecase:{fn:e=>Nh(e),argTypes:[`string`],returnType:`string`},split:{fn:(e,t)=>Ph(e,t),argTypes:[`string`,`string`]},splitList:{fn:(e,t)=>Fh(e,t),argTypes:[`string`,`string`]},splitn:{fn:(e,t,n)=>Ih(e,t,n),argTypes:[`string`,`int`,`string`],returnType:`dict`},squote:{fn:(...e)=>Rh(...e),argTypes:[`string`]},substr:{fn:(e,t,n)=>zh(e,t,n),argTypes:[`int`,`int`,`string`]},swapcase:{fn:e=>Bh(e),argTypes:[`string`],returnType:`string`},title:{fn:e=>Uh(e),argTypes:[`string`]},trim:{fn:e=>Wh(e),argTypes:[`string`]},trimAll:{fn:(e,t)=>Gh(e,t),argTypes:[`string`,`string`]},trimPrefix:{fn:(e,t)=>Kh(e,t),argTypes:[`string`,`string`]},trimSuffix:{fn:(e,t)=>qh(e,t),argTypes:[`string`,`string`]},trunc:{fn:(e,t)=>Jh(e,t),argTypes:[`int`,`string`]},untitle:{fn:e=>Yh(e),argTypes:[`string`]},upper:{fn:e=>Xh(e),argTypes:[`string`]},wrap:{fn:(e,t)=>Zh(e,t),argTypes:[`int`,`string`]},wrapWith:{fn:(e,t,n)=>$h(e,t,n),argTypes:[`int`,`string`,`string`]}}}const tg=`menus.`;function ng(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}function rg(e){return e}function ig(e,t,n){return n===void 0?tg+ng(e)+`.`+ng(t):tg+ng(n)}function ag(e,t){return e+`.`+t}function og(e){return e+`.page`}function sg(e){for(let t of Object.keys(e))if(t!==`closeOnPick`&&t!==`paged`&&t!==`key`)throw Error(`unknown {{ menu }} option "${t}" — the options dict takes "closeOnPick" (bool, default false), "paged" (bool, default true), "key" (string, accordion grouping)`);let t=(t,n)=>{let r=e[t];if(r===void 0)return n;if(typeof r!=`boolean`)throw Error(`{{ menu }} option "${t}" must be a boolean, got ${JSON.stringify(r)} (e.g. (dict "${t}" ${String(!n)}))`);return r},n=e.key;if(n!==void 0&&typeof n!=`string`)throw Error(`{{ menu }} option "key" must be a string naming the accordion group, got ${JSON.stringify(n)}`);if(n===``)throw Error(`{{ menu }} has an empty accordion key — a shared key must be a non-empty name (or omit "key" for an independent menu)`);return{closeOnPick:t(`closeOnPick`,!1),paged:t(`paged`,!0),key:n}}const cg=`menu`,lg=`the positional tail ("pageAction" closeOnPick paged "key") was removed: the page cursor is now synthesized from the menu's identity, and rare knobs are named options in ONE trailing dict — write {{ menu "applyTheme" }} or {{ menu "applyTheme" (dict "closeOnPick" true "paged" false "key" "pickers") }} (defaults: closeOnPick false, paged true, no key)`;function ug(e){let t=e=>({kind:`issue`,message:e}),[n,r]=e.argExprs;if(n===void 0)return t(`with no arguments — it takes an apply-action name (e.g. {{ menu "applyTheme" }})`);if(e.argExprs.length>2)return t(`with more than two arguments — ${lg}`);if(n.kind!==`literal`||typeof n.value!=`string`)return t(`whose apply action is not a string literal — a menu's identity is its apply-action name, which must be a literal so it can be gated at load (e.g. {{ menu "applyTheme" }})`);if(r!==void 0&&(r.kind!==`call`||r.name!==`dict`))return t(`whose second argument is not an options (dict …) — ${lg}`);let i=r===void 0?{}:Kp(r);if(i===null)return t(`whose options (dict …) is not fully literal — every option value must be a literal so the menu can be gated at load (a dynamic entry like (dict "key" .x) cannot)`);try{return{kind:`ok`,apply:n.value,options:sg(i)}}catch(e){return t(`with invalid options — ${e.message}`)}}function dg(e){let t=$d({fromString:e=>e});try{return t.parse(e).referencedCalls().filter(e=>e.name===cg).map(ug)}catch{return`parse-failed`}}function fg(e){let t=$d({fromString:e=>e});try{return t.parse(e).referencedFunctions().has(cg)}catch{return!1}}function pg(e,t,n){e.issues.push({path:t,message:n,line:Z(e.source,[`root`])})}function mg(e,t){ql(e,t,tg,`{{ menu }} helpers`);for(let[n,r]of Object.entries(t.helpers??{}))fg(r)&&e.issues.push({path:`helpers.${n}`,message:`helper "${n}" uses {{ menu }}, but a menu must live directly in a segment template — its identity is derived from the segment it sits in, which a shared helper does not have. Inline the {{ menu }} call into each segment that needs it.`,line:Z(e.source,[`helpers`,n])});let n=t.segments??{};for(let[t,r]of Object.entries(n))for(let n of[`bg`,`fg`,`when`]){let i=r[n];typeof i==`string`&&fg(i)&&pg(e,`segments.${t}.${n}`,`segment "${t}" uses {{ menu }} in its "${n}" — a menu is only valid in a segment's "template" (its placement is published only there; "${n}" needs a ${n===`when`?`predicate`:`color`}). Move the {{ menu }} into the template.`)}let r=new Map;if(t.root!==void 0)for(let n of Jr(t.root))typeof n.when==`string`&&fg(n.when)&&pg(e,`root`,`a layout node's "when" predicate uses {{ menu }} — a menu is only valid in a segment's "template", not a node predicate. Move it into a segment.`),n.kind===`segment`&&r.set(n.name,(r.get(n.name)??0)+1);for(let[t,i]of Object.entries(n))fg(i.template)&&(r.get(t)??0)>1&&pg(e,`segments.${t}`,`segment "${t}" hosts a {{ menu }} and is placed in the layout more than once — a menu's open-state is keyed by segment name, so the copies would share one state (clicking one would toggle both). Give each placement its own named segment.`);let i=new Set,a={},o=new Set,s=new Map;for(let[t,r]of Object.entries(n)){if(!fg(r.template))continue;let n=dg(r.template);if(n!==`parse-failed`)for(let r of n){if(r.kind===`issue`){pg(e,`segments.${t}`,`segment "${t}" has a {{ menu }} ${r.message}.`);continue}let{apply:n,options:c}=r;if(n===``){pg(e,`segments.${t}`,`segment "${t}" has a {{ menu }} with an empty apply-action name — an empty member aliases the absent-state sentinel ("") so the menu would render open before any click. Name the apply action.`);continue}let l=rg(n);if(l===`closed`){pg(e,`segments.${t}`,`segment "${t}" has a {{ menu }} whose apply action is named "${It}", which collides with the menu's closed-state sentinel and leaves it unopenable. Rename the action.`);continue}let u=ig(t,n,c.key),d=og(u),f=c.key===void 0?`ind${t}${n}`:`key${c.key}`,p=[u,d].find(e=>{let t=s.get(e);return t!==void 0&&t!==f});if(p!==void 0){pg(e,`segments.${t}`,`two {{ menu }} disclosures normalize to the same state key ("${p}") but were declared differently — distinct names that differ only by non-alphanumeric characters (e.g. "a-b" vs "a_b") collapse to one key and would silently share open-state. Rename so they don't collide.`);continue}s.set(u,f),s.set(d,f);let m=ag(u,l);if(o.has(m)){pg(e,`segments.${t}`,`two {{ menu }} disclosures resolve to the same identity ("${m}") — ${c.key===void 0?`a segment cannot contain two menus over the same apply action "${n}"`:`menus sharing key "${c.key}" must have distinct apply actions`}.`);continue}o.add(m),i.add(u),a[m]=Lt(u,l)}}if(i.size===0)return;let c={};for(let e of i){c[e]=j(e,It);let t=og(e);c[t]={kind:`state`,key:t,default:`0`},a[t]={set:t,int:!0}}t.variables={...t.variables??{},...c},t.actions={...t.actions??{},...a}}const hg=[`set`,`persist`,`copy`,`open`,`reset`];function gg(e){return`set`in e}function _g(e){return`persist`in e}function vg(e){return`reset`in e}function yg(e,t){if(t===void 0)return{};if(!Pc(t))return bg(e,`actions`,`actions must be an object, got ${Fc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=xg(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function bg(e,t,n){e.issues.push({path:t,message:n,line:Z(e.source,t.split(`.`))})}function xg(e,t,n){if(!Pc(n))return bg(e,t,`${t} must be an action object, got ${Fc(n)}`),null;let r=hg.filter(e=>e in n);return r.length===1?Sg[r[0]](e,t,n):(bg(e,t,`action must declare exactly one of: ${hg.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const Sg={set:(e,t,n)=>Hg(e,t,n,`set`,zg,`the SessionState key to write`),persist:(e,t,n)=>Hg(e,t,n,`persist`,Bg,`the config globals field to write`),copy:Cg(`copy`),open:Cg(`open`),reset:wg};function Cg(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&bg(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=kc(t,n,r,e);return i===null?null:{[e]:i}}}function wg(e,t,n){for(let r of Object.keys(n))r!==`reset`&&bg(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=Tg(e,t,`reset`,n,`reset key must be non-empty (the config globals field to clear)`,e=>`reset key "${e}" contains "/" — keys must be slash-free`);return r===null?null:{reset:r}}function Tg(e,t,n,r,i,a){let o=kc(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(bg(e,s,i),null):o.includes(`/`)?(bg(e,s,a(o)),null):o}function Eg(e,t,n,r,i){return Tg(e,t,r,n,`${r} key must be non-empty (${i})`,e=>`${r} key "${e}" contains "/" — keys must be slash-free`)}function Dg(e){return e===`set`?`set-state`:`set-config`}const Og={to:Ug(`set`)},kg={to:Ug(`persist`)},Ag={from:Wg(`set`)},jg={from:Wg(`persist`)},Mg={min:qg(),max:qg(),by:qg()},Ng={int:Kg()},Pg={cycle:Gg(`set`)},Fg={cycle:Gg(`persist`)},Ig={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},Lg={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function Rg(e,t,...n){let r=Object.keys(t),i=(e,n,r)=>Rc(e,t,n,r),a=Xc(t);return{detect:r,allowed:[e,...r],label:r.join(`/`),json:{type:`object`,properties:{[e]:{type:`string`},...a.properties},required:[e,...a.required??[]],additionalProperties:!1},parse:n.length?Uc(i,...n):i}}const zg=[Rg(`set`,Og),Rg(`set`,Ag),Rg(`set`,Mg,Ig,Lg),Rg(`set`,Ng),Rg(`set`,Pg)],Bg=[Rg(`persist`,kg),Rg(`persist`,jg),Rg(`persist`,Mg,Ig,Lg),Rg(`persist`,Fg)],Vg=e=>`a ${e} action declares exactly one value source: "to" (a literal value), "from" (an option domain — a registered domain name like "themes"/"styles"/"looks", or an inline array of literal values), "min"/"max"/"by" (a bounded step)${e===`set`?`, "int" (an unbounded integer cursor)`:``}, or "cycle" (an enumerated domain stepped in order)`;function Hg(e,t,n,r,i,a){let o=Eg(e,t,n,r,a),s=i.filter(e=>e.detect.some(e=>e in n));if(s.length!==1)return bg(e,t,`${Vg(r)}${s.length>1?` — found: ${s.map(e=>e.label).join(`, `)}`:``}`),null;let c=s[0];for(let i of Object.keys(n))c.allowed.includes(i)||bg(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${c.allowed.join(`, `)}`);let l=c.parse(e,t,n);return o===null||l===null?null:{[r]:o,...l}}function Ug(e){let t=Dg(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>Tg(n,r,i,a,`${e} value must be non-empty — an empty value cannot be delivered on the ${t} wire`,t=>`${e} value "${t}" contains "/" — ${e} values must be slash-free`)??void 0}}function Wg(e){let t=Dg(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){bg(n,s,`from must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){bg(n,s,`from must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){bg(n,s,`from array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let i=r.filter(e=>e.includes(`/`));if(i.length>0){bg(n,s,`from array member(s) ${i.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){bg(n,s,`from array members must be unique — a duplicated value would render the same picker option twice`);return}return r}bg(n,s,`from must be a domain name (a string) or an inline domain (an array of strings), got ${Ic(o)}`)}}}function Gg(e){let t=Dg(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){bg(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${Fc(o)}`);return}let c=o;if(c.length<2){bg(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){bg(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){bg(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){bg(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function Kg(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){bg(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${Ic(r[n])}`);return}return!0}}}function qg(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){bg(e,`${t}.${n}`,`${n} must be an integer, got ${Ic(i)}`);return}return i}}}const Jg={noun:`look key`,fields:{hueShift:Kc(),chromaScale:Kc({min:0}),lightnessScale:Kc(),lightnessShift:Kc()}};function Yg(e,t){if(!Pc(t))return e.issues.push({path:`looks`,message:`looks must be an object mapping look names to adaptation objects, got ${Fc(t)}`,line:Z(e.source,[`looks`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`looks.${r}`,message:`look name ${JSON.stringify(r)} must be non-empty and slash-free — a look picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:Z(e.source,[`looks`,r])});continue}let t=Lc(e,Jg,`looks.${r}`,i);t!==null&&(n[r]={...Sa,...t})}return n}const Xg={noun:`preset key`,fields:{root:{required:!1,json:{$ref:Jl},parse:(e,t,n,r)=>r[n]===void 0?void 0:ou(e,`${t}.${n}`,r[n])},globals:{required:!1,json:ul(),parse:(e,t,n,r)=>r[n]===void 0?void 0:ll(e,`${t}.${n}`,r[n])}}};function Zg(e,t){if(!Pc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${Fc(t)}`,line:Z(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty and slash-free — a preset picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:Z(e.source,[`presets`,r])});continue}let t=Lc(e,Xg,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function Qg(e,t){if(t===void 0)return{};if(!Pc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${Fc(t)}`,line:Z(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${Ic(i)}`,line:Z(e.source,[`helpers`,r])});continue}n[r]=i}return n}const $g=`default`,e_={};function t_(e){return[...new Set([$g,...Object.keys(e)])]}function n_(e,t,n){return _c(e,t,$g,n)}function r_(e,t){let n={[$g]:e_,...e}[t];if(n===void 0)throw Error(`Preset "${t}" is not declared in this config — effectivePresetName collapses unknown names to "${$g}", which always resolves; a miss here means a raw name reached this function without going through that resolution`);return n}function i_(e,t){let n=r_(e.presets,t).root;return n===void 0?{node:e.root,path:`root`}:{node:n,path:`presets.${t}.root`}}function a_(e,t){return{...e.globals,...r_(e.presets,t).globals}}function o_(e,t){let n=e.preset;if(n===void 0||t_(t).includes(n))return e;let r={...e};return delete r.preset,r}const s_=new Map;function c_(e,t){s_.set(e,{permanent:!0,resolve:t})}c_(`themes`,()=>gc()),c_(`styles`,()=>bc),c_(`charsets`,()=>Cc),c_(`colorCompatibilities`,()=>wc);function l_(e){return new Map([[`looks`,Object.keys(e.looks)],[`presets`,t_(e.presets)]])}function u_(e){return[...new Set([...s_.keys(),...e.keys()])]}function d_(e,t){if(typeof e!=`string`)return e;let n=t.get(e);if(n)return n;let r=s_.get(e);if(r)return r.resolve();throw Error(`unknown option domain "${e}" (have: ${u_(t).join(`, `)})`)}const f_=/^segments\.([^.]+)\.palette$/;function p_(e){if(fl(e))return{scope:`globals`,field:e};let t=f_.exec(e);return t?{scope:`segment-palette`,segment:t[1]}:null}const m_=/{{([\s\S]*?)}}/g,h_=/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|`[^`]*`/g,g_=/(?<![A-Za-z0-9_)])\.([A-Za-z_][\w]*(?:\.[A-Za-z_][\w]*)*)/g;function __(e){let t=new Set,n;for(m_.lastIndex=0;(n=m_.exec(e))!==null;){let e=n[1].replace(h_,``),r;for(g_.lastIndex=0;(r=g_.exec(e))!==null;)t.add(r[1])}return t}const v_=/\baction\s+$/;function y_(e){let t=new Set;m_.lastIndex=0;let n;for(;(n=m_.exec(e))!==null;){let e=n[1],r=0,i;for(h_.lastIndex=0;(i=h_.exec(e))!==null;)v_.test(e.slice(r,i.index))&&t.add(i[0].slice(1,-1)),r=i.index+i[0].length}return t}const b_=/\b(picker|menu)\s+$/;function x_(e){let t=new Set;m_.lastIndex=0;let n;for(;(n=m_.exec(e))!==null;){let e=n[1],r=0,i=0,a;for(h_.lastIndex=0;(a=h_.exec(e))!==null;){let n=b_.exec(e.slice(r,a.index));n!==null&&(i=n[1]===`picker`?2:1),i>0&&(t.add(a[0].slice(1,-1)),i--),r=a.index+a[0].length}}return t}function S_(e,t){if(t.has(e))return!0;let n=`${e}.`;for(let e of t)if(e.startsWith(n))return!0;return!1}const C_={gitTaculous:`gitaculous`};function w_(e,t){t.globals.look!==void 0&&!Object.prototype.hasOwnProperty.call(t.looks,t.globals.look)&&e.issues.push({path:`globals.look`,message:`globals.look "${t.globals.look}" does not match any declared look (have: ${Object.keys(t.looks).join(`, `)})`,line:Z(e.source,[`globals`,`look`])}),t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:Z(e.source,[`globals`,`preset`])});let n=l_(t);for(let[r,i]of Object.entries(t.actions))!(`set`in i)||!(`from`in i)||typeof i.from!=`string`||u_(n).includes(i.from)||e.issues.push({path:`actions.${r}.from`,message:`actions.${r} from: references unknown option domain "${i.from}" (have: ${u_(n).join(`, `)})`,line:Z(e.source,[`actions`,r,`from`])});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=p_(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${pl().join(`, `)}) or a "segments.<name>.palette" target`,line:Z(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})`,line:Z(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:Z(e.source,[`actions`,n,a])})}}let r=new Set(Object.keys(t.variables));for(let[e,n]of Object.entries(t.segments))if(n.vars)for(let t of Object.keys(n.vars))r.add(`${e}.${t}`);let i=(n,i,a)=>{for(let o of Jr(n))if(o.when!==void 0&&k_(e,`${i}.when`,o.when,r,{line:a}),o.kind===`segment`&&!Object.prototype.hasOwnProperty.call(t.segments,o.name)){let t=C_[o.name],n=t===void 0?``:` (the built-in segment "${o.name}" was renamed to "${t}" — update this reference)`;e.issues.push({path:i,message:`${i} entry "${o.name}" does not match any declared segment${n}`,line:a})}},a=A_(e.source);i(t.root,a,Z(e.source,[a]));for(let[n,r]of Object.entries(t.presets))r.root!==void 0&&i(r.root,`presets.${n}.root`,Z(e.source,[`presets`,n,`root`]));for(let[n,i]of Object.entries(t.variables))D_(e,`variables.${n}`,i,r);for(let[n,i]of Object.entries(t.segments)){if(i.vars)for(let[t,a]of Object.entries(i.vars))D_(e,`segments.${n}.vars.${t}`,a,r,n);for(let a of[`template`,`bg`,`fg`,`when`]){let o=i[a];if(typeof o==`string`){k_(e,`segments.${n}.${a}`,o,r,{segCtx:n});for(let r of y_(o))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"`,line:Z(e.source,[`segments`,n,a])});for(let r of x_(o))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}" (in a picker or menu)`,line:Z(e.source,[`segments`,n,a])})}}}for(let[n,i]of Object.entries(t.variables))O_(e,`variables.${n}`,i,r);for(let[n,i]of Object.entries(t.segments))if(i.vars)for(let[t,a]of Object.entries(i.vars))O_(e,`segments.${n}.vars.${t}`,a,r,n);(T_(t)||E_(t))&&!Object.prototype.hasOwnProperty.call(t.variables,`session.id`)&&e.issues.push({path:`variables.session.id`,message:`state reads and action set-writes require a global "session.id" variable (segment-local declarations do not satisfy this — declareState/set-state both read the global box; conventionally { kind: "input", path: "session_id" })`,line:Z(e.source,[`variables`])})}function T_(e){for(let t of Object.values(e.variables))if(t.kind===`state`)return!0;for(let t of Object.values(e.segments))if(t.vars){for(let e of Object.values(t.vars))if(e.kind===`state`)return!0}return!1}function E_(e){return Object.values(e.actions).some(e=>gg(e)||_g(e)||vg(e))}function D_(e,t,n,r,i){n.kind===`template`&&k_(e,`${t}.template`,n.template,r,{segCtx:i}),Xr(n)&&n.cache&&`key`in n.cache&&k_(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function O_(e,t,n,r,i){if(Xr(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.has(s)?` (segment-local vars are namespaced — write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:Z(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function k_(e,t,n,r,i){for(let a of __(n)){if(S_(a,r))continue;let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,o=n!==void 0&&S_(n,r)?` (segment-local vars are namespaced — write ".${n}")`:``;e.issues.push({path:t,message:`Template references unknown variable ".${a}"${o}`,line:i?.line??Z(e.source,t.split(`.`))})}}function A_(e){try{let t=ai.default.parse(e);if(Pc(t)&&`root`in t)return`root`}catch{}return`layout`}function j_(e,t){let{graph:n,nodeInfo:r}=M_(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` → `)}`,line:Z(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function M_(e){let t=new Set(Object.keys(e.variables)),n=new Map;for(let t of Object.keys(e.variables))n.set(t,{declarationPath:`variables.${t}`,linePathParts:[`variables`,t]});for(let[r,i]of Object.entries(e.segments))if(i.vars)for(let e of Object.keys(i.vars)){let i=`${r}.${e}`;t.add(i),n.set(i,{declarationPath:`segments.${r}.vars.${e}`,linePathParts:[`segments`,r,`vars`,e]})}let r=new Map;for(let e of t)r.set(e,new Set);let i=(e,n)=>{for(let i of __(n)){if(t.has(i)){r.get(e).add(i);continue}let n=i.split(`.`)[0];n!==i&&t.has(n)&&r.get(e).add(n)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),Xr(n)&&(n.cache&&`key`in n.cache&&i(e,n.cache.key),n.cache&&`depends_on`in n.cache))for(let i of n.cache.depends_on)t.has(i)&&r.get(e).add(i)};for(let[t,n]of Object.entries(e.variables))a(t,n);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))a(`${t}.${e}`,r);return{graph:r,nodeInfo:n}}const N_=[`json5`,`json`];function P_(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?f.homedir()+e.slice(1):e}function F_(e,t,n){if(n)return[n];let r=process.env.CC_CANDYBAR_CONFIG;if(r)return[P_(r)];let i=t??process.cwd(),a=process.env.XDG_CONFIG_HOME??c.join(f.homedir(),`.config`);return[...e?N_.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...N_.map(e=>c.join(i,`.cc-candybar.${e}`)),...N_.map(e=>c.join(a,`cc-candybar`,`config.${e}`))]}function I_(e,t,n){return F_(e,t,n).find(r.existsSync)??null}function L_(e,t){let n=F_(e,t),i=new Set,a=[];for(let e of n)i.has(e)||(i.add(e),r.existsSync(e)&&a.push(e));let o=new Map;for(let e of a){let t=c.dirname(e),n=c.basename(e).replace(/\.(json5|json)$/,``),r=c.join(t,n);o.has(r)||o.set(r,[]),o.get(r).push(e)}let s=[...o.values()].filter(e=>e.length>1);return s.length===0?null:`config-extension collision: ${s.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function R_(e,t,n){let i=e===null?``:r.readFileSync(e,`utf-8`);return{config:tl(e===null?{}:B_(e,i,n),t),source:i}}function z_(e,t=`<config>`,n=``,r=new Set(gc())){let i=[],a={source:n,issues:i,allowedPalettes:r,groups:[]};if(w_(a,e),j_(a,e),i.length>0)throw new Tc(t,i);return e}function B_(e,t,n=new Set(gc())){let r=V_(e,t),i=[],a={source:t,issues:i,allowedPalettes:n,groups:[]};if(!Pc(r))throw new Tc(e,[{path:``,message:`Config root must be an object, got ${Fc(r)}`}]);let o=H_(a,r);if(i.length>0)throw new Tc(e,i);return o}function V_(e,t){try{return ai.default.parse(t)}catch(t){let n=t;throw new Tc(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function H_(e,t){for(let n of Object.keys(t))U_.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...U_].join(`, `)}`,line:Z(e.source,[n])});let n={};return t.globals!==void 0&&(n.globals=cl(e,`globals`,t.globals)),t.variables!==void 0&&(n.variables=El(e,`variables`,t.variables)),t.segments!==void 0&&(n.segments=Ul(e,t.segments)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported — use "root" with the A-grammar instead.
101
101
  Replace: layout: [["seg1", "seg2"], ["seg3"]]
102
102
  With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
103
- Single-row example: root: { h: ["seg1", "seg2"] }`,line:Z(e.source,[`layout`])}),t.root!==void 0&&(n.root=ou(e,`root`,t.root)),t.actions!==void 0&&(n.actions=yg(e,t.actions)),t.looks!==void 0&&(n.looks=Yg(e,t.looks)),t.presets!==void 0&&(n.presets=Zg(e,t.presets)),t.helpers!==void 0&&(n.helpers=Qg(e,t.helpers)),_u(e,n),mg(e,n),n}const H_=new Set([`globals`,`variables`,`segments`,`layout`,`root`,`actions`,`looks`,`presets`,`helpers`]),U_=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function W_(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 G_(e){let t=await K_(e);return t.kind===`ok`?I(Math.floor((t.value+36e5)/1e3)):t}async function K_(e){for(let t of[65536,1048576]){let n=await Tr(e,t);if(n.kind!==`ok`)return n;let r=q_(n.value.buf,n.value.fromStart);if(r!=null)return I(r);if(n.value.fromStart)return L}return L}function q_(e,t){let n=e.toString(`utf8`).split(`
104
- `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!U_.test(t))continue;let r=W_(t);if(r!=null)return r}return null}const J_=10*1e3;function Y_(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 X_(e,t){if(!(t<60))return e*3600/t}function Z_(e,t,n,r){let i=r-t;if(i<50||i>J_)return;let a=n-e;if(!(a<=0))return a*1e3/i}function Q_(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Z_(t.input,t.atMs,n.input,n.atMs),i=Z_(t.output,t.atMs,n.output,n.atMs),a=Z_(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 $_(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>J_)continue;let o=Z_(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function ev(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,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}`,i);let n=[],r=new Set;for(let t of Jr(e.root)){if(t.when)for(let e of g_(t.when))n.push(e);if(t.kind!==`segment`)continue;let r=e.segments[t.name];if(r){for(let e of[r.template,r.when,r.bg,r.fg])if(e)for(let t of g_(e))n.push(t)}}let i=new Set;for(;n.length>0;){let e=n.pop();for(let a of tv(t,e)){if(r.has(a))continue;r.add(a);let e=t.get(a);if(e){if(e.kind===`input`)i.add(e.path);else if(e.kind===`template`)for(let t of g_(e.template))n.push(t)}}}return i}function tv(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 nv(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function rv(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 iv(e,t,n,r,i){let a=e=>nv(r,e),o=(t.clock??(()=>new Date))().getTime(),s=(e,t,n)=>t?n().catch(t=>Ln(`${e}: ${String(t)}`)):Promise.resolve(L),[c,l,u,d,f,p,m,h]=await Promise.all([s(`git`,a(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,rv(r),e.workspace?.project_dir)),s(`session`,a(`session.cost`)||a(`session.tokens`)||a(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),s(`today`,a(`today`),()=>t.usageStore.getTodayInfo(e)),s(`context`,a(`context`),()=>t.contextProvider.getContextInfo(e)),s(`metrics`,a(`metrics`)||a(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),s(`tmux`,a(`tmux`),()=>t.tmuxService.getSessionId()),s(`cache`,a(`cache`),()=>G_(e.transcript_path)),s(`speed`,a(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,o))]),g=[],_=e=>{if(e.kind===`failed`){g.push(e.reason);return}return e.kind===`ok`?e.value:void 0},v=sv(c);g.push(...v.failures);let y=_(l),b=_(u),x=_(d),S=_(f),C=_(p),ee=_(m);for(let e of g)t.log(`warn`,`provider fetch failed: ${e}`);let te=e.rate_limits?.five_hour,w=e.rate_limits?.seven_day,ne=te?Y_(te.used_percentage,te.resets_at,18e6,o):void 0,re=w?Y_(w.used_percentage,w.resets_at,6048e5,o):void 0,ie=y?.session.cost,T=S?.sessionDuration,E=a(`burn`)&&ie!=null&&T!=null?X_(ie,T):void 0,ae=_(h),oe=ae===void 0?void 0:Q_(ae),se=ae===void 0?void 0:$_(ae),ce=oe!==void 0||se!==void 0?{...oe,...se!==void 0&&{history:se}}:void 0,le=ov(process.env.HOME??process.env.USERPROFILE),ue=e.workspace?{...e.workspace,current_dir:ov(e.workspace.current_dir)??``,project_dir:ov(e.workspace.project_dir)??``}:e.workspace,de=y===void 0?void 0:av({cost:y.session.cost,tokens:y.session.tokens}),fe=b===void 0?void 0:{cost:b.cost,tokens:b.tokens},pe=S===void 0?void 0:av({lastResponseTime:S.lastResponseTime,responseTime:S.responseTime,sessionDuration:S.sessionDuration,messageCount:S.messageCount,linesAdded:S.linesAdded,linesRemoved:S.linesRemoved});return{...e,...ue!==void 0&&{workspace:ue},...le!==void 0&&{home:le},...v.git!==void 0&&{git:v.git},...C!==void 0&&{tmux:{session:C}},theme:{effective:i.theme},look:{effective:i.look},preset:{effective:i.preset},style:{effective:i.style},charset:{effective:i.charset},colorCompatibility:{effective:i.colorCompatibility},autoWrap:{effective:i.autoWrap},padding:{effective:i.padding},...de!==void 0&&{session:de},...fe!==void 0&&{today:fe},...E!==void 0&&{burn:{costPerHour:E}},...ce!==void 0&&{speed:ce},...a(`block`)&&te!==void 0&&{block:{nativeUtilization:te.used_percentage,resetsAt:te.resets_at,...ne!==void 0&&{etaMinutes:ne}}},...w!==void 0&&{weekly:{percentage:w.used_percentage,resetsAt:w.resets_at,...re!==void 0&&{etaMinutes:re}}},...ee!==void 0&&{cache:{expiresAt:ee}},...x!==void 0&&{context:{totalTokens:x.totalTokens,contextLeft:x.contextLeftPercentage}},...pe!==void 0&&{metrics:pe}}}function av(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 ov(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function sv(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 cv=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,lv=`{{ \$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 (${cv}) (basename .project_dir) (ne (${cv}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,uv={branch:`primary`,staged:`success`,unstaged:`warning`,untracked:`accent`,conflicts:`error`,ahead:`success`,behind:`warning`,stash:`accent`},dv=(e,t)=>`{{ fg (color "${uv[e]}") ${t} }}`,fv=`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,pv=`{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} ({{ \$first := true }}{{ if gt .git.staged 0 }}${dv(`staged`,`(printf "+%v" .git.staged)`)}{{ $first = false }}{{ end }}{{ if gt .git.unstaged 0 }}{{ if not $first }} {{ end }}${dv(`unstaged`,`(printf "~%v" .git.unstaged)`)}{{ $first = false }}{{ end }}{{ if gt .git.untracked 0 }}{{ if not $first }} {{ end }}${dv(`untracked`,`(printf "?%v" .git.untracked)`)}{{ $first = false }}{{ end }}{{ if gt .git.conflicts 0 }}{{ if not $first }} {{ end }}${dv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ $first = false }}{{ end }}){{ end }}`,mv=`{{ if ne .git.repoName "" }}{{ .git.repoName }} {{ end }}⎇ ${dv(`branch`,`.git.branch`)}{{ if .git.sha }} ♯ {{ .git.sha }}{{ end }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${dv(`ahead`,`(printf "↑%v" .git.ahead)`)}{{ end }}{{ if gt .git.behind 0 }}${dv(`behind`,`(printf "↓%v" .git.behind)`)}{{ end }}{{ end }}`+pv+`{{ if .git.upstream }} →{{ .git.upstream }}{{ end }}{{ if gt .git.stash 0 }} ${dv(`stash`,`(printf "⧇ %v" .git.stash)`)}{{ end }} {{ if eq .git.status "conflicts" }}{{ fg (color "error") "⚠" }}{{ else }}{{ if eq .git.status "dirty" }}{{ fg (color "warning") "●" }}{{ else }}{{ fg (color "success") "✓" }}{{ end }}{{ end }}`;function hv(e,t){return`{{ if ge (round ${e}) ${t} }}error{{ else }}{{ if ge (round ${e}) 50 }}warning{{ else }}panel{{ end }}{{ end }}`}function gv(e){return`{{ if ge (round ${e}) 50 }}button-color-foreground{{ else }}foreground{{ end }}`}function _v(e,t,n){return`{{ if lt ${e} 0 }}panel{{ else }}{{ if lt ${e} ${n} }}error{{ else }}{{ if lt ${e} ${t} }}warning{{ else }}panel{{ end }}{{ end }}{{ end }}`}function vv(e,t){return`{{ if lt ${e} 0 }}foreground{{ else }}{{ if lt ${e} ${t} }}button-color-foreground{{ else }}foreground{{ end }}{{ end }}`}const yv={globals:{palette:`tokyo-night`},variables:{current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},"session.id":{kind:`input`,path:`session_id`,default:``},version:{kind:`input`,path:`version`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"hue.step":{kind:`literal`,value:14},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,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.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},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"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},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"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},"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},activeStyle:{kind:`state`,key:`style`,default:``}},segments:{directory:{template:lv,bg:`surface`,fg:`foreground`},model:{template:`✱ {{ formatModelName .model.display_name }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .model.display_name "" }}`},sessionId:{template:`⌗{{ trunc 8 .session.id }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .session.id "" }}`},version:{template:`◈ v{{ .version }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .version "" }}`},tmux:{template:`tmux:{{ .tmux.session | default "none" }}`,bg:`surface-active`,fg:`foreground`,when:`{{ ne .tmux.session "" }}`},git:{template:mv,bg:`surface-active`,fg:fv,when:`{{ ne .git.branch "" }}`},gitaculous:{template:`(git){{ if ne .git.repoName "" }} {{ .git.repoName }}{{ end }}{{ if ne .git.operation "" }} [{{ .git.operation }}]{{ end }}{{ if ne .git.sha "" }} {{ .git.sha }}{{ end }}{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} {{ if gt .git.staged 0 }}${dv(`staged`,`"S"`)}{{ end }}{{ if gt .git.unstaged 0 }}${dv(`unstaged`,`"U"`)}{{ end }}{{ if gt .git.untracked 0 }}${dv(`untracked`,`"?"`)}{{ end }}{{ if gt .git.conflicts 0 }}${dv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ end }}{{ end }} ⎇ ${dv(`branch`,`.git.branch`)}{{ if ne .git.upstream "" }} [{{ .git.upstream }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${dv(`ahead`,`(printf "+%v" .git.ahead)`)}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}${dv(`behind`,`(printf "-%v" .git.behind)`)}{{ end }}{{ end }}]{{ end }}{{ if gt .git.stash 0 }} ${dv(`stash`,`(printf "(%v stashed)" .git.stash)`)}{{ end }}{{ if gt .git.timeSinceCommit 0 }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,bg:`surface-active`,fg:fv,when:`{{ ne .git.branch "" }}`},gitPr:{template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,bg:`surface-active`,fg:`foreground`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{template:`{{ action "copySession" "⎘ id" }} {{ action "openProject" "↗ proj" }} {{ action "openTranscript" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,bg:`surface`,fg:`foreground`},session:{template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .session.budget.amount "warn" .session.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},today:{template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .today.budget.amount "warn" .today.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},block:{template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .block.resetsAt) }})`,bg:hv(`.block.nativeUtilization`,`.block.budget.warningThreshold`),fg:gv(`.block.nativeUtilization`),when:`{{ gt .block.resetsAt 0 }}`},weekly:{template:`◑ {{ round .weekly.percentage }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .weekly.resetsAt) }})`,bg:hv(`.weekly.percentage`,`.weekly.budget.warningThreshold`),fg:gv(`.weekly.percentage`),when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:_v(`.block.etaMinutes`,`.burn.eta.warnMinutes`,`.burn.eta.errorMinutes`),fg:vv(`.block.etaMinutes`,`.burn.eta.warnMinutes`),when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,bg:`panel`,fg:`foreground`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{template:`⚡ {{ sparkline .speed.history 24 }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .speed.history "" }}`},cacheTimer:{template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,bg:`surface`,fg:`{{ if le (minutesUntilReset .cache.expiresAt) 8 }}error{{ else }}{{ if le (minutesUntilReset .cache.expiresAt) 20 }}warning{{ else }}foreground{{ end }}{{ end }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ if le .context.contextLeft 20 }}error{{ else }}{{ if le .context.contextLeft 40 }}warning{{ else }}surface-active{{ end }}{{ end }}`,fg:`{{ if le .context.contextLeft 40 }}button-color-foreground{{ else }}foreground{{ end }}`,when:`{{ gt .context.totalTokens 0 }}`},metrics:{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 }} `,bg:`panel`,fg:`foreground`,when:`{{ or .metrics.lastResponseTime .metrics.responseTime .metrics.sessionDuration .metrics.messageCount .metrics.linesAdded .metrics.linesRemoved }}`},styleControl:{template:`✦ {{ if .activeStyle }}{{ .activeStyle }}{{ else }}(default){{ end }} {{ menu "applyStyle" }} 📌{{ menu "applyStyleForever" (dict "key" "pickersForever") }} {{ action "resetStyle" "↺" }}`,bg:`surface`,fg:`foreground`},themeControl:{template:`🎨 {{ .theme.effective }} {{ menu "applyTheme" (dict "key" "pickers") }} 📌{{ menu "applyThemeForever" (dict "key" "pickersForever") }} {{ action "resetTheme" "↺" }}`,bg:`surface`,fg:`foreground`},lookControl:{template:`◐ {{ .look.effective }} {{ menu "applyLook" (dict "key" "pickers" "closeOnPick" true) }} 📌{{ menu "applyLookForever" (dict "key" "pickersForever" "closeOnPick" true) }} {{ action "resetLook" "↺" }}`,bg:`surface`,fg:`foreground`},charsetControl:{template:`{{ .charset.effective }} {{ menu "applyCharsetForever" }} {{ action "resetCharset" "↺" }}`,bg:`surface`,fg:`foreground`},colorCompatControl:{template:`{{ .colorCompatibility.effective }} {{ menu "applyColorCompatForever" }} {{ action "resetColorCompat" "↺" }}`,bg:`surface`,fg:`foreground`},wrapToggleControl:{template:`{{ action "toggleWrapForever" "wrap: on" "wrap: off" }} {{ action "resetAutoWrap" "↺" }}`,bg:`surface`,fg:`foreground`},paddingControl:{template:`{{ action "paddingDownForever" "◀" }} padding {{ .padding.effective }} {{ action "paddingUpForever" "▶" }} {{ action "resetPadding" "↺" }}`,bg:`surface`,fg:`foreground`},directoryPaletteControl:{template:`🎨 directory {{ menu "applyDirectoryPaletteForever" }} {{ action "resetDirectoryPalette" "↺" }}`,bg:`surface`,fg:`foreground`}},root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`toolbar`},{kind:`group`,name:`settings`,label:`⚙ settings`,direction:`horizontal`,children:[`themeControl`,`lookControl`,`styleControl`,`charsetControl`,`colorCompatControl`,`wrapToggleControl`,`paddingControl`,`directoryPaletteControl`]}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`}]}]},actions:{copySession:{copy:`{{ .session.id }}`},copyDir:{copy:`{{ .current_dir }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},applyStyle:{set:`style`,from:`styles`},applyTheme:{set:`theme`,from:`themes`},applyLook:{set:`look`,from:`looks`},applyThemeForever:{persist:`palette`,from:`themes`},resetTheme:{reset:`palette`},applyStyleForever:{persist:`style`,from:`styles`},resetStyle:{reset:`style`},applyLookForever:{persist:`look`,from:`looks`},resetLook:{reset:`look`},applyCharsetForever:{persist:`charset`,from:`charsets`},resetCharset:{reset:`charset`},applyColorCompatForever:{persist:`colorCompatibility`,from:`colorCompatibilities`},resetColorCompat:{reset:`colorCompatibility`},toggleWrapForever:{persist:`autoWrap`,cycle:[`true`,`false`]},resetAutoWrap:{reset:`autoWrap`},paddingDownForever:{persist:`padding`,min:0,max:16,by:-1},paddingUpForever:{persist:`padding`,min:0,max:16,by:1},resetPadding:{reset:`padding`},applyDirectoryPaletteForever:{persist:`segments.directory.palette`,from:`themes`},resetDirectoryPalette:{reset:`segments.directory.palette`}},looks:{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:{}},helpers:{formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,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 }}`}},bv=new Set([yv.globals.palette,...Object.values(yv.segments).map(e=>e.palette)].filter(e=>e!==void 0)),xv=tl(z_(`<default>`,JSON.stringify(yv),bv),yv);function Sv(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function Cv(e){return typeof e==`string`?e:String(e)}function wv(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function Tv(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}const Ev=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,Dv=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function Ov(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(Ev);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(Dv);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function kv(e){let t=e.match(Dv);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function Av(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function jv(e){return e.toLocaleString()}const Mv=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],Nv=Mv.length;function Pv(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(Nv-1));o+=Mv[t]}return o}function Fv(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}const Iv=gc(),Lv=[...bc];function Rv(){return{basename:{fn:e=>l(e),argTypes:[`string`]},dirname:{fn:e=>u(e),argTypes:[`string`]},abbreviatePath:{fn:e=>Av(e),argTypes:[`string`]},int:{fn:e=>wv(e),argTypes:[`value`]},string:{fn:e=>Cv(e),argTypes:[`value`]},bool:{fn:e=>Tv(e),argTypes:[`value`]},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`]},themes:{fn:()=>Iv,argTypes:[]},styles:{fn:()=>Lv,argTypes:[]},sparkline:{fn:(e,t)=>Pv(Fv(e),t),argTypes:[`string`,`int`]}}}function zv(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`]},formatInteger:{fn:e=>jv(e),argTypes:[`int`]},round:{fn:e=>Math.round(e),argTypes:[`float`]},formatModelName:{fn:e=>Ov(e),argTypes:[`string`]},shortenModelName:{fn:e=>kv(e),argTypes:[`string`]}}}function Bv(e,t=()=>new Date){return $d({fromString:e=>new Lo(e),toString:e=>e.plain,clock:t,missingKey:`error`,funcs:{...Wp(),...eg(),...Am(),...Qm(),...Ip(t),...Ef(),...im(),...dc(),...Rv(),...zv(t),...e??{}}})}function Vv(e){return Hv(e,new Set(e.names()),``)}function Hv(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return Hv(e,t,a)}})}function Uv(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(D(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function Wv(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}async function Gv(e){let t=await be({bin:`/bin/sh`,args:[`-c`,e],category:`user-shell`});return t.ok?{stdout:t.stdout,exitCode:t.exitCode??0}:{stdout:t.stdout,exitCode:t.exitCode??1}}async function Kv(e,t,n){let r;try{r=await te(e,`utf8`)}catch{return{error:`file unreadable: ${e}`}}if(n!==void 0){let t=new RegExp(n).exec(r);return t?.[1]?{content:t[1].replace(/\n/g,` `)}:{error:`regex no-match in "${e}"`}}return t===`first-line`?{content:(r.split(`
105
- `)[0]??``).trim()}:{content:r.replace(/\n/g,` `).trim()}}const qv=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],Jv=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Yv=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],Xv=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function Zv(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>qv[e.getMonth()]],[`Monday`,e=>Yv[e.getDay()]],[`Jan`,e=>Jv[e.getMonth()]],[`Mon`,e=>Xv[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const Qv={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function $v(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=Qv[t];try{return ry(r,e)}catch{return iy(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return Rn(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return Rn(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return Rn(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return Rn(e.stashCount,0)}}var ey=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},ty=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:T(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ie(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ie(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function ny(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function ry(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?Cv(e):t===`number`?wv(e):Tv(e)}function iy(e){return e===`number`?0:e===`boolean`?!1:``}var ay=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new ey;ttlMgr=new ty;gitSubscriptions=new Map;cleanups=[];inFlight=new Set;engine=Bv();gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new mr({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,Sv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){let r=Uv(e,n.cache);this.store.defineBox(e,`string`,this.stringInitial(n.varDefault));let i=()=>void this.updateFromShell(e,t,n.regex,n.varDefault);i(),this.registerCachePolicy(e,r,i)}declareFile(e,t,n){this.store.defineBox(e,`string`,this.stringInitial(n.varDefault));let r=()=>void this.updateFromFile(e,t,n.readMode,n.regex,n.varDefault);r(),this.registerCachePolicy(e,n.cache,r)}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=Vv(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){return this.recordError(e,t instanceof Error?t.message:String(t)),this.stringInitial(n.varDefault)}}),this.store.read(e)}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return Zv(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,Zv(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=Qv[t.field],r=t.varDefault===void 0?iy(n):ry(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map;i={fieldSubs:e,unsubscribe:this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,$v(t,n,i,this.defaultEmptyValue))})})},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault})}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(`session.id`);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=ny(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,ry(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}getLastError(e){return this.lastErrors.get(e)}dispose(){for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,Y.reaction)(()=>{let t=Vv(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,Y.reaction)(()=>t.varNames.map(e=>String(this.store.read(e))).join(`,`),n);this.cleanups.push(e);break}}}async updateFromShell(e,t,n,r){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let{stdout:i,exitCode:a}=await Gv(t);if(a!==0){this.applyFallback(e,`string`,r,`shell "${t}" exited with code ${a}`);return}if(n!==void 0){let a=new RegExp(n).exec(i);if(!a?.[1]){this.applyFallback(e,`string`,r,`regex no-match in output of "${t}"`);return}this.store.setBox(e,a[1].replace(/\n/g,` `))}else this.store.setBox(e,i.replace(/\n/g,` `).trim());this.lastErrors.delete(e)}finally{this.inFlight.delete(e)}}}async updateFromFile(e,t,n,r,i){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let a=await Kv(t,n,r);if(a.error!==void 0){this.applyFallback(e,`string`,i,a.error);return}this.store.setBox(e,a.content??``),this.lastErrors.delete(e)}finally{this.inFlight.delete(e)}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,ry(this.defaultEmptyValue,t))}catch{this.store.setBox(e,iy(t))}}defaultFor(e){try{return ry(this.defaultEmptyValue,e)}catch{return iy(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}};const oy={unicode:{},ascii:{glyph:`>`}},sy={unicode:{},ascii:{left:`(`,right:`)`}};function cy(e,t,n){switch(e){case`capsule`:return new Wo(sy[t]);case`plain`:return new Go(n===void 0?{}:{separator:n});case`powerline`:return new Uo(oy[t]);default:return e}}function ly(e){switch(e){case`powerline`:return 1;case`capsule`:return 2;case`plain`:return 0;default:return e}}function uy(e,t){if(e.length===0)return``;let n=cy(t.style,t.charset,t.separator);if(t.wrap&&Number.isFinite(t.width)){let r=Jo(new os([...e],{joiner:n}),{width:t.width,colorSystem:t.colorCompatibility});return r.endsWith(`
106
- `)?r.slice(0,-1):r}return Jo(new Ro([...e],n),{colorSystem:t.colorCompatibility})}const dy=new Map,fy=new Map;function py(e){let t=pc(e),n=dy.get(t);if(n!==void 0)return n;let r=eo(t);if(r===null)throw Error(`Palette "${e}" (resolved "${t}") did not resolve in the theme registry — allowed names and the registry are inconsistent`);return dy.set(t,r),r}function my(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=fy.get(n);if(r!==void 0)return r;let i=po(e,t);return fy.set(n,i),i}function hy(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=gy(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(a.style.link){i();let e=gy([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function gy(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>_y(e,t)):e,r=Lo.fromFragments(n);return r.end=``,r.noWrap=!0,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function _y(e,t){let n=e.copy();return n.style=t.add(e.style),n}function vy(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function yy(e,t){let n=Lo.fromFragments(e);return n.end=``,n.noWrap=!0,t!==void 0&&!t.isNull&&(n.style=t),n}function by(e,t){let{width:n,justify:r,truncate:i,truncateMarker:a=`…`,baseStyle:o,padding:s}=t;if(e.length===0)return[];let c=yy(e,o).pad(s);return n===`auto`||(c.cellLength>n?c.truncate(n,{mode:i,marker:a}):c.cellLength<n&&c.align(r,n)),[c]}var xy=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Sy(e,t,n,r,i,a){let o={segName:t,palette:n,bg:void 0};e.current=o;let s=Cy(r,a),c=s===void 0?void 0:wy(n,s,`bg`);o.bg=c;let l=Cy(i,a),u=l===void 0?void 0:wy(n,l,`fg`);return new q({bgcolor:c===void 0?void 0:K.fromRgba(c),color:u===void 0?void 0:K.fromRgba(u)})}function Cy(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function wy(e,t,n){try{return Pa(e,t)}catch(e){throw e instanceof ja?new xy(t,n,e.message):e}}const Ty=new Map([[`palette`,`theme.effective`],[`look`,`look.effective`],[`style`,`style.effective`],[`charset`,`charset.effective`],[`colorCompatibility`,`colorCompatibility.effective`],[`autoWrap`,`autoWrap.effective`],[`padding`,`padding.effective`]]);function Ey(e,t,n,r){let i=new Map;for(let[a,o]of Object.entries(t))i.set(a,Dy(e,a,o,n,r));return i}function Dy(e,t,n,r,i){if(`set`in n){let e=r.get(n.set)??n.set;return`to`in n?{kind:`set-literal`,key:n.set,value:n.to,stateVar:e}:`from`in n?{kind:`set-option`,key:n.set,stateVar:e,options:[...u_(n.from,i)]}:`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=Ty.get(n.persist)??n.persist;return`to`in n?{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e}:`from`in n?{kind:`persist-option`,key:n.persist,stateVar:e,options:[...u_(n.from,i)]}:`cycle`in n?{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle}:{kind:`persist-bounded`,key:n.persist,by:n.by}}return`copy`in n?{kind:`copy`,text:Oy(e,n.copy,t)}:`open`in n?{kind:`open`,target:Oy(e,n.open,t)}:{kind:`reset`,key:n.reset}}function Oy(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function ky(e,t){return e.has(t)?Cv(e.read(t)):``}function Ay(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function jy(e,t,n){let r=new Lo(e,{style:new q({link:t,bold:n})});return r.noWrap=!0,r.end=``,r}function My(e,t){return Math.max(e.members.indexOf(ky(t,e.stateVar)),0)}function Ny(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=ky(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,e.value]},active:t===e.value}}case`set-option`:{let a=n??t,o=ky(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,a]},active:o===a}}case`set-int`:{let a=n??t,o=ky(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,a]},active:o===a}}case`set-cycle`:{let t=e.members[(My(e,r)+1)%e.members.length];return{effect:{verb:Ct,args:[i,e.key,t]},active:!1}}case`set-bounded`:return{effect:{verb:wt,args:[i,e.key,String(e.by)]},active:!1};case`copy`:return{effect:{verb:Tt,args:[Ay(e.text,Vv(r))]},active:!1};case`open`:return{effect:{verb:Et,args:[Ay(e.target,Vv(r))]},active:!1};case`persist-literal`:{let t=ky(r,e.stateVar);return{effect:{verb:kt,args:[i,e.key,e.value]},active:t===e.value}}case`persist-option`:{let a=n??t,o=ky(r,e.stateVar);return{effect:{verb:kt,args:[i,e.key,a]},active:o===a}}case`persist-cycle`:{let t=e.members[(My(e,r)+1)%e.members.length];return{effect:{verb:kt,args:[i,e.key,t]},active:!1}}case`persist-bounded`:return{effect:{verb:At,args:[i,e.key,String(e.by)]},active:!1};case`reset`:return{effect:{verb:jt,args:[i,e.key]},active:!1}}}function Py(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`){if(n.length!==1&&n.length!==t.members.length)throw Error(`action "${e}" cycles ${t.members.length} members; bind one display per member (${t.members.length}) or one static display, got ${n.length}`);return{display:n.length===1?n[0]:n[My(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 Fy(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}=Py(e,r,t,i),{effect:s,active:c}=Ny(r,a,o,i,ky(i,`session.id`));return jy(a,Pt([s]),c)}function Iy(e){return{action:{fn:(t,...n)=>Fy(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function Ly(e){return new Lo(e).cellLength}function Ry(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 zy(e,t){let n=[];for(let t of e)n.length>0&&n.push(new Lo(` `)),n.push(t);let r=Lo.fromFragments(n);return r.noWrap=t,r.end=``,r}function By(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 Vy(e,t){let n=e.compiled.get(t);if(!n||n.kind!==`set-option`&&n.kind!==`persist-option`)throw Error(`picker references action "${t}" which must be a set-option or persist-option action ({ set, from } or { persist, from }), got ${n?`a ${n.kind} action`:`no such action`}`);return n}function Hy(e,t,n,r,i,a){let o=Vy(a,e),s=a.store,c=ky(s,`session.id`),l=ky(s,o.stateVar),u=o.options.map(Ly),d=i?Math.max(1,wv(s.read(`term.cols`))-ly(a.stripStyle)-2*a.padding):1/0,f=Ly(`✕`)+1,p=Ly(`←`)+1+Ly(`→`)+1,m=Ry(u,d,f),h=m.length>1?Ry(u,d,f+p):m,g=parseInt(ky(s,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>Pt([{verb:Ct,args:[c,t.key,String(e)]}]),b=n.flatMap(([e,t])=>[e,t]),x=Pt([{verb:Ct,args:[c,...b]}]),S=e=>o.kind===`persist-option`?Pt([{verb:kt,args:[c,o.key,e]},...r?[{verb:Ct,args:[c,...b]}]:[]]):Pt([{verb:Ct,args:[c,o.key,e,...r?b:[]]}]),C=[jy(`✕`,x,!1)];_>0&&C.push(jy(`←`,y(_-1),!1));for(let e of v){let t=o.options[e];C.push(jy(t,S(t),t===l))}return _<h.length-1&&C.push(jy(`→`,y(_+1),!1)),zy(C,i)}function Uy(e){return{picker:{fn:(t,n,r,i)=>{let a=By(e,n,`set-int`,`an int action ({ set, int: true })`);return Hy(t,{key:a.key,stateVar:a.stateVar},[[a.key,`-1`]],r===!0,i===!0,e)},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}const Wy=Symbol(`cc-candybar.menuDrop`);function Gy(e){return e.flatMap(e=>e[Wy]??[])}function Ky(e,t,n){let r=n.activeSegment.current;if(r===null)throw Error(`{{ menu }} rendered with no active segment placement — the render walk must publish one before evaluating a segment template`);let i=n.action,a=ig(r.segName,e,t.key),o=og(a),s=rg(e),c=ky(i.store,a)===s,l=ky(i.store,`session.id`),u=jy(c?`▾`:`▸`,Pt([{verb:Ct,args:[l,a,c?It:s,o,`0`]}]),!1);return u[Wy]=c?[Hy(e,{key:o,stateVar:o},[[a,It],[o,`0`]],t.closeOnPick,t.paged,i)]:[],u}function qy(e){return{menu:{fn:(t,n)=>Ky(t,sg(n??{}),e),argTypes:[`string`,`dict`],returnType:`T`}}}function Jy(){return{current:null}}function Yy(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 Xy(e){let t={fn:(()=>{let t=Yy(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:[],returnType:`string`};return{...uc(()=>Yy(e,`color`).palette),bgOf:t}}function Zy(e){let t=[],n=[];for(let r of e){if(!r.contains(`
103
+ Single-row example: root: { h: ["seg1", "seg2"] }`,line:Z(e.source,[`layout`])}),t.root!==void 0&&(n.root=ou(e,`root`,t.root)),t.actions!==void 0&&(n.actions=yg(e,t.actions)),t.looks!==void 0&&(n.looks=Yg(e,t.looks)),t.presets!==void 0&&(n.presets=Zg(e,t.presets)),t.helpers!==void 0&&(n.helpers=Qg(e,t.helpers)),_u(e,n),mg(e,n),n}const U_=new Set([`globals`,`variables`,`segments`,`layout`,`root`,`actions`,`looks`,`presets`,`helpers`]),W_=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function G_(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 K_(e){let t=await q_(e);return t.kind===`ok`?I(Math.floor((t.value+36e5)/1e3)):t}async function q_(e){for(let t of[65536,1048576]){let n=await Tr(e,t);if(n.kind!==`ok`)return n;let r=J_(n.value.buf,n.value.fromStart);if(r!=null)return I(r);if(n.value.fromStart)return L}return L}function J_(e,t){let n=e.toString(`utf8`).split(`
104
+ `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!W_.test(t))continue;let r=G_(t);if(r!=null)return r}return null}const Y_=10*1e3;function X_(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 Z_(e,t){if(!(t<60))return e*3600/t}function Q_(e,t,n,r){let i=r-t;if(i<50||i>Y_)return;let a=n-e;if(!(a<=0))return a*1e3/i}function $_(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Q_(t.input,t.atMs,n.input,n.atMs),i=Q_(t.output,t.atMs,n.output,n.atMs),a=Q_(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 ev(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>Y_)continue;let o=Q_(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function tv(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,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}`,i);let n=[],r=new Set;for(let t of Jr(e.root)){if(t.when)for(let e of __(t.when))n.push(e);if(t.kind!==`segment`)continue;let r=e.segments[t.name];if(r){for(let e of[r.template,r.when,r.bg,r.fg])if(e)for(let t of __(e))n.push(t)}}let i=new Set;for(;n.length>0;){let e=n.pop();for(let a of nv(t,e)){if(r.has(a))continue;r.add(a);let e=t.get(a);if(e){if(e.kind===`input`)i.add(e.path);else if(e.kind===`template`)for(let t of __(e.template))n.push(t)}}}return i}function nv(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 rv(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function iv(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 av(e,t,n,r,i){let a=e=>rv(r,e),o=(t.clock??(()=>new Date))().getTime(),s=(e,t,n)=>t?n().catch(t=>Ln(`${e}: ${String(t)}`)):Promise.resolve(L),[c,l,u,d,f,p,m,h]=await Promise.all([s(`git`,a(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,iv(r),e.workspace?.project_dir)),s(`session`,a(`session.cost`)||a(`session.tokens`)||a(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),s(`today`,a(`today`),()=>t.usageStore.getTodayInfo(e)),s(`context`,a(`context`),()=>t.contextProvider.getContextInfo(e)),s(`metrics`,a(`metrics`)||a(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),s(`tmux`,a(`tmux`),()=>t.tmuxService.getSessionId()),s(`cache`,a(`cache`),()=>K_(e.transcript_path)),s(`speed`,a(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,o))]),g=[],_=e=>{if(e.kind===`failed`){g.push(e.reason);return}return e.kind===`ok`?e.value:void 0},v=cv(c);g.push(...v.failures);let y=_(l),b=_(u),x=_(d),S=_(f),C=_(p),ee=_(m);for(let e of g)t.log(`warn`,`provider fetch failed: ${e}`);let te=e.rate_limits?.five_hour,w=e.rate_limits?.seven_day,ne=te?X_(te.used_percentage,te.resets_at,18e6,o):void 0,re=w?X_(w.used_percentage,w.resets_at,6048e5,o):void 0,ie=y?.session.cost,T=S?.sessionDuration,E=a(`burn`)&&ie!=null&&T!=null?Z_(ie,T):void 0,ae=_(h),oe=ae===void 0?void 0:$_(ae),se=ae===void 0?void 0:ev(ae),ce=oe!==void 0||se!==void 0?{...oe,...se!==void 0&&{history:se}}:void 0,le=sv(process.env.HOME??process.env.USERPROFILE),ue=e.workspace?{...e.workspace,current_dir:sv(e.workspace.current_dir)??``,project_dir:sv(e.workspace.project_dir)??``}:e.workspace,de=y===void 0?void 0:ov({cost:y.session.cost,tokens:y.session.tokens}),fe=b===void 0?void 0:{cost:b.cost,tokens:b.tokens},pe=S===void 0?void 0:ov({lastResponseTime:S.lastResponseTime,responseTime:S.responseTime,sessionDuration:S.sessionDuration,messageCount:S.messageCount,linesAdded:S.linesAdded,linesRemoved:S.linesRemoved});return{...e,...ue!==void 0&&{workspace:ue},...le!==void 0&&{home:le},...v.git!==void 0&&{git:v.git},...C!==void 0&&{tmux:{session:C}},theme:{effective:i.theme},look:{effective:i.look},preset:{effective:i.preset},style:{effective:i.style},charset:{effective:i.charset},colorCompatibility:{effective:i.colorCompatibility},autoWrap:{effective:i.autoWrap},padding:{effective:i.padding},...de!==void 0&&{session:de},...fe!==void 0&&{today:fe},...E!==void 0&&{burn:{costPerHour:E}},...ce!==void 0&&{speed:ce},...a(`block`)&&te!==void 0&&{block:{nativeUtilization:te.used_percentage,resetsAt:te.resets_at,...ne!==void 0&&{etaMinutes:ne}}},...w!==void 0&&{weekly:{percentage:w.used_percentage,resetsAt:w.resets_at,...re!==void 0&&{etaMinutes:re}}},...ee!==void 0&&{cache:{expiresAt:ee}},...x!==void 0&&{context:{totalTokens:x.totalTokens,contextLeft:x.contextLeftPercentage}},...pe!==void 0&&{metrics:pe}}}function ov(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 sv(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function cv(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 lv=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,uv=`{{ \$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 (${lv}) (basename .project_dir) (ne (${lv}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,dv={branch:`primary`,staged:`success`,unstaged:`warning`,untracked:`accent`,conflicts:`error`,ahead:`success`,behind:`warning`,stash:`accent`},fv=(e,t)=>`{{ fg (color "${dv[e]}") ${t} }}`,pv=`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,mv=`{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} ({{ \$first := true }}{{ if gt .git.staged 0 }}${fv(`staged`,`(printf "+%v" .git.staged)`)}{{ $first = false }}{{ end }}{{ if gt .git.unstaged 0 }}{{ if not $first }} {{ end }}${fv(`unstaged`,`(printf "~%v" .git.unstaged)`)}{{ $first = false }}{{ end }}{{ if gt .git.untracked 0 }}{{ if not $first }} {{ end }}${fv(`untracked`,`(printf "?%v" .git.untracked)`)}{{ $first = false }}{{ end }}{{ if gt .git.conflicts 0 }}{{ if not $first }} {{ end }}${fv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ $first = false }}{{ end }}){{ end }}`,hv=`{{ if ne .git.repoName "" }}{{ .git.repoName }} {{ end }}⎇ ${fv(`branch`,`.git.branch`)}{{ if .git.sha }} ♯ {{ .git.sha }}{{ end }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${fv(`ahead`,`(printf "↑%v" .git.ahead)`)}{{ end }}{{ if gt .git.behind 0 }}${fv(`behind`,`(printf "↓%v" .git.behind)`)}{{ end }}{{ end }}`+mv+`{{ if .git.upstream }} →{{ .git.upstream }}{{ end }}{{ if gt .git.stash 0 }} ${fv(`stash`,`(printf "⧇ %v" .git.stash)`)}{{ end }} {{ if eq .git.status "conflicts" }}{{ fg (color "error") "⚠" }}{{ else }}{{ if eq .git.status "dirty" }}{{ fg (color "warning") "●" }}{{ else }}{{ fg (color "success") "✓" }}{{ end }}{{ end }}`;function gv(e,t){return`{{ if ge (round ${e}) ${t} }}error{{ else }}{{ if ge (round ${e}) 50 }}warning{{ else }}panel{{ end }}{{ end }}`}function _v(e){return`{{ if ge (round ${e}) 50 }}button-color-foreground{{ else }}foreground{{ end }}`}function vv(e,t,n){return`{{ if lt ${e} 0 }}panel{{ else }}{{ if lt ${e} ${n} }}error{{ else }}{{ if lt ${e} ${t} }}warning{{ else }}panel{{ end }}{{ end }}{{ end }}`}function yv(e,t){return`{{ if lt ${e} 0 }}foreground{{ else }}{{ if lt ${e} ${t} }}button-color-foreground{{ else }}foreground{{ end }}{{ end }}`}const bv={globals:{palette:`tokyo-night`},variables:{current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},"session.id":{kind:`input`,path:`session_id`,default:``},version:{kind:`input`,path:`version`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"hue.step":{kind:`literal`,value:14},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,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.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},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"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},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"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},"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},activeStyle:{kind:`state`,key:`style`,default:``}},segments:{directory:{template:uv,bg:`surface`,fg:`foreground`},model:{template:`✱ {{ formatModelName .model.display_name }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .model.display_name "" }}`},sessionId:{template:`⌗{{ trunc 8 .session.id }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .session.id "" }}`},version:{template:`◈ v{{ .version }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .version "" }}`},tmux:{template:`tmux:{{ .tmux.session | default "none" }}`,bg:`surface-active`,fg:`foreground`,when:`{{ ne .tmux.session "" }}`},git:{template:hv,bg:`surface-active`,fg:pv,when:`{{ ne .git.branch "" }}`},gitaculous:{template:`(git){{ if ne .git.repoName "" }} {{ .git.repoName }}{{ end }}{{ if ne .git.operation "" }} [{{ .git.operation }}]{{ end }}{{ if ne .git.sha "" }} {{ .git.sha }}{{ end }}{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} {{ if gt .git.staged 0 }}${fv(`staged`,`"S"`)}{{ end }}{{ if gt .git.unstaged 0 }}${fv(`unstaged`,`"U"`)}{{ end }}{{ if gt .git.untracked 0 }}${fv(`untracked`,`"?"`)}{{ end }}{{ if gt .git.conflicts 0 }}${fv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ end }}{{ end }} ⎇ ${fv(`branch`,`.git.branch`)}{{ if ne .git.upstream "" }} [{{ .git.upstream }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${fv(`ahead`,`(printf "+%v" .git.ahead)`)}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}${fv(`behind`,`(printf "-%v" .git.behind)`)}{{ end }}{{ end }}]{{ end }}{{ if gt .git.stash 0 }} ${fv(`stash`,`(printf "(%v stashed)" .git.stash)`)}{{ end }}{{ if gt .git.timeSinceCommit 0 }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,bg:`surface-active`,fg:pv,when:`{{ ne .git.branch "" }}`},gitPr:{template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,bg:`surface-active`,fg:`foreground`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{template:`{{ action "copySession" "⎘ id" }} {{ action "openProject" "↗ proj" }} {{ action "openTranscript" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,bg:`surface`,fg:`foreground`},session:{template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .session.budget.amount "warn" .session.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},today:{template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .today.budget.amount "warn" .today.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},block:{template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .block.resetsAt) }})`,bg:gv(`.block.nativeUtilization`,`.block.budget.warningThreshold`),fg:_v(`.block.nativeUtilization`),when:`{{ gt .block.resetsAt 0 }}`},weekly:{template:`◑ {{ round .weekly.percentage }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .weekly.resetsAt) }})`,bg:gv(`.weekly.percentage`,`.weekly.budget.warningThreshold`),fg:_v(`.weekly.percentage`),when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:vv(`.block.etaMinutes`,`.burn.eta.warnMinutes`,`.burn.eta.errorMinutes`),fg:yv(`.block.etaMinutes`,`.burn.eta.warnMinutes`),when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,bg:`panel`,fg:`foreground`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{template:`⚡ {{ sparkline .speed.history 24 }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .speed.history "" }}`},cacheTimer:{template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,bg:`surface`,fg:`{{ if le (minutesUntilReset .cache.expiresAt) 8 }}error{{ else }}{{ if le (minutesUntilReset .cache.expiresAt) 20 }}warning{{ else }}foreground{{ end }}{{ end }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ if le .context.contextLeft 20 }}error{{ else }}{{ if le .context.contextLeft 40 }}warning{{ else }}surface-active{{ end }}{{ end }}`,fg:`{{ if le .context.contextLeft 40 }}button-color-foreground{{ else }}foreground{{ end }}`,when:`{{ gt .context.totalTokens 0 }}`},metrics:{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 }} `,bg:`panel`,fg:`foreground`,when:`{{ or .metrics.lastResponseTime .metrics.responseTime .metrics.sessionDuration .metrics.messageCount .metrics.linesAdded .metrics.linesRemoved }}`},styleControl:{template:`✦ {{ if .activeStyle }}{{ .activeStyle }}{{ else }}(default){{ end }} {{ menu "applyStyle" }} 📌{{ menu "applyStyleForever" (dict "key" "pickersForever") }} {{ action "resetStyle" "↺" }}`,bg:`surface`,fg:`foreground`},themeControl:{template:`🎨 {{ .theme.effective }} {{ menu "applyTheme" (dict "key" "pickers") }} 📌{{ menu "applyThemeForever" (dict "key" "pickersForever") }} {{ action "resetTheme" "↺" }}`,bg:`surface`,fg:`foreground`},lookControl:{template:`◐ {{ .look.effective }} {{ menu "applyLook" (dict "key" "pickers" "closeOnPick" true) }} 📌{{ menu "applyLookForever" (dict "key" "pickersForever" "closeOnPick" true) }} {{ action "resetLook" "↺" }}`,bg:`surface`,fg:`foreground`},charsetControl:{template:`{{ .charset.effective }} {{ menu "applyCharsetForever" }} {{ action "resetCharset" "↺" }}`,bg:`surface`,fg:`foreground`},colorCompatControl:{template:`{{ .colorCompatibility.effective }} {{ menu "applyColorCompatForever" }} {{ action "resetColorCompat" "↺" }}`,bg:`surface`,fg:`foreground`},wrapToggleControl:{template:`{{ action "toggleWrapForever" "wrap: on" "wrap: off" }} {{ action "resetAutoWrap" "↺" }}`,bg:`surface`,fg:`foreground`},paddingControl:{template:`{{ action "paddingDownForever" "◀" }} padding {{ .padding.effective }} {{ action "paddingUpForever" "▶" }} {{ action "resetPadding" "↺" }}`,bg:`surface`,fg:`foreground`},directoryPaletteControl:{template:`🎨 directory {{ menu "applyDirectoryPaletteForever" }} {{ action "resetDirectoryPalette" "↺" }}`,bg:`surface`,fg:`foreground`}},root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`toolbar`},{kind:`group`,name:`settings`,label:`⚙ settings`,direction:`horizontal`,children:[`themeControl`,`lookControl`,`styleControl`,`charsetControl`,`colorCompatControl`,`wrapToggleControl`,`paddingControl`,`directoryPaletteControl`]}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`}]}]},actions:{copySession:{copy:`{{ .session.id }}`},copyDir:{copy:`{{ .current_dir }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},applyStyle:{set:`style`,from:`styles`},applyTheme:{set:`theme`,from:`themes`},applyLook:{set:`look`,from:`looks`},applyThemeForever:{persist:`palette`,from:`themes`},resetTheme:{reset:`palette`},applyStyleForever:{persist:`style`,from:`styles`},resetStyle:{reset:`style`},applyLookForever:{persist:`look`,from:`looks`},resetLook:{reset:`look`},applyCharsetForever:{persist:`charset`,from:`charsets`},resetCharset:{reset:`charset`},applyColorCompatForever:{persist:`colorCompatibility`,from:`colorCompatibilities`},resetColorCompat:{reset:`colorCompatibility`},toggleWrapForever:{persist:`autoWrap`,cycle:[`true`,`false`]},resetAutoWrap:{reset:`autoWrap`},paddingDownForever:{persist:`padding`,min:0,max:16,by:-1},paddingUpForever:{persist:`padding`,min:0,max:16,by:1},resetPadding:{reset:`padding`},applyDirectoryPaletteForever:{persist:`segments.directory.palette`,from:`themes`},resetDirectoryPalette:{reset:`segments.directory.palette`}},looks:{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:{}},helpers:{formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,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 }}`}},xv=new Set([bv.globals.palette,...Object.values(bv.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Sv=tl(B_(`<default>`,JSON.stringify(bv),xv),bv);function Cv(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function wv(e){return typeof e==`string`?e:String(e)}function Tv(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function Ev(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}const Dv=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,Ov=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function kv(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(Dv);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(Ov);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function Av(e){let t=e.match(Ov);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function jv(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function Mv(e){return e.toLocaleString()}const Nv=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],Pv=Nv.length;function Fv(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(Pv-1));o+=Nv[t]}return o}function Iv(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}const Lv=gc(),Rv=[...bc];function zv(){return{basename:{fn:e=>l(e),argTypes:[`string`]},dirname:{fn:e=>u(e),argTypes:[`string`]},abbreviatePath:{fn:e=>jv(e),argTypes:[`string`]},int:{fn:e=>Tv(e),argTypes:[`value`]},string:{fn:e=>wv(e),argTypes:[`value`]},bool:{fn:e=>Ev(e),argTypes:[`value`]},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`]},themes:{fn:()=>Lv,argTypes:[]},styles:{fn:()=>Rv,argTypes:[]},sparkline:{fn:(e,t)=>Fv(Iv(e),t),argTypes:[`string`,`int`]}}}function Bv(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`]},formatInteger:{fn:e=>Mv(e),argTypes:[`int`]},round:{fn:e=>Math.round(e),argTypes:[`float`]},formatModelName:{fn:e=>kv(e),argTypes:[`string`]},shortenModelName:{fn:e=>Av(e),argTypes:[`string`]}}}function Vv(e,t=()=>new Date){return $d({fromString:e=>new Lo(e),toString:e=>e.plain,clock:t,missingKey:`error`,funcs:{...Wp(),...eg(),...Am(),...Qm(),...Ip(t),...Ef(),...im(),...dc(),...zv(),...Bv(t),...e??{}}})}function Hv(e){return Uv(e,new Set(e.names()),``)}function Uv(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return Uv(e,t,a)}})}function Wv(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(D(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function Gv(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}async function Kv(e){let t=await be({bin:`/bin/sh`,args:[`-c`,e],category:`user-shell`});return t.ok?{stdout:t.stdout,exitCode:t.exitCode??0}:{stdout:t.stdout,exitCode:t.exitCode??1}}async function qv(e,t,n){let r;try{r=await te(e,`utf8`)}catch{return{error:`file unreadable: ${e}`}}if(n!==void 0){let t=new RegExp(n).exec(r);return t?.[1]?{content:t[1].replace(/\n/g,` `)}:{error:`regex no-match in "${e}"`}}return t===`first-line`?{content:(r.split(`
105
+ `)[0]??``).trim()}:{content:r.replace(/\n/g,` `).trim()}}const Jv=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],Yv=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Xv=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],Zv=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function Qv(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>Jv[e.getMonth()]],[`Monday`,e=>Xv[e.getDay()]],[`Jan`,e=>Yv[e.getMonth()]],[`Mon`,e=>Zv[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const $v={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function ey(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=$v[t];try{return iy(r,e)}catch{return ay(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return Rn(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return Rn(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return Rn(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return Rn(e.stashCount,0)}}var ty=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},ny=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:T(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ie(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ie(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function ry(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function iy(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?wv(e):t===`number`?Tv(e):Ev(e)}function ay(e){return e===`number`?0:e===`boolean`?!1:``}var oy=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new ty;ttlMgr=new ny;gitSubscriptions=new Map;cleanups=[];inFlight=new Set;engine=Vv();gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new mr({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,Cv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){let r=Wv(e,n.cache);this.store.defineBox(e,`string`,this.stringInitial(n.varDefault));let i=()=>void this.updateFromShell(e,t,n.regex,n.varDefault);i(),this.registerCachePolicy(e,r,i)}declareFile(e,t,n){this.store.defineBox(e,`string`,this.stringInitial(n.varDefault));let r=()=>void this.updateFromFile(e,t,n.readMode,n.regex,n.varDefault);r(),this.registerCachePolicy(e,n.cache,r)}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=Hv(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){return this.recordError(e,t instanceof Error?t.message:String(t)),this.stringInitial(n.varDefault)}}),this.store.read(e)}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return Qv(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,Qv(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=$v[t.field],r=t.varDefault===void 0?ay(n):iy(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map;i={fieldSubs:e,unsubscribe:this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,ey(t,n,i,this.defaultEmptyValue))})})},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault})}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(`session.id`);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=ry(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,iy(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}getLastError(e){return this.lastErrors.get(e)}dispose(){for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,Y.reaction)(()=>{let t=Hv(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,Y.reaction)(()=>t.varNames.map(e=>String(this.store.read(e))).join(`,`),n);this.cleanups.push(e);break}}}async updateFromShell(e,t,n,r){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let{stdout:i,exitCode:a}=await Kv(t);if(a!==0){this.applyFallback(e,`string`,r,`shell "${t}" exited with code ${a}`);return}if(n!==void 0){let a=new RegExp(n).exec(i);if(!a?.[1]){this.applyFallback(e,`string`,r,`regex no-match in output of "${t}"`);return}this.store.setBox(e,a[1].replace(/\n/g,` `))}else this.store.setBox(e,i.replace(/\n/g,` `).trim());this.lastErrors.delete(e)}finally{this.inFlight.delete(e)}}}async updateFromFile(e,t,n,r,i){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let a=await qv(t,n,r);if(a.error!==void 0){this.applyFallback(e,`string`,i,a.error);return}this.store.setBox(e,a.content??``),this.lastErrors.delete(e)}finally{this.inFlight.delete(e)}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,iy(this.defaultEmptyValue,t))}catch{this.store.setBox(e,ay(t))}}defaultFor(e){try{return iy(this.defaultEmptyValue,e)}catch{return ay(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}};const sy={unicode:{},ascii:{glyph:`>`}},cy={unicode:{},ascii:{left:`(`,right:`)`}};function ly(e,t,n){switch(e){case`capsule`:return new Wo(cy[t]);case`plain`:return new Go(n===void 0?{}:{separator:n});case`powerline`:return new Uo(sy[t]);default:return e}}function uy(e){switch(e){case`powerline`:return 1;case`capsule`:return 2;case`plain`:return 0;default:return e}}function dy(e,t){if(e.length===0)return``;let n=ly(t.style,t.charset,t.separator);if(t.wrap&&Number.isFinite(t.width)){let r=Jo(new os([...e],{joiner:n}),{width:t.width,colorSystem:t.colorCompatibility});return r.endsWith(`
106
+ `)?r.slice(0,-1):r}return Jo(new Ro([...e],n),{colorSystem:t.colorCompatibility})}const fy=new Map,py=new Map;function my(e){let t=pc(e),n=fy.get(t);if(n!==void 0)return n;let r=eo(t);if(r===null)throw Error(`Palette "${e}" (resolved "${t}") did not resolve in the theme registry — allowed names and the registry are inconsistent`);return fy.set(t,r),r}function hy(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=py.get(n);if(r!==void 0)return r;let i=po(e,t);return py.set(n,i),i}function gy(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=_y(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(a.style.link){i();let e=_y([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function _y(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>vy(e,t)):e,r=Lo.fromFragments(n);return r.end=``,r.noWrap=!0,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function vy(e,t){let n=e.copy();return n.style=t.add(e.style),n}function yy(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function by(e,t){let n=Lo.fromFragments(e);return n.end=``,n.noWrap=!0,t!==void 0&&!t.isNull&&(n.style=t),n}function xy(e,t){let{width:n,justify:r,truncate:i,truncateMarker:a=`…`,baseStyle:o,padding:s}=t;if(e.length===0)return[];let c=by(e,o).pad(s);return n===`auto`||(c.cellLength>n?c.truncate(n,{mode:i,marker:a}):c.cellLength<n&&c.align(r,n)),[c]}var Sy=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Cy(e,t,n,r,i,a){let o={segName:t,palette:n,bg:void 0};e.current=o;let s=wy(r,a),c=s===void 0?void 0:Ty(n,s,`bg`);o.bg=c;let l=wy(i,a),u=l===void 0?void 0:Ty(n,l,`fg`);return new q({bgcolor:c===void 0?void 0:K.fromRgba(c),color:u===void 0?void 0:K.fromRgba(u)})}function wy(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Ty(e,t,n){try{return Pa(e,t)}catch(e){throw e instanceof ja?new Sy(t,n,e.message):e}}const Ey=new Map([[`palette`,`theme.effective`],[`look`,`look.effective`],[`style`,`style.effective`],[`charset`,`charset.effective`],[`colorCompatibility`,`colorCompatibility.effective`],[`autoWrap`,`autoWrap.effective`],[`padding`,`padding.effective`]]);function Dy(e,t,n,r){let i=new Map;for(let[a,o]of Object.entries(t))i.set(a,Oy(e,a,o,n,r));return i}function Oy(e,t,n,r,i){if(`set`in n){let e=r.get(n.set)??n.set;return`to`in n?{kind:`set-literal`,key:n.set,value:n.to,stateVar:e}:`from`in n?{kind:`set-option`,key:n.set,stateVar:e,options:[...d_(n.from,i)]}:`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=Ey.get(n.persist)??n.persist;return`to`in n?{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e}:`from`in n?{kind:`persist-option`,key:n.persist,stateVar:e,options:[...d_(n.from,i)]}:`cycle`in n?{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle}:{kind:`persist-bounded`,key:n.persist,by:n.by}}return`copy`in n?{kind:`copy`,text:ky(e,n.copy,t)}:`open`in n?{kind:`open`,target:ky(e,n.open,t)}:{kind:`reset`,key:n.reset}}function ky(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function Ay(e,t){return e.has(t)?wv(e.read(t)):``}function jy(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function My(e,t,n){let r=new Lo(e,{style:new q({link:t,bold:n})});return r.noWrap=!0,r.end=``,r}function Ny(e,t){return Math.max(e.members.indexOf(Ay(t,e.stateVar)),0)}function Py(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=Ay(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,e.value]},active:t===e.value}}case`set-option`:{let a=n??t,o=Ay(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,a]},active:o===a}}case`set-int`:{let a=n??t,o=Ay(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,a]},active:o===a}}case`set-cycle`:{let t=e.members[(Ny(e,r)+1)%e.members.length];return{effect:{verb:Ct,args:[i,e.key,t]},active:!1}}case`set-bounded`:return{effect:{verb:wt,args:[i,e.key,String(e.by)]},active:!1};case`copy`:return{effect:{verb:Tt,args:[jy(e.text,Hv(r))]},active:!1};case`open`:return{effect:{verb:Et,args:[jy(e.target,Hv(r))]},active:!1};case`persist-literal`:{let t=Ay(r,e.stateVar);return{effect:{verb:kt,args:[i,e.key,e.value]},active:t===e.value}}case`persist-option`:{let a=n??t,o=Ay(r,e.stateVar);return{effect:{verb:kt,args:[i,e.key,a]},active:o===a}}case`persist-cycle`:{let t=e.members[(Ny(e,r)+1)%e.members.length];return{effect:{verb:kt,args:[i,e.key,t]},active:!1}}case`persist-bounded`:return{effect:{verb:At,args:[i,e.key,String(e.by)]},active:!1};case`reset`:return{effect:{verb:jt,args:[i,e.key]},active:!1}}}function Fy(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`){if(n.length!==1&&n.length!==t.members.length)throw Error(`action "${e}" cycles ${t.members.length} members; bind one display per member (${t.members.length}) or one static display, got ${n.length}`);return{display:n.length===1?n[0]:n[Ny(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 Iy(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}=Fy(e,r,t,i),{effect:s,active:c}=Py(r,a,o,i,Ay(i,`session.id`));return My(a,Pt([s]),c)}function Ly(e){return{action:{fn:(t,...n)=>Iy(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function Ry(e){return new Lo(e).cellLength}function zy(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 By(e,t){let n=[];for(let t of e)n.length>0&&n.push(new Lo(` `)),n.push(t);let r=Lo.fromFragments(n);return r.noWrap=t,r.end=``,r}function Vy(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 Hy(e,t){let n=e.compiled.get(t);if(!n||n.kind!==`set-option`&&n.kind!==`persist-option`)throw Error(`picker references action "${t}" which must be a set-option or persist-option action ({ set, from } or { persist, from }), got ${n?`a ${n.kind} action`:`no such action`}`);return n}function Uy(e,t,n,r,i,a){let o=Hy(a,e),s=a.store,c=Ay(s,`session.id`),l=Ay(s,o.stateVar),u=o.options.map(Ry),d=i?Math.max(1,Tv(s.read(`term.cols`))-uy(a.stripStyle)-2*a.padding):1/0,f=Ry(`✕`)+1,p=Ry(`←`)+1+Ry(`→`)+1,m=zy(u,d,f),h=m.length>1?zy(u,d,f+p):m,g=parseInt(Ay(s,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>Pt([{verb:Ct,args:[c,t.key,String(e)]}]),b=n.flatMap(([e,t])=>[e,t]),x=Pt([{verb:Ct,args:[c,...b]}]),S=e=>o.kind===`persist-option`?Pt([{verb:kt,args:[c,o.key,e]},...r?[{verb:Ct,args:[c,...b]}]:[]]):Pt([{verb:Ct,args:[c,o.key,e,...r?b:[]]}]),C=[My(`✕`,x,!1)];_>0&&C.push(My(`←`,y(_-1),!1));for(let e of v){let t=o.options[e];C.push(My(t,S(t),t===l))}return _<h.length-1&&C.push(My(`→`,y(_+1),!1)),By(C,i)}function Wy(e){return{picker:{fn:(t,n,r,i)=>{let a=Vy(e,n,`set-int`,`an int action ({ set, int: true })`);return Uy(t,{key:a.key,stateVar:a.stateVar},[[a.key,`-1`]],r===!0,i===!0,e)},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}const Gy=Symbol(`cc-candybar.menuDrop`);function Ky(e){return e.flatMap(e=>e[Gy]??[])}function qy(e,t,n){let r=n.activeSegment.current;if(r===null)throw Error(`{{ menu }} rendered with no active segment placement — the render walk must publish one before evaluating a segment template`);let i=n.action,a=ig(r.segName,e,t.key),o=og(a),s=rg(e),c=Ay(i.store,a)===s,l=Ay(i.store,`session.id`),u=My(c?`▾`:`▸`,Pt([{verb:Ct,args:[l,a,c?It:s,o,`0`]}]),!1);return u[Gy]=c?[Uy(e,{key:o,stateVar:o},[[a,It],[o,`0`]],t.closeOnPick,t.paged,i)]:[],u}function Jy(e){return{menu:{fn:(t,n)=>qy(t,sg(n??{}),e),argTypes:[`string`,`dict`],returnType:`T`}}}function Yy(){return{current:null}}function Xy(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 Zy(e){let t={fn:(()=>{let t=Xy(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:[],returnType:`string`};return{...uc(()=>Xy(e,`color`).palette),bgOf:t}}function Qy(e){let t=[],n=[];for(let r of e){if(!r.contains(`
107
107
  `)){n.push(r);continue}let e=r.split(`
108
- `);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function Qy(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?[]:[t.flatMap(e=>e[0]??[]),...t.flatMap(e=>e.slice(1))]}}const $y={container:{compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,children:e.children.map((e,n)=>t.compileChild(e,`${t.path}.children[${n}]`))}},render(e,t){return Qy(e.direction,e.children.map(e=>t.renderChild(e,t.visible)))}},segment:{compile(e,t){return{kind:`segment`,when:t.when,name:e.name}},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,a=t.nextHueShift();if(!t.visible)return[];try{if(!vy(i.when,t.scope))return[];let n=i.palette===void 0?t.look:Sa,o=my(i.palette??t.basePalette,{...n,hueShift:n.hueShift+a}),s=t.enterSegment(e.name,o,i.bg,i.fg),c=i.template.evaluate(t.scope),l=t.exitSegment(c),u=l.length>0?t.focusTint(s):s,d={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:u,padding:t.padding},f=Zy(hy(c,u)).map(e=>by(e,d)),p=l.map(e=>by(hy([e],u),d)),m=[...f,...p];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.name,m.flat()),m}catch(n){let r=n.message??String(n);return t.onSegmentError?.(e.name,r),[[new Lo(`⚠ ${e.name}: ${r}`)]]}}}};function eb(e){return $y[e]}function tb(e){if(`ttl`in e)return{kind:`ttl`,durationMs:Wv(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 nb(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,regex:n.regex,cache:tb(n.cache),varDefault:n.default});break;case`shell`:e.declareShell(t,n.command,{regex:n.regex,cache:tb(n.cache),varDefault: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?Wv(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 rb(e,t){let n=``;for(let[r,i]of Object.entries(t)){let t=`{{ define "${r}" }}${i}{{ end }}`;try{e.parse(t)}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}n+=t}return n}function ib(e,t,n){let r=n?.cwd??process.cwd(),i={store:t.variableStore,compiled:new Map,stripStyle:`powerline`,padding:1},a=Jy(),o={action:i,activeSegment:a},s=Object.keys(e.looks),c=t_(e.presets),l=c_(e),u=Bv({...Iy(i),...Uy(i),...qy(o),...Xy(a),looks:{fn:()=>s,argTypes:[]},presets:{fn:()=>c,argTypes:[]}},n?.clock),d=rb(u,e.helpers),f=e=>u.parse(d+e),p=new Map;for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!p.has(n.key)&&p.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`&&!p.has(r.key)&&p.set(r.key,`${t}.${e}`);i.compiled=Ey(f,e.actions,p,l);let m=[];for(let[n,i]of Object.entries(e.variables))try{nb(t,n,i,r)}catch(e){m.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{nb(t,`${n}.${e}`,a,r)}catch(t){m.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let h=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n)=>{try{return f(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};h[t]={when:n.when===void 0?void 0:e(n.when,`when`),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`),palette:n.palette===void 0?void 0:py(n.palette)}}let g=(e,t,n)=>{try{return f(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},_=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:g(e.when,t,`when`),compileChild:_};return eb(e.kind).compile(e,n)},v=new Map;for(let t of c){let{node:n,path:r}=i_(e,t);v.set(t,_(n,r))}return{segments:h,roots:v,activeSegment:a,menuRuntime:o,loadWarnings:m}}function ab(e){let t=e.bgcolor;return t===void 0?e:new q({bgcolor:K.fromRgba(Va(t.getTruecolor(),1)),color:e.color})}function ob(e,t,n,r,i,a,o,s,c){let{perSegmentSink:l,onSegmentError:u}=s??{},{look:d=Sa,preset:f=$g}=c??{};r.applyInput({...i,term:{cols:o.width}}),t.menuRuntime.action.stripStyle=o.style,t.menuRuntime.action.padding=o.padding;let p=Vv(n),m=n.has(`hue.step`)?Number(n.read(`hue.step`)):0,h=Number.isFinite(m)?m:0;l?.clear();let g={value:0},_=()=>{let e=g.value*h;return g.value+=1,e},v=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},y=(e,n,r,i)=>Sy(t.activeSegment,e,n,r,i,p),b=e=>(t.activeSegment.current=null,Gy(e)),x=(e,t)=>{let n={scope:p,basePalette:a,look:d,visible:t&&vy(e.when,p),padding:o.padding,nextHueShift:_,perSegmentSink:l,onSegmentError:u,enterSegment:y,exitSegment:b,focusTint:ab,lookupSegment:v,renderChild:x};return eb(e.kind).render(e,n)},S=t.roots.get(f);if(S===void 0)throw Error(`Preset "${f}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${$g}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);return x(S,!0).map(e=>uy(e,o)).join(`
109
- `)}const sb=/^-?\d+$/;function cb(e,t,n){return e===void 0?t:Math.max(t,Math.min(n,e))}function lb(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 ub(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!sb.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 db(e,t,n){return r=>r?sb.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 fb(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=>!sb.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,seed:cb(r[0].seed,t,i)}}return{kind:`int`}}function pb(e){return e===`config`?`set-config`:`set-state`}function mb(e,t,n){return t.kind===`int`?ub(`menu page "${e}"`):t.kind===`range`?db(t.min,t.max,`${n} stepper "${e}"`):lb(t.allowed,`${n} "${e}"`,pb(n))}function hb(e,t,n){return mb(e,fb(e,t,n),n)}function gb(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:fb(e,n,t)}))}function _b(e,t=`state`){let n=new Map(Object.entries(e).map(([e,t])=>[e,{validator:t,permanent:!0}]));function r(){let e=[];for(let[t,r]of n)r.permanent&&e.push(t);return e}return{register(e,i){if(!e)throw Error(`register: key is required`);if(e.includes(`/`))throw Error(`register: key "${e}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);let a=n.get(e);if(a){if(a.permanent)throw Error(`register: key "${e}" is a built-in ${t} key and cannot be re-claimed (built-in keys: ${[...r()].join(`, `)})`);if(a.kind!==i.kind)throw Error(`register: key "${e}" is already a ${a.kind} ${t} key; cannot also register it as ${i.kind}. A ${t} key has one key shape — a menu page index (int) and a button allow-list cannot share a key.`);a.specs.push(i),a.validator=hb(e,a.specs,t)}else{let r=[i];n.set(e,{permanent:!1,kind:i.kind,validator:hb(e,r,t),specs:r})}let o=!0;return()=>{if(!o)return;o=!1;let r=n.get(e);if(!r||r.permanent)return;let a=r.specs.indexOf(i);a>=0&&r.specs.splice(a,1),r.specs.length===0?n.delete(e):r.validator=hb(e,r.specs,t)}},validate(e,r){let i=n.get(e);return i?i.validator(r):{ok:!1,reason:`unknown ${t} key "${e}" (have: ${[...n.keys()].join(`, `)})`}},listKeys(){return[...n.keys()]},listBaselineKeys(){return r()},rangeParamsFor(e){let r=n.get(e);if(!r||r.permanent||r.kind!==`range`)return null;let i=fb(e,r.specs,t);if(i.kind!==`range`)throw Error(`rangeParamsFor: key "${e}" holds range specs but the merge produced a ${i.kind} spec — the entry-kind invariant is broken.`);return{min:i.min,max:i.max,seed:i.seed}}}}const vb=gc(),yb=new Set(vb),bb=new Set(bc),xb=e=>e?yb.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${vb.join(`, `)})`}:{ok:!1,reason:`theme name is required`},Sb=e=>e?bb.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${bc.join(`, `)})`}:{ok:!1,reason:`style name is required`},Cb=new Set([`1`,`true`]),wb=new Set([`0`,`false`]),Tb=_b({style:Sb,theme:xb,"toolbar-expanded":e=>Cb.has(e)?{ok:!0,value:`1`}:wb.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function Eb(){return Tb.listKeys()}function Db(e,t){return Tb.register(e,t)}function Ob(e,t){return Tb.validate(e,t)}function kb(e){return Tb.rangeParamsFor(e)}function Ab(e,t,n){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:u_(e.from,n)}}]:`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,seed:cb(t.get(e.set),e.min,e.max)}}]:[]}function jb(e){let t=new Set(Tb.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function Mb(e){let t=new Map,n=/^-?\d+$/;for(let r of Object.values(e.variables)){if(r.kind!==`state`)continue;let e=r.default;e!==void 0&&n.test(e)&&t.set(r.key,parseInt(e,10))}return t}function Nb(e){let t=Mb(e),n=c_(e);return jb(Object.values(e.actions).flatMap(e=>Ab(e,t,n)))}function Pb(e){return gb(Nb(e))}const Fb=(e,t)=>D(t),Ib={default_bg:`string`,default_fg:`string`,default_empty_value:`string`,default_separator:`string`,default_truncate_marker:`string`,palette:`string`,look:`string`,preset:`string`,style:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,colorCompatibility:`string`},Lb=new Set([`1`,`true`]),Rb=new Set([`0`,`false`,``]);function zb(e,t){let n=f_(e);if(n===null)throw Error(`coercePersistValue: "${e}" is not a valid persist target`);if(n.scope===`segment-palette`)return t;let r=Ib[n.field];if(r===`string`)return t;if(r===`number`){let n=Number(t);if(!Number.isFinite(n))throw Error(`coercePersistValue: "${e}" expects a number, got "${t}"`);return n}if(Lb.has(t))return!0;if(Rb.has(t))return!1;throw Error(`coercePersistValue: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function Bb(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let[t,n]of Object.entries(e)){let e=f_(t);if(e===null)return!1;let r=e.scope===`segment-palette`?`string`:Ib[e.field];if(r===`number`&&typeof n!=`number`||r===`boolean`&&typeof n!=`boolean`||r===`string`&&typeof n!=`string`)return!1}return!0}function Vb(e,t){let n;try{n=r.readFileSync(e,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`config-overrides read failed (${n}); starting empty`),{}}try{let e=JSON.parse(n);return Bb(e)?e:(t(`warn`,`config-overrides load: unexpected shape, starting empty`),{})}catch{return t(`warn`,`config-overrides load: corrupt JSON, starting empty`),{}}}function Hb(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))fl(n)&&(t[n]=r);return t}function Ub(e){let t=Object.create(null);for(let[n,r]of Object.entries(e)){let e=f_(n);e?.scope===`segment-palette`&&typeof r==`string`&&(t[e.segment]=r)}return t}function Wb(e,t=Fb){return Hb(Vb(e,t))}function Gb(e,t=Fb){let n=Vb(e,t);return{globals:Hb(n),segmentPalette:Ub(n)}}function Kb(e,t,n){try{r.mkdirSync(c.dirname(e),{recursive:!0});let n=`${e}.tmp`;r.writeFileSync(n,JSON.stringify(t),{mode:384}),r.chmodSync(n,384),r.renameSync(n,e)}catch(e){let t=`config-overrides write failed: ${e.message}`;throw n(`error`,t),Error(t)}}function qb(e,t,n,r=Fb){Kb(e,{...Vb(e,r),[t]:n},r)}function Jb(e,t,n=Fb){let r=Vb(e,n);if(!(t in r))return;let i={...r};delete i[t],Kb(e,i,n)}const Yb=_b({},`config`);function Xb(){return Yb.listKeys()}function Zb(e,t){return Yb.validate(e,t)}function Qb(e){return Yb.rangeParamsFor(e)}function $b(e,t,n){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:u_(e.from,n)}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max,seed:cb(t.get(e.persist),e.min,e.max)}}]:[]}function ex(e){let t=new Map;for(let[n,r]of Object.entries(e.globals))fl(n)&&typeof r==`number`&&t.set(n,r);return t}function tx(e){let t=ex(e),n=c_(e);return Object.values(e.actions).flatMap(e=>$b(e,t,n))}function nx(e){return gb(tx(e),`config`)}function rx(e,t){return Yb.register(e,t)}var ix=class{kind=`box`;cell;lastSetAt;constructor(e,t,n){this.name=e,this.type=t,ox(e,t,n,`initial value`),this.cell=Y.observable.box(n,{deep:!1}),this.lastSetAt=Date.now()}read(){return this.cell.get()}set(e){ox(this.name,this.type,e,`set value`),this.cell.set(e),this.lastSetAt=Date.now()}lastUpdatedMs(){return this.lastSetAt}},ax=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,Y.computed)(()=>{let e=n();return ox(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}};function ox(e,t,n,r){let i=Sv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var sx=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new ix(e,t,n))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new ax(e,t,()=>n(r)))}read(e){return this.requireNode(e).read()}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,Y.runInAction)(()=>n.set(t))}runInAction(e){(0,Y.runInAction)(e)}has(e){return this.nodes.has(e)}getType(e){return this.requireNode(e).type}getKind(e){return this.requireNode(e).kind}getNode(e){let t=this.requireNode(e);return{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}assertNotDefined(e){if(this.nodes.has(e))throw Error(`Variable "${e}" is already declared`)}};function cx(e,t,n){return e+`\0`+t+`\0`+(n??``)}var lx=class{entries=new Map;deps;maxEntries;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256}getOrCreate(e,t,n){let r=cx(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:null,lastWarning:null,state:null,watcher:null};if(this.reloadInto(a),this.entries.set(r,a),this.entries.size>this.maxEntries){let e=this.entries.keys().next().value;if(e!==void 0){let t=this.entries.get(e);t?.state?.registry.dispose(),t?.state?.validatorDisposers.forEach(e=>e()),t?.watcher?.release(),this.entries.delete(e)}}return a}reloadInto(e){let t=F_(e.projectDir,e.cwd,e.configFile);e.lastWarning=I_(e.projectDir,e.cwd);let n;try{n=this.buildState(e,t)}catch(n){e.lastError=n instanceof Tc||n instanceof Error?n.message:String(n),this.refreshWatcher(e,t);return}if(e.state?.registry.dispose(),e.state?.validatorDisposers.forEach(e=>e()),e.lastError=null,e.state=n,n.compiled.loadWarnings.length>0){let t=n.compiled.loadWarnings.join(`
108
+ `);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function $y(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?[]:[t.flatMap(e=>e[0]??[]),...t.flatMap(e=>e.slice(1))]}}const eb={container:{compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,children:e.children.map((e,n)=>t.compileChild(e,`${t.path}.children[${n}]`))}},render(e,t){return $y(e.direction,e.children.map(e=>t.renderChild(e,t.visible)))}},segment:{compile(e,t){return{kind:`segment`,when:t.when,name:e.name}},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,a=t.nextHueShift();if(!t.visible)return[];try{if(!yy(i.when,t.scope))return[];let n=i.palette===void 0?t.look:Sa,o=hy(i.palette??t.basePalette,{...n,hueShift:n.hueShift+a}),s=t.enterSegment(e.name,o,i.bg,i.fg),c=i.template.evaluate(t.scope),l=t.exitSegment(c),u=l.length>0?t.focusTint(s):s,d={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:u,padding:t.padding},f=Qy(gy(c,u)).map(e=>xy(e,d)),p=l.map(e=>xy(gy([e],u),d)),m=[...f,...p];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.name,m.flat()),m}catch(n){let r=n.message??String(n);return t.onSegmentError?.(e.name,r),[[new Lo(`⚠ ${e.name}: ${r}`)]]}}}};function tb(e){return eb[e]}function nb(e){if(`ttl`in e)return{kind:`ttl`,durationMs:Gv(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 rb(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,regex:n.regex,cache:nb(n.cache),varDefault:n.default});break;case`shell`:e.declareShell(t,n.command,{regex:n.regex,cache:nb(n.cache),varDefault: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?Gv(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 ib(e,t){let n=``;for(let[r,i]of Object.entries(t)){let t=`{{ define "${r}" }}${i}{{ end }}`;try{e.parse(t)}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}n+=t}return n}function ab(e,t,n){let r=n?.cwd??process.cwd(),i={store:t.variableStore,compiled:new Map,stripStyle:`powerline`,padding:1},a=Yy(),o={action:i,activeSegment:a},s=Object.keys(e.looks),c=t_(e.presets),l=l_(e),u=Vv({...Ly(i),...Wy(i),...Jy(o),...Zy(a),looks:{fn:()=>s,argTypes:[]},presets:{fn:()=>c,argTypes:[]}},n?.clock),d=ib(u,e.helpers),f=e=>u.parse(d+e),p=new Map;for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!p.has(n.key)&&p.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`&&!p.has(r.key)&&p.set(r.key,`${t}.${e}`);i.compiled=Dy(f,e.actions,p,l);let m=[];for(let[n,i]of Object.entries(e.variables))try{rb(t,n,i,r)}catch(e){m.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{rb(t,`${n}.${e}`,a,r)}catch(t){m.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let h=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n)=>{try{return f(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};h[t]={when:n.when===void 0?void 0:e(n.when,`when`),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`),palette:n.palette===void 0?void 0:my(n.palette)}}let g=(e,t,n)=>{try{return f(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},_=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:g(e.when,t,`when`),compileChild:_};return tb(e.kind).compile(e,n)},v=new Map;for(let t of c){let{node:n,path:r}=i_(e,t);v.set(t,_(n,r))}return{segments:h,roots:v,activeSegment:a,menuRuntime:o,loadWarnings:m}}function ob(e){let t=e.bgcolor;return t===void 0?e:new q({bgcolor:K.fromRgba(Va(t.getTruecolor(),1)),color:e.color})}function sb(e,t,n,r,i,a,o,s,c){let{perSegmentSink:l,onSegmentError:u}=s??{},{look:d=Sa,preset:f=$g}=c??{};r.applyInput({...i,term:{cols:o.width}}),t.menuRuntime.action.stripStyle=o.style,t.menuRuntime.action.padding=o.padding;let p=Hv(n),m=n.has(`hue.step`)?Number(n.read(`hue.step`)):0,h=Number.isFinite(m)?m:0;l?.clear();let g={value:0},_=()=>{let e=g.value*h;return g.value+=1,e},v=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},y=(e,n,r,i)=>Cy(t.activeSegment,e,n,r,i,p),b=e=>(t.activeSegment.current=null,Ky(e)),x=(e,t)=>{let n={scope:p,basePalette:a,look:d,visible:t&&yy(e.when,p),padding:o.padding,nextHueShift:_,perSegmentSink:l,onSegmentError:u,enterSegment:y,exitSegment:b,focusTint:ob,lookupSegment:v,renderChild:x};return tb(e.kind).render(e,n)},S=t.roots.get(f);if(S===void 0)throw Error(`Preset "${f}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${$g}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);return x(S,!0).map(e=>dy(e,o)).join(`
109
+ `)}const cb=/^-?\d+$/;function lb(e,t,n){return e===void 0?t:Math.max(t,Math.min(n,e))}function ub(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 db(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!cb.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 fb(e,t,n){return r=>r?cb.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 pb(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=>!cb.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,seed:lb(r[0].seed,t,i)}}return{kind:`int`}}function mb(e){return e===`config`?`set-config`:`set-state`}function hb(e,t,n){return t.kind===`int`?db(`menu page "${e}"`):t.kind===`range`?fb(t.min,t.max,`${n} stepper "${e}"`):ub(t.allowed,`${n} "${e}"`,mb(n))}function gb(e,t,n){return hb(e,pb(e,t,n),n)}function _b(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:pb(e,n,t)}))}function vb(e,t=`state`){let n=new Map(Object.entries(e).map(([e,t])=>[e,{validator:t,permanent:!0}]));function r(){let e=[];for(let[t,r]of n)r.permanent&&e.push(t);return e}return{register(e,i){if(!e)throw Error(`register: key is required`);if(e.includes(`/`))throw Error(`register: key "${e}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);let a=n.get(e);if(a){if(a.permanent)throw Error(`register: key "${e}" is a built-in ${t} key and cannot be re-claimed (built-in keys: ${[...r()].join(`, `)})`);if(a.kind!==i.kind)throw Error(`register: key "${e}" is already a ${a.kind} ${t} key; cannot also register it as ${i.kind}. A ${t} key has one key shape — a menu page index (int) and a button allow-list cannot share a key.`);a.specs.push(i),a.validator=gb(e,a.specs,t)}else{let r=[i];n.set(e,{permanent:!1,kind:i.kind,validator:gb(e,r,t),specs:r})}let o=!0;return()=>{if(!o)return;o=!1;let r=n.get(e);if(!r||r.permanent)return;let a=r.specs.indexOf(i);a>=0&&r.specs.splice(a,1),r.specs.length===0?n.delete(e):r.validator=gb(e,r.specs,t)}},validate(e,r){let i=n.get(e);return i?i.validator(r):{ok:!1,reason:`unknown ${t} key "${e}" (have: ${[...n.keys()].join(`, `)})`}},listKeys(){return[...n.keys()]},listBaselineKeys(){return r()},rangeParamsFor(e){let r=n.get(e);if(!r||r.permanent||r.kind!==`range`)return null;let i=pb(e,r.specs,t);if(i.kind!==`range`)throw Error(`rangeParamsFor: key "${e}" holds range specs but the merge produced a ${i.kind} spec — the entry-kind invariant is broken.`);return{min:i.min,max:i.max,seed:i.seed}}}}const yb=gc(),bb=new Set(yb),xb=new Set(bc),Sb=e=>e?bb.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${yb.join(`, `)})`}:{ok:!1,reason:`theme name is required`},Cb=e=>e?xb.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${bc.join(`, `)})`}:{ok:!1,reason:`style name is required`},wb=new Set([`1`,`true`]),Tb=new Set([`0`,`false`]),Eb=vb({style:Cb,theme:Sb,"toolbar-expanded":e=>wb.has(e)?{ok:!0,value:`1`}:Tb.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function Db(){return Eb.listKeys()}function Ob(e,t){return Eb.register(e,t)}function kb(e,t){return Eb.validate(e,t)}function Ab(e){return Eb.rangeParamsFor(e)}function jb(e,t,n){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:d_(e.from,n)}}]:`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,seed:lb(t.get(e.set),e.min,e.max)}}]:[]}function Mb(e){let t=new Set(Eb.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function Nb(e){let t=new Map,n=/^-?\d+$/;for(let r of Object.values(e.variables)){if(r.kind!==`state`)continue;let e=r.default;e!==void 0&&n.test(e)&&t.set(r.key,parseInt(e,10))}return t}function Pb(e){let t=Nb(e),n=l_(e);return Mb(Object.values(e.actions).flatMap(e=>jb(e,t,n)))}function Fb(e){return _b(Pb(e))}const Ib=(e,t)=>D(t),Lb={default_bg:`string`,default_fg:`string`,default_empty_value:`string`,default_separator:`string`,default_truncate_marker:`string`,palette:`string`,look:`string`,preset:`string`,style:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,colorCompatibility:`string`},Rb=new Set([`1`,`true`]),zb=new Set([`0`,`false`,``]);function Bb(e,t){let n=p_(e);if(n===null)throw Error(`coercePersistValue: "${e}" is not a valid persist target`);if(n.scope===`segment-palette`)return t;let r=Lb[n.field];if(r===`string`)return t;if(r===`number`){let n=Number(t);if(!Number.isFinite(n))throw Error(`coercePersistValue: "${e}" expects a number, got "${t}"`);return n}if(Rb.has(t))return!0;if(zb.has(t))return!1;throw Error(`coercePersistValue: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function Vb(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let[t,n]of Object.entries(e)){let e=p_(t);if(e===null)return!1;let r=e.scope===`segment-palette`?`string`:Lb[e.field];if(r===`number`&&typeof n!=`number`||r===`boolean`&&typeof n!=`boolean`||r===`string`&&typeof n!=`string`)return!1}return!0}function Hb(e,t){let n;try{n=r.readFileSync(e,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`config-overrides read failed (${n}); starting empty`),{}}try{let e=JSON.parse(n);return Vb(e)?e:(t(`warn`,`config-overrides load: unexpected shape, starting empty`),{})}catch{return t(`warn`,`config-overrides load: corrupt JSON, starting empty`),{}}}function Ub(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))fl(n)&&(t[n]=r);return t}function Wb(e){let t=Object.create(null);for(let[n,r]of Object.entries(e)){let e=p_(n);e?.scope===`segment-palette`&&typeof r==`string`&&(t[e.segment]=r)}return t}function Gb(e,t=Ib){return Ub(Hb(e,t))}function Kb(e,t=Ib){let n=Hb(e,t);return{globals:Ub(n),segmentPalette:Wb(n)}}function qb(e,t,n){try{r.mkdirSync(c.dirname(e),{recursive:!0});let n=`${e}.tmp`;r.writeFileSync(n,JSON.stringify(t),{mode:384}),r.chmodSync(n,384),r.renameSync(n,e)}catch(e){let t=`config-overrides write failed: ${e.message}`;throw n(`error`,t),Error(t)}}function Jb(e,t,n,r=Ib){qb(e,{...Hb(e,r),[t]:n},r)}function Yb(e,t,n=Ib){let r=Hb(e,n);if(!(t in r))return;let i={...r};delete i[t],qb(e,i,n)}const Xb=vb({},`config`);function Zb(){return Xb.listKeys()}function Qb(e,t){return Xb.validate(e,t)}function $b(e){return Xb.rangeParamsFor(e)}function ex(e,t,n){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:d_(e.from,n)}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max,seed:lb(t.get(e.persist),e.min,e.max)}}]:[]}function tx(e){let t=new Map;for(let[n,r]of Object.entries(e.globals))fl(n)&&typeof r==`number`&&t.set(n,r);return t}function nx(e){let t=tx(e),n=l_(e);return Object.values(e.actions).flatMap(e=>ex(e,t,n))}function rx(e){return _b(nx(e),`config`)}function ix(e,t){return Xb.register(e,t)}var ax=class{kind=`box`;cell;lastSetAt;constructor(e,t,n){this.name=e,this.type=t,sx(e,t,n,`initial value`),this.cell=Y.observable.box(n,{deep:!1}),this.lastSetAt=Date.now()}read(){return this.cell.get()}set(e){sx(this.name,this.type,e,`set value`),this.cell.set(e),this.lastSetAt=Date.now()}lastUpdatedMs(){return this.lastSetAt}},ox=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,Y.computed)(()=>{let e=n();return sx(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}};function sx(e,t,n,r){let i=Cv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var cx=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new ax(e,t,n))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new ox(e,t,()=>n(r)))}read(e){return this.requireNode(e).read()}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,Y.runInAction)(()=>n.set(t))}runInAction(e){(0,Y.runInAction)(e)}has(e){return this.nodes.has(e)}getType(e){return this.requireNode(e).type}getKind(e){return this.requireNode(e).kind}getNode(e){let t=this.requireNode(e);return{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}assertNotDefined(e){if(this.nodes.has(e))throw Error(`Variable "${e}" is already declared`)}};function lx(e,t,n){return e+`\0`+t+`\0`+(n??``)}var ux=class{entries=new Map;deps;maxEntries;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256}getOrCreate(e,t,n){let r=lx(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:null,lastWarning:null,state:null,watcher:null};if(this.reloadInto(a),this.entries.set(r,a),this.entries.size>this.maxEntries){let e=this.entries.keys().next().value;if(e!==void 0){let t=this.entries.get(e);t?.state?.registry.dispose(),t?.state?.validatorDisposers.forEach(e=>e()),t?.watcher?.release(),this.entries.delete(e)}}return a}reloadInto(e){let t=I_(e.projectDir,e.cwd,e.configFile);e.lastWarning=L_(e.projectDir,e.cwd);let n;try{n=this.buildState(e,t)}catch(n){e.lastError=n instanceof Tc||n instanceof Error?n.message:String(n),this.refreshWatcher(e,t);return}if(e.state?.registry.dispose(),e.state?.validatorDisposers.forEach(e=>e()),e.lastError=null,e.state=n,n.compiled.loadWarnings.length>0){let t=n.compiled.loadWarnings.join(`
110
110
  `);e.lastWarning=e.lastWarning?e.lastWarning+`
111
- `+t:t}this.refreshWatcher(e,t)}buildState(e,t){let{config:n,source:r}=L_(t,xv),i=Gb(Ne(),F),a=R_(nl(tl({globals:i.globals},n),i.segmentPalette),t??`<default>`,r),o=new sx,s=new ay(o,a.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),c,l=[];try{c=ib(a,s,{cwd:e.cwd});for(let{key:e,spec:t}of Pb(a))l.push(Db(e,t));for(let{key:e,spec:t}of nx(a))l.push(rx(e,t))}catch(e){for(let e of l)e();throw s.dispose(),e}return{config:a,store:o,registry:s,compiled:c,neededInputPaths:ev(a),lastRenderCellsBySegment:new Map,validatorDisposers:l}}refreshWatcher(e,t){(t!==e.configFilePath||e.watcher===null)&&(e.configFilePath=t,this.rebindWatcher(e,t))}rebindWatcher(e,t){e.watcher&&=(e.watcher.release(),null);let n=[...P_(e.projectDir,e.cwd,e.configFile),Ne()],i=new Map;for(let e of n){let t=c.dirname(e);if(!r.existsSync(t))continue;let n=c.basename(e);i.has(t)||i.set(t,new Set),i.get(t).add(n)}let a=[...i.entries()].map(([e,t])=>({path:e,filenames:[...t]})),o=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${t??`<none>`}`;e.watcher=this.deps.watchers.acquire(o,{files:t===null?[]:[t],dirs:a},()=>this.onConfigChanged(e))}onConfigChanged(e){F(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstPopulatedState(){for(let e of this.entries.values())if(e.state!==null)return e.state;return null}};const ux=16384;var dx=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<ux){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%ux}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: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}}};const fx=(parseInt(process.env.CC_CANDYBAR_RSS_LIMIT_MB??``,10)||512)*1024*1024;function px(e){let t=e.rssLimitBytes??fx,n=e.snapshotsKeep??3,r=!1;function i(){if(r)return!0;let i=e.rssBytes();if(i<=t)return!1;r=!0,e.log(`warn`,`RSS ${i} > limit ${t}; writing heap snapshot then shutting down`);try{let t=new Date(e.now()).toISOString().replace(/[:.]/g,`-`),r=c.join(e.snapshotDir,`heap-${t}-${e.pid}.heapsnapshot`),i=e.writeHeapSnapshot(r);e.log(`info`,`heap snapshot written: ${i}`),mx(e.listSnapshots(),n,e.removeFile)}catch(t){e.log(`warn`,`heap snapshot failed: ${t.message}`)}return e.shutdown(0),!0}function a(){let n=e.rssBytes();return n>t*.75?`rss ${n} approaching limit ${t}`:null}function o(e=6e4){let t=setInterval(()=>{i()},e);return t.unref(),{disarm:()=>clearInterval(t)}}return{checkRss:i,describeNextRestart:a,arm:o}}function mx(e,t,n){let r=[...e].sort((e,t)=>{let n=e.slice(e.lastIndexOf(`/`)+1);return t.slice(t.lastIndexOf(`/`)+1).localeCompare(n)});for(let e of r.slice(t))try{n(e)}catch{}}function hx(e,t,n={}){let i=De();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:F,rssBytes:()=>process.memoryUsage().rss,writeHeapSnapshot:e=>E.writeHeapSnapshot(e),listSnapshots:()=>{try{return r.readdirSync(i).filter(e=>e.startsWith(`heap-`)&&e.endsWith(`.heapsnapshot`)).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}const gx={load:()=>({}),save:()=>{},flush:()=>{}};function _x(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var vx=class{sessions;storage;atom=(0,Y.createAtom)(`SessionState`);constructor(e=gx,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=_x(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,Y.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,Y.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,Y.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}};const yx=(e,t)=>D(t);function bx(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 xx=class{timer=null;pending=null;constructor(e,t=500,n=yx){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 bx(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}`)}}},Sx=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function Cx(e){if(!e)throw new Sx(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new Sx(`invalid session id "${e}"`);return e}function wx(e){return Tx(()=>decodeURIComponent(e))}function Tx(e){try{return e()}catch(e){throw e instanceof URIError?new Sx(`malformed wire encoding: ${e.message}`):e}}function Ex(e,t){let n=xe({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 Dx=(e,t)=>Ex(wx(e),t),Ox=(e,t)=>{let n=xe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,wx(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`})`)}},kx=(e,t)=>Ex(wx(e),t),Ax=(e,t)=>Ex(wx(e),t),jx=(e,t)=>{let n=Cx(wx(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},Mx=(e,t)=>{let[n=``,...r]=Tx(()=>Nt(e)),i=Cx(n);if(r.length===0)throw new Sx(`set-state: <key>/<value> is required (have keys: ${Eb().join(`, `)})`);if(r.length%2!=0)throw new Sx(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${Eb().join(`, `)})`);let a=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new Sx(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=Ob(t,n);if(!i.ok)throw new Sx(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},Nx=/^-?\d+$/;function Px(e,t,n){return e>n?t:e<t?n:e}const Fx=(e,t)=>{let[n=``,r=``,i=``]=Tx(()=>Nt(e)),a=Cx(n);if(!r)throw new Sx(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Nx.test(i))throw new Sx(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=kb(r);if(!s)throw new Sx(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${Eb().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&Nx.test(c)?Math.max(s.min,Math.min(s.max,parseInt(c,10))):s.seed,u=Px(l+o,s.min,s.max),d=Ob(r,String(u));if(!d.ok)throw new Sx(`step-state: ${d.reason}`);t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function Ix(e){if(!fl(e))throw Error(`step-config: "${e}" validated as a bounded config-writable key but is not a Globals field — registration/loader invariant broken`)}const Lx=(e,t)=>{let[n=``,r=``,i=``]=Tx(()=>Nt(e)),a=Cx(n);if(!r)throw new Sx(`set-config: <key>/<value> is required (have keys: ${Xb().join(`, `)})`);let o=Zb(r,i);if(!o.ok)throw new Sx(`set-config: ${o.reason}`);let s=zb(r,o.value);qb(Ne(),r,s,t.dlog),t.dlog(`info`,`set-config: ${r}=${o.value} (session=${a})`)},Rx=(e,t)=>{let[n=``,r=``,i=``]=Tx(()=>Nt(e)),a=Cx(n);if(!r)throw new Sx(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Nx.test(i))throw new Sx(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=Qb(r);if(!s)throw new Sx(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${Xb().join(`, `)})`);Ix(r);let c=Wb(Ne(),t.dlog)[r],l=typeof c==`number`?Math.max(s.min,Math.min(s.max,c)):s.seed,u=Px(l+o,s.min,s.max),d=Zb(r,String(u));if(!d.ok)throw new Sx(`step-config: ${d.reason}`);let f=zb(r,d.value);qb(Ne(),r,f,t.dlog),t.dlog(`info`,`step-config: ${r} ${l}→${d.value} (by ${o}, session=${a})`)},zx=(e,t)=>{let[n=``,r=``]=Tx(()=>Nt(e)),i=Cx(n);if(!r||!Xb().includes(r))throw new Sx(`reset-config: unknown config key "${r}" (have: ${Xb().join(`, `)})`);Jb(Ne(),r,t.dlog),t.dlog(`info`,`reset-config: ${r} (session=${i})`)},Bx=`config-override`,Vx=new Map([[Tt,Dx],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new Sx(`load-config: expected <sessionId>/<path> (missing separator)`);let r=Cx(Tx(()=>decodeURIComponent(e.slice(0,n)))),i=Tx(()=>decodeURIComponent(e.slice(n+1))).trim();if(i!==``){if(!i.startsWith(`/`))throw new Sx(`load-config: path must be absolute, got "${i}"`);if(!/\.(json5?|json)$/.test(i))throw new Sx(`load-config: path must end with .json5 or .json, got "${i}"`)}i===``?(t.sessionState.clear(r,Bx),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,Bx,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Et,Ox],[Ct,Mx],[wt,Fx],[kt,Lx],[At,Rx],[jt,zx],[Dt,kx],[Ot,Ax],[`toolbar-toggle`,jx]]),Hx=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of Ft(e)){if(!i&&(a===`set-state`||a===`step-state`||a===`set-config`||a===`step-config`||a===`reset-config`||a===`toolbar-toggle`)){let e=Nt(o);e.length>0&&e[0]&&(i=e[0])}let e=Vx.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof Sx||(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(`
112
- `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new Sx(e)}},Ux=new Map([...Vx,[St,Hx]]);Object.freeze([...Ux.keys()]);const Wx=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`]),Gx=[[`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`]];function Kx(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of Gx){let i=qx(n,e);if(i==null)t.missingRequired.push(e);else{let n=Array.isArray(i)?`array`:typeof i;(r===`object`?n!==`object`:n!==r)&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))Wx.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function qx(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 Jx(e,t){switch(e){case`vars`:return{what:e,vars:Yx(t)};case`segments`:return{what:e,segments:$x(t)};case`config`:return{what:e,config:nS(t)}}}function Yx(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=Zx(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,type:r.type,value:r.read(),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:Xx(r.lastUpdatedMs())})}return o}function Xx(e){return e===null?null:Math.max(0,Date.now()-e)}function Zx(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,Qx(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}`,Qx(i));return t}function Qx(e){return e.kind}function $x(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=eS(n),o=[];for(let e of a){let t=n.segments[e];t&&o.push({name:e,template:t.template,referencedVars:tS(t.template,i),lastRender:r.get(e)??null})}return o}function eS(e){let t=[],n=new Set;for(let r of Jr(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 tS(e,t){let n=new Set;for(let r of g_(e)){if(t.has(r)){n.add(r);continue}let e=r.split(`.`);for(;e.length>1;){e.pop();let r=e.join(`.`);if(t.has(r)){n.add(r);break}}}return Array.from(n).sort()}function nS(e){return e===null?null:e.config}const rS=[`vars`,`segments`,`config`];function iS(e){return typeof e==`string`&&rS.includes(e)}function aS(e){return Math.max(1,e-2)}var oS=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 D(`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);D(`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{D(`Calculating context tokens from transcript: ${e}`);let n=await Ar(e);if(n.length===0)return D(`No entries in transcript`),L;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,D(`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 D(`Most recent main chain context: ${n} tokens (limit: ${t})`),I({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return D(`No main chain entries with usage data found`),L}catch(e){return Ln(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return I(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}};function sS(e){let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.firstContentType===`tool_result`;return t===`user`&&!n}var cS=class{state=new Map;calculateLastResponseTime(e){if(e.length===0)return null;let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(sS(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}async foldMetrics(e,t){let n=this.state.get(e),r=vr(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.state.delete(e),this.state.set(e,n),{kind:`ok`,value:{messageCount:n.messageCount,recent:[...n.recent]}};let i=await Pr(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:{messageCount:n?.messageCount??0,recent:[...n?.recent??[]]}};let{entries:a,cursor:o,reset:s}=i.value,c=n&&!s?n:void 0,l=c?.messageCount??0,u=c?[...c.recent]:[];for(let e of a)e.isSidechain||(sS(e)&&l++,u.push(e));for(u.length>20&&(u=u.slice(-20)),this.state.delete(e),this.state.set(e,{cursor:o,messageCount:l,recent:u});this.state.size>256;){let e=this.state.keys().next().value;if(e===void 0)break;this.state.delete(e)}return{kind:`ok`,value:{messageCount:l,recent:[...u]}}}async getMetricsInfo(e,t){if(D(`Getting metrics from hook data for session: ${e}`),!t.cost)return L;let n=await this.foldMetrics(e,t.transcript_path);return n.kind===`failed`?Ln(`metrics (${e}): ${n.reason}`):I({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:this.calculateLastResponseTime(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 lS=new Map;function uS(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var dS=class{async getSessionId(){if(!process.env.TMUX_PANE)return L;let e=uS(process.env.TMUX),t=lS.get(e);if(t!==void 0)return t;D(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await be({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?I(n.stdout.trim()):L:Ln(`tmux display-message: ${n.reason}`);return lS.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};function fS(e){return e<32||e===127||e>=128&&e<=159}function pS(e,t){let n=``;for(let t of e)n+=fS(t.codePointAt(0)??0)?` `:t;n=n.replace(/\s+/g,` `).trim();let r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const mS=`\x1B[38;2;255;255;255m`,hS=`\x1B[48;2;200;40;40m`,gS=`\x1B[0m`,_S=new dx;ye(_S.launchStats);const vS=new sr({counters:_S,logger:F}),yS=new mr({watchers:vS,logger:F}),bS=new Kr,xS=new vx,SS=new oS,CS=new cS,wS=new dS,TS=new lx({gitService:yS,sessionState:xS,watchers:vS});let ES=null,DS=null;function OS(){t.on(`uncaughtException`,e=>{F(`error`,`uncaughtException: ${e.stack||e.message}`),zS(1)}),t.on(`unhandledRejection`,e=>{F(`error`,`unhandledRejection: ${String(e)}`),zS(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{F(`info`,`received ${e}, shutting down`),zS(0)});ES=bn(t.pid);let e=kn(jn(ES));if(!e.decision.allow){F(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),zS(1);return}DS=e.registryPath,r.mkdirSync(De(),{recursive:!0}),Ae(Oe()),xS.useStorage(new xx(Me(),500,F)),Cn({anchor:Sn(t.env),isAlive:wn,onOrphaned:e=>{F(`info`,`parent watchdog: ${e}; shutting down`),zS(0)}}),kS(g.createServer({allowHalfOpen:!1},e=>{BS(e)}),Oe(),!1)}function kS(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){F(`error`,`server error: ${i.message}`),zS(1);return}if(r){F(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}AS(e,n)}),e.listen(n,()=>jS(n))}function AS(e,n){let i=dn(fn(k(n)),(e,t)=>yn(e,t,{readStartTime:vn,pidAlive:wn}));if(i.kind===`attach-and-exit`){F(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}F(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){F(`error`,`cannot unlink stale socket ${n}: ${e.message}`),zS(1);return}}kS(e,n,!0)}function jS(e){let n=hn(e);if(n.kind!==`present`){F(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),zS(0);return}IS(e);try{r.chmodSync(e,384)}catch(e){F(`warn`,`chmod socket failed: ${e.message}`)}F(`info`,`daemon up: pid=${t.pid} v=3 sock=${e}`),dt(),NS(),FS(),MS(e,n.identity)}function MS(e,n){_n({bound:n,myPid:t.pid,readIdentity:()=>hn(e),readLease:()=>fn(k(e)),shutdown:e=>zS(e),log:F}).arm()}function NS(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(y(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{}if(i.size===0)return;let a=setInterval(()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){F(`info`,`binary mtime changed (${e}); shutting down`),clearInterval(a),zS(0);return}}catch(e){F(`warn`,`bin stat failed: ${e.message}`)}},6e4);a.unref()}let PS=null;function FS(){PS=px(hx(_S.startedAt.getTime(),e=>zS(e))),PS.arm()}function IS(e){let n=pn(k(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:ES});n!==null&&F(`warn`,`lease write failed: ${n}`)}let LS=0,RS=!1;function zS(e){if(!RS){RS=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{yS.close()}catch(e){F(`warn`,`gitService close failed: ${e.message}`)}try{bS.close()}catch(e){F(`warn`,`usageStore close failed: ${e.message}`)}try{vS.closeAll()}catch(e){F(`warn`,`watcherRegistry close failed: ${e.message}`)}try{xS.flush()}catch(e){F(`warn`,`sessionState flush failed: ${e.message}`)}mn(je(),t.pid),DS!==null&&An(DS,t.pid,Dn,e=>r.unlinkSync(e)),In(),t.exit(e)}}function BS(e){LS++,_S.inFlight=LS;let t=!1,n=(n,r)=>{if(t){r!==null&&F(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>zS(r);try{e.end(He(n),i)}catch(e){F(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{_S.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=Ue(e=>{HS(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{F(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{F(`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=>{F(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),LS=Math.max(0,LS-1),_S.inFlight=LS})}const VS=e=>({resp:e,exitAfterFlush:null});async function HS(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return VS({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?F(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):F(`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 VS({ok:!0,stats:_S.snapshot({gitCache:yS.getStats(),usageCache:bS.getStats(),renderCacheSize:TS.size,watchersActive:vS.size(),nextRestartReason:PS?.describeNextRestart()??null})});if(e.kind===`render`){_S.requestsTotal++;let t=Date.now();try{let{report:n}=Kx(e.hookData);for(let e of n.unknownTopLevelFields)F(`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 _S.requestsErrored++,F(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),VS({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=GS(e.args),s=e.hookData.session_id,c=xS.get(s,`config-override`)??a,l=TS.getOrCreate(i,e.cwd,c),u=Be(e.termCols),d=aS(u??120),f={...YS,width:d},p=``;if(l.state!==null){let t=n_(xS.get(e.hookData.session_id,`preset`),l.state.config.globals.preset,l.state.config.presets),n=a_(l.state.config,t),r={preset:t,theme:mc(xS.get(e.hookData.session_id,`theme`),n.palette),look:vc(xS.get(e.hookData.session_id,`look`),n.look,l.state.config.looks),style:Sc(xS.get(e.hookData.session_id,`style`),n.style),autoWrap:n.autoWrap??!0,padding:n.padding??1,charset:n.charset??`unicode`,colorCompatibility:n.colorCompatibility??`truecolor`},i=await iv(e.hookData,$S,e.cwd,l.state.neededInputPaths,r),a=py(r.theme);f.style=r.style,f.wrap=r.autoWrap,f.padding=r.padding,f.charset=r.charset,f.colorCompatibility=r.colorCompatibility,p=ob(l.state.config,l.state.compiled,l.state.store,l.state.registry,i,a,f,{perSegmentSink:l.state.lastRenderCellsBySegment},{look:yc(l.state.config.looks,r.look),preset:r.preset})}let m=xS.get(e.hookData.session_id,`click.error`);m&&xS.clear(e.hookData.session_id,`click.error`);let h=[o,l.lastError,m].filter(Boolean).join(`
113
- `)||null,g=qS(p,h,l.lastWarning),_=Date.now()-t,v=yS.getStats(),y=bS.getStats();return F(`info`,`render sid=${e.hookData.session_id??`?`} took=${_}ms termCols=${u??`?`} width=${d} git=${v.size}/${v.hits}h/${v.misses}m usage=${y.size}/${y.hits}h/${y.misses}m err=${l.lastError?`Y`:`N`} warn=${l.lastWarning?`Y`:`N`}`),VS({ok:!0,output:g+`
114
- `})}catch(e){throw _S.requestsErrored++,e}}if(e.kind===`click`)return VS(await eC(e.verb,e.value));if(e.kind===`debug`){if(!iS(e.what))return VS({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${rS.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=TS.firstPopulatedState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?QS(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):ZS};return VS({ok:!0,debug:Jx(e.what,n)})}return VS({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}const US=`\x1B]8;;`,WS=`\x1B]8;;\x1B\\`;function GS(e){let{values:t,tokens:n}=b({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}`))],i=t.config;return{configFile:i===void 0?void 0:N_(i),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}function KS(e,t,n,r){let i=Pt([{verb:e,args:[t]}]),a=t.split(/\r\n|\r|\n/).map(e=>pS(e,120)).filter(Boolean).slice(0,8);return a.length===0?``:[`${US}${i}\\${n}${r} ⚠ ${a[0]} ${gS}${WS}`,...a.slice(1).map(e=>`${US}${i}\\${n}${r} ${e} ${gS}${WS}`)].join(`
115
- `)}function qS(e,t,n){let r=[];if(t&&r.push(KS(Dt,t,hS,mS)),n&&r.push(KS(Ot,n,`\x1B[48;2;220;160;40m`,`\x1B[38;2;0;0;0m`)),r.length===0)return e;let i=r.join(`
116
- `);return e?`${i}\n${e}`:i}const JS={sessionState:xS,dlog:F},YS={style:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:`unicode`},XS={...YS,width:1/0},ZS=new Map;function QS(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,uy(a,{...XS,charset:t,colorCompatibility:n}));return r}const $S={gitProvider:yS,usageStore:bS,contextProvider:SS,metricsProvider:CS,tmuxService:wS,log:F,clock:()=>new Date};function eC(e,t){let n=Ux.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,JS),{ok:!0,output:``}}catch(e){let t=e instanceof Sx?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const tC={connectMs:200,budgetMs:500};async function nC(e){let n=e.includes(`--json`),r=await rC();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${Ze(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
117
- `);return}t.stdout.write(sC(r.value))}function rC(){return Ge({kind:`stats`},tC,e=>`stats`in e?e.stats:void 0)}function iC(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function aC(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function oC(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 sC(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(` startedAt ${e.startedAt}`),t.push(` uptime ${oC(e.uptimeSec)}`),t.push(` rss ${iC(e.rssBytes)}`),t.push(` heapUsed ${iC(e.heapUsedBytes)}`),t.push(` heapTotal ${iC(e.heapTotalBytes)}`),t.push(` external ${iC(e.externalBytes)}`),t.push(` arrayBuffers ${iC(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 ${aC(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 ${aC(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(`
111
+ `+t:t}this.refreshWatcher(e,t)}buildState(e,t){let{config:n,source:r}=R_(t,Sv),i=Kb(Ne(),F),a=z_(nl(tl({globals:o_(i.globals,n.presets)},n),i.segmentPalette),t??`<default>`,r),o=new cx,s=new oy(o,a.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),c,l=[];try{c=ab(a,s,{cwd:e.cwd});for(let{key:e,spec:t}of Fb(a))l.push(Ob(e,t));for(let{key:e,spec:t}of rx(a))l.push(ix(e,t))}catch(e){for(let e of l)e();throw s.dispose(),e}return{config:a,store:o,registry:s,compiled:c,neededInputPaths:tv(a),lastRenderCellsBySegment:new Map,validatorDisposers:l}}refreshWatcher(e,t){(t!==e.configFilePath||e.watcher===null)&&(e.configFilePath=t,this.rebindWatcher(e,t))}rebindWatcher(e,t){e.watcher&&=(e.watcher.release(),null);let n=[...F_(e.projectDir,e.cwd,e.configFile),Ne()],i=new Map;for(let e of n){let t=c.dirname(e);if(!r.existsSync(t))continue;let n=c.basename(e);i.has(t)||i.set(t,new Set),i.get(t).add(n)}let a=[...i.entries()].map(([e,t])=>({path:e,filenames:[...t]})),o=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${t??`<none>`}`;e.watcher=this.deps.watchers.acquire(o,{files:t===null?[]:[t],dirs:a},()=>this.onConfigChanged(e))}onConfigChanged(e){F(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstPopulatedState(){for(let e of this.entries.values())if(e.state!==null)return e.state;return null}};const dx=16384;var fx=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<dx){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%dx}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: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}}};const px=(parseInt(process.env.CC_CANDYBAR_RSS_LIMIT_MB??``,10)||512)*1024*1024;function mx(e){let t=e.rssLimitBytes??px,n=e.snapshotsKeep??3,r=!1;function i(){if(r)return!0;let i=e.rssBytes();if(i<=t)return!1;r=!0,e.log(`warn`,`RSS ${i} > limit ${t}; writing heap snapshot then shutting down`);try{let t=new Date(e.now()).toISOString().replace(/[:.]/g,`-`),r=c.join(e.snapshotDir,`heap-${t}-${e.pid}.heapsnapshot`),i=e.writeHeapSnapshot(r);e.log(`info`,`heap snapshot written: ${i}`),hx(e.listSnapshots(),n,e.removeFile)}catch(t){e.log(`warn`,`heap snapshot failed: ${t.message}`)}return e.shutdown(0),!0}function a(){let n=e.rssBytes();return n>t*.75?`rss ${n} approaching limit ${t}`:null}function o(e=6e4){let t=setInterval(()=>{i()},e);return t.unref(),{disarm:()=>clearInterval(t)}}return{checkRss:i,describeNextRestart:a,arm:o}}function hx(e,t,n){let r=[...e].sort((e,t)=>{let n=e.slice(e.lastIndexOf(`/`)+1);return t.slice(t.lastIndexOf(`/`)+1).localeCompare(n)});for(let e of r.slice(t))try{n(e)}catch{}}function gx(e,t,n={}){let i=De();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:F,rssBytes:()=>process.memoryUsage().rss,writeHeapSnapshot:e=>E.writeHeapSnapshot(e),listSnapshots:()=>{try{return r.readdirSync(i).filter(e=>e.startsWith(`heap-`)&&e.endsWith(`.heapsnapshot`)).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}const _x={load:()=>({}),save:()=>{},flush:()=>{}};function vx(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var yx=class{sessions;storage;atom=(0,Y.createAtom)(`SessionState`);constructor(e=_x,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=vx(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,Y.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,Y.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,Y.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}};const bx=(e,t)=>D(t);function xx(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 Sx=class{timer=null;pending=null;constructor(e,t=500,n=bx){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 xx(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}`)}}},Cx=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function wx(e){if(!e)throw new Cx(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new Cx(`invalid session id "${e}"`);return e}function Tx(e){return Ex(()=>decodeURIComponent(e))}function Ex(e){try{return e()}catch(e){throw e instanceof URIError?new Cx(`malformed wire encoding: ${e.message}`):e}}function Dx(e,t){let n=xe({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 Ox=(e,t)=>Dx(Tx(e),t),kx=(e,t)=>{let n=xe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,Tx(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`})`)}},Ax=(e,t)=>Dx(Tx(e),t),jx=(e,t)=>Dx(Tx(e),t),Mx=(e,t)=>{let n=wx(Tx(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},Nx=(e,t)=>{let[n=``,...r]=Ex(()=>Nt(e)),i=wx(n);if(r.length===0)throw new Cx(`set-state: <key>/<value> is required (have keys: ${Db().join(`, `)})`);if(r.length%2!=0)throw new Cx(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${Db().join(`, `)})`);let a=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new Cx(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=kb(t,n);if(!i.ok)throw new Cx(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},Px=/^-?\d+$/;function Fx(e,t,n){return e>n?t:e<t?n:e}const Ix=(e,t)=>{let[n=``,r=``,i=``]=Ex(()=>Nt(e)),a=wx(n);if(!r)throw new Cx(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Px.test(i))throw new Cx(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=Ab(r);if(!s)throw new Cx(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${Db().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&Px.test(c)?Math.max(s.min,Math.min(s.max,parseInt(c,10))):s.seed,u=Fx(l+o,s.min,s.max),d=kb(r,String(u));if(!d.ok)throw new Cx(`step-state: ${d.reason}`);t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function Lx(e){if(!fl(e))throw Error(`step-config: "${e}" validated as a bounded config-writable key but is not a Globals field — registration/loader invariant broken`)}const Rx=(e,t)=>{let[n=``,r=``,i=``]=Ex(()=>Nt(e)),a=wx(n);if(!r)throw new Cx(`set-config: <key>/<value> is required (have keys: ${Zb().join(`, `)})`);let o=Qb(r,i);if(!o.ok)throw new Cx(`set-config: ${o.reason}`);let s=Bb(r,o.value);Jb(Ne(),r,s,t.dlog),t.dlog(`info`,`set-config: ${r}=${o.value} (session=${a})`)},zx=(e,t)=>{let[n=``,r=``,i=``]=Ex(()=>Nt(e)),a=wx(n);if(!r)throw new Cx(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Px.test(i))throw new Cx(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=$b(r);if(!s)throw new Cx(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${Zb().join(`, `)})`);Lx(r);let c=Gb(Ne(),t.dlog)[r],l=typeof c==`number`?Math.max(s.min,Math.min(s.max,c)):s.seed,u=Fx(l+o,s.min,s.max),d=Qb(r,String(u));if(!d.ok)throw new Cx(`step-config: ${d.reason}`);let f=Bb(r,d.value);Jb(Ne(),r,f,t.dlog),t.dlog(`info`,`step-config: ${r} ${l}→${d.value} (by ${o}, session=${a})`)},Bx=(e,t)=>{let[n=``,r=``]=Ex(()=>Nt(e)),i=wx(n);if(!r||!Zb().includes(r))throw new Cx(`reset-config: unknown config key "${r}" (have: ${Zb().join(`, `)})`);Yb(Ne(),r,t.dlog),t.dlog(`info`,`reset-config: ${r} (session=${i})`)},Vx=`config-override`,Hx=new Map([[Tt,Ox],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new Cx(`load-config: expected <sessionId>/<path> (missing separator)`);let r=wx(Ex(()=>decodeURIComponent(e.slice(0,n)))),i=Ex(()=>decodeURIComponent(e.slice(n+1))).trim();if(i!==``){if(!i.startsWith(`/`))throw new Cx(`load-config: path must be absolute, got "${i}"`);if(!/\.(json5?|json)$/.test(i))throw new Cx(`load-config: path must end with .json5 or .json, got "${i}"`)}i===``?(t.sessionState.clear(r,Vx),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,Vx,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Et,kx],[Ct,Nx],[wt,Ix],[kt,Rx],[At,zx],[jt,Bx],[Dt,Ax],[Ot,jx],[`toolbar-toggle`,Mx]]),Ux=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of Ft(e)){if(!i&&(a===`set-state`||a===`step-state`||a===`set-config`||a===`step-config`||a===`reset-config`||a===`toolbar-toggle`)){let e=Nt(o);e.length>0&&e[0]&&(i=e[0])}let e=Hx.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof Cx||(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(`
112
+ `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new Cx(e)}},Wx=new Map([...Hx,[St,Ux]]);Object.freeze([...Wx.keys()]);const Gx=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`]),Kx=[[`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`]];function qx(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of Kx){let i=Jx(n,e);if(i==null)t.missingRequired.push(e);else{let n=Array.isArray(i)?`array`:typeof i;(r===`object`?n!==`object`:n!==r)&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))Gx.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function Jx(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 Yx(e,t){switch(e){case`vars`:return{what:e,vars:Xx(t)};case`segments`:return{what:e,segments:eS(t)};case`config`:return{what:e,config:rS(t)}}}function Xx(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=Qx(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,type:r.type,value:r.read(),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:Zx(r.lastUpdatedMs())})}return o}function Zx(e){return e===null?null:Math.max(0,Date.now()-e)}function Qx(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,$x(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}`,$x(i));return t}function $x(e){return e.kind}function eS(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=tS(n),o=[];for(let e of a){let t=n.segments[e];t&&o.push({name:e,template:t.template,referencedVars:nS(t.template,i),lastRender:r.get(e)??null})}return o}function tS(e){let t=[],n=new Set;for(let r of Jr(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 nS(e,t){let n=new Set;for(let r of __(e)){if(t.has(r)){n.add(r);continue}let e=r.split(`.`);for(;e.length>1;){e.pop();let r=e.join(`.`);if(t.has(r)){n.add(r);break}}}return Array.from(n).sort()}function rS(e){return e===null?null:e.config}const iS=[`vars`,`segments`,`config`];function aS(e){return typeof e==`string`&&iS.includes(e)}function oS(e){return Math.max(1,e-2)}var sS=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 D(`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);D(`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{D(`Calculating context tokens from transcript: ${e}`);let n=await Ar(e);if(n.length===0)return D(`No entries in transcript`),L;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,D(`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 D(`Most recent main chain context: ${n} tokens (limit: ${t})`),I({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return D(`No main chain entries with usage data found`),L}catch(e){return Ln(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return I(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}};function cS(e){let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.firstContentType===`tool_result`;return t===`user`&&!n}var lS=class{state=new Map;calculateLastResponseTime(e){if(e.length===0)return null;let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(cS(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}async foldMetrics(e,t){let n=this.state.get(e),r=vr(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.state.delete(e),this.state.set(e,n),{kind:`ok`,value:{messageCount:n.messageCount,recent:[...n.recent]}};let i=await Pr(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:{messageCount:n?.messageCount??0,recent:[...n?.recent??[]]}};let{entries:a,cursor:o,reset:s}=i.value,c=n&&!s?n:void 0,l=c?.messageCount??0,u=c?[...c.recent]:[];for(let e of a)e.isSidechain||(cS(e)&&l++,u.push(e));for(u.length>20&&(u=u.slice(-20)),this.state.delete(e),this.state.set(e,{cursor:o,messageCount:l,recent:u});this.state.size>256;){let e=this.state.keys().next().value;if(e===void 0)break;this.state.delete(e)}return{kind:`ok`,value:{messageCount:l,recent:[...u]}}}async getMetricsInfo(e,t){if(D(`Getting metrics from hook data for session: ${e}`),!t.cost)return L;let n=await this.foldMetrics(e,t.transcript_path);return n.kind===`failed`?Ln(`metrics (${e}): ${n.reason}`):I({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:this.calculateLastResponseTime(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 uS=new Map;function dS(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var fS=class{async getSessionId(){if(!process.env.TMUX_PANE)return L;let e=dS(process.env.TMUX),t=uS.get(e);if(t!==void 0)return t;D(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await be({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?I(n.stdout.trim()):L:Ln(`tmux display-message: ${n.reason}`);return uS.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};function pS(e){return e<32||e===127||e>=128&&e<=159}function mS(e,t){let n=``;for(let t of e)n+=pS(t.codePointAt(0)??0)?` `:t;n=n.replace(/\s+/g,` `).trim();let r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const hS=`\x1B[38;2;255;255;255m`,gS=`\x1B[48;2;200;40;40m`,_S=`\x1B[0m`,vS=new fx;ye(vS.launchStats);const yS=new sr({counters:vS,logger:F}),bS=new mr({watchers:yS,logger:F}),xS=new Kr,SS=new yx,CS=new sS,wS=new lS,TS=new fS,ES=new ux({gitService:bS,sessionState:SS,watchers:yS});let DS=null,OS=null;function kS(){t.on(`uncaughtException`,e=>{F(`error`,`uncaughtException: ${e.stack||e.message}`),BS(1)}),t.on(`unhandledRejection`,e=>{F(`error`,`unhandledRejection: ${String(e)}`),BS(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{F(`info`,`received ${e}, shutting down`),BS(0)});DS=bn(t.pid);let e=kn(jn(DS));if(!e.decision.allow){F(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),BS(1);return}OS=e.registryPath,r.mkdirSync(De(),{recursive:!0}),Ae(Oe()),SS.useStorage(new Sx(Me(),500,F)),Cn({anchor:Sn(t.env),isAlive:wn,onOrphaned:e=>{F(`info`,`parent watchdog: ${e}; shutting down`),BS(0)}}),AS(g.createServer({allowHalfOpen:!1},e=>{VS(e)}),Oe(),!1)}function AS(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){F(`error`,`server error: ${i.message}`),BS(1);return}if(r){F(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}jS(e,n)}),e.listen(n,()=>MS(n))}function jS(e,n){let i=dn(fn(k(n)),(e,t)=>yn(e,t,{readStartTime:vn,pidAlive:wn}));if(i.kind===`attach-and-exit`){F(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}F(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){F(`error`,`cannot unlink stale socket ${n}: ${e.message}`),BS(1);return}}AS(e,n,!0)}function MS(e){let n=hn(e);if(n.kind!==`present`){F(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),BS(0);return}LS(e);try{r.chmodSync(e,384)}catch(e){F(`warn`,`chmod socket failed: ${e.message}`)}F(`info`,`daemon up: pid=${t.pid} v=3 sock=${e}`),dt(),PS(),IS(),NS(e,n.identity)}function NS(e,n){_n({bound:n,myPid:t.pid,readIdentity:()=>hn(e),readLease:()=>fn(k(e)),shutdown:e=>BS(e),log:F}).arm()}function PS(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(y(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{}if(i.size===0)return;let a=setInterval(()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){F(`info`,`binary mtime changed (${e}); shutting down`),clearInterval(a),BS(0);return}}catch(e){F(`warn`,`bin stat failed: ${e.message}`)}},6e4);a.unref()}let FS=null;function IS(){FS=mx(gx(vS.startedAt.getTime(),e=>BS(e))),FS.arm()}function LS(e){let n=pn(k(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:DS});n!==null&&F(`warn`,`lease write failed: ${n}`)}let RS=0,zS=!1;function BS(e){if(!zS){zS=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{bS.close()}catch(e){F(`warn`,`gitService close failed: ${e.message}`)}try{xS.close()}catch(e){F(`warn`,`usageStore close failed: ${e.message}`)}try{yS.closeAll()}catch(e){F(`warn`,`watcherRegistry close failed: ${e.message}`)}try{SS.flush()}catch(e){F(`warn`,`sessionState flush failed: ${e.message}`)}mn(je(),t.pid),OS!==null&&An(OS,t.pid,Dn,e=>r.unlinkSync(e)),In(),t.exit(e)}}function VS(e){RS++,vS.inFlight=RS;let t=!1,n=(n,r)=>{if(t){r!==null&&F(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>BS(r);try{e.end(He(n),i)}catch(e){F(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{vS.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=Ue(e=>{US(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{F(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{F(`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=>{F(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),RS=Math.max(0,RS-1),vS.inFlight=RS})}const HS=e=>({resp:e,exitAfterFlush:null});async function US(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return HS({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?F(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):F(`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 HS({ok:!0,stats:vS.snapshot({gitCache:bS.getStats(),usageCache:xS.getStats(),renderCacheSize:ES.size,watchersActive:yS.size(),nextRestartReason:FS?.describeNextRestart()??null})});if(e.kind===`render`){vS.requestsTotal++;let t=Date.now();try{let{report:n}=qx(e.hookData);for(let e of n.unknownTopLevelFields)F(`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 vS.requestsErrored++,F(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),HS({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=KS(e.args),s=e.hookData.session_id,c=SS.get(s,`config-override`)??a,l=ES.getOrCreate(i,e.cwd,c),u=Be(e.termCols),d=oS(u??120),f={...XS,width:d},p=``;if(l.state!==null){let t=n_(SS.get(e.hookData.session_id,`preset`),l.state.config.globals.preset,l.state.config.presets),n=a_(l.state.config,t),r={preset:t,theme:mc(SS.get(e.hookData.session_id,`theme`),n.palette),look:vc(SS.get(e.hookData.session_id,`look`),n.look,l.state.config.looks),style:Sc(SS.get(e.hookData.session_id,`style`),n.style),autoWrap:n.autoWrap??!0,padding:n.padding??1,charset:n.charset??`unicode`,colorCompatibility:n.colorCompatibility??`truecolor`},i=await av(e.hookData,eC,e.cwd,l.state.neededInputPaths,r),a=my(r.theme);f.style=r.style,f.wrap=r.autoWrap,f.padding=r.padding,f.charset=r.charset,f.colorCompatibility=r.colorCompatibility,p=sb(l.state.config,l.state.compiled,l.state.store,l.state.registry,i,a,f,{perSegmentSink:l.state.lastRenderCellsBySegment},{look:yc(l.state.config.looks,r.look),preset:r.preset})}let m=SS.get(e.hookData.session_id,`click.error`);m&&SS.clear(e.hookData.session_id,`click.error`);let h=[o,l.lastError,m].filter(Boolean).join(`
113
+ `)||null,g=JS(p,h,l.lastWarning),_=Date.now()-t,v=bS.getStats(),y=xS.getStats();return F(`info`,`render sid=${e.hookData.session_id??`?`} took=${_}ms termCols=${u??`?`} width=${d} git=${v.size}/${v.hits}h/${v.misses}m usage=${y.size}/${y.hits}h/${y.misses}m err=${l.lastError?`Y`:`N`} warn=${l.lastWarning?`Y`:`N`}`),HS({ok:!0,output:g+`
114
+ `})}catch(e){throw vS.requestsErrored++,e}}if(e.kind===`click`)return HS(await tC(e.verb,e.value));if(e.kind===`debug`){if(!aS(e.what))return HS({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${iS.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=ES.firstPopulatedState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?$S(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):QS};return HS({ok:!0,debug:Yx(e.what,n)})}return HS({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}const WS=`\x1B]8;;`,GS=`\x1B]8;;\x1B\\`;function KS(e){let{values:t,tokens:n}=b({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}`))],i=t.config;return{configFile:i===void 0?void 0:P_(i),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}function qS(e,t,n,r){let i=Pt([{verb:e,args:[t]}]),a=t.split(/\r\n|\r|\n/).map(e=>mS(e,120)).filter(Boolean).slice(0,8);return a.length===0?``:[`${WS}${i}\\${n}${r} ⚠ ${a[0]} ${_S}${GS}`,...a.slice(1).map(e=>`${WS}${i}\\${n}${r} ${e} ${_S}${GS}`)].join(`
115
+ `)}function JS(e,t,n){let r=[];if(t&&r.push(qS(Dt,t,gS,hS)),n&&r.push(qS(Ot,n,`\x1B[48;2;220;160;40m`,`\x1B[38;2;0;0;0m`)),r.length===0)return e;let i=r.join(`
116
+ `);return e?`${i}\n${e}`:i}const YS={sessionState:SS,dlog:F},XS={style:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:`unicode`},ZS={...XS,width:1/0},QS=new Map;function $S(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,dy(a,{...ZS,charset:t,colorCompatibility:n}));return r}const eC={gitProvider:bS,usageStore:xS,contextProvider:CS,metricsProvider:wS,tmuxService:TS,log:F,clock:()=>new Date};function tC(e,t){let n=Wx.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,YS),{ok:!0,output:``}}catch(e){let t=e instanceof Cx?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const nC={connectMs:200,budgetMs:500};async function rC(e){let n=e.includes(`--json`),r=await iC();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${Ze(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
117
+ `);return}t.stdout.write(cC(r.value))}function iC(){return Ge({kind:`stats`},nC,e=>`stats`in e?e.stats:void 0)}function aC(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function oC(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function sC(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 cC(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(` startedAt ${e.startedAt}`),t.push(` uptime ${sC(e.uptimeSec)}`),t.push(` rss ${aC(e.rssBytes)}`),t.push(` heapUsed ${aC(e.heapUsedBytes)}`),t.push(` heapTotal ${aC(e.heapTotalBytes)}`),t.push(` external ${aC(e.externalBytes)}`),t.push(` arrayBuffers ${aC(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 ${oC(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 ${oC(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(`
118
118
  `)+`
119
- `}const cC={connectMs:200,budgetMs:500};async function lC(e,n){let r=n.includes(`--json`),i=await uC(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${Ze(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
120
- `);return}t.stdout.write(dC(i.value))}function uC(e){return Ge({kind:`debug`,what:e},cC,e=>`debug`in e?e.debug:void 0)}function dC(e){switch(e.what){case`vars`:return fC(e.vars);case`segments`:return pC(e.segments);case`config`:return mC(e.config);default:return e}}function fC(e){if(e.length===0)return`no variables (DSL not active)
121
- `;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);for(let i of e){let e=i.ageMs===null?``:` ${gC(i.ageMs)}`,a=i.lastError?` ✗ ${i.lastError.message}`:``;t.push(` ${i.name.padEnd(n)} ${(i.source??`—`).padEnd(r)} ${i.type.padEnd(7)} ${hC(i.value)}${e}${a}`)}return t.join(`
119
+ `}const lC={connectMs:200,budgetMs:500};async function uC(e,n){let r=n.includes(`--json`),i=await dC(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${Ze(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
120
+ `);return}t.stdout.write(fC(i.value))}function dC(e){return Ge({kind:`debug`,what:e},lC,e=>`debug`in e?e.debug:void 0)}function fC(e){switch(e.what){case`vars`:return pC(e.vars);case`segments`:return mC(e.segments);case`config`:return hC(e.config);default:return e}}function pC(e){if(e.length===0)return`no variables (DSL not active)
121
+ `;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);for(let i of e){let e=i.ageMs===null?``:` ${_C(i.ageMs)}`,a=i.lastError?` ✗ ${i.lastError.message}`:``;t.push(` ${i.name.padEnd(n)} ${(i.source??`—`).padEnd(r)} ${i.type.padEnd(7)} ${gC(i.value)}${e}${a}`)}return t.join(`
122
122
  `)+`
123
- `}function pC(e){if(e.length===0)return`no segments (DSL not active)
123
+ `}function mC(e){if(e.length===0)return`no segments (DSL not active)
124
124
  `;let t=[`segments (${e.length})`,``];for(let n of e)t.push(` ${n.name}`),t.push(` template ${n.template}`),n.referencedVars.length>0&&t.push(` vars ${n.referencedVars.join(`, `)}`),n.lastRender!==null&&t.push(` last ${n.lastRender}`);return t.join(`
125
125
  `)+`
126
- `}function mC(e){return e===null?`config: DSL not active
126
+ `}function hC(e){return e===null?`config: DSL not active
127
127
  `:JSON.stringify(e,null,2)+`
128
- `}function hC(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function gC(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function _C(){let e=yC();return e===null?null:r.readFileSync(e,`utf-8`)}function vC(){let e;try{e=_C()}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 yC(){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 bC(e){let t=`/home/tester`,n=Math.floor(Date.now()/1e3);return{hook_event_name:`Status`,session_id:`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,version:`1.15.0`,home:t,cwd:`${t}/code/cc-candybar/src`,transcript_path:`${t}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:{current_dir:`${t}/code/cc-candybar/src`,project_dir:`${t}/code/cc-candybar`},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:n+2*3600},weekly:{percentage:21,resetsAt:n+5*86400},cache:{expiresAt:n+900},tmux:{session:`work`},theme:{effective:e.theme},look:{effective:e.look},style:{effective:e.style},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding}}}function xC(e,n=t.cwd()){let i=e===void 0?F_(n,n):c.resolve(N_(e));if(e!==void 0&&i!==null){let e;try{e=r.statSync(i,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:i,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:i,message:`not a file`}}let a=[],o=I_(n,n);o!==null&&a.push(o);try{return{kind:`clean`,configPath:i,warnings:a,rendered:SC(i,n,a)}}catch(e){let t=e;return i!==null&&typeof t==`object`&&t&&typeof t.code==`string`&&t.path===i&&typeof t.message==`string`?{kind:`unreadable`,path:i,message:t.message}:{kind:`fatal`,configPath:i,message:e instanceof Tc||e instanceof Error?e.message:String(e),warnings:a}}}function SC(e,t,n){let{config:r,source:i}=L_(e,xv),a=R_(r,e??`<default>`,i),o=new sx,s=new ay(o,a.globals.default_empty_value??``,void 0,new vx);try{let e=ib(a,s,{cwd:t});n.push(...e.loadWarnings),Pb(a);let r=n_(null,a.globals.preset,a.presets),i=a_(a,r),c={preset:r,theme:mc(null,i.palette),look:vc(null,i.look,a.looks),style:Sc(null,i.style),autoWrap:i.autoWrap??!0,padding:i.padding??1,charset:i.charset??`unicode`,colorCompatibility:i.colorCompatibility??`truecolor`},l=[],u=ob(a,e,o,s,bC(c),py(c.theme),{style:c.style,width:200,colorCompatibility:c.colorCompatibility,wrap:c.autoWrap,padding:c.padding,charset:c.charset},{onSegmentError:(e,t)=>l.push(`segment "${e}": ${t}`)},{look:yc(a.looks,c.look),preset:c.preset});if(l.length>0)throw Error(`config renders with ${l.length} segment error${l.length===1?``:`s`} (the daemon would render ⚠ error cells):\n`+l.map(e=>` ${e}`).join(`
129
- `));return u}finally{s.dispose()}}function CC(e){return e.map(e=>`warning: ${e}\n`).join(``)}function wC(e){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`,stderr:CC(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:CC(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}}}function TC(e){(e.length>1||e[0]===``)&&(t.stderr.write(`check: expected at most one non-empty path
128
+ `}function gC(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function _C(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function vC(){let e=bC();return e===null?null:r.readFileSync(e,`utf-8`)}function yC(){let e;try{e=vC()}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 bC(){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 xC(e){let t=`/home/tester`,n=Math.floor(Date.now()/1e3);return{hook_event_name:`Status`,session_id:`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,version:`1.15.0`,home:t,cwd:`${t}/code/cc-candybar/src`,transcript_path:`${t}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:{current_dir:`${t}/code/cc-candybar/src`,project_dir:`${t}/code/cc-candybar`},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:n+2*3600},weekly:{percentage:21,resetsAt:n+5*86400},cache:{expiresAt:n+900},tmux:{session:`work`},theme:{effective:e.theme},look:{effective:e.look},style:{effective:e.style},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding}}}function SC(e,n=t.cwd()){let i=e===void 0?I_(n,n):c.resolve(P_(e));if(e!==void 0&&i!==null){let e;try{e=r.statSync(i,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:i,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:i,message:`not a file`}}let a=[],o=L_(n,n);o!==null&&a.push(o);try{return{kind:`clean`,configPath:i,warnings:a,rendered:CC(i,n,a)}}catch(e){let t=e;return i!==null&&typeof t==`object`&&t&&typeof t.code==`string`&&t.path===i&&typeof t.message==`string`?{kind:`unreadable`,path:i,message:t.message}:{kind:`fatal`,configPath:i,message:e instanceof Tc||e instanceof Error?e.message:String(e),warnings:a}}}function CC(e,t,n){let{config:r,source:i}=R_(e,Sv),a=z_(r,e??`<default>`,i),o=new cx,s=new oy(o,a.globals.default_empty_value??``,void 0,new yx);try{let e=ab(a,s,{cwd:t});n.push(...e.loadWarnings),Fb(a);let r=n_(null,a.globals.preset,a.presets),i=a_(a,r),c={preset:r,theme:mc(null,i.palette),look:vc(null,i.look,a.looks),style:Sc(null,i.style),autoWrap:i.autoWrap??!0,padding:i.padding??1,charset:i.charset??`unicode`,colorCompatibility:i.colorCompatibility??`truecolor`},l=[],u=sb(a,e,o,s,xC(c),my(c.theme),{style:c.style,width:200,colorCompatibility:c.colorCompatibility,wrap:c.autoWrap,padding:c.padding,charset:c.charset},{onSegmentError:(e,t)=>l.push(`segment "${e}": ${t}`)},{look:yc(a.looks,c.look),preset:c.preset});if(l.length>0)throw Error(`config renders with ${l.length} segment error${l.length===1?``:`s`} (the daemon would render ⚠ error cells):\n`+l.map(e=>` ${e}`).join(`
129
+ `));return u}finally{s.dispose()}}function wC(e){return e.map(e=>`warning: ${e}\n`).join(``)}function TC(e){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`,stderr:wC(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:wC(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}}}function EC(e){(e.length>1||e[0]===``)&&(t.stderr.write(`check: expected at most one non-empty path
130
130
  Usage: cc-candybar check [config-file]
131
- `),t.exit(2));let n=wC(xC(e[0]));t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}const EC=`${hS}${mS}`;function DC(e){return`${EC}⚠ cc-candybar: ${OC(e)}${gS}\n`}function OC(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: ${pS(e.message,60)}`;case`render_failed`:return`render failed: ${pS(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${pS(e.message,60)}`}}function kC(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
132
- `,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:DC(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function AC(){let e=t.env.COLUMNS;if(e){let t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}let n=t.stderr.columns;if(n&&n>0)return n}function jC(){console.log(`
131
+ `),t.exit(2));let n=TC(SC(e[0]));t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}const DC=`${gS}${hS}`;function OC(e){return`${DC}⚠ cc-candybar: ${kC(e)}${_S}\n`}function kC(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: ${mS(e.message,60)}`;case`render_failed`:return`render failed: ${mS(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${mS(e.message,60)}`}}function AC(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
132
+ `,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:OC(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function jC(){let e=t.env.COLUMNS;if(e){let t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}let n=t.stderr.columns;if(n&&n>0)return n}function MC(){console.log(`
133
133
  cc-candybar - Beautiful powerline statusline for Claude Code
134
134
 
135
135
  Usage: cc-candybar [options]
@@ -179,7 +179,7 @@ Config tooling:
179
179
  config [--json] The effective merged config. (All three query the
180
180
  running daemon; none spawn one.)
181
181
 
182
- `)}async function MC(){try{(t.argv.includes(`--help`)||t.argv.includes(`-h`))&&(jC(),t.exit(0));let e=t.argv[2];if(e===`install`&&(ln(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(M(),t.exit(0)),e===`url-handle`){await on(t.argv[3]);return}if(e===`daemon`){OS();return}if(e===`daemon-stats`&&(await nC(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){TC(t.argv.slice(3));return}if(e===`schema`){vC();return}iS(e)&&(await lC(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
182
+ `)}async function NC(){try{(t.argv.includes(`--help`)||t.argv.includes(`-h`))&&(MC(),t.exit(0));let e=t.argv[2];if(e===`install`&&(ln(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(M(),t.exit(0)),e===`url-handle`){await on(t.argv[3]);return}if(e===`daemon`){kS();return}if(e===`daemon-stats`&&(await rC(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){EC(t.argv.slice(3));return}if(e===`schema`){yC();return}aS(e)&&(await uC(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
183
183
 
184
184
  cc-candybar is designed to be used as a Claude Code statusLine command.
185
185
  It reads hook data from stdin and outputs formatted statusline.
@@ -195,4 +195,4 @@ Add to ~/.claude/settings.json:
195
195
  Run with --help for more options.
196
196
 
197
197
  To test output manually:
198
- echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar --style=powerline`),t.exit(1)),D(`Working directory: ${t.cwd()}`),D(`Process args:`,t.argv);let r=await n(t.stdin);D(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),jC(),t.exit(1));let i=kC(await tt(r,t.argv,t.cwd(),AC()));i.debug!==null&&D(i.debug),i.kick&&rt(),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)}}MC();export{};
198
+ echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar --style=powerline`),t.exit(1)),D(`Working directory: ${t.cwd()}`),D(`Process args:`,t.argv);let r=await n(t.stdin);D(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),MC(),t.exit(1));let i=AC(await tt(r,t.argv,t.cwd(),jC()));i.debug!==null&&D(i.debug),i.kick&&rt(),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)}}NC();export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.27.0",
3
+ "version": "1.28.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",
@@ -91,9 +91,9 @@
91
91
  "mobx": "^6.15.0"
92
92
  },
93
93
  "optionalDependencies": {
94
- "@promptctl/cc-candybar-darwin-arm64": "1.27.0",
95
- "@promptctl/cc-candybar-darwin-x64": "1.27.0",
96
- "@promptctl/cc-candybar-linux-x64": "1.27.0",
97
- "@promptctl/cc-candybar-linux-arm64": "1.27.0"
94
+ "@promptctl/cc-candybar-darwin-arm64": "1.28.0",
95
+ "@promptctl/cc-candybar-darwin-x64": "1.28.0",
96
+ "@promptctl/cc-candybar-linux-x64": "1.28.0",
97
+ "@promptctl/cc-candybar-linux-arm64": "1.28.0"
98
98
  }
99
99
  }
@@ -154,3 +154,35 @@ export function presetRoot(
154
154
  export function presetGlobals(config: DslConfig, name: string): Globals {
155
155
  return { ...config.globals, ...presetByName(config.presets, name).globals };
156
156
  }
157
+
158
+ // [LAW:no-silent-failure] The persisted-overrides analogue of
159
+ // applySegmentPaletteOverrides' stale-segment skip (src/config/loader/
160
+ // merge.ts), one seam over: `configOverridesPath()` is ONE file shared by
161
+ // every project on the machine (candybar-config-engine-71o.2), but `presets`
162
+ // is a PER-CONFIG domain — the one other per-config domain besides `looks`.
163
+ // A `persist: "preset"` click writes a name valid for the config it was
164
+ // clicked against; loading a DIFFERENT project whose config never declared
165
+ // that name must not fail the whole render. validateConfig's cross-ref check
166
+ // (loader/cross-ref.ts) stays fatal for a hand-AUTHORED `globals.preset` —
167
+ // that is a typo in a file the author can see and fix — but a value that
168
+ // only exists because the overrides layer supplied it gets the SAME
169
+ // treatment a stale SessionState pick already gets from effectivePresetName:
170
+ // collapse to the floor, visibly, never throw. Dropping the field here (so
171
+ // it never reaches validateConfig) is what makes that collapse happen for
172
+ // this layer too, instead of a fatal error replacing the whole bar.
173
+ export function sanitizePersistedPresetOverride(
174
+ globalsOverride: Partial<Globals>,
175
+ declaredPresets: Readonly<Record<string, PresetDecl>>,
176
+ ): Partial<Globals> {
177
+ const preset = globalsOverride.preset;
178
+ if (preset === undefined || presetNames(declaredPresets).includes(preset)) {
179
+ return globalsOverride;
180
+ }
181
+ // [LAW:no-defensive-null-guards] Not a broken-invariant throw: an
182
+ // overrides file legitimately outlives any one config's preset names, so
183
+ // this IS the expected shape, not a caller bug — a plain drop, mirroring
184
+ // applySegmentPaletteOverrides' `continue` for the identical reason.
185
+ const rest = { ...globalsOverride };
186
+ delete rest.preset;
187
+ return rest;
188
+ }
@@ -25,6 +25,7 @@ import {
25
25
  } from "../verbs/config-validators.js";
26
26
  import { loadOverrides } from "../config-overrides-store.js";
27
27
  import { configOverridesPath } from "../paths.js";
28
+ import { sanitizePersistedPresetOverride } from "../../config/presets.js";
28
29
  import { VariableStore } from "../../var-system/store.js";
29
30
  import { SourceRegistry } from "../../var-system/sources.js";
30
31
  import type { GitDataProvider } from "./git.js";
@@ -297,8 +298,18 @@ export class RenderCache {
297
298
  // loadOverrides read serves BOTH halves below (globals + segment-palette)
298
299
  // — the overrides file backs two different merge shapes, not two reads.
299
300
  const overrides = loadOverrides(configOverridesPath(), dlog);
301
+ // [LAW:no-silent-failure] `preset` is a per-config domain riding a
302
+ // machine-global overrides file (src/config/presets.ts —
303
+ // sanitizePersistedPresetOverride) — a persisted pick from another
304
+ // project's config must not fail THIS config's load. Every other
305
+ // globals field is registry-static (palette/style/charset/…), so this
306
+ // is the one field that needs sanitizing before the merge below.
307
+ const sanitizedGlobalsOverride = sanitizePersistedPresetOverride(
308
+ overrides.globals,
309
+ merged.presets,
310
+ );
300
311
  const withGlobalsOverrides = mergeWithDefault(
301
- { globals: overrides.globals },
312
+ { globals: sanitizedGlobalsOverride },
302
313
  merged,
303
314
  );
304
315
  // [LAW:one-source-of-truth] The segment-scoped half of the SAME overrides