@promptctl/cc-candybar 1.41.2 → 1.41.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 _ from"node:v8";import{URL as v,URLSearchParams as y,fileURLToPath as b}from"node:url";import{parseArgs as x}from"node:util";import{get as S}from"node:https";import{createHash as C}from"node:crypto";import{setTimeout as w}from"node:timers/promises";import{open as ee,readFile as T,readdir as te,stat as ne}from"node:fs/promises";import{createInterface as re}from"node:readline";import{clearInterval as E,setInterval as D}from"node:timers";var ie=Object.create,ae=Object.defineProperty,oe=Object.getOwnPropertyDescriptor,se=Object.getOwnPropertyNames,ce=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty,ue=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),de=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=se(t),a=0,o=i.length,s;a<o;a++)s=i[a],!le.call(e,s)&&s!==n&&ae(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=oe(t,s))||r.enumerable});return e},fe=(e,t,n)=>(n=e==null?{}:ie(ce(e)),de(t||!e||!e.__esModule?ae(n,`default`,{value:e,enumerable:!0}):n,e));function O(e,...t){process.env.CC_CANDYBAR_DEBUG&&console.error(`[DEBUG] ${e}`,...t)}const pe={"click.pbcopy":1e3,"click.open":1e3},me=new Map;function he(e){let t=pe[e];if(t===void 0)return{allowed:!0};let n=me.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 ge(e){me.set(e,Date.now())}function k(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 _e=null;function ve(e){_e=e}async function ye(e){let t=he(e.category);if(!t.allowed)return k(e.category,t.minIntervalMs,t.sinceLastMs);ge(e.category);let n=Date.now();return _e?.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){_e?.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),_e?.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 be(e){let t=he(e.category);if(!t.allowed)return k(e.category,t.minIntervalMs,t.sinceLastMs);ge(e.category);let n=Date.now();_e?.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`});_e?.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 _e?.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 xe(e){let t=he(e.category);if(!t.allowed)return k(e.category,t.minIntervalMs,t.sinceLastMs);ge(e.category);let n=Date.now();_e?.onStart(e.category);let r=Se(e);return _e?.onEnd(e.category,Date.now()-n),r}function Se(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 Ce(e){let t=process.env[e];return t&&t.length>0?t:void 0}function we(){let e=Ce(`XDG_STATE_HOME`)??c.join(f.homedir(),`.local`,`state`);return c.join(e,`cc-candybar`)}function Te(){let e=Ce(`XDG_CACHE_HOME`)??c.join(f.homedir(),`.cache`);return c.join(e,`cc-candybar`)}function Ee(){return we()}function De(){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 Oe(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 ke(e){Oe(c.dirname(e));for(let t of[e,A(e)])try{if(r.lstatSync(t).isSymbolicLink())throw Error(`path is a symlink: ${t}`)}catch(e){if(e.code!==`ENOENT`)throw e}}function A(e){return`${e}.lease`}function Ae(){return A(De())}function je(){return c.join(we(),`session-state.json`)}function Me(){return c.join(we(),`config-overrides.json`)}function Ne(){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 Pe(){return c.join(we(),`spawn.lock`)}function Fe(){return c.join(we(),`spawn.cooldown`)}function Ie(){return c.join(we(),`spawn.backoff`)}function Le(){return c.join(we(),`daemon.log`)}function Re(e){let t=Be(e.termCols),n=Ve(e.ssh);return{...t!==void 0&&{termCols:t},...n!==void 0&&{ssh:n}}}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}function Ve(e){return typeof e==`boolean`?e:void 0}var He=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function Ue(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function We(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 He(`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 He(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function Ge(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=We(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(Ue(t))})}async function Ke(e,t,n){let r=null;try{r=await Ze(De(),t.connectMs);let i=await Ge(r,{v:3,...e},t.budgetMs);return Ye(e.kind,i,n)}catch(e){return Xe(e)}finally{r&&r.destroy()}}function qe(e,t){return typeof e==`string`?e:t}function Je(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function Ye(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=qe(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:Je(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 Xe(e){if(e instanceof He||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 Ze(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 Qe(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 $e={connectMs:50,budgetMs:150},et={connectMs:50,budgetMs:200};function tt(e){let t=e.output;return typeof t==`string`?t:void 0}function nt(e,t,n,r){return Ke({kind:`render`,hookData:e,args:t,cwd:n,...r},$e,tt)}function rt(e,t){return Ke({kind:`click`,verb:e,value:t},et,tt)}let it=null;function at(e){if(it!==null)return it;r.mkdirSync(c.dirname(e),{recursive:!0});try{it=r.statSync(e).size}catch{it=0}return it}function ot(e){for(let t=2;t>=1;t--){let n=`${e}.${t}`,i=`${e}.${t+1}`;try{r.renameSync(n,i)}catch{}}try{r.renameSync(e,`${e}.1`)}catch{}it=0}function j(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=Le(),t=at(e);r.appendFileSync(e,n),it=t+Buffer.byteLength(n,`utf8`),it>=5242880&&ot(e)}catch(e){it=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}const st=`CC_CANDYBAR_RSS_LIMIT_MB`;function ct(e){let t=e[st];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${st} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function lt(e){return ct(e)*2}const ut=1024*1024;function dt(e){return ct(e)*ut}function ft(e){let t=e.rssLimitBytes??512*ut,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}`),pt(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 pt(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 mt(e,t,n={}){let i=Ee();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:j,rssBytes:()=>process.memoryUsage().rss,writeHeapSnapshot: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}}function ht(e={}){if(jt()!==null)return;let n=e.spawn??Mt,r=Ot();if(r.kind===`contended`){let e=_t();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),gt(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),gt(n);return}try{gt(n)}finally{At()}}function gt(e){wt()&&vt(e)}function _t(){try{let e=r.statSync(Pe());return Date.now()-e.mtimeMs}catch{return null}}function vt(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 yt(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function bt(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function xt(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 St(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 Ct(){try{r.unlinkSync(Ie())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function wt(){let e=Fe(),n=Ie(),r=xt(n),i=yt(Tt(e),bt(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`),Et(e),St(n,Math.min(r+1,5)),!0)}function Tt(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function Et(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 Dt=null;function Ot(){let e=Pe();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 Dt={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(!kt(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 kt(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function At(){if(!Dt)return;let{fd:e,path:t}=Dt;Dt=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function jt(){try{return r.mkdirSync(Ee(),{recursive:!0}),null}catch(e){return`mkdir ${Ee()}: ${e.message}`}}function Mt(){let e=t.execPath,n=t.argv[1];return n?xe({bin:e,args:[`--max-old-space-size=${lt(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const Nt=`cc-candybar`,M=`dispatch`,Pt=`set-state`,N=`step-state`,Ft=`copy`,It=`open-vscode`,Lt=`show-config-error`,Rt=`show-config-warning`,zt=`set-config`,Bt=`step-config`,Vt=`reset-config`,Ht=`apply-layout-op`,Ut=`undo`,Wt=`redo`;function Gt(e){return e.map(encodeURIComponent).join(`/`)}function Kt(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function qt(e){return`${Nt}://${M}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${Gt(e.args)}`)}`).join(`&`)}`}function Jt(e){return new y(e).getAll(`e`).map(Yt)}function Yt(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const Xt=`closed`;function Zt(e,t,n){if(t===0)return`${e} needs a display (the clickable text)`;if(t!==1&&t!==n)return`${e} cycles ${n} members; bind one display per member (${n}) or one static display, got ${t}`}function Qt(e,t,n,r){let i=Zt(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function $t(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function en(e,...t){return`{{ and ${[e,...t].map(e=>`(eq .${e.variable} "${$t(e.member)}")`).join(` `)} }}`}function tn(e,t,n){return`{{ action "${e}" "${$t(t)}" "${$t(n)}" }}`}function P(e,t){return{kind:`state`,key:e,default:t}}function nn(e,t){return{set:e,cycle:[Xt,t]}}const rn=`@promptctl/cc-candybar`,an=`CCCandybarURLHandler`,on=[],sn={"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 cn(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function ln(e,t){return[e,...t].map(cn).join(` `)}function un(){return c.join(f.homedir(),`Applications`,`${an}.app`)}function dn(){return c.join(f.homedir(),`.claude`,`settings.json`)}function fn(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function pn(){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 mn(){return c.join(pn(),`bin`,`cc-candybar`)}function F(){return c.join(pn(),`dist`,`index.mjs`)}function hn(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 gn(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 _n(t){let n=sn[`${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 vn(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function yn(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 ${rn}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function bn(){let e=gn(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=_n(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(F()),{recursive:!0}),r.mkdirSync(c.dirname(mn()),{recursive:!0}),vn(e,F()),vn(t.sourcePath,mn()),r.chmodSync(mn(),493),r.rmSync(c.join(pn(),`url-handler.mjs`),{force:!0});let n=yn(mn());return process.stdout.write(`Staged cc-candybar v1.41.2 runtime at ${pn()}\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:mn(),distPath:F(),entryKind:n}}function xn(){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>${Nt}</string>`,` </array>`,` </dict>`,`</array>`].join(`
4
+ `)}function gn(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 _n(t){let n=sn[`${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 vn(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function yn(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 ${rn}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function bn(){let e=gn(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=_n(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(F()),{recursive:!0}),r.mkdirSync(c.dirname(mn()),{recursive:!0}),vn(e,F()),vn(t.sourcePath,mn()),r.chmodSync(mn(),493),r.rmSync(c.join(pn(),`url-handler.mjs`),{force:!0});let n=yn(mn());return process.stdout.write(`Staged cc-candybar v1.41.3 runtime at ${pn()}\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:mn(),distPath:F(),entryKind:n}}function xn(){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>${Nt}</string>`,` </array>`,` </dict>`,`</array>`].join(`
5
5
  `)}]}function Sn(e){let t=un();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=be({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,hn(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 xn())be({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of xn()){let n=be({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 ${Nt}:// with Launch Services\n`);let a=be({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(`✓ ${an}.app installed and registered.\n`),process.stdout.write(` Test: open '${Nt}://hello-world' && pbpaste\n`)}function I(){fn(),Sn(bn().distPath)}function Cn(e,t=Nt){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:Ft,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function wn(e){e||(process.stderr.write(`url-handle: missing URL argument.
6
6
  `),process.exit(1));let t;try{t=Cn(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await rt(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(ht(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(Tn(n)+`
7
7
  `),process.exit(1)}function Tn(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 En(){return`✓ install complete.
@@ -161,10 +161,10 @@ Config tooling:
161
161
  `)[0]??``).trim()}:{content:r.replace(/\n/g,` `).trim()}}const Tx=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],Ex=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Dx=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],Ox=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function kx(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>Tx[e.getMonth()]],[`Monday`,e=>Dx[e.getDay()]],[`Jan`,e=>Ex[e.getMonth()]],[`Mon`,e=>Ox[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 Ax={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function jx(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=Ax[t];try{return Fx(r,e)}catch{return Ix(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return Zn(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return Zn(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return Zn(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return Zn(e.stashCount,0)}}var Mx=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}},Nx=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:D(()=>{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&&(E(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())E(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function Px(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function Fx(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`?tx(e):t===`number`?nx(e):rx(e)}function Ix(e){return e===`number`?0:e===`boolean`?!1:``}var Lx=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new Mx;ttlMgr=new Nx;gitSubscriptions=new Map;cleanups=[];inFlight=new Set;engine=vx();gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new Or({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,ex(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=xx(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=yx(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 kx(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,kx(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=Ax[t.field],r=t.varDefault===void 0?Ix(n):Fx(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,jx(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=Px(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,Fx(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,q.reaction)(()=>{let t=yx(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,q.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 Cx(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 wx(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,Fx(this.defaultEmptyValue,t))}catch{this.store.setBox(e,Ix(t))}}defaultFor(e){try{return Fx(this.defaultEmptyValue,e)}catch{return Ix(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 Rx=new Map,zx=new Map;function Bx(e){let t=vc(e),n=Rx.get(t);if(n!==void 0)return n;let r=ao(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 Rx.set(t,r),r}function Vx(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=zx.get(n);if(r!==void 0)return r;let i=vo(e,t);return zx.set(n,i),i}function Hx(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=Ux(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(a.style.link){i();let e=Ux([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function Ux(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>Wx(e,t)):e,r=Ho.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 Wx(e,t){let n=e.copy();return n.style=t.add(e.style),n}function Gx(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function Kx(e,t){let n=Ho.fromFragments(e);return n.end=``,n.noWrap=!0,t!==void 0&&!t.isNull&&(n.style=t),n}function qx(e,t){let{width:n,justify:r,truncate:i,truncateMarker:a=`…`,baseStyle:o,padding:s}=t;if(e.length===0)return[];let c=Kx(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 Jx=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Yx(e,t,n,r,i,a){let o={segName:t,palette:n,bg:void 0};e.current=o;let s=Xx(r,a),c=s===void 0?void 0:Zx(n,s,`bg`);o.bg=c;let l=Xx(i,a),u=l===void 0?void 0:Zx(n,l,`fg`);return new G({bgcolor:c===void 0?void 0:ua.fromRgba(c),color:u===void 0?void 0:ua.fromRgba(u)})}function Xx(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Zx(e,t,n){try{return za(e,t)}catch(e){throw e instanceof Ia?new Jx(t,n,e.message):e}}const Qx=new Map([[`palette`,`theme.effective`],[`preset`,`preset.effective`],[`look`,`look.effective`],[`style`,`style.effective`],[`charset`,`charset.effective`],[`colorCompatibility`,`colorCompatibility.effective`],[`autoWrap`,`autoWrap.effective`],[`padding`,`padding.effective`]]);function $x(e,t,n,r){let i=new Map;for(let[a,o]of Object.entries(t))i.set(a,eS(e,a,o,n,r));return i}function eS(e,t,n,r,i){if(Fv(n)){let[a,o]=Iv(n);return tS(r.get(n.persistWhen)??n.persistWhen,n.set,eS(e,t,a,r,i),eS(e,t,o,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:[...Ly(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=Qx.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:[...Ly(n.from,i)]}:`cycle`in n?{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle}:`removeSegment`in n?{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}}:`insertSegment`in n?{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}}:`insertSegmentFrom`in n?{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...Ly(n.insertSegmentFrom,i)]}:{kind:`persist-bounded`,key:n.persist,by:n.by}}return`copy`in n?{kind:`copy`,text:rS(e,n.copy,t)}:`open`in n?{kind:`open`,target:rS(e,n.open,t)}:`reset`in n?{kind:`reset`,key:n.reset}:`undo`in n?{kind:`undo`}:{kind:`redo`}}function tS(e,t,n,r){return{kind:`dual`,selector:e,session:`stateVar`in n&&`stateVar`in r?{...n,stateVar:r.stateVar}:n,durable:r,sessionKey:t}}function nS(e,t){return e.kind===`dual`?Fc(iS(t,e.selector))===!0?e.durable:e.session:e}function rS(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function iS(e,t){return e.has(t)?tx(e.read(t)):``}function aS(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function oS(e,t,n){let r=new Ho(e,{style:new G({link:t,bold:n})});return r.noWrap=!0,r.end=``,r}function sS(e,t){return Math.max(e.members.indexOf(iS(t,e.stateVar)),0)}function cS(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=iS(r,e.stateVar);return{effects:[{verb:Pt,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=iS(r,e.stateVar);return{effects:[{verb:Pt,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=iS(r,e.stateVar);return{effects:[{verb:Pt,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(sS(e,r)+1)%e.members.length];return{effects:[{verb:Pt,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:N,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:Ft,args:[aS(e.text,yx(r))]}],active:!1};case`open`:return{effects:[{verb:It,args:[aS(e.target,yx(r))]}],active:!1};case`persist-literal`:{let t=iS(r,e.stateVar);return{effects:[{verb:zt,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=iS(r,e.stateVar);return{effects:[{verb:zt,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(sS(e,r)+1)%e.members.length];return{effects:[{verb:zt,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:Bt,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:Vt,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:Ut,args:[i]}],active:!1};case`redo`:return{effects:[{verb:Wt,args:[i]}],active:!1};case`layout-op`:return{effects:[{verb:Ht,args:[i,e.key,zc(e.op)]}],active:!1};case`dual`:{let a=nS(e,r),{effects:o,active:s}=cS(a,t,n,r,i);return a===e.durable?{effects:o.map(t=>({...t,args:[...t.args,e.sessionKey]})),active:s}:{effects:o,active:s}}case`layout-op-option`:{let r={op:`insert`,segment:n??t,anchor:e.anchor,relation:e.relation};return{effects:[{verb:Ht,args:[i,e.key,zc(r)]}],active:!1}}}}function lS(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:Qt(`action "${e}"`,n,t.members.length,sS(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 uS(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}=lS(e,nS(r,i),t,i),{effects:s,active:c}=cS(r,a,o,i,iS(i,`session.id`));return oS(a,qt(s),c)}function dS(e){return{action:{fn:(t,...n)=>uS(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function fS(e){return new Ho(e).cellLength}function pS(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 mS(e,t){let n=[];for(let t of e)n.length>0&&n.push(new Ho(` `)),n.push(t);let r=Ho.fromFragments(n);return r.noWrap=t,r.end=``,r}function hS(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 gS(e,t){let n=e.compiled.get(t),r=n&&nS(n,e.store);if(!r||r.kind!==`set-option`&&r.kind!==`persist-option`&&r.kind!==`layout-op-option`)throw Error(`picker references action "${t}" which must be a set-option, persist-option, or layout-op-option action ({ set, from }, { persist, from }, or { persist, insertSegmentFrom, anchor, relation }), got ${r?`a ${r.kind} action`:`no such action`}`);return r}function _S(e,t,n,r,i,a){let o=gS(a,e),s=a.compiled.get(e),c=a.store,l=iS(c,`session.id`),u=`stateVar`in o?iS(c,o.stateVar):void 0,d=o.options.map(fS),f=i?Math.max(1,nx(c.read(`term.cols`))-sh(a.stripStyle)-2*a.padding):1/0,p=fS(`✕`)+1,m=fS(`←`)+1+fS(`→`)+1,h=pS(d,f,p),g=h.length>1?pS(d,f,p+m):h,_=parseInt(iS(c,t.stateVar),10),v=Number.isInteger(_)?Math.max(0,Math.min(_,g.length-1)):0,y=g[v]??[],b=e=>qt([{verb:Pt,args:[l,t.key,String(e)]}]),x=n.flatMap(([e,t])=>[e,t]),S=qt([{verb:Pt,args:[l,...x]}]),C=r?[{verb:Pt,args:[l,...x]}]:[],w=e=>{let{effects:t}=cS(s,e,e,c,l),n=t.length===1?t[0]:void 0;return n?.verb===`set-state`?qt([{verb:Pt,args:[...n.args,...r?x:[]]}]):qt([...t,...C])},ee=[oS(`✕`,S,!1)];v>0&&ee.push(oS(`←`,b(v-1),!1));for(let e of y){let t=o.options[e];ee.push(oS(t,w(t),t===u))}return v<g.length-1&&ee.push(oS(`→`,b(v+1),!1)),mS(ee,i)}function vS(e){return{picker:{fn:(t,n,r,i)=>{let a=hS(e,n,`set-int`,`an int action ({ set, int: true })`);return _S(t,{key:a.key,stateVar:a.stateVar},[[a.key,`-1`]],r===!0,i===!0,e)},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}const yS=Symbol(`cc-candybar.menuDrop`);function bS(e){return e.flatMap(e=>e[yS]??[])}function xS(e,t,n,r){let i=r.activeSegment.current;if(i===null)throw Error(`{{ menu }} rendered with no active segment placement — the render walk must publish one before evaluating a segment template`);let a=r.action,o=g_(i.segName,e,n.key),s=v_(o),c=h_(e),l=iS(a.store,o)===c,u=iS(a.store,`session.id`),d=l?Xt:c,f=oS(Qt(`{{ menu "${e}" }}`,t,2,+!!l),qt([{verb:Pt,args:[u,o,d,s,`0`]}]),!1);return f[yS]=l?[_S(e,{key:s,stateVar:s},[[o,Xt],[s,`0`]],n.closeOnPick,n.paged,a)]:[],f}const SS=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function CS(e,t){let n=t[t.length-1],r=SS(n)?n:void 0,i=r===void 0?t:t.slice(0,-1),a=i.findIndex(e=>typeof e!=`string`);if(a!==-1)throw Error(`{{ menu "${e}" }} display #${a+1} is not text (${JSON.stringify(i[a])}) — a menu binds its trigger text, then an optional trailing (dict …) of options`);return{displays:i,options:y_(r??{})}}function wS(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=CS(t,n);return xS(t,r,i,e)},argTypes:[`string`,`value`],returnType:`T`}}}function TS(){return{current:null}}function ES(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 DS(e){let t={fn:(()=>{let t=ES(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{...hc(()=>ES(e,`color`).palette),bgOf:t}}function OS(e){let t=[],n=[];for(let r of e){if(!r.contains(`
162
162
  `)){n.push(r);continue}let e=r.split(`
163
163
  `);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function kS(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 AS={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 kS(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(!Gx(i.when,t.scope))return[];let n=i.palette===void 0?t.look:Da,o=Vx(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=OS(Hx(c,u)).map(e=>qx(e,d)),p=l.map(e=>qx(Hx([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 Ho(`⚠ ${e.name}: ${r}`)]]}}}};function jS(e){return AS[e]}function MS(e){if(`ttl`in e)return{kind:`ttl`,durationMs:Sx(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 NS(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:MS(n.cache),varDefault:n.default});break;case`shell`:e.declareShell(t,n.command,{regex:n.regex,cache:MS(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?Sx(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 PS(e,t){let n=kl.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}function FS(e,t,n){let r=n?.cwd??process.cwd(),i={store:t.variableStore,compiled:new Map,stripStyle:`powerline`,padding:1},a=TS(),o={action:i,activeSegment:a},s=Object.keys(e.looks),c=Jc(e.presets),l=new Map([...Fy(e),...Tv(e)]),u=vx({...dS(i),...vS(i),...wS(o),...DS(a),looks:{fn:()=>s,argTypes:[]},presets:{fn:()=>c,argTypes:[]}},n?.clock),d=PS(u,e.helpers),f=e=>u.parse(e,d),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=$x(f,e.actions,p,l);let m=[];for(let[n,i]of Object.entries(e.variables))try{NS(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{NS(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:Bx(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 jS(e.kind).compile(e,n)},v=new Map;for(let t of c){let{node:n,path:r}=Zc(e,t);v.set(t,_(n,r))}return{segments:h,roots:v,activeSegment:a,menuRuntime:o,loadWarnings:m}}function IS(e){let t=e.bgcolor;return t===void 0?e:new G({bgcolor:ua.fromRgba(Ka(t.getTruecolor(),1)),color:e.color})}function LS(e,t,n,r,i,a,o,s,c){let{perSegmentSink:l,onSegmentError:u}=s??{},{look:d=Da,preset:f=Kc}=c??{};r.applyInput({...i,term:{cols:o.width}}),t.menuRuntime.action.stripStyle=o.style,t.menuRuntime.action.padding=o.padding;let p=yx(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)=>Yx(t.activeSegment,e,n,r,i,p),b=e=>(t.activeSegment.current=null,bS(e)),x=(e,t)=>{let n={scope:p,basePalette:a,look:d,visible:t&&Gx(e.when,p),padding:o.padding,nextHueShift:_,perSegmentSink:l,onSegmentError:u,enterSegment:y,exitSegment:b,focusTint:IS,lookupSegment:v,renderChild:x};return jS(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 "${Kc}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);return x(S,!0).map(e=>ch(e,o)).join(`
164
- `)}const RS=/^-?\d+$/;function zS(e,t,n){return e===void 0?t:Math.max(t,Math.min(n,e))}function BS(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 VS(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!RS.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 HS(e,t,n){return r=>r?RS.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 US(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=>!RS.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:zS(r[0].seed,t,i)}}return{kind:`int`}}function WS(e){return e===`config`?`set-config`:`set-state`}function GS(e,t,n){return t.kind===`int`?VS(`menu page "${e}"`):t.kind===`range`?HS(t.min,t.max,`${n} stepper "${e}"`):BS(t.allowed,`${n} "${e}"`,WS(n))}function KS(e,t,n){return GS(e,US(e,t,n),n)}function qS(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:US(e,n,t)}))}function JS(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=KS(e,a.specs,t)}else{let r=[i];n.set(e,{permanent:!1,kind:i.kind,validator:KS(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=KS(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=US(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 YS=Sc(),XS=new Set(YS),ZS=new Set(Ec),QS=e=>e?XS.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${YS.join(`, `)})`}:{ok:!1,reason:`theme name is required`},$S=e=>e?ZS.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${Ec.join(`, `)})`}:{ok:!1,reason:`style name is required`},eC=new Set([`1`,`true`]),tC=new Set([`0`,`false`]),nC=JS({style:$S,theme:QS,"toolbar-expanded":e=>eC.has(e)?{ok:!0,value:`1`}:tC.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function rC(){return nC.listKeys()}function iC(e,t){return nC.register(e,t)}function aC(e,t){return nC.validate(e,t)}function oC(e){return nC.rangeParamsFor(e)}function sC(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:Ly(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:zS(t.get(e.set),e.min,e.max)}}]:[]}function cC(e){let t=new Set(nC.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function lC(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))}for(let[n,r]of ug(e.globals))t.set(n,r);return t}function uC(e){let t=lC(e),n=Fy(e);return cC(Object.values(e.actions).flatMap(Iv).flatMap(e=>sC(e,t,n)))}function dC(e){return qS(uC(e))}const fC=JS({},`config`);function pC(){return fC.listKeys()}function mC(e,t){return fC.validate(e,t)}function hC(e){return fC.rangeParamsFor(e)}function gC(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:Ly(e.from,n)}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[zc({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[zc({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ly(e.insertSegmentFrom,n).map(t=>zc({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max,seed:zS(t.get(e.persist),e.min,e.max)}}]:[]}function _C(e){return ug(e.globals)}function vC(e){let t=new Set;for(let n of bC(e)){let e=`persist`in n?n.persist:`reset`in n?n.reset:null;if(e===null)continue;let r=N_(e);r?.scope===`preset-root-ops`&&t.add(r.preset)}return[...t].map(e=>({key:M_(e),spec:{kind:`allow-list`,allowed:[]}}))}function yC(e){let t=_C(e),n=new Map([...Fy(e),...Tv(e)]);return[...vC(e),...bC(e).flatMap(e=>gC(e,t,n))]}function bC(e){return Object.values(e.actions).flatMap(Iv)}function xC(e){return qS(yC(e),`config`)}function SC(e,t){return fC.register(e,t)}const CC=(e,t)=>O(t),wC={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`},TC=new Set([`1`,`true`]),EC=new Set([`0`,`false`,``]);function DC(e,t){let n=N_(e);if(n===null)throw Error(`coercePersistValue: "${e}" is not a valid persist target`);if(n.scope===`segment-palette`||n.scope===`preset-root-ops`)return t;let r=wC[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(TC.has(t))return!0;if(EC.has(t))return!1;throw Error(`coercePersistValue: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function OC(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let[t,n]of Object.entries(e)){let e=N_(t);if(e===null)return!1;let r=e.scope===`globals`?wC[e.field]:`string`;if(r===`number`&&typeof n!=`number`||r===`boolean`&&typeof n!=`boolean`||r===`string`&&typeof n!=`string`)return!1}return!0}function kC(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 OC(e)?e:(t(`warn`,`config-overrides load: unexpected shape, starting empty`),{})}catch{return t(`warn`,`config-overrides load: corrupt JSON, starting empty`),{}}}function AC(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))sg(n)&&(t[n]=r);return t}function jC(e){let t=Object.create(null);for(let[n,r]of Object.entries(e)){let e=N_(n);e?.scope===`segment-palette`&&typeof r==`string`&&(t[e.segment]=r)}return t}function MC(e,t){let n=Object.create(null);for(let[r,i]of Object.entries(e)){let e=N_(r);if(!(e?.scope!==`preset-root-ops`||typeof i!=`string`)){try{let t=JSON.parse(i);if(Array.isArray(t)&&t.every(e=>typeof e==`string`)){n[e.preset]=t;continue}}catch{}t(`warn`,`config-overrides: "${r}" is not a valid op-token list, dropping`)}}return n}function NC(e,t=CC){return AC(kC(e,t))}function PC(e,t=CC){let n=kC(e,t);return{globals:AC(n),segmentPalette:jC(n),presetRootOps:MC(n,t)}}function FC(e,t,n,i){try{r.mkdirSync(c.dirname(e),{recursive:!0});let t=`${e}.tmp`;r.writeFileSync(t,JSON.stringify(n),{mode:384}),r.chmodSync(t,384),r.renameSync(t,e)}catch(e){let n=`${t} write failed: ${e.message}`;throw i(`error`,n),Error(n)}}function IC(e,t,n){FC(e,`config-overrides`,t,n)}function LC(e,t,n,r){let i=kC(e,r),a=i[t];if(n===void 0){if(!(t in i))return a;let n={...i};delete n[t],IC(e,n,r)}else IC(e,{...i,[t]:n},r);return a}function RC(e,t,n,r=CC){YC(e,{key:t,from:LC(e,t,n,r)??null,to:n},r)}function zC(e,t,n=CC){t in kC(e,n)&&YC(e,{key:t,from:LC(e,t,void 0,n)??null,to:null},n)}function BC(e,t,n,r){LC(e,t,n===null?void 0:n,r)}const VC={past:[],future:[]};function HC(e){return c.join(c.dirname(e),`config-overrides-history.json`)}function UC(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function WC(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.key==`string`&&UC(t.from)&&UC(t.to)}function GC(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return Array.isArray(t.past)&&t.past.every(WC)&&Array.isArray(t.future)&&t.future.every(WC)}function KC(e,t){let n=HC(e),i;try{i=r.readFileSync(n,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`config-overrides-history read failed (${n}); starting empty`),VC}try{let e=JSON.parse(i);return GC(e)?e:(t(`warn`,`config-overrides-history load: unexpected shape, starting empty`),VC)}catch{return t(`warn`,`config-overrides-history load: corrupt JSON, starting empty`),VC}}function qC(e,t,n){FC(HC(e),`config-overrides-history`,t,n)}function JC(e,t,n){let r=[...e,t];return r.length>n?r.slice(r.length-n):r}function YC(e,t,n){qC(e,{past:JC(KC(e,n).past,t,50),future:[]},n)}function XC(e,t=CC){let n=KC(e,t),r=n.past[n.past.length-1];return r===void 0?null:(BC(e,r.key,r.from,t),qC(e,{past:n.past.slice(0,-1),future:JC(n.future,r,50)},t),r)}function ZC(e,t=CC){let n=KC(e,t),r=n.future[n.future.length-1];return r===void 0?null:(BC(e,r.key,r.to,t),qC(e,{past:JC(n.past,r,50),future:n.future.slice(0,-1)},t),r)}var QC=class{kind=`box`;cell;lastSetAt;constructor(e,t,n){this.name=e,this.type=t,ew(e,t,n,`initial value`),this.cell=q.observable.box(n,{deep:!1}),this.lastSetAt=Date.now()}read(){return this.cell.get()}set(e){ew(this.name,this.type,e,`set value`),this.cell.set(e),this.lastSetAt=Date.now()}lastUpdatedMs(){return this.lastSetAt}},$C=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,q.computed)(()=>{let e=n();return ew(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}};function ew(e,t,n,r){let i=ex(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var tw=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new QC(e,t,n))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new $C(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,q.runInAction)(()=>n.set(t))}runInAction(e){(0,q.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 nw(e,t,n){return e+`\0`+t+`\0`+(n??``)}var rw=class{entries=new Map;deps;maxEntries;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256}getOrCreate(e,t,n){let r=nw(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=ub(e.projectDir,e.cwd,e.configFile);e.lastWarning=db(e.projectDir,e.cwd);let n;try{n=this.buildState(e,t)}catch(n){e.lastError=n instanceof Wm||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(`
164
+ `)}const RS=/^-?\d+$/;function zS(e,t,n){return e===void 0?t:Math.max(t,Math.min(n,e))}function BS(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 VS(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!RS.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 HS(e,t,n){return r=>r?RS.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 US(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=>!RS.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:zS(r[0].seed,t,i)}}return{kind:`int`}}function WS(e){return e===`config`?`set-config`:`set-state`}function GS(e,t,n){return t.kind===`int`?VS(`menu page "${e}"`):t.kind===`range`?HS(t.min,t.max,`${n} stepper "${e}"`):BS(t.allowed,`${n} "${e}"`,WS(n))}function KS(e,t,n){return GS(e,US(e,t,n),n)}function qS(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:US(e,n,t)}))}function JS(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=KS(e,a.specs,t)}else{let r=[i];n.set(e,{permanent:!1,kind:i.kind,validator:KS(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=KS(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=US(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 YS=Sc(),XS=new Set(YS),ZS=new Set(Ec),QS=e=>e?XS.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${YS.join(`, `)})`}:{ok:!1,reason:`theme name is required`},$S=e=>e?ZS.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${Ec.join(`, `)})`}:{ok:!1,reason:`style name is required`},eC=new Set([`1`,`true`]),tC=new Set([`0`,`false`]),nC=JS({style:$S,theme:QS,"toolbar-expanded":e=>eC.has(e)?{ok:!0,value:`1`}:tC.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function rC(){return nC.listKeys()}function iC(e,t){return nC.register(e,t)}function aC(e,t){return nC.validate(e,t)}function oC(e){return nC.rangeParamsFor(e)}function sC(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:Ly(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:zS(t.get(e.set),e.min,e.max)}}]:[]}function cC(e){let t=new Set(nC.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function lC(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))}for(let[n,r]of ug(e.globals))t.set(n,r);return t}function uC(e){let t=lC(e),n=Fy(e);return cC(Object.values(e.actions).flatMap(Iv).flatMap(e=>sC(e,t,n)))}function dC(e){return qS(uC(e))}const fC=JS({},`config`);function pC(){return fC.listKeys()}function mC(e,t){return fC.validate(e,t)}function hC(e){return fC.rangeParamsFor(e)}function gC(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:Ly(e.from,n)}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[zc({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[zc({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ly(e.insertSegmentFrom,n).map(t=>zc({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max,seed:zS(t.get(e.persist),e.min,e.max)}}]:[]}function _C(e){return ug(e.globals)}function vC(e){let t=new Set;for(let n of bC(e)){let e=`persist`in n?n.persist:`reset`in n?n.reset:null;if(e===null)continue;let r=N_(e);r?.scope===`preset-root-ops`&&t.add(r.preset)}return[...t].map(e=>({key:M_(e),spec:{kind:`allow-list`,allowed:[]}}))}function yC(e){let t=_C(e),n=new Map([...Fy(e),...Tv(e)]);return[...vC(e),...bC(e).flatMap(e=>gC(e,t,n))]}function bC(e){return Object.values(e.actions).flatMap(Iv)}function xC(e){return qS(yC(e),`config`)}function SC(e,t){return fC.register(e,t)}const CC=(e,t)=>O(t),wC={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`},TC=new Set([`1`,`true`]),EC=new Set([`0`,`false`,``]);function DC(e,t){let n=N_(e);if(n===null)throw Error(`coercePersistValue: "${e}" is not a valid persist target`);if(n.scope===`segment-palette`||n.scope===`preset-root-ops`)return t;let r=wC[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(TC.has(t))return!0;if(EC.has(t))return!1;throw Error(`coercePersistValue: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function OC(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let[t,n]of Object.entries(e)){let e=N_(t);if(e===null)return!1;let r=e.scope===`globals`?wC[e.field]:`string`;if(r===`number`&&typeof n!=`number`||r===`boolean`&&typeof n!=`boolean`||r===`string`&&typeof n!=`string`)return!1}return!0}function kC(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 OC(e)?e:(t(`warn`,`config-overrides load: unexpected shape, starting empty`),{})}catch{return t(`warn`,`config-overrides load: corrupt JSON, starting empty`),{}}}function AC(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))sg(n)&&(t[n]=r);return t}function jC(e){let t=Object.create(null);for(let[n,r]of Object.entries(e)){let e=N_(n);e?.scope===`segment-palette`&&typeof r==`string`&&(t[e.segment]=r)}return t}function MC(e,t){let n=Object.create(null);for(let[r,i]of Object.entries(e)){let e=N_(r);if(!(e?.scope!==`preset-root-ops`||typeof i!=`string`)){try{let t=JSON.parse(i);if(Array.isArray(t)&&t.every(e=>typeof e==`string`)){n[e.preset]=t;continue}}catch{}t(`warn`,`config-overrides: "${r}" is not a valid op-token list, dropping`)}}return n}function NC(e,t=CC){return AC(kC(e,t))}function PC(e,t=CC){let n=kC(e,t);return{globals:AC(n),segmentPalette:jC(n),presetRootOps:MC(n,t)}}function FC(e,t,n,i){try{r.mkdirSync(c.dirname(e),{recursive:!0});let t=`${e}.tmp`;r.writeFileSync(t,JSON.stringify(n),{mode:384}),r.chmodSync(t,384),r.renameSync(t,e)}catch(e){let n=`${t} write failed: ${e.message}`;throw i(`error`,n),Error(n)}}function IC(e,t,n){FC(e,`config-overrides`,t,n)}function LC(e,t,n,r){let i=kC(e,r),a=i[t];if(n===void 0){if(!(t in i))return a;let n={...i};delete n[t],IC(e,n,r)}else IC(e,{...i,[t]:n},r);return a}function RC(e,t,n,r=CC){YC(e,{key:t,from:LC(e,t,n,r)??null,to:n},r)}function zC(e,t,n=CC){t in kC(e,n)&&YC(e,{key:t,from:LC(e,t,void 0,n)??null,to:null},n)}function BC(e,t,n,r){LC(e,t,n===null?void 0:n,r)}const VC={past:[],future:[]};function HC(e){return c.join(c.dirname(e),`config-overrides-history.json`)}function UC(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function WC(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.key==`string`&&UC(t.from)&&UC(t.to)}function GC(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return Array.isArray(t.past)&&t.past.every(WC)&&Array.isArray(t.future)&&t.future.every(WC)}function KC(e,t){let n=HC(e),i;try{i=r.readFileSync(n,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`config-overrides-history read failed (${n}); starting empty`),VC}try{let e=JSON.parse(i);return GC(e)?e:(t(`warn`,`config-overrides-history load: unexpected shape, starting empty`),VC)}catch{return t(`warn`,`config-overrides-history load: corrupt JSON, starting empty`),VC}}function qC(e,t,n){FC(HC(e),`config-overrides-history`,t,n)}function JC(e,t,n){let r=[...e,t];return r.length>n?r.slice(r.length-n):r}function YC(e,t,n){qC(e,{past:JC(KC(e,n).past,t,50),future:[]},n)}function XC(e,t=CC){let n=KC(e,t),r=n.past[n.past.length-1];return r===void 0?null:(BC(e,r.key,r.from,t),qC(e,{past:n.past.slice(0,-1),future:JC(n.future,r,50)},t),r)}function ZC(e,t=CC){let n=KC(e,t),r=n.future[n.future.length-1];return r===void 0?null:(BC(e,r.key,r.to,t),qC(e,{past:JC(n.past,r,50),future:n.future.slice(0,-1)},t),r)}var QC=class{kind=`box`;cell;lastSetAt;constructor(e,t,n){this.name=e,this.type=t,ew(e,t,n,`initial value`),this.cell=q.observable.box(n,{deep:!1}),this.lastSetAt=Date.now()}read(){return this.cell.get()}set(e){ew(this.name,this.type,e,`set value`),this.cell.set(e),this.lastSetAt=Date.now()}lastUpdatedMs(){return this.lastSetAt}},$C=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,q.computed)(()=>{let e=n();return ew(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}};function ew(e,t,n,r){let i=ex(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var tw=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new QC(e,t,n))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new $C(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,q.runInAction)(()=>n.set(t))}runInAction(e){(0,q.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 nw(e,t,n){return e+`\0`+t+`\0`+(n??``)}var rw=class{entries=new Map;deps;maxEntries;observers;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256,this.observers=t.observers??{}}getOrCreate(e,t,n){let r=nw(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.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 this.reloadInto(a),a}reloadInto(e){this.loadFromDisk(e),this.observers.onReload?.(e)}loadFromDisk(e){let t=ub(e.projectDir,e.cwd,e.configFile);e.lastWarning=db(e.projectDir,e.cwd);let n;try{n=this.buildState(e,t)}catch(n){e.lastError=n instanceof Wm||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(`
165
165
  `);e.lastWarning=e.lastWarning?e.lastWarning+`
166
166
  `+t:t}this.refreshWatcher(e,t)}buildState(e,t){let{config:n,source:r}=fb(t,$b),i=PC(Me(),j),a=Yh(Jh({globals:$c(i.globals,n.presets)},n),i.segmentPalette),o=el(i.presetRootOps,n.presets),s=pb(nl(a,o),t??`<default>`,r),c=new tw,l=new Lx(c,s.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),u,d=[];try{u=FS(s,l,{cwd:e.cwd});for(let{key:e,spec:t}of dC(s))d.push(iC(e,t));for(let{key:e,spec:t}of xC(s))d.push(SC(e,t))}catch(e){for(let e of d)e();throw l.dispose(),e}return{config:s,store:c,registry:l,compiled:u,neededInputPaths:Mb(s),lastRenderCellsBySegment:new Map,validatorDisposers:d,presetRootOps:o}}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=[...lb(e.projectDir,e.cwd,e.configFile),Me()],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){j(`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 iw=16384;var aw=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<iw){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%iw}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 ow={load:()=>({}),save:()=>{},flush:()=>{}};function sw(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var cw=class{sessions;storage;atom=(0,q.createAtom)(`SessionState`);constructor(e=ow,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=sw(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,q.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,q.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,q.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 lw=(e,t)=>O(t);function uw(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 dw=class{timer=null;pending=null;constructor(e,t=500,n=lw){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 uw(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}`)}}},$=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function fw(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function pw(e){return mw(()=>decodeURIComponent(e))}function mw(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function hw(e,t){let n=be({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 gw=(e,t)=>hw(pw(e),t),_w=(e,t)=>{let n=be({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,pw(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`})`)}},vw=(e,t)=>hw(pw(e),t),yw=(e,t)=>hw(pw(e),t),bw=(e,t)=>{let n=fw(pw(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},xw=(e,t)=>{let[n=``,...r]=mw(()=>Kt(e)),i=fw(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${rC().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${rC().join(`, `)})`);let a=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=aC(t,n);if(!i.ok)throw new $(`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})`)},Sw=/^-?\d+$/;function Cw(e,t,n){return e>n?t:e<t?n:e}function ww(e,t,n,r){if(e){if(!rC().includes(e))throw new $(`${r}: unknown session key "${e}" to release (have: ${rC().join(`, `)})`);n.sessionState.clear(t,e),n.dlog(`info`,`${r}: released session key ${e} (session=${t})`)}}const Tw=(e,t)=>{let[n=``,r=``,i=``]=mw(()=>Kt(e)),a=fw(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Sw.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=oC(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${rC().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&Sw.test(c)?Math.max(s.min,Math.min(s.max,parseInt(c,10))):s.seed,u=Cw(l+o,s.min,s.max),d=aC(r,String(u));if(!d.ok)throw new $(`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 Ew(e){if(!sg(e))throw Error(`step-config: "${e}" validated as a bounded config-writable key but is not a Globals field — registration/loader invariant broken`)}const Dw=(e,t)=>{let[n=``,r=``,i=``,a=``]=mw(()=>Kt(e)),o=fw(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${pC().join(`, `)})`);let s=mC(r,i);if(!s.ok)throw new $(`set-config: ${s.reason}`);let c=DC(r,s.value);RC(Me(),r,c,t.dlog),t.dlog(`info`,`set-config: ${r}=${s.value} (session=${o})`),ww(a,o,t,`set-config`)},Ow=(e,t)=>{let[n=``,r=``,i=``,a=``]=mw(()=>Kt(e)),o=fw(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Sw.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let s=parseInt(i,10),c=hC(r);if(!c)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${pC().join(`, `)})`);Ew(r);let l=NC(Me(),t.dlog)[r],u=typeof l==`number`?Math.max(c.min,Math.min(c.max,l)):c.seed,d=Cw(u+s,c.min,c.max),f=mC(r,String(d));if(!f.ok)throw new $(`step-config: ${f.reason}`);let p=DC(r,f.value);RC(Me(),r,p,t.dlog),t.dlog(`info`,`step-config: ${r} ${u}→${f.value} (by ${s}, session=${o})`),ww(a,o,t,`step-config`)},kw=(e,t)=>{let[n=``,r=``]=mw(()=>Kt(e)),i=fw(n);if(!r||!pC().includes(r))throw new $(`reset-config: unknown config key "${r}" (have: ${pC().join(`, `)})`);zC(Me(),r,t.dlog),t.dlog(`info`,`reset-config: ${r} (session=${i})`)},Aw=(e,t)=>{let[n=``,r=``,i=``]=mw(()=>Kt(e)),a=fw(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${pC().join(`, `)})`);let o=mC(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=N_(r);if(s===null||s.scope!==`preset-root-ops`)throw new $(`apply-layout-op: "${r}" is not a "presets.<name>.rootOps" target`);let c=PC(Me(),t.dlog).presetRootOps[s.preset]??[],l=JSON.stringify([...c,o.value]);RC(Me(),r,l,t.dlog),t.dlog(`info`,`apply-layout-op: ${r} += ${o.value} (session=${a})`)},jw=(e,t)=>{let[n=``]=mw(()=>Kt(e)),r=fw(n),i=XC(Me(),t.dlog);if(i===null)throw new $(`undo: history is empty, nothing to undo`);t.dlog(`info`,`undo: ${i.key} (session=${r})`)},Mw=(e,t)=>{let[n=``]=mw(()=>Kt(e)),r=fw(n),i=ZC(Me(),t.dlog);if(i===null)throw new $(`redo: nothing to redo`);t.dlog(`info`,`redo: ${i.key} (session=${r})`)},Nw=`config-override`,Pw=new Map([[Ft,gw],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=fw(mw(()=>decodeURIComponent(e.slice(0,n)))),i=mw(()=>decodeURIComponent(e.slice(n+1))).trim();if(i!==``){if(!i.startsWith(`/`))throw new $(`load-config: path must be absolute, got "${i}"`);if(!/\.(json5?|json)$/.test(i))throw new $(`load-config: path must end with .json5 or .json, got "${i}"`)}i===``?(t.sessionState.clear(r,Nw),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,Nw,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[It,_w],[Pt,xw],[N,Tw],[zt,Dw],[Bt,Ow],[Vt,kw],[Ht,Aw],[Ut,jw],[Wt,Mw],[Lt,vw],[Rt,yw],[`toolbar-toggle`,bw]]),Fw=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of Jt(e)){if(!i&&(a===`set-state`||a===`step-state`||a===`set-config`||a===`step-config`||a===`reset-config`||a===`apply-layout-op`||a===`undo`||a===`redo`||a===`toolbar-toggle`)){let e=Kt(o);e.length>0&&e[0]&&(i=e[0])}let e=Pw.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof $||(r=!0),n.push(`${a}: ${e instanceof Error?e.message:String(e)}`)}}if(n.length>0){i&&t.sessionState.set(i,`click.error`,n.join(`
167
- `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}},Iw=new Map([...Pw,[M,Fw]]);Object.freeze([...Iw.keys()]);const Lw=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`]),Rw=[[`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 zw(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of Rw){let i=Bw(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))Lw.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function Bw(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 Vw(e,t){switch(e){case`vars`:return{what:e,vars:Hw(t)};case`segments`:return{what:e,segments:Kw(t)};case`config`:return{what:e,config:Yw(t)}}}function Hw(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=Ww(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:Uw(r.lastUpdatedMs())})}return o}function Uw(e){return e===null?null:Math.max(0,Date.now()-e)}function Ww(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,Gw(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}`,Gw(i));return t}function Gw(e){return e.kind}function Kw(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=qw(n),o=[];for(let e of a){let t=n.segments[e];t&&o.push({name:e,template:t.template,referencedVars:Jw(t.template,i),lastRender:r.get(e)??null})}return o}function qw(e){let t=[],n=new Set;for(let r of uh(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 Jw(e,t){let n=new Set;for(let r of Vy(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 Yw(e){return e===null?null:e.config}const Xw=[`vars`,`segments`,`config`];function Zw(e){return typeof e==`string`&&Xw.includes(e)}function Qw(e){return Math.max(1,e-2)}var $w=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return O(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);O(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{O(`Calculating context tokens from transcript: ${e}`);let n=await Wr(e);if(n.length===0)return O(`No entries in transcript`),B;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,O(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return O(`Most recent main chain context: ${n} tokens (limit: ${t})`),z({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`No main chain entries with usage data found`),B}catch(e){return Xn(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return z(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}};function eT(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 tT=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(eT(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=Mr(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 Jr(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||(eT(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(O(`Getting metrics from hook data for session: ${e}`),!t.cost)return B;let n=await this.foldMetrics(e,t.transcript_path);return n.kind===`failed`?Xn(`metrics (${e}): ${n.reason}`):z({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 nT=new Map;function rT(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var iT=class{async getSessionId(){if(!process.env.TMUX_PANE)return B;let e=rT(process.env.TMUX),t=nT.get(e);if(t!==void 0)return t;O(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await ye({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?z(n.stdout.trim()):B:Xn(`tmux display-message: ${n.reason}`);return nT.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};function aT(e){return e<32||e===127||e>=128&&e<=159}function oT(e,t){let n=``;for(let t of e)n+=aT(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 sT=`\x1B[38;2;255;255;255m`,cT=`\x1B[48;2;200;40;40m`,lT=`\x1B[0m`,uT=new aw;ve(uT.launchStats);const dT=new xr({counters:uT,logger:j}),fT=new Or({watchers:dT,logger:j}),pT=new oi,mT=new cw,hT=new $w,gT=new tT,_T=new iT,vT=new rw({gitService:fT,sessionState:mT,watchers:dT});let yT=null,bT=null,xT=0;function ST(){t.on(`uncaughtException`,e=>{j(`error`,`uncaughtException: ${e.stack||e.message}`),NT(1)}),t.on(`unhandledRejection`,e=>{j(`error`,`unhandledRejection: ${String(e)}`),NT(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{j(`info`,`received ${e}, shutting down`),NT(0)});try{xT=dt(t.env)}catch(e){j(`error`,`refusing to boot: ${e.message}`),NT(1);return}yT=Rn(t.pid);let e=qn(Yn(yT));if(!e.decision.allow){j(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),NT(1);return}bT=e.registryPath,r.mkdirSync(Ee(),{recursive:!0}),ke(De()),mT.useStorage(new dw(je(),500,j)),Vn({anchor:Bn(t.env),isAlive:Hn,onOrphaned:e=>{j(`info`,`parent watchdog: ${e}; shutting down`),NT(0)}}),CT(g.createServer({allowHalfOpen:!1},e=>{PT(e)}),De(),!1)}function CT(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){j(`error`,`server error: ${i.message}`),NT(1);return}if(r){j(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}wT(e,n)}),e.listen(n,()=>TT(n))}function wT(e,n){let i=kn(An(A(n)),(e,t)=>Ln(e,t,{readStartTime:L,pidAlive:Hn}));if(i.kind===`attach-and-exit`){j(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}j(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){j(`error`,`cannot unlink stale socket ${n}: ${e.message}`),NT(1);return}}CT(e,n,!0)}function TT(e){let n=Nn(e);if(n.kind!==`present`){j(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),NT(0);return}AT(e);try{r.chmodSync(e,384)}catch(e){j(`warn`,`chmod socket failed: ${e.message}`)}j(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(_.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(xT/1048576)}MB`),Ct(),DT(),kT(),ET(e,n.identity)}function ET(e,n){In({bound:n,myPid:t.pid,readIdentity:()=>Nn(e),readLease:()=>An(A(e)),shutdown:e=>NT(e),log:j}).arm()}function DT(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(b(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){j(`info`,`binary mtime changed (${e}); shutting down`),clearInterval(a),NT(0);return}}catch(e){j(`warn`,`bin stat failed: ${e.message}`)}},6e4);a.unref()}let OT=null;function kT(){OT=ft(mt(uT.startedAt.getTime(),e=>NT(e),{rssLimitBytes:xT})),OT.arm()}function AT(e){let n=jn(A(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:yT});n!==null&&j(`warn`,`lease write failed: ${n}`)}let jT=0,MT=!1;function NT(e){if(!MT){MT=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{fT.close()}catch(e){j(`warn`,`gitService close failed: ${e.message}`)}try{pT.close()}catch(e){j(`warn`,`usageStore close failed: ${e.message}`)}try{dT.closeAll()}catch(e){j(`warn`,`watcherRegistry close failed: ${e.message}`)}try{mT.flush()}catch(e){j(`warn`,`sessionState flush failed: ${e.message}`)}Mn(Ae(),t.pid),bT!==null&&Jn(bT,t.pid,Gn,e=>r.unlinkSync(e)),t.exit(e)}}function PT(e){jT++,uT.inFlight=jT;let t=!1,n=(n,r)=>{if(t){r!==null&&j(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>NT(r);try{e.end(Ue(n),i)}catch(e){j(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{uT.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=We(e=>{IT(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{j(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{j(`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=>{j(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),jT=Math.max(0,jT-1),uT.inFlight=jT})}const FT=e=>({resp:e,exitAfterFlush:null});async function IT(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return FT({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?j(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):j(`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 FT({ok:!0,stats:uT.snapshot({gitCache:fT.getStats(),usageCache:pT.getStats(),renderCacheSize:vT.size,watchersActive:dT.size(),nextRestartReason:OT?.describeNextRestart()??null})});if(e.kind===`render`){uT.requestsTotal++;let t=Date.now();try{let{report:n}=zw(e.hookData);for(let e of n.unknownTopLevelFields)j(`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 uT.requestsErrored++,j(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),FT({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=zT(e.args),s=e.hookData.session_id,c=mT.get(s,`config-override`)??a,l=vT.getOrCreate(i,e.cwd,c),u=Re(e),d=u.termCols,f=Qw(d??120),p={...UT,width:f},m=``;if(l.state!==null){let t=l.state.presetRootOps,n=Cb(l.state.config,t=>mT.get(e.hookData.session_id,t),e=>tl(t,e)),r=await Ib(e.hookData,qT,e.cwd,l.state.neededInputPaths,n,u),i=Bx(n.theme);p.style=n.style,p.separator=n.separator,p.wrap=n.autoWrap,p.padding=n.padding,p.charset=n.charset,p.colorCompatibility=n.colorCompatibility,m=LS(l.state.config,l.state.compiled,l.state.store,l.state.registry,r,i,p,{perSegmentSink:l.state.lastRenderCellsBySegment},{look:Tc(l.state.config.looks,n.look),preset:n.preset})}let h=mT.get(e.hookData.session_id,`click.error`);h&&mT.clear(e.hookData.session_id,`click.error`);let g=[o,l.lastError,h].filter(Boolean).join(`
167
+ `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}},Iw=new Map([...Pw,[M,Fw]]);Object.freeze([...Iw.keys()]);const Lw=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`]),Rw=[[`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 zw(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of Rw){let i=Bw(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))Lw.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function Bw(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 Vw(e,t){switch(e){case`vars`:return{what:e,vars:Hw(t)};case`segments`:return{what:e,segments:Kw(t)};case`config`:return{what:e,config:Yw(t)}}}function Hw(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=Ww(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:Uw(r.lastUpdatedMs())})}return o}function Uw(e){return e===null?null:Math.max(0,Date.now()-e)}function Ww(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,Gw(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}`,Gw(i));return t}function Gw(e){return e.kind}function Kw(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=qw(n),o=[];for(let e of a){let t=n.segments[e];t&&o.push({name:e,template:t.template,referencedVars:Jw(t.template,i),lastRender:r.get(e)??null})}return o}function qw(e){let t=[],n=new Set;for(let r of uh(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 Jw(e,t){let n=new Set;for(let r of Vy(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 Yw(e){return e===null?null:e.config}const Xw=[`vars`,`segments`,`config`];function Zw(e){return typeof e==`string`&&Xw.includes(e)}function Qw(e){return Math.max(1,e-2)}var $w=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return O(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);O(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{O(`Calculating context tokens from transcript: ${e}`);let n=await Wr(e);if(n.length===0)return O(`No entries in transcript`),B;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,O(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return O(`Most recent main chain context: ${n} tokens (limit: ${t})`),z({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`No main chain entries with usage data found`),B}catch(e){return Xn(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return z(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}};function eT(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 tT=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(eT(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=Mr(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 Jr(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||(eT(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(O(`Getting metrics from hook data for session: ${e}`),!t.cost)return B;let n=await this.foldMetrics(e,t.transcript_path);return n.kind===`failed`?Xn(`metrics (${e}): ${n.reason}`):z({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 nT=new Map;function rT(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var iT=class{async getSessionId(){if(!process.env.TMUX_PANE)return B;let e=rT(process.env.TMUX),t=nT.get(e);if(t!==void 0)return t;O(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await ye({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?z(n.stdout.trim()):B:Xn(`tmux display-message: ${n.reason}`);return nT.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};function aT(e){return e<32||e===127||e>=128&&e<=159}function oT(e,t){let n=``;for(let t of e)n+=aT(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 sT=`\x1B[38;2;255;255;255m`,cT=`\x1B[48;2;200;40;40m`,lT=`\x1B[0m`,uT=new aw;ve(uT.launchStats);const dT=new xr({counters:uT,logger:j}),fT=new Or({watchers:dT,logger:j}),pT=new oi,mT=new cw,hT=new $w,gT=new tT,_T=new iT,vT=new rw({gitService:fT,sessionState:mT,watchers:dT},{observers:{onReload:e=>j(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} file=${e.configFilePath??`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}});let yT=null,bT=null,xT=0;function ST(){t.on(`uncaughtException`,e=>{j(`error`,`uncaughtException: ${e.stack||e.message}`),NT(1)}),t.on(`unhandledRejection`,e=>{j(`error`,`unhandledRejection: ${String(e)}`),NT(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{j(`info`,`received ${e}, shutting down`),NT(0)});try{xT=dt(t.env)}catch(e){j(`error`,`refusing to boot: ${e.message}`),NT(1);return}yT=Rn(t.pid);let e=qn(Yn(yT));if(!e.decision.allow){j(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),NT(1);return}bT=e.registryPath,r.mkdirSync(Ee(),{recursive:!0}),ke(De()),mT.useStorage(new dw(je(),500,j)),Vn({anchor:Bn(t.env),isAlive:Hn,onOrphaned:e=>{j(`info`,`parent watchdog: ${e}; shutting down`),NT(0)}}),CT(g.createServer({allowHalfOpen:!1},e=>{PT(e)}),De(),!1)}function CT(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){j(`error`,`server error: ${i.message}`),NT(1);return}if(r){j(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}wT(e,n)}),e.listen(n,()=>TT(n))}function wT(e,n){let i=kn(An(A(n)),(e,t)=>Ln(e,t,{readStartTime:L,pidAlive:Hn}));if(i.kind===`attach-and-exit`){j(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}j(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){j(`error`,`cannot unlink stale socket ${n}: ${e.message}`),NT(1);return}}CT(e,n,!0)}function TT(e){let n=Nn(e);if(n.kind!==`present`){j(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),NT(0);return}AT(e);try{r.chmodSync(e,384)}catch(e){j(`warn`,`chmod socket failed: ${e.message}`)}j(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(_.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(xT/1048576)}MB`),Ct(),DT(),kT(),ET(e,n.identity)}function ET(e,n){In({bound:n,myPid:t.pid,readIdentity:()=>Nn(e),readLease:()=>An(A(e)),shutdown:e=>NT(e),log:j}).arm()}function DT(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(b(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){j(`info`,`binary mtime changed (${e}); shutting down`),clearInterval(a),NT(0);return}}catch(e){j(`warn`,`bin stat failed: ${e.message}`)}},6e4);a.unref()}let OT=null;function kT(){OT=ft(mt(uT.startedAt.getTime(),e=>NT(e),{rssLimitBytes:xT})),OT.arm()}function AT(e){let n=jn(A(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:yT});n!==null&&j(`warn`,`lease write failed: ${n}`)}let jT=0,MT=!1;function NT(e){if(!MT){MT=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{fT.close()}catch(e){j(`warn`,`gitService close failed: ${e.message}`)}try{pT.close()}catch(e){j(`warn`,`usageStore close failed: ${e.message}`)}try{dT.closeAll()}catch(e){j(`warn`,`watcherRegistry close failed: ${e.message}`)}try{mT.flush()}catch(e){j(`warn`,`sessionState flush failed: ${e.message}`)}Mn(Ae(),t.pid),bT!==null&&Jn(bT,t.pid,Gn,e=>r.unlinkSync(e)),t.exit(e)}}function PT(e){jT++,uT.inFlight=jT;let t=!1,n=(n,r)=>{if(t){r!==null&&j(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>NT(r);try{e.end(Ue(n),i)}catch(e){j(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{uT.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=We(e=>{IT(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{j(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{j(`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=>{j(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),jT=Math.max(0,jT-1),uT.inFlight=jT})}const FT=e=>({resp:e,exitAfterFlush:null});async function IT(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return FT({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?j(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):j(`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 FT({ok:!0,stats:uT.snapshot({gitCache:fT.getStats(),usageCache:pT.getStats(),renderCacheSize:vT.size,watchersActive:dT.size(),nextRestartReason:OT?.describeNextRestart()??null})});if(e.kind===`render`){uT.requestsTotal++;let t=Date.now();try{let{report:n}=zw(e.hookData);for(let e of n.unknownTopLevelFields)j(`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 uT.requestsErrored++,j(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),FT({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=zT(e.args),s=e.hookData.session_id,c=mT.get(s,`config-override`)??a,l=vT.getOrCreate(i,e.cwd,c),u=Re(e),d=u.termCols,f=Qw(d??120),p={...UT,width:f},m=``;if(l.state!==null){let t=l.state.presetRootOps,n=Cb(l.state.config,t=>mT.get(e.hookData.session_id,t),e=>tl(t,e)),r=await Ib(e.hookData,qT,e.cwd,l.state.neededInputPaths,n,u),i=Bx(n.theme);p.style=n.style,p.separator=n.separator,p.wrap=n.autoWrap,p.padding=n.padding,p.charset=n.charset,p.colorCompatibility=n.colorCompatibility,m=LS(l.state.config,l.state.compiled,l.state.store,l.state.registry,r,i,p,{perSegmentSink:l.state.lastRenderCellsBySegment},{look:Tc(l.state.config.looks,n.look),preset:n.preset})}let h=mT.get(e.hookData.session_id,`click.error`);h&&mT.clear(e.hookData.session_id,`click.error`);let g=[o,l.lastError,h].filter(Boolean).join(`
168
168
  `)||null,_=VT(m,g,l.lastWarning),v=Date.now()-t,y=fT.getStats(),b=pT.getStats();return j(`info`,`render sid=${e.hookData.session_id??`?`} took=${v}ms termCols=${d??`?`} width=${f} git=${y.size}/${y.hits}h/${y.misses}m usage=${b.size}/${b.hits}h/${b.misses}m err=${l.lastError?`Y`:`N`} warn=${l.lastWarning?`Y`:`N`}`),FT({ok:!0,output:_+`
169
169
  `})}catch(e){throw uT.requestsErrored++,e}}if(e.kind===`click`)return FT(await JT(e.verb,e.value));if(e.kind===`debug`){if(!Zw(e.what))return FT({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${Xw.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=vT.firstPopulatedState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?KT(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):GT};return FT({ok:!0,debug:Vw(e.what,n)})}return FT({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}const LT=`\x1B]8;;`,RT=`\x1B]8;;\x1B\\`;function zT(e){let{values:t,tokens:n}=x({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:cb(i),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}function BT(e,t,n,r){let i=qt([{verb:e,args:[t]}]),a=t.split(/\r\n|\r|\n/).map(e=>oT(e,120)).filter(Boolean).slice(0,8);return a.length===0?``:[`${LT}${i}\\${n}${r} ⚠ ${a[0]} ${lT}${RT}`,...a.slice(1).map(e=>`${LT}${i}\\${n}${r} ${e} ${lT}${RT}`)].join(`
170
170
  `)}function VT(e,t,n){let r=[];if(t&&r.push(BT(Lt,t,cT,sT)),n&&r.push(BT(Rt,n,`\x1B[48;2;220;160;40m`,`\x1B[38;2;0;0;0m`)),r.length===0)return e;let i=r.join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.41.2",
3
+ "version": "1.41.3",
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.41.2",
95
- "@promptctl/cc-candybar-darwin-x64": "1.41.2",
96
- "@promptctl/cc-candybar-linux-x64": "1.41.2",
97
- "@promptctl/cc-candybar-linux-arm64": "1.41.2"
94
+ "@promptctl/cc-candybar-darwin-arm64": "1.41.3",
95
+ "@promptctl/cc-candybar-darwin-x64": "1.41.3",
96
+ "@promptctl/cc-candybar-linux-x64": "1.41.3",
97
+ "@promptctl/cc-candybar-linux-arm64": "1.41.3"
98
98
  }
99
99
  }
@@ -61,6 +61,45 @@ export interface RenderDeps {
61
61
  watchers: WatcherRegistry;
62
62
  }
63
63
 
64
+ // [LAW:no-ambient-temporal-coupling] The cache's outward lifecycle signal. A
65
+ // reload is the one event the cache alone knows the completion of — it runs
66
+ // from a debounced fs watcher, on the cache's own schedule — so anything that
67
+ // must run AFTER a reload (an operator log of its outcome, a test asserting
68
+ // on the state it wrote) needs the cache to say so, or it is left betting on
69
+ // a clock. The same named-bag idiom as renderDsl's RenderObservers
70
+ // [LAW:locality-or-seam]: a caller states what it passes by name, and a new
71
+ // observer is one field here, not a constructor signature every caller
72
+ // re-counts.
73
+ export interface RenderCacheObservers {
74
+ // Fires once per completed reload of an entry — the initial population in
75
+ // getOrCreate and every watcher-driven reload alike, success (a fresh
76
+ // `state`) and failure (`lastError` set, prior state preserved) alike —
77
+ // after the entry's fields and watcher are settled. The entry is handed
78
+ // over as ReloadedEntry so the observer reads the outcome from the one
79
+ // place it lives and the type, not this comment, keeps it from writing
80
+ // there. Trusted non-throwing (the same contract as onSegmentError): an
81
+ // observer that throws is a caller bug surfaced loudly, never absorbed here.
82
+ readonly onReload?: (entry: ReloadedEntry) => void;
83
+ }
84
+
85
+ // [LAW:types-are-the-program] The observer's view of an entry: an ALLOW-LIST
86
+ // of the load's outcome. Nothing that owns a resource — the watcher handle,
87
+ // the SourceRegistry, the validator disposers, the render-cell sink — crosses
88
+ // this seam, so a handle added to either type later is closed by
89
+ // construction, not by remembering to omit it (`Readonly` alone would not:
90
+ // it cannot stop a method call such as `dispose()`).
91
+ export type ReloadedEntry = Readonly<
92
+ Pick<
93
+ CacheEntry,
94
+ | "projectDir"
95
+ | "cwd"
96
+ | "configFile"
97
+ | "configFilePath"
98
+ | "lastError"
99
+ | "lastWarning"
100
+ >
101
+ > & { readonly state: Readonly<Pick<DslRenderState, "config">> | null };
102
+
64
103
  // [LAW:types-are-the-program] The DSL render state for an entry is one
65
104
  // optionally-null bundle, not five independently-optional fields. Either
66
105
  // every field is populated (a render is possible) or all are null (parse
@@ -154,10 +193,15 @@ export class RenderCache {
154
193
  private readonly entries = new Map<string, CacheEntry>();
155
194
  private readonly deps: RenderDeps;
156
195
  private readonly maxEntries: number;
196
+ private readonly observers: RenderCacheObservers;
157
197
 
158
- constructor(deps: RenderDeps, opts: { maxEntries?: number } = {}) {
198
+ constructor(
199
+ deps: RenderDeps,
200
+ opts: { maxEntries?: number; observers?: RenderCacheObservers } = {},
201
+ ) {
159
202
  this.deps = deps;
160
203
  this.maxEntries = opts.maxEntries ?? MAX_ENTRIES;
204
+ this.observers = opts.observers ?? {};
161
205
  }
162
206
 
163
207
  // [LAW:dataflow-not-control-flow] One uniform shape: every entry has the
@@ -188,9 +232,15 @@ export class RenderCache {
188
232
  state: null,
189
233
  watcher: null,
190
234
  };
191
- this.reloadInto(entry);
235
+ // [LAW:single-enforcer] Insert, bound, then load — in that order. From the
236
+ // moment the entry owns live handles it is reachable for eviction and
237
+ // dispose, so a throwing observer cannot strand a registry outside the
238
+ // map, and a reentrant getOrCreate for this key finds the entry under
239
+ // construction rather than building a duplicate. The bound runs before
240
+ // the load because it is a fact about the MAP, complete at insertion:
241
+ // nothing the load does (including an observer throwing) can skip it.
242
+ // [LAW:dataflow-not-control-flow]
192
243
  this.entries.set(key, entry);
193
-
194
244
  if (this.entries.size > this.maxEntries) {
195
245
  const oldest = this.entries.keys().next().value;
196
246
  if (oldest !== undefined) {
@@ -205,6 +255,7 @@ export class RenderCache {
205
255
  this.entries.delete(oldest);
206
256
  }
207
257
  }
258
+ this.reloadInto(entry);
208
259
 
209
260
  return entry;
210
261
  }
@@ -220,7 +271,17 @@ export class RenderCache {
220
271
  // new DslConfig disposes the old SourceRegistry before constructing a new
221
272
  // one. The registry owns timers, watchers, MobX reactions, and git
222
273
  // subscriptions — dropping it without dispose leaks every handle.
274
+ //
275
+ // [LAW:single-enforcer] One publish point for "this reload completed":
276
+ // loadFromDisk owns the outcome (it returns through more than one arm),
277
+ // and this wrapper is the only caller, so the signal structurally cannot
278
+ // be skipped by whichever arm a reload takes — or by an arm added later.
223
279
  private reloadInto(entry: CacheEntry): void {
280
+ this.loadFromDisk(entry);
281
+ this.observers.onReload?.(entry);
282
+ }
283
+
284
+ private loadFromDisk(entry: CacheEntry): void {
224
285
  const resolvedPath = resolveDslConfigPath(
225
286
  entry.projectDir,
226
287
  entry.cwd,
@@ -286,7 +347,7 @@ export class RenderCache {
286
347
  // store, registry, compiled segments, palette — as one transaction. Any
287
348
  // failure inside disposes the partially-built registry so we don't leak
288
349
  // timers/watchers from a half-constructed reload, then rethrows so the
289
- // caller (reloadInto) preserves the prior `entry.state` unchanged.
350
+ // caller (loadFromDisk) preserves the prior `entry.state` unchanged.
290
351
  private buildState(
291
352
  entry: CacheEntry,
292
353
  resolvedPath: string | null,
@@ -396,7 +457,7 @@ export class RenderCache {
396
457
  // key) are part of the same construction transaction as the registry: any
397
458
  // failure (registration, a duplicate-key throw) disposes every handle built
398
459
  // so far — registry AND already-installed validators — before rethrowing, so
399
- // reloadInto preserves the prior last-known-good with nothing half-installed.
460
+ // loadFromDisk preserves the prior last-known-good with nothing half-installed.
400
461
  const validatorDisposers: Array<() => void> = [];
401
462
  try {
402
463
  // [LAW:one-source-of-truth] The action runtime reads session.id + current
@@ -131,11 +131,27 @@ const sessionState = new SessionState();
131
131
  const contextProvider = new ContextProvider();
132
132
  const metricsProvider = new MetricsProvider();
133
133
  const tmuxService = new TmuxService();
134
- const renderCache = new RenderCache({
135
- gitService,
136
- sessionState,
137
- watchers: watcherRegistry,
138
- });
134
+ const renderCache = new RenderCache(
135
+ {
136
+ gitService,
137
+ sessionState,
138
+ watchers: watcherRegistry,
139
+ },
140
+ {
141
+ observers: {
142
+ // [LAW:no-silent-failure] Every config (re)load's outcome lands in
143
+ // daemon.log beside the "config change detected" line that preceded it
144
+ // — the operator's only record of whether a save was picked up cleanly,
145
+ // kept rendering last-known-good behind an error, or resolved to a
146
+ // different file. Same info level as the detection line.
147
+ onReload: (entry) =>
148
+ dlog(
149
+ "info",
150
+ `config loaded projectDir=${entry.projectDir} cwd=${entry.cwd} file=${entry.configFilePath ?? "<bundled default>"} error=${entry.lastError === null ? "none" : JSON.stringify(entry.lastError)} warning=${entry.lastWarning === null ? "none" : JSON.stringify(entry.lastWarning)}`,
151
+ ),
152
+ },
153
+ },
154
+ );
139
155
 
140
156
  const REQUEST_TIMEOUT_MS = 200;
141
157
  const BIN_CHECK_INTERVAL_MS = 60 * 1000;