@promptctl/cc-candybar 1.28.0 → 1.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import{createRequire as e}from"node:module";import t from"node:process";import{json as n}from"node:stream/consumers";import r,{createReadStream as i,existsSync as a,statSync as o,watch as s}from"node:fs";import c,{basename as l,dirname as u,join as d}from"node:path";import f,{homedir as p}from"node:os";import{spawn as m,spawnSync as h}from"node:child_process";import g from"node:net";import{URL as _,URLSearchParams as v,fileURLToPath as y}from"node:url";import{parseArgs as b}from"node:util";import{get as x}from"node:https";import{createHash as S}from"node:crypto";import{setTimeout as C}from"node:timers/promises";import{open as ee,readFile as te,readdir as w,stat as ne}from"node:fs/promises";import{createInterface as re}from"node:readline";import{clearInterval as ie,setInterval as T}from"node:timers";import E from"node:v8";var ae=Object.create,oe=Object.defineProperty,se=Object.getOwnPropertyDescriptor,ce=Object.getOwnPropertyNames,le=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty,de=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),fe=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ce(t),a=0,o=i.length,s;a<o;a++)s=i[a],!ue.call(e,s)&&s!==n&&oe(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=se(t,s))||r.enumerable});return e},pe=(e,t,n)=>(n=e==null?{}:ae(le(e)),fe(t||!e||!e.__esModule?oe(n,`default`,{value:e,enumerable:!0}):n,e));function D(e,...t){process.env.CC_CANDYBAR_DEBUG&&console.error(`[DEBUG] ${e}`,...t)}const me={"click.pbcopy":1e3,"click.open":1e3},he=new Map;function ge(e){let t=me[e];if(t===void 0)return{allowed:!0};let n=he.get(e);if(n===void 0)return{allowed:!0};let r=Date.now()-n;return r>=t?{allowed:!0}:{allowed:!1,minIntervalMs:t,sinceLastMs:r}}function _e(e){he.set(e,Date.now())}function O(e,t,n){return{ok:!1,reason:`rate-limited`,stdout:``,stderr:``,exitCode:null,signal:null,error:`rate-limited: ${e} min interval ${t}ms, last start ${n}ms ago`}}let ve=null;function ye(e){ve=e}async function be(e){let t=ge(e.category);if(!t.allowed)return O(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();return ve?.onStart(e.category),new Promise(t=>{let r;try{r=m(e.bin,e.args??[],{cwd:e.cwd,env:e.env,stdio:[`pipe`,`pipe`,`pipe`]})}catch(r){ve?.onEnd(e.category,Date.now()-n),t({ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:r instanceof Error?r.message:String(r)});return}let i=``,a=``,o=!1,s=null,c=null,l=!1,u=r=>{o||(o=!0,s&&clearTimeout(s),c&&clearTimeout(c),ve?.onEnd(e.category,Date.now()-n),t(r))};r.stdout?.on(`data`,e=>{i+=e.toString(`utf8`)}),r.stderr?.on(`data`,e=>{a+=e.toString(`utf8`)}),r.on(`error`,e=>{u({ok:!1,reason:`spawn-error`,stdout:i,stderr:a,exitCode:null,signal:null,error:e.message})}),r.on(`close`,(e,t)=>{if(l){u({ok:!1,reason:`timeout`,stdout:i,stderr:a,exitCode:e,signal:t});return}if(e===0){u({ok:!0,stdout:i,stderr:a,exitCode:e});return}u({ok:!1,reason:t?`signal`:`non-zero`,stdout:i,stderr:a,exitCode:e,signal:t})}),e.timeoutMs&&e.timeoutMs>0&&(s=setTimeout(()=>{l=!0,r.pid!==void 0&&(r.kill(`SIGTERM`),c=setTimeout(()=>{r.kill(`SIGKILL`)},250))},e.timeoutMs)),e.stdinInput!==void 0&&r.stdin?r.stdin.end(e.stdinInput):r.stdin&&r.stdin.end()})}function xe(e){let t=ge(e.category);if(!t.allowed)return O(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();ve?.onStart(e.category);let r=[`pipe`,`pipe`,`pipe`];try{let t=h(e.bin,e.args??[],{cwd:e.cwd,env:e.env,input:e.stdinInput,timeout:e.timeoutMs&&e.timeoutMs>0?e.timeoutMs:void 0,stdio:r,encoding:`utf8`});ve?.onEnd(e.category,Date.now()-n);let i=typeof t.stdout==`string`?t.stdout:``,a=typeof t.stderr==`string`?t.stderr:``;if(t.error)return{ok:!1,reason:t.error.code===`ETIMEDOUT`?`timeout`:`spawn-error`,stdout:i,stderr:a,exitCode:null,signal:t.signal??null,error:t.error.message};if(t.status===0)return{ok:!0,stdout:i,stderr:a,exitCode:t.status};let o=e.timeoutMs!==void 0&&e.timeoutMs>0;return{ok:!1,reason:t.signal?o&&t.signal===`SIGTERM`?`timeout`:`signal`:`non-zero`,stdout:i,stderr:a,exitCode:t.status,signal:t.signal??null}}catch(t){return ve?.onEnd(e.category,Date.now()-n),{ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:t instanceof Error?t.message:String(t)}}}function Se(e){let t=ge(e.category);if(!t.allowed)return O(e.category,t.minIntervalMs,t.sinceLastMs);_e(e.category);let n=Date.now();ve?.onStart(e.category);let r=Ce(e);return ve?.onEnd(e.category,Date.now()-n),r}function Ce(e){let t;try{t=m(e.bin,e.args??[],{cwd:e.cwd,env:e.env,detached:!0,stdio:`ignore`})}catch(e){return{ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:e instanceof Error?e.message:String(e)}}return t.once(`error`,()=>{}),t.pid===void 0?{ok:!1,reason:`spawn-error`,stdout:``,stderr:``,exitCode:null,signal:null,error:`spawn(${e.bin}): no pid (binary not found or unexecutable)`}:(t.unref(),{ok:!0,stdout:``,stderr:``,exitCode:null})}function we(e){let t=process.env[e];return t&&t.length>0?t:void 0}function Te(){let e=we(`XDG_STATE_HOME`)??c.join(f.homedir(),`.local`,`state`);return c.join(e,`cc-candybar`)}function Ee(){let e=we(`XDG_CACHE_HOME`)??c.join(f.homedir(),`.cache`);return c.join(e,`cc-candybar`)}function De(){return Te()}function Oe(){let e=process.env.CC_CANDYBAR_SOCKET;if(e)return e;let t=f.userInfo().uid;return c.join(`/tmp`,`cc-candybar-${t}`,`socket`)}function ke(e){r.mkdirSync(e,{recursive:!0,mode:448});let t=r.lstatSync(e);if(t.isSymbolicLink())throw Error(`directory is a symlink: ${e}`);if(!t.isDirectory())throw Error(`not a directory: ${e}`);let n=f.userInfo().uid;if(typeof n==`number`&&t.uid!==n)throw Error(`directory is not owned by uid ${n}: ${e} (owner uid=${t.uid})`);if(t.mode&63)throw Error(`directory has unsafe permissions: ${e} (mode=${(t.mode&511).toString(8)}, expected 0700)`)}function Ae(e){ke(c.dirname(e));for(let t of[e,k(e)])try{if(r.lstatSync(t).isSymbolicLink())throw Error(`path is a symlink: ${t}`)}catch(e){if(e.code!==`ENOENT`)throw e}}function k(e){return`${e}.lease`}function je(){return k(Oe())}function Me(){return c.join(Te(),`session-state.json`)}function Ne(){return c.join(Te(),`config-overrides.json`)}function Pe(){let e=process.env.CC_CANDYBAR_DAEMON_REGISTRY_DIR;if(e)return e;let t=f.userInfo().uid;return c.join(`/tmp`,`cc-candybar-${t}`,`daemons`)}function Fe(){return c.join(Te(),`spawn.lock`)}function Ie(){return c.join(Te(),`spawn.cooldown`)}function Le(){return c.join(Te(),`spawn.backoff`)}function Re(){return c.join(Te(),`daemon.log`)}const ze=1e4;function Be(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>ze?ze:t}var Ve=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function He(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function Ue(e,t){let n=Buffer.alloc(0);return function(r){for(n=Buffer.concat([n,r]);n.length>=4;){let r=n.readUInt32BE(0);if(r>16777216){t(new Ve(`frame too large: ${r}`));return}if(n.length<4+r)return;let i=n.subarray(4,4+r);n=n.subarray(4+r);try{e(JSON.parse(i.toString(`utf8`)))}catch(e){let n=new Ve(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function We(e,t,n){return new Promise((r,i)=>{let a=!1,o=t=>{if(!a){a=!0,clearTimeout(s),e.removeAllListeners();try{t()}catch{}}},s=setTimeout(()=>{o(()=>{e.destroy(),i(Error(`TIMEOUT`))})},n),c=Ue(e=>o(()=>r(e)),e=>o(()=>i(e)));e.on(`data`,c),e.on(`error`,e=>o(()=>i(e))),e.on(`close`,()=>o(()=>i(Error(`socket closed before response`)))),e.write(He(t))})}async function Ge(e,t,n){let r=null;try{r=await Xe(Oe(),t.connectMs);let i=await We(r,{v:3,...e},t.budgetMs);return Je(e.kind,i,n)}catch(e){return Ye(e)}finally{r&&r.destroy()}}function Ke(e,t){return typeof e==`string`?e:t}function qe(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function Je(e,t,n){let r=t;if(r.ok===!0){let r=n(t);return r===void 0?{kind:`permanent`,cause:`malformed_response`,message:`ok response without payload for "${e}" request`}:{kind:`ok`,value:r}}let i=Ke(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:qe(r.daemonV)};case`TIMEOUT`:return{kind:`transient`,cause:`timeout`,message:i};case`BAD_REQUEST`:return{kind:`permanent`,cause:`bad_request`,message:i};case`RENDER_FAILED`:return{kind:`permanent`,cause:`render_failed`,message:i};default:return{kind:`permanent`,cause:`malformed_response`,message:`unknown error code: ${String(r.code)}`}}}function Ye(e){if(e instanceof Ve||e instanceof SyntaxError)return{kind:`permanent`,cause:`malformed_response`,message:e instanceof Error?e.message:String(e)};let t=e instanceof Error?e.message:String(e);return t===`CONNECT_TIMEOUT`||t===`TIMEOUT`?{kind:`transient`,cause:`timeout`,message:t}:t.includes(`ECONNREFUSED`)||t.includes(`ENOENT`)||t.includes(`ENOTSOCK`)?{kind:`transient`,cause:`unreachable`,message:t}:{kind:`transient`,cause:`io_error`,message:t}}function Xe(e,t){return new Promise((n,r)=>{let i=g.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function Ze(e){if(e.kind===`transient`)return`daemon unavailable (${e.cause}: ${e.message})\nHint: daemon may not be running. Run \`cc-candybar\` once to spawn it.`;switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`daemon protocol mismatch (client v${e.clientV} ≠ daemon ${t})`}case`bad_request`:case`render_failed`:case`malformed_response`:return`daemon error (${e.cause}): ${e.message}`}}const Qe={connectMs:50,budgetMs:150},$e={connectMs:50,budgetMs:200};function et(e){let t=e.output;return typeof t==`string`?t:void 0}function tt(e,t,n,r){return Ge({kind:`render`,hookData:e,args:t,cwd:n,termCols:r},Qe,et)}function nt(e,t){return Ge({kind:`click`,verb:e,value:t},$e,et)}function rt(e={}){if(yt()!==null)return;let n=e.spawn??bt,r=gt();if(r.kind===`contended`){let e=at();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),it(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),it(n);return}try{it(n)}finally{vt()}}function it(e){ft()&&ot(e)}function at(){try{let e=r.statSync(Fe());return Date.now()-e.mtimeMs}catch{return null}}function ot(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
3
3
  `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function st(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function ct(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function lt(e){try{let t=r.readFileSync(e,`utf8`).trim(),n=Number(t);return!Number.isInteger(n)||n<0?0:Math.min(n,5)}catch{return 0}}function ut(e,n){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,String(n),{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.backoff: ${e.message}\n`)}}function dt(){try{r.unlinkSync(Le())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function ft(){let e=Ie(),n=Le(),r=lt(n),i=st(pt(e),ct(r));return i.kind===`deny`?!1:(i.kind===`allow-future-garbage`&&t.stderr.write(`cc-candybar: spawn.cooldown mtime is ${i.futureMs}ms in the future — ignoring and spawning\n`),mt(e),ut(n,Math.min(r+1,5)),!0)}function pt(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function mt(e){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,`${t.pid} ${Date.now()}\n`,{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.cooldown: ${e.message}\n`)}}let ht=null;function gt(){let e=Fe();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return ht={fd:n,path:e},{kind:`held`}}catch(t){let n=t.code;if(n!==`EEXIST`)return{kind:`error`,reason:`openSync(${e}): ${n??t.message}`}}if(!_t(e))return{kind:`contended`};try{r.unlinkSync(e)}catch(e){if(e.code!==`ENOENT`)return{kind:`error`,reason:`unlink stale spawn.lock: ${e.message}`}}}return{kind:`contended`}}function _t(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function vt(){if(!ht)return;let{fd:e,path:t}=ht;ht=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function yt(){try{return r.mkdirSync(De(),{recursive:!0}),null}catch(e){return`mkdir ${De()}: ${e.message}`}}function bt(){let e=t.execPath,n=t.argv[1];return n?Se({bin:e,args:[`--max-old-space-size=400`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const xt=`cc-candybar`,St=`dispatch`,Ct=`set-state`,wt=`step-state`,Tt=`copy`,Et=`open-vscode`,Dt=`show-config-error`,Ot=`show-config-warning`,kt=`set-config`,At=`step-config`,jt=`reset-config`;function Mt(e){return e.map(encodeURIComponent).join(`/`)}function Nt(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function Pt(e){return`${xt}://${St}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${Mt(e.args)}`)}`).join(`&`)}`}function Ft(e){return new v(e).getAll(`e`).map(A)}function A(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const It=`closed`;function j(e,t){return{kind:`state`,key:e,default:t}}function Lt(e,t){return{set:e,cycle:[It,t]}}const Rt=`@promptctl/cc-candybar`,zt=`CCCandybarURLHandler`,Bt=[],Vt={"darwin-arm64":`@promptctl/cc-candybar-darwin-arm64`,"darwin-x64":`@promptctl/cc-candybar-darwin-x64`,"linux-x64":`@promptctl/cc-candybar-linux-x64`,"linux-arm64":`@promptctl/cc-candybar-linux-arm64`};function Ht(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function Ut(e,t){return[e,...t].map(Ht).join(` `)}function Wt(){return c.join(f.homedir(),`Applications`,`${zt}.app`)}function Gt(){return c.join(f.homedir(),`.claude`,`settings.json`)}function Kt(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function qt(){if(process.platform===`darwin`)return c.join(f.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(f.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function Jt(){return c.join(qt(),`bin`,`cc-candybar`)}function Yt(){return c.join(qt(),`dist`,`index.mjs`)}function Xt(e,t){return[`on open location L`,`\tdo shell script "'${e.replace(/"/g,`\\"`)}' '${t.replace(/"/g,`\\"`)}' url-handle " & quoted form of L`,`end open location`].join(`
4
- `)}function Zt(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:c.resolve(c.dirname(e),`..`,`dist`,`index.mjs`)}function Qt(t){let n=Vt[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:c.resolve(c.dirname(t),`..`,`bin`,`cc-candybar`)}}function $t(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function en(e){let t=r.openSync(e,`r`);try{let n=Buffer.alloc(2),i=r.readSync(t,n,0,2,0);if(i<2)throw Error(`install: staged render entry at ${e} is truncated (${i} byte(s)). Re-run: pnpm dlx ${Rt}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function tn(){let e=Zt(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=Qt(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(Yt()),{recursive:!0}),r.mkdirSync(c.dirname(Jt()),{recursive:!0}),$t(e,Yt()),$t(t.sourcePath,Jt()),r.chmodSync(Jt(),493),r.rmSync(c.join(qt(),`url-handler.mjs`),{force:!0});let n=en(Jt());return process.stdout.write(`Staged cc-candybar v1.28.0 runtime at ${qt()}\n`+(n===`native`?` render entry: native binary (${process.platform}-${process.arch})\n`:` render entry: node shim (no native binary for ${process.platform}-${process.arch}; renders are correct but pay node startup)\n`)),{binPath:Jt(),distPath:Yt(),entryKind:n}}function nn(){return[{key:`CFBundleIdentifier`,xml:`<string>com.cccandybar.url-handler</string>`},{key:`CFBundleURLTypes`,xml:[`<array>`,` <dict>`,` <key>CFBundleURLName</key>`,` <string>Claude Powerline Click Action</string>`,` <key>CFBundleURLSchemes</key>`,` <array>`,` <string>${xt}</string>`,` </array>`,` </dict>`,`</array>`].join(`
4
+ `)}function Zt(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:c.resolve(c.dirname(e),`..`,`dist`,`index.mjs`)}function Qt(t){let n=Vt[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:c.resolve(c.dirname(t),`..`,`bin`,`cc-candybar`)}}function $t(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function en(e){let t=r.openSync(e,`r`);try{let n=Buffer.alloc(2),i=r.readSync(t,n,0,2,0);if(i<2)throw Error(`install: staged render entry at ${e} is truncated (${i} byte(s)). Re-run: pnpm dlx ${Rt}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function tn(){let e=Zt(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=Qt(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(Yt()),{recursive:!0}),r.mkdirSync(c.dirname(Jt()),{recursive:!0}),$t(e,Yt()),$t(t.sourcePath,Jt()),r.chmodSync(Jt(),493),r.rmSync(c.join(qt(),`url-handler.mjs`),{force:!0});let n=en(Jt());return process.stdout.write(`Staged cc-candybar v1.29.0 runtime at ${qt()}\n`+(n===`native`?` render entry: native binary (${process.platform}-${process.arch})\n`:` render entry: node shim (no native binary for ${process.platform}-${process.arch}; renders are correct but pay node startup)\n`)),{binPath:Jt(),distPath:Yt(),entryKind:n}}function nn(){return[{key:`CFBundleIdentifier`,xml:`<string>com.cccandybar.url-handler</string>`},{key:`CFBundleURLTypes`,xml:[`<array>`,` <dict>`,` <key>CFBundleURLName</key>`,` <string>Claude Powerline Click Action</string>`,` <key>CFBundleURLSchemes</key>`,` <array>`,` <string>${xt}</string>`,` </array>`,` </dict>`,`</array>`].join(`
5
5
  `)}]}function rn(e){let t=Wt();r.mkdirSync(c.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=xe({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,Xt(process.execPath,e)],category:`install.osacompile`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`osacompile failed (${n.reason})`);let i=c.join(t,`Contents`,`Info.plist`);for(let{key:e}of nn())xe({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of nn()){let n=xe({bin:`/usr/bin/plutil`,args:[`-insert`,e,`-xml`,t,i],category:`install.plutil`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`plutil -insert ${e} failed (${n.reason})`)}process.stdout.write(`Registering ${xt}:// with Launch Services\n`);let a=xe({bin:`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister`,args:[`-f`,t],category:`install.lsregister`});if(!a.ok)throw process.stderr.write(a.stderr),Error(`lsregister failed (${a.reason})`);process.stdout.write(`✓ ${zt}.app installed and registered.\n`),process.stdout.write(` Test: open '${xt}://hello-world' && pbpaste\n`)}function M(){Kt(),rn(tn().distPath)}function an(e,t=xt){let n=`${t}://`;if(!e.startsWith(n))throw Error(`expected ${n} scheme, got: ${e}`);let r=e.slice(n.length),i=r.indexOf(`/`);return i===-1?{verb:Tt,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function on(e){e||(process.stderr.write(`url-handle: missing URL argument.
6
6
  `),process.exit(1));let t;try{t=an(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await nt(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(rt(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(sn(n)+`
7
7
  `),process.exit(1)}function sn(e){switch(e.cause){case`version_mismatch`:return`url-handle: daemon rejected click (version mismatch: client v${e.clientV} ≠ daemon v${e.daemonV})`;case`bad_request`:return`url-handle: daemon rejected click (bad request: ${e.message})`;case`render_failed`:return`url-handle: daemon rejected click (handler failed: ${e.message})`;case`malformed_response`:return`url-handle: daemon rejected click (malformed response: ${e.message})`}}function cn(){return`✓ install complete.
@@ -101,7 +101,7 @@ Use 'override' annotation for methods overridden by subclass.`)}}var ta=oa(0),na
101
101
  Replace: layout: [["seg1", "seg2"], ["seg3"]]
102
102
  With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
103
103
  Single-row example: root: { h: ["seg1", "seg2"] }`,line:Z(e.source,[`layout`])}),t.root!==void 0&&(n.root=ou(e,`root`,t.root)),t.actions!==void 0&&(n.actions=yg(e,t.actions)),t.looks!==void 0&&(n.looks=Yg(e,t.looks)),t.presets!==void 0&&(n.presets=Zg(e,t.presets)),t.helpers!==void 0&&(n.helpers=Qg(e,t.helpers)),_u(e,n),mg(e,n),n}const U_=new Set([`globals`,`variables`,`segments`,`layout`,`root`,`actions`,`looks`,`presets`,`helpers`]),W_=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function G_(e){let t;try{t=JSON.parse(e)}catch{return null}let n=t.message?.usage;if(!((n?.cache_read_input_tokens??0)>0||(n?.cache_creation_input_tokens??0)>0))return null;let r=t.timestamp==null?NaN:Date.parse(t.timestamp);return Number.isNaN(r)?null:r}async function K_(e){let t=await q_(e);return t.kind===`ok`?I(Math.floor((t.value+36e5)/1e3)):t}async function q_(e){for(let t of[65536,1048576]){let n=await Tr(e,t);if(n.kind!==`ok`)return n;let r=J_(n.value.buf,n.value.fromStart);if(r!=null)return I(r);if(n.value.fromStart)return L}return L}function J_(e,t){let n=e.toString(`utf8`).split(`
104
- `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!W_.test(t))continue;let r=G_(t);if(r!=null)return r}return null}const Y_=10*1e3;function X_(e,t,n,r){let i=n-(t*1e3-r);if(i<3e5||e<=0)return;let a=e/i,o=(100-e)/a;return Math.max(0,Math.round(o/6e4))}function Z_(e,t){if(!(t<60))return e*3600/t}function Q_(e,t,n,r){let i=r-t;if(i<50||i>Y_)return;let a=n-e;if(!(a<=0))return a*1e3/i}function $_(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Q_(t.input,t.atMs,n.input,n.atMs),i=Q_(t.output,t.atMs,n.output,n.atMs),a=Q_(t.total,t.atMs,n.total,n.atMs);if(!(r===void 0&&i===void 0&&a===void 0))return{...r!==void 0&&{input:r},...i!==void 0&&{output:i},...a!==void 0&&{total:a}}}function ev(e){let{samples:t}=e,n=[];for(let e=1;e<t.length;e++){let r=t[e-1],i=t[e],a=i.atMs-r.atMs;if(a<50||a>Y_)continue;let o=Q_(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function tv(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,r);for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,i);let n=[],r=new Set;for(let t of Jr(e.root)){if(t.when)for(let e of __(t.when))n.push(e);if(t.kind!==`segment`)continue;let r=e.segments[t.name];if(r){for(let e of[r.template,r.when,r.bg,r.fg])if(e)for(let t of __(e))n.push(t)}}let i=new Set;for(;n.length>0;){let e=n.pop();for(let a of nv(t,e)){if(r.has(a))continue;r.add(a);let e=t.get(a);if(e){if(e.kind===`input`)i.add(e.path);else if(e.kind===`template`)for(let t of __(e.template))n.push(t)}}}return i}function nv(e,t){let n=t;for(;n.length>0;){if(e.has(n))return[n];let t=n.lastIndexOf(`.`);if(t<0)break;n=n.slice(0,t)}let r=`${t}.`,i=[];for(let t of e.keys())t.startsWith(r)&&i.push(t);return i}function rv(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function iv(e){let t=t=>e.has(t),n=t(`git.staged`)||t(`git.unstaged`)||t(`git.untracked`)||t(`git.conflicts`);return{...t(`git.sha`)&&{showSha:!0},...n&&{showWorkingTree:!0},...t(`git.stash`)&&{showStashCount:!0},...t(`git.upstream`)&&{showUpstream:!0},...t(`git.repoName`)&&{showRepoName:!0},...t(`git.repoUrl`)&&{showRepoUrl:!0},...t(`git.operation`)&&{showOperation:!0},...t(`git.timeSinceCommit`)&&{showTimeSinceCommit:!0},...(t(`git.prNumber`)||t(`git.prState`)||t(`git.prUrl`)||t(`git.prError`))&&{showPullRequest:!0}}}async function av(e,t,n,r,i){let a=e=>rv(r,e),o=(t.clock??(()=>new Date))().getTime(),s=(e,t,n)=>t?n().catch(t=>Ln(`${e}: ${String(t)}`)):Promise.resolve(L),[c,l,u,d,f,p,m,h]=await Promise.all([s(`git`,a(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,iv(r),e.workspace?.project_dir)),s(`session`,a(`session.cost`)||a(`session.tokens`)||a(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),s(`today`,a(`today`),()=>t.usageStore.getTodayInfo(e)),s(`context`,a(`context`),()=>t.contextProvider.getContextInfo(e)),s(`metrics`,a(`metrics`)||a(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),s(`tmux`,a(`tmux`),()=>t.tmuxService.getSessionId()),s(`cache`,a(`cache`),()=>K_(e.transcript_path)),s(`speed`,a(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,o))]),g=[],_=e=>{if(e.kind===`failed`){g.push(e.reason);return}return e.kind===`ok`?e.value:void 0},v=cv(c);g.push(...v.failures);let y=_(l),b=_(u),x=_(d),S=_(f),C=_(p),ee=_(m);for(let e of g)t.log(`warn`,`provider fetch failed: ${e}`);let te=e.rate_limits?.five_hour,w=e.rate_limits?.seven_day,ne=te?X_(te.used_percentage,te.resets_at,18e6,o):void 0,re=w?X_(w.used_percentage,w.resets_at,6048e5,o):void 0,ie=y?.session.cost,T=S?.sessionDuration,E=a(`burn`)&&ie!=null&&T!=null?Z_(ie,T):void 0,ae=_(h),oe=ae===void 0?void 0:$_(ae),se=ae===void 0?void 0:ev(ae),ce=oe!==void 0||se!==void 0?{...oe,...se!==void 0&&{history:se}}:void 0,le=sv(process.env.HOME??process.env.USERPROFILE),ue=e.workspace?{...e.workspace,current_dir:sv(e.workspace.current_dir)??``,project_dir:sv(e.workspace.project_dir)??``}:e.workspace,de=y===void 0?void 0:ov({cost:y.session.cost,tokens:y.session.tokens}),fe=b===void 0?void 0:{cost:b.cost,tokens:b.tokens},pe=S===void 0?void 0:ov({lastResponseTime:S.lastResponseTime,responseTime:S.responseTime,sessionDuration:S.sessionDuration,messageCount:S.messageCount,linesAdded:S.linesAdded,linesRemoved:S.linesRemoved});return{...e,...ue!==void 0&&{workspace:ue},...le!==void 0&&{home:le},...v.git!==void 0&&{git:v.git},...C!==void 0&&{tmux:{session:C}},theme:{effective:i.theme},look:{effective:i.look},preset:{effective:i.preset},style:{effective:i.style},charset:{effective:i.charset},colorCompatibility:{effective:i.colorCompatibility},autoWrap:{effective:i.autoWrap},padding:{effective:i.padding},...de!==void 0&&{session:de},...fe!==void 0&&{today:fe},...E!==void 0&&{burn:{costPerHour:E}},...ce!==void 0&&{speed:ce},...a(`block`)&&te!==void 0&&{block:{nativeUtilization:te.used_percentage,resetsAt:te.resets_at,...ne!==void 0&&{etaMinutes:ne}}},...w!==void 0&&{weekly:{percentage:w.used_percentage,resetsAt:w.resets_at,...re!==void 0&&{etaMinutes:re}}},...ee!==void 0&&{cache:{expiresAt:ee}},...x!==void 0&&{context:{totalTokens:x.totalTokens,contextLeft:x.contextLeftPercentage}},...pe!==void 0&&{metrics:pe}}}function ov(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function sv(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function cv(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const lv=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,uv=`{{ \$dir := .current_dir }}{{ if and (ne .home "") (or (eq .home .current_dir) (hasPrefix (printf "%s/" .home) .current_dir)) }}{{ \$dir = printf "~%s" (trimPrefix .home .current_dir) }}{{ else }}{{ if or (eq .project_dir .current_dir) (hasPrefix (printf "%s/" .project_dir) .current_dir) }}{{ $dir = ternary (${lv}) (basename .project_dir) (ne (${lv}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,dv={branch:`primary`,staged:`success`,unstaged:`warning`,untracked:`accent`,conflicts:`error`,ahead:`success`,behind:`warning`,stash:`accent`},fv=(e,t)=>`{{ fg (color "${dv[e]}") ${t} }}`,pv=`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,mv=`{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} ({{ \$first := true }}{{ if gt .git.staged 0 }}${fv(`staged`,`(printf "+%v" .git.staged)`)}{{ $first = false }}{{ end }}{{ if gt .git.unstaged 0 }}{{ if not $first }} {{ end }}${fv(`unstaged`,`(printf "~%v" .git.unstaged)`)}{{ $first = false }}{{ end }}{{ if gt .git.untracked 0 }}{{ if not $first }} {{ end }}${fv(`untracked`,`(printf "?%v" .git.untracked)`)}{{ $first = false }}{{ end }}{{ if gt .git.conflicts 0 }}{{ if not $first }} {{ end }}${fv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ $first = false }}{{ end }}){{ end }}`,hv=`{{ if ne .git.repoName "" }}{{ .git.repoName }} {{ end }}⎇ ${fv(`branch`,`.git.branch`)}{{ if .git.sha }} ♯ {{ .git.sha }}{{ end }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${fv(`ahead`,`(printf "↑%v" .git.ahead)`)}{{ end }}{{ if gt .git.behind 0 }}${fv(`behind`,`(printf "↓%v" .git.behind)`)}{{ end }}{{ end }}`+mv+`{{ if .git.upstream }} →{{ .git.upstream }}{{ end }}{{ if gt .git.stash 0 }} ${fv(`stash`,`(printf "⧇ %v" .git.stash)`)}{{ end }} {{ if eq .git.status "conflicts" }}{{ fg (color "error") "⚠" }}{{ else }}{{ if eq .git.status "dirty" }}{{ fg (color "warning") "●" }}{{ else }}{{ fg (color "success") "✓" }}{{ end }}{{ end }}`;function gv(e,t){return`{{ if ge (round ${e}) ${t} }}error{{ else }}{{ if ge (round ${e}) 50 }}warning{{ else }}panel{{ end }}{{ end }}`}function _v(e){return`{{ if ge (round ${e}) 50 }}button-color-foreground{{ else }}foreground{{ end }}`}function vv(e,t,n){return`{{ if lt ${e} 0 }}panel{{ else }}{{ if lt ${e} ${n} }}error{{ else }}{{ if lt ${e} ${t} }}warning{{ else }}panel{{ end }}{{ end }}{{ end }}`}function yv(e,t){return`{{ if lt ${e} 0 }}foreground{{ else }}{{ if lt ${e} ${t} }}button-color-foreground{{ else }}foreground{{ end }}{{ end }}`}const bv={globals:{palette:`tokyo-night`},variables:{current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},"session.id":{kind:`input`,path:`session_id`,default:``},version:{kind:`input`,path:`version`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"hue.step":{kind:`literal`,value:14},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},activeStyle:{kind:`state`,key:`style`,default:``}},segments:{directory:{template:uv,bg:`surface`,fg:`foreground`},model:{template:`✱ {{ formatModelName .model.display_name }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .model.display_name "" }}`},sessionId:{template:`⌗{{ trunc 8 .session.id }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .session.id "" }}`},version:{template:`◈ v{{ .version }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .version "" }}`},tmux:{template:`tmux:{{ .tmux.session | default "none" }}`,bg:`surface-active`,fg:`foreground`,when:`{{ ne .tmux.session "" }}`},git:{template:hv,bg:`surface-active`,fg:pv,when:`{{ ne .git.branch "" }}`},gitaculous:{template:`(git){{ if ne .git.repoName "" }} {{ .git.repoName }}{{ end }}{{ if ne .git.operation "" }} [{{ .git.operation }}]{{ end }}{{ if ne .git.sha "" }} {{ .git.sha }}{{ end }}{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} {{ if gt .git.staged 0 }}${fv(`staged`,`"S"`)}{{ end }}{{ if gt .git.unstaged 0 }}${fv(`unstaged`,`"U"`)}{{ end }}{{ if gt .git.untracked 0 }}${fv(`untracked`,`"?"`)}{{ end }}{{ if gt .git.conflicts 0 }}${fv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ end }}{{ end }} ⎇ ${fv(`branch`,`.git.branch`)}{{ if ne .git.upstream "" }} [{{ .git.upstream }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${fv(`ahead`,`(printf "+%v" .git.ahead)`)}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}${fv(`behind`,`(printf "-%v" .git.behind)`)}{{ end }}{{ end }}]{{ end }}{{ if gt .git.stash 0 }} ${fv(`stash`,`(printf "(%v stashed)" .git.stash)`)}{{ end }}{{ if gt .git.timeSinceCommit 0 }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,bg:`surface-active`,fg:pv,when:`{{ ne .git.branch "" }}`},gitPr:{template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,bg:`surface-active`,fg:`foreground`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{template:`{{ action "copySession" "⎘ id" }} {{ action "openProject" "↗ proj" }} {{ action "openTranscript" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,bg:`surface`,fg:`foreground`},session:{template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .session.budget.amount "warn" .session.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},today:{template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .today.budget.amount "warn" .today.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},block:{template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .block.resetsAt) }})`,bg:gv(`.block.nativeUtilization`,`.block.budget.warningThreshold`),fg:_v(`.block.nativeUtilization`),when:`{{ gt .block.resetsAt 0 }}`},weekly:{template:`◑ {{ round .weekly.percentage }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .weekly.resetsAt) }})`,bg:gv(`.weekly.percentage`,`.weekly.budget.warningThreshold`),fg:_v(`.weekly.percentage`),when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:vv(`.block.etaMinutes`,`.burn.eta.warnMinutes`,`.burn.eta.errorMinutes`),fg:yv(`.block.etaMinutes`,`.burn.eta.warnMinutes`),when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,bg:`panel`,fg:`foreground`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{template:`⚡ {{ sparkline .speed.history 24 }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .speed.history "" }}`},cacheTimer:{template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,bg:`surface`,fg:`{{ if le (minutesUntilReset .cache.expiresAt) 8 }}error{{ else }}{{ if le (minutesUntilReset .cache.expiresAt) 20 }}warning{{ else }}foreground{{ end }}{{ end }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ if le .context.contextLeft 20 }}error{{ else }}{{ if le .context.contextLeft 40 }}warning{{ else }}surface-active{{ end }}{{ end }}`,fg:`{{ if le .context.contextLeft 40 }}button-color-foreground{{ else }}foreground{{ end }}`,when:`{{ gt .context.totalTokens 0 }}`},metrics:{template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,bg:`panel`,fg:`foreground`,when:`{{ or .metrics.lastResponseTime .metrics.responseTime .metrics.sessionDuration .metrics.messageCount .metrics.linesAdded .metrics.linesRemoved }}`},styleControl:{template:`✦ {{ if .activeStyle }}{{ .activeStyle }}{{ else }}(default){{ end }} {{ menu "applyStyle" }} 📌{{ menu "applyStyleForever" (dict "key" "pickersForever") }} {{ action "resetStyle" "↺" }}`,bg:`surface`,fg:`foreground`},themeControl:{template:`🎨 {{ .theme.effective }} {{ menu "applyTheme" (dict "key" "pickers") }} 📌{{ menu "applyThemeForever" (dict "key" "pickersForever") }} {{ action "resetTheme" "↺" }}`,bg:`surface`,fg:`foreground`},lookControl:{template:`◐ {{ .look.effective }} {{ menu "applyLook" (dict "key" "pickers" "closeOnPick" true) }} 📌{{ menu "applyLookForever" (dict "key" "pickersForever" "closeOnPick" true) }} {{ action "resetLook" "↺" }}`,bg:`surface`,fg:`foreground`},charsetControl:{template:`{{ .charset.effective }} {{ menu "applyCharsetForever" }} {{ action "resetCharset" "↺" }}`,bg:`surface`,fg:`foreground`},colorCompatControl:{template:`{{ .colorCompatibility.effective }} {{ menu "applyColorCompatForever" }} {{ action "resetColorCompat" "↺" }}`,bg:`surface`,fg:`foreground`},wrapToggleControl:{template:`{{ action "toggleWrapForever" "wrap: on" "wrap: off" }} {{ action "resetAutoWrap" "↺" }}`,bg:`surface`,fg:`foreground`},paddingControl:{template:`{{ action "paddingDownForever" "◀" }} padding {{ .padding.effective }} {{ action "paddingUpForever" "▶" }} {{ action "resetPadding" "↺" }}`,bg:`surface`,fg:`foreground`},directoryPaletteControl:{template:`🎨 directory {{ menu "applyDirectoryPaletteForever" }} {{ action "resetDirectoryPalette" "↺" }}`,bg:`surface`,fg:`foreground`}},root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`toolbar`},{kind:`group`,name:`settings`,label:`⚙ settings`,direction:`horizontal`,children:[`themeControl`,`lookControl`,`styleControl`,`charsetControl`,`colorCompatControl`,`wrapToggleControl`,`paddingControl`,`directoryPaletteControl`]}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`}]}]},actions:{copySession:{copy:`{{ .session.id }}`},copyDir:{copy:`{{ .current_dir }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},applyStyle:{set:`style`,from:`styles`},applyTheme:{set:`theme`,from:`themes`},applyLook:{set:`look`,from:`looks`},applyThemeForever:{persist:`palette`,from:`themes`},resetTheme:{reset:`palette`},applyStyleForever:{persist:`style`,from:`styles`},resetStyle:{reset:`style`},applyLookForever:{persist:`look`,from:`looks`},resetLook:{reset:`look`},applyCharsetForever:{persist:`charset`,from:`charsets`},resetCharset:{reset:`charset`},applyColorCompatForever:{persist:`colorCompatibility`,from:`colorCompatibilities`},resetColorCompat:{reset:`colorCompatibility`},toggleWrapForever:{persist:`autoWrap`,cycle:[`true`,`false`]},resetAutoWrap:{reset:`autoWrap`},paddingDownForever:{persist:`padding`,min:0,max:16,by:-1},paddingUpForever:{persist:`padding`,min:0,max:16,by:1},resetPadding:{reset:`padding`},applyDirectoryPaletteForever:{persist:`segments.directory.palette`,from:`themes`},resetDirectoryPalette:{reset:`segments.directory.palette`}},looks:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{}},helpers:{formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`}},xv=new Set([bv.globals.palette,...Object.values(bv.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Sv=tl(B_(`<default>`,JSON.stringify(bv),xv),bv);function Cv(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function wv(e){return typeof e==`string`?e:String(e)}function Tv(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function Ev(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}const Dv=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,Ov=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function kv(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(Dv);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(Ov);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function Av(e){let t=e.match(Ov);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function jv(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function Mv(e){return e.toLocaleString()}const Nv=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],Pv=Nv.length;function Fv(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(Pv-1));o+=Nv[t]}return o}function Iv(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}const Lv=gc(),Rv=[...bc];function zv(){return{basename:{fn:e=>l(e),argTypes:[`string`]},dirname:{fn:e=>u(e),argTypes:[`string`]},abbreviatePath:{fn:e=>jv(e),argTypes:[`string`]},int:{fn:e=>Tv(e),argTypes:[`value`]},string:{fn:e=>wv(e),argTypes:[`value`]},bool:{fn:e=>Ev(e),argTypes:[`value`]},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`]},themes:{fn:()=>Lv,argTypes:[]},styles:{fn:()=>Rv,argTypes:[]},sparkline:{fn:(e,t)=>Fv(Iv(e),t),argTypes:[`string`,`int`]}}}function Bv(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`]},formatInteger:{fn:e=>Mv(e),argTypes:[`int`]},round:{fn:e=>Math.round(e),argTypes:[`float`]},formatModelName:{fn:e=>kv(e),argTypes:[`string`]},shortenModelName:{fn:e=>Av(e),argTypes:[`string`]}}}function Vv(e,t=()=>new Date){return $d({fromString:e=>new Lo(e),toString:e=>e.plain,clock:t,missingKey:`error`,funcs:{...Wp(),...eg(),...Am(),...Qm(),...Ip(t),...Ef(),...im(),...dc(),...zv(),...Bv(t),...e??{}}})}function Hv(e){return Uv(e,new Set(e.names()),``)}function Uv(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return Uv(e,t,a)}})}function Wv(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(D(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function Gv(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}async function Kv(e){let t=await be({bin:`/bin/sh`,args:[`-c`,e],category:`user-shell`});return t.ok?{stdout:t.stdout,exitCode:t.exitCode??0}:{stdout:t.stdout,exitCode:t.exitCode??1}}async function qv(e,t,n){let r;try{r=await te(e,`utf8`)}catch{return{error:`file unreadable: ${e}`}}if(n!==void 0){let t=new RegExp(n).exec(r);return t?.[1]?{content:t[1].replace(/\n/g,` `)}:{error:`regex no-match in "${e}"`}}return t===`first-line`?{content:(r.split(`
104
+ `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!W_.test(t))continue;let r=G_(t);if(r!=null)return r}return null}const Y_=10*1e3;function X_(e,t,n,r){let i=n-(t*1e3-r);if(i<3e5||e<=0)return;let a=e/i,o=(100-e)/a;return Math.max(0,Math.round(o/6e4))}function Z_(e,t){if(!(t<60))return e*3600/t}function Q_(e,t,n,r){let i=r-t;if(i<50||i>Y_)return;let a=n-e;if(!(a<=0))return a*1e3/i}function $_(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Q_(t.input,t.atMs,n.input,n.atMs),i=Q_(t.output,t.atMs,n.output,n.atMs),a=Q_(t.total,t.atMs,n.total,n.atMs);if(!(r===void 0&&i===void 0&&a===void 0))return{...r!==void 0&&{input:r},...i!==void 0&&{output:i},...a!==void 0&&{total:a}}}function ev(e){let{samples:t}=e,n=[];for(let e=1;e<t.length;e++){let r=t[e-1],i=t[e],a=i.atMs-r.atMs;if(a<50||a>Y_)continue;let o=Q_(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function tv(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,r);for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,i);let n=[],r=new Set;for(let t of Jr(e.root)){if(t.when)for(let e of __(t.when))n.push(e);if(t.kind!==`segment`)continue;let r=e.segments[t.name];if(r){for(let e of[r.template,r.when,r.bg,r.fg])if(e)for(let t of __(e))n.push(t)}}let i=new Set;for(;n.length>0;){let e=n.pop();for(let a of nv(t,e)){if(r.has(a))continue;r.add(a);let e=t.get(a);if(e){if(e.kind===`input`)i.add(e.path);else if(e.kind===`template`)for(let t of __(e.template))n.push(t)}}}return i}function nv(e,t){let n=t;for(;n.length>0;){if(e.has(n))return[n];let t=n.lastIndexOf(`.`);if(t<0)break;n=n.slice(0,t)}let r=`${t}.`,i=[];for(let t of e.keys())t.startsWith(r)&&i.push(t);return i}function rv(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function iv(e){let t=t=>e.has(t),n=t(`git.staged`)||t(`git.unstaged`)||t(`git.untracked`)||t(`git.conflicts`);return{...t(`git.sha`)&&{showSha:!0},...n&&{showWorkingTree:!0},...t(`git.stash`)&&{showStashCount:!0},...t(`git.upstream`)&&{showUpstream:!0},...t(`git.repoName`)&&{showRepoName:!0},...t(`git.repoUrl`)&&{showRepoUrl:!0},...t(`git.operation`)&&{showOperation:!0},...t(`git.timeSinceCommit`)&&{showTimeSinceCommit:!0},...(t(`git.prNumber`)||t(`git.prState`)||t(`git.prUrl`)||t(`git.prError`))&&{showPullRequest:!0}}}async function av(e,t,n,r,i){let a=e=>rv(r,e),o=(t.clock??(()=>new Date))().getTime(),s=(e,t,n)=>t?n().catch(t=>Ln(`${e}: ${String(t)}`)):Promise.resolve(L),[c,l,u,d,f,p,m,h]=await Promise.all([s(`git`,a(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,iv(r),e.workspace?.project_dir)),s(`session`,a(`session.cost`)||a(`session.tokens`)||a(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),s(`today`,a(`today`),()=>t.usageStore.getTodayInfo(e)),s(`context`,a(`context`),()=>t.contextProvider.getContextInfo(e)),s(`metrics`,a(`metrics`)||a(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),s(`tmux`,a(`tmux`),()=>t.tmuxService.getSessionId()),s(`cache`,a(`cache`),()=>K_(e.transcript_path)),s(`speed`,a(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,o))]),g=[],_=e=>{if(e.kind===`failed`){g.push(e.reason);return}return e.kind===`ok`?e.value:void 0},v=cv(c);g.push(...v.failures);let y=_(l),b=_(u),x=_(d),S=_(f),C=_(p),ee=_(m);for(let e of g)t.log(`warn`,`provider fetch failed: ${e}`);let te=e.rate_limits?.five_hour,w=e.rate_limits?.seven_day,ne=te?X_(te.used_percentage,te.resets_at,18e6,o):void 0,re=w?X_(w.used_percentage,w.resets_at,6048e5,o):void 0,ie=y?.session.cost,T=S?.sessionDuration,E=a(`burn`)&&ie!=null&&T!=null?Z_(ie,T):void 0,ae=_(h),oe=ae===void 0?void 0:$_(ae),se=ae===void 0?void 0:ev(ae),ce=oe!==void 0||se!==void 0?{...oe,...se!==void 0&&{history:se}}:void 0,le=sv(process.env.HOME??process.env.USERPROFILE),ue=e.workspace?{...e.workspace,current_dir:sv(e.workspace.current_dir)??``,project_dir:sv(e.workspace.project_dir)??``}:e.workspace,de=y===void 0?void 0:ov({cost:y.session.cost,tokens:y.session.tokens}),fe=b===void 0?void 0:{cost:b.cost,tokens:b.tokens},pe=S===void 0?void 0:ov({lastResponseTime:S.lastResponseTime,responseTime:S.responseTime,sessionDuration:S.sessionDuration,messageCount:S.messageCount,linesAdded:S.linesAdded,linesRemoved:S.linesRemoved});return{...e,...ue!==void 0&&{workspace:ue},...le!==void 0&&{home:le},...v.git!==void 0&&{git:v.git},...C!==void 0&&{tmux:{session:C}},theme:{effective:i.theme},look:{effective:i.look},preset:{effective:i.preset},style:{effective:i.style},charset:{effective:i.charset},colorCompatibility:{effective:i.colorCompatibility},autoWrap:{effective:i.autoWrap},padding:{effective:i.padding},...de!==void 0&&{session:de},...fe!==void 0&&{today:fe},...E!==void 0&&{burn:{costPerHour:E}},...ce!==void 0&&{speed:ce},...a(`block`)&&te!==void 0&&{block:{nativeUtilization:te.used_percentage,resetsAt:te.resets_at,...ne!==void 0&&{etaMinutes:ne}}},...w!==void 0&&{weekly:{percentage:w.used_percentage,resetsAt:w.resets_at,...re!==void 0&&{etaMinutes:re}}},...ee!==void 0&&{cache:{expiresAt:ee}},...x!==void 0&&{context:{totalTokens:x.totalTokens,contextLeft:x.contextLeftPercentage}},...pe!==void 0&&{metrics:pe}}}function ov(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function sv(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function cv(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const lv=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,uv=`{{ \$dir := .current_dir }}{{ if and (ne .home "") (or (eq .home .current_dir) (hasPrefix (printf "%s/" .home) .current_dir)) }}{{ \$dir = printf "~%s" (trimPrefix .home .current_dir) }}{{ else }}{{ if or (eq .project_dir .current_dir) (hasPrefix (printf "%s/" .project_dir) .current_dir) }}{{ $dir = ternary (${lv}) (basename .project_dir) (ne (${lv}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,dv={branch:`primary`,staged:`success`,unstaged:`warning`,untracked:`accent`,conflicts:`error`,ahead:`success`,behind:`warning`,stash:`accent`},fv=(e,t)=>`{{ fg (color "${dv[e]}") ${t} }}`,pv=`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,mv=`{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} ({{ \$first := true }}{{ if gt .git.staged 0 }}${fv(`staged`,`(printf "+%v" .git.staged)`)}{{ $first = false }}{{ end }}{{ if gt .git.unstaged 0 }}{{ if not $first }} {{ end }}${fv(`unstaged`,`(printf "~%v" .git.unstaged)`)}{{ $first = false }}{{ end }}{{ if gt .git.untracked 0 }}{{ if not $first }} {{ end }}${fv(`untracked`,`(printf "?%v" .git.untracked)`)}{{ $first = false }}{{ end }}{{ if gt .git.conflicts 0 }}{{ if not $first }} {{ end }}${fv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ $first = false }}{{ end }}){{ end }}`,hv=`{{ if ne .git.repoName "" }}{{ .git.repoName }} {{ end }}⎇ ${fv(`branch`,`.git.branch`)}{{ if .git.sha }} ♯ {{ .git.sha }}{{ end }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${fv(`ahead`,`(printf "↑%v" .git.ahead)`)}{{ end }}{{ if gt .git.behind 0 }}${fv(`behind`,`(printf "↓%v" .git.behind)`)}{{ end }}{{ end }}`+mv+`{{ if .git.upstream }} →{{ .git.upstream }}{{ end }}{{ if gt .git.stash 0 }} ${fv(`stash`,`(printf "⧇ %v" .git.stash)`)}{{ end }} {{ if eq .git.status "conflicts" }}{{ fg (color "error") "⚠" }}{{ else }}{{ if eq .git.status "dirty" }}{{ fg (color "warning") "●" }}{{ else }}{{ fg (color "success") "✓" }}{{ end }}{{ end }}`;function gv(e,t){return`{{ if ge (round ${e}) ${t} }}error{{ else }}{{ if ge (round ${e}) 50 }}warning{{ else }}panel{{ end }}{{ end }}`}function _v(e){return`{{ if ge (round ${e}) 50 }}button-color-foreground{{ else }}foreground{{ end }}`}function vv(e,t,n){return`{{ if lt ${e} 0 }}panel{{ else }}{{ if lt ${e} ${n} }}error{{ else }}{{ if lt ${e} ${t} }}warning{{ else }}panel{{ end }}{{ end }}{{ end }}`}function yv(e,t){return`{{ if lt ${e} 0 }}foreground{{ else }}{{ if lt ${e} ${t} }}button-color-foreground{{ else }}foreground{{ end }}{{ end }}`}const bv={globals:{palette:`tokyo-night`},variables:{current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},"session.id":{kind:`input`,path:`session_id`,default:``},version:{kind:`input`,path:`version`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"hue.step":{kind:`literal`,value:14},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},activeStyle:{kind:`state`,key:`style`,default:``}},segments:{directory:{template:uv,bg:`surface`,fg:`foreground`},model:{template:`✱ {{ formatModelName .model.display_name }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .model.display_name "" }}`},sessionId:{template:`⌗{{ trunc 8 .session.id }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .session.id "" }}`},version:{template:`◈ v{{ .version }}`,bg:`surface`,fg:`foreground`,when:`{{ ne .version "" }}`},tmux:{template:`tmux:{{ .tmux.session | default "none" }}`,bg:`surface-active`,fg:`foreground`,when:`{{ ne .tmux.session "" }}`},git:{template:hv,bg:`surface-active`,fg:pv,when:`{{ ne .git.branch "" }}`},gitaculous:{template:`(git){{ if ne .git.repoName "" }} {{ .git.repoName }}{{ end }}{{ if ne .git.operation "" }} [{{ .git.operation }}]{{ end }}{{ if ne .git.sha "" }} {{ .git.sha }}{{ end }}{{ if or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0) }} {{ if gt .git.staged 0 }}${fv(`staged`,`"S"`)}{{ end }}{{ if gt .git.unstaged 0 }}${fv(`unstaged`,`"U"`)}{{ end }}{{ if gt .git.untracked 0 }}${fv(`untracked`,`"?"`)}{{ end }}{{ if gt .git.conflicts 0 }}${fv(`conflicts`,`(printf "!%v" .git.conflicts)`)}{{ end }}{{ end }} ⎇ ${fv(`branch`,`.git.branch`)}{{ if ne .git.upstream "" }} [{{ .git.upstream }}{{ if or (gt .git.ahead 0) (gt .git.behind 0) }} {{ if gt .git.ahead 0 }}${fv(`ahead`,`(printf "+%v" .git.ahead)`)}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}${fv(`behind`,`(printf "-%v" .git.behind)`)}{{ end }}{{ end }}]{{ end }}{{ if gt .git.stash 0 }} ${fv(`stash`,`(printf "(%v stashed)" .git.stash)`)}{{ end }}{{ if gt .git.timeSinceCommit 0 }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,bg:`surface-active`,fg:pv,when:`{{ ne .git.branch "" }}`},gitPr:{template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,bg:`surface-active`,fg:`foreground`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{template:`{{ action "copySession" "⎘ id" }} {{ action "openProject" "↗ proj" }} {{ action "openTranscript" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,bg:`surface`,fg:`foreground`},session:{template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .session.budget.amount "warn" .session.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},today:{template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .today.budget.amount "warn" .today.budget.warningThreshold) }}`,bg:`surface`,fg:`foreground`},block:{template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .block.resetsAt) }})`,bg:gv(`.block.nativeUtilization`,`.block.budget.warningThreshold`),fg:_v(`.block.nativeUtilization`),when:`{{ gt .block.resetsAt 0 }}`},weekly:{template:`◑ {{ round .weekly.percentage }}% ({{ template "formatLongTimeRemaining" (minutesUntilReset .weekly.resetsAt) }})`,bg:gv(`.weekly.percentage`,`.weekly.budget.warningThreshold`),fg:_v(`.weekly.percentage`),when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:vv(`.block.etaMinutes`,`.burn.eta.warnMinutes`,`.burn.eta.errorMinutes`),fg:yv(`.block.etaMinutes`,`.burn.eta.warnMinutes`),when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,bg:`panel`,fg:`foreground`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{template:`⚡ {{ sparkline .speed.history 24 }}`,bg:`panel`,fg:`foreground`,when:`{{ ne .speed.history "" }}`},cacheTimer:{template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,bg:`surface`,fg:`{{ if le (minutesUntilReset .cache.expiresAt) 8 }}error{{ else }}{{ if le (minutesUntilReset .cache.expiresAt) 20 }}warning{{ else }}foreground{{ end }}{{ end }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ if le .context.contextLeft 20 }}error{{ else }}{{ if le .context.contextLeft 40 }}warning{{ else }}surface-active{{ end }}{{ end }}`,fg:`{{ if le .context.contextLeft 40 }}button-color-foreground{{ else }}foreground{{ end }}`,when:`{{ gt .context.totalTokens 0 }}`},metrics:{template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,bg:`panel`,fg:`foreground`,when:`{{ or .metrics.lastResponseTime .metrics.responseTime .metrics.sessionDuration .metrics.messageCount .metrics.linesAdded .metrics.linesRemoved }}`},styleControl:{template:`✦ {{ if .activeStyle }}{{ .activeStyle }}{{ else }}(default){{ end }} {{ menu "applyStyle" }} 📌{{ menu "applyStyleForever" (dict "key" "pickersForever") }} {{ action "resetStyle" "↺" }}`,bg:`surface`,fg:`foreground`},themeControl:{template:`🎨 {{ .theme.effective }} {{ menu "applyTheme" (dict "key" "pickers") }} 📌{{ menu "applyThemeForever" (dict "key" "pickersForever") }} {{ action "resetTheme" "↺" }}`,bg:`surface`,fg:`foreground`},lookControl:{template:`◐ {{ .look.effective }} {{ menu "applyLook" (dict "key" "pickers" "closeOnPick" true) }} 📌{{ menu "applyLookForever" (dict "key" "pickersForever" "closeOnPick" true) }} {{ action "resetLook" "↺" }}`,bg:`surface`,fg:`foreground`},presetControl:{template:`▦ {{ .preset.effective }} {{ menu "applyPreset" (dict "key" "pickers" "closeOnPick" true) }} 📌{{ menu "applyPresetForever" (dict "key" "pickersForever" "closeOnPick" true) }} {{ action "resetPreset" "↺" }}`,bg:`surface`,fg:`foreground`},charsetControl:{template:`{{ .charset.effective }} {{ menu "applyCharsetForever" }} {{ action "resetCharset" "↺" }}`,bg:`surface`,fg:`foreground`},colorCompatControl:{template:`{{ .colorCompatibility.effective }} {{ menu "applyColorCompatForever" }} {{ action "resetColorCompat" "↺" }}`,bg:`surface`,fg:`foreground`},wrapToggleControl:{template:`{{ action "toggleWrapForever" "wrap: on" "wrap: off" }} {{ action "resetAutoWrap" "↺" }}`,bg:`surface`,fg:`foreground`},paddingControl:{template:`{{ action "paddingDownForever" "◀" }} padding {{ .padding.effective }} {{ action "paddingUpForever" "▶" }} {{ action "resetPadding" "↺" }}`,bg:`surface`,fg:`foreground`},directoryPaletteControl:{template:`🎨 directory {{ menu "applyDirectoryPaletteForever" }} {{ action "resetDirectoryPalette" "↺" }}`,bg:`surface`,fg:`foreground`}},root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`toolbar`},{kind:`group`,name:`settings`,label:`⚙ settings`,direction:`horizontal`,children:[`themeControl`,`lookControl`,`presetControl`,`styleControl`,`charsetControl`,`colorCompatControl`,`wrapToggleControl`,`paddingControl`,`directoryPaletteControl`]}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`}]}]},actions:{copySession:{copy:`{{ .session.id }}`},copyDir:{copy:`{{ .current_dir }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},applyStyle:{set:`style`,from:`styles`},applyTheme:{set:`theme`,from:`themes`},applyLook:{set:`look`,from:`looks`},applyPreset:{set:`preset`,from:`presets`},applyThemeForever:{persist:`palette`,from:`themes`},resetTheme:{reset:`palette`},applyStyleForever:{persist:`style`,from:`styles`},resetStyle:{reset:`style`},applyLookForever:{persist:`look`,from:`looks`},resetLook:{reset:`look`},applyPresetForever:{persist:`preset`,from:`presets`},resetPreset:{reset:`preset`},applyCharsetForever:{persist:`charset`,from:`charsets`},resetCharset:{reset:`charset`},applyColorCompatForever:{persist:`colorCompatibility`,from:`colorCompatibilities`},resetColorCompat:{reset:`colorCompatibility`},toggleWrapForever:{persist:`autoWrap`,cycle:[`true`,`false`]},resetAutoWrap:{reset:`autoWrap`},paddingDownForever:{persist:`padding`,min:0,max:16,by:-1},paddingUpForever:{persist:`padding`,min:0,max:16,by:1},resetPadding:{reset:`padding`},applyDirectoryPaletteForever:{persist:`segments.directory.palette`,from:`themes`},resetDirectoryPalette:{reset:`segments.directory.palette`}},looks:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`git`},{kind:`segment`,name:`context`},{kind:`segment`,name:`presetControl`}]},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:`segment`,name:`presetControl`}]},{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`}]}]}}},helpers:{formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`}},xv=new Set([bv.globals.palette,...Object.values(bv.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Sv=tl(B_(`<default>`,JSON.stringify(bv),xv),bv);function Cv(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function wv(e){return typeof e==`string`?e:String(e)}function Tv(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function Ev(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}const Dv=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,Ov=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function kv(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(Dv);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(Ov);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function Av(e){let t=e.match(Ov);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function jv(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function Mv(e){return e.toLocaleString()}const Nv=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],Pv=Nv.length;function Fv(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(Pv-1));o+=Nv[t]}return o}function Iv(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}const Lv=gc(),Rv=[...bc];function zv(){return{basename:{fn:e=>l(e),argTypes:[`string`]},dirname:{fn:e=>u(e),argTypes:[`string`]},abbreviatePath:{fn:e=>jv(e),argTypes:[`string`]},int:{fn:e=>Tv(e),argTypes:[`value`]},string:{fn:e=>wv(e),argTypes:[`value`]},bool:{fn:e=>Ev(e),argTypes:[`value`]},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`]},themes:{fn:()=>Lv,argTypes:[]},styles:{fn:()=>Rv,argTypes:[]},sparkline:{fn:(e,t)=>Fv(Iv(e),t),argTypes:[`string`,`int`]}}}function Bv(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`]},formatInteger:{fn:e=>Mv(e),argTypes:[`int`]},round:{fn:e=>Math.round(e),argTypes:[`float`]},formatModelName:{fn:e=>kv(e),argTypes:[`string`]},shortenModelName:{fn:e=>Av(e),argTypes:[`string`]}}}function Vv(e,t=()=>new Date){return $d({fromString:e=>new Lo(e),toString:e=>e.plain,clock:t,missingKey:`error`,funcs:{...Wp(),...eg(),...Am(),...Qm(),...Ip(t),...Ef(),...im(),...dc(),...zv(),...Bv(t),...e??{}}})}function Hv(e){return Uv(e,new Set(e.names()),``)}function Uv(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return Uv(e,t,a)}})}function Wv(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(D(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function Gv(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}async function Kv(e){let t=await be({bin:`/bin/sh`,args:[`-c`,e],category:`user-shell`});return t.ok?{stdout:t.stdout,exitCode:t.exitCode??0}:{stdout:t.stdout,exitCode:t.exitCode??1}}async function qv(e,t,n){let r;try{r=await te(e,`utf8`)}catch{return{error:`file unreadable: ${e}`}}if(n!==void 0){let t=new RegExp(n).exec(r);return t?.[1]?{content:t[1].replace(/\n/g,` `)}:{error:`regex no-match in "${e}"`}}return t===`first-line`?{content:(r.split(`
105
105
  `)[0]??``).trim()}:{content:r.replace(/\n/g,` `).trim()}}const Jv=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],Yv=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Xv=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],Zv=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function Qv(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>Jv[e.getMonth()]],[`Monday`,e=>Xv[e.getDay()]],[`Jan`,e=>Yv[e.getMonth()]],[`Mon`,e=>Zv[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const $v={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function ey(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=$v[t];try{return iy(r,e)}catch{return ay(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return Rn(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return Rn(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return Rn(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return Rn(e.stashCount,0)}}var ty=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},ny=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:T(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ie(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ie(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function ry(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function iy(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?wv(e):t===`number`?Tv(e):Ev(e)}function ay(e){return e===`number`?0:e===`boolean`?!1:``}var oy=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new ty;ttlMgr=new ny;gitSubscriptions=new Map;cleanups=[];inFlight=new Set;engine=Vv();gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new mr({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,Cv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){let r=Wv(e,n.cache);this.store.defineBox(e,`string`,this.stringInitial(n.varDefault));let i=()=>void this.updateFromShell(e,t,n.regex,n.varDefault);i(),this.registerCachePolicy(e,r,i)}declareFile(e,t,n){this.store.defineBox(e,`string`,this.stringInitial(n.varDefault));let r=()=>void this.updateFromFile(e,t,n.readMode,n.regex,n.varDefault);r(),this.registerCachePolicy(e,n.cache,r)}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=Hv(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){return this.recordError(e,t instanceof Error?t.message:String(t)),this.stringInitial(n.varDefault)}}),this.store.read(e)}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return Qv(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,Qv(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=$v[t.field],r=t.varDefault===void 0?ay(n):iy(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map;i={fieldSubs:e,unsubscribe:this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,ey(t,n,i,this.defaultEmptyValue))})})},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault})}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(`session.id`);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=ry(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,iy(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}getLastError(e){return this.lastErrors.get(e)}dispose(){for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,Y.reaction)(()=>{let t=Hv(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,Y.reaction)(()=>t.varNames.map(e=>String(this.store.read(e))).join(`,`),n);this.cleanups.push(e);break}}}async updateFromShell(e,t,n,r){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let{stdout:i,exitCode:a}=await Kv(t);if(a!==0){this.applyFallback(e,`string`,r,`shell "${t}" exited with code ${a}`);return}if(n!==void 0){let a=new RegExp(n).exec(i);if(!a?.[1]){this.applyFallback(e,`string`,r,`regex no-match in output of "${t}"`);return}this.store.setBox(e,a[1].replace(/\n/g,` `))}else this.store.setBox(e,i.replace(/\n/g,` `).trim());this.lastErrors.delete(e)}finally{this.inFlight.delete(e)}}}async updateFromFile(e,t,n,r,i){if(!this.inFlight.has(e)){this.inFlight.add(e);try{let a=await qv(t,n,r);if(a.error!==void 0){this.applyFallback(e,`string`,i,a.error);return}this.store.setBox(e,a.content??``),this.lastErrors.delete(e)}finally{this.inFlight.delete(e)}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,iy(this.defaultEmptyValue,t))}catch{this.store.setBox(e,ay(t))}}defaultFor(e){try{return iy(this.defaultEmptyValue,e)}catch{return ay(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}};const sy={unicode:{},ascii:{glyph:`>`}},cy={unicode:{},ascii:{left:`(`,right:`)`}};function ly(e,t,n){switch(e){case`capsule`:return new Wo(cy[t]);case`plain`:return new Go(n===void 0?{}:{separator:n});case`powerline`:return new Uo(sy[t]);default:return e}}function uy(e){switch(e){case`powerline`:return 1;case`capsule`:return 2;case`plain`:return 0;default:return e}}function dy(e,t){if(e.length===0)return``;let n=ly(t.style,t.charset,t.separator);if(t.wrap&&Number.isFinite(t.width)){let r=Jo(new os([...e],{joiner:n}),{width:t.width,colorSystem:t.colorCompatibility});return r.endsWith(`
106
106
  `)?r.slice(0,-1):r}return Jo(new Ro([...e],n),{colorSystem:t.colorCompatibility})}const fy=new Map,py=new Map;function my(e){let t=pc(e),n=fy.get(t);if(n!==void 0)return n;let r=eo(t);if(r===null)throw Error(`Palette "${e}" (resolved "${t}") did not resolve in the theme registry — allowed names and the registry are inconsistent`);return fy.set(t,r),r}function hy(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=py.get(n);if(r!==void 0)return r;let i=po(e,t);return py.set(n,i),i}function gy(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=_y(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(a.style.link){i();let e=_y([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function _y(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>vy(e,t)):e,r=Lo.fromFragments(n);return r.end=``,r.noWrap=!0,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function vy(e,t){let n=e.copy();return n.style=t.add(e.style),n}function yy(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function by(e,t){let n=Lo.fromFragments(e);return n.end=``,n.noWrap=!0,t!==void 0&&!t.isNull&&(n.style=t),n}function xy(e,t){let{width:n,justify:r,truncate:i,truncateMarker:a=`…`,baseStyle:o,padding:s}=t;if(e.length===0)return[];let c=by(e,o).pad(s);return n===`auto`||(c.cellLength>n?c.truncate(n,{mode:i,marker:a}):c.cellLength<n&&c.align(r,n)),[c]}var Sy=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Cy(e,t,n,r,i,a){let o={segName:t,palette:n,bg:void 0};e.current=o;let s=wy(r,a),c=s===void 0?void 0:Ty(n,s,`bg`);o.bg=c;let l=wy(i,a),u=l===void 0?void 0:Ty(n,l,`fg`);return new q({bgcolor:c===void 0?void 0:K.fromRgba(c),color:u===void 0?void 0:K.fromRgba(u)})}function wy(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Ty(e,t,n){try{return Pa(e,t)}catch(e){throw e instanceof ja?new Sy(t,n,e.message):e}}const Ey=new Map([[`palette`,`theme.effective`],[`look`,`look.effective`],[`style`,`style.effective`],[`charset`,`charset.effective`],[`colorCompatibility`,`colorCompatibility.effective`],[`autoWrap`,`autoWrap.effective`],[`padding`,`padding.effective`]]);function Dy(e,t,n,r){let i=new Map;for(let[a,o]of Object.entries(t))i.set(a,Oy(e,a,o,n,r));return i}function Oy(e,t,n,r,i){if(`set`in n){let e=r.get(n.set)??n.set;return`to`in n?{kind:`set-literal`,key:n.set,value:n.to,stateVar:e}:`from`in n?{kind:`set-option`,key:n.set,stateVar:e,options:[...d_(n.from,i)]}:`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Ey.get(n.persist)??n.persist;return`to`in n?{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e}:`from`in n?{kind:`persist-option`,key:n.persist,stateVar:e,options:[...d_(n.from,i)]}:`cycle`in n?{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle}:{kind:`persist-bounded`,key:n.persist,by:n.by}}return`copy`in n?{kind:`copy`,text:ky(e,n.copy,t)}:`open`in n?{kind:`open`,target:ky(e,n.open,t)}:{kind:`reset`,key:n.reset}}function ky(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function Ay(e,t){return e.has(t)?wv(e.read(t)):``}function jy(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function My(e,t,n){let r=new Lo(e,{style:new q({link:t,bold:n})});return r.noWrap=!0,r.end=``,r}function Ny(e,t){return Math.max(e.members.indexOf(Ay(t,e.stateVar)),0)}function Py(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=Ay(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,e.value]},active:t===e.value}}case`set-option`:{let a=n??t,o=Ay(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,a]},active:o===a}}case`set-int`:{let a=n??t,o=Ay(r,e.stateVar);return{effect:{verb:Ct,args:[i,e.key,a]},active:o===a}}case`set-cycle`:{let t=e.members[(Ny(e,r)+1)%e.members.length];return{effect:{verb:Ct,args:[i,e.key,t]},active:!1}}case`set-bounded`:return{effect:{verb:wt,args:[i,e.key,String(e.by)]},active:!1};case`copy`:return{effect:{verb:Tt,args:[jy(e.text,Hv(r))]},active:!1};case`open`:return{effect:{verb:Et,args:[jy(e.target,Hv(r))]},active:!1};case`persist-literal`:{let t=Ay(r,e.stateVar);return{effect:{verb:kt,args:[i,e.key,e.value]},active:t===e.value}}case`persist-option`:{let a=n??t,o=Ay(r,e.stateVar);return{effect:{verb:kt,args:[i,e.key,a]},active:o===a}}case`persist-cycle`:{let t=e.members[(Ny(e,r)+1)%e.members.length];return{effect:{verb:kt,args:[i,e.key,t]},active:!1}}case`persist-bounded`:return{effect:{verb:At,args:[i,e.key,String(e.by)]},active:!1};case`reset`:return{effect:{verb:jt,args:[i,e.key]},active:!1}}}function Fy(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`){if(n.length!==1&&n.length!==t.members.length)throw Error(`action "${e}" cycles ${t.members.length} members; bind one display per member (${t.members.length}) or one static display, got ${n.length}`);return{display:n.length===1?n[0]:n[Ny(t,r)],boundValue:void 0}}if(n.length>2)throw Error(`action "${e}" takes a display and an optional bound value, got ${n.length} arguments (per-state displays are a cycle action's form)`);return{display:n[0],boundValue:n[1]}}function Iy(e,t,n){let r=n.compiled.get(e);if(!r)throw Error(`action "${e}" is not declared in this config`);let i=n.store,{display:a,boundValue:o}=Fy(e,r,t,i),{effect:s,active:c}=Py(r,a,o,i,Ay(i,`session.id`));return My(a,Pt([s]),c)}function Ly(e){return{action:{fn:(t,...n)=>Iy(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function Ry(e){return new Lo(e).cellLength}function zy(e,t,n){if(!Number.isFinite(t))return e.length>0?[e.map((e,t)=>t)]:[];let r=Math.max(1,t-n),i=[],a=[],o=0;for(let t=0;t<e.length;t++){let n=e[t];a.length===0?(a=[t],o=n):o+1+n<=r?(a.push(t),o+=1+n):(i.push(a),a=[t],o=n)}return a.length>0&&i.push(a),i}function By(e,t){let n=[];for(let t of e)n.length>0&&n.push(new Lo(` `)),n.push(t);let r=Lo.fromFragments(n);return r.noWrap=t,r.end=``,r}function Vy(e,t,n,r){let i=e.compiled.get(t);if(!i||i.kind!==n)throw Error(`picker references action "${t}" which must be ${r}, got ${i?`a ${i.kind} action`:`no such action`}`);return i}function Hy(e,t){let n=e.compiled.get(t);if(!n||n.kind!==`set-option`&&n.kind!==`persist-option`)throw Error(`picker references action "${t}" which must be a set-option or persist-option action ({ set, from } or { persist, from }), got ${n?`a ${n.kind} action`:`no such action`}`);return n}function Uy(e,t,n,r,i,a){let o=Hy(a,e),s=a.store,c=Ay(s,`session.id`),l=Ay(s,o.stateVar),u=o.options.map(Ry),d=i?Math.max(1,Tv(s.read(`term.cols`))-uy(a.stripStyle)-2*a.padding):1/0,f=Ry(`✕`)+1,p=Ry(`←`)+1+Ry(`→`)+1,m=zy(u,d,f),h=m.length>1?zy(u,d,f+p):m,g=parseInt(Ay(s,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>Pt([{verb:Ct,args:[c,t.key,String(e)]}]),b=n.flatMap(([e,t])=>[e,t]),x=Pt([{verb:Ct,args:[c,...b]}]),S=e=>o.kind===`persist-option`?Pt([{verb:kt,args:[c,o.key,e]},...r?[{verb:Ct,args:[c,...b]}]:[]]):Pt([{verb:Ct,args:[c,o.key,e,...r?b:[]]}]),C=[My(`✕`,x,!1)];_>0&&C.push(My(`←`,y(_-1),!1));for(let e of v){let t=o.options[e];C.push(My(t,S(t),t===l))}return _<h.length-1&&C.push(My(`→`,y(_+1),!1)),By(C,i)}function Wy(e){return{picker:{fn:(t,n,r,i)=>{let a=Vy(e,n,`set-int`,`an int action ({ set, int: true })`);return Uy(t,{key:a.key,stateVar:a.stateVar},[[a.key,`-1`]],r===!0,i===!0,e)},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}const Gy=Symbol(`cc-candybar.menuDrop`);function Ky(e){return e.flatMap(e=>e[Gy]??[])}function qy(e,t,n){let r=n.activeSegment.current;if(r===null)throw Error(`{{ menu }} rendered with no active segment placement — the render walk must publish one before evaluating a segment template`);let i=n.action,a=ig(r.segName,e,t.key),o=og(a),s=rg(e),c=Ay(i.store,a)===s,l=Ay(i.store,`session.id`),u=My(c?`▾`:`▸`,Pt([{verb:Ct,args:[l,a,c?It:s,o,`0`]}]),!1);return u[Gy]=c?[Uy(e,{key:o,stateVar:o},[[a,It],[o,`0`]],t.closeOnPick,t.paged,i)]:[],u}function Jy(e){return{menu:{fn:(t,n)=>qy(t,sg(n??{}),e),argTypes:[`string`,`dict`],returnType:`T`}}}function Yy(){return{current:null}}function Xy(e,t){let n=e.current;if(n===null)throw Error(`{{ ${t} }} is only available inside a segment's templates — there is no active segment here. Segment-scoped functions cannot be used in variable declarations or layout-node "when" predicates, which are evaluated outside any segment.`);return n}function Zy(e){let t={fn:(()=>{let t=Xy(e,`bgOf`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],returnType:`string`};return{...uc(()=>Xy(e,`color`).palette),bgOf:t}}function Qy(e){let t=[],n=[];for(let r of e){if(!r.contains(`
107
107
  `)){n.push(r);continue}let e=r.split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "description": "Statusline renderer for Claude Code — a JSON5-configurable DSL with daemon-cached data sources, byte-clean palette-aware composition, and OSC8 click verbs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -91,9 +91,9 @@
91
91
  "mobx": "^6.15.0"
92
92
  },
93
93
  "optionalDependencies": {
94
- "@promptctl/cc-candybar-darwin-arm64": "1.28.0",
95
- "@promptctl/cc-candybar-darwin-x64": "1.28.0",
96
- "@promptctl/cc-candybar-linux-x64": "1.28.0",
97
- "@promptctl/cc-candybar-linux-arm64": "1.28.0"
94
+ "@promptctl/cc-candybar-darwin-arm64": "1.29.0",
95
+ "@promptctl/cc-candybar-darwin-x64": "1.29.0",
96
+ "@promptctl/cc-candybar-linux-x64": "1.29.0",
97
+ "@promptctl/cc-candybar-linux-arm64": "1.29.0"
98
98
  }
99
99
  }
@@ -247,14 +247,25 @@ function etaHeatFg(etaRef: string, warnRef: string): string {
247
247
  // time — the type safety net just moves from tsc to that parse, never lost.
248
248
  //
249
249
  // One collapsed-by-default drawer holding every bar-mutable display default:
250
- // theme/style/look (session `set` for a per-conversation preview, PLUS a
251
- // persist-forever twin — candybar-config-engine-71o.5 — for pinning the
252
- // choice as everyone's default), the four .3 globals steppers (persist-only,
253
- // no SessionState half at all), and one .6 segment-scoped persist control
254
- // (directoryPaletteControl, persist-only like the four steppers — a
255
- // per-segment palette pin, not a whole-bar default). Placed as a sibling in
256
- // row 1's horizontal container, toggled from beside the quick-action tray —
257
- // see `root` below.
250
+ // theme/style/look/preset (session `set` for a per-conversation preview, PLUS
251
+ // a persist-forever twin — candybar-config-engine-71o.5, brandon-presets-0yk.3
252
+ // — for pinning the choice as everyone's default), the four .3 globals
253
+ // steppers (persist-only, no SessionState half at all), and one .6
254
+ // segment-scoped persist control (directoryPaletteControl, persist-only like
255
+ // the four steppers — a per-segment palette pin, not a whole-bar default).
256
+ // Placed as a sibling in row 1's horizontal container, toggled from beside the
257
+ // quick-action tray — see `root` below.
258
+ //
259
+ // [LAW:one-source-of-truth] exception: this `kind: "group"` sugar node may
260
+ // appear EXACTLY ONCE in the whole config — group names are a synthesis-wide
261
+ // namespace (synthesizeGroupDecls collects every group across every preset's
262
+ // root too), so a second `settingsDrawer` reference embedded in a preset's
263
+ // own root would be a SECOND declaration of "settings" and collide with
264
+ // itself, not a reuse of the first. It stays only in the default `root`
265
+ // below; the library presets under `presets:` reach back to it — and to the
266
+ // rest of the settingsDrawer's controls — by switching to the "default"
267
+ // preset via the standalone `presetControl` segment they carry instead (see
268
+ // each preset's own comment), never by re-embedding the group.
258
269
  const settingsDrawer = {
259
270
  kind: "group",
260
271
  name: "settings",
@@ -263,6 +274,7 @@ const settingsDrawer = {
263
274
  children: [
264
275
  "themeControl",
265
276
  "lookControl",
277
+ "presetControl",
266
278
  "styleControl",
267
279
  "charsetControl",
268
280
  "colorCompatControl",
@@ -1099,6 +1111,25 @@ export const RAW_DEFAULT_DSL_CONFIG = {
1099
1111
  bg: "surface",
1100
1112
  fg: "foreground",
1101
1113
  },
1114
+ // Preset control — the whole-arrangement switcher (brandon-presets-0yk.3),
1115
+ // the exact twin of themeControl/lookControl one level up: `.preset.
1116
+ // effective` is the daemon-resolved name (effectivePresetName) that chose
1117
+ // BOTH the compiled root this render walked and the globals it rendered
1118
+ // with, so the label can never name an arrangement the bar is not in.
1119
+ // closeOnPick on both menus, like lookControl: a preset swap is a
1120
+ // decisive whole-bar change tried one at a time, not a stackable tweak.
1121
+ // Lives inside settingsDrawer (never inside a preset's own staged root —
1122
+ // see settingsDrawer's comment), so every bundled preset — including the
1123
+ // narrow `compact` one — keeps the one control that switches back.
1124
+ presetControl: {
1125
+ template:
1126
+ "▦ {{ .preset.effective }} " +
1127
+ '{{ menu "applyPreset" (dict "key" "pickers" "closeOnPick" true) }} ' +
1128
+ '📌{{ menu "applyPresetForever" (dict "key" "pickersForever" "closeOnPick" true) }} ' +
1129
+ '{{ action "resetPreset" "↺" }}',
1130
+ bg: "surface",
1131
+ fg: "foreground",
1132
+ },
1102
1133
  // ── The four .3 globals steppers, folded into the settingsDrawer group
1103
1134
  // (candybar-config-engine-71o.4) alongside theme/style/look above. Each
1104
1135
  // pairs a `persist` control with a `↺` reset (docs' persist/reset
@@ -1263,23 +1294,33 @@ export const RAW_DEFAULT_DSL_CONFIG = {
1263
1294
  // block's names — the same derivation test/dsl-looks.test.ts exercises.
1264
1295
  applyTheme: { set: "theme", from: "themes" },
1265
1296
  applyLook: { set: "look", from: "looks" },
1297
+ // [LAW:one-type-per-behavior] The preset picker's session-preview
1298
+ // behavior (brandon-presets-0yk.3), the exact twin of applyLook one level
1299
+ // up: "preset" has no baseline SessionState entry, so this derives a
1300
+ // fresh allow-list validator ranging the merged `presets` block's names
1301
+ // (the floor included — presetNames always seeds it) via the same
1302
+ // `from`-sourced derivation every picker above uses.
1303
+ applyPreset: { set: "preset", from: "presets" },
1266
1304
 
1267
1305
  // [LAW:one-source-of-truth] The persist-forever twins of applyTheme/
1268
- // applyStyle/applyLook above (candybar-config-engine-71o.5) — same
1269
- // domain sources (`from`), same picker mechanism, but the target is the
1270
- // Globals field the config DEFAULT reads (`palette`/`style`/`look`,
1271
- // isGlobalsField-checked at load), not the SessionState key the session
1272
- // preview writes. Precedence is unchanged: a session's own `set` pick
1273
- // (applyTheme/applyStyle/applyLook) still wins over a persisted default
1274
- // for that session — effectiveThemeName/effectiveStripStyle/
1275
- // effectiveLookName all read SessionState before globals. Paired with a
1276
- // `reset` each, per the docs' persist/reset convention.
1306
+ // applyStyle/applyLook/applyPreset above (candybar-config-engine-71o.5,
1307
+ // brandon-presets-0yk.3) — same domain sources (`from`), same picker
1308
+ // mechanism, but the target is the Globals field the config DEFAULT
1309
+ // reads (`palette`/`style`/`look`/`preset`, isGlobalsField-checked at
1310
+ // load), not the SessionState key the session preview writes.
1311
+ // Precedence is unchanged: a session's own `set` pick still wins over a
1312
+ // persisted default for that session — effectiveThemeName/
1313
+ // effectiveStripStyle/effectiveLookName/effectivePresetName all read
1314
+ // SessionState before globals. Paired with a `reset` each, per the docs'
1315
+ // persist/reset convention.
1277
1316
  applyThemeForever: { persist: "palette", from: "themes" },
1278
1317
  resetTheme: { reset: "palette" },
1279
1318
  applyStyleForever: { persist: "style", from: "styles" },
1280
1319
  resetStyle: { reset: "style" },
1281
1320
  applyLookForever: { persist: "look", from: "looks" },
1282
1321
  resetLook: { reset: "look" },
1322
+ applyPresetForever: { persist: "preset", from: "presets" },
1323
+ resetPreset: { reset: "preset" },
1283
1324
 
1284
1325
  // [LAW:locality-or-seam] The settings-drawer steppers' behaviors
1285
1326
  // (candybar-config-engine-71o.4), decoupled by NAME from
@@ -1380,21 +1421,117 @@ export const RAW_DEFAULT_DSL_CONFIG = {
1380
1421
  // Named config FRAGMENTS — each an alternative `root` + display `globals`,
1381
1422
  // i.e. a whole arrangement of the bar rather than one knob. A preset is to
1382
1423
  // configuration what a look is to a theme, and rides the identical seam:
1383
- // selected per session via the `preset` SessionState key (an action
1384
- // `{ set: "preset", from: "presets" }` + a `{{ menu }}`), resolved as session
1385
- // pick over globals.preset over this floor.
1424
+ // selected per session via the `preset` SessionState key (the applyPreset
1425
+ // action, `{ set: "preset", from: "presets" }`, and the presetControl
1426
+ // segment's `{{ menu }}` above), resolved as session pick over
1427
+ // globals.preset over this floor.
1386
1428
  // [LAW:one-source-of-truth] Merges by name (user wins per name), so this
1387
- // stdlib — currently just the floor — is present in every merged config by
1388
- // construction, exactly as looks' "none" is.
1429
+ // stdlib is present in every merged config by construction, exactly as
1430
+ // looks' "none"/"vivid"/"muted"/… is — a user redefining "compact" or
1431
+ // "verbose" wins per name; the floor cannot be shadowed by anything but an
1432
+ // empty fragment, because that IS what it already is.
1433
+ //
1434
+ // [LAW:carrying-cost] Each library preset stages only real deltas from the
1435
+ // bundled default's own root (declared above) — no preset here restates a
1436
+ // segment's template, bg, or fg, only which of the ALREADY-declared
1437
+ // segments appear and in what arrangement, per the field cap
1438
+ // (brandon-presets-0yk.1's premise note): a bundled preset can only STAGE
1439
+ // segments DEFAULT_DSL_CONFIG.segments already declares, never introduce
1440
+ // one.
1441
+ //
1442
+ // [LAW:verifiable-goals] Every entry here is asserted error-cell-free at
1443
+ // 80/120/200 columns against a RICH payload in
1444
+ // test/default-dsl-config.test.ts (the same checkPayload fixture check.ts
1445
+ // uses) — curated by actually rendering each arrangement, not by reading
1446
+ // the segment names off the page.
1389
1447
  presets: {
1390
1448
  // [LAW:dataflow-not-control-flow] "default" is just the identity fragment
1391
1449
  // — the resolution floor as a value, not a special case. An empty fragment
1392
1450
  // declares no `root` and no `globals`, so it stages the config's own, which
1393
- // is precisely what "no preset chosen" means. A usable preset LIBRARY on
1394
- // top of this floor is brandon-presets-0yk.3; the floor itself belongs here
1395
- // because effectivePresetName's collapse target must exist in every merged
1396
- // config, the same load-bearing reason "none" ships beside the real looks.
1451
+ // is precisely what "no preset chosen" means. This is the bundled default's
1452
+ // OWN two-row (identity / status) arrangement declared as `root` above
1453
+ // it needs no entry of its own here beyond the floor, because staging it
1454
+ // AS a named fragment would be a byte-for-byte copy of `root` that could
1455
+ // silently drift from it the moment either changed.
1397
1456
  default: {},
1457
+
1458
+ // Single-row arrangement for narrow terminals and split panes — the
1459
+ // situation where a user most wants a different arrangement and least
1460
+ // wants to hand-write one. Keeps only the three facts a split pane most
1461
+ // needs at a glance (where am I / what's the git state / how much context
1462
+ // is left), the quiet one-line `git` segment rather than the multi-fact
1463
+ // `gitaculous`, and `padding: 0` to buy back the chrome a narrow column
1464
+ // can't spare.
1465
+ //
1466
+ // [LAW:no-silent-failure] Carries the standalone `presetControl` segment
1467
+ // (NOT the full settingsDrawer group — see that constant's own comment on
1468
+ // why a group can't be re-embedded) so a session that switches TO compact
1469
+ // is never stranded: one click back to "default" restores the drawer and
1470
+ // everything else compact traded away for width.
1471
+ compact: {
1472
+ root: {
1473
+ kind: "container",
1474
+ direction: "horizontal",
1475
+ children: [
1476
+ { kind: "segment", name: "directory" },
1477
+ { kind: "segment", name: "git" },
1478
+ { kind: "segment", name: "context" },
1479
+ { kind: "segment", name: "presetControl" },
1480
+ ],
1481
+ },
1482
+ globals: { padding: 0 },
1483
+ },
1484
+
1485
+ // Verbose arrangement surfacing every segment that is declared but NOT in
1486
+ // the default root (gitPr, burnrate, speed, tokenSparkline — see each
1487
+ // segment's own "declared-but-opt-in" comment above) alongside the
1488
+ // default's own two rows, for a user who wants the full usage-monitor
1489
+ // picture rather than the quiet default. A third row carries the two
1490
+ // per-turn throughput segments, which read "—" between turns
1491
+ // ([LAW:no-silent-failure] on speed/tokenSparkline) rather than an empty
1492
+ // or stale row. Carries the standalone `presetControl` in place of the
1493
+ // full settingsDrawer group, exactly like `compact` and for the same
1494
+ // reason (that constant's comment) — switching back to "default" reaches
1495
+ // the drawer and every other bar-mutable default from there.
1496
+ verbose: {
1497
+ root: {
1498
+ kind: "container",
1499
+ direction: "vertical",
1500
+ children: [
1501
+ {
1502
+ kind: "container",
1503
+ direction: "horizontal",
1504
+ children: [
1505
+ { kind: "segment", name: "directory" },
1506
+ { kind: "segment", name: "gitaculous" },
1507
+ { kind: "segment", name: "gitPr" },
1508
+ { kind: "segment", name: "toolbar" },
1509
+ { kind: "segment", name: "presetControl" },
1510
+ ],
1511
+ },
1512
+ {
1513
+ kind: "container",
1514
+ direction: "horizontal",
1515
+ children: [
1516
+ { kind: "segment", name: "model" },
1517
+ { kind: "segment", name: "context" },
1518
+ { kind: "segment", name: "cacheTimer" },
1519
+ { kind: "segment", name: "block" },
1520
+ { kind: "segment", name: "weekly" },
1521
+ { kind: "segment", name: "burnrate" },
1522
+ ],
1523
+ },
1524
+ {
1525
+ kind: "container",
1526
+ direction: "horizontal",
1527
+ children: [
1528
+ { kind: "segment", name: "speed" },
1529
+ { kind: "segment", name: "tokenSparkline" },
1530
+ ],
1531
+ },
1532
+ ],
1533
+ },
1534
+ },
1398
1535
  },
1399
1536
 
1400
1537
  // [LAW:single-enforcer] / [LAW:one-source-of-truth] Display-formatting policy