@promptctl/cc-candybar 1.127.1 → 1.127.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +5 -5
  2. package/package.json +5 -5
package/dist/index.mjs CHANGED
@@ -165,7 +165,7 @@ Config tooling:
165
165
  `)||null}function Nk(e){switch(e.kind){case`chain`:return e.unchecked.map(e=>`Config location could not be checked: ${e.path} — ${e.error}`);case`missing`:return[`Config file not found: ${e.path} — rendering the bundled default until it appears`];case`unreadable`:return[`Config file could not be read: ${e.path} — ${e.error} — rendering the bundled default until it can be`]}}function Pk(e,t){let n=Dk(e,t).filter(e=>Tk(e)===`present`),r=new Map;for(let e of n){let t=l.dirname(e),n=l.basename(e).replace(/\.(json5|json)$/,``),i=l.join(t,n);r.has(i)||r.set(i,[]),r.get(i).push(e)}let i=[...r.values()].filter(e=>e.length>1);return i.length===0?null:`config-extension collision: ${i.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function Fk(e){return`plugin ${e.path} was not loaded: ${e.reason}`}const Ik=new Set([`data`,`segments`,`helpers`,`actions`]),Lk=`plugin.json5`,Rk=/^[a-z][a-z0-9_]*$/;function zk(e){let t=l.basename(l.dirname(e));return Rk.test(t)?t:void 0}const Bk=`plugins.`;function Vk(e){return`${Bk}${e}.data`}function Hk(e){try{return{ok:!0,value:e()}}catch(e){return{ok:!1,reason:Uk(e)}}}function Uk(e){return e instanceof pu?e.issues.map(e=>e.path===``||e.message.includes(e.path)?e.message:`${e.path}: ${e.message}`).join(`; `):e instanceof Error?e.message:String(e)}function Wk(e,t){return e.map(e=>l.resolve(l.dirname(t),Ek(e)))}function Gk(e,t,n,i){let a=new Map;return e.reduce((e,n)=>{let o=zk(n),s=(t,r)=>{let i=new Map(e.rendering);return o!==void 0&&r!==e.config&&i.delete(o),{...e,config:r,rendering:i,dropped:[...e.dropped,{path:n,plugin:o,reason:t}]}};if(l.basename(n)!==`plugin.json5`){let t=`a plugin is a folder holding its ${Lk}, and the folder's name is the plugin's: move this file to <dir>/<name>/${Lk} and list that`;return s(t,o===void 0?e.config:Jk(qk(e.config,o),o,{path:n,plugin:o,reason:t}))}if(o===void 0)return s(`its folder "${l.basename(l.dirname(n))}" is not a plugin name (one matching ${Rk}: it prefixes every name the plugin declares)`,e.config);let c=a.get(o);if(c!==void 0)return s(`plugin "${o}" is already listed, from ${c}`,e.config);a.set(o,n);let u=qk(e.config,o),d=Hk(()=>{let a=r.readFileSync(n,`utf-8`),s=Id(eA(n,o,{source:a,json:at.default.parse(a)},t),u);return i(s,o,u!==e.config),s});if(d.ok)return{...e,config:d.value,loaded:[...e.loaded,n],rendering:new Map([...e.rendering,[o,n]])};let f={path:n,plugin:o,reason:d.reason};return s(d.reason,Jk(u,o,f))},{config:n.config,rendering:n.rendering,loaded:[],dropped:[]})}function Kk(e){let t=`${Bk}${e}.`;return e=>e.startsWith(t)}function qk(e,t){let n=Kk(t),r=e=>Object.fromEntries(Object.entries(e).filter(([e])=>!n(e)));return[e.variables,e.segments,e.helpers,e.actions].some(e=>Object.keys(e).some(n))?{...e,variables:r(e.variables),segments:r(e.segments),helpers:r(e.helpers),actions:r(e.actions)}:e}function Jk(e,t,n){return{...e,variables:{...e.variables,[Vk(t)]:{kind:`dropped`,reason:Fk(n),definition:n.path}}}}function Yk(e){return e.startsWith(`plugins.`)?e.slice(8).split(`.`)[0]:void 0}function Xk(e,t){let n=new Set([...Object.keys(e.config.variables),...Object.keys(e.config.segments)].map(Yk)),r=[...t,...e.dropped].filter(e=>e.plugin===void 0).map(e=>({definition:e.path,notice:Fk(e)}));return t=>{let i=Yk(t);if(i===void 0)return[];let a=e.config.variables[Vk(i)];return a?.kind===`dropped`?[{definition:a.definition,notice:a.reason}]:n.has(i)?[]:r}}function Zk(e,t){let n=Mb(e.presets).flatMap(t=>[...wu(Fb(e,t).node)]).flatMap(e=>e.kind===`segment`?[e]:[]),r=[...new Set([...n.map(e=>e.name),...Object.keys(e.segments)])].map(e=>({name:e,cause:t(e)})).filter(({cause:e})=>e.length>0),i=Object.fromEntries(r.map(({name:e,cause:t})=>[e,Qk(e,t.map(e=>e.notice),n.filter(t=>t.name===e))])),a=t=>{let n=Yk(t),r=n===void 0?void 0:e.variables[Vk(n)];return r?.kind===`dropped`?{definition:r.definition,notice:r.reason}:void 0},o=Object.values(e.variables).some(e=>e.kind===`dropped`),s=o?Object.values(e.segments).flatMap(e=>[`template`,`bg`,`fg`,`when`].flatMap(t=>e[t]===void 0?[]:[e[t]])):[],c=o?Object.values(e.actions).flatMap(e=>`do`in e?[...e.do]:[]):[],l=(e,t)=>[...new Set(e)].flatMap(e=>{let n=e in t?void 0:a(e);return n===void 0?[]:[[e,n]]}),u=l([...s.flatMap(t=>Ex(t,e.helpers).map(e=>e.name)),...c],e.actions),d=l(s.flatMap(t=>[...Ox(t,e.helpers)]),e.helpers),f=new Set([...r.flatMap(({cause:e})=>e.map(e=>e.definition)),...[...u,...d].map(([,e])=>e.definition)]);return{config:{...e,segments:{...e.segments,...i},actions:{...e.actions,...Object.fromEntries(u.map(([e])=>[e,{copy:`{{ .${Vk(Yk(e)??``)} }}`}]))},helpers:{...e.helpers,...Object.fromEntries(d.map(([e,t])=>[e,`{{ fail ${JSON.stringify(t.notice)} }}`]))}},reached:f}}function Qk(e,t,n){let r=`⚠ ${e}: ${t.join(`; `)}`,i=new Map;for(let e of n)for(let[t,n]of Object.entries(e.settings??{})){let e=i.get(t);i.set(t,e===void 0?[n]:[...e,n])}let a=Object.fromEntries([...i].map(([e,t])=>[e,$k(e,t)]));return{template:`{{ ${JSON.stringify(r)} }}`,bg:`error`,description:`stands in for a segment whose plugin did not load`,settings:a}}function $k(e,t){let[n]=t,r=t.filter(e=>typeof e==`number`);return typeof n==`boolean`?{label:e,domain:`bool`,default:n}:typeof n==`number`?{label:e,domain:{min:Math.min(...r),max:Math.max(...r),step:1},default:n}:{label:e,domain:[...new Set(t.map(String))],default:n}}function eA(e,t,{source:n,json:r},{projectDir:i}){let a=[],o=()=>{throw new pu(e,a)};if(!Qu(r))return a.push({path:``,message:`a plugin definition must be an object, got ${$u(r)}`}),o();for(let e of Object.keys(r))Ik.has(e)||a.push({path:e,message:e===`plugin`?`a plugin definition does not name itself: its name is its folder's ("${t}") — remove "plugin"`:`a plugin definition may not declare "${e}". Expected only: ${[...Ik].join(`, `)}`});let s=rA(r.data,e,i,a);if(Qu(r.segments)||a.push({path:`segments`,message:`"segments" must be an object naming the plugin's segments`}),a.length>0||s===void 0)return o();let c={source:n,issues:a,allowedPalettes:new Set(jc()),groups:[]},l=Wf(c,`data`,{[Vk(t)]:{kind:`file`,path:s,parse:{json:!0},cache:{watch_file:s},default:{}}});for(let[e,t]of Object.entries(r.segments))Qu(t)&&`vars`in t&&a.push({path:`segments.${e}.vars`,message:`a plugin segment may not declare "vars": a plugin's only source is its data file`});let u={variables:l,segments:nA(t,qp(c,r.segments,new Set)),helpers:nA(t,KO(c,r.helpers)),actions:nA(t,QD(c,r.actions))};for(let[e,t]of tA(u))try{Yb.parse(t)}catch(t){a.push({path:e,message:`Template parse error in ${e}: ${t.message}`})}return a.length>0&&o(),u}function*tA(e){for(let[t,n]of Object.entries(e.segments??{}))for(let e of[`template`,`bg`,`fg`,`when`]){let r=n[e];r!==void 0&&(yield[`segments.${t}.${e}`,r])}for(let[t,n]of Object.entries(e.helpers??{}))yield[`helpers.${t}`,`{{ define "${t}" }}${n}{{ end }}`];for(let[t,n]of Object.entries(e.actions??{}))`copy`in n&&(yield[`actions.${t}.copy`,n.copy]),`open`in n&&(yield[`actions.${t}.open`,n.open]),`preset`in n&&n.preset===`delete`&&(yield[`actions.${t}.name`,n.name])}function nA(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[`${Bk}${e}.${t}`,n]))}function rA(e,t,n,r){if(typeof e==`string`&&e!==``)return l.resolve(l.dirname(t),Ek(e));if(Qu(e)&&Object.keys(e).length===1&&typeof e.project==`string`&&e.project!==``){let t=e.project;if(l.isAbsolute(t)||t.startsWith(`~`)||l.normalize(t).split(l.sep)[0]===`..`){r.push({path:`data.project`,message:`data.project "${t}" must be a path inside the project, relative to its root (like ".lit/candybar.json"): no absolute path, "~" or ".."`});return}if(n===null){r.push({path:`data.project`,message:`data is read from the session's project, and this load has none`});return}return l.resolve(n,t)}r.push({path:`data`,message:`"data" must be the path of the plugin's JSON data file relative to this definition, or { project: "<path>" } relative to the session's project`})}function iA(e){let t=(process.env.XDG_DATA_DIRS||aA()).split(`:`).filter(e=>e!==``),n=process.env.XDG_DATA_HOME||l.join(h.homedir(),`.local`,`share`),r=[...[...t].reverse().map(e=>l.join(e,`cc-candybar`,`plugins`)),l.join(n,`cc-candybar`,`plugins`),...e===null?[]:[l.join(e,`.cc-candybar`,`plugins`)]];return r.filter((e,t)=>r.lastIndexOf(e)===t)}function aA(){let e=`/usr/local/share:/usr/share`;return process.platform===`darwin`?`${l.join(process.env.HOMEBREW_PREFIX||`/opt/homebrew`,`share`)}:${e}`:e}function oA(e){let t=iA(e),n=new Map,r=[],i=[];for(let e of t){let t=sA(e);if(`error`in t){r.push(t);continue}for(let r of t.folders)n.delete(r),n.set(r,l.join(e,r,Lk));for(let n of t.files)i.push({path:l.join(e,n),plugin:void 0,reason:`a plugin is a folder holding its ${Lk}: move this file to ${l.join(e,`<name>`,Lk)}`})}return{roots:t,definitions:[...n.values()],unchecked:r,strays:i}}function sA(e){try{let t=r.readdirSync(e,{withFileTypes:!0}).filter(e=>!e.name.startsWith(`.`)).sort((e,t)=>e.name<t.name?-1:+(e.name>t.name)),n=t=>t.isDirectory()||cA(e,t);return{folders:t.filter(n).map(e=>e.name),files:t.filter(e=>!n(e)).map(e=>e.name)}}catch(t){return t.code===`ENOENT`?{folders:[],files:[]}:{path:e,error:t.message}}}function cA(e,t){if(!t.isSymbolicLink())return!1;try{return r.statSync(l.join(e,t.name)).isDirectory()}catch{return!0}}function lA(e,t,n,i){return e===null?{...vA,config:Id(vA.raw,t)}:dA(e,r.readFileSync(e,`utf-8`),t,n,i)}const uA={projectDir:null,beneath:{dropped:[],rendering:new Map}};function dA(e,t,n,r,i){let a=xA(e,t,i,(t,a)=>{let o=Gk(Wk(t,e),r,{config:n,rendering:r.beneath.rendering},(t,n,r)=>gA(t,n,r,e,i)),s=Xk(o,r.beneath.dropped);return{inherited:new Set([...Kp(o.config),...a.filter(e=>s(e).length>0)]),layer:{plugins:o,owning:s}}}),{plugins:o,owning:s}=a.layer,c=Zk(Id(a.raw,o.config),s);return{source:t,raw:a.raw,warnings:[...a.warnings,...o.dropped.map(Fk)],plugins:{loaded:o.loaded,dropped:o.dropped,reached:c.reached,rendering:o.rendering},config:c.config}}const fA=new WeakMap;function pA(e,t,n,r){let i=JSON.stringify([[...r??[]].sort(),e.map(e=>[e,mA(e)])]),a=fA.get(n)??new Map;fA.set(n,a);let o=String(t.projectDir),s=a.get(o);if(s?.key===i)return s.layer;let c=Gk(e,t,{config:n,rendering:new Map},(e,t,n)=>gA(e,t,n,`<installed plugins>`,r));return a.set(o,{key:i,layer:c}),c}function mA(e){try{let t=r.statSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch(e){return e.code??`unreadable`}}function hA(e,t,n,i,a=e=>r.readFileSync(e,`utf-8`),o){let s=oA(i.projectDir),c=pA(s.definitions,i,t,o),l={...c,dropped:[...c.dropped,...s.strays]};n.warned(s.unchecked.map(e=>`Plugin folder could not be listed: ${e.path} — ${e.error}`));let u=l.config,d=[];for(let t of e){n.entered(t);let e=d.at(-1)?.plugins,r=dA(t,a(t),d.at(-1)?.config??u,{...i,beneath:{dropped:[...l.dropped,...d.flatMap(e=>e.plugins.dropped)],rendering:e?.rendering??l.rendering}},o);n.warned(r.warnings),d.push({...r,path:t})}let f=new Set(d.flatMap(e=>[...e.plugins.reached])),p=e=>f.has(e.path),m=l.dropped.filter(p),h=l.dropped.filter(e=>!p(e));n.warned(m.map(Fk));let g={roots:s.roots,loaded:l.loaded,dropped:m,unreached:h,reached:f,rendering:d.at(-1)?.plugins.rendering??l.rendering},_=d.at(-1);if(_===void 0)return{layers:d,base:u,installed:g,config:yA(lA(null,u,uA),`<default>`,o)};try{return{layers:d,base:u,installed:g,config:yA(_,_.path,o)}}catch(e){for(let e of d.slice(0,-1))n.entered(e.path),yA(e,e.path,o);throw n.entered(_.path),e}}function gA(e,t,n,r,i){if(n){yA(_A(e),r,i);return}let a=Kk(t),o=[],s={source:``,issues:o,allowedPalettes:new Set,groups:[]};if(bk(s,e,Ax(e),a),Sk(s,e,a),o.length>0)throw new pu(r,o)}function _A(e){return{config:e,raw:{root:e.root,presets:e.presets},source:``}}const vA={raw:{},source:``,warnings:[],plugins:{loaded:[],dropped:[],reached:new Set,rendering:new Map}};function yA({config:e,raw:t,source:n},r=`<config>`,i=new Set(jc())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(QO(o,e,t),Sk(o,e),a.length>0)throw new pu(r,a);let s=Jb(e,a);if(a.length>0)throw new pu(r,a);return JD(mD(s))}function bA(e,t,n=new Set(jc()),r=SA){return xA(e,t,n,()=>({inherited:r,layer:null})).raw}function xA(e,t,n,r){let i=CA(e,t),a=gu(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(jc()),groups:[]};if(!Qu(i))throw new pu(e,[{path:``,message:`Config root must be an object, got ${$u(i)}`}],o);let{inherited:l,layer:u}=r(i.plugins===void 0?[]:EA({...c,issues:[]},i.plugins)??[],Qu(i.segments)?Object.keys(i.segments):[]),d=wA(c,i,l);if(s.length>0)throw new pu(e,s,o);return{raw:d,warnings:o,layer:u}}const SA=new Set;function CA(e,t){try{return at.default.parse(t)}catch(t){let n=t;throw new pu(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function wA(e,t,n){for(let n of Object.keys(t))TA.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...TA].join(`, `)}`,line:G(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Ef(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Wf(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=qp(e,t.segments,n)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported — use "root" with the A-grammar instead.
166
166
  Replace: layout: [["seg1", "seg2"], ["seg3"]]
167
167
  With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
168
- Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=gm(e,`root`,t.root)),t.actions!==void 0&&(r.actions=QD(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" — move the block under styles: { … } (and globals.look to globals.style)`,line:G(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=UO(e,t.styles)),t.themeDefaults!==void 0&&(r.themeDefaults=Tf(e,t.themeDefaults)),t.presets!==void 0&&(r.presets=GO(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=kf(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=KO(e,t.helpers)),t.plugins!==void 0&&(r.plugins=EA(e,t.plugins)),wm(e,r),Kb(e,r),cx(e,r),Op(e,r,wp,`the global settings menu`),r}const TA=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`themeDefaults`,`presets`,`editGlobals`,`helpers`,`plugins`]);function EA(e,t){if(Array.isArray(t)&&t.every(e=>typeof e==`string`&&e!==``))return t;e.issues.push({path:`plugins`,message:`"plugins" must be a list of plugin definition paths, got ${$u(t)}`,line:G(e.source,[`plugins`])})}function DA(e){let t=NA(e.termCols),n=NA(e.termRows),r=PA(e.ssh),i=jA(e.tmux),a=AA(e.configEnv),o=kA(e.claudeConfigDir),s=OA(e.mementoEnv);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o},...s!==void 0&&{mementoEnv:s}}}function OA(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=$e.filter(e=>t[e]!==void 0);return n.every(e=>kA(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function kA(e){return typeof e==`string`&&l.isAbsolute(e)?e:void 0}function AA(e){return typeof e==`string`&&e!==``?Ek(e):void 0}function jA(e){if(e===null)return null;if(typeof e!=`object`)return;let{socket:t,pane:n,truecolor:r}=e;if(!(typeof t!=`string`||t===``)&&!(typeof n!=`string`||n===``)&&!(r!==null&&(typeof r!=`string`||r===``)))return{socket:t,pane:n,truecolor:r}}const MA=1e4;function NA(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>MA?MA:t}function PA(e){return typeof e==`boolean`?e:void 0}function FA(e){return typeof e==`string`&&e!==``&&e.length<=64?e:null}var IA=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function LA(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function RA(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 IA(`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 IA(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function zA(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=RA(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(LA(t))})}async function BA(e,t,n){let r=null;try{r=await GA(ze(),t.connectMs);let i=await zA(r,{v:3,...e},t.budgetMs);return UA(e.kind,i,n)}catch(e){return WA(e)}finally{r&&r.destroy()}}function VA(e,t){return typeof e==`string`?e:t}function HA(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function UA(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=VA(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:HA(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 WA(e){if(e instanceof IA||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 GA(e,t){return new Promise((n,r)=>{let i=x.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 KA(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 qA=`1.127.1`,JA={connectMs:50,budgetMs:150},YA={connectMs:50,budgetMs:200};function XA(e){let t=e.output;return typeof t==`string`?t:void 0}function ZA(e,t,n,r){return BA({kind:`render`,hookData:e,args:t,cwd:n,...r},JA,XA)}function QA(e,t){return BA({kind:`click`,verb:e,value:t,clientVersion:qA},YA,XA)}function $A(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable — ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
168
+ Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=gm(e,`root`,t.root)),t.actions!==void 0&&(r.actions=QD(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" — move the block under styles: { … } (and globals.look to globals.style)`,line:G(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=UO(e,t.styles)),t.themeDefaults!==void 0&&(r.themeDefaults=Tf(e,t.themeDefaults)),t.presets!==void 0&&(r.presets=GO(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=kf(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=KO(e,t.helpers)),t.plugins!==void 0&&(r.plugins=EA(e,t.plugins)),wm(e,r),Kb(e,r),cx(e,r),Op(e,r,wp,`the global settings menu`),r}const TA=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`themeDefaults`,`presets`,`editGlobals`,`helpers`,`plugins`]);function EA(e,t){if(Array.isArray(t)&&t.every(e=>typeof e==`string`&&e!==``))return t;e.issues.push({path:`plugins`,message:`"plugins" must be a list of plugin definition paths, got ${$u(t)}`,line:G(e.source,[`plugins`])})}function DA(e){let t=NA(e.termCols),n=NA(e.termRows),r=PA(e.ssh),i=jA(e.tmux),a=AA(e.configEnv),o=kA(e.claudeConfigDir),s=OA(e.mementoEnv);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o},...s!==void 0&&{mementoEnv:s}}}function OA(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=$e.filter(e=>t[e]!==void 0);return n.every(e=>kA(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function kA(e){return typeof e==`string`&&l.isAbsolute(e)?e:void 0}function AA(e){return typeof e==`string`&&e!==``?Ek(e):void 0}function jA(e){if(e===null)return null;if(typeof e!=`object`)return;let{socket:t,pane:n,truecolor:r}=e;if(!(typeof t!=`string`||t===``)&&!(typeof n!=`string`||n===``)&&!(r!==null&&(typeof r!=`string`||r===``)))return{socket:t,pane:n,truecolor:r}}const MA=1e4;function NA(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>MA?MA:t}function PA(e){return typeof e==`boolean`?e:void 0}function FA(e){return typeof e==`string`&&e!==``&&e.length<=64?e:null}var IA=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function LA(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function RA(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 IA(`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 IA(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function zA(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=RA(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(LA(t))})}async function BA(e,t,n){let r=null;try{r=await GA(ze(),t.connectMs);let i=await zA(r,{v:3,...e},t.budgetMs);return UA(e.kind,i,n)}catch(e){return WA(e)}finally{r&&r.destroy()}}function VA(e,t){return typeof e==`string`?e:t}function HA(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function UA(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=VA(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:HA(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 WA(e){if(e instanceof IA||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 GA(e,t){return new Promise((n,r)=>{let i=x.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 KA(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 qA=`1.127.2`,JA={connectMs:50,budgetMs:150},YA={connectMs:50,budgetMs:200};function XA(e){let t=e.output;return typeof t==`string`?t:void 0}function ZA(e,t,n,r){return BA({kind:`render`,hookData:e,args:t,cwd:n,...r},JA,XA)}function QA(e,t){return BA({kind:`click`,verb:e,value:t,clientVersion:qA},YA,XA)}function $A(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable — ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
169
169
  `)}function ej(e,t){return e===`darwin`?[tj(`footprint`,[`-p`,String(t)]),tj(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[nj(`/proc/self/smaps_rollup`),nj(`/proc/self/status`)]:[]}function tj(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=O({bin:e,args:[...t],timeoutMs:5e3,category:`limits.memory-report`});return n.ok?n.stdout.trim().length>0?{kind:`text`,text:n.stdout}:{kind:`unavailable`,reason:`exited 0 but printed nothing`}:{kind:`unavailable`,reason:`${n.reason}${n.error===void 0?``:`: ${n.error}`}${rj(n.stderr)}`}}}}function nj(e){return{name:e,read:()=>{try{let t=r.readFileSync(e,`utf8`);return t.trim().length>0?{kind:`text`,text:t}:{kind:`unavailable`,reason:`empty file`}}catch(e){return{kind:`unavailable`,reason:e.message}}}}}function rj(e){let t=e.split(`
170
170
  `).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const ij=`CC_CANDYBAR_RSS_LIMIT_MB`;function aj(e){let t=e[ij];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${ij} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function oj(e){return aj(e)*2}const sj=1024*1024;function cj(e){return aj(e)*sj}const lj={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function uj(e,t,n){let{prefix:r,suffix:i}=lj[t];return l.join(e,`${r}${n}${i}`)}function dj(e){for(let t of Object.keys(lj)){let{prefix:n,suffix:r}=lj[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function fj(e){let t=e.rssLimitBytes??512*sj,n=e.snapshotsKeep??3,r=!1;function i(){if(r)return!0;let{rss:i,heapTotal:a}=e.memoryBytes();if(i<=t)return!1;r=!0,e.log(`warn`,`RSS ${i} > limit ${t} (v8 heap ${a}); recording memory then shutting down`);let o=`${new Date(e.now()).toISOString().replace(/[:.]/g,`-`)}-${e.pid}`;return pj(e.log,`memory report`,()=>{let t=uj(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),pj(e.log,`heap snapshot`,()=>{let t=uj(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),pj(e.log,`artifact rotation`,()=>{hj(e.listArtifacts(),n,e.removeFile)}),e.shutdown(0),!0}function a(){let{rss:n,heapTotal:r}=e.memoryBytes();return n>t*.75?`rss ${n} approaching limit ${t} (v8 heap ${r})`:null}function o(e=6e4){let t=setInterval(()=>{i()},e);return t.unref(),{disarm:()=>clearInterval(t)}}return{checkRss:i,describeNextRestart:a,arm:o}}function pj(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function mj(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=dj(t);if(n===null)return t;let{prefix:r,suffix:i}=lj[n];return t.slice(r.length,t.length-i.length)}function hj(e,t,n){let r=new Map;for(let t of e){let e=mj(t),n=r.get(e);n===void 0?r.set(e,[t]):n.push(t)}let i=[...r.keys()].sort((e,t)=>t.localeCompare(e));for(let e of i.slice(t))for(let t of r.get(e)??[])try{n(t)}catch{}}function gj(e,t,n={}){let i=Re();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Z,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>$A(ej(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>re.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>dj(e)!==null).map(e=>l.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function _j(e={}){if(Nj()!==null)return;let n=e.spawn??Pj,r=Aj();if(r.kind===`contended`){let e=yj();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),vj(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),vj(n);return}try{vj(n)}finally{Mj()}}function vj(e){Ej()&&bj(e)}function yj(){try{let e=r.statSync(Je());return Date.now()-e.mtimeMs}catch{return null}}function bj(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
171
171
  `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function xj(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function Sj(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function Cj(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 wj(e,n){try{r.mkdirSync(l.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 Tj(){try{r.unlinkSync(Xe())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function Ej(){let e=Ye(),n=Xe(),r=Cj(n),i=xj(Dj(e),Sj(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`),Oj(e),wj(n,Math.min(r+1,5)),!0)}function Dj(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function Oj(e){try{r.mkdirSync(l.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 kj=null;function Aj(){let e=Je();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 kj={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(!jj(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 jj(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function Mj(){if(!kj)return;let{fd:e,path:t}=kj;kj=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function Nj(){try{return r.mkdirSync(Re(),{recursive:!0}),null}catch(e){return`mkdir ${Re()}: ${e.message}`}}function Pj(){let e=t.execPath,n=t.argv[1];return n?Me({bin:e,args:[`--max-old-space-size=${oj(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const Fj=`cc-candybar`,Ij=`dispatch`,Lj=`set-state`,Rj=`step-state`,zj=`copy`,Bj=`open-vscode`,Vj=`toolbar-toggle`,Hj=`show-config-error`,Uj=`show-config-warning`,Wj=`set-config`,Gj=`step-config`,Kj=`save`,qj=`save-preset`,Jj=`save-theme-default`,Yj=`delete-preset`,Xj=`reset-config`,Zj=`apply-layout-op`,Qj=`undo`,$j=`redo`,eM=`back`,tM=`rewind`,nM=`apply-update`,rM=`doctor-run`,iM=`doctor-fix`,aM=`doctor-probe`,oM=`ceiling`,sM=`slash`;function cM(e){return e.map(encodeURIComponent).join(`/`)}function lM(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function uM(e){return`${Fj}://${Ij}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${cM(e.args)}`)}`).join(`&`)}`}function dM(e){return new T(e).getAll(`e`).map(hM)}const fM=new Set([Lj,Xj]);function pM(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&mM(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function mM(e,t){if(e.verb!==t.verb||!fM.has(e.verb))return;let[n,r]=[hM(e.value),hM(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function hM(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const gM=/^[A-Za-z0-9_./,:@%+-][A-Za-z0-9_./,:@%+=-]*$/;function _M(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function vM(e){return gM.test(e)?e:_M(e)}const yM=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function bM(e){let t=yM.exec(e);return t?{kind:`ok`,value:[Number(t[1]),Number(t[2]),Number(t[3])]}:{kind:`failed`,reason:`"${e}" is not a release version (expected MAJOR.MINOR.PATCH)`}}function xM(e){return e.join(`.`)}function SM([e,t,n],[r,i,a]){return e-r||t-i||n-a}const CM=`@promptctl/cc-candybar`;async function wM(e,t,n){let r=`${n}/-/package/${encodeURIComponent(e)}/dist-tags`;try{let e=await t(r,{signal:AbortSignal.timeout(5e3)});if(!e.ok)return X(`registry responded ${e.status} for ${r}`);let n=await e.json();return typeof n.latest==`string`?bM(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function TM(e,t){let n=bM(e);if(n.kind===`failed`)return{kind:`unchecked`,installed:e,reason:n.reason};switch(t.kind){case`failed`:return{kind:`unchecked`,installed:e,reason:t.reason};case`absent`:return{kind:`unchecked`,installed:e,reason:"the registry lists no `latest` dist-tag"};case`ok`:{let e=SM(n.value,t.value);return e<0?{kind:`stale`,installed:n.value,latest:t.value}:e>0?{kind:`ahead`,installed:n.value,latest:t.value}:{kind:`current`,installed:n.value}}}}function EM(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${xM(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${xM(t.installed)} is newer than the registry's latest release (${xM(t.latest)}): an unpublished build.\n`};case`stale`:{let n=xM(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${xM(t.installed)} was staged, but the latest release is ${n}.\n pnpm's release-age gate (minimumReleaseAge) and its dlx cache can both\n resolve \`@latest\` to an older release without saying so.\n To install ${n} now, name it explicitly:\n pnpm dlx ${e}@${n} install\n`}}case`unchecked`:return{stream:`stderr`,text:`⚠ Could not check for a cc-candybar release newer than ${t.installed} (${t.reason}); the registry check was skipped.\n`}}}const DM=`CCCandybarURLHandler`,OM=[],kM={"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 AM(e,t){return[e,...t].map(vM).join(` `)}function jM(){return l.join(h.homedir(),`Applications`,`${DM}.app`)}function MM(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function NM(){if(process.platform===`darwin`)return l.join(h.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??l.join(h.homedir(),`.local`,`share`);return l.join(e,`cc-candybar`)}function PM(){return l.join(NM(),`bin`,`cc-candybar`)}function FM(){return l.join(NM(),`dist`,`index.mjs`)}function IM(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(`
@@ -180,7 +180,7 @@ Config tooling:
180
180
  `))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return s.slice(0,-1)}function eP(e){return Math.min(20,e??20)}const tP={heading:`ERROR`,glyph:`⚠`,colors:ON},nP={heading:`WARNING`,glyph:`⚠`,colors:kN},rP={heading:`UPDATE`,glyph:`⬆`,colors:kN};function iP(e,t){return{text:CN(e),link:t}}function aP(e,t,n){let[r,...i]=[oP(e,tP,Hj),t,oP(n,nP,Uj)].flat();return r===void 0?null:{channels:[r,...i]}}function oP(e,t,n){let r=uM([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>iP(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function sP(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
181
181
  `)}function cP(e,t,n,r){if(t===null)return e;let i=lP(r),a=t.channels.flatMap(e=>uP(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[dP(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
182
182
  `);return e?`${l}\n${e}`:l}function lP(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function uP(e,t){let n=new H({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Kt(Math.max(2,t.width-1)),i=(e,t)=>new W(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>$N([i(o===0?e.severity.glyph:` `,n.withLink(a[0].link)),...a.flatMap(e=>{let t=n.withLink(e.link);return e.text.split(` `).flatMap(e=>Zt(e,r)).map(e=>i(e,t))})],t).split(`
183
- `))}function dP(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new H({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new W(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(ae(a.path).href)):c(`full text unavailable: ${CN(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(CN(o),s.withLink(ae(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=W.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,$N([m],r)}const fP=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function pP(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function mP(e,t){return r.readdirSync(t).filter(fP).sort().flatMap(n=>{let i=l.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?mP(e,i):[[l.relative(e,i).split(l.sep).join(`/`),pP(i,a)]]})}function hP(e){let t=oe.createHash(`sha256`);for(let[n,r]of mP(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const gP=e=>e.slice(0,7);function _P(e){return l.dirname(l.dirname(e))}function vP(){return{version:qA,digest:`145a777640ca83b5b45dc4e67883cd4666c7706b3a383808b5463281fc31ed57`}}function yP(e){let t=JSON.parse(r.readFileSync(l.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${l.join(e,`package.json`)} has no version string`);return n}function bP(e,t){try{let n=_P(E(e)),i=l.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=hP(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:yP(n),digest:o},running:a}}catch(e){return{kind:`unchecked`,reason:e.message}}}var $=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function xP(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function SP(e){let t=e.split(`:`);return t[0]===`remove`&&t.length===2&&t[1]?{op:`remove`,target:t[1]}:t[0]===`insert`&&t.length===4&&t[1]&&t[2]&&(t[3]===`before`||t[3]===`after`)?{op:`insert`,segment:t[1],anchor:t[2],relation:t[3]}:null}function CP(e,t,n){let r=Su(e,new Set(n.map(xu).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const wP=/^-?\d+$/;function TP(e,t,n=`set-state`){let r=e.filter(e=>e.includes(`/`));if(r.length>0)throw Error(`makeAllowListValidator(${t}): values contain "/" — the ${n} wire shape splits values on "/" so slash-bearing options cannot be addressed. Offending values: ${r.join(`, `)}`);if(e.includes(``))throw Error(`makeAllowListValidator(${t}): empty string is not a writable option — the validator rejects empty input before the allow-list check, so an "" in the allowed list could be rendered but never delivered. Remove "" from the allowed list.`);let i=new Set(e),a=[...e];return e=>e?i.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown ${t} "${e}" (have: ${a.join(`, `)})`}:{ok:!1,reason:`${t} value is required`}}function EP(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!wP.test(t))return{ok:!1,reason:`${e} must be an integer, got "${t}"`};let n=t[0]===`-`,r=(n?t.slice(1):t).replace(/^0+/,``);return r===``?{ok:!0,value:`0`}:{ok:!0,value:n?`-${r}`:r}}}function DP(e,t,n){return r=>r?wP.test(r)?{ok:!0,value:String(Math.max(e,Math.min(t,parseInt(r,10))))}:{ok:!1,reason:`${n} must be an integer, got "${r}"`}:{ok:!1,reason:`${n} value is required`}}function OP(e,t,n=`state`){let r=t.filter(e=>e.kind===`range`),i=t.some(e=>e.kind===`int`),a=t.flatMap(e=>e.kind===`allow-list`?e.allowed:[]);if(r.length===0&&!i)return{kind:`allow-list`,allowed:[...new Set(a)]};let o=a.filter(e=>!wP.test(e));if(o.length>0)throw Error(`${n} action table: key "${e}" is an integer spec (a paged cursor or a bounded value) but a click writes non-integer value(s) to it (${o.join(`, `)}). A ${n} key has one key shape — point that click at a distinct key, or write an integer.`);if(i&&r.length>0)throw Error(`${n} action table: key "${e}" is declared as both a paged cursor (int) and a bounded value (range) — a ${n} key has one key shape. Use distinct keys.`);if(r.length>0){let t=Math.min(...r.map(e=>e.min)),i=Math.max(...r.map(e=>e.max)),o=a.filter(e=>{let n=parseInt(e,10);return n<t||n>i});if(o.length>0)throw Error(`${n} action table: key "${e}" is a bounded range [${t},${i}] but a click writes out-of-range value(s) to it (${o.join(`, `)}). The range gate would clamp them, storing a different value than the click renders — write an in-range integer, or point that click at a distinct key.`);return{kind:`range`,min:t,max:i}}return{kind:`int`}}function kP(e){return e===`config`?`set-config`:`set-state`}function AP(e,t,n){return t.kind===`int`?EP(`menu page "${e}"`):t.kind===`range`?DP(t.min,t.max,`${n} stepper "${e}"`):TP(t.allowed,`${n} "${e}"`,kP(n))}function jP(e,t=`state`){let n=new Map;for(let{key:t,spec:r}of e){let e=n.get(t);e?e.push(r):n.set(t,[r])}return[...n].map(([e,n])=>({key:e,spec:OP(e,n,t)}))}function MP(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of jP(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,AP(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function NP(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};MP(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=MP(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const PP=NP({},`config`,VP);function FP(e,t){return PP.register(e,t)}function IP(e){return PP.gateFor(e)}function LP(e,t){return`persist`in e?`to`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:xw(e.from,t).members}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[xP({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[xP({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:xw(e.insertSegmentFrom,t).members.map(t=>xP({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function RP(e,t){let n=Pf(e).get(t);return n===void 0?null:String(n)}function zP(e){let t=new Set;for(let n of Object.values(e.actions)){`reset`in n&&t.add(n.reset);let e=`persist`in n?Rw(n.persist):null;e?.scope===`preset-root`&&t.add(Pw(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function BP(e){let t=AD(e);return[...zP(e),...Object.values(e.actions).flatMap(e=>LP(e,t))]}function VP(e){return jP(BP(e),`config`)}const HP={},UP=DT(`commands.`),WP=VT(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),GP=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,KP=`{{ \$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 (${GP}) (basename .project_dir) (ne (${GP}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,qP=`{{ ${Qw} }}`,JP={min:0,max:100,step:5},YP={warnAt:{label:`warning at %`,domain:JP,default:50},errorAt:{label:`error at %`,domain:{...JP,atLeast:`warnAt`},default:80}};function XP(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:JP,default:80}}}const ZP={globals:{palette:`tokyo-night`},variables:{...UP.variables,...JC,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``},"activity.ticket.id":{kind:`input`,path:`activity.ticket.id`,type:`string`,default:``},"activity.ticket.phase":{kind:`input`,path:`activity.ticket.phase`,type:`string`,default:``},"activity.ticket.epic.done":{kind:`input`,path:`activity.ticket.epic.done`,type:`number`,default:0},"activity.ticket.epic.total":{kind:`input`,path:`activity.ticket.epic.total`,type:`number`,default:0},"activity.ticket.unread":{kind:`input`,path:`activity.ticket.unread`,type:`string`,default:``},"ticket.detail":{kind:`state`,key:`ticket-detail`,default:`collapsed`}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project. Click to copy the full path.",template:KP},model:{group:`model-context`,description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:qP,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:gT(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:UP.template,when:UP.when},themeSwitcher:{group:`session-tools`,description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:XP(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:XP(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:YP,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:YP,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${tc} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:WP.template,bg:WP.bg,when:WP.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},ticket:{group:`activity`,description:`The lit ticket this session started; expands to its workflow phase and its epic's done/total.`,template:`🎫 {{ action "copyTicket" .activity.ticket.id }}{{ if eq .ticket.detail "expanded" }} · {{ .activity.ticket.phase }}{{ if .activity.ticket.epic.total }} · epic {{ .activity.ticket.epic.done }}/{{ .activity.ticket.epic.total }}{{ end }}{{ if .activity.ticket.unread }} · ⚠ unreadable {{ abbrev 40 .activity.ticket.unread }}{{ end }}{{ end }} {{ action "ticketDetail" "▸" "◂" }}`,when:`{{ ne .activity.ticket.id "" }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`ticket`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...gT(``).actions,...UP.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},ticketDetail:{set:`ticket-detail`,cycle:[`collapsed`,`expanded`]},copyTicket:{copy:`{{ .activity.ticket.id }}`},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},...WP.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},themeDefaults:HP,presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${tc}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:HT(`.`),formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}×{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},QP=new Set([ZP.globals.palette,...Object.keys(ZP.themeDefaults),...Object.values(ZP.segments).map(e=>e.palette)].filter(e=>e!==void 0)),$P=Id(bA(`<default>`,JSON.stringify(ZP),QP),ZP),eF=Mb($P.presets);function tF(e){return eF.includes(e)}const nF=Object.freeze({});function rF(e,t){return e.kind===`decided`?t[e.name]??nF:nF}function iF(e,t){return{...e,...Object.fromEntries(ku.map(n=>[n,e[n]??t[n]]))}}function aF(e){if(!e)return 0;try{return s(e).mtimeMs}catch{return 0}}const oF=new class{slots;head=null;tail=null;constructor(e){this.slots=e}async run(e){await this.acquire();try{return await e()}finally{this.release()}}async acquire(){if(this.slots>0){this.slots--;return}await new Promise(e=>{let t={wake:e,next:null};this.tail?this.tail.next=t:this.head=t,this.tail=t})}release(){let e=this.head;if(!e){this.slots++;return}this.head=e.next,this.head||(this.tail=null),e.wake()}}(8);function sF(e){return((...t)=>oF.run(()=>e(...t)))}const cF=sF(ee),lF=sF(C),uF=sF(w);async function dF(e,t){return oF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function fF(e,t){return oF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const pF=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function mF(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 hF(e){let t=await gF(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function gF(e){for(let t of[65536,1048576]){let n=await fF(e,t);if(n.kind!==`ok`)return n;let r=_F(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function _F(e,t){let n=e.toString(`utf8`).split(`
183
+ `))}function dP(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new H({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new W(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(ae(a.path).href)):c(`full text unavailable: ${CN(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(CN(o),s.withLink(ae(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=W.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,$N([m],r)}const fP=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function pP(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function mP(e,t){return r.readdirSync(t).filter(fP).sort().flatMap(n=>{let i=l.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?mP(e,i):[[l.relative(e,i).split(l.sep).join(`/`),pP(i,a)]]})}function hP(e){let t=oe.createHash(`sha256`);for(let[n,r]of mP(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const gP=e=>e.slice(0,7);function _P(e){return l.dirname(l.dirname(e))}function vP(){return{version:qA,digest:`7604885cfaaa0b988ddfebc4bbd235c07eacfdd85c5494ff0ba6fdef2d2d120a`}}function yP(e){let t=JSON.parse(r.readFileSync(l.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${l.join(e,`package.json`)} has no version string`);return n}function bP(e,t){try{let n=_P(E(e)),i=l.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=hP(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:yP(n),digest:o},running:a}}catch(e){return{kind:`unchecked`,reason:e.message}}}var $=class extends Error{constructor(e){super(e),this.name=`BadVerbArgs`}};function xP(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function SP(e){let t=e.split(`:`);return t[0]===`remove`&&t.length===2&&t[1]?{op:`remove`,target:t[1]}:t[0]===`insert`&&t.length===4&&t[1]&&t[2]&&(t[3]===`before`||t[3]===`after`)?{op:`insert`,segment:t[1],anchor:t[2],relation:t[3]}:null}function CP(e,t,n){let r=Su(e,new Set(n.map(xu).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const wP=/^-?\d+$/;function TP(e,t,n=`set-state`){let r=e.filter(e=>e.includes(`/`));if(r.length>0)throw Error(`makeAllowListValidator(${t}): values contain "/" — the ${n} wire shape splits values on "/" so slash-bearing options cannot be addressed. Offending values: ${r.join(`, `)}`);if(e.includes(``))throw Error(`makeAllowListValidator(${t}): empty string is not a writable option — the validator rejects empty input before the allow-list check, so an "" in the allowed list could be rendered but never delivered. Remove "" from the allowed list.`);let i=new Set(e),a=[...e];return e=>e?i.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown ${t} "${e}" (have: ${a.join(`, `)})`}:{ok:!1,reason:`${t} value is required`}}function EP(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!wP.test(t))return{ok:!1,reason:`${e} must be an integer, got "${t}"`};let n=t[0]===`-`,r=(n?t.slice(1):t).replace(/^0+/,``);return r===``?{ok:!0,value:`0`}:{ok:!0,value:n?`-${r}`:r}}}function DP(e,t,n){return r=>r?wP.test(r)?{ok:!0,value:String(Math.max(e,Math.min(t,parseInt(r,10))))}:{ok:!1,reason:`${n} must be an integer, got "${r}"`}:{ok:!1,reason:`${n} value is required`}}function OP(e,t,n=`state`){let r=t.filter(e=>e.kind===`range`),i=t.some(e=>e.kind===`int`),a=t.flatMap(e=>e.kind===`allow-list`?e.allowed:[]);if(r.length===0&&!i)return{kind:`allow-list`,allowed:[...new Set(a)]};let o=a.filter(e=>!wP.test(e));if(o.length>0)throw Error(`${n} action table: key "${e}" is an integer spec (a paged cursor or a bounded value) but a click writes non-integer value(s) to it (${o.join(`, `)}). A ${n} key has one key shape — point that click at a distinct key, or write an integer.`);if(i&&r.length>0)throw Error(`${n} action table: key "${e}" is declared as both a paged cursor (int) and a bounded value (range) — a ${n} key has one key shape. Use distinct keys.`);if(r.length>0){let t=Math.min(...r.map(e=>e.min)),i=Math.max(...r.map(e=>e.max)),o=a.filter(e=>{let n=parseInt(e,10);return n<t||n>i});if(o.length>0)throw Error(`${n} action table: key "${e}" is a bounded range [${t},${i}] but a click writes out-of-range value(s) to it (${o.join(`, `)}). The range gate would clamp them, storing a different value than the click renders — write an in-range integer, or point that click at a distinct key.`);return{kind:`range`,min:t,max:i}}return{kind:`int`}}function kP(e){return e===`config`?`set-config`:`set-state`}function AP(e,t,n){return t.kind===`int`?EP(`menu page "${e}"`):t.kind===`range`?DP(t.min,t.max,`${n} stepper "${e}"`):TP(t.allowed,`${n} "${e}"`,kP(n))}function jP(e,t=`state`){let n=new Map;for(let{key:t,spec:r}of e){let e=n.get(t);e?e.push(r):n.set(t,[r])}return[...n].map(([e,n])=>({key:e,spec:OP(e,n,t)}))}function MP(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of jP(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,AP(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function NP(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};MP(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=MP(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const PP=NP({},`config`,VP);function FP(e,t){return PP.register(e,t)}function IP(e){return PP.gateFor(e)}function LP(e,t){return`persist`in e?`to`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:xw(e.from,t).members}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[xP({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[xP({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:xw(e.insertSegmentFrom,t).members.map(t=>xP({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function RP(e,t){let n=Pf(e).get(t);return n===void 0?null:String(n)}function zP(e){let t=new Set;for(let n of Object.values(e.actions)){`reset`in n&&t.add(n.reset);let e=`persist`in n?Rw(n.persist):null;e?.scope===`preset-root`&&t.add(Pw(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function BP(e){let t=AD(e);return[...zP(e),...Object.values(e.actions).flatMap(e=>LP(e,t))]}function VP(e){return jP(BP(e),`config`)}const HP={},UP=DT(`commands.`),WP=VT(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),GP=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,KP=`{{ \$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 (${GP}) (basename .project_dir) (ne (${GP}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,qP=`{{ ${Qw} }}`,JP={min:0,max:100,step:5},YP={warnAt:{label:`warning at %`,domain:JP,default:50},errorAt:{label:`error at %`,domain:{...JP,atLeast:`warnAt`},default:80}};function XP(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:JP,default:80}}}const ZP={globals:{palette:`tokyo-night`},variables:{...UP.variables,...JC,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``},"activity.ticket.id":{kind:`input`,path:`activity.ticket.id`,type:`string`,default:``},"activity.ticket.phase":{kind:`input`,path:`activity.ticket.phase`,type:`string`,default:``},"activity.ticket.epic.done":{kind:`input`,path:`activity.ticket.epic.done`,type:`number`,default:0},"activity.ticket.epic.total":{kind:`input`,path:`activity.ticket.epic.total`,type:`number`,default:0},"activity.ticket.unread":{kind:`input`,path:`activity.ticket.unread`,type:`string`,default:``},"ticket.detail":{kind:`state`,key:`ticket-detail`,default:`collapsed`}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project. Click to copy the full path.",template:KP},model:{group:`model-context`,description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:qP,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:gT(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:UP.template,when:UP.when},themeSwitcher:{group:`session-tools`,description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:XP(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:XP(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:YP,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:YP,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${tc} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:WP.template,bg:WP.bg,when:WP.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},ticket:{group:`activity`,description:`The lit ticket this session started; expands to its workflow phase and its epic's done/total.`,template:`🎫 {{ action "copyTicket" .activity.ticket.id }}{{ if eq .ticket.detail "expanded" }} · {{ .activity.ticket.phase }}{{ if .activity.ticket.epic.total }} · epic {{ .activity.ticket.epic.done }}/{{ .activity.ticket.epic.total }}{{ end }}{{ if .activity.ticket.unread }} · ⚠ unreadable {{ abbrev 40 .activity.ticket.unread }}{{ end }}{{ end }} {{ action "ticketDetail" "▸" "◂" }}`,when:`{{ ne .activity.ticket.id "" }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`ticket`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...gT(``).actions,...UP.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},ticketDetail:{set:`ticket-detail`,cycle:[`collapsed`,`expanded`]},copyTicket:{copy:`{{ .activity.ticket.id }}`},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},...WP.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},themeDefaults:HP,presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${tc}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:HT(`.`),formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}×{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},QP=new Set([ZP.globals.palette,...Object.keys(ZP.themeDefaults),...Object.values(ZP.segments).map(e=>e.palette)].filter(e=>e!==void 0)),$P=Id(bA(`<default>`,JSON.stringify(ZP),QP),ZP),eF=Mb($P.presets);function tF(e){return eF.includes(e)}const nF=Object.freeze({});function rF(e,t){return e.kind===`decided`?t[e.name]??nF:nF}function iF(e,t){return{...e,...Object.fromEntries(ku.map(n=>[n,e[n]??t[n]]))}}function aF(e){if(!e)return 0;try{return s(e).mtimeMs}catch{return 0}}const oF=new class{slots;head=null;tail=null;constructor(e){this.slots=e}async run(e){await this.acquire();try{return await e()}finally{this.release()}}async acquire(){if(this.slots>0){this.slots--;return}await new Promise(e=>{let t={wake:e,next:null};this.tail?this.tail.next=t:this.head=t,this.tail=t})}release(){let e=this.head;if(!e){this.slots++;return}this.head=e.next,this.head||(this.tail=null),e.wake()}}(8);function sF(e){return((...t)=>oF.run(()=>e(...t)))}const cF=sF(ee),lF=sF(C),uF=sF(w);async function dF(e,t){return oF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function fF(e,t){return oF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const pF=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function mF(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 hF(e){let t=await gF(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function gF(e){for(let t of[65536,1048576]){let n=await fF(e,t);if(n.kind!==`ok`)return n;let r=_F(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function _F(e,t){let n=e.toString(`utf8`).split(`
184
184
  `),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!pF.test(t))continue;let r=mF(t);if(r!=null)return r}return null}function vF(e,t){return{...e,claudeConfigDir:kT(t.claudeConfigDir),env:t.mementoEnv}}const yF=l.join(`lib`,`ceiling_config.py`),bF=l.join(`skills`,`ceiling`,`bin`,`ceiling`);function xF(e,t){let n=typeof e==`object`&&e?e.plugins:void 0;if(typeof n!=`object`||!n)throw Error(`${t} has no "plugins" object`);return Object.entries(n).filter(([e])=>e.split(`@`)[0]===`memento`).flatMap(([e,n])=>{if(!Array.isArray(n))throw Error(`${t}: "${e}" is not a list of installs`);return n.map(n=>{let{scope:r,installPath:i,projectPath:a}=n??{};if(typeof r!=`string`||typeof i!=`string`)throw Error(`${t}: an install of "${e}" has no scope/path`);return typeof a==`string`?{key:e,scope:r,installPath:i,projectPath:a}:{key:e,scope:r,installPath:i}})})}function SF(e,t){let n=!0;for(let i of e){if(!r.existsSync(i))continue;let e;try{e=JSON.parse(r.readFileSync(i,`utf8`))?.enabledPlugins?.[t]}catch(e){return X(`memento lookup: ${i}: ${e.message}`)}typeof e==`boolean`&&(n=e)}return J(n)}function CF(e,t){if(!r.existsSync(e))return Y;let n;try{n=xF(JSON.parse(r.readFileSync(e,`utf8`)),e)}catch(e){return X(`memento lookup: ${e.message}`)}let i=n.find(e=>e.projectPath===t)??n.find(e=>e.scope===`user`);if(i===void 0)return Y;let a=SF([l.join(l.dirname(l.dirname(e)),`settings.json`),l.join(t,`.claude`,`settings.json`),l.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[yF,bF].filter(e=>!r.existsSync(l.join(i.installPath,e)));return o.length===0?J(i.installPath):X(`memento at ${i.installPath} has no ${o.join(` or `)} — upgrade the plugin`)}function wF(e,t=process.env){let n=new Set([`CLAUDE_PROJECT_DIR`,`CLAUDE_CODE_SESSION_ID`,...e.env===void 0?[]:$e]);return{...Object.fromEntries(Object.entries(t).filter(([e])=>!n.has(e))),...e.env,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function TF(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function EF(e){let t;try{t=JSON.parse(e)}catch{return X(`memento read: not JSON: ${e.trim()}`)}let{ceiling:n,session:r}=t??{},i=n===`off`||typeof n==`number`&&n>=0?n:void 0;return i!==void 0&&(r===null||typeof r==`string`)?J({ceiling:i,session:r}):X(`memento read: unexpected answer: ${e.trim()}`)}async function DF(e,t){let n=await je({bin:`python3`,args:[`-c`,`
185
185
  import json, math, sys
186
186
  sys.path.insert(0, sys.argv[1])
@@ -207,9 +207,9 @@ print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
207
207
  `}const kH=e=>({kind:`ok`,value:e}),AH=e=>({kind:`failed`,reason:e});var jH=class{arrivals=[];arrive(e){this.arrivals=[...this.arrivals,e].slice(-16)}list(){return this.arrivals}};const MH=/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;function NH(e){return MH.test(e)?e:null}function PH(e){let t=e.opener();if(t.kind===`failed`)return t;if(t.value===null)return kH(null);let n=t.value,r=e.script(n);if(r.kind===`failed`)return kH({app:n,missing:AH(`its script could not be read (${r.reason})`)});let i=LM(r.value);return kH({app:n,missing:i===null?AH("its script is not one `cc-candybar install` wrote"):kH([i.node,i.script].filter(t=>!e.exists(t)))})}async function FH(e,t){let n=e.now()+5e3;for(;e.now()<n;){await e.pause();let n=await e.daemon(),r=n.kind===`ok`?n.value.arrivals.find(e=>e.nonce===t):void 0;if(n.kind===`ok`&&r!==void 0)return{kind:`arrived`,handler:r.handler,bar:n.value.version}}return null}async function IH(e){if(e.platform!==`darwin`)return{kind:`unsupported`};if(e.sockets.own!==e.sockets.handler)return{kind:`unprobed`,reason:`this shell's daemon is at ${e.sockets.own} (CC_CANDYBAR_SOCKET); the URL handler delivers links to ${e.sockets.handler}`};let t=await e.daemon();if(t.kind===`failed`)return{kind:`unprobed`,reason:`the daemon could not be asked whether a link arrives: ${t.reason}`};let n=e.nonce(),r=e.open(`${Fj}://${aM}/${n}`);return(r===null?await FH(e,n):null)??{kind:`lost`,unopened:r,opener:PH(e)}}function LH(e,t,n){let r=O({bin:t,args:[...n],category:e,timeoutMs:5e3});return r.ok?kH(r.stdout):AH(r.stderr.trim()||r.error||r.reason)}const RH=`ObjC.import("AppKit");var u = $.NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL($.NSURL.URLWithString("${Fj}://probe"));u.isNil() ? "" : u.path.js`;async function zH(){let e=await wH();if(e.kind!==`ok`)return AH(KA(e).split(`
208
208
  `).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?kH({version:t,arrivals:n}):AH(`the running daemon (${t}) predates this check`)}function BH(){return{platform:process.platform,sockets:{own:ze(),handler:Be()},now:Date.now,nonce:ce,daemon:zH,open:e=>{let t=LH(`doctor.open`,`/usr/bin/open`,[`-g`,e]);return t.kind===`ok`?null:t.reason},pause:()=>new Promise(e=>setTimeout(e,100)),opener:()=>{let e=LH(`doctor.launch-services`,`/usr/bin/osascript`,[`-l`,`JavaScript`,`-e`,RH]);if(e.kind===`failed`)return e;let t=e.value.trim();return kH(t===``?null:t)},script:e=>LH(`doctor.osadecompile`,`/usr/bin/osadecompile`,[RM(e)]),exists:r.existsSync}}const VH=/^─{20,}/,HH=/^❯(\s|$)/,UH=/›\s*stashed$/;function WH(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>VH.test(e)?[t]:[]).at(-2);return n===void 0||!HH.test(t[n+1]??``)?{kind:`no-prompt`}:UH.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const GH={"in-mode":`the Claude Code pane is in tmux copy mode — leave it (q) and click again`,stashed:`Claude Code is holding a stashed prompt (ctrl+s) — restore or send it, then click again`,"no-prompt":`Claude Code is not at its prompt (a dialog or picker is open) — close it and click again`};function KH(e,t,n){if(t===void 0)return{kind:`refused`,reason:`this session's statusline client reports no tmux facts (it predates this daemon) — rebuild or reinstall cc-candybar`};if(t===null)return{kind:`refused`,reason:`this Claude Code is not running inside tmux — the bar can only type into a tmux pane`};let r=WH(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:GH[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const qH=`cc-candybar-slash`;function JH(e,t,n,r){let i=_R(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function YH(e){let t=JH(e,`claude-input.read`,[`display`,`-p`,`-t`,e.pane,`#{pane_in_mode}`,`;`,`capture-pane`,`-p`,`-t`,e.pane]);if(t.kind===`rate-limited`)throw Error(t.reason);let[n=``,...r]=t.stdout.split(`
209
209
  `);return{inMode:n!==`0`,screen:r}}function XH(e,t){let n=JH(e,`claude-input.type`,[`load-buffer`,`-b`,qH,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,qH,`-t`,e.pane,`;`,`send-keys`,`-t`,e.pane,`Enter`],t);return n.kind===`ok`?{kind:`typed`}:{kind:`refused`,reason:`cc-candybar typed a command moments ago — click again in a second (${n.reason})`}}function ZH(){return{read:YH,type:XH}}function QH(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function $H(e){return eU(()=>decodeURIComponent(e))}function eU(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function tU(e,t){let n=O({bin:`/usr/bin/pbcopy`,stdinInput:e,category:`click.pbcopy`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.pbcopy rate-limited: ${n.error??``}`);return}throw Error(`pbcopy failed (${n.reason}, exit ${n.exitCode??`null`})`)}}const nU=(e,t)=>tU($H(e),t),rU=(e,t)=>{let n=O({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,$H(e)],category:`click.open`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.open rate-limited: ${n.error??``}`);return}throw Error(`open -a "Visual Studio Code" failed (${n.reason}, exit ${n.exitCode??`null`})`)}},iU=(e,t)=>tU($H(e),t),aU=(e,t)=>tU($H(e),t),oU=(e,t)=>{let n=QH($H(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},sU=(e,t)=>{let[n=``,...r]=eU(()=>lM(e)),i=QH(n),a=RI(yU(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}dU(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},cU=/^-?\d+$/;function lU(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const uU=(e,t)=>{let[n=``,r=``,i=``]=eU(()=>lM(e)),a=QH(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!cU.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=yU(t,a),c=RI(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&cU.test(u)?fU(l,parseInt(u,10)):pU(`step-state`,r,l,VI(s,e=>t.sessionState.get(a,e),r)),f=lU(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);dU(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}→${p.value} (by ${o}, session=${a})`)};function dU(e,t,n,r){let i=r.filter(e=>e.key.startsWith(nx));if(i.length===0)return;let a=_I(yU(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function fU(e,t){return Math.max(e.min,Math.min(e.max,t))}function pU(e,t,n,r){if(r===null)return n.min;if(!cU.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return fU(n,parseInt(r,10))}const mU=`render-origin`;function hU(e){return JSON.stringify(e)}function gU(e){let t;try{t=JSON.parse(e)}catch{throw new $(`render origin is not JSON: ${e}`)}if(typeof t!=`object`||!t)throw new $(`render origin is not an object: ${e}`);let{projectDir:n,cwd:r,configFile:i}=t;if(typeof n!=`string`||typeof r!=`string`||i!==null&&typeof i!=`string`)throw new $(`render origin has the wrong shape: ${e}`);return{projectDir:n,cwd:r,configFile:i}}function _U(e,t){let n=e.sessionState.get(t,mU);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return gU(n)}function vU(e,t,n){let r=e.sessionState.get(t,mU);if(r===null)return;let i=gU(r),{path:a}=bU(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function yU(e,t){return e.configFor(_U(e,t))}function bU(e){return jk(e.projectDir,e.cwd,e.configFile??void 0)}function xU(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const SU=(e,t)=>{let[n=``,r=``,i=``]=eU(()=>lM(e)),a=QH(n),o=_U(t,a),s=t.configFor(o),c=IP(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=bU(o),d=hI(s,e=>t.sessionState.get(a,e),r);wV(xU(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u.path} (session=${a})`)},CU=(e,t)=>{let[n=``,r=``,i=``]=eU(()=>lM(e)),a=QH(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!cU.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=_U(t,a),c=t.configFor(s),l=IP(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=bU(s),f=hI(c,e=>t.sessionState.get(a,e),r),p=CV(d.path,f.key),m=typeof p==`number`?fU(u,p):pU(`step-config`,r,u,RP(f.globals,r)),h=lU(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);wV(xU(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}→${g.value} (by ${o}) → ${d.path} (session=${a})`)},wU=(e,t)=>{let[n=``]=eU(()=>lM(e)),r=QH(n),i=_U(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=pI(a,o),c=gI(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=RI(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});EU(`save`,l,c);let d=bU(i);TV(xU(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map(TU)].join(` `)} → ${d.path} (session=${r})`)},TU=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Vu(e.value)}`;function EU(e,t,n){for(let r of n){let n=t.validate(r.key,Vu(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const DU=(e,t)=>{let[n=``]=eU(()=>lM(e)),r=QH(n),i=_U(t,r),a=t.configFor(i),o=bI(a,e=>t.sessionState.get(r,e)),s=RI(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});EU(`save-preset`,s,o.placements);let l=bU(i),u=MV(xU(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...ZC.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,XC.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(TU)].join(` `)} → ${l.path} (session=${r})`)},OU=(e,t)=>{let[n=``]=eU(()=>lM(e)),r=QH(n),i=_U(t,r),a=SI(t.configFor(i),e=>t.sessionState.get(r,e));if(a.kind===`rule`)throw new $(`save-theme-default: the theme is chosen by a rule (globals.palette), so there is no name to save as a theme's default — pick one in the menu first`);let o=bU(i);NV(xU(t,r),o,a.theme,a.look),t.reloadConfig(i);let s=new Set(pI(t.configFor(i),e=>t.sessionState.get(r,e)).map(e=>e.sessionKey)),c=ku.map(e=>XC[e].sessionKey).filter(e=>!s.has(e));for(let e of c)t.sessionState.clear(r,e);t.dlog(`info`,`save-theme-default: ${a.theme} ${ku.map(e=>`${e}=${a.look[e]}`).join(` `)} → ${o.path} (session=${r})`)},kU=(e,t)=>{let[n=``,r=``]=eU(()=>lM(e)),i=QH(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=_U(t,i),o=bU(a);PV(xU(t,i),o,r),t.reloadConfig(a);let s=XC.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o.path} (session=${i})`)},AU=(e,t)=>{let[n=``,...r]=eU(()=>lM(e)),i=QH(n),a=_U(t,i),o=IP(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=bU(a),l=r.map(CI),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);kV(xU(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} ← ${c.path} (session=${i})`)};function jU(e,t){let n=(e,t)=>[...wu(Fb(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(Mb(t.presets).flatMap(e=>n(t,e).map(t=>rx(bp(e),bu(t)))));return Mb(e.presets).flatMap(t=>n(e,t).map(e=>({member:rx(bp(t),bu(e)),node:e})).filter(({member:e})=>!r.has(e)))}function MU(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[Zb]:[]])}const NU=(e,t)=>{let[n=``,r=``,i=``]=eU(()=>lM(e)),a=QH(n),o=_U(t,a),s=t.configFor(o),c=IP(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=SP(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=bU(o),f=FV(xU(t,a),d,r,u);t.reloadConfig(o);let p=MU(jU(s,t.configFor(o)),t.sessionState.get(a,Zb)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} → ${d.path} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},PU=(e,t)=>{let[n=``]=eU(()=>lM(e)),r=QH(n);t.journal.commit();let i=t.history.undo(r);vU(t,r,i),t.dlog(`info`,`undo: restored ${rH(i)} (session=${r})`)},FU=(e,t)=>{let n=QH($H(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,RI(yU(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},IU=(e,t)=>{let n=QH($H(e));t.journal.commit();let r=t.history.rewind(n);vU(t,n,r),t.dlog(`info`,`rewind: put back ${rH(r)||`nothing`} as edit mode found it (session=${n})`)},LU=(e,t)=>{let[n=``]=eU(()=>lM(e)),r=QH(n);t.journal.commit();let i=t.history.redo(r);vU(t,r,i),t.dlog(`info`,`redo: re-applied ${rH(i)} (session=${r})`)},RU=(e,t)=>{QH($H(e)),t.applyUpdate()},zU=`client-hints`;function BU(e,t){let n=e.sessionState.get(t,zU);if(n===null)throw new $(`session ${t} has not rendered yet — no client facts are recorded for it`);let r;try{r=JSON.parse(n)}catch{throw new $(`client hints record is not JSON: ${n}`)}if(typeof r!=`object`||!r)throw new $(`client hints record is not an object: ${n}`);return DA(r)}function VU(e,t,n){let r=lT(n);e.sessionState.setBatch(t,mT(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed(${1+(e.verdict.more?.length??0)})`}`).join(` `)} (session=${t})`)}function HU(e,t){return{...bH(e.doctor,BU(e,t),_U(e,t),n=>e.sessionState.get(t,n)),urlHandler:vH(e.clientVersion)}}const UU=(e,t)=>{let n=QH($H(e));VU(t,n,HU(t,n))},WU=(e,t)=>{let n=NH($H(e));if(n===null)throw new $(`doctor-probe: the value is not a probe nonce`);t.probes.arrive({nonce:n,handler:t.clientVersion}),t.dlog(`info`,`doctor-probe: arrived nonce=${n} handler=${t.clientVersion??`unreported`}`)},GU=(e,t)=>{let[n=``,r=``]=eU(()=>lM(e)),i=QH(n),a=uT(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=HU(t,i),s=a.probe(o);if(s.ok||s.fix===void 0)throw new $(`doctor-fix: ${a.label} — ${s.ok?`nothing to fix`:s.reason}`);let c=xH(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.path.join(`.`)}=${JSON.stringify(s.fix.value)} (session=${i})`),VU(t,i,c)},KU=(e,t)=>{let[n=``,...r]=eU(()=>lM(e)),i=QH(n),a=_U(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=XD(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=vF({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},BU(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},qU=(e,t)=>{let[n=``,r=``]=eU(()=>lM(e)),i=QH(n),a=Object.values(t.configFor(_U(t,i)).actions).filter(e=>`slash`in e),o=a.find(e=>e.slash===r);if(o===void 0)throw new $(`${JSON.stringify(r)} is not a command this config declares (it declares: ${[...new Set(a.map(e=>e.slash))].join(`, `)||`none`})`);let s=KH(t.claudeInput,BU(t,i).tmux,o.slash);if(s.kind===`refused`)throw t.dlog(`warn`,`slash: ${r} refused — ${s.reason} (session=${i})`),new $(`${r} was not typed: ${s.reason}`);t.dlog(`info`,`slash: typed ${r} into ${s.pane} (session=${i})`)},JU=`config-override`,YU=new Map([[zj,nU],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=QH(eU(()=>decodeURIComponent(e.slice(0,n)))),i=eU(()=>decodeURIComponent(e.slice(n+1))).trim();if(i!==``){if(!i.startsWith(`/`))throw new $(`load-config: path must be absolute, got "${i}"`);if(!/\.(json5?|json)$/.test(i))throw new $(`load-config: path must end with .json5 or .json, got "${i}"`)}i===``?(t.sessionState.clear(r,JU),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,JU,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Bj,rU],[Lj,sU],[Rj,uU],[Wj,SU],[Gj,CU],[Xj,AU],[Kj,wU],[qj,DU],[Jj,OU],[Yj,kU],[Zj,NU],[Qj,PU],[$j,LU],[eM,FU],[tM,IU],[Hj,iU],[Uj,aU],[Vj,oU],[nM,RU],[rM,UU],[iM,GU],[aM,WU],[oM,KU],[sM,qU]]),XU=new Set([Lj,Rj,Wj,Gj,Xj,Kj,qj,Jj,Yj,Zj,Qj,$j,eM,tM,Vj,nM,rM,iM,oM,sM]),ZU=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of pM(dM(e))){if(!i&&XU.has(a)){let e=lM(o);e.length>0&&e[0]&&(i=e[0])}let e=YU.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof $||(r=!0),n.push(`${a}: ${e instanceof Error?e.message:String(e)}`)}}if(n.length>0){i&&t.sessionState.set(i,`click.error`,n.join(`
210
- `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function QU(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const $U=new Map([...YU,[Ij,ZU]].map(([e,t])=>[e,QU(t)]));Object.freeze([...$U.keys()]);const eW=new Set([`hook_event_name`,`session_id`,`session_name`,`transcript_path`,`cwd`,`model`,`workspace`,`version`,`output_style`,`cost`,`context_window`,`exceeds_200k_tokens`,`effort`,`thinking`,`rate_limits`,`vim`,`agent`,`worktree`]),tW=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]],nW=[[`workspace.added_dirs`,`string-list`]];function rW(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of tW){let i=oW(n,e);if(i==null)t.missingRequired.push(e);else{let n=iW(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of nW){let i=oW(n,e),a=i===void 0?r:aW(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))eW.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function iW(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function aW(e){return Array.isArray(e)&&e.every(e=>iW(e)===`string`)?`string-list`:iW(e)}function oW(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=n[e]}return n}function sW(e,t){switch(e){case`vars`:return{what:e,vars:cW(t)};case`segments`:return{what:e,segments:pW(t)};case`config`:return{what:e,config:_W(t)}}}function cW(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=dW(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=lW(r),s=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...a,lastError:s===void 0?null:{timestampMs:s.timestamp,message:s.message},ageMs:uW(r.lastUpdatedMs())})}return o}function lW(e){if(e.kind!==`document`)try{return{type:e.type,value:e.read()}}catch(t){return{type:e.type,value:t instanceof Error?t.message:String(t)}}let t=e.read();switch(t.kind){case`ok`:return{type:`document`,value:JSON.stringify(t.value)};case`absent`:return{type:`document`,value:`(not yet scanned)`};case`failed`:return{type:`document`,value:t.reason}}}function uW(e){return e===null?null:Math.max(0,Date.now()-e)}function dW(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,fW(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}`,fW(i));return t}function fW(e){return e.kind}function pW(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=hW(n),o=mW(n),s=[];for(let e of a){let t=n.segments[e];t&&s.push({name:e,description:t.description??null,template:t.template,referencedVars:gW(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function mW(e){let t=new Map;for(let n of Mb(e.presets))for(let r of wu(Fb(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=bu(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function hW(e){let t=[],n=new Set;for(let r of wu(jd(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function gW(e,t,n){let r=new Set;for(let i of Sx(e,t).keys()){if(n.has(i)){r.add(i);continue}let e=i.split(`.`);for(;e.length>1;){e.pop();let t=e.join(`.`);if(n.has(t)){r.add(t);break}}}return Array.from(r).sort()}function _W(e){return e===null?null:e.config}const vW=[`vars`,`segments`,`config`];function yW(e){return typeof e==`string`&&vW.includes(e)}function bW(e){return Math.max(1,e-2)}var xW=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return l.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const SW=new AB,CW=new jH;ke(SW.launchStats);const wW=new dC({counters:SW,logger:Z}),TW=CR({watchers:wW,logger:Z}),{gitProvider:EW,usageStore:DW,mementoProvider:OW}=TW,kW=new NB,AW=new UV(kW,Z),jW=new fH,MW=new HN,NW=new xW(Ze()),PW=new OB({gitService:EW,sessionState:kW,watchers:wW},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} files=${e.configLayers.join(` < `)||`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),FW=60*1e3;function IW(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(E(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),QW(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,FW),a.unref())},checkNow:o}}const LW=IW(),RW=oL({entryUrl:import.meta.url,intervalMs:FW,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>LW.checkNow(),log:Z});let zW=null,BW=null,VW=0;function HW(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),QW(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),QW(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),QW(0)});try{VW=cj(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),QW(1);return}zW=lN(t.pid);let e=yN(xN(zW));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),QW(1);return}BW=e.registryPath,r.mkdirSync(Re(),{recursive:!0}),He(ze()),kW.useStorage(new FB(Ge(),500,Z)),AW.useStorage(uH(Ke(),Z)),fN({anchor:dN(t.env),isAlive:pN,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),QW(0)}}),UW(x.createServer({allowHalfOpen:!1},e=>{$W(e)}),ze(),!1)}function UW(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),QW(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}WW(e,n)}),e.listen(n,()=>GW(n))}function WW(e,n){let i=$M(eN(Ue(n)),(e,t)=>cN(e,t,{readStartTime:sN,pidAlive:pN}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),QW(1);return}}UW(e,n,!0)}function GW(e){let n=rN(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),QW(0);return}YW(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(re.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(VW/1048576)}MB`),Tj();let i=NW.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),LW.arm(),RW.arm(),JW(),KW(e,n.identity)}function KW(e,n){oN({bound:n,myPid:t.pid,readIdentity:()=>rN(e),readLease:()=>eN(Ue(e)),shutdown:e=>QW(e),log:Z}).arm()}let qW=null;function JW(){qW=fj(gj(SW.startedAt.getTime(),e=>QW(e),{rssLimitBytes:VW})),qW.arm()}function YW(e){let n=tN(Ue(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:zW});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let XW=0,ZW=!1;function QW(e){if(!ZW){ZW=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{EW.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{DW.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{wW.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{kW.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}nN(We(),t.pid),BW!==null&&bN(BW,t.pid,_N,e=>r.unlinkSync(e)),t.exit(e)}}function $W(e){XW++,SW.inFlight=XW;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>QW(r);try{e.end(LA(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{SW.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=RA(e=>{tG(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),XW=Math.max(0,XW-1),SW.inFlight=XW})}const eG=e=>({resp:e,exitAfterFlush:null});async function tG(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return eG({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale — staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return eG({ok:!0,stats:SW.snapshot({gitCache:EW.getStats(),usageCache:DW.getStats(),renderCacheSize:PW.size,effectCache:MW.getStats(),watchersActive:wW.size(),nextRestartReason:qW?.describeNextRestart()??null,handlerProbes:CW.list()})});if(e.kind===`render`){SW.requestsTotal++;let t=new Date,n=CC(t),r=t.getTime();try{let{report:t}=rW(e.hookData);for(let e of t.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let i=[];for(let e of t.missingRequired)i.push(`missing required field '${e}'`);for(let{path:e,expected:n,got:r}of t.typeMismatches)i.push(`field '${e}' expected ${n}, got ${r}`);if(e.cwd===``&&i.push(`request 'cwd' is empty`),i.length>0)return SW.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${i.join(`; `)}`),eG({ok:!1,error:`malformed hookData: ${i.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let a=e.hookData.workspace.project_dir,{configFile:o,unknownFlagsError:s}=nG(e.args),c=e.hookData.session_id,l=DA(e),u=JSON.stringify(l);kW.get(c,`client-hints`)!==u&&kW.set(c,zU,u);let d=kW.get(c,`config-override`)??o??l.configEnv,f=PW.getOrCreate(a,e.cwd,d),p=hU({projectDir:a,cwd:e.cwd,configFile:d??null});kW.get(c,`render-origin`)!==p&&kW.set(c,mU,p);let m=l.termCols,h=bW(m??120),g=eP(l.termRows),{authoredRoots:_}=f.state,v=t=>kW.get(e.hookData.session_id,t),y=jF(f.state.config,v,e=>_.has(e)),b=await JF(e.hookData,n,{...sG,navigation:e=>jW.depth(e,kW,RI(f.state.config))},e.cwd,f.state.neededInputPaths(y.preset),y,l,{...TI(f.state.config,f.state.fileHeldSettings,v),configPath:f.configLayers.includes(f.configHome)?f.configHome:null}),x=[],S=MF(y,h),C=MW.of(c),ee=sB(f.state.config,f.state.compiled,f.state.store,f.state.registry,b,n,S,{perSegmentSink:f.state.lastRenderCellsBySegment,onRenderWarning:({message:e})=>x.push(e)},{...NF(y),effects:C}),w=kW.get(e.hookData.session_id,`click.error`);w&&kW.clear(e.hookData.session_id,`click.error`);let te=[s,f.lastError,w].filter(Boolean).join(`
211
- `),ne=RW.notice({sessionId:c,dismissed:kW.get(c,WI),enabled:y.updateNotice}),re=f.lastError===null?null:f.failedFile,ie=aP(te,ne,[f.lastWarning??``,...x].filter(Boolean).join(`
212
- `)),T=NW.sync(c,ie===null?null:sP(ie));T!==null&&Z(`warn`,`diagnostic dump failed: ${T}`);let E=cP(ee,ie,{fullText:T===null?{kind:`file`,path:NW.pathFor(c)}:{kind:`unavailable`,reason:T},failedConfigFile:re},{width:h,rowCap:g,colorCompatibility:y.colorCompatibility}),ae=Date.now()-r,oe=EW.getStats(),se=DW.getStats(),ce=C.lastFrame(),le=ce.own.map(e=>`${e.placement}:${e.effect}@${e.t.toFixed(3)}`).join(`,`)||`-`,ue=ce.fades.map(e=>`${e.placement}@${e.t.toFixed(3)}`).join(`,`)||`-`;return Z(`info`,`render sid=${e.hookData.session_id??`?`} at=${n.toFixed(3)} took=${ae}ms termCols=${m??`?`} termRows=${l.termRows??`?`} width=${h} git=${oe.size}/${oe.hits}h/${oe.misses}m usage=${se.size}/${se.hits}h/${se.misses}m effect=${ce.effect} effectT=${ce.t.toFixed(3)} effectRows=${ce.made}made/${ce.reused}reused effectOwn=${le} fadeBasis=${ce.basis} stateRev=${ce.revision} fades=${ue} err=${te?`Y`:`N`} upd=${ne.length} warn=${f.lastWarning?`Y`:`N`}`),eG({ok:!0,output:E+`
210
+ `));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function QU(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const $U=new Map([...YU,[Ij,ZU]].map(([e,t])=>[e,QU(t)]));Object.freeze([...$U.keys()]);const eW=new Set([`hook_event_name`,`session_id`,`session_name`,`transcript_path`,`cwd`,`model`,`workspace`,`version`,`output_style`,`cost`,`context_window`,`exceeds_200k_tokens`,`effort`,`thinking`,`rate_limits`,`vim`,`agent`,`worktree`]),tW=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]],nW=[[`workspace.added_dirs`,`string-list`]];function rW(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of tW){let i=oW(n,e);if(i==null)t.missingRequired.push(e);else{let n=iW(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of nW){let i=oW(n,e),a=i===void 0?r:aW(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))eW.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function iW(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function aW(e){return Array.isArray(e)&&e.every(e=>iW(e)===`string`)?`string-list`:iW(e)}function oW(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=n[e]}return n}function sW(e,t){switch(e){case`vars`:return{what:e,vars:cW(t)};case`segments`:return{what:e,segments:pW(t)};case`config`:return{what:e,config:_W(t)}}}function cW(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=dW(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=lW(r),s=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...a,lastError:s===void 0?null:{timestampMs:s.timestamp,message:s.message},ageMs:uW(r.lastUpdatedMs())})}return o}function lW(e){if(e.kind!==`document`)try{return{type:e.type,value:e.read()}}catch(t){return{type:e.type,value:t instanceof Error?t.message:String(t)}}let t=e.read();switch(t.kind){case`ok`:return{type:`document`,value:JSON.stringify(t.value)};case`absent`:return{type:`document`,value:`(not yet scanned)`};case`failed`:return{type:`document`,value:t.reason}}}function uW(e){return e===null?null:Math.max(0,Date.now()-e)}function dW(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,fW(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}`,fW(i));return t}function fW(e){return e.kind}function pW(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=hW(n),o=mW(n),s=[];for(let e of a){let t=n.segments[e];t&&s.push({name:e,description:t.description??null,template:t.template,referencedVars:gW(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function mW(e){let t=new Map;for(let n of Mb(e.presets))for(let r of wu(Fb(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=bu(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function hW(e){let t=[],n=new Set;for(let r of wu(jd(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function gW(e,t,n){let r=new Set;for(let i of Sx(e,t).keys()){if(n.has(i)){r.add(i);continue}let e=i.split(`.`);for(;e.length>1;){e.pop();let t=e.join(`.`);if(n.has(t)){r.add(t);break}}}return Array.from(r).sort()}function _W(e){return e===null?null:e.config}const vW=[`vars`,`segments`,`config`];function yW(e){return typeof e==`string`&&vW.includes(e)}function bW(e){return Math.max(1,e-2)}var xW=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return l.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const SW=new AB,CW=new jH;ke(SW.launchStats);const wW=new dC({counters:SW,logger:Z}),TW=CR({watchers:wW,logger:Z}),{gitProvider:EW,usageStore:DW,mementoProvider:OW}=TW,kW=new NB,AW=new UV(kW,Z),jW=new fH,MW=new HN,NW=new xW(Ze()),PW=new OB({gitService:EW,sessionState:kW,watchers:wW},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} files=${e.configLayers.join(` < `)||`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),FW=60*1e3;function IW(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(E(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),QW(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,FW),a.unref())},checkNow:o}}const LW=IW(),RW=oL({entryUrl:import.meta.url,intervalMs:FW,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>LW.checkNow(),log:Z});let zW=null,BW=null,VW=0;function HW(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),QW(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),QW(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),QW(0)});try{VW=cj(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),QW(1);return}zW=lN(t.pid);let e=yN(xN(zW));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),QW(1);return}BW=e.registryPath,r.mkdirSync(Re(),{recursive:!0}),He(ze()),kW.useStorage(new FB(Ge(),500,Z)),AW.useStorage(uH(Ke(),Z)),fN({anchor:dN(t.env),isAlive:pN,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),QW(0)}}),UW(x.createServer({allowHalfOpen:!1},e=>{$W(e)}),ze(),!1)}function UW(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),QW(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}WW(e,n)}),e.listen(n,()=>GW(n))}function WW(e,n){let i=$M(eN(Ue(n)),(e,t)=>cN(e,t,{readStartTime:sN,pidAlive:pN}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),QW(1);return}}UW(e,n,!0)}function GW(e){let n=rN(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),QW(0);return}YW(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(re.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(VW/1048576)}MB`),Tj();let i=NW.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),LW.arm(),RW.arm(),JW(),KW(e,n.identity)}function KW(e,n){oN({bound:n,myPid:t.pid,readIdentity:()=>rN(e),readLease:()=>eN(Ue(e)),shutdown:e=>QW(e),log:Z}).arm()}let qW=null;function JW(){qW=fj(gj(SW.startedAt.getTime(),e=>QW(e),{rssLimitBytes:VW})),qW.arm()}function YW(e){let n=tN(Ue(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:zW});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let XW=0,ZW=!1;function QW(e){if(!ZW){ZW=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{EW.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{DW.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{wW.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{kW.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}nN(We(),t.pid),BW!==null&&bN(BW,t.pid,_N,e=>r.unlinkSync(e)),t.exit(e)}}function $W(e){XW++,SW.inFlight=XW;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>QW(r);try{e.end(LA(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{SW.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=RA(e=>{tG(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),XW=Math.max(0,XW-1),SW.inFlight=XW})}const eG=e=>({resp:e,exitAfterFlush:null});async function tG(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return eG({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale — staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return eG({ok:!0,stats:SW.snapshot({gitCache:EW.getStats(),usageCache:DW.getStats(),renderCacheSize:PW.size,effectCache:MW.getStats(),watchersActive:wW.size(),nextRestartReason:qW?.describeNextRestart()??null,handlerProbes:CW.list()})});if(e.kind===`render`){SW.requestsTotal++;let t=new Date,n=CC(t),r=t.getTime();try{let{report:t}=rW(e.hookData);for(let e of t.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let i=[];for(let e of t.missingRequired)i.push(`missing required field '${e}'`);for(let{path:e,expected:n,got:r}of t.typeMismatches)i.push(`field '${e}' expected ${n}, got ${r}`);if(e.cwd===``&&i.push(`request 'cwd' is empty`),i.length>0)return SW.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${i.join(`; `)}`),eG({ok:!1,error:`malformed hookData: ${i.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let a=e.hookData.workspace.project_dir,{configFile:o,unknownFlagsError:s}=nG(e.args),c=e.hookData.session_id,l=DA(e),u=JSON.stringify(l);kW.get(c,`client-hints`)!==u&&kW.set(c,zU,u);let d=kW.get(c,`config-override`)??o??l.configEnv,f=PW.getOrCreate(a,e.cwd,d),p=hU({projectDir:a,cwd:e.cwd,configFile:d??null});kW.get(c,`render-origin`)!==p&&kW.set(c,mU,p);let m=l.termCols,h=bW(m??120),g=eP(l.termRows),{authoredRoots:_}=f.state,v=t=>kW.get(e.hookData.session_id,t),y=jF(f.state.config,v,e=>_.has(e)),b=await JF(e.hookData,n,{...sG,navigation:e=>jW.depth(e,kW,RI(f.state.config))},e.cwd,f.state.neededInputPaths(y.preset),y,l,{...TI(f.state.config,f.state.fileHeldSettings,v),configPath:f.configLayers.includes(f.configHome)?f.configHome:null}),x=[],S=MF(y,h),C=MW.of(c),ee=sB(f.state.config,f.state.compiled,f.state.store,f.state.registry,b,n,S,{perSegmentSink:f.state.lastRenderCellsBySegment,onRenderWarning:e=>x.push(e)},{...NF(y),effects:C}),w=kW.get(e.hookData.session_id,`click.error`);w&&kW.clear(e.hookData.session_id,`click.error`);let te=[s,f.lastError,w].filter(Boolean).join(`
211
+ `),ne=RW.notice({sessionId:c,dismissed:kW.get(c,WI),enabled:y.updateNotice}),re=f.lastError===null?null:f.failedFile,ie=[...f.lastWarning===null?[]:[{kind:`load`,message:f.lastWarning}],...x],T=aP(te,ne,ie.map(e=>e.message).join(`
212
+ `)),E=NW.sync(c,T===null?null:sP(T));E!==null&&Z(`warn`,`diagnostic dump failed: ${E}`);let ae=cP(ee,T,{fullText:E===null?{kind:`file`,path:NW.pathFor(c)}:{kind:`unavailable`,reason:E},failedConfigFile:re},{width:h,rowCap:g,colorCompatibility:y.colorCompatibility}),oe=Date.now()-r,se=EW.getStats(),ce=DW.getStats(),le=C.lastFrame(),ue=le.own.map(e=>`${e.placement}:${e.effect}@${e.t.toFixed(3)}`).join(`,`)||`-`,de=le.fades.map(e=>`${e.placement}@${e.t.toFixed(3)}`).join(`,`)||`-`,fe=ie.map(e=>e.kind).join(`,`)||`-`;return Z(`info`,`render sid=${e.hookData.session_id??`?`} at=${n.toFixed(3)} took=${oe}ms termCols=${m??`?`} termRows=${l.termRows??`?`} width=${h} git=${se.size}/${se.hits}h/${se.misses}m usage=${ce.size}/${ce.hits}h/${ce.misses}m effect=${le.effect} effectT=${le.t.toFixed(3)} effectRows=${le.made}made/${le.reused}reused effectOwn=${ue} fadeBasis=${le.basis} stateRev=${le.revision} fades=${de} err=${te?`Y`:`N`} upd=${ne.length} warn=${fe}`),eG({ok:!0,output:ae+`
213
213
  `})}catch(e){throw SW.requestsErrored++,e}}if(e.kind===`click`)return eG(cG(e.verb,e.value,FA(e.clientVersion)));if(e.kind===`debug`){if(!yW(e.what))return eG({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${vW.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=PW.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?oG(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):aG};return eG({ok:!0,debug:sW(e.what,n)})}return eG({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function nG(e){let{values:t,tokens:n}=y({args:e.slice(1),options:{config:{type:`string`}},strict:!1,tokens:!0,allowPositionals:!0}),r=[...new Set((n??[]).filter(e=>e.kind===`option`&&e.name!==`config`).map(e=>`--${e.name}`))];return{configFile:AA(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const rG={sessionState:kW,dlog:Z,applyUpdate:()=>RW.act(),doctor:mH(e=>{let t=[e.projectDir,e.cwd,e.configFile??void 0];PW.reload(...t);let n=PW.getOrCreate(...t);return{layers:n.configLayers,error:n.lastError,warning:n.lastWarning,unused:n.state.unused,config:n.state.config}}),probes:CW,memento:OW,claudeInput:ZH(),history:AW,navigation:jW,configFor:e=>PW.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>PW.reload(e.projectDir,e.cwd,e.configFile??void 0)};rG.reloadConfig;const iG={endcaps:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:rl,width:1/0},aG=new Map;function oG(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,$N(a,{...iG,charset:t,colorCompatibility:n}));return r}const sG={...TW,history:e=>AW.depth(e)};function cG(e,t,n){let r=$U.get(e);if(!r)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return r(t,{...rG,clientVersion:n}),{ok:!0,output:``}}catch(e){let t=e instanceof $?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const lG={connectMs:200,budgetMs:500};async function uG(e,n){let r=n.includes(`--json`),i=await dG(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${KA(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
214
214
  `);return}t.stdout.write(fG(i.value))}function dG(e){return BA({kind:`debug`,what:e},lG,e=>`debug`in e?e.debug:void 0)}function fG(e){switch(e.what){case`vars`:return pG(e.vars);case`segments`:return mG(e.segments);case`config`:return hG(e.config);default:return e}}function pG(e){if(e.length===0)return`no variables (DSL not active)
215
215
  `;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`—`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${_G(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${gG(a.value)}${e}${o}`)}return t.join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.127.1",
3
+ "version": "1.127.2",
4
4
  "description": "Statusline renderer for Claude Code — a JSON5-configurable DSL with daemon-cached data sources, byte-clean palette-aware composition, and OSC8 click verbs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -101,9 +101,9 @@
101
101
  "typescript": "^5.0.0"
102
102
  },
103
103
  "optionalDependencies": {
104
- "@promptctl/cc-candybar-darwin-arm64": "1.127.1",
105
- "@promptctl/cc-candybar-darwin-x64": "1.127.1",
106
- "@promptctl/cc-candybar-linux-x64": "1.127.1",
107
- "@promptctl/cc-candybar-linux-arm64": "1.127.1"
104
+ "@promptctl/cc-candybar-darwin-arm64": "1.127.2",
105
+ "@promptctl/cc-candybar-darwin-x64": "1.127.2",
106
+ "@promptctl/cc-candybar-linux-x64": "1.127.2",
107
+ "@promptctl/cc-candybar-linux-arm64": "1.127.2"
108
108
  }
109
109
  }