@promptctl/cc-candybar 1.52.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +4 -4
  2. package/package.json +5 -5
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
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,pathToFileURL as x}from"node:url";import{parseArgs as S}from"node:util";import C,{createHash as ee}from"node:crypto";import{get as te}from"node:https";import{setTimeout as w}from"node:timers/promises";import{open as ne,readFile as T,readdir as re,stat as E}from"node:fs/promises";import{createInterface as D}from"node:readline";import{clearInterval as ie,setInterval as ae}from"node:timers";var oe=Object.create,se=Object.defineProperty,ce=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyNames,ue=Object.getPrototypeOf,de=Object.prototype.hasOwnProperty,fe=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),pe=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=le(t),a=0,o=i.length,s;a<o;a++)s=i[a],!de.call(e,s)&&s!==n&&se(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=ce(t,s))||r.enumerable});return e},me=(e,t,n)=>(n=e==null?{}:oe(ue(e)),pe(t||!e||!e.__esModule?se(n,`default`,{value:e,enumerable:!0}):n,e));function O(e,...t){process.env.CC_CANDYBAR_DEBUG&&console.error(`[DEBUG] ${e}`,...t)}const he={"click.pbcopy":1e3,"click.open":1e3},ge=new Map;function k(e){let t=he[e];if(t===void 0)return{allowed:!0};let n=ge.get(e);if(n===void 0)return{allowed:!0};let r=Date.now()-n;return r>=t?{allowed:!0}:{allowed:!1,minIntervalMs:t,sinceLastMs:r}}function _e(e){ge.set(e,Date.now())}function ve(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 ye=null;function be(e){ye=e}async function xe(e){let t=k(e.category);if(!t.allowed)return ve(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();return ye?.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){ye?.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),ye?.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 Se(e){let t=k(e.category);if(!t.allowed)return ve(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();ye?.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`});ye?.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 ye?.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 Ce(e){let t=k(e.category);if(!t.allowed)return ve(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();ye?.onStart(e.category);let r=we(e);return ye?.onEnd(e.category,Date.now()-n),r}function we(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 Te(e){let t=process.env[e];return t&&t.length>0?t:void 0}function Ee(){let e=Te(`XDG_STATE_HOME`)??c.join(f.homedir(),`.local`,`state`);return c.join(e,`cc-candybar`)}function De(){let e=Te(`XDG_CACHE_HOME`)??c.join(f.homedir(),`.cache`);return c.join(e,`cc-candybar`)}function Oe(){return Ee()}function ke(){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 A(e){r.mkdirSync(e,{recursive:!0,mode:448});let t=r.lstatSync(e);if(t.isSymbolicLink())throw Error(`directory is a symlink: ${e}`);if(!t.isDirectory())throw Error(`not a directory: ${e}`);let n=f.userInfo().uid;if(typeof n==`number`&&t.uid!==n)throw Error(`directory is not owned by uid ${n}: ${e} (owner uid=${t.uid})`);if(t.mode&63)throw Error(`directory has unsafe permissions: ${e} (mode=${(t.mode&511).toString(8)}, expected 0700)`)}function Ae(e){A(c.dirname(e));for(let t of[e,je(e)])try{if(r.lstatSync(t).isSymbolicLink())throw Error(`path is a symlink: ${t}`)}catch(e){if(e.code!==`ENOENT`)throw e}}function je(e){return`${e}.lease`}function Me(){return je(ke())}function Ne(){return c.join(Ee(),`session-state.json`)}function Pe(){return c.join(Ee(),`config-edit-history.json`)}function Fe(){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 Ie(){return c.join(Ee(),`spawn.lock`)}function Le(){return c.join(Ee(),`spawn.cooldown`)}function Re(){return c.join(Ee(),`spawn.backoff`)}function ze(){return c.join(Ee(),`diagnostics`)}function Be(){return c.join(Ee(),`daemon.log`)}function Ve(e){let t=Ue(e.termCols),n=Ue(e.termRows),r=We(e.ssh);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r}}}const He=1e4;function Ue(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>He?He:t}function We(e){return typeof e==`boolean`?e:void 0}var Ge=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function Ke(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function qe(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 Ge(`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 Ge(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function Je(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=qe(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(Ke(t))})}async function Ye(e,t,n){let r=null;try{r=await et(ke(),t.connectMs);let i=await Je(r,{v:3,...e},t.budgetMs);return Qe(e.kind,i,n)}catch(e){return $e(e)}finally{r&&r.destroy()}}function Xe(e,t){return typeof e==`string`?e:t}function Ze(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function Qe(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=Xe(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:Ze(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 $e(e){if(e instanceof Ge||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 et(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 tt(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 nt={connectMs:50,budgetMs:150},rt={connectMs:50,budgetMs:200};function it(e){let t=e.output;return typeof t==`string`?t:void 0}function at(e,t,n,r){return Ye({kind:`render`,hookData:e,args:t,cwd:n,...r},nt,it)}function ot(e,t){return Ye({kind:`click`,verb:e,value:t},rt,it)}let st=null;function ct(e){if(st!==null)return st;r.mkdirSync(c.dirname(e),{recursive:!0});try{st=r.statSync(e).size}catch{st=0}return st}function lt(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{}st=0}function j(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=Be(),t=ct(e);r.appendFileSync(e,n),st=t+Buffer.byteLength(n,`utf8`),st>=5242880&&lt(e)}catch(e){st=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}const ut=`CC_CANDYBAR_RSS_LIMIT_MB`;function dt(e){let t=e[ut];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${ut} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function ft(e){return dt(e)*2}const pt=1024*1024;function mt(e){return dt(e)*pt}function ht(e){let t=e.rssLimitBytes??512*pt,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}`),gt(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 gt(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 _t(e,t,n={}){let i=Oe();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 vt(e={}){if(Pt()!==null)return;let n=e.spawn??Ft,r=jt();if(r.kind===`contended`){let e=bt();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),yt(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),yt(n);return}try{yt(n)}finally{Nt()}}function yt(e){Dt()&&xt(e)}function bt(){try{let e=r.statSync(Ie());return Date.now()-e.mtimeMs}catch{return null}}function xt(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
3
- `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function St(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function Ct(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function wt(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 Tt(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 Et(){try{r.unlinkSync(Re())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function Dt(){let e=Le(),n=Re(),r=wt(n),i=St(Ot(e),Ct(r));return i.kind===`deny`?!1:(i.kind===`allow-future-garbage`&&t.stderr.write(`cc-candybar: spawn.cooldown mtime is ${i.futureMs}ms in the future — ignoring and spawning\n`),kt(e),Tt(n,Math.min(r+1,5)),!0)}function Ot(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function kt(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 At=null;function jt(){let e=Ie();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 At={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(!Mt(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 Mt(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function Nt(){if(!At)return;let{fd:e,path:t}=At;At=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function Pt(){try{return r.mkdirSync(Oe(),{recursive:!0}),null}catch(e){return`mkdir ${Oe()}: ${e.message}`}}function Ft(){let e=t.execPath,n=t.argv[1];return n?Ce({bin:e,args:[`--max-old-space-size=${ft(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const M=`cc-candybar`,It=`dispatch`,Lt=`set-state`,Rt=`step-state`,zt=`copy`,Bt=`open-vscode`,Vt=`show-config-error`,Ht=`show-config-warning`,Ut=`set-config`,Wt=`step-config`,Gt=`reset-config`,Kt=`apply-layout-op`,qt=`undo`,Jt=`redo`,Yt=`apply-update`;function Xt(e){return e.map(encodeURIComponent).join(`/`)}function Zt(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function Qt(e){return`${M}://${It}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${Xt(e.args)}`)}`).join(`&`)}`}function $t(e){return new y(e).getAll(`e`).map(en)}function en(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const tn=`closed`;function nn(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 N(e,t,n,r){let i=nn(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function rn(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function an(e,...t){return`{{ and ${[e,...t].map(on).join(` `)} }}`}function on(e){return`(eq .${e.variable} "${rn(e.member)}")`}function sn(e,t,n){return`{{ action "${e}" "${rn(t)}" "${rn(n)}" }}`}function cn(e,t){return{kind:`state`,key:e,default:t}}function ln(e,t){return{set:e,cycle:[tn,t]}}const un=`1.52.0`;function P(e){return{kind:`ok`,value:e}}const F={kind:`absent`};function I(e){return{kind:`failed`,reason:e}}function dn(e,t){return e?.kind===`ok`?e.value:t}const fn=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function L(e){let t=fn.exec(e);return t?{kind:`ok`,value:[Number(t[1]),Number(t[2]),Number(t[3])]}:{kind:`failed`,reason:`"${e}" is not a release version (expected MAJOR.MINOR.PATCH)`}}function R(e){return e.join(`.`)}function pn([e,t,n],[r,i,a]){return e-r||t-i||n-a}const mn=`@promptctl/cc-candybar`;async function hn(e,t,n){let r=`${n}/-/package/${encodeURIComponent(e)}/dist-tags`;try{let e=await t(r,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return I(`registry responded ${e.status} for ${r}`);let n=await e.json();return typeof n.latest==`string`?L(n.latest):F}catch(e){return I(e instanceof Error?e.message:String(e))}}function gn(e,t){let n=L(e);if(n.kind===`failed`)return{kind:`unchecked`,installed:e,reason:n.reason};switch(t.kind){case`failed`:return{kind:`unchecked`,installed:e,reason:t.reason};case`absent`:return{kind:`unchecked`,installed:e,reason:"the registry lists no `latest` dist-tag"};case`ok`:{let e=pn(n.value,t.value);return e<0?{kind:`stale`,installed:n.value,latest:t.value}:e>0?{kind:`ahead`,installed:n.value,latest:t.value}:{kind:`current`,installed:n.value}}}}function _n(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${R(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${R(t.installed)} is newer than the registry's latest release (${R(t.latest)}): an unpublished build.\n`};case`stale`:{let n=R(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${R(t.installed)} was staged, but the latest release is ${n}.\n pnpm's release-age gate (minimumReleaseAge) and its dlx cache can both\n resolve \`@latest\` to an older release without saying so.\n To install ${n} now, name it explicitly:\n pnpm dlx ${e}@${n} install\n`}}case`unchecked`:return{stream:`stderr`,text:`⚠ Could not check for a cc-candybar release newer than ${t.installed} (${t.reason}); the registry check was skipped.\n`}}}const vn=`CCCandybarURLHandler`,yn=[],z={"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 bn(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function xn(e,t){return[e,...t].map(bn).join(` `)}function Sn(){return c.join(f.homedir(),`Applications`,`${vn}.app`)}function Cn(){return c.join(f.homedir(),`.claude`,`settings.json`)}function wn(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function Tn(){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 En(){return c.join(Tn(),`bin`,`cc-candybar`)}function Dn(){return c.join(Tn(),`dist`,`index.mjs`)}function On(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(`
3
+ `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function St(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function Ct(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function wt(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 Tt(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 Et(){try{r.unlinkSync(Re())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function Dt(){let e=Le(),n=Re(),r=wt(n),i=St(Ot(e),Ct(r));return i.kind===`deny`?!1:(i.kind===`allow-future-garbage`&&t.stderr.write(`cc-candybar: spawn.cooldown mtime is ${i.futureMs}ms in the future — ignoring and spawning\n`),kt(e),Tt(n,Math.min(r+1,5)),!0)}function Ot(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function kt(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 At=null;function jt(){let e=Ie();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 At={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(!Mt(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 Mt(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function Nt(){if(!At)return;let{fd:e,path:t}=At;At=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function Pt(){try{return r.mkdirSync(Oe(),{recursive:!0}),null}catch(e){return`mkdir ${Oe()}: ${e.message}`}}function Ft(){let e=t.execPath,n=t.argv[1];return n?Ce({bin:e,args:[`--max-old-space-size=${ft(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const M=`cc-candybar`,It=`dispatch`,Lt=`set-state`,Rt=`step-state`,zt=`copy`,Bt=`open-vscode`,Vt=`show-config-error`,Ht=`show-config-warning`,Ut=`set-config`,Wt=`step-config`,Gt=`reset-config`,Kt=`apply-layout-op`,qt=`undo`,Jt=`redo`,Yt=`apply-update`;function Xt(e){return e.map(encodeURIComponent).join(`/`)}function Zt(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function Qt(e){return`${M}://${It}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${Xt(e.args)}`)}`).join(`&`)}`}function $t(e){return new y(e).getAll(`e`).map(en)}function en(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const tn=`closed`;function nn(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 N(e,t,n,r){let i=nn(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function rn(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function an(e,...t){return`{{ and ${[e,...t].map(on).join(` `)} }}`}function on(e){return`(eq .${e.variable} "${rn(e.member)}")`}function sn(e,t,n){return`{{ action "${e}" "${rn(t)}" "${rn(n)}" }}`}function cn(e,t){return{kind:`state`,key:e,default:t}}function ln(e,t){return{set:e,cycle:[tn,t]}}const un=`1.53.0`;function P(e){return{kind:`ok`,value:e}}const F={kind:`absent`};function I(e){return{kind:`failed`,reason:e}}function dn(e,t){return e?.kind===`ok`?e.value:t}const fn=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function L(e){let t=fn.exec(e);return t?{kind:`ok`,value:[Number(t[1]),Number(t[2]),Number(t[3])]}:{kind:`failed`,reason:`"${e}" is not a release version (expected MAJOR.MINOR.PATCH)`}}function R(e){return e.join(`.`)}function pn([e,t,n],[r,i,a]){return e-r||t-i||n-a}const mn=`@promptctl/cc-candybar`;async function hn(e,t,n){let r=`${n}/-/package/${encodeURIComponent(e)}/dist-tags`;try{let e=await t(r,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return I(`registry responded ${e.status} for ${r}`);let n=await e.json();return typeof n.latest==`string`?L(n.latest):F}catch(e){return I(e instanceof Error?e.message:String(e))}}function gn(e,t){let n=L(e);if(n.kind===`failed`)return{kind:`unchecked`,installed:e,reason:n.reason};switch(t.kind){case`failed`:return{kind:`unchecked`,installed:e,reason:t.reason};case`absent`:return{kind:`unchecked`,installed:e,reason:"the registry lists no `latest` dist-tag"};case`ok`:{let e=pn(n.value,t.value);return e<0?{kind:`stale`,installed:n.value,latest:t.value}:e>0?{kind:`ahead`,installed:n.value,latest:t.value}:{kind:`current`,installed:n.value}}}}function _n(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${R(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${R(t.installed)} is newer than the registry's latest release (${R(t.latest)}): an unpublished build.\n`};case`stale`:{let n=R(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${R(t.installed)} was staged, but the latest release is ${n}.\n pnpm's release-age gate (minimumReleaseAge) and its dlx cache can both\n resolve \`@latest\` to an older release without saying so.\n To install ${n} now, name it explicitly:\n pnpm dlx ${e}@${n} install\n`}}case`unchecked`:return{stream:`stderr`,text:`⚠ Could not check for a cc-candybar release newer than ${t.installed} (${t.reason}); the registry check was skipped.\n`}}}const vn=`CCCandybarURLHandler`,yn=[],z={"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 bn(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function xn(e,t){return[e,...t].map(bn).join(` `)}function Sn(){return c.join(f.homedir(),`Applications`,`${vn}.app`)}function Cn(){return c.join(f.homedir(),`.claude`,`settings.json`)}function wn(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function Tn(){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 En(){return c.join(Tn(),`bin`,`cc-candybar`)}function Dn(){return c.join(Tn(),`dist`,`index.mjs`)}function On(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
4
  `)}function kn(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 An(t){let n=z[`${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 jn(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function Mn(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 ${mn}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function Nn(){let e=kn(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=An(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(Dn()),{recursive:!0}),r.mkdirSync(c.dirname(En()),{recursive:!0}),jn(e,Dn()),jn(t.sourcePath,En()),r.chmodSync(En(),493),r.rmSync(c.join(Tn(),`url-handler.mjs`),{force:!0});let n=Mn(En());return process.stdout.write(`Staged cc-candybar v${un} runtime at ${Tn()}\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:En(),distPath:Dn(),entryKind:n}}function B(){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>${M}</string>`,` </array>`,` </dict>`,`</array>`].join(`
5
5
  `)}]}function Pn(e){let t=Sn();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=Se({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,On(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 B())Se({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of B()){let n=Se({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 ${M}:// with Launch Services\n`);let a=Se({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(`✓ ${vn}.app installed and registered.\n`),process.stdout.write(` Test: open '${M}://hello-world' && pbpaste\n`)}function Fn(){wn(),Pn(Nn().distPath)}function In(e,t=M){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:zt,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function Ln(e){e||(process.stderr.write(`url-handle: missing URL argument.
6
6
  `),process.exit(1));let t;try{t=In(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await ot(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(vt(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(Rn(n)+`
@@ -67,7 +67,7 @@ Use 'override' annotation for methods overridden by subclass.`)}}var ea=oa(0),ta
67
67
  `)?r.slice(0,-1):r}return eo(new Wa([...e],n),{colorSystem:t.colorCompatibility})}function tc(e){return Math.min(20,e??20)}const nc={heading:`ERROR`,glyph:`⚠`,colors:Es},rc={heading:`WARNING`,glyph:`⚠`,colors:Ds},ic={heading:`UPDATE`,glyph:`⬆`,colors:Ds};function ac(e,t){return{text:xs(e),link:t}}function oc(e,t,n){let[r,...i]=[sc(e,nc,Vt),t,sc(n,rc,Ht)].flat();return r===void 0?null:{channels:[r,...i]}}function sc(e,t,n){let r=Qt([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>ac(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function cc(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
68
68
  `)}function lc(e,t,n,r){if(t===null)return e;let i=uc(r),a=t.channels.flatMap(e=>dc(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[fc(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
69
69
  `);return e?`${l}\n${e}`:l}function uc(e){return{style:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function dc(e,t){let n=new q({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=U(Math.max(2,t.width-1)),i=(e,t)=>new Ua(`${e} `,{style:t,end:``,noWrap:!0});return e.lines.flatMap((a,o)=>ec([i(o===0?e.severity.glyph:` `,n.withLink(a[0].link)),...a.flatMap(e=>{let t=n.withLink(e.link);return e.text.split(` `).flatMap(e=>ei(e,r)).map(e=>i(e,t))})],t).split(`
70
- `))}function fc(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new q({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new Ua(e,{style:t,end:``,noWrap:!0}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(x(a.path).href)):c(`full text unavailable: ${xs(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(xs(o),s.withLink(x(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=Ua.fromFragments([...d,...p]).truncate(r.width,{overflow:`ellipsis`});return m.noWrap=!0,ec([m],r)}const pc=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function mc(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function hc(e,t){return r.readdirSync(t).filter(pc).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?hc(e,i):[[c.relative(e,i).split(c.sep).join(`/`),mc(i,a)]]})}function gc(e){let t=C.createHash(`sha256`);for(let[n,r]of hc(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const _c=e=>e.slice(0,7);function vc(e){return c.dirname(c.dirname(e))}function yc(){return{version:un,digest:`53cd2beec023d984deaf16817297c0f7263f8cda4136a8e9eed6ada5186826cd`}}function bc(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function xc(e,t){try{let n=vc(b(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=gc(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:bc(n),digest:o},running:a}}catch(e){return{kind:`unchecked`,reason:e.message}}}var X=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};const Sc=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`],Cc=`persistWhen`;function wc(e){return Cc in e}function Tc(e){return wc(e)?`to`in e?[{set:e.set,to:e.to},{persist:e.persist,to:e.to}]:`from`in e?[{set:e.set,from:e.from},{persist:e.persist,from:e.from}]:`cycle`in e?[{set:e.set,cycle:e.cycle},{persist:e.persist,cycle:e.cycle}]:[{set:e.set,min:e.min,max:e.max,by:e.by},{persist:e.persist,min:e.min,max:e.max,by:e.by}]:[e]}function Ec(e){return`set`in e}function Dc(e){return`persist`in e}function Oc(e){return`reset`in e}function kc(e){return`undo`in e}function Ac(e){return`redo`in e}const jc=/^[A-Za-z_][A-Za-z0-9_]*$/;function Mc(e){return`#${e+1}`}const Nc={rows:{}};function Pc(e){return`rows`in e}function Fc(e){let{when:t,...n}=e,r=e.kind===`container`&&e.direction===`vertical`?[...e.children]:[n];return{rows:Object.fromEntries(r.map((e,t)=>[Mc(t),e])),...t!==void 0&&{when:t}}}function Ic(e){return{kind:`container`,direction:`vertical`,children:Object.values(e.rows),...e.when!==void 0&&{when:e.when}}}function Lc(e){return Pc(e)?Ic(e):e}function Rc(e,t){return Pc(e)?{...t,...e,rows:{...t.rows,...e.rows}}:Fc(e)}function zc(e){return!Pc(e)||e.when!==void 0||Object.keys(e.rows).length>0}const Bc=`default`,Vc={};function Hc(e){return[...new Set([Bc,...Object.keys(e)])]}function Uc(e,t,n){return Ps(void 0,e,t,Bc,n)}function Wc(e,t){let n={[Bc]:Vc,...e}[t];if(n===void 0)throw Error(`Preset "${t}" is not declared in this config — effectivePresetName collapses unknown names to "${Bc}", which always resolves; a miss here means a raw name reached this function without going through that resolution`);return n}function Gc(e,t){let n=Wc(e.presets,t).root??Nc;return{node:Ic(Rc(n,e.root)),path:zc(n)?`presets.${t}.root`:`root`}}function Kc(e,t){return{...e.globals,...Wc(e.presets,t).globals}}const qc=new Map;function Jc(e,t){qc.set(e,{permanent:!0,resolve:t})}Jc(`themes`,()=>Ns()),Jc(`styles`,()=>Ls),Jc(`charsets`,()=>Bs),Jc(`colorCompatibilities`,()=>Vs);function Yc(e){return new Map([[`looks`,Object.keys(e.looks)],[`presets`,Hc(e.presets)]])}function Xc(e){return[...new Set([...qc.keys(),...e.keys()])]}function Zc(e,t){if(typeof e!=`string`)return e;let n=t.get(e);if(n)return n;let r=qc.get(e);if(r)return r.resolve();throw Error(`unknown option domain "${e}" (have: ${Xc(t).join(`, `)})`)}function Qc(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function $c(e){let t=e.split(`:`);return t[0]===`remove`&&t.length===2&&t[1]?{op:`remove`,target:t[1]}:t[0]===`insert`&&t.length===4&&t[1]&&t[2]&&(t[3]===`before`||t[3]===`after`)?{op:`insert`,segment:t[1],anchor:t[2],relation:t[3]}:null}function el(e){let t=new Set,n=e=>{if(e.kind===`segment`){t.add(e.name);return}for(let t of e.children)n(t)};return n(e),t}const tl=[`vertical`,`horizontal`];function*nl(e){if(yield e,e.kind===`container`)for(let t of e.children)yield*nl(t)}const rl=[`ttl`,`watch_file`,`depends_on`,`key`,`never`];function il(e){return e.kind!==`literal`&&e.kind!==`input`&&e.kind!==`env`&&e.kind!==`state`}const al=[`branch`,`sha`,`dirty`,`ahead`,`behind`,`stash`],ol=[`file`,`shell`,`git`],sl=[`left`,`center`,`right`],cl=[`right`,`left`,`middle`];var ll=class extends Error{file;issues;constructor(e,t){super(fl(e,t)),this.name=`ConfigError`,this.file=e,this.issues=t}};function Z(e,t){let n=0,r;for(let i of t){if(i===``||/^\d+$/.test(i))continue;let t=ul(e,n,i);if(t===-1)return r===void 0?void 0:dl(e,r);n=t,r=t}return r===void 0?void 0:dl(e,r)}function ul(e,t,n){let r=n.replace(/[\\^$.*+?()[\]{}|]/g,`\\$&`),i=RegExp(`(?:["']${r}["']|\\b${r}\\b)\\s*:`,`g`);i.lastIndex=t;let a=i.exec(e);return a?a.index:-1}function dl(e,t){let n=1;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}function fl(e,t){if(t.length===0)return`${e}: invalid config (no details)`;let n=[`Invalid config in ${e} (${t.length} issue${t.length===1?``:`s`}):`];for(let e of t){let t=[];e.line!==void 0&&t.push(`line ${e.line}${e.col===void 0?``:`:${e.col}`}`),e.path&&t.push(e.path);let r=t.length>0?`[${t.join(` • `)}] `:``;n.push(` ${r}${e.message}`)}return n.join(`
70
+ `))}function fc(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new q({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new Ua(e,{style:t,end:``,noWrap:!0}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(x(a.path).href)):c(`full text unavailable: ${xs(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(xs(o),s.withLink(x(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=Ua.fromFragments([...d,...p]).truncate(r.width,{overflow:`ellipsis`});return m.noWrap=!0,ec([m],r)}const pc=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function mc(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function hc(e,t){return r.readdirSync(t).filter(pc).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?hc(e,i):[[c.relative(e,i).split(c.sep).join(`/`),mc(i,a)]]})}function gc(e){let t=C.createHash(`sha256`);for(let[n,r]of hc(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const _c=e=>e.slice(0,7);function vc(e){return c.dirname(c.dirname(e))}function yc(){return{version:un,digest:`1d2ea6d8ab3f3f537da644627286e1b5a891341aeaf10d8c758b576a878af8f4`}}function bc(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function xc(e,t){try{let n=vc(b(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=gc(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:bc(n),digest:o},running:a}}catch(e){return{kind:`unchecked`,reason:e.message}}}var X=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};const Sc=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`],Cc=`persistWhen`;function wc(e){return Cc in e}function Tc(e){return wc(e)?`to`in e?[{set:e.set,to:e.to},{persist:e.persist,to:e.to}]:`from`in e?[{set:e.set,from:e.from},{persist:e.persist,from:e.from}]:`cycle`in e?[{set:e.set,cycle:e.cycle},{persist:e.persist,cycle:e.cycle}]:[{set:e.set,min:e.min,max:e.max,by:e.by},{persist:e.persist,min:e.min,max:e.max,by:e.by}]:[e]}function Ec(e){return`set`in e}function Dc(e){return`persist`in e}function Oc(e){return`reset`in e}function kc(e){return`undo`in e}function Ac(e){return`redo`in e}const jc=/^[A-Za-z_][A-Za-z0-9_]*$/;function Mc(e){return`#${e+1}`}const Nc={rows:{}};function Pc(e){return`rows`in e}function Fc(e){let{when:t,...n}=e,r=e.kind===`container`&&e.direction===`vertical`?[...e.children]:[n];return{rows:Object.fromEntries(r.map((e,t)=>[Mc(t),e])),...t!==void 0&&{when:t}}}function Ic(e){return{kind:`container`,direction:`vertical`,children:Object.values(e.rows),...e.when!==void 0&&{when:e.when}}}function Lc(e){return Pc(e)?Ic(e):e}function Rc(e,t){return Pc(e)?{...t,...e,rows:{...t.rows,...e.rows}}:Fc(e)}function zc(e){return!Pc(e)||e.when!==void 0||Object.keys(e.rows).length>0}const Bc=`default`,Vc={};function Hc(e){return[...new Set([Bc,...Object.keys(e)])]}function Uc(e,t,n){return Ps(void 0,e,t,Bc,n)}function Wc(e,t){let n={[Bc]:Vc,...e}[t];if(n===void 0)throw Error(`Preset "${t}" is not declared in this config — effectivePresetName collapses unknown names to "${Bc}", which always resolves; a miss here means a raw name reached this function without going through that resolution`);return n}function Gc(e,t){let n=Wc(e.presets,t).root??Nc;return{node:Ic(Rc(n,e.root)),path:zc(n)?`presets.${t}.root`:`root`}}function Kc(e,t){return{...e.globals,...Wc(e.presets,t).globals}}const qc=new Map;function Jc(e,t){qc.set(e,{permanent:!0,resolve:t})}Jc(`themes`,()=>Ns()),Jc(`styles`,()=>Ls),Jc(`charsets`,()=>Bs),Jc(`colorCompatibilities`,()=>Vs);function Yc(e){return new Map([[`looks`,Object.keys(e.looks)],[`presets`,Hc(e.presets)]])}function Xc(e){return[...new Set([...qc.keys(),...e.keys()])]}function Zc(e,t){if(typeof e!=`string`)return e;let n=t.get(e);if(n)return n;let r=qc.get(e);if(r)return r.resolve();throw Error(`unknown option domain "${e}" (have: ${Xc(t).join(`, `)})`)}function Qc(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function $c(e){let t=e.split(`:`);return t[0]===`remove`&&t.length===2&&t[1]?{op:`remove`,target:t[1]}:t[0]===`insert`&&t.length===4&&t[1]&&t[2]&&(t[3]===`before`||t[3]===`after`)?{op:`insert`,segment:t[1],anchor:t[2],relation:t[3]}:null}function el(e){let t=new Set,n=e=>{if(e.kind===`segment`){t.add(e.name);return}for(let t of e.children)n(t)};return n(e),t}const tl=[`vertical`,`horizontal`];function*nl(e){if(yield e,e.kind===`container`)for(let t of e.children)yield*nl(t)}const rl=[`ttl`,`watch_file`,`depends_on`,`key`,`never`];function il(e){return e.kind!==`literal`&&e.kind!==`input`&&e.kind!==`env`&&e.kind!==`state`}const al=[`branch`,`sha`,`dirty`,`ahead`,`behind`,`stash`],ol=[`file`,`shell`,`git`],sl=[`left`,`center`,`right`],cl=[`right`,`left`,`middle`];var ll=class extends Error{file;issues;constructor(e,t){super(fl(e,t)),this.name=`ConfigError`,this.file=e,this.issues=t}};function Z(e,t){let n=0,r;for(let i of t){if(i===``||/^\d+$/.test(i))continue;let t=ul(e,n,i);if(t===-1)return r===void 0?void 0:dl(e,r);n=t,r=t}return r===void 0?void 0:dl(e,r)}function ul(e,t,n){let r=n.replace(/[\\^$.*+?()[\]{}|]/g,`\\$&`),i=RegExp(`(?:["']${r}["']|\\b${r}\\b)\\s*:`,`g`);i.lastIndex=t;let a=i.exec(e);return a?a.index:-1}function dl(e,t){let n=1;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}function fl(e,t){if(t.length===0)return`${e}: invalid config (no details)`;let n=[`Invalid config in ${e} (${t.length} issue${t.length===1?``:`s`}):`];for(let e of t){let t=[];e.line!==void 0&&t.push(`line ${e.line}${e.col===void 0?``:`:${e.col}`}`),e.path&&t.push(e.path);let r=t.length>0?`[${t.join(` • `)}] `:``;n.push(` ${r}${e.message}`)}return n.join(`
71
71
  `)}function pl(e,t,n,r){let i=n[r];return typeof i==`string`?i:(e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be a string, got ${yl(i)}`,line:Z(e.source,[...t.split(`.`),r])}),null)}function ml(e,t,n,r){let i=n.default;if(i!==void 0){if(!(r===`string`&&typeof i==`string`||r===`number`&&typeof i==`number`||r===`boolean`&&typeof i==`boolean`)){e.issues.push({path:`${t}.default`,message:`default must be a ${r}, got ${yl(i)}`,line:Z(e.source,[...t.split(`.`),`default`])});return}return i}}function hl(e,t,n,r){let i=n[r];if(i!==void 0){if(typeof i!=`string`){e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be a string, got ${yl(i)}`,line:Z(e.source,[...t.split(`.`),r])});return}return i}}function gl(e,t,n){let r=hl(e,t,n,`palette`);if(r!==void 0){if(!e.allowedPalettes.has(r)){e.issues.push({path:`${t}.palette`,message:`Unknown palette "${r}". Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:Z(e.source,[...t.split(`.`),`palette`])});return}return r}}function _l(e,t,n,r,i){let a=n[r];if(a!==void 0){if(typeof a!=`string`||!i.includes(a)){e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be one of: ${i.join(`, `)}; got ${bl(a)}`,line:Z(e.source,[...t.split(`.`),r])});return}return a}}function vl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function yl(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function bl(e){return typeof e==`string`?JSON.stringify(e):e===void 0?`undefined`:String(e)}function xl(e,t,n,r){return vl(r)?(Cl(e,n,r,t.noun,new Set(Object.keys(t.fields))),Sl(e,t.fields,n,r)):(e.issues.push({path:n,message:`${n} must be an object, got ${yl(r)}`,line:Z(e.source,n.split(`.`))}),null)}function Sl(e,t,n,r){let i=t,a={},o=!0;for(let[t,s]of Object.entries(i)){let i=s.parse(e,n,t,r);i===void 0?s.required&&(o=!1):a[t]=i}return o?a:null}function Cl(e,t,n,r,i){for(let a of Object.keys(n))i.has(a)||e.issues.push({path:`${t}.${a}`,message:`Unknown ${r} "${a}". Expected one of: ${[...i].join(`, `)}`,line:Z(e.source,[...t.split(`.`),a])})}function wl(e,t,n,r){if(!vl(r))return e.issues.push({path:n,message:`${t.noun} must be an object, got ${yl(r)}`,line:Z(e.source,n.split(`.`))}),null;let i=t.arms,a=Object.keys(i),o=Object.keys(r).filter(e=>e in i),s=Object.keys(r).filter(e=>!(e in i));for(let r of s)e.issues.push({path:`${n}.${r}`,message:`Unknown ${t.noun} key "${r}". Expected exactly one of: ${a.join(`, `)}`,line:Z(e.source,[...n.split(`.`),r])});if(o.length===0)return e.issues.push({path:n,message:`${t.noun} must declare exactly one of: ${a.join(`, `)}`,line:Z(e.source,n.split(`.`))}),null;if(o.length>1)return e.issues.push({path:n,message:`${t.noun} must declare exactly one of: ${a.join(`, `)} (found: ${o.join(`, `)})`,line:Z(e.source,n.split(`.`))}),null;let c=o[0];return i[c].parse(e,`${n}.${c}`,r[c])}function Tl(e,t,n,r){if(!vl(r))return e.issues.push({path:n,message:`${n} must be an object, got ${yl(r)}`,line:Z(e.source,n.split(`.`))}),null;let i=r[t.tag];if(typeof i!=`string`)return e.issues.push({path:`${n}.${t.tag}`,message:`${n}.${t.tag} must be a string, got ${yl(i)}`,line:Z(e.source,n.split(`.`))}),null;let a=t.arms;return i in a?a[i].parse(e,n,r):(e.issues.push({path:`${n}.${t.tag}`,message:`Unknown ${t.noun} "${i}". Expected one of: ${Object.keys(a).join(`, `)}`,line:Z(e.source,[...n.split(`.`),t.tag])}),null)}function El(e){return(...t)=>e()(...t)}function Dl(e,...t){return(n,r,i)=>{let a=e(n,r,i);if(a===null)return null;for(let e of t){if(e.ok(a))continue;let{field:t,message:i}=e.issue(a),o=t===``?r:`${r}.${t}`;return n.issues.push({path:o,message:i,line:Z(n.source,o.split(`.`))}),null}return a}}function Q(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>hl(e,t,r,n)}}function Ol(){return{required:!1,json:{type:`boolean`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(typeof i!=`boolean`){e.issues.push({path:`${t}.${n}`,message:`${n} must be a boolean, got ${yl(i)}`,line:Z(e.source,[n])});return}return i}}}}function kl(e){let{min:t,max:n}=e;return{required:!1,json:{type:`integer`,minimum:t,maximum:n},parse:(e,r,i,a)=>{let o=a[i];if(o!==void 0){if(typeof o!=`number`||!Number.isInteger(o)||o<t||o>n){e.issues.push({path:`${r}.${i}`,message:`${i} must be an integer between ${t} and ${n}, got ${bl(o)}`,line:Z(e.source,[i])});return}return o}}}}function Al(e={}){let{min:t}=e;return{required:!1,json:{type:`number`,...t!==void 0&&{minimum:t}},parse:(e,n,r,i)=>{let a=i[r];if(a!==void 0){if(typeof a!=`number`||!Number.isFinite(a)||t!==void 0&&a<t){let i=t===void 0?`a finite number`:`a finite number >= ${t}`;e.issues.push({path:`${n}.${r}`,message:`${r} must be ${i}, got ${bl(a)}`,line:Z(e.source,[r])});return}return a}}}}function jl(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>gl(e,t,r)}}function Ml(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>pl(e,t,r,n)??void 0}}function Nl(e){return{required:!1,json:{enum:[...e]},parse:(t,n,r,i)=>_l(t,n,i,r,e)}}function Pl(e,t={closed:!0}){let n=e,r={},i=[];for(let[e,t]of Object.entries(n))r[e]=t.json,t.required&&i.push(e);return{type:`object`,properties:r,...i.length>0&&{required:i},...t.closed&&{additionalProperties:!1}}}function Fl(e){return Pl(e.fields)}function Il(e,t,n){let r=e,i={[t]:{const:n},...r.properties},a=[t,...r.required??[]];return{...r,properties:i,required:a}}function Ll(e){let t=e.arms;return{anyOf:Object.values(t).map(e=>e.json)}}function Rl(e){let t=e.arms;return{anyOf:Object.entries(t).map(([e,t])=>({type:`object`,properties:{[e]:t.json},required:[e],additionalProperties:!1}))}}const zl={required:!1,json:{enum:[...Vs]},parse:(e,t,n,r)=>{if(r[n]===`auto`){e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: "auto" is not supported — the render daemon runs detached, so terminal detection would read the daemon's environment, not your terminal's. Pick an explicit depth: ${Vs.join(`, `)}`,line:Z(e.source,[...t.split(`.`),n])});return}return _l(e,t,r,n,Vs)}},Bl={default_bg:Q(),default_fg:Q(),default_empty_value:Q(),default_separator:Q(),default_truncate_marker:Q(),palette:jl(),look:Q(),preset:Q(),style:Nl(Ls),autoWrap:Ol(),padding:kl(Gs),charset:Nl(Bs),updateNotice:Ol(),colorCompatibility:zl},Vl={noun:`globals key`,fields:Bl};function Hl(e){return{required:!1,json:{not:{},description:`not allowed here — ${e} cannot select a preset`},parse:(t,n,r,i)=>{i[r]!==void 0&&t.issues.push({path:`${n}.${r}`,message:`${n}.${r}: ${e} cannot select a preset. Which preset is active is resolved once, as session pick over globals.preset over "default"; a fragment naming another would be a second authority over that. Set the default arrangement in the top-level globals.preset instead.`,line:Z(t.source,[...n.split(`.`),r])})}}}const Ul={noun:`preset globals key`,fields:{...Bl,preset:Hl(`a preset`)}},Wl={noun:`editGlobals key`,fields:{...Bl,preset:Hl(`the editGlobals fragment`)}};function Gl(e,t,n){return n===void 0?{}:xl(e,Vl,t,n)??{}}function Kl(e,t,n){return xl(e,Ul,t,n)??{}}function ql(){return Fl(Ul)}function Jl(e,t,n){return xl(e,Wl,t,n)??{}}const Yl=new Set(Object.keys(Vl.fields));function Xl(e){return Yl.has(e)}function Zl(){return[...Yl]}const Ql={padding:1};function $l(e){let t=new Map;for(let[n,r]of Object.entries(Ql)){let i=e[n];t.set(n,typeof i==`number`?i:r)}return t}const eu=/^segments\.([^.]+)\.palette$/,tu=/^presets\.(.+)\.root$/;function nu(e){return`presets.${e}.root`}function ru(e){if(Xl(e))return{scope:`globals`,field:e};let t=eu.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=tu.exec(e);return n?{scope:`preset-root`,preset:n[1]}:null}function iu(e){return e.scope===`globals`?[`globals`,e.field]:[`segments`,e.segment,`palette`]}function au(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}var ou=class extends Error{name=`TemplateError`;kind=`EvalError`;pos;source;constructor(e,t,n={}){super(e),this.pos=t,this.source=n.source}get sourceSnippet(){return this.source?pu(this.source,this.pos):``}toString(){let e=`${this.name}: ${this.message}\n at line ${this.pos.line}, column ${this.pos.column}`,t=this.sourceSnippet;return t?`${e}\n\n${t}`:e}},su=class extends ou{name=`ParseError`;kind=`ParseError`;expected;found;constructor(e,t,n={}){super(e,t,n),this.expected=n.expected,this.found=n.found}},cu=class extends ou{name=`EvalError`;kind=`EvalError`},lu=class extends cu{name=`FuncNotFoundError`;kind=`FuncNotFoundError`;funcName;suggestions;constructor(e,t,n={}){let r=mu(e,n.available??[]),i=r.length===0?``:` (did you mean: ${r.join(`, `)}?)`;super(`function ${JSON.stringify(e)} is not registered${i}`,t,n),this.funcName=e,this.suggestions=r}},uu=class extends cu{name=`TypeMismatchError`;kind=`TypeMismatchError`;funcName;argIndex;expected;receivedSummary;constructor(e,t,n,r,i,a={}){super(`function ${JSON.stringify(e)} arg ${t}: expected ${n}, but a ${r} flowed in. Pass it through \`unstyled\` (or your engine's flatten function) to convert.`,i,a),this.funcName=e,this.argIndex=t,this.expected=n,this.receivedSummary=r}},du=class extends cu{name=`MissingFieldError`;kind=`MissingFieldError`;path;constructor(e,t,n={}){super(`field "${e.join(`.`)}" not found on receiver`,t,n),this.path=e}},fu=class extends cu{name=`FailError`;kind=`FailError`;constructor(e,t={line:0,column:0,offset:0},n={}){super(e,t,n)}};function pu(e,t){let n=e.split(`
72
72
  `),r=t.line-1,i=[];if(r-1>=0&&r-1<n.length&&i.push({num:r,text:n[r-1]??``}),r>=0&&r<n.length&&i.push({num:r+1,text:n[r]??``}),r+1<n.length&&i.push({num:r+2,text:n[r+1]??``}),i.length===0)return``;let a=String(i[i.length-1]?.num??1).length,o=[];for(let e of i)if(o.push(` ${String(e.num).padStart(a,` `)} | ${e.text}`),e.num===t.line){let e=` ${` `.repeat(a)} | `,n=` `.repeat(Math.max(0,t.column-1));o.push(`${e}${n}^`)}return o.join(`
73
73
  `)}function mu(e,t){if(t.length===0)return[];let n=t.map(t=>({name:t,dist:hu(e,t)})).sort((e,t)=>e.dist-t.dist),r=Math.max(2,Math.floor(e.length/2));return n.filter(e=>e.dist<=r).slice(0,3).map(e=>e.name)}function hu(e,t){if(e===t)return 0;let n=e.length,r=t.length;if(n===0)return r;if(r===0)return n;let i=Array(r+1),a=Array(r+1);for(let e=0;e<=r;e++)i[e]=e;for(let o=1;o<=n;o++){a[0]=o;for(let n=1;n<=r;n++){let r=e[o-1]===t[n-1]?0:1;a[n]=Math.min((a[n-1]??0)+1,(i[n]??0)+1,(i[n-1]??0)+r)}for(let e=0;e<=r;e++)i[e]=a[e]??0}return i[r]??0}function gu(e){throw Error(`unhandled node kind: ${JSON.stringify(e)}`)}const _u=new Map([[`if`,`If`],[`else`,`Else`],[`end`,`End`],[`range`,`Range`],[`with`,`With`],[`break`,`Break`],[`continue`,`Continue`],[`define`,`Define`],[`template`,`Template`],[`block`,`Block`],[`true`,`Bool`],[`false`,`Bool`],[`nil`,`Nil`]]),vu={left:`{{`,right:`}}`};var yu=class{src;leftDelim;rightDelim;offset=0;line=1;column=1;mode=`text`;pending;constructor(e,t=vu){this.src=e,this.leftDelim=t.left,this.rightDelim=t.right}pos(){return{line:this.line,column:this.column,offset:this.offset}}err(e,t,n={}){return new su(e,t,{...n,source:this.src})}next(){if(this.pending){let e=this.pending;return this.pending=void 0,e}return this.read()}peek(){return this.pending||=this.read(),this.pending}read(){switch(this.mode){case`text`:return this.readText();case`action`:return this.readAction();case`done`:return this.makeToken(`EOF`,``,this.pos())}}readText(){if(this.offset>=this.src.length)return this.mode=`done`,this.makeToken(`EOF`,``,this.pos());let e=this.pos(),t=this.offset;for(;t<this.src.length&&!this.src.startsWith(this.leftDelim,t);)t+=1;let n=t<this.src.length&&this.src[t+this.leftDelim.length]===`-`,r=t;if(n)for(;r>this.offset&&bu(this.src[r-1]??``);)--r;if(r>this.offset){let t=this.src.slice(this.offset,r);return this.advanceTo(r),this.makeToken(`Text`,t,e)}return this.advanceTo(t),this.emitLeftDelim(n)}emitLeftDelim(e){let t=this.pos();if(this.advanceBy(this.leftDelim.length),e)for(this.advanceBy(1);bu(this.src[this.offset]??``);)this.advanceBy(1);return this.mode=`action`,this.src.startsWith(`/*`,this.offset)?this.readComment(t,e):this.makeToken(`LeftDelim`,e?`${this.leftDelim}-`:this.leftDelim,t,e?{trimLeft:!0}:{})}readComment(e,t){this.advanceBy(2);let n=this.offset,r=this.src.indexOf(`*/`,this.offset);if(r===-1)throw this.err(`unclosed comment`,e,{expected:`*/${this.rightDelim}`,found:`end of input`});this.advanceTo(r);let i=this.src.slice(n,r).trim();for(this.advanceBy(2);bu(this.src[this.offset]??``);)this.advanceBy(1);let a=!1;if(this.src[this.offset]===`-`&&(a=!0,this.advanceBy(1)),!this.src.startsWith(this.rightDelim,this.offset))throw this.err(`expected \`${this.rightDelim}\` to close comment`,this.pos(),{expected:this.rightDelim,found:this.src[this.offset]??`end of input`});if(this.advanceBy(this.rightDelim.length),a)for(;bu(this.src[this.offset]??``);)this.advanceBy(1);return this.mode=`text`,this.makeToken(`Comment`,i,e,{...t?{trimLeft:!0}:{},...a?{trimRight:!0}:{}})}readAction(){if(this.skipActionSpaces(),this.src.startsWith(`-${this.rightDelim}`,this.offset)){let e=this.pos();for(this.advanceBy(1+this.rightDelim.length),this.mode=`text`;bu(this.src[this.offset]??``);)this.advanceBy(1);return this.makeToken(`RightDelim`,`-${this.rightDelim}`,e,{trimRight:!0})}if(this.src.startsWith(this.rightDelim,this.offset)){let e=this.pos();return this.advanceBy(this.rightDelim.length),this.mode=`text`,this.makeToken(`RightDelim`,this.rightDelim,e)}if(this.offset>=this.src.length)throw this.err(`unclosed action`,this.pos(),{expected:this.rightDelim,found:`end of input`});let e=this.src[this.offset],t=this.pos();switch(e){case`(`:return this.advanceBy(1),this.makeToken(`LeftParen`,`(`,t);case`)`:return this.advanceBy(1),this.makeToken(`RightParen`,`)`,t);case`|`:return this.advanceBy(1),this.makeToken(`Pipe`,`|`,t);case`,`:return this.advanceBy(1),this.makeToken(`Comma`,`,`,t);case`:`:if(this.src[this.offset+1]===`=`)return this.advanceBy(2),this.makeToken(`Declare`,`:=`,t);throw this.err("expected `:=`",t,{expected:`:=`,found:`:`});case`=`:return this.advanceBy(1),this.makeToken(`Assign`,`=`,t);case`"`:return this.readQuotedString(t);case"`":return this.readRawString(t);case`'`:return this.readChar(t)}if(e===`$`)return this.readVariable(t);if(e!==void 0&&(Su(e)||xu(e)&&Su(this.src[this.offset+1]??``)||e===`.`&&Su(this.src[this.offset+1]??``)))return this.readNumber(t);if(e===`.`)return this.readDotOrField(t);if(e!==void 0&&Du(e))return this.readIdentifier(t);throw this.err(`unexpected character ${JSON.stringify(e)}`,t,{found:e??`end of input`})}readQuotedString(e){let t=this.offset;for(this.advanceBy(1);this.offset<this.src.length;){let n=this.src[this.offset];if(n===`\\`){this.advanceBy(1),this.offset<this.src.length&&this.advanceBy(1);continue}if(n===`
@@ -138,7 +138,7 @@ Config tooling:
138
138
 
139
139
  `,ug=`#/definitions/LayoutNode`,dg={kind:`container`,direction:`vertical`,children:[]};function fg(e){return{required:!0,json:{const:e},parse:()=>e}}function pg(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&i.length>0?i:(e.issues.push({path:`${t}.${n}`,message:`a segment node must have a non-empty "name" (a segment name), got ${bl(i)}`,line:Z(e.source,[`root`])}),``)}}}function mg(){return{required:!0,json:{enum:[...tl]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&tl.includes(i)?i:(e.issues.push({path:`${t}.${n}`,message:`a container "direction" must be one of: ${tl.join(`, `)} (got ${JSON.stringify(i)})`,line:Z(e.source,[`root`])}),`vertical`)}}}function hg(e){return{required:!0,json:{type:`array`,items:{$ref:ug}},parse:(t,n,r,i)=>{let a=i[r];return Array.isArray(a)?a.map((i,a)=>e(t,`${n}.${r}[${a}]`,i)):(t.issues.push({path:`${n}.${r}`,message:`a container must have a "children" array of layout nodes, got ${yl(a)}`,line:Z(t.source,[`root`])}),[])}}}const gg={noun:`layout-node key`,fields:{kind:fg(`segment`),name:pg(),when:Q()}},_g={noun:`layout-node key`,fields:{kind:fg(`container`),direction:mg(),children:hg(El(()=>Sg)),when:Q()}};function vg(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&i.length>0?i:(e.issues.push({path:`${t}.${n}`,message:`a "seg" node must have a non-empty segment name, got ${bl(i)}`,line:Z(e.source,[`root`])}),``)}}}const yg={noun:`layout-node key`,fields:{seg:vg(),when:Q()}},bg={noun:`layout-node key`,fields:{h:hg(El(()=>Sg)),when:Q()}},xg={noun:`layout-node key`,fields:{v:hg(El(()=>Sg)),when:Q()}},Sg=(e,t,n)=>{if(typeof n==`string`)return n.length===0?(e.issues.push({path:t,message:`a bare-string layout node must be a non-empty segment name`,line:Z(e.source,[`root`])}),dg):{kind:`segment`,name:n};if(!vl(n))return e.issues.push({path:t,message:`a layout node must be a string (segment name) or an object with "kind" / "seg" / "h" / "v", got ${yl(n)}`,line:Z(e.source,[`root`])}),dg;if(n.kind===`container`)return xl(e,_g,t,n)??dg;if(n.kind===`segment`)return xl(e,gg,t,n)??dg;if(n.kind===`cells`)return e.issues.push({path:t,message:`kind: "cells" is no longer supported — use the h-arm spelling instead:
140
140
  Old: { kind: "cells", segments: ["seg1", "seg2"] }
141
- New: { h: ["seg1", "seg2"] }`,line:Z(e.source,[`root`])}),dg;if(n.kind===`group`){let r=xl(e,Ag,t,n);return r===null?dg:(e.groups.push({name:r.name,label:r.label,...r.open!==void 0&&{open:r.open},...r.direction!==void 0&&{direction:r.direction},...r.key!==void 0&&{key:r.key},...r.bg!==void 0&&{bg:r.bg},...r.fg!==void 0&&{fg:r.fg},...r.when!==void 0&&{when:r.when},path:t}),Mg(r))}let r=`h`in n,i=`v`in n,a=`seg`in n;if(+!!r+ +!!i+ +!!a>1){let r=[`seg`,`h`,`v`].filter(e=>e in n);return e.issues.push({path:t,message:`a layout node may have exactly one of "seg", "h", or "v" — got ${r.map(e=>`"${e}"`).join(` and `)} together`,line:Z(e.source,[`root`])}),dg}if(a){let r=xl(e,yg,t,n);return r===null?dg:{kind:`segment`,name:r.seg,...r.when!==void 0&&{when:r.when}}}if(r){let r=xl(e,bg,t,n);return r===null?dg:{kind:`container`,direction:`horizontal`,children:r.h,...r.when!==void 0&&{when:r.when}}}if(i){let r=xl(e,xg,t,n);return r===null?dg:{kind:`container`,direction:`vertical`,children:r.v,...r.when!==void 0&&{when:r.when}}}return e.issues.push({path:`${t}.kind`,message:`a layout node "kind" must be "container", "segment", or "group", or use the terse A-grammar: a bare string, or an object with "seg", "h", or "v" (got ${JSON.stringify(n.kind)})`,line:Z(e.source,[`root`])}),dg};function Cg(){return{required:!0,json:{type:`object`,propertyNames:{pattern:jc.source},additionalProperties:{$ref:ug}},parse:(e,t,n,r)=>{let i=r[n];if(!vl(i))return e.issues.push({path:`${t}.${n}`,message:`"rows" must be an object of row name → layout node, got ${yl(i)}`,line:Z(e.source,[...t.split(`.`),n])}),{};let a={};for(let[r,o]of Object.entries(i)){if(!jc.test(r)){e.issues.push({path:`${t}.${n}.${r}`,message:`row name "${r}" must be an identifier (letters, digits, _; not starting with a digit) — it names the row in the config file and merges by name over the bundled default's rows`,line:Z(e.source,[...t.split(`.`),n,r])});continue}a[r]=Sg(e,`${t}.${n}.${r}`,o)}return a}}}const wg={noun:`root key`,fields:{rows:Cg(),when:Q()}};function Tg(e,t,n){return vl(n)&&`rows`in n?xl(e,wg,t,n)??{rows:{}}:Sg(e,t,n)}const Eg=`groups.`;function Dg(){return{required:!0,json:{type:`string`,pattern:jc.source},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`string`||!jc.test(i)||i===`closed`){e.issues.push({path:`${t}.${n}`,message:`a group "name" must be an identifier (letters, digits, _; not starting with a digit) and not the reserved "${tn}", got ${bl(i)}`,line:Z(e.source,[`root`])});return}return i}}}function Og(){return{required:!1,json:{type:`string`,minLength:1},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(typeof i!=`string`||i===``||i.includes(`/`)){e.issues.push({path:`${t}.${n}`,message:`a group "key" must be a non-empty, slash-free SessionState key, got ${bl(i)}`,line:Z(e.source,[`root`])});return}return i}}}}function kg(){return{required:!0,json:{type:`string`,pattern:`^[^\\n\\r]*$`},parse:(e,t,n,r)=>{let i=pl(e,t,r,n);if(i!==null){if(/[\n\r]/.test(i)){e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: group label must not contain newlines`,line:Z(e.source,[...t.split(`.`),n])});return}return i}}}}const Ag={noun:`layout-node key`,fields:{kind:fg(`group`),name:Dg(),label:kg(),open:Ol(),direction:Nl(tl),key:Og(),bg:Q(),fg:Q(),when:Q(),children:hg(El(()=>Sg))}};function jg(e){return e.key??`groups.`+e.name}function Mg(e){let t=Eg+e.name;return{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:t},{kind:`container`,direction:e.direction??`vertical`,children:e.children,when:an({variable:t,member:e.name})}],...e.when!==void 0&&{when:e.when}}}function Ng(e,t,n){e.issues.push({path:t,message:n,line:Z(e.source,[`root`])})}function Pg(e,t){qh(e,t,Eg,`group nodes`);let n=e.groups;if(n.length===0)return;let r=new Set;for(let t of n)r.has(t.name)&&Ng(e,t.path,`duplicate group name "${t.name}" — group names must be unique (they name the synthesized state var, action, and toggle segment)`),r.add(t.name);for(let t of n)for(let r of n)t!==r&&t.path.startsWith(`${r.path}.`)&&jg(t)===jg(r)&&Ng(e,t.path,`group "${t.name}" shares key "${jg(t)}" with its ancestor group "${r.name}" — a shared key holds ONE open group, so an ancestor and a descendant cannot share one. Sibling accordions share a key; nested groups use distinct keys.`);let i=new Map;for(let t of n){let n=jg(t);if(i.has(n)||i.set(n,tn),t.open===!0){let r=i.get(n);r!==`closed`&&Ng(e,t.path,`groups "${r}" and "${t.name}" share key "${n}" and both declare open: true — a shared key holds one open group; pick one`),i.set(n,t.name)}}let a={},o={},s={};for(let e of n){let t=Eg+e.name,r=jg(e),c=n.filter(t=>t!==e&&e.path.startsWith(t.path+`.`)).length,l=` `.repeat(c);a[t]=cn(r,i.get(r)),o[t]=ln(r,e.name),s[t]={template:sn(t,`${l}${e.label} ▸`,`${l}${e.label} ▾`),...e.bg!==void 0&&{bg:e.bg},...e.fg!==void 0&&{fg:e.fg}}}t.variables={...t.variables??{},...a},t.actions={...t.actions??{},...o},t.segments={...t.segments??{},...s}}const Fg=`menus.`;function Ig(e){return e}function Lg(e,t,n){return n===void 0?Fg+au(e)+`.`+au(t):Fg+au(n)}function Rg(e,t){return e+`.`+t}function zg(e){return e+`.page`}function Bg(e){for(let t of Object.keys(e))if(t!==`closeOnPick`&&t!==`paged`&&t!==`key`)throw Error(`unknown {{ menu }} option "${t}" — the options dict takes "closeOnPick" (bool, default false), "paged" (bool, default true), "key" (string, accordion grouping)`);let t=(t,n)=>{let r=e[t];if(r===void 0)return n;if(typeof r!=`boolean`)throw Error(`{{ menu }} option "${t}" must be a boolean, got ${JSON.stringify(r)} (e.g. (dict "${t}" ${String(!n)}))`);return r},n=e.key;if(n!==void 0&&typeof n!=`string`)throw Error(`{{ menu }} option "key" must be a string naming the accordion group, got ${JSON.stringify(n)}`);if(n===``)throw Error(`{{ menu }} has an empty accordion key — a shared key must be a non-empty name (or omit "key" for an independent menu)`);return{closeOnPick:t(`closeOnPick`,!1),paged:t(`paged`,!0),key:n}}const Vg=`settings.`,Hg=`${Vg}menu`,Ug=Zh,Wg=`${Vg}edit`,Gg=`${Vg}persist`,Kg=`${Vg}config`,qg=Gg,Jg={variable:Hg,member:Ug},Yg=an(Jg,{variable:Kg,member:Ug}),Xg=`${Vg}help.persist`,Zg={bg:`surface`,fg:`foreground`},Qg=`${Vg}pickers`,$g=[{name:`preset`,sessionKey:`preset`,configKey:`preset`,effectiveVar:`preset.effective`,glyph:`▦`,domain:`presets`}],e_=[{name:`theme`,sessionKey:`theme`,configKey:`palette`,effectiveVar:`theme.effective`,glyph:`🎨`,domain:`themes`},{name:`look`,sessionKey:`look`,configKey:`look`,effectiveVar:`look.effective`,glyph:`◐`,domain:`looks`},{name:`style`,sessionKey:`style`,configKey:`style`,effectiveVar:`style.effective`,glyph:`✦`,domain:`styles`}],t_={name:`wrap`,sessionKey:`autoWrap`,configKey:`autoWrap`},n_={name:`padding`,sessionKey:`padding`,configKey:`padding`},r_=`${Vg}${t_.name}`,i_=`${Vg}${n_.name}`,a_=[...$g,...e_];new Set([...a_,t_,n_].flatMap(e=>[e.sessionKey,e.configKey]));const o_=e=>`${Vg}${e}`,s_=e=>`${Vg}apply.${e}`,c_=e=>`${Vg}reset.${e}`,l_=an(Jg);function u_(e){return e===Hg}function d_(e){let t={kind:`segment`,name:Hg};if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t],...e.when!==void 0&&{when:e.when}};let[n,...r]=e.children;return e.direction===`vertical`&&n!==void 0&&n.when===void 0?{...e,children:[d_(n),...r]}:{...e,children:[...e.children,t]}}function f_(e){return p_(e)>0?e:d_(e)}function p_(e){return e.kind===`segment`?+!!u_(e.name):e.children.reduce((e,t)=>e+p_(t),0)}function m_(e,t){return e.kind===`segment`?u_(e.name)?{kind:`container`,direction:`vertical`,children:[e,{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:Gg},t.trigger,...$g.map(e=>({kind:`segment`,name:o_(e.name)})),{kind:`segment`,name:Kg},{kind:`segment`,name:Wg}],when:l_},t.body,{kind:`container`,direction:`horizontal`,children:[...e_.map(e=>({kind:`segment`,name:o_(e.name)})),{kind:`segment`,name:r_},{kind:`segment`,name:i_}],when:Yg}]}:e:{...e,children:e.children.map(e=>m_(e,t))}}function h_(e,t,n,r){let i=Ig(t),a=Lg(e,t,r),o=zg(a);n.variables[a]=cn(a,tn),n.variables[o]={kind:`state`,key:o,default:`0`},n.actions[Rg(a,i)]=ln(a,i),n.actions[o]={set:o,int:!0}}function g_(){let e={variables:{[Hg]:cn(Hg,tn)},actions:{[Hg]:ln(Hg,Ug),[Kg]:ln(Kg,Ug),[Gg]:{set:qg,cycle:[Us,Hs]}},segments:{[Hg]:{template:sn(Hg,`☰ ▸`,`☰ ▾`),...Zg},[Gg]:{template:`{{ action "${Gg}" "☐ persist?" "☑ persist?" }}`,...Zg},[Kg]:{template:sn(Kg,`⚙ config ▸`,`⚙ config ▾`),...Zg},[r_]:{template:`{{ action "${s_(`wrap`)}" "wrap: on" "wrap: off" }} {{ action "${c_(`wrap`)}" "↺" }}`,...Zg},[i_]:{template:`{{ action "${s_(`padding`)}.down" "◀" }} padding {{ .padding.effective }} {{ action "${s_(`padding`)}.up" "▶" }} {{ action "${c_(`padding`)}" "↺" }}`,...Zg},[Wg]:{template:`{{ action "${Xh}" "✎ edit" "✎ done" }}`,...Zg}}};return e.variables[qg]={kind:`state`,key:qg,default:Us},e.variables[Kg]=cn(Kg,tn),__(e),{artifacts:e,help:ig(Xg,cg,[Jg],e,Zg)}}function __(e){for(let t of a_){let n=o_(t.name),r=s_(t.name);e.segments[n]={template:`${t.glyph} {{ .${t.effectiveVar} }} {{ menu "${r}" "▸" "▾" (dict "key" "${Qg}" "closeOnPick" true) }} {{ action "${c_(t.name)}" "↺" }}`,...Zg},e.actions[r]={set:t.sessionKey,persist:t.configKey,persistWhen:qg,from:t.domain},e.actions[c_(t.name)]={reset:t.configKey},h_(n,r,e,Qg)}e.actions[s_(t_.name)]={set:t_.sessionKey,persist:t_.configKey,persistWhen:qg,cycle:[...Ws]},e.actions[c_(t_.name)]={reset:t_.configKey};for(let t of[-1,1])e.actions[`${s_(n_.name)}.${t<0?`down`:`up`}`]={set:n_.sessionKey,persist:n_.configKey,persistWhen:qg,...Gs,by:t};e.actions[c_(n_.name)]={reset:n_.configKey}}function v_(e){e.variables[Yh]=cn(Yh,tn),e.actions[Xh]=ln(Yh,Zh)}const y_=`session.id`;function b_(e){return Object.prototype.hasOwnProperty.call(e.variables,y_)}function x_(e){if(!b_(e))return e;let{artifacts:t,help:n}=g_();v_(t);let r={...e.presets};for(let t of Hc(e.presets)){let{node:i}=Gc(e,t);r[t]={...Wc(e.presets,t),root:m_(f_(i),n)}}return{...e,variables:{...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:r}}const S_=`preset.customized`,C_=`{{ and ${on(Qh)} .${S_} }}`;function w_(e){return e.startsWith(`edit.`)||e.startsWith(`menus.`)||e.startsWith(`groups.`)||e.startsWith(`settings.`)}function T_(e){return`${Jh}addable.${e}`}function E_(e){let t=Object.keys(e.segments).filter(e=>!w_(e)),n=new Map;for(let r of Hc(e.presets)){let{node:i}=Gc(e,r),a=el(i);n.set(T_(r),t.filter(e=>!a.has(e)))}return n}function D_(e,t,n,r){let i=`${Jh}${e}.remove.${au(n)}`,a=`${Jh}${e}.removeSeg.${au(n)}`;return r.actions[i]={persist:t,removeSegment:n},r.segments[a]={template:`{{ action "${i}" "-" }}`,when:$h},{kind:`segment`,name:a}}function O_(e,t,n,r,i,a,o){let s=`${Jh}${e}.insert.${n}`,c=`${Jh}${e}.insertSeg.${n}`;o.actions[s]={persist:t,insertSegmentFrom:r,anchor:i,relation:a};let l=Ig(s),u=Lg(c,s,void 0),d=zg(u),f=Rg(u,l);return o.variables[u]=cn(u,tn),o.variables[d]={kind:`state`,key:d,default:`0`},o.actions[f]=ln(u,l),o.actions[d]={set:d,int:!0},o.segments[c]={template:`{{ menu "${s}" "+" "✕" }}`,when:$h},{kind:`segment`,name:c}}function k_(e,t,n,r,i,a){let o=[],s=e.children.reduce((e,t,n)=>t.kind===`segment`&&!w_(t.name)?n:e,-1);for(let[c,l]of e.children.entries()){if(l.kind===`container`){o.push(k_(l,t,n,r,i,a));continue}if(w_(l.name)){o.push(l);continue}let u=[O_(t,n,String(a.n++),r,l.name,`before`,i),l,D_(t,n,l.name,i),...c===s?[O_(t,n,String(a.n++),r,l.name,`after`,i)]:[]];o.push(...e.direction===`vertical`?[{kind:`container`,direction:`horizontal`,children:u,...l.when!==void 0&&{when:l.when}}]:u)}return{...e,children:o}}function A_(e,t,n,r,i,a){let o=`${Jh}${n}.resetLayout`,s=`${Jh}${n}.customized`;i.actions[o]={reset:r},i.ensured[S_]={kind:`input`,path:S_,type:`boolean`,default:!1};let c=rn(t);return i.segments[s]={template:`{{ action "${o}" "↺ ${c} customized" }}`,when:C_},{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:s},j_(e,a.trigger),a.body],...e.when!==void 0&&{when:e.when}}}function j_(e,t){if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t]};let n=e.children.at(-1);return e.direction===`vertical`&&n!==void 0&&(n.kind===`segment`||n.when===void 0)?{...e,children:[...e.children.slice(0,-1),j_(n,t)]}:{...e,children:[...e.children,t]}}function M_(e,t,n,r){let{node:i}=Gc(e,t),a=nu(t),o=T_(t),s=au(t);return A_(k_(i,s,a,o,n,{n:0}),t,s,a,n,r)}function N_(e){if(!(`edit.toggle`in e.actions))return e;let t={variables:{},ensured:{},actions:{},segments:{}},n=ig(`${Jh}help`,sg,[Qh],t),r={...e.presets};for(let i of Hc(e.presets)){let a=M_(e,i,t,n);r[i]={...Wc(e.presets,i),root:a}}return{...e,variables:{...t.ensured,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:r}}const P_=/^-?\d+$/;function F_(e,t,n){return e===void 0?t:Math.max(t,Math.min(n,e))}function I_(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 L_(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!P_.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 R_(e,t,n){return r=>r?P_.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 z_(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=>!P_.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:F_(r[0].seed,t,i)}}return{kind:`int`}}function B_(e){return e===`config`?`set-config`:`set-state`}function V_(e,t,n){return t.kind===`int`?L_(`menu page "${e}"`):t.kind===`range`?R_(t.min,t.max,`${n} stepper "${e}"`):I_(t.allowed,`${n} "${e}"`,B_(n))}function H_(e,t,n){return V_(e,z_(e,t,n),n)}function U_(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:z_(e,n,t)}))}function W_(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=H_(e,a.specs,t)}else{let r=[i];n.set(e,{permanent:!1,kind:i.kind,validator:H_(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=H_(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=z_(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 G_=W_({},`config`);function K_(){return G_.listKeys()}function q_(e,t){return G_.validate(e,t)}function J_(e){return G_.rangeParamsFor(e)}function Y_(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:Zc(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:[Qc({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[Qc({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Zc(e.insertSegmentFrom,n).map(t=>Qc({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max,seed:F_(t.get(e.persist),e.min,e.max)}}]:[]}function X_(e){return $l(e.globals)}function Z_(e){let t=new Set;for(let n of $_(e)){let e=`persist`in n?n.persist:`reset`in n?n.reset:null;if(e===null)continue;let r=ru(e);r?.scope===`preset-root`&&t.add(r.preset)}return[...t].map(e=>({key:nu(e),spec:{kind:`allow-list`,allowed:[]}}))}function Q_(e){let t=X_(e),n=new Map([...Yc(e),...E_(e)]);return[...Z_(e),...$_(e).flatMap(e=>Y_(e,t,n))]}function $_(e){return Object.values(e.actions).flatMap(Tc)}function ev(e){return U_(Q_(e),`config`)}function tv(e,t){return G_.register(e,t)}const nv=Ns(),rv=new Set(nv),iv=new Set(Ls),av=e=>e?rv.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${nv.join(`, `)})`}:{ok:!1,reason:`theme name is required`},ov=e=>e?iv.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${Ls.join(`, `)})`}:{ok:!1,reason:`style name is required`},sv=new Set([`1`,`true`]),cv=new Set([`0`,`false`]),lv=W_({style:ov,theme:av,"toolbar-expanded":e=>sv.has(e)?{ok:!0,value:`1`}:cv.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function uv(){return lv.listKeys()}function dv(e,t){return lv.register(e,t)}function fv(e,t){return lv.validate(e,t)}function pv(e){return lv.rangeParamsFor(e)}function mv(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:Zc(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:F_(t.get(e.set),e.min,e.max)}}]:[]}function hv(e){let t=new Set(lv.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function gv(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 $l(e.globals))t.set(n,r);return t}function _v(e){let t=gv(e),n=Yc(e);return hv(Object.values(e.actions).flatMap(Tc).flatMap(e=>mv(e,t,n)))}function vv(e){return U_(_v(e))}const yv=`update.dismissed`,bv=`updateNotice`;function xv(e){return e.kind===`source`?e.newer.digest:R(e.newer)}const Sv=e=>`${e.version} [${_c(e.digest)}]`;function Cv(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:Sv(e.newer),running:Sv(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:R(e.newer),running:R(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${mn}@${R(e.newer)}`,`install`]}}}}const wv={kind:`idle`},Tv={kind:`running`};function Ev(e,t,n){if(e===null)return[];let r=xv(e);if(!n.enabled||n.dismissed===r)return[];let i=Cv(e),a=`${i.headline}: ${i.newer}. You're on ${i.running}.`,o=t.kind===`failed`&&t.identity===r?[`${i.act} failed: ${t.reason}`]:[],s=[a,...o].join(`
141
+ New: { h: ["seg1", "seg2"] }`,line:Z(e.source,[`root`])}),dg;if(n.kind===`group`){let r=xl(e,Ag,t,n);return r===null?dg:(e.groups.push({name:r.name,label:r.label,...r.open!==void 0&&{open:r.open},...r.direction!==void 0&&{direction:r.direction},...r.key!==void 0&&{key:r.key},...r.bg!==void 0&&{bg:r.bg},...r.fg!==void 0&&{fg:r.fg},...r.when!==void 0&&{when:r.when},path:t}),Mg(r))}let r=`h`in n,i=`v`in n,a=`seg`in n;if(+!!r+ +!!i+ +!!a>1){let r=[`seg`,`h`,`v`].filter(e=>e in n);return e.issues.push({path:t,message:`a layout node may have exactly one of "seg", "h", or "v" — got ${r.map(e=>`"${e}"`).join(` and `)} together`,line:Z(e.source,[`root`])}),dg}if(a){let r=xl(e,yg,t,n);return r===null?dg:{kind:`segment`,name:r.seg,...r.when!==void 0&&{when:r.when}}}if(r){let r=xl(e,bg,t,n);return r===null?dg:{kind:`container`,direction:`horizontal`,children:r.h,...r.when!==void 0&&{when:r.when}}}if(i){let r=xl(e,xg,t,n);return r===null?dg:{kind:`container`,direction:`vertical`,children:r.v,...r.when!==void 0&&{when:r.when}}}return e.issues.push({path:`${t}.kind`,message:`a layout node "kind" must be "container", "segment", or "group", or use the terse A-grammar: a bare string, or an object with "seg", "h", or "v" (got ${JSON.stringify(n.kind)})`,line:Z(e.source,[`root`])}),dg};function Cg(){return{required:!0,json:{type:`object`,propertyNames:{pattern:jc.source},additionalProperties:{$ref:ug}},parse:(e,t,n,r)=>{let i=r[n];if(!vl(i))return e.issues.push({path:`${t}.${n}`,message:`"rows" must be an object of row name → layout node, got ${yl(i)}`,line:Z(e.source,[...t.split(`.`),n])}),{};let a={};for(let[r,o]of Object.entries(i)){if(!jc.test(r)){e.issues.push({path:`${t}.${n}.${r}`,message:`row name "${r}" must be an identifier (letters, digits, _; not starting with a digit) — it names the row in the config file and merges by name over the bundled default's rows`,line:Z(e.source,[...t.split(`.`),n,r])});continue}a[r]=Sg(e,`${t}.${n}.${r}`,o)}return a}}}const wg={noun:`root key`,fields:{rows:Cg(),when:Q()}};function Tg(e,t,n){return vl(n)&&`rows`in n?xl(e,wg,t,n)??{rows:{}}:Sg(e,t,n)}const Eg=`groups.`;function Dg(){return{required:!0,json:{type:`string`,pattern:jc.source},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`string`||!jc.test(i)||i===`closed`){e.issues.push({path:`${t}.${n}`,message:`a group "name" must be an identifier (letters, digits, _; not starting with a digit) and not the reserved "${tn}", got ${bl(i)}`,line:Z(e.source,[`root`])});return}return i}}}function Og(){return{required:!1,json:{type:`string`,minLength:1},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(typeof i!=`string`||i===``||i.includes(`/`)){e.issues.push({path:`${t}.${n}`,message:`a group "key" must be a non-empty, slash-free SessionState key, got ${bl(i)}`,line:Z(e.source,[`root`])});return}return i}}}}function kg(){return{required:!0,json:{type:`string`,pattern:`^[^\\n\\r]*$`},parse:(e,t,n,r)=>{let i=pl(e,t,r,n);if(i!==null){if(/[\n\r]/.test(i)){e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: group label must not contain newlines`,line:Z(e.source,[...t.split(`.`),n])});return}return i}}}}const Ag={noun:`layout-node key`,fields:{kind:fg(`group`),name:Dg(),label:kg(),open:Ol(),direction:Nl(tl),key:Og(),bg:Q(),fg:Q(),when:Q(),children:hg(El(()=>Sg))}};function jg(e){return e.key??`groups.`+e.name}function Mg(e){let t=Eg+e.name;return{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:t},{kind:`container`,direction:e.direction??`vertical`,children:e.children,when:an({variable:t,member:e.name})}],...e.when!==void 0&&{when:e.when}}}function Ng(e,t,n){e.issues.push({path:t,message:n,line:Z(e.source,[`root`])})}function Pg(e,t){qh(e,t,Eg,`group nodes`);let n=e.groups;if(n.length===0)return;let r=new Set;for(let t of n)r.has(t.name)&&Ng(e,t.path,`duplicate group name "${t.name}" — group names must be unique (they name the synthesized state var, action, and toggle segment)`),r.add(t.name);for(let t of n)for(let r of n)t!==r&&t.path.startsWith(`${r.path}.`)&&jg(t)===jg(r)&&Ng(e,t.path,`group "${t.name}" shares key "${jg(t)}" with its ancestor group "${r.name}" — a shared key holds ONE open group, so an ancestor and a descendant cannot share one. Sibling accordions share a key; nested groups use distinct keys.`);let i=new Map;for(let t of n){let n=jg(t);if(i.has(n)||i.set(n,tn),t.open===!0){let r=i.get(n);r!==`closed`&&Ng(e,t.path,`groups "${r}" and "${t.name}" share key "${n}" and both declare open: true — a shared key holds one open group; pick one`),i.set(n,t.name)}}let a={},o={},s={};for(let e of n){let t=Eg+e.name,r=jg(e),c=n.filter(t=>t!==e&&e.path.startsWith(t.path+`.`)).length,l=` `.repeat(c);a[t]=cn(r,i.get(r)),o[t]=ln(r,e.name),s[t]={template:sn(t,`${l}${e.label} ▸`,`${l}${e.label} ▾`),...e.bg!==void 0&&{bg:e.bg},...e.fg!==void 0&&{fg:e.fg}}}t.variables={...t.variables??{},...a},t.actions={...t.actions??{},...o},t.segments={...t.segments??{},...s}}const Fg=`menus.`;function Ig(e){return e}function Lg(e,t,n){return n===void 0?Fg+au(e)+`.`+au(t):Fg+au(n)}function Rg(e,t){return e+`.`+t}function zg(e){return e+`.page`}function Bg(e){for(let t of Object.keys(e))if(t!==`closeOnPick`&&t!==`paged`&&t!==`key`)throw Error(`unknown {{ menu }} option "${t}" — the options dict takes "closeOnPick" (bool, default false), "paged" (bool, default true), "key" (string, accordion grouping)`);let t=(t,n)=>{let r=e[t];if(r===void 0)return n;if(typeof r!=`boolean`)throw Error(`{{ menu }} option "${t}" must be a boolean, got ${JSON.stringify(r)} (e.g. (dict "${t}" ${String(!n)}))`);return r},n=e.key;if(n!==void 0&&typeof n!=`string`)throw Error(`{{ menu }} option "key" must be a string naming the accordion group, got ${JSON.stringify(n)}`);if(n===``)throw Error(`{{ menu }} has an empty accordion key — a shared key must be a non-empty name (or omit "key" for an independent menu)`);return{closeOnPick:t(`closeOnPick`,!1),paged:t(`paged`,!0),key:n}}const Vg=`settings.`,Hg=`${Vg}menu`,Ug=Zh,Wg=`${Vg}edit`,Gg=`${Vg}persist`,Kg=`${Vg}config`,qg=Gg,Jg={variable:Hg,member:Ug},Yg=an(Jg,{variable:Kg,member:Ug}),Xg=`${Vg}help.persist`,Zg={fg:`foreground`},Qg=`${Vg}pickers`,$g=[{name:`preset`,sessionKey:`preset`,configKey:`preset`,effectiveVar:`preset.effective`,glyph:`▦`,domain:`presets`}],e_=[{name:`theme`,sessionKey:`theme`,configKey:`palette`,effectiveVar:`theme.effective`,glyph:`🎨`,domain:`themes`},{name:`look`,sessionKey:`look`,configKey:`look`,effectiveVar:`look.effective`,glyph:`◐`,domain:`looks`},{name:`style`,sessionKey:`style`,configKey:`style`,effectiveVar:`style.effective`,glyph:`✦`,domain:`styles`}],t_={name:`wrap`,sessionKey:`autoWrap`,configKey:`autoWrap`},n_={name:`padding`,sessionKey:`padding`,configKey:`padding`},r_=`${Vg}${t_.name}`,i_=`${Vg}${n_.name}`,a_=[...$g,...e_];new Set([...a_,t_,n_].flatMap(e=>[e.sessionKey,e.configKey]));const o_=e=>`${Vg}${e}`,s_=e=>`${Vg}apply.${e}`,c_=e=>`${Vg}reset.${e}`,l_=an(Jg);function u_(e){return e===Hg}function d_(e){let t={kind:`segment`,name:Hg};if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t],...e.when!==void 0&&{when:e.when}};let[n,...r]=e.children;return e.direction===`vertical`&&n!==void 0&&n.when===void 0?{...e,children:[d_(n),...r]}:{...e,children:[...e.children,t]}}function f_(e){return p_(e)>0?e:d_(e)}function p_(e){return e.kind===`segment`?+!!u_(e.name):e.children.reduce((e,t)=>e+p_(t),0)}function m_(e,t){return e.kind===`segment`?u_(e.name)?{kind:`container`,direction:`vertical`,children:[e,{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:Gg},t.trigger,...$g.map(e=>({kind:`segment`,name:o_(e.name)})),{kind:`segment`,name:Kg},{kind:`segment`,name:Wg}],when:l_},t.body,{kind:`container`,direction:`horizontal`,children:[...e_.map(e=>({kind:`segment`,name:o_(e.name)})),{kind:`segment`,name:r_},{kind:`segment`,name:i_}],when:Yg}]}:e:{...e,children:e.children.map(e=>m_(e,t))}}function h_(e,t,n,r){let i=Ig(t),a=Lg(e,t,r),o=zg(a);n.variables[a]=cn(a,tn),n.variables[o]={kind:`state`,key:o,default:`0`},n.actions[Rg(a,i)]=ln(a,i),n.actions[o]={set:o,int:!0}}function g_(){let e={variables:{[Hg]:cn(Hg,tn)},actions:{[Hg]:ln(Hg,Ug),[Kg]:ln(Kg,Ug),[Gg]:{set:qg,cycle:[Us,Hs]}},segments:{[Hg]:{template:sn(Hg,`☰ ▸`,`☰ ▾`),...Zg},[Gg]:{template:`{{ action "${Gg}" "☐ persist?" "☑ persist?" }}`,...Zg},[Kg]:{template:sn(Kg,`⚙ config ▸`,`⚙ config ▾`),...Zg},[r_]:{template:`{{ action "${s_(`wrap`)}" "wrap: on" "wrap: off" }} {{ action "${c_(`wrap`)}" "↺" }}`,...Zg},[i_]:{template:`{{ action "${s_(`padding`)}.down" "◀" }} padding {{ .padding.effective }} {{ action "${s_(`padding`)}.up" "▶" }} {{ action "${c_(`padding`)}" "↺" }}`,...Zg},[Wg]:{template:`{{ action "${Xh}" "✎ edit" "✎ done" }}`,...Zg}}};return e.variables[qg]={kind:`state`,key:qg,default:Us},e.variables[Kg]=cn(Kg,tn),__(e),{artifacts:e,help:ig(Xg,cg,[Jg],e,Zg)}}function __(e){for(let t of a_){let n=o_(t.name),r=s_(t.name);e.segments[n]={template:`${t.glyph} {{ .${t.effectiveVar} }} {{ menu "${r}" "▸" "▾" (dict "key" "${Qg}" "closeOnPick" true) }} {{ action "${c_(t.name)}" "↺" }}`,...Zg},e.actions[r]={set:t.sessionKey,persist:t.configKey,persistWhen:qg,from:t.domain},e.actions[c_(t.name)]={reset:t.configKey},h_(n,r,e,Qg)}e.actions[s_(t_.name)]={set:t_.sessionKey,persist:t_.configKey,persistWhen:qg,cycle:[...Ws]},e.actions[c_(t_.name)]={reset:t_.configKey};for(let t of[-1,1])e.actions[`${s_(n_.name)}.${t<0?`down`:`up`}`]={set:n_.sessionKey,persist:n_.configKey,persistWhen:qg,...Gs,by:t};e.actions[c_(n_.name)]={reset:n_.configKey}}function v_(e){e.variables[Yh]=cn(Yh,tn),e.actions[Xh]=ln(Yh,Zh)}const y_=`session.id`;function b_(e){return Object.prototype.hasOwnProperty.call(e.variables,y_)}function x_(e){if(!b_(e))return e;let{artifacts:t,help:n}=g_();v_(t);let r={...e.presets};for(let t of Hc(e.presets)){let{node:i}=Gc(e,t);r[t]={...Wc(e.presets,t),root:m_(f_(i),n)}}return{...e,variables:{...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:r}}const S_=`preset.customized`,C_=`{{ and ${on(Qh)} .${S_} }}`;function w_(e){return e.startsWith(`edit.`)||e.startsWith(`menus.`)||e.startsWith(`groups.`)||e.startsWith(`settings.`)}function T_(e){return`${Jh}addable.${e}`}function E_(e){let t=Object.keys(e.segments).filter(e=>!w_(e)),n=new Map;for(let r of Hc(e.presets)){let{node:i}=Gc(e,r),a=el(i);n.set(T_(r),t.filter(e=>!a.has(e)))}return n}function D_(e,t,n,r){let i=`${Jh}${e}.remove.${au(n)}`,a=`${Jh}${e}.removeSeg.${au(n)}`;return r.actions[i]={persist:t,removeSegment:n},r.segments[a]={template:`{{ action "${i}" "-" }}`,when:$h},{kind:`segment`,name:a}}function O_(e,t,n,r,i,a,o){let s=`${Jh}${e}.insert.${n}`,c=`${Jh}${e}.insertSeg.${n}`;o.actions[s]={persist:t,insertSegmentFrom:r,anchor:i,relation:a};let l=Ig(s),u=Lg(c,s,void 0),d=zg(u),f=Rg(u,l);return o.variables[u]=cn(u,tn),o.variables[d]={kind:`state`,key:d,default:`0`},o.actions[f]=ln(u,l),o.actions[d]={set:d,int:!0},o.segments[c]={template:`{{ menu "${s}" "+" "✕" }}`,when:$h},{kind:`segment`,name:c}}function k_(e,t,n,r,i,a){let o=[],s=e.children.reduce((e,t,n)=>t.kind===`segment`&&!w_(t.name)?n:e,-1);for(let[c,l]of e.children.entries()){if(l.kind===`container`){o.push(k_(l,t,n,r,i,a));continue}if(w_(l.name)){o.push(l);continue}let u=[O_(t,n,String(a.n++),r,l.name,`before`,i),l,D_(t,n,l.name,i),...c===s?[O_(t,n,String(a.n++),r,l.name,`after`,i)]:[]];o.push(...e.direction===`vertical`?[{kind:`container`,direction:`horizontal`,children:u,...l.when!==void 0&&{when:l.when}}]:u)}return{...e,children:o}}function A_(e,t,n,r,i,a){let o=`${Jh}${n}.resetLayout`,s=`${Jh}${n}.customized`;i.actions[o]={reset:r},i.ensured[S_]={kind:`input`,path:S_,type:`boolean`,default:!1};let c=rn(t);return i.segments[s]={template:`{{ action "${o}" "↺ ${c} customized" }}`,when:C_},{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:s},j_(e,a.trigger),a.body],...e.when!==void 0&&{when:e.when}}}function j_(e,t){if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t]};let n=e.children.at(-1);return e.direction===`vertical`&&n!==void 0&&(n.kind===`segment`||n.when===void 0)?{...e,children:[...e.children.slice(0,-1),j_(n,t)]}:{...e,children:[...e.children,t]}}function M_(e,t,n,r){let{node:i}=Gc(e,t),a=nu(t),o=T_(t),s=au(t);return A_(k_(i,s,a,o,n,{n:0}),t,s,a,n,r)}function N_(e){if(!(`edit.toggle`in e.actions))return e;let t={variables:{},ensured:{},actions:{},segments:{}},n=ig(`${Jh}help`,sg,[Qh],t),r={...e.presets};for(let i of Hc(e.presets)){let a=M_(e,i,t,n);r[i]={...Wc(e.presets,i),root:a}}return{...e,variables:{...t.ensured,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:r}}const P_=/^-?\d+$/;function F_(e,t,n){return e===void 0?t:Math.max(t,Math.min(n,e))}function I_(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 L_(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!P_.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 R_(e,t,n){return r=>r?P_.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 z_(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=>!P_.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:F_(r[0].seed,t,i)}}return{kind:`int`}}function B_(e){return e===`config`?`set-config`:`set-state`}function V_(e,t,n){return t.kind===`int`?L_(`menu page "${e}"`):t.kind===`range`?R_(t.min,t.max,`${n} stepper "${e}"`):I_(t.allowed,`${n} "${e}"`,B_(n))}function H_(e,t,n){return V_(e,z_(e,t,n),n)}function U_(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:z_(e,n,t)}))}function W_(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=H_(e,a.specs,t)}else{let r=[i];n.set(e,{permanent:!1,kind:i.kind,validator:H_(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=H_(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=z_(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 G_=W_({},`config`);function K_(){return G_.listKeys()}function q_(e,t){return G_.validate(e,t)}function J_(e){return G_.rangeParamsFor(e)}function Y_(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:Zc(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:[Qc({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[Qc({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Zc(e.insertSegmentFrom,n).map(t=>Qc({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max,seed:F_(t.get(e.persist),e.min,e.max)}}]:[]}function X_(e){return $l(e.globals)}function Z_(e){let t=new Set;for(let n of $_(e)){let e=`persist`in n?n.persist:`reset`in n?n.reset:null;if(e===null)continue;let r=ru(e);r?.scope===`preset-root`&&t.add(r.preset)}return[...t].map(e=>({key:nu(e),spec:{kind:`allow-list`,allowed:[]}}))}function Q_(e){let t=X_(e),n=new Map([...Yc(e),...E_(e)]);return[...Z_(e),...$_(e).flatMap(e=>Y_(e,t,n))]}function $_(e){return Object.values(e.actions).flatMap(Tc)}function ev(e){return U_(Q_(e),`config`)}function tv(e,t){return G_.register(e,t)}const nv=Ns(),rv=new Set(nv),iv=new Set(Ls),av=e=>e?rv.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${nv.join(`, `)})`}:{ok:!1,reason:`theme name is required`},ov=e=>e?iv.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${Ls.join(`, `)})`}:{ok:!1,reason:`style name is required`},sv=new Set([`1`,`true`]),cv=new Set([`0`,`false`]),lv=W_({style:ov,theme:av,"toolbar-expanded":e=>sv.has(e)?{ok:!0,value:`1`}:cv.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function uv(){return lv.listKeys()}function dv(e,t){return lv.register(e,t)}function fv(e,t){return lv.validate(e,t)}function pv(e){return lv.rangeParamsFor(e)}function mv(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:Zc(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:F_(t.get(e.set),e.min,e.max)}}]:[]}function hv(e){let t=new Set(lv.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function gv(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 $l(e.globals))t.set(n,r);return t}function _v(e){let t=gv(e),n=Yc(e);return hv(Object.values(e.actions).flatMap(Tc).flatMap(e=>mv(e,t,n)))}function vv(e){return U_(_v(e))}const yv=`update.dismissed`,bv=`updateNotice`;function xv(e){return e.kind===`source`?e.newer.digest:R(e.newer)}const Sv=e=>`${e.version} [${_c(e.digest)}]`;function Cv(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:Sv(e.newer),running:Sv(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:R(e.newer),running:R(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${mn}@${R(e.newer)}`,`install`]}}}}const wv={kind:`idle`},Tv={kind:`running`};function Ev(e,t,n){if(e===null)return[];let r=xv(e);if(!n.enabled||n.dismissed===r)return[];let i=Cv(e),a=`${i.headline}: ${i.newer}. You're on ${i.running}.`,o=t.kind===`failed`&&t.identity===r?[`${i.act} failed: ${t.reason}`]:[],s=[a,...o].join(`
142
142
  `),c=Qt([{verb:Ht,args:[s]}]),l=t.kind===`running`?ac(`[${i.busy}]`,c):ac(`[${i.act}]`,Qt([{verb:Yt,args:[n.sessionId]}]));return[{severity:ic,message:s,lines:[[ac(a,c),l,ac(`[dismiss]`,Qt([{verb:Lt,args:[n.sessionId,yv,r]}])),ac(`[disable]`,Qt([{verb:Ut,args:[n.sessionId,bv,`false`]}]))],...o.map(e=>[ac(e,c)])]}]}function Dv(e,t){return e.kind===`stale`?{kind:`source`,root:e.root,newer:e.source,running:e.running}:e.kind===`not-source-checkout`&&t!==null&&t.kind===`stale`?{kind:`release`,newer:t.latest,running:t.installed}:null}function Ov(e){switch(e.kind){case`current`:return[`info`,`build: current ${Sv(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${Sv(e.source)}, running ${Sv(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function kv(e){switch(e.kind){case`current`:return[`info`,`release: current ${R(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${R(e.latest)}, running ${R(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${R(e.installed)}, latest ${R(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function Av(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const jv=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function Mv(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=jv(e.stderr)??e.error??jv(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function Nv(e){let{entryUrl:t,intervalMs:n,releaseIntervalMs:r,registryUrl:i,fetchImpl:a,onApplied:o,log:s}=e,c={kind:`unchecked`,reason:`not sampled yet`},l=null,u=wv,d=null,f=Av(s),p=Av(s),m=()=>Dv(c,l);function h(){let e=m(),t=e===null?null:xv(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:dv(yv,{kind:`allow-list`,allowed:[t]})})}function g(){c=xc(t,yc),f(Ov(c)),h()}async function _(){l=gn(un,await hn(mn,a,i)),p(kv(l)),h()}return{arm(){tv(bv,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>Ev(m(),u,e),act(){let e=m();if(e===null)throw new X(`apply-update: nothing newer is known to apply`);let t=Cv(e);if(u.kind===`running`)throw new X(`apply-update: already ${t.busy}`);u=Tv,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),xe({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=wv,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=Mv(n);u={kind:`failed`,identity:xv(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}function Pv(e,t,n){return t.ok?P(t.stdout):t.reason===`non-zero`&&n===`absent`||t.reason===`non-zero`&&n===t.exitCode?F:I(`${e}: ${[t.reason,t.exitCode==null?null:`exit ${t.exitCode}`,t.error??Fv(t.stderr)].filter(Boolean).join(`, `)}`)}function Fv(e){return e.trim().split(`
143
143
  `,1)[0]??``}function Iv(e,t){if(e.kind!==`ok`)return e;let n=t(e.value);return n===null?F:P(n)}function Lv(e){if(e.kind!==`ok`)return e;let t=e.value.trim();return t?P(t):F}const Rv=/^[A-Za-z]:[\\/]/;function zv(e){let t=e.trim();if(Rv.test(t))return null;let n=t.match(/^(?:[^@/]+@)?(\[[^\]]+\]):(.*)$/)??t.match(/^(?:[^@/:]+@)?([^/:]+):(?!\/\/)(.*)$/),r=n?`ssh://${n[1]}/${n[2].replace(/^\/+/,``)}`:t,i;try{i=new URL(r)}catch{return null}return{scheme:i.protocol.replace(/:$/,``),host:i.hostname.toLowerCase(),port:i.port,path:i.pathname.replace(/^\/+/,``).replace(/\/+$/,``)}}function Bv(e){return zv(e)?.host||null}function Vv(e){let t=Bv(e);return t?t===`github.com`||t.endsWith(`.github.com`)?`github`:/(^|\.)gitlab\./.test(t)?`gitlab`:null:null}function Hv(e){let t=new Map;for(let n of e.split(`
144
144
  `)){let e=n.match(/^remote\.(.+)\.url\s+(\S.*)$/);if(!e)continue;let r=t.get(e[1])??[];r.push(e[2].trim()),t.set(e[1],r)}return[...t].map(([e,t])=>({name:e,urls:t}))}function Uv(e){return e.urls.find(e=>Jv(e)!==null)??e.urls[0]??null}function Wv(e){return e.find(e=>e.name===`origin`)??e[0]??null}function Gv(e){let t=Wv(e);return t?Uv(t):null}function Kv(e){let t=Wv(e);return t?t.urls.find(e=>Vv(e)!==null)??Uv(t):null}function qv(e){let t=(zv(e)?.path??e.replace(/[\\/]+$/,``)).split(`/`);return(t[t.length-1]??``).replace(/\.git$/,``)||null}function Jv(e){let t=zv(e);if(!t)return null;let n=t.scheme===`https`?{scheme:`https`,port:t.port}:t.scheme===`http`?{scheme:`http`,port:t.port}:t.scheme===`ssh`||t.scheme===`git`?{scheme:`https`,port:``}:null;if(!n||!t.host)return null;let r=t.path.replace(/\.git$/,``);if(!r)return null;let i=n.port?`${t.host}:${n.port}`:t.host;return`${n.scheme}://${i}/${r}`}function Yv(e){let t=Gv(e);return t===null?null:Jv(t)}function Xv(e,t,n,r){return t.ok?r(t.stdout):t.reason===`spawn-error`&&/ENOENT/i.test(t.error??``)||t.reason===`non-zero`&&n.test(t.stderr)?F:I(`${e}: ${[t.reason,t.exitCode==null?null:`exit ${t.exitCode}`,t.error??Fv(t.stderr)].filter(Boolean).join(`, `)}`)}function Zv(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Qv(e){let t=`detached`,n=F,r=F,i=F,a=0,o=0,s=0,c=0;for(let l of e.split(`
@@ -162,7 +162,7 @@ Config tooling:
162
162
  Replace: layout: [["seg1", "seg2"], ["seg3"]]
163
163
  With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
164
164
  Single-row example: root: { h: ["seg1", "seg2"] }`,line:Z(e.source,[`layout`])}),t.root!==void 0&&(n.root=Tg(e,`root`,t.root)),t.actions!==void 0&&(n.actions=Rb(e,t.actions)),t.looks!==void 0&&(n.looks=Ex(e,t.looks)),t.presets!==void 0&&(n.presets=Ox(e,t.presets)),t.editGlobals!==void 0&&(n.editGlobals=Jl(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(n.helpers=kx(e,t.helpers)),Pg(e,n),Lb(e,n),ng(e,n),qh(e,n,Vg,`the global settings menu`),n}const pS=new Set([`globals`,`variables`,`segments`,`layout`,`root`,`actions`,`looks`,`presets`,`editGlobals`,`helpers`]),mS=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function hS(e){let t;try{t=JSON.parse(e)}catch{return null}let n=t.message?.usage;if(!((n?.cache_read_input_tokens??0)>0||(n?.cache_creation_input_tokens??0)>0))return null;let r=t.timestamp==null?NaN:Date.parse(t.timestamp);return Number.isNaN(r)?null:r}async function gS(e){let t=await _S(e);return t.kind===`ok`?P(Math.floor((t.value+36e5)/1e3)):t}async function _S(e){for(let t of[65536,1048576]){let n=await xy(e,t);if(n.kind!==`ok`)return n;let r=vS(n.value.buf,n.value.fromStart);if(r!=null)return P(r);if(n.value.fromStart)return F}return F}function vS(e,t){let n=e.toString(`utf8`).split(`
165
- `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!mS.test(t))continue;let r=hS(t);if(r!=null)return r}return null}function yS(e,t,n){let r=Uc(t(`preset`),e.globals.preset,e.presets),i=Kc(e,r),a=t(`edit.mode`)===`open`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:js(a.palette,t(`theme`),i.palette),look:Fs(a.look,t(`look`),i.look,e.looks),style:zs(a.style,t(`style`),i.style),separator:a.default_separator??i.default_separator,autoWrap:Js(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:Ys(a.padding,t(`padding`),i.padding),charset:a.charset??i.charset??`unicode`,updateNotice:a.updateNotice??i.updateNotice??!0,colorCompatibility:a.colorCompatibility??i.colorCompatibility??`truecolor`}}const bS=10*1e3;function xS(e,t,n,r){let i=n-(t*1e3-r);if(i<3e5||e<=0)return;let a=e/i,o=(100-e)/a;return Math.max(0,Math.round(o/6e4))}function SS(e,t){if(!(t<60))return e*3600/t}function CS(e,t,n,r){let i=r-t;if(i<50||i>bS)return;let a=n-e;if(!(a<=0))return a*1e3/i}function wS(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=CS(t.input,t.atMs,n.input,n.atMs),i=CS(t.output,t.atMs,n.output,n.atMs),a=CS(t.total,t.atMs,n.total,n.atMs);if(!(r===void 0&&i===void 0&&a===void 0))return{...r!==void 0&&{input:r},...i!==void 0&&{output:i},...a!==void 0&&{total:a}}}function TS(e){let{samples:t}=e,n=[];for(let e=1;e<t.length;e++){let r=t[e-1],i=t[e],a=i.atMs-r.atMs;if(a<50||a>bS)continue;let o=CS(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function ES(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function DS(e){let t=[],n=(e,n)=>{try{let e=n();return e===``?void 0:e}catch(n){t.push(`host.${e}: ${String(n)}`);return}},r=n(`name`,()=>ES(f.hostname())),i=n(`user`,()=>f.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function OS(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,r);for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,i);let n=[],r=new Set;for(let t of nl(Ic(e.root))){if(t.when)for(let e of Nx(t.when))n.push(e);if(t.kind!==`segment`)continue;let r=e.segments[t.name];if(r){for(let e of[r.template,r.when,r.bg,r.fg])if(e)for(let t of Nx(e))n.push(t)}}let i=new Set;for(;n.length>0;){let e=n.pop();for(let a of kS(t,e)){if(r.has(a))continue;r.add(a);let e=t.get(a);if(e){if(e.kind===`input`)i.add(e.path);else if(e.kind===`template`)for(let t of Nx(e.template))n.push(t)}}}return i}function kS(e,t){let n=t;for(;n.length>0;){if(e.has(n))return[n];let t=n.lastIndexOf(`.`);if(t<0)break;n=n.slice(0,t)}let r=`${t}.`,i=[];for(let t of e.keys())t.startsWith(r)&&i.push(t);return i}function AS(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function jS(e){let t=t=>e.has(t),n=t(`git.staged`)||t(`git.unstaged`)||t(`git.untracked`)||t(`git.conflicts`);return{...t(`git.sha`)&&{showSha:!0},...n&&{showWorkingTree:!0},...t(`git.stash`)&&{showStashCount:!0},...t(`git.upstream`)&&{showUpstream:!0},...t(`git.repoName`)&&{showRepoName:!0},...t(`git.repoUrl`)&&{showRepoUrl:!0},...t(`git.operation`)&&{showOperation:!0},...t(`git.timeSinceCommit`)&&{showTimeSinceCommit:!0},...(t(`git.prNumber`)||t(`git.prState`)||t(`git.prUrl`)||t(`git.prError`))&&{showPullRequest:!0}}}async function MS(e,t,n,r,i,a){let o=e=>AS(r,e),s=(t.clock??(()=>new Date))().getTime(),c=(e,t,n)=>t?n().catch(t=>I(`${e}: ${String(t)}`)):Promise.resolve(F),[l,u,d,f,p,m,h,g]=await Promise.all([c(`git`,o(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,jS(r),e.workspace?.project_dir)),c(`session`,o(`session.cost`)||o(`session.tokens`)||o(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),c(`today`,o(`today`),()=>t.usageStore.getTodayInfo(e)),c(`context`,o(`context`),()=>t.contextProvider.getContextInfo(e)),c(`metrics`,o(`metrics`)||o(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),c(`tmux`,o(`tmux`),()=>t.tmuxService.getSessionId()),c(`cache`,o(`cache`),()=>gS(e.transcript_path)),c(`speed`,o(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,s))]),_=[],v=e=>{if(e.kind===`failed`){_.push(e.reason);return}return e.kind===`ok`?e.value:void 0},y=FS(l);_.push(...y.failures);let b=DS(a);_.push(...b.failures);let x=v(u),S=v(d),C=v(f),ee=v(p),te=v(m),w=v(h);for(let e of _)t.log(`warn`,`provider fetch failed: ${e}`);let ne=e.rate_limits?.five_hour,T=e.rate_limits?.seven_day,re=ne?xS(ne.used_percentage,ne.resets_at,18e6,s):void 0,E=T?xS(T.used_percentage,T.resets_at,6048e5,s):void 0,D=x?.session.cost,ie=ee?.sessionDuration,ae=o(`burn`)&&D!=null&&ie!=null?SS(D,ie):void 0,oe=v(g),se=oe===void 0?void 0:wS(oe),ce=oe===void 0?void 0:TS(oe),le=se!==void 0||ce!==void 0?{...se,...ce!==void 0&&{history:ce}}:void 0,ue=PS(process.env.HOME??process.env.USERPROFILE),de=e.workspace?{...e.workspace,current_dir:PS(e.workspace.current_dir)??``,project_dir:PS(e.workspace.project_dir)??``}:e.workspace,fe=x===void 0?void 0:NS({cost:x.session.cost,tokens:x.session.tokens}),pe=S===void 0?void 0:{cost:S.cost,tokens:S.tokens},me=ee===void 0?void 0:NS({lastResponseTime:ee.lastResponseTime,responseTime:ee.responseTime,sessionDuration:ee.sessionDuration,messageCount:ee.messageCount,linesAdded:ee.linesAdded,linesRemoved:ee.linesRemoved});return{...e,...de!==void 0&&{workspace:de},...ue!==void 0&&{home:ue},...y.git!==void 0&&{git:y.git},...te!==void 0&&{tmux:{session:te}},host:b.host,theme:{effective:i.theme},look:{effective:i.look},preset:{effective:i.preset,customized:i.presetCustomized},style:{effective:i.style},charset:{effective:i.charset},colorCompatibility:{effective:i.colorCompatibility},autoWrap:{effective:i.autoWrap},padding:{effective:i.padding},...fe!==void 0&&{session:fe},...pe!==void 0&&{today:pe},...ae!==void 0&&{burn:{costPerHour:ae}},...le!==void 0&&{speed:le},...o(`block`)&&ne!==void 0&&{block:{nativeUtilization:ne.used_percentage,resetsAt:ne.resets_at,...re!==void 0&&{etaMinutes:re}}},...T!==void 0&&{weekly:{percentage:T.used_percentage,resetsAt:T.resets_at,...E!==void 0&&{etaMinutes:E}}},...w!==void 0&&{cache:{expiresAt:w}},...C!==void 0&&{context:{totalTokens:C.totalTokens,contextLeft:C.contextLeftPercentage}},...me!==void 0&&{metrics:me}}}function NS(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function PS(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function FS(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const IS=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,LS=`{{ \$dir := .current_dir }}{{ if and (ne .home "") (or (eq .home .current_dir) (hasPrefix (printf "%s/" .home) .current_dir)) }}{{ \$dir = printf "~%s" (trimPrefix .home .current_dir) }}{{ else }}{{ if or (eq .project_dir .current_dir) (hasPrefix (printf "%s/" .project_dir) .current_dir) }}{{ $dir = ternary (${IS}) (basename .project_dir) (ne (${IS}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,RS={branch:`primary`,staged:`success`,unstaged:`warning`,untracked:`accent`,conflicts:`error`,ahead:`success`,behind:`warning`,stash:`accent`},zS=(e,t)=>`{{ fg (color "${RS[e]}") ${t} }}`,BS=`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,VS=`{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} ({{ \$first := true }}{{ if gt .git.staged 0 }}${zS(`staged`,`(printf "+%v" .git.staged)`)}{{ $first = false }}{{ end }}{{ if gt .git.unstaged 0 }}{{ if not $first }} {{ end }}${zS(`unstaged`,`(printf "~%v" .git.unstaged)`)}{{ $first = false }}{{ end }}{{ if gt .git.untracked 0 }}{{ if not $first }} {{ end }}${zS(`untracked`,`(printf "?%v" .git.untracked)`)}{{ $first = false }}{{ end }}{{ if gt .git.conflicts 0 }}{{ if not $first }} {{ end }}${zS(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ $first = false }}{{ end }}){{ end }}`,HS=`{{ if ne .git.repoName "" }}{{ .git.repoName }} {{ end }}⎇ ${zS(`branch`,`.git.branch`)}{{ if .git.sha }} ♯ {{ .git.sha }}{{ end }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${zS(`ahead`,`(printf "↑%v" .git.ahead)`)}{{ end }}{{ if gt .git.behind 0 }}${zS(`behind`,`(printf "↓%v" .git.behind)`)}{{ end }}{{ end }}`+VS+`{{ if .git.upstream }} →{{ .git.upstream }}{{ end }}{{ if gt .git.stash 0 }} ${zS(`stash`,`(printf "⧇ %v" .git.stash)`)}{{ end }} {{ if eq .git.status "conflicts" }}{{ fg (color "error") "⚠" }}{{ else }}{{ if eq .git.status "dirty" }}{{ fg (color "warning") "●" }}{{ else }}{{ fg (color "success") "✓" }}{{ end }}{{ end }}`;function US(e,t){return`{{ if ge (round ${e}) ${t} }}error{{ else }}{{ if ge (round ${e}) 50 }}warning{{ else }}panel{{ end }}{{ end }}`}function WS(e){return`{{ if ge (round ${e}) 50 }}button-color-foreground{{ else }}foreground{{ end }}`}function GS(e,t,n){return`{{ if lt ${e} 0 }}panel{{ else }}{{ if lt ${e} ${n} }}error{{ else }}{{ if lt ${e} ${t} }}warning{{ else }}panel{{ end }}{{ end }}{{ end }}`}function KS(e,t){return`{{ if lt ${e} 0 }}foreground{{ else }}{{ if lt ${e} ${t} }}button-color-foreground{{ else }}foreground{{ end }}{{ end }}`}const qS={globals:{palette:`tokyo-night`},variables:{current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},"session.id":{kind:`input`,path:`session_id`,default:``},version:{kind:`input`,path:`version`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"preset.customized":{kind:`input`,path:`preset.customized`,type:`boolean`,default:!1},"style.effective":{kind:`input`,path:`style.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0}},segments:{directory:{template:LS,bg:`surface`,fg:`foreground`},model:{template:`✱ {{ formatModelName .model.display_name }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .model.display_name "" }}`},sessionId:{template:`⌗{{ trunc 8 .session.id }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .session.id "" }}`},version:{template:`◈ v{{ .version }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .version "" }}`},tmux:{template:`tmux:{{ .tmux.session | default "none" }}`,bg:`surface-active`,fg:`foreground`,when:`{{ ne .tmux.session "" }}`},host:{template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,fg:`{{ contrastOn (bgOf) }}`,when:`{{ .host.ssh }}`},git:{template:HS,bg:`surface-active`,fg:BS,when:`{{ ne .git.branch "" }}`},gitaculous:{template:`(git){{ if ne .git.repoName "" }} {{ .git.repoName }}{{ end }}{{ if ne .git.operation "" }} [{{ .git.operation }}]{{ end }}{{ if ne .git.sha "" }} {{ .git.sha }}{{ end }}{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} {{ if gt .git.staged 0 }}${zS(`staged`,`"S"`)}{{ end }}{{ if gt .git.unstaged 0 }}${zS(`unstaged`,`"U"`)}{{ end }}{{ if gt .git.untracked 0 }}${zS(`untracked`,`"?"`)}{{ end }}{{ if gt .git.conflicts 0 }}${zS(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ end }}{{ end }} ⎇ ${zS(`branch`,`.git.branch`)}{{ if ne .git.upstream "" }} [{{ .git.upstream }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${zS(`ahead`,`(printf "+%v" .git.ahead)`)}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}${zS(`behind`,`(printf "-%v" .git.behind)`)}{{ end }}{{ end }}]{{ end }}{{ if gt .git.stash 0 }} ${zS(`stash`,`(printf "(%v stashed)" .git.stash)`)}{{ end }}{{ if gt .git.timeSinceCommit 0 }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,bg:`surface-active`,fg:BS,when:`{{ ne .git.branch "" }}`},gitPr:{template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,bg:`surface-active`,fg:`foreground`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{template:`{{ action "copySession" "⎘ id" }} {{ action "openProject" "↗ proj" }} {{ action "openTranscript" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }} {{ action "edit.toggle" "✎ edit" "✎ done" }}`,bg:`surface`,fg:`foreground`},session:{template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .session.budget.amount "warn" .session.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},today:{template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .today.budget.amount "warn" .today.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},block:{template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .block.resetsAt) }})`,bg:US(`.block.nativeUtilization`,`.block.budget.warningThreshold`),fg:WS(`.block.nativeUtilization`),when:`{{ gt .block.resetsAt 0 }}`},weekly:{template:`◑ {{ round .weekly.percentage }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .weekly.resetsAt) }})`,bg:US(`.weekly.percentage`,`.weekly.budget.warningThreshold`),fg:WS(`.weekly.percentage`),when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:GS(`.block.etaMinutes`,`.burn.eta.warnMinutes`,`.burn.eta.errorMinutes`),fg:KS(`.block.etaMinutes`,`.burn.eta.warnMinutes`),when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,bg:`panel`,fg:`foreground`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{template:`⚡ {{ sparkline .speed.history 24 }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .speed.history "" }}`},cacheTimer:{template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,bg:`surface`,fg:`{{ if le (minutesUntilReset .cache.expiresAt) 8 }}error{{ else }}{{ if le (minutesUntilReset .cache.expiresAt) 20 }}warning{{ else }}foreground{{ end }}{{ end }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ if le .context.contextLeft 20 }}error{{ else }}{{ if le .context.contextLeft 40 }}warning{{ else }}surface-active{{ end }}{{ end }}`,fg:`{{ if le .context.contextLeft 40 }}button-color-foreground{{ else }}foreground{{ end }}`,when:`{{ gt .context.totalTokens 0 }}`},metrics:{template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,bg:`panel`,fg:`foreground`,when:`{{ or .metrics.lastResponseTime .metrics.responseTime .metrics.sessionDuration .metrics.messageCount .metrics.linesAdded .metrics.linesRemoved }}`},charsetControl:{template:`{{ .charset.effective }} {{ menu "applyCharsetForever" "▸" "▾" }} {{ action "resetCharset" "↺" }}`,bg:`surface`,fg:`foreground`},colorCompatControl:{template:`{{ .colorCompatibility.effective }} {{ menu "applyColorCompatForever" "▸" "▾" }} {{ action "resetColorCompat" "↺" }}`,bg:`surface`,fg:`foreground`},directoryPaletteControl:{template:`🎨 directory {{ menu "applyDirectoryPaletteForever" "▸" "▾" }} {{ action "resetDirectoryPalette" "↺" }}`,bg:`surface`,fg:`foreground`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`toolbar`},{kind:`group`,name:`settings`,label:`⚙ terminal`,direction:`horizontal`,children:[`charsetControl`,`colorCompatControl`,`directoryPaletteControl`]}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`}]}}},actions:{copySession:{copy:`{{ .session.id }}`},copyDir:{copy:`{{ .current_dir }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},applyCharsetForever:{persist:`charset`,from:`charsets`},resetCharset:{reset:`charset`},applyColorCompatForever:{persist:`colorCompatibility`,from:`colorCompatibilities`},resetColorCompat:{reset:`colorCompatibility`},applyDirectoryPaletteForever:{persist:`segments.directory.palette`,from:`themes`},resetDirectoryPalette:{reset:`segments.directory.palette`}},looks:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`git`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`},{kind:`segment`,name:`toolbar`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}}},editGlobals:{style:`plain`,default_separator:` | `},helpers:{formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`}},JS=new Set([qS.globals.palette,...Object.values(qS.segments).map(e=>e.palette)].filter(e=>e!==void 0)),YS=Jy(uS(`<default>`,JSON.stringify(qS),JS),qS);function XS(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function ZS(e){return typeof e==`string`?e:String(e)}function QS(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function $S(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}const eC=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,tC=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function nC(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(eC);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(tC);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function rC(e){let t=e.match(tC);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function iC(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function aC(e){return e.toLocaleString()}const oC=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],sC=oC.length;function cC(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(sC-1));o+=oC[t]}return o}function lC(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}const uC=Ns(),dC=[...Ls];function fC(){return{basename:{fn:e=>l(e),argTypes:[`string`]},dirname:{fn:e=>u(e),argTypes:[`string`]},abbreviatePath:{fn:e=>iC(e),argTypes:[`string`]},int:{fn:e=>QS(e),argTypes:[`value`]},string:{fn:e=>ZS(e),argTypes:[`value`]},bool:{fn:e=>$S(e),argTypes:[`value`]},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`]},themes:{fn:()=>uC,argTypes:[]},styles:{fn:()=>dC,argTypes:[]},sparkline:{fn:(e,t)=>cC(lC(e),t),argTypes:[`string`,`int`]}}}function pC(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`]},formatInteger:{fn:e=>aC(e),argTypes:[`int`]},round:{fn:e=>Math.round(e),argTypes:[`float`]},formatModelName:{fn:e=>nC(e),argTypes:[`string`]},shortenModelName:{fn:e=>rC(e),argTypes:[`string`]}}}function mC(e,t=()=>new Date){return Gd({fromString:e=>new Ua(e),toString:e=>e.plain,clock:t,missingKey:`error`,funcs:{...Ip(),...Kh(),...Sm(),...Wm(),...Op(t),...vf(),...Xp(),...ys(),...fC(),...pC(t),...e??{}}})}function hC(e){return gC(e,new Set(e.names()),``)}function gC(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return gC(e,t,a)}})}function _C(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(O(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function vC(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}async function yC(e){let t=await xe({bin:`/bin/sh`,args:[`-c`,e],category:`user-shell`});return t.ok?{stdout:t.stdout,exitCode:t.exitCode??0}:{stdout:t.stdout,exitCode:t.exitCode??1}}async function bC(e,t,n){let r;try{r=await T(e,`utf8`)}catch{return{error:`file unreadable: ${e}`}}if(n!==void 0){let t=new RegExp(n).exec(r);return t?.[1]?{content:t[1].replace(/\n/g,` `)}:{error:`regex no-match in "${e}"`}}return t===`first-line`?{content:(r.split(`
165
+ `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!mS.test(t))continue;let r=hS(t);if(r!=null)return r}return null}function yS(e,t,n){let r=Uc(t(`preset`),e.globals.preset,e.presets),i=Kc(e,r),a=t(`edit.mode`)===`open`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:js(a.palette,t(`theme`),i.palette),look:Fs(a.look,t(`look`),i.look,e.looks),style:zs(a.style,t(`style`),i.style),separator:a.default_separator??i.default_separator,autoWrap:Js(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:Ys(a.padding,t(`padding`),i.padding),charset:a.charset??i.charset??`unicode`,updateNotice:a.updateNotice??i.updateNotice??!0,colorCompatibility:a.colorCompatibility??i.colorCompatibility??`truecolor`}}const bS=10*1e3;function xS(e,t,n,r){let i=n-(t*1e3-r);if(i<3e5||e<=0)return;let a=e/i,o=(100-e)/a;return Math.max(0,Math.round(o/6e4))}function SS(e,t){if(!(t<60))return e*3600/t}function CS(e,t,n,r){let i=r-t;if(i<50||i>bS)return;let a=n-e;if(!(a<=0))return a*1e3/i}function wS(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=CS(t.input,t.atMs,n.input,n.atMs),i=CS(t.output,t.atMs,n.output,n.atMs),a=CS(t.total,t.atMs,n.total,n.atMs);if(!(r===void 0&&i===void 0&&a===void 0))return{...r!==void 0&&{input:r},...i!==void 0&&{output:i},...a!==void 0&&{total:a}}}function TS(e){let{samples:t}=e,n=[];for(let e=1;e<t.length;e++){let r=t[e-1],i=t[e],a=i.atMs-r.atMs;if(a<50||a>bS)continue;let o=CS(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function ES(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function DS(e){let t=[],n=(e,n)=>{try{let e=n();return e===``?void 0:e}catch(n){t.push(`host.${e}: ${String(n)}`);return}},r=n(`name`,()=>ES(f.hostname())),i=n(`user`,()=>f.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function OS(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,r);for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,i);let n=[],r=new Set;for(let t of nl(Ic(e.root))){if(t.when)for(let e of Nx(t.when))n.push(e);if(t.kind!==`segment`)continue;let r=e.segments[t.name];if(r){for(let e of[r.template,r.when,r.bg,r.fg])if(e)for(let t of Nx(e))n.push(t)}}let i=new Set;for(;n.length>0;){let e=n.pop();for(let a of kS(t,e)){if(r.has(a))continue;r.add(a);let e=t.get(a);if(e){if(e.kind===`input`)i.add(e.path);else if(e.kind===`template`)for(let t of Nx(e.template))n.push(t)}}}return i}function kS(e,t){let n=t;for(;n.length>0;){if(e.has(n))return[n];let t=n.lastIndexOf(`.`);if(t<0)break;n=n.slice(0,t)}let r=`${t}.`,i=[];for(let t of e.keys())t.startsWith(r)&&i.push(t);return i}function AS(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function jS(e){let t=t=>e.has(t),n=t(`git.staged`)||t(`git.unstaged`)||t(`git.untracked`)||t(`git.conflicts`);return{...t(`git.sha`)&&{showSha:!0},...n&&{showWorkingTree:!0},...t(`git.stash`)&&{showStashCount:!0},...t(`git.upstream`)&&{showUpstream:!0},...t(`git.repoName`)&&{showRepoName:!0},...t(`git.repoUrl`)&&{showRepoUrl:!0},...t(`git.operation`)&&{showOperation:!0},...t(`git.timeSinceCommit`)&&{showTimeSinceCommit:!0},...(t(`git.prNumber`)||t(`git.prState`)||t(`git.prUrl`)||t(`git.prError`))&&{showPullRequest:!0}}}async function MS(e,t,n,r,i,a){let o=e=>AS(r,e),s=(t.clock??(()=>new Date))().getTime(),c=(e,t,n)=>t?n().catch(t=>I(`${e}: ${String(t)}`)):Promise.resolve(F),[l,u,d,f,p,m,h,g]=await Promise.all([c(`git`,o(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,jS(r),e.workspace?.project_dir)),c(`session`,o(`session.cost`)||o(`session.tokens`)||o(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),c(`today`,o(`today`),()=>t.usageStore.getTodayInfo(e)),c(`context`,o(`context`),()=>t.contextProvider.getContextInfo(e)),c(`metrics`,o(`metrics`)||o(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),c(`tmux`,o(`tmux`),()=>t.tmuxService.getSessionId()),c(`cache`,o(`cache`),()=>gS(e.transcript_path)),c(`speed`,o(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,s))]),_=[],v=e=>{if(e.kind===`failed`){_.push(e.reason);return}return e.kind===`ok`?e.value:void 0},y=FS(l);_.push(...y.failures);let b=DS(a);_.push(...b.failures);let x=v(u),S=v(d),C=v(f),ee=v(p),te=v(m),w=v(h);for(let e of _)t.log(`warn`,`provider fetch failed: ${e}`);let ne=e.rate_limits?.five_hour,T=e.rate_limits?.seven_day,re=ne?xS(ne.used_percentage,ne.resets_at,18e6,s):void 0,E=T?xS(T.used_percentage,T.resets_at,6048e5,s):void 0,D=x?.session.cost,ie=ee?.sessionDuration,ae=o(`burn`)&&D!=null&&ie!=null?SS(D,ie):void 0,oe=v(g),se=oe===void 0?void 0:wS(oe),ce=oe===void 0?void 0:TS(oe),le=se!==void 0||ce!==void 0?{...se,...ce!==void 0&&{history:ce}}:void 0,ue=PS(process.env.HOME??process.env.USERPROFILE),de=e.workspace?{...e.workspace,current_dir:PS(e.workspace.current_dir)??``,project_dir:PS(e.workspace.project_dir)??``}:e.workspace,fe=x===void 0?void 0:NS({cost:x.session.cost,tokens:x.session.tokens}),pe=S===void 0?void 0:{cost:S.cost,tokens:S.tokens},me=ee===void 0?void 0:NS({lastResponseTime:ee.lastResponseTime,responseTime:ee.responseTime,sessionDuration:ee.sessionDuration,messageCount:ee.messageCount,linesAdded:ee.linesAdded,linesRemoved:ee.linesRemoved});return{...e,...de!==void 0&&{workspace:de},...ue!==void 0&&{home:ue},...y.git!==void 0&&{git:y.git},...te!==void 0&&{tmux:{session:te}},host:b.host,theme:{effective:i.theme},look:{effective:i.look},preset:{effective:i.preset,customized:i.presetCustomized},style:{effective:i.style},charset:{effective:i.charset},colorCompatibility:{effective:i.colorCompatibility},autoWrap:{effective:i.autoWrap},padding:{effective:i.padding},...fe!==void 0&&{session:fe},...pe!==void 0&&{today:pe},...ae!==void 0&&{burn:{costPerHour:ae}},...le!==void 0&&{speed:le},...o(`block`)&&ne!==void 0&&{block:{nativeUtilization:ne.used_percentage,resetsAt:ne.resets_at,...re!==void 0&&{etaMinutes:re}}},...T!==void 0&&{weekly:{percentage:T.used_percentage,resetsAt:T.resets_at,...E!==void 0&&{etaMinutes:E}}},...w!==void 0&&{cache:{expiresAt:w}},...C!==void 0&&{context:{totalTokens:C.totalTokens,contextLeft:C.contextLeftPercentage}},...me!==void 0&&{metrics:me}}}function NS(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function PS(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function FS(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const IS=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,LS=`{{ \$dir := .current_dir }}{{ if and (ne .home "") (or (eq .home .current_dir) (hasPrefix (printf "%s/" .home) .current_dir)) }}{{ \$dir = printf "~%s" (trimPrefix .home .current_dir) }}{{ else }}{{ if or (eq .project_dir .current_dir) (hasPrefix (printf "%s/" .project_dir) .current_dir) }}{{ $dir = ternary (${IS}) (basename .project_dir) (ne (${IS}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,RS={branch:`primary`,staged:`success`,unstaged:`warning`,untracked:`accent`,conflicts:`error`,ahead:`success`,behind:`warning`,stash:`accent`},zS=(e,t)=>`{{ fg (color "${RS[e]}") ${t} }}`,BS=`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,VS=`{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} ({{ \$first := true }}{{ if gt .git.staged 0 }}${zS(`staged`,`(printf "+%v" .git.staged)`)}{{ $first = false }}{{ end }}{{ if gt .git.unstaged 0 }}{{ if not $first }} {{ end }}${zS(`unstaged`,`(printf "~%v" .git.unstaged)`)}{{ $first = false }}{{ end }}{{ if gt .git.untracked 0 }}{{ if not $first }} {{ end }}${zS(`untracked`,`(printf "?%v" .git.untracked)`)}{{ $first = false }}{{ end }}{{ if gt .git.conflicts 0 }}{{ if not $first }} {{ end }}${zS(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ $first = false }}{{ end }}){{ end }}`,HS=`{{ if ne .git.repoName "" }}{{ .git.repoName }} {{ end }}⎇ ${zS(`branch`,`.git.branch`)}{{ if .git.sha }} ♯ {{ .git.sha }}{{ end }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${zS(`ahead`,`(printf "↑%v" .git.ahead)`)}{{ end }}{{ if gt .git.behind 0 }}${zS(`behind`,`(printf "↓%v" .git.behind)`)}{{ end }}{{ end }}`+VS+`{{ if .git.upstream }} →{{ .git.upstream }}{{ end }}{{ if gt .git.stash 0 }} ${zS(`stash`,`(printf "⧇ %v" .git.stash)`)}{{ end }} {{ if eq .git.status "conflicts" }}{{ fg (color "error") "⚠" }}{{ else }}{{ if eq .git.status "dirty" }}{{ fg (color "warning") "●" }}{{ else }}{{ fg (color "success") "✓" }}{{ end }}{{ end }}`;function US(e,t){return`{{ if ge (round ${e}) ${t} }}error{{ else }}{{ if ge (round ${e}) 50 }}warning{{ else }}panel{{ end }}{{ end }}`}function WS(e){return`{{ if ge (round ${e}) 50 }}button-color-foreground{{ else }}foreground{{ end }}`}function GS(e,t,n){return`{{ if lt ${e} 0 }}panel{{ else }}{{ if lt ${e} ${n} }}error{{ else }}{{ if lt ${e} ${t} }}warning{{ else }}panel{{ end }}{{ end }}{{ end }}`}function KS(e,t){return`{{ if lt ${e} 0 }}foreground{{ else }}{{ if lt ${e} ${t} }}button-color-foreground{{ else }}foreground{{ end }}{{ end }}`}const qS={globals:{palette:`tokyo-night`},variables:{current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},"session.id":{kind:`input`,path:`session_id`,default:``},version:{kind:`input`,path:`version`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"preset.customized":{kind:`input`,path:`preset.customized`,type:`boolean`,default:!1},"style.effective":{kind:`input`,path:`style.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0}},segments:{directory:{template:LS,fg:`foreground`},model:{template:`✱ {{ formatModelName .model.display_name }}`,fg:`foreground`,when:`{{ ne .model.display_name "" }}`},sessionId:{template:`⌗{{ trunc 8 .session.id }}`,fg:`foreground`,when:`{{ ne .session.id "" }}`},version:{template:`◈ v{{ .version }}`,fg:`foreground`,when:`{{ ne .version "" }}`},tmux:{template:`tmux:{{ .tmux.session | default "none" }}`,fg:`foreground`,when:`{{ ne .tmux.session "" }}`},host:{template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,fg:`{{ contrastOn (bgOf) }}`,when:`{{ .host.ssh }}`},git:{template:HS,fg:BS,when:`{{ ne .git.branch "" }}`},gitaculous:{template:`(git){{ if ne .git.repoName "" }} {{ .git.repoName }}{{ end }}{{ if ne .git.operation "" }} [{{ .git.operation }}]{{ end }}{{ if ne .git.sha "" }} {{ .git.sha }}{{ end }}{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} {{ if gt .git.staged 0 }}${zS(`staged`,`"S"`)}{{ end }}{{ if gt .git.unstaged 0 }}${zS(`unstaged`,`"U"`)}{{ end }}{{ if gt .git.untracked 0 }}${zS(`untracked`,`"?"`)}{{ end }}{{ if gt .git.conflicts 0 }}${zS(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ end }}{{ end }} ⎇ ${zS(`branch`,`.git.branch`)}{{ if ne .git.upstream "" }} [{{ .git.upstream }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${zS(`ahead`,`(printf "+%v" .git.ahead)`)}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}${zS(`behind`,`(printf "-%v" .git.behind)`)}{{ end }}{{ end }}]{{ end }}{{ if gt .git.stash 0 }} ${zS(`stash`,`(printf "(%v stashed)" .git.stash)`)}{{ end }}{{ if gt .git.timeSinceCommit 0 }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,fg:BS,when:`{{ ne .git.branch "" }}`},gitPr:{template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,fg:`foreground`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{template:`{{ action "copySession" "⎘ id" }} {{ action "openProject" "↗ proj" }} {{ action "openTranscript" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }} {{ action "edit.toggle" "✎ edit" "✎ done" }}`,fg:`foreground`},session:{template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .session.budget.amount "warn" .session.budget.warningThreshold) }}`,fg:`foreground`},today:{template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .today.budget.amount "warn" .today.budget.warningThreshold) }}`,fg:`foreground`},block:{template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .block.resetsAt) }})`,bg:US(`.block.nativeUtilization`,`.block.budget.warningThreshold`),fg:WS(`.block.nativeUtilization`),when:`{{ gt .block.resetsAt 0 }}`},weekly:{template:`◑ {{ round .weekly.percentage }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .weekly.resetsAt) }})`,bg:US(`.weekly.percentage`,`.weekly.budget.warningThreshold`),fg:WS(`.weekly.percentage`),when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:GS(`.block.etaMinutes`,`.burn.eta.warnMinutes`,`.burn.eta.errorMinutes`),fg:KS(`.block.etaMinutes`,`.burn.eta.warnMinutes`),when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,fg:`foreground`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{template:`⚡ {{ sparkline .speed.history 24 }}`,fg:`foreground`,when:`{{ ne .speed.history "" }}`},cacheTimer:{template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ if le (minutesUntilReset .cache.expiresAt) 8 }}error{{ else }}{{ if le (minutesUntilReset .cache.expiresAt) 20 }}warning{{ else }}foreground{{ end }}{{ end }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ if le .context.contextLeft 20 }}error{{ else }}{{ if le .context.contextLeft 40 }}warning{{ else }}surface-active{{ end }}{{ end }}`,fg:`{{ if le .context.contextLeft 40 }}button-color-foreground{{ else }}foreground{{ end }}`,when:`{{ gt .context.totalTokens 0 }}`},metrics:{template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,fg:`foreground`,when:`{{ or .metrics.lastResponseTime .metrics.responseTime .metrics.sessionDuration .metrics.messageCount .metrics.linesAdded .metrics.linesRemoved }}`},charsetControl:{template:`{{ .charset.effective }} {{ menu "applyCharsetForever" "▸" "▾" }} {{ action "resetCharset" "↺" }}`,fg:`foreground`},colorCompatControl:{template:`{{ .colorCompatibility.effective }} {{ menu "applyColorCompatForever" "▸" "▾" }} {{ action "resetColorCompat" "↺" }}`,fg:`foreground`},directoryPaletteControl:{template:`🎨 directory {{ menu "applyDirectoryPaletteForever" "▸" "▾" }} {{ action "resetDirectoryPalette" "↺" }}`,fg:`foreground`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`toolbar`},{kind:`group`,name:`settings`,label:`⚙ terminal`,direction:`horizontal`,children:[`charsetControl`,`colorCompatControl`,`directoryPaletteControl`]}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`}]}}},actions:{copySession:{copy:`{{ .session.id }}`},copyDir:{copy:`{{ .current_dir }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},applyCharsetForever:{persist:`charset`,from:`charsets`},resetCharset:{reset:`charset`},applyColorCompatForever:{persist:`colorCompatibility`,from:`colorCompatibilities`},resetColorCompat:{reset:`colorCompatibility`},applyDirectoryPaletteForever:{persist:`segments.directory.palette`,from:`themes`},resetDirectoryPalette:{reset:`segments.directory.palette`}},looks:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`git`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`},{kind:`segment`,name:`toolbar`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}}},editGlobals:{style:`plain`,default_separator:` | `},helpers:{formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`}},JS=new Set([qS.globals.palette,...Object.values(qS.segments).map(e=>e.palette)].filter(e=>e!==void 0)),YS=Jy(uS(`<default>`,JSON.stringify(qS),JS),qS);function XS(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function ZS(e){return typeof e==`string`?e:String(e)}function QS(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function $S(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}const eC=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,tC=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function nC(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(eC);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(tC);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function rC(e){let t=e.match(tC);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function iC(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function aC(e){return e.toLocaleString()}const oC=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],sC=oC.length;function cC(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(sC-1));o+=oC[t]}return o}function lC(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}const uC=Ns(),dC=[...Ls];function fC(){return{basename:{fn:e=>l(e),argTypes:[`string`]},dirname:{fn:e=>u(e),argTypes:[`string`]},abbreviatePath:{fn:e=>iC(e),argTypes:[`string`]},int:{fn:e=>QS(e),argTypes:[`value`]},string:{fn:e=>ZS(e),argTypes:[`value`]},bool:{fn:e=>$S(e),argTypes:[`value`]},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`]},themes:{fn:()=>uC,argTypes:[]},styles:{fn:()=>dC,argTypes:[]},sparkline:{fn:(e,t)=>cC(lC(e),t),argTypes:[`string`,`int`]}}}function pC(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`]},formatInteger:{fn:e=>aC(e),argTypes:[`int`]},round:{fn:e=>Math.round(e),argTypes:[`float`]},formatModelName:{fn:e=>nC(e),argTypes:[`string`]},shortenModelName:{fn:e=>rC(e),argTypes:[`string`]}}}function mC(e,t=()=>new Date){return Gd({fromString:e=>new Ua(e),toString:e=>e.plain,clock:t,missingKey:`error`,funcs:{...Ip(),...Kh(),...Sm(),...Wm(),...Op(t),...vf(),...Xp(),...ys(),...fC(),...pC(t),...e??{}}})}function hC(e){return gC(e,new Set(e.names()),``)}function gC(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return gC(e,t,a)}})}function _C(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(O(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function vC(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}async function yC(e){let t=await xe({bin:`/bin/sh`,args:[`-c`,e],category:`user-shell`});return t.ok?{stdout:t.stdout,exitCode:t.exitCode??0}:{stdout:t.stdout,exitCode:t.exitCode??1}}async function bC(e,t,n){let r;try{r=await T(e,`utf8`)}catch{return{error:`file unreadable: ${e}`}}if(n!==void 0){let t=new RegExp(n).exec(r);return t?.[1]?{content:t[1].replace(/\n/g,` `)}:{error:`regex no-match in "${e}"`}}return t===`first-line`?{content:(r.split(`
166
166
  `)[0]??``).trim()}:{content:r.replace(/\n/g,` `).trim()}}const xC=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],SC=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],CC=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],wC=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function TC(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>xC[e.getMonth()]],[`Monday`,e=>CC[e.getDay()]],[`Jan`,e=>SC[e.getMonth()]],[`Mon`,e=>wC[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 EC={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function DC(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=EC[t];try{return jC(r,e)}catch{return MC(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return dn(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return dn(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return dn(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return dn(e.stashCount,0)}}var OC=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}},kC=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:ae(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ie(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ie(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function AC(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function jC(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`?ZS(e):t===`number`?QS(e):$S(e)}function MC(e){return e===`number`?0:e===`boolean`?!1:``}var NC=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new OC;ttlMgr=new kC;gitSubscriptions=new Map;cleanups=[];inFlight=new Set;engine=mC();gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new uy({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,XS(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=_C(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=hC(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 TC(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,TC(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=EC[t.field],r=t.varDefault===void 0?MC(n):jC(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,DC(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=AC(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,jC(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}getLastError(e){return this.lastErrors.get(e)}dispose(){for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,Y.reaction)(()=>{let t=hC(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,Y.reaction)(()=>t.varNames.map(e=>String(this.store.read(e))).join(`,`),n);this.cleanups.push(e);break}}}async updateFromShell(e,t,n,r){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let{stdout:i,exitCode:a}=await yC(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 bC(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,jC(this.defaultEmptyValue,t))}catch{this.store.setBox(e,MC(t))}}defaultFor(e){try{return jC(this.defaultEmptyValue,e)}catch{return MC(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 PC=new Map,FC=new Map;function IC(e){let t=ks(e),n=PC.get(t);if(n!==void 0)return n;let r=sa(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 PC.set(t,r),r}function LC(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=FC.get(n);if(r!==void 0)return r;let i=ya(e,t);return FC.set(n,i),i}const RC=[`primary`,`secondary`,`accent`],zC=[`surface`,`panel`,`surface-lighten-1`],BC=[.16,.3],VC=BC.reduce((e,t)=>t>e?t:e),HC=BC.flatMap(e=>RC.flatMap(t=>zC.map(n=>({base:n,hue:t,amount:e})))),UC={"van-der-corput":e=>{let t=0,n=.5;for(let r=e;r>0;r>>=1,n/=2)t+=n*(r&1);return t},"golden-angle":e=>e*.6180339887498949%1,"ends-interleaved":(e,t)=>((e%2==0?e/2:t-1-(e-1)/2)+.5)/t,monotonic:(e,t)=>(e+.5)/t,uniform:()=>.5},WC=`van-der-corput`;function GC(e,t,n){let r=0,i=1;for(let{index:a,count:o}of e)r+=t(a,o)*i*n,i*=.37;let a=Math.round(r)%n;return a<0?a+n:a}function KC(e,t,n){let r=e[GC(t,n,e.length)];if(r===void 0)throw Error(`vocabularySelect: empty vocabulary`);return r}const qC=(e,t)=>KC(HC,e,t);function JC(e,t){let n=e.get(t);if(n===void 0)throw Error(`palette "${e.name}" has no "${t}" role; decoration needs it`);return n}function YC(e,{base:t,hue:n,amount:r}){return Si(JC(e,t),JC(e,n),r)}const XC=2.2;function ZC(e,t){let n=HC.filter(e=>e.hue===t&&e.amount===VC).map(t=>YC(e,t)),r=Si(JC(e,`surface`),JC(e,t),.92),i=JC(e,`foreground`),a=Array.from({length:13},(e,t)=>Si(r,i,t/12)).find(e=>n.every(t=>Qi(e,t)>=XC));if(a===void 0)throw Error(`palette "${e.name}": "${t}" cannot clear the ${XC} state floor even at foreground`);return a}function QC(e,t){return[`background`,`foreground`].map(t=>JC(e,t)).reduce((e,n)=>Qi(t,n)>Qi(t,e)?n:e)}const $C={base:.42,perDepth:.14,cap:.75},ew={floor:.12,span:.8};function tw(e,t){return RC[(RC.indexOf(e)+t)%RC.length]}function nw(e,t){let n=`${t.hue}|${t.depth}`,r=rw.get(e);r===void 0&&(r=new Map,rw.set(e,r));let i=r.get(n);if(i!==void 0)return i;let a=ZC(e,tw(t.hue,t.depth)),o=Math.min($C.cap,$C.base+$C.perDepth*t.depth),s={state:a,plane:Si(a,JC(e,`background`),o)};return r.set(n,s),s}const rw=new WeakMap;function iw(e,t,n,r){let{state:i,plane:a}=nw(e,t);return Si(a,i,ew.floor+ew.span*r(n.index,n.count))}function aw(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=ow(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(a.style.link){i();let e=ow([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function ow(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>sw(e,t)):e,r=Ua.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 sw(e,t){let n=e.copy();return n.style=t.add(e.style),n}function cw(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function lw(e,t){let n=Ua.fromFragments(e);return n.end=``,n.noWrap=!0,t!==void 0&&!t.isNull&&(n.style=t),n}function uw(e,t){let{width:n,justify:r,truncate:i,truncateMarker:a=`…`,baseStyle:o,padding:s}=t;if(e.length===0)return[];let c=lw(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 dw=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function fw(e,t,n,r,i,a,o,s){let c={segName:t,palette:n,disclosure:r,bg:void 0};e.current=c;let l=pw(a,s),u=l===void 0?i:mw(n,l,`bg`);c.bg=u;let d=pw(o,s),f=d===void 0?void 0:mw(n,d,`fg`);return new q({bgcolor:mi.fromRgba(u),color:f===void 0?void 0:mi.fromRgba(f)})}function pw(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function mw(e,t,n){try{return Hi(e,t)}catch(e){throw e instanceof zi?new dw(t,n,e.message):e}}const hw=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 gw(e,t,n,r){let i=new Map;for(let[a,o]of Object.entries(t))i.set(a,_w(e,a,o,n,r));return i}function _w(e,t,n,r,i){if(wc(n)){let[a,o]=Tc(n);return vw(r.get(n.persistWhen)??n.persistWhen,n.set,_w(e,t,a,r,i),_w(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:[...Zc(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=hw.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:[...Zc(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:[...Zc(n.insertSegmentFrom,i)]}:{kind:`persist-bounded`,key:n.persist,by:n.by}}return`copy`in n?{kind:`copy`,text:bw(e,n.copy,t)}:`open`in n?{kind:`open`,target:bw(e,n.open,t)}:`reset`in n?{kind:`reset`,key:n.reset}:`undo`in n?{kind:`undo`}:{kind:`redo`}}function vw(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 yw(e,t){return e.kind===`dual`?Ks(xw(t,e.selector))===!0?e.durable:e.session:e}function bw(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function xw(e,t){return e.has(t)?ZS(e.read(t)):``}function Sw(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function Cw(e,t,n,r){let i=new Ua(e,{style:q.combine([r,new q({link:t,bold:n})])});return i.noWrap=!0,i.end=``,i}function ww(e,t){return Math.max(e.members.indexOf(xw(t,e.stateVar)),0)}function Tw(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=xw(r,e.stateVar);return{effects:[{verb:Lt,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=xw(r,e.stateVar);return{effects:[{verb:Lt,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=xw(r,e.stateVar);return{effects:[{verb:Lt,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(ww(e,r)+1)%e.members.length];return{effects:[{verb:Lt,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:Rt,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:zt,args:[Sw(e.text,hC(r))]}],active:!1};case`open`:return{effects:[{verb:Bt,args:[Sw(e.target,hC(r))]}],active:!1};case`persist-literal`:{let t=xw(r,e.stateVar);return{effects:[{verb:Ut,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=xw(r,e.stateVar);return{effects:[{verb:Ut,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(ww(e,r)+1)%e.members.length];return{effects:[{verb:Ut,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:Wt,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:Gt,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:qt,args:[i]}],active:!1};case`redo`:return{effects:[{verb:Jt,args:[i]}],active:!1};case`layout-op`:return{effects:[{verb:Kt,args:[i,e.key,Qc(e.op)]}],active:!1};case`dual`:{let a=yw(e,r),{effects:o,active:s}=Tw(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:Kt,args:[i,e.key,Qc(r)]}],active:!1}}}}function Ew(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:N(`action "${e}"`,n,t.members.length,ww(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 Dw(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}=Ew(e,yw(r,i),t,i),{effects:s,active:c}=Tw(r,a,o,i,xw(i,`session.id`));return Cw(a,Qt(s),c)}function Ow(e){return{action:{fn:(t,...n)=>Dw(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function kw(e,t){return new q({bgcolor:mi.fromRgba(t),color:mi.fromRgba(QC(e,t))})}function Aw(e,t){return kw(e.palette,iw(e.palette,e.disclosure,t,UC[WC]))}function jw(){return{current:null}}function Mw(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 Nw(e){return new Ua(e).cellLength}function Pw(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 Fw(e,t){let n=[];for(let t of e)n.length>0&&n.push(new Ua(` `)),n.push(t);let r=Ua.fromFragments(n);return r.noWrap=t,r.end=``,r}function Iw(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 Lw(e,t){let n=e.compiled.get(t),r=n&&yw(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 Rw(e,t,n,r,i,a,o){let s=Lw(a,e),c=a.compiled.get(e),l=a.store,u=xw(l,`session.id`),d=`stateVar`in s?xw(l,s.stateVar):void 0,f=s.options.map(Nw),p=i?Math.max(1,QS(l.read(`term.cols`))-$s(a.stripStyle)-2*a.padding):1/0,m=Nw(`✕`)+1,h=Nw(`←`)+1+Nw(`→`)+1,g=Pw(f,p,m),_=g.length>1?Pw(f,p,m+h):g,v=parseInt(xw(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>Qt([{verb:Lt,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=Qt([{verb:Lt,args:[u,...S]}]),ee=r?[{verb:Lt,args:[u,...S]}]:[],te=e=>{let{effects:t}=Tw(c,e,e,l,u),n=t.length===1?t[0]:void 0;return n?.verb===`set-state`?Qt([{verb:Lt,args:[...n.args,...r?S:[]]}]):Qt([...t,...ee])},w=[Cw(`✕`,C,!1)];y>0&&w.push(Cw(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];w.push(Cw(t,te(t),t===d,o({index:e,count:s.options.length})))}return y<_.length-1&&w.push(Cw(`→`,x(y+1),!1)),Fw(w,i)}function zw(e,t){return{picker:{fn:(n,r,i,a)=>{let o=Iw(e,r,`set-int`,`an int action ({ set, int: true })`);return Rw(n,{key:o.key,stateVar:o.stateVar},[[o.key,`-1`]],i===!0,a===!0,e,e=>Aw(Mw(t,`picker`),e))},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}const Bw=Symbol(`cc-candybar.menuDrop`);function Vw(e){return e.flatMap(e=>e[Bw]??[])}function Hw(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=Lg(i.segName,e,n.key),s=zg(o),c=Ig(e),l=xw(a.store,o)===c,u=xw(a.store,`session.id`),d=l?tn:c,f=Cw(N(`{{ menu "${e}" }}`,t,2,+!!l),Qt([{verb:Lt,args:[u,o,d,s,`0`]}]),!1);return f[Bw]=l?[Rw(e,{key:s,stateVar:s},[[o,tn],[s,`0`]],n.closeOnPick,n.paged,a,e=>Aw(i,e))]:[],f}const Uw=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Ww(e,t){let n=t[t.length-1],r=Uw(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:Bg(r??{})}}function Gw(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=Ww(t,n);return Hw(t,r,i,e)},argTypes:[`string`,`value`],returnType:`T`}}}function Kw(e){let t={fn:(()=>{let t=Mw(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{...vs(()=>Mw(e,`color`).palette),bgOf:t}}function qw(e){let t=[],n=[];for(let r of e){if(!r.contains(`
167
167
  `)){n.push(r);continue}let e=r.split(`
168
168
  `);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function Jw(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 Yw={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 Jw(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,{index:r,count:e.children.length})))}},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;if(!t.visible)return[];try{if(!cw(i.when,t.scope))return[];let n=i.palette??t.palette,a=t.enterSegment(e.name,n,t.address,i.bg,i.fg),o=i.template.evaluate(t.scope),s=t.exitSegment(o),c=s.length>0?a.trigger:a.closed,l={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:c,padding:t.padding},u=qw(aw(o,c)).map(e=>uw(e,l)),d=s.map(e=>uw(aw([e],a.band),{...l,baseStyle:a.band})),f=[...u,...d];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.name,f.flat()),f}catch(n){let r=n.message??String(n);return t.onSegmentError?.(e.name,r),[[new Ua(`⚠ ${e.name}: ${r}`)]]}}}};function Xw(e){return Yw[e]}function Zw(e){if(`ttl`in e)return{kind:`ttl`,durationMs:vC(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 Qw(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:Zw(n.cache),varDefault:n.default});break;case`shell`:e.declareShell(t,n.command,{regex:n.regex,cache:Zw(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?vC(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 $w(e,t){let n=Mu.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 eT(e,t,n){let r=n?.cwd??process.cwd(),i={store:t.variableStore,compiled:new Map,stripStyle:`powerline`,padding:1},a=jw(),o={action:i,activeSegment:a},s=Object.keys(e.looks),c=Hc(e.presets),l=new Map([...Yc(e),...E_(e)]),u=mC({...Ow(i),...zw(i,a),...Gw(o),...Kw(a),looks:{fn:()=>s,argTypes:[]},presets:{fn:()=>c,argTypes:[]}},n?.clock),d=$w(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=gw(f,e.actions,p,l);let m=[];for(let[n,i]of Object.entries(e.variables))try{Qw(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{Qw(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:IC(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 Xw(e.kind).compile(e,n)},v=new Map;for(let t of c){let{node:n,path:r}=Gc(e,t);v.set(t,_(n,r))}return{segments:h,roots:v,activeSegment:a,menuRuntime:o,loadWarnings:m}}const tT=(e,t)=>{let n=qC(t,UC[WC]);return{tint:YC(e,n),disclosure:{hue:n.hue,depth:0}}};function nT(e,t,n,r,i,a,o,s,c){let{perSegmentSink:l,onSegmentError:u}=s??{},{look:d=Ai,preset:f=Bc}=c??{};r.applyInput({...i,term:{cols:o.width}}),t.menuRuntime.action.stripStyle=o.style,t.menuRuntime.action.padding=o.padding;let p=hC(n),m=LC(a,d);l?.clear();let h=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},g=(e,n,r,i,a)=>{let{tint:o,disclosure:s}=tT(n,r),c=fw(t.activeSegment,e,n,s,o,i,a,p),l=nw(n,s);return{closed:c,trigger:kw(n,l.state),band:kw(n,l.plane)}},_=e=>(t.activeSegment.current=null,Vw(e)),v=(e,t,n)=>{let r={scope:p,palette:m,visible:t&&cw(e.when,p),padding:o.padding,address:n,perSegmentSink:l,onSegmentError:u,enterSegment:g,exitSegment:_,lookupSegment:h,renderChild:(e,t,r)=>v(e,t,[...n,r])};return Xw(e.kind).render(e,r)},y=t.roots.get(f);if(y===void 0)throw Error(`Preset "${f}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${Bc}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);return v(y,!0,[]).map(e=>ec(e,o)).join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.52.0",
3
+ "version": "1.53.0",
4
4
  "description": "Statusline renderer for Claude Code — a JSON5-configurable DSL with daemon-cached data sources, byte-clean palette-aware composition, and OSC8 click verbs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -90,9 +90,9 @@
90
90
  "mobx": "^6.15.0"
91
91
  },
92
92
  "optionalDependencies": {
93
- "@promptctl/cc-candybar-darwin-arm64": "1.52.0",
94
- "@promptctl/cc-candybar-darwin-x64": "1.52.0",
95
- "@promptctl/cc-candybar-linux-x64": "1.52.0",
96
- "@promptctl/cc-candybar-linux-arm64": "1.52.0"
93
+ "@promptctl/cc-candybar-darwin-arm64": "1.53.0",
94
+ "@promptctl/cc-candybar-darwin-x64": "1.53.0",
95
+ "@promptctl/cc-candybar-linux-x64": "1.53.0",
96
+ "@promptctl/cc-candybar-linux-arm64": "1.53.0"
97
97
  }
98
98
  }