@promptctl/cc-candybar 1.118.1 → 1.118.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.
- package/README.md +3 -1
- package/dist/index.mjs +45 -45
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -160,26 +160,26 @@ Config tooling:
|
|
|
160
160
|
running daemon; none spawn one.)
|
|
161
161
|
|
|
162
162
|
`,wS=`readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3`,TS={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function ES(e){let t=e[TS.socket]??``,n=e[TS.pane]??``;if(t===``||n===``)return null;let r=e[TS.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}function DS(e){let[t,...n]=e;return t===void 0?{ok:!0}:{ok:!1,reason:t,more:n}}const OS=TS.truecolor,kS={name:`tmuxTruecolor`,label:`tmux truecolor`,probe:({tmux:e,claudeSettings:t})=>{switch(e.kind){case`unreported`:return{ok:!1,reason:"the client reported no tmux facts — re-run `cc-candybar install` to stage a current client"};case`outside`:return{ok:!0};case`inside`:{if(e.termfeatures.kind===`failed`)return{ok:!1,reason:`tmux could not be asked: ${e.termfeatures.reason}`};if(!e.termfeatures.value.includes(`RGB`)||e.hint.truecolor!==null)return{ok:!0};let n=t.env[OS];return typeof n==`string`&&n!==``?{ok:!1,reason:`${OS} is set in ${t.path} — restart Claude Code to apply`}:{ok:!1,reason:`Claude Code renders the bar in 256 colours inside tmux`,fix:{kind:`claude-settings-env`,name:OS,value:`1`}}}}}},AS={variable:`is never read`,action:`is never clicked`,helper:`is never called`,segment:`is in no preset`},jS={name:`config`,label:`config`,probe:({config:e})=>{switch(e.kind){case`failed`:{let[t=`the config failed to load`,...n]=[...e.error.split(`
|
|
163
|
-
`).map(e=>e.trim()).filter(e=>e!==``),...e.warnings];return{ok:!1,reason:t,more:n}}case`loaded`:return DS([...e.warnings,...e.shadowed.map(t=>`${t} is never read — ${e.path??`another config`} is found first`),...e.unused.map(({kind:e,name:t})=>`${e} "${t}" ${AS[e]}`)])}}},MS="re-run `cc-candybar install`";function NS(e){if(e.kind===`failed`)return[`Launch Services could not be asked which app opens cc-candybar:// — ${e.reason}`];if(e.value===null)return[`no app is registered for cc-candybar:// — ${MS}`];let{app:t,missing:n}=e.value;return n.kind===`failed`?[`${t} opens cc-candybar://, but ${n.reason} — ${MS}`]:n.value.map(e=>`${e} is missing, and ${t} runs it — ${MS}`)}const PS=[jS,{name:`urlHandler`,label:`URL handler`,probe:({urlHandler:e})=>{switch(e.kind){case`unsupported`:return{ok:!0};case`unprobed`:return{ok:!1,reason:e.reason};case`arrived`:return e.handler===e.bar?{ok:!0}:{ok:!1,reason:e.handler===null?`the URL handler does not report its version, so it is older than the bar (${e.bar}) — ${MS}`:`the URL handler runs cc-candybar ${e.handler}; the bar runs ${e.bar} — ${MS}`};case`lost`:return DS([...NS(e.opener),e.unopened===null?`a cc-candybar:// link was opened and did not arrive at the daemon`:`a cc-candybar:// link could not be opened — ${e.unopened}`])}}},kS];function FS(e){return PS.map(t=>({check:t,verdict:t.probe(e)}))}function IS(e){return PS.find(t=>t.name===e)}const LS=`${ad}doctor.`;function RS(e){let t=`${LS}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function zS(e,t=[]){return t.length===0?e:`${e} (+${t.length} more — run \`cc-candybar doctor\`)`}function BS(e){return e.flatMap(({check:e,verdict:t})=>{let n=RS(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:rs}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:zS(t.reason,t.more)},{key:n.fixable,value:t.fix===void 0?rs:ns}]})}const VS={copySession:{copy:`{{ .session.id }}`},copyResume:{copy:`{{ .resume_command }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},openConfig:{open:`{{ .config_path }}`}};function HS(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }}{{ if ne .resume_command "" }} {{ action "${t(`copyResume`)}" "⎘ resume" }}{{ end }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}{{ if ne .config_path "" }} {{ action "${t(`openConfig`)}" "↗ config" }}{{ end }}`,actions:Object.fromEntries(Object.entries(VS).map(([t,n])=>[`${e}${t}`,n]))}}const US=`armed`,WS=`disarmed`,GS=`.armed`,KS=e=>e.endsWith(GS);function qS(e,t,n){let r=`${e}${GS}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${US}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "✕" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:US},[a]:{set:r,to:WS},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:WS}},disarm:a}}const JS=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function YS(e){return typeof e==`string`&&JS.test(e)?{kind:`line`,line:e}:{kind:`refused`,reason:`a slash command is "/" then its name, e.g. "/compact" or "/model opus", on one line with no control characters, got ${JSON.stringify(e)}`}}function XS(e){let t=YS(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const ZS=[`/compact`,`/model`],QS=`/clear`;function $S(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=qS(`${e}clear`,{arm:QS,confirm:`${QS} ✓ confirm`},[n]);return{template:ZS.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,when:`{{ ${wx} }}`,actions:{...Object.fromEntries(ZS.map(e=>[t(e),{slash:XS(e)}])),...r.actions,[n]:{slash:XS(QS)}},variables:r.variables,disarm:r.disarm}}function eC(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:l.resolve(t,n)}function tC(e){return e??l.join(h.homedir(),`.claude`)}function nC(e){return l.join(e,`settings.json`)}function rC(e){return l.join(e,`plugins`,`installed_plugins.json`)}function iC(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function aC(e){let t;try{let n=iC(e);if(/^\s*$/.test(n))return{};t=Ds.parse(n)}catch(t){throw Error(`cannot read ${e}: ${oC(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const oC=e=>e instanceof Error?e.message:String(e),sC=Array.from({length:10},(e,t)=>(t+1)*1e5),cC=sC[0],lC=sC[sC.length-1];function uC(e){let t;try{t=aC(e)}catch(e){return X(e instanceof Error?e.message:String(e))}let n=t.autoCompactWindow;return n===void 0?J(`auto`):typeof n==`number`&&Number.isInteger(n)&&n>=cC&&n<=lC?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${cC}–${lC} tokens)`)}function dC(e,t){let n=Math.min(t??lC,lC),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:sC.filter(e=>e<r).at(-1)??0,higher:sC.find(e=>e>r&&e<=n)??0}}function fC(e,t){return{template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}${t(`.autocompact.applied`)}{{ end }}{{ if ${wx} }}{{ if gt .autocompact.lower 0 }} {{ action (printf "${e}%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "${e}%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "${e}auto" "↺" }}{{ end }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`,actions:{[`${e}auto`]:{slash:XS(`/autocompact auto`)},...Object.fromEntries(sC.map(t=>[`${e}${t}`,{slash:XS(`/autocompact ${t}`)}]))}}}const pC=e=>`{{ if ge ${e} 1000000 }}{{ printf "%.1f" (divf ${e} 1000000) }}M{{ else if ge ${e} 1000 }}{{ printf "%.1f" (divf ${e} 1000) }}K{{ else }}{{ ${e} }}{{ end }}`,mC=`${ad}menu`,hC=`open`,gC=`${ad}edit`,_C=`${ad}toolbar`,vC=HS(ad),yC=`${ad}commands`,bC=$S(`${yC}.`),xC=`${ad}autocompact`,SC=fC(`${xC}.`,pC),CC=e=>({kind:`segment`,name:e}),wC=`${ad}tab`,TC=[{member:`session`,label:`⚡ session`},{member:`look`,label:`🎨 look`},{member:`layout`,label:`📐 layout`},{member:`config`,label:`⚙ config`},{member:`tools`,label:`🧰 tools`}],EC=e=>`${wC}.${e}`,DC=e=>`${EC(e)}.toggle`,OC=e=>({variable:wC,key:wC,member:e}),kC=`${ad}save`,AC=`${ad}preset.save`,jC=`${ad}preset.delete`,MC=`${ad}resetAll`,NC=`${mC}.toggle`,PC={variable:mC,key:mC,member:hC},FC=`${ad}undo`,IC=`${ad}back`,LC=`${IC}.step`,RC=`${ad}navigation.back`,zC=IC,BC={template:`{{ if gt .${RC} 0 }}{{ action "${IC}" "◁" }}{{ else }}{{ fg (${wS}) "◁" }}{{ end }}`},VC=`${ad}redo`,HC=`${ad}doctor`,UC=`${HC}.run`,WC=e=>`${HC}.fix.${e}`,GC=e=>`${HC}.${e}`,KC=tv(`${ad}pickers`),qC=[{template:`{{ themePreview }}`}],JC={template:`{{ layoutPreview }}`},YC={preset:[JC,{when:`{{ not .preset.bundled }}`,template:`{{ action "${jC}" (printf "🗑 delete %s" .${Tx.preset.effectiveVar}) }}`}],theme:qC,style:qC,variation:[JC]},XC=e=>`${ad}${e}`,ZC=e=>`${ad}apply.${e}`,QC=e=>`${ad}reset.${e}`,$C=e=>`${ad}list.${e}`,ew=(e,t)=>`${$C(e)}.${t}`,tw=e=>`${ad}resettable.${e}`,nw=e=>e.length===0?`false`:`(or ${e.map(e=>`.${tw(e)}`).join(` `)})`,rw=Object.keys(Tx).map(e=>{let t=Tx[e],n=Yl(t.configKey),r=iS({label:t.label,domain:n},t.sessionKey,t.effectiveVar,ZC(e),KC);return{...t,name:e,control:r,beneath:YC[e]??[]}}),iw={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,updateNotice:`config`},aw=e=>rw.filter(t=>iw[t.name]===e),ow=e=>aw(e).map(vw);new Set(rw.flatMap(e=>[e.sessionKey,e.configKey]));const sw=qS(MC,{arm:`⟲`,confirm:`⟲ reset all?`},rw.map(e=>QC(e.name))),cw=[`unsaved`,`history.undo`,`history.redo`],lw=e=>`${ad}${e}`,uw=lw(`unsaved`),dw=(e,t)=>({body:t,shown:`(gt .${lw(e)} 0)`}),fw=[dw(`unsaved`,`{{ action "${kC}" (printf "💾 save %d" .${uw}) }}`),dw(`history.undo`,`{{ action "${FC}" "↶" }}`),dw(`history.redo`,`{{ action "${VC}" "↷" }}`),{body:sw.template,shown:`(or ${nw(rw.map(e=>e.name))} ${sw.armed})`}],pw={when:`{{ or ${fw.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+fw.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},mw=[{step:sw,place:`door`},{step:bC,place:`session`}],hw=e=>e.map(e=>e.step.disarm),gw=hw(mw),_w=hw(mw.filter(e=>e.place!==`door`));function vw(e){let t=XC(e.name);return e.control.kind===`inline`?CC(t):Al(t,e.control.list.ref,{kind:`container`,direction:`vertical`,children:[CC($C(e.name)),...e.beneath.map((t,n)=>CC(ew(e.name,n)))]},`drop`)}function yw(e){return e===mC}function bw(e){let t=CC(mC);if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[bw(n),...r]}:{kind:`container`,direction:`vertical`,children:[t,e]}}return e.kind===`container`&&e.when===void 0?{...e,children:[t,...e.children]}:{kind:`container`,direction:`horizontal`,children:[t,e]}}function xw(e){return Sw(e)>0?e:bw(e)}function Sw(e){let t=0;for(let n of pc(e))n.kind===`segment`&&yw(n.name)&&(t+=1);return t}function Cw(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&yw(e.name)||e.opens!==void 0&&Cw(e.opens.body,!0):e.children.some(e=>Cw(e,n))}const ww={session:{direction:`vertical`,content:[CC(_C),{kind:`container`,direction:`horizontal`,children:[CC(yC),CC(xC)]}]},look:{direction:`horizontal`,content:[]},layout:{direction:`horizontal`,content:[CC(AC),CC(gC)]},config:{direction:`horizontal`,content:[]},tools:{direction:`vertical`,content:[CC(HC),...PS.map(e=>CC(GC(e.name)))]}},Tw=e=>({kind:`container`,direction:ww[e].direction,children:[...ww[e].content,...ow(e)]});function Ew(e){return e.kind===`segment`?yw(e.name)?Al(e.name,PC,Ow,`above`):e:Aw(e)}function Dw(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[CC(zC),...ow(`door`),CC(kC)]},{kind:`container`,direction:`horizontal`,children:TC.map(({member:e})=>Al(EC(e),OC(e),Tw(e),`drop`))}]}}const Ow=Dw();function kw(e){let t=new Map;for(let e of pc(Ow))e.kind===`segment`&&e.opens!==void 0&&t.set(e.opens.ref.key,e.opens.ref.variable);return[...t].map(([t,n])=>{let r=e.variables[n];if(r?.kind!==`state`||r.default===void 0)throw Error(`settings menu: the door folds "${t}", but "${n}" is not a state variable the menu declares with a default`);let i=`${mC}.fold.${td(t)}`;return e.actions[i]={set:t,to:r.default},i})}function Aw(e){return{...e,children:e.children.map(e=>Ew(e))}}function jw(e){let t={variables:{[mC]:Il(mC,Tl)},actions:{[NC]:Ll(mC,hC),[UC]:{doctor:`run`},[gC]:{do:[...Mv]},...vC.actions,...bC.actions,...SC.actions,[kC]:{save:!0},[FC]:{undo:!0},[LC]:{back:!0},[IC]:{do:[LC,...gw]},[VC]:{redo:!0},[AC]:{preset:`save`},[jC]:{preset:`delete`,name:`{{ .${Tx.preset.effectiveVar} }}`}},segments:{[mC]:{template:`{{ $door := ${Pl(mC,Fl(e),Fl(`✖`))} }}{{ if ${Ml(PC)} }}{{ fg (color "error") $door }}{{ else }}{{ $door }}{{ end }}`},[_C]:{template:vC.template},[yC]:{template:bC.template,when:bC.when},[xC]:{template:SC.template,bg:SC.bg,when:SC.when},[zC]:BC,[kC]:pw,[AC]:{template:`{{ action "${AC}" "+ preset" }}`},[HC]:{template:`{{ action "${UC}" "🩺 doctor" }}`},[gC]:{template:`{{ action "${gC}" "✎ arrange" "✎ done" }}`}}};t.variables[RC]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of cw)t.variables[lw(e)]={kind:`input`,path:e,type:`number`,default:0};t.variables[wC]=Il(wC,`session`);for(let{member:e,label:n}of TC){t.actions[DC(e)]=Ll(wC,e),t.actions[EC(e)]={do:[DC(e),..._w]};let r=nw(aw(e).map(e=>e.name)),i=`(ternary ${Fl(` •`)} "" ${r})`,a=e=>`(print ${Fl(e)} ${i})`;t.segments[EC(e)]={template:`{{ ${Pl(EC(e),a(n),a(`▾ ${n}`))} }}`}}return Object.assign(t.variables,bC.variables,sw.variables),Nw(t),Mw(t),t.actions[mC]={do:[NC,...gw,...kw(t)]},t}function Mw(e){for(let t of PS){let n=RS(t.name),r=WC(t.name);for(let t of Object.values(n))e.variables[t]={kind:`state`,key:t,default:``};e.actions[r]={doctor:`fix`,check:t.name},e.segments[GC(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${ns}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function Nw(e){for(let t of rw){Object.assign(e.actions,t.control.actions);let n=QC(t.name);e.actions[n]={reset:t.configKey},e.variables[tw(t.name)]={kind:`input`,path:`resettable.${t.name}`,type:`boolean`,default:!1};let r=`{{ if .${tw(t.name)} }} {{ action "${n}" "↺" }}{{ end }}`;Object.assign(e.variables,t.control.variables),e.segments[XC(t.name)]={template:`${t.control.template}${r}`},t.control.kind===`picker`&&(e.segments[$C(t.name)]={template:t.control.list.template}),t.beneath.forEach((n,r)=>{e.segments[ew(t.name,r)]=n})}Object.assign(e.actions,sw.actions)}function Pw(e){let{variables:t,actions:n}=Vv();Object.assign(e.variables,t),Object.assign(e.actions,n)}function Fw(e){let t=jw(e.globals.menuGlyph??`🍫`);Pw(t);let n={...e.presets},r=[];for(let t of uv(e.presets)){let{node:i}=pv(e,t),a=Ew(xw(i));r.push(a),n[t]={...fv(e.presets,t),root:a}}let i=Px(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const Iw=`${id}live`,Lw=[`☐ live`,`☑ live`],Rw=`${id}done`,zw=`${id}cancel`,Bw=`${id}rewind`,Vw=`${id}changes`,Hw=`(gt .${Vw} 0)`,Uw=`(or ${Hw} (gt .${uw} 0))`,Ww={variable:Iw,key:Iw,member:`open`};function Gw(e){return`${id}configuring.p${e}`}function Kw(e){return`and ${Ml(Iv)} (not ${Ml(Ww)}) (ne .${Gw(e)} "true")`}function qw(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${kv} "${kl(e)}")`).join(` `)} false }}`}}function Jw(e,t,n){return`{{ if ${Kw(e)} }}${t}{{ else }}${n}{{ end }}`}const Yw=`{{ and ${Ml(Iv)} .preset.customized }}`,Xw=sd;function Zw(e){return new Map([...Yx(e),...$w(e)])}const Qw=`${id}addable`;function $w(e){return new Map([[Qw,{members:Object.keys(e.segments).filter(e=>!Xw(e)),library:{groups:$u.map(e=>({id:e,label:ed[e]})),entry:t=>{let n=e.segments[t];return{group:n.group??`other`,...n.description!==void 0&&{description:n.description}}}}}]])}function eT(e,t,n){return n.segments[e]={template:t,when:Lv,bg:gS},{kind:`segment`,name:e}}function tT(e,t,n){let r=`${id}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${lo}`}) (action "${r}" "✖") }}`}function nT(e){return`{{ if ${Ml(Iv)} }}${e}{{ end }}`}function rT(e,t){return e.reduce((e,t)=>`{{ if and ${Ml(Iv)} ${Ml(t)} }}true{{ else }}${e}{{ end }}`,t)}function iT(e){return e.flatMap(e=>[...pc(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function aT(e,t,n){return`${Pv}${e}.${t}.${n}`}function oT(e,t,n,r){let i=lc(n),a=`${id}${e.presetIdent}`,o=Fv(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`,c=tv(s),l=`${s}.fold`;e.artifacts.actions[l]={set:c,to:Tl},e.artifacts.actions[s]={do:[`${s}.open`,l]},e.artifacts.actions[`${s}.open`]={set:kv,to:o};let u={},d=Object.entries(r).map(([r,o])=>{let s=aT(e.presetIdent,i,r),l=`${Pv}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Dc(n.settings?.[r]??o.default)},u[r]={id:i,key:s,variable:l};let d=`${a}.setting.${t}.${r}`,f=iS(nS(o),s,l,d,c);if(Object.assign(e.artifacts.actions,f.actions),Object.assign(e.artifacts.variables,f.variables),f.kind===`inline`)return e.artifacts.segments[d]={template:f.template},{kind:`segment`,name:d};let p=`${d}.list`;return e.artifacts.segments[d]={template:f.template},e.artifacts.segments[p]={template:f.list.template},Al(d,f.list.ref,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:p}]},`drop`)});return{term:`{{ action "${s}" "⚙️" }}`,ref:{variable:kv,key:kv,member:o},body:{kind:`container`,direction:`vertical`,children:d},drafts:u}}const sT=`${id}label:`;function cT(e){if(e.startsWith(sT)){let t=e.slice(sT.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function lT(e,t,n,r){let{artifacts:i}=n,a=lc(e),o=`${sT}${a}:${e.name}`;i.segments[o]={template:`{{ "${kl(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=e.settings?.[Sc];return{...Al(o,r.ref,r.body,`drop`,rT([r.ref],`{{ ${Kw(n.presetIdent)} }}`)),...s!==void 0&&{settings:{theme:s}},drafts:{[Sc]:r.drafts[Sc]}}}function uT(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${id}${i}.insert.${t}`,s=`${id}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:Qw,anchor:n,relation:r};let c=$_(o),l=ev(s,o,void 0),u=rv(l),d=nv(l,c);return a.variables[l]=Il(l,Tl),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=Ll(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${Ml({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${lo}`}) $m }}{{ end }}`}}function dT(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!Xw(e.name)),i=e=>dT(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=fc(o,i);if(Xw(o.name)){n.push(s);continue}let c=lc(o),l=a===r?[uT(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=uT(t,u,c,`after`),f=tT(t,u,c),p=t.segments[o.name],m=oT(t,u,o,Cc(p)),h=nT(f),g=nT(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>eT(e.host,e.template,t.artifacts)),{...lT(o,p,t,m),lead:h,trail:g},{...s,when:Jw(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},eT(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[_]}:_)}return{...e,children:n,...e.when!==void 0&&{when:rT(iT(n),Jw(t.presetIdent,`true`,e.when))}}}function fT(e,t,n,r,i,a,o){let s=`${id}${t}.resetLayout`,c=`${id}${t}.customized`;return r.actions[s]={reset:n},r.segments[c]={template:`{{ action "${s}" "↺ reset layout" }}`,when:Yw},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...i,{kind:`segment`,name:c},a]},pT(e,o)]}}function pT(e,t){if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t]};let n=e.children.at(-1);return e.direction===`vertical`&&n!==void 0&&(n.kind===`segment`||n.when===void 0)?{...e,children:[...e.children.slice(0,-1),pT(n,t)]}:{...e,children:[...e.children,t]}}function mT(e,t,n,r,i,a){let{node:o}=pv(e,t),s={presetIdent:td(t),rootKey:lS(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},c=dT(o,s);return n.variables[Gw(s.presetIdent)]=qw(s.configured),fT(c,s.presetIdent,s.rootKey,n,r,i,a)}function hT(e){let t={variables:{},actions:{},segments:{}},n=mS(`${id}help`,SS,[Iv],t);t.variables[Iw]=Il(Iw,Tl),t.actions[Iw]=Ll(Iw,Ww.member),t.segments[Iw]={template:Nl(Iw,...Lw),when:Lv};let r={kind:`segment`,name:Iw},i=n;t.variables[Vw]={kind:`input`,path:`history.sinceEdit`,type:`number`,default:0},t.actions[Rw]={do:[kC,...Mv]},t.segments[Rw]={template:`{{ if ${Uw} }}{{ action "${Rw}" "✓ save" }}{{ else }}{{ action "${Rw}" "✓ done" }}{{ end }}`,when:Lv},t.actions[Bw]={rewind:!0},t.actions[zw]={do:[Bw,...Mv]},t.segments[zw]={template:`{{ action "${zw}" "↩ cancel" }}`,when:`{{ and ${Ml(Iv)} ${Hw} }}`};let a=[{kind:`segment`,name:Rw},{kind:`segment`,name:zw}],o={...e.presets},s=[];for(let n of uv(e.presets)){let c=mT(e,n,t,a,r,i);s.push(c),o[n]={...fv(e.presets,n),root:c}}let c=Px(t,s,e);return{...e,variables:{...c,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:o}}const gT=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`rewind`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function _T(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function vT(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function yT(e,t){if(t===void 0)return{};if(!Lc(t))return Q(e,`actions`,`actions must be an object, got ${Rc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=bT(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Q(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function bT(e,t,n){if(!Lc(n))return Q(e,t,`${t} must be an action object, got ${Rc(n)}`),null;if(`persistWhen`in n)return Q(e,t,`${t}.persistWhen was removed: declare the \`set\` alone — a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=gT.filter(e=>e in n);return r.length===1?xT[r[0]](e,t,n):(Q(e,t,`action must declare exactly one of: ${gT.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const xT={set:(e,t,n)=>$T(e,t,n,`set`,YT),persist:(e,t,n)=>$T(e,t,n,`persist`,XT),copy:ST(`copy`),open:ST(`open`),reset:CT,undo:TT(`undo`),redo:TT(`redo`),back:TT(`back`),rewind:TT(`rewind`),save:TT(`save`),preset:ET,doctor:DT,ceiling:OT,slash:kT,do:AT};function ST(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Mc(t,n,r,e);return i===null?null:{[e]:i}}}function CT(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=jT(e,t,`reset`,n,`reset key must be non-empty (the config globals field to clear)`,e=>`reset key "${e}" contains "/" — keys must be slash-free`);return r===null?null:{reset:r}}const wT={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,rewind:`it steps the session's settings history back to where edit mode opened`,save:`it saves the session's unsaved settings`};function TT(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Q(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${wT[e]}), got ${K(r[e])}`),null)}}function ET(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Q(e,`${t}.preset`,`preset must be "save" or "delete", got ${K(r)}`),null;if(r===`save`)return{preset:`save`};let a=Mc(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function DT(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Q(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${K(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||IS(a)===void 0?(Q(e,`${t}.check`,`doctor fix must name a check (have: ${PS.map(e=>e.name).join(`, `)}), got ${K(a)}`),null):{doctor:`fix`,check:a}}function OT(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Q(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${K(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Q(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${K(a)}`),null):{ceiling:`set`,to:a}}function kT(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=YS(n.slash);return r.kind===`refused`?(Q(e,`${t}.slash`,r.reason),null):{slash:r.line}}function AT(e,t,n){for(let r of Object.keys(n))r!==`do`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Q(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${K(r)}`),null):{do:r}}function jT(e,t,n,r,i,a){let o=Mc(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Q(e,s,i),null):o.includes(`/`)?(Q(e,s,a(o)),null):o}const MT={set:`the SessionState key to write`,persist:`the config globals field to write`};function NT(e,t,n,r){let i=MT[r],a=jT(e,t,r,n,`${r} key must be non-empty (${i})`,e=>`${r} key "${e}" contains "/" — keys must be slash-free`);return a===null?null:{[r]:a}}function PT(e){return e===`set`?`set-state`:`set-config`}const FT={to:eE(`set`)},IT={to:eE(`persist`)},LT={from:tE(`set`)},RT={from:tE(`persist`)},zT={min:oE(),max:oE(),by:oE()},BT={int:rE()},VT={cycle:nE(`set`)},HT={cycle:nE(`persist`)},UT={removeSegment:iE(`removeSegment`)},WT={insertSegment:iE(`insertSegment`),anchor:iE(`anchor`),relation:aE()},GT={insertSegmentFrom:tE(`persist`),anchor:iE(`anchor`),relation:aE()},KT={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},qT={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function JT(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>Vc(e,t,n,r),c=al(t);return{detect:a,allowed:[...o,...i],label:i.join(`/`),json:{type:`object`,properties:{...Object.fromEntries(o.map(e=>[e,{type:`string`}])),...c.properties},required:[...o,...c.required??[]],additionalProperties:!1},parse:n.length?Yc(s,...n):s}}const YT=[JT(`set`,FT),JT(`set`,LT),JT(`set`,zT,[KT,qT]),JT(`set`,BT),JT(`set`,VT)],XT=[JT(`persist`,IT),JT(`persist`,RT),JT(`persist`,zT,[KT,qT]),JT(`persist`,HT),JT(`persist`,UT),JT(`persist`,WT,[],[`insertSegment`]),JT(`persist`,GT,[],[`insertSegmentFrom`])];function ZT(e){let t=[`"to" (a literal value)`,`"from" (an option domain — a registered domain name like "themes"/"endcaps"/"styles", or an inline array of literal values)`,`"min"/"max"/"by" (a bounded step)`];return e===`set`&&t.push(`"int" (an unbounded integer cursor)`),t.push(`"cycle" (an enumerated domain stepped in order)`),e===`persist`&&t.push(`"removeSegment" (remove a named segment from the layout)`,`"insertSegment"/"anchor"/"relation" (insert a named segment before/after an existing one)`,`"insertSegmentFrom"/"anchor"/"relation" (insert a segment PICKED from an option domain before/after an existing one)`),t}function QT(e){let t=ZT(e),n=t[t.length-1];return`a ${e} action declares exactly one value source: ${t.length===1?n:`${t.slice(0,-1).join(`, `)}, or ${n}`}`}function $T(e,t,n,r,i){let a=NT(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Q(e,t,`${QT(r)}${o.length>1?` — found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Q(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function eE(e){let t=PT(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>jT(n,r,i,a,`${e} value must be non-empty — an empty value cannot be delivered on the ${t} wire`,t=>`${e} value "${t}" contains "/" — ${e} values must be slash-free`)??void 0}}function tE(e){let t=PT(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Q(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Q(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Q(n,s,`${i} array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Q(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Q(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Q(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${K(o)}`)}}}function nE(e){let t=PT(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Q(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${Rc(o)}`);return}let c=o;if(c.length<2){Q(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Q(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Q(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Q(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function rE(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Q(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${K(r[n])}`);return}return!0}}}function iE(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Mc(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Q(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Q(t,o,`${e} "${a}" contains "/" or ":" — segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function aE(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Q(e,`${t}.${n}`,`relation must be "before" or "after", got ${K(i)}`);return}return i}}}function oE(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Q(e,`${t}.${n}`,`${n} must be an integer, got ${K(i)}`);return}return i}}}function sE(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const cE={noun:`style key`,fields:{hueShift:$c(),chromaScale:$c({min:0}),lightnessScale:$c(),lightnessShift:$c()}};function lE(e,t){if(!Lc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${Rc(t)}`,line:G(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:G(e.source,[`styles`,r])});continue}if(qo(r)){e.issues.push({path:`styles.${r}`,message:sE(`styles.${r}`,r,`globals.endcaps`),line:G(e.source,[`styles`,r])});continue}let t=zc(e,cE,`styles.${r}`,i);t!==null&&(n[r]={...cr,...t})}return n}const uE={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:Yd(e,`${t}.${n}`,r[n])},globals:{required:!1,json:cu(),parse:(e,t,n,r)=>r[n]===void 0?void 0:su(e,`${t}.${n}`,r[n])}}};function dE(e,t){if(!Lc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${Rc(t)}`,line:G(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free — a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:G(e.source,[`presets`,r])});continue}let t=zc(e,uE,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function fE(e,t){if(t===void 0)return{};if(!Lc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${Rc(t)}`,line:G(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${K(i)}`,line:G(e.source,[`helpers`,r])});continue}n[r]=i}return n}const pE=new Map([[`session.budget.amount`,{segment:`session`,setting:`budget`}],[`session.budget.warningThreshold`,{segment:`session`,setting:`warnAt`}],[`today.budget.amount`,{segment:`today`,setting:`budget`}],[`today.budget.warningThreshold`,{segment:`today`,setting:`warnAt`}],[`block.budget.heatThreshold`,{segment:`block`,setting:`warnAt`}],[`block.budget.warningThreshold`,{segment:`block`,setting:`errorAt`}],[`weekly.budget.heatThreshold`,{segment:`weekly`,setting:`warnAt`}],[`weekly.budget.warningThreshold`,{segment:`weekly`,setting:`errorAt`}],[`burn.eta.errorMinutes`,{segment:`burnrate`,setting:`errorWithin`}],[`burn.eta.warnMinutes`,{segment:`burnrate`,setting:`warnWithin`}]]);function mE(e){return`it became the "${e.setting}" setting of each "${e.segment}" placement — set it on the placement where a row places "${e.segment}" ({ seg: "${e.segment}", settings: { ${e.setting}: <value> } }), or redeclare segments.${e.segment}.settings.${e.setting} with the default every placement should start from`}function hE(e){let t=pE.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${mE(t)}`}function gE(e){let t=pE.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${mE(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function _E(e,t){let n=new Map;for(let e of Object.keys(t)){let t=td(e),r=n.get(t);r?r.push(e):n.set(t,[e])}for(let[t,r]of n)r.length<2||e.issues.push({path:`presets`,message:`preset names ${r.map(e=>JSON.stringify(e)).join(` and `)} both collapse to the same synthesis identifier "${t}" — edit mode's synthesized reset affordance would silently steal one preset's action for the other. Rename one.`,line:G(e.source,[`presets`])})}function vE(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||zo(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:qo(i)?sE(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:G(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:G(e.source,[`globals`,`preset`])}),_E(e,t.presets);let i=Zw(t),a=Xx(i);for(let[n,r]of Object.entries(t.actions)){let[t,o]=`from`in r?[`from`,r.from]:`insertSegmentFrom`in r?[`insertSegmentFrom`,r.insertSegmentFrom]:[null,null];if(t!==null&&typeof o==`string`&&!a.includes(o)){e.issues.push({path:`actions.${n}.${t}`,message:`actions.${n} ${t}: references ${$x(o,i)}`,line:G(e.source,[`actions`,n,t])});continue}if(!(`set`in r))continue;Ox.has(r.set)&&e.issues.push({path:`actions.${n}.set`,message:`actions.${n} sets "${r.set}", which has no session pick — globals.${r.set} is set in the config file only, so a click would change nothing; write it with { persist: "${r.set}", … } instead`,line:G(e.source,[`actions`,n,`set`])});let s=Mx.get(r.set);s!==void 0&&FE(e,n,r,s,i)}for(let[n,r]of Object.entries(t.actions))`do`in r&&r.do.forEach((i,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,i)?t.actions[i]:void 0,s=o===void 0?`references unknown action "${i}"`:`do`in o?`"${i}" is itself a do action — list its members here instead`:r.do.indexOf(i)===a?a>0&&vT(o)?`"${i}" takes its value from the template (from/int/insertSegmentFrom), so it can only be the first member — only the first is bound the region's display`:void 0:`"${i}" is listed twice — each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:G(e.source,[`actions`,n,`do`])})});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=dS(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${fu().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:G(e.source,[`actions`,n,a])});continue}let s=yE.filter(e=>e in r);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a "presets.<name>.root" target — ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){bE(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!uv(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names preset "${o.preset}" which is not declared (have: ${uv(t.presets).join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${dd(o.segment)}`,line:G(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:G(e.source,[`actions`,n,a])})}}let o=sy(t);for(let t of o.names)t!==`settings`&&!t.startsWith(xE)||e.issues.push({path:`variables`,message:`variable "${t}" is named under "settings", which a segment's templates read as its placement's own settings (.settings.<name>) — rename it`,line:G(e.source,[`variables`,t])});let s=(t,n,r)=>{Sw(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${mC}" ${Sw(t)} times — it may appear at most once per layout (it is one disclosure, and one state key holds one open state). Remove all but the placement you want; removing every placement puts the menu at its default position.`,line:r}),Cw(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${mC}" under a \`when\` or inside a disclosure body — the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),c(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell — everything inside a cell wears that cell's hue and tone, so it would place nothing. Set it on the row whose children are the cells (the horizontal container) or on the root, which places the rows.`,line:r});let i=new Map;for(let e of pc(t)){if(e.kind!==`segment`)continue;let t=lc(e);i.set(t,[...i.get(t)??[],e])}for(let[t,a]of i){if(a.length<2)continue;let o=a[1].name,s=dc(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" — an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function c(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>c(n,t||cc[e.direction]===`cell`))}let l=(n,r)=>{for(let[i,a]of vl(n,r)){let n=G(e.source,a.split(`.`));if(i.when!==void 0&&(NE(e,`${a}.when`,i.when,o,{line:n}),ME(e,`${a}.when`,i.when,n)),i.kind===`segment`){if(yw(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:a,message:`${r} gives the global settings menu anchor "${mC}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${mC}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:a,message:`${r} entry "${i.name}" does not match any declared segment${dd(i.name)}`,line:n}),kE(e,t,i,a,n)}}};n.root!==void 0&&l(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&l(t.root,`presets.${e}.root`);let u=new Map([[`root`,gl(t.root)]]);for(let e of uv(t.presets)){let{node:n,path:r}=pv(t,e);u.set(r,n)}for(let[t,n]of u)s(n,t,G(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){AE(e,`variables.${n}`,r,o);let t=hE(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:G(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))AE(e,`segments.${n}.vars.${t}`,i,o,n);let i=Cc(r);CE(e,n,i);let a=SE(o,i);for(let o of[`template`,`bg`,`fg`,`when`]){let s=r[o];if(typeof s==`string`){NE(e,`segments.${n}.${o}`,s,a,{segCtx:n,settings:i});for(let{name:r,site:i,via:a}of iy(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=i===`options`?` (in a picker, menu or carousel)`:``;if(a!==null){PE(e,a,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${o}`,message:`${o} references unknown action "${r}"${s}`,line:G(e.source,[`segments`,n,o])})}}}}for(let[n,r]of Object.entries(t.variables))jE(e,`variables.${n}`,r,o);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,i]of Object.entries(r.vars))jE(e,`segments.${n}.vars.${t}`,i,o,n)}const yE=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function bE(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=G(e.source,[`actions`,n,r]);if(!uv(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${uv(t.presets).join(`, `)})`,line:c});return}if(r===`reset`)return;let l=`removeSegment`in o,u=`insertSegment`in o,d=`insertSegmentFrom`in o;if(!l&&!u&&!d){e.issues.push({path:s,message:`actions.${n}: "${i}" is a "presets.<name>.root" target and can only be paired with "removeSegment", "insertSegment", or "insertSegmentFrom" (not "to"/"from"/"cycle"/bounded — those have no meaning as a tree op)`,line:c});return}let f=(r,i)=>{Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" is not a declared segment (have: ${Object.keys(t.segments).join(`, `)})${dd(i)}`,line:c})},p=new Set(uc(pv(t,a).node)),m=(r,i)=>{!ud.has(i)||p.has(i)||Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" names no placement${dd(i)}`,line:c})};`removeSegment`in o&&m(`removeSegment`,o.removeSegment),`insertSegment`in o&&f(`insertSegment`,o.insertSegment),(`insertSegment`in o||`insertSegmentFrom`in o)&&m(`anchor`,o.anchor)}const xE=`settings.`;function SE(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>xE+e)])}}function CE(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:G(e.source,[`segments`,t,`settings`,n])})},a=EE(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Tc(n,TE(n)))i(e,`the defaults do not stand together: ${t}`)}function wE(e){return EE(e).length>0||Tc(e,TE(e)).length>0}function TE(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function EE(e){let t=t=>wc(DE(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||wc(DE(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${OE(e,n).join(`, `)||`none`})`}];let i=[n];for(let e=r;e!==void 0;e=t(e)){if(e===n)return i.every(e=>n<=e)?[{setting:n,message:`atLeast closes a cycle (${[...i,n].join(` ≥ `)}) — every setting on it could only ever equal the rest`}]:[];if(i.includes(e))return[];i.push(e)}return[]})}function DE(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function OE(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&wc(n)!==void 0).map(([e])=>e)}function kE(e,t,n,r,i){let a=Object.prototype.hasOwnProperty.call(t.segments,n.name)?t.segments[n.name]:void 0;if(a===void 0)return;let o=Cc(a),s=`${r}: placement "${lc(n)}" of segment "${n.name}"`;for(let[t,a]of Object.entries(n.settings??{})){let c=Object.prototype.hasOwnProperty.call(o,t)?o[t]:void 0,l=c===void 0?`sets "${t}", which segment "${n.name}" does not declare (it has: ${Object.keys(o).join(`, `)})`:Ec(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Ao(a):``}, but it must be ${kc(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Ec(o[e],t))||wE(o)))for(let{message:t}of Tc(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function AE(e,t,n,r,i){n.kind===`template`&&NE(e,`${t}.template`,n.template,r,{segCtx:i}),bc(n)&&n.cache&&`key`in n.cache&&NE(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function jE(e,t,n,r,i){if(bc(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.names.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.names.has(s)?` (segment-local vars are namespaced — write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:G(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function ME(e,t,n,r){try{Dv.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function NE(e,t,n,r,i){for(let[a,o]of ey(n,r.helpers)){if(oy(a,r))continue;if(a.startsWith(xE)){let n=o===null?``:` through helper "${o}"`,r=a.slice(9),s=i?.segCtx===void 0||i.settings===void 0?`Template reads ".${a}"${n}, but only a segment's own templates have settings — call it from a segment that declares "${r}"`:`Template reads ".${a}"${n}, but segment "${i.segCtx}" has no setting "${r}" (it has: ${Object.keys(i.settings).join(`, `)}) — declare it under segments.${i.segCtx}.settings`;e.issues.push({path:t,message:s,line:i?.line??G(e.source,t.split(`.`))});continue}if(o!==null){PE(e,o,`Template references unknown variable ".${a}"${gE(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&oy(n,r)?` (segment-local vars are namespaced — write ".${n}")`:gE(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??G(e.source,t.split(`.`))})}}function PE(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:G(e.source,[`helpers`,t])})}function FE(e,t,n,r,i){let a=n.set,o=Yl(Tx[r].configKey),s=`${a} takes ${tS(o,i)}`;if(`min`in n&&(o===`bool`||`from`in o)){e.issues.push({path:`actions.${t}.min`,message:`actions.${t}: a stepper writes the integers from ${n.min} to ${n.max}, and ${a} is not an integer range; ${s}`,line:G(e.source,[`actions`,t,`min`])});return}let c=RE(n,i);if(c===LE){e.issues.push({path:`actions.${t}.int`,message:`actions.${t}.int: an int cursor writes whatever integer the template binds, and a click outside the ${a} domain would change nothing; ${s}`,line:G(e.source,[`actions`,t,`int`])});return}let l=c.filter(e=>!eS(o,e.value,i));if(l.length!==0){if(a===Tx.style.sessionKey&&c.every(e=>qo(e.value))){let r=Tx.endcaps.sessionKey;e.issues.push(`to`in n?{path:`actions.${t}.to`,message:sE(`actions.${t}.to`,n.to,`set: "${r}", to`),line:G(e.source,[`actions`,t,`to`])}:{path:`actions.${t}.set`,message:`actions.${t}.set: "${a}" here writes only endcaps shapes, not styles — endcaps were renamed from "style" to "endcaps"; write set: "${r}"`,line:G(e.source,[`actions`,t,`set`])});return}for(let n of new Set(l.map(e=>e.field))){let r=l.filter(e=>e.field===n).map(e=>JSON.stringify(e.value)),i=r.length<=IE?r.join(`, `):`${r.slice(0,IE).join(`, `)} and ${r.length-IE} more`,o=`actions.${t}.${n}`;e.issues.push({path:o,message:`${o}: ${i} ${r.length===1?`is`:`are`} outside the ${a} domain — a click would write it and nothing would change; ${s}`,line:G(e.source,[`actions`,t,n])})}}}const IE=3,LE=Symbol(`any integer`);function RE(e,t){return`to`in e?[{field:`to`,value:e.to}]:`cycle`in e?e.cycle.map(e=>({field:`cycle`,value:e})):`from`in e?Zx(e.from,t).members.map(e=>({field:`from`,value:e})):`min`in e?[{field:`min`,value:String(e.min)},{field:`max`,value:String(e.max)}]:LE}function zE(e,t){let{graph:n,nodeInfo:r}=BE(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` → `)}`,line:G(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function BE(e){let t=new Set(Object.keys(e.variables)),n=new Map;for(let t of Object.keys(e.variables))n.set(t,{declarationPath:`variables.${t}`,linePathParts:[`variables`,t]});for(let[r,i]of Object.entries(e.segments))if(i.vars)for(let e of Object.keys(i.vars)){let i=`${r}.${e}`;t.add(i),n.set(i,{declarationPath:`segments.${r}.vars.${e}`,linePathParts:[`segments`,r,`vars`,e]})}let r=new Map;for(let e of t)r.set(e,new Set);let i=(n,i)=>{for(let a of ey(i,e.helpers).keys()){if(t.has(a)){r.get(n).add(a);continue}let e=a.split(`.`)[0];e!==a&&t.has(e)&&r.get(n).add(e)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),bc(n)&&(n.cache&&`key`in n.cache&&i(e,n.cache.key),n.cache&&`depends_on`in n.cache))for(let i of n.cache.depends_on)t.has(i)&&r.get(e).add(i)};for(let[t,n]of Object.entries(e.variables))a(t,n);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))a(`${t}.${e}`,r);return{graph:r,nodeInfo:n}}const VE=[`json5`,`json`];function HE(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function UE(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?h.homedir()+e.slice(1):e}function WE(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?VE.map(t=>l.join(e,`.cc-candybar.${t}`)):[],...VE.map(e=>l.join(r,`.cc-candybar.${e}`)),...VE.map(e=>`${GE()}.${e}`)])]}function GE(){let e=process.env.XDG_CONFIG_HOME??l.join(h.homedir(),`.config`);return l.join(e,`cc-candybar`,`config`)}function KE(e,t,n){let r=[];for(let i of WE(e,t,n)){let e=HE(i);if(e===`present`)return{kind:`file`,path:i,unchecked:r};e!==`absent`&&r.push(e)}if(n===void 0)return{kind:`default`,unchecked:r};let[i]=r;return i===void 0?{kind:`missing`,path:n}:{kind:`unreadable`,...i}}function qE(e,t,n){let r=KE(e,t,n);return r.kind===`default`?`${GE()}.${VE[0]}`:r.path}function JE(e){return YE(e).join(`
|
|
164
|
-
`)||null}function
|
|
163
|
+
`).map(e=>e.trim()).filter(e=>e!==``),...e.warnings];return{ok:!1,reason:t,more:n}}case`loaded`:return DS([...e.warnings,...e.unused.map(({kind:e,name:t})=>`${e} "${t}" ${AS[e]}`)])}}},MS="re-run `cc-candybar install`";function NS(e){if(e.kind===`failed`)return[`Launch Services could not be asked which app opens cc-candybar:// — ${e.reason}`];if(e.value===null)return[`no app is registered for cc-candybar:// — ${MS}`];let{app:t,missing:n}=e.value;return n.kind===`failed`?[`${t} opens cc-candybar://, but ${n.reason} — ${MS}`]:n.value.map(e=>`${e} is missing, and ${t} runs it — ${MS}`)}const PS=[jS,{name:`urlHandler`,label:`URL handler`,probe:({urlHandler:e})=>{switch(e.kind){case`unsupported`:return{ok:!0};case`unprobed`:return{ok:!1,reason:e.reason};case`arrived`:return e.handler===e.bar?{ok:!0}:{ok:!1,reason:e.handler===null?`the URL handler does not report its version, so it is older than the bar (${e.bar}) — ${MS}`:`the URL handler runs cc-candybar ${e.handler}; the bar runs ${e.bar} — ${MS}`};case`lost`:return DS([...NS(e.opener),e.unopened===null?`a cc-candybar:// link was opened and did not arrive at the daemon`:`a cc-candybar:// link could not be opened — ${e.unopened}`])}}},kS];function FS(e){return PS.map(t=>({check:t,verdict:t.probe(e)}))}function IS(e){return PS.find(t=>t.name===e)}const LS=`${ad}doctor.`;function RS(e){let t=`${LS}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function zS(e,t=[]){return t.length===0?e:`${e} (+${t.length} more — run \`cc-candybar doctor\`)`}function BS(e){return e.flatMap(({check:e,verdict:t})=>{let n=RS(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:rs}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:zS(t.reason,t.more)},{key:n.fixable,value:t.fix===void 0?rs:ns}]})}const VS={copySession:{copy:`{{ .session.id }}`},copyResume:{copy:`{{ .resume_command }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},openConfig:{open:`{{ .config_path }}`}};function HS(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }}{{ if ne .resume_command "" }} {{ action "${t(`copyResume`)}" "⎘ resume" }}{{ end }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}{{ if ne .config_path "" }} {{ action "${t(`openConfig`)}" "↗ config" }}{{ end }}`,actions:Object.fromEntries(Object.entries(VS).map(([t,n])=>[`${e}${t}`,n]))}}const US=`armed`,WS=`disarmed`,GS=`.armed`,KS=e=>e.endsWith(GS);function qS(e,t,n){let r=`${e}${GS}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${US}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "✕" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:US},[a]:{set:r,to:WS},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:WS}},disarm:a}}const JS=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function YS(e){return typeof e==`string`&&JS.test(e)?{kind:`line`,line:e}:{kind:`refused`,reason:`a slash command is "/" then its name, e.g. "/compact" or "/model opus", on one line with no control characters, got ${JSON.stringify(e)}`}}function XS(e){let t=YS(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const ZS=[`/compact`,`/model`],QS=`/clear`;function $S(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=qS(`${e}clear`,{arm:QS,confirm:`${QS} ✓ confirm`},[n]);return{template:ZS.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,when:`{{ ${wx} }}`,actions:{...Object.fromEntries(ZS.map(e=>[t(e),{slash:XS(e)}])),...r.actions,[n]:{slash:XS(QS)}},variables:r.variables,disarm:r.disarm}}function eC(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:l.resolve(t,n)}function tC(e){return e??l.join(h.homedir(),`.claude`)}function nC(e){return l.join(e,`settings.json`)}function rC(e){return l.join(e,`plugins`,`installed_plugins.json`)}function iC(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function aC(e){let t;try{let n=iC(e);if(/^\s*$/.test(n))return{};t=Ds.parse(n)}catch(t){throw Error(`cannot read ${e}: ${oC(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const oC=e=>e instanceof Error?e.message:String(e),sC=Array.from({length:10},(e,t)=>(t+1)*1e5),cC=sC[0],lC=sC[sC.length-1];function uC(e){let t;try{t=aC(e)}catch(e){return X(e instanceof Error?e.message:String(e))}let n=t.autoCompactWindow;return n===void 0?J(`auto`):typeof n==`number`&&Number.isInteger(n)&&n>=cC&&n<=lC?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${cC}–${lC} tokens)`)}function dC(e,t){let n=Math.min(t??lC,lC),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:sC.filter(e=>e<r).at(-1)??0,higher:sC.find(e=>e>r&&e<=n)??0}}function fC(e,t){return{template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}${t(`.autocompact.applied`)}{{ end }}{{ if ${wx} }}{{ if gt .autocompact.lower 0 }} {{ action (printf "${e}%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "${e}%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "${e}auto" "↺" }}{{ end }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`,actions:{[`${e}auto`]:{slash:XS(`/autocompact auto`)},...Object.fromEntries(sC.map(t=>[`${e}${t}`,{slash:XS(`/autocompact ${t}`)}]))}}}const pC=e=>`{{ if ge ${e} 1000000 }}{{ printf "%.1f" (divf ${e} 1000000) }}M{{ else if ge ${e} 1000 }}{{ printf "%.1f" (divf ${e} 1000) }}K{{ else }}{{ ${e} }}{{ end }}`,mC=`${ad}menu`,hC=`open`,gC=`${ad}edit`,_C=`${ad}toolbar`,vC=HS(ad),yC=`${ad}commands`,bC=$S(`${yC}.`),xC=`${ad}autocompact`,SC=fC(`${xC}.`,pC),CC=e=>({kind:`segment`,name:e}),wC=`${ad}tab`,TC=[{member:`session`,label:`⚡ session`},{member:`look`,label:`🎨 look`},{member:`layout`,label:`📐 layout`},{member:`config`,label:`⚙ config`},{member:`tools`,label:`🧰 tools`}],EC=e=>`${wC}.${e}`,DC=e=>`${EC(e)}.toggle`,OC=e=>({variable:wC,key:wC,member:e}),kC=`${ad}save`,AC=`${ad}preset.save`,jC=`${ad}preset.delete`,MC=`${ad}resetAll`,NC=`${mC}.toggle`,PC={variable:mC,key:mC,member:hC},FC=`${ad}undo`,IC=`${ad}back`,LC=`${IC}.step`,RC=`${ad}navigation.back`,zC=IC,BC={template:`{{ if gt .${RC} 0 }}{{ action "${IC}" "◁" }}{{ else }}{{ fg (${wS}) "◁" }}{{ end }}`},VC=`${ad}redo`,HC=`${ad}doctor`,UC=`${HC}.run`,WC=e=>`${HC}.fix.${e}`,GC=e=>`${HC}.${e}`,KC=tv(`${ad}pickers`),qC=[{template:`{{ themePreview }}`}],JC={template:`{{ layoutPreview }}`},YC={preset:[JC,{when:`{{ not .preset.bundled }}`,template:`{{ action "${jC}" (printf "🗑 delete %s" .${Tx.preset.effectiveVar}) }}`}],theme:qC,style:qC,variation:[JC]},XC=e=>`${ad}${e}`,ZC=e=>`${ad}apply.${e}`,QC=e=>`${ad}reset.${e}`,$C=e=>`${ad}list.${e}`,ew=(e,t)=>`${$C(e)}.${t}`,tw=e=>`${ad}resettable.${e}`,nw=e=>e.length===0?`false`:`(or ${e.map(e=>`.${tw(e)}`).join(` `)})`,rw=Object.keys(Tx).map(e=>{let t=Tx[e],n=Yl(t.configKey),r=iS({label:t.label,domain:n},t.sessionKey,t.effectiveVar,ZC(e),KC);return{...t,name:e,control:r,beneath:YC[e]??[]}}),iw={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,updateNotice:`config`},aw=e=>rw.filter(t=>iw[t.name]===e),ow=e=>aw(e).map(vw);new Set(rw.flatMap(e=>[e.sessionKey,e.configKey]));const sw=qS(MC,{arm:`⟲`,confirm:`⟲ reset all?`},rw.map(e=>QC(e.name))),cw=[`unsaved`,`history.undo`,`history.redo`],lw=e=>`${ad}${e}`,uw=lw(`unsaved`),dw=(e,t)=>({body:t,shown:`(gt .${lw(e)} 0)`}),fw=[dw(`unsaved`,`{{ action "${kC}" (printf "💾 save %d" .${uw}) }}`),dw(`history.undo`,`{{ action "${FC}" "↶" }}`),dw(`history.redo`,`{{ action "${VC}" "↷" }}`),{body:sw.template,shown:`(or ${nw(rw.map(e=>e.name))} ${sw.armed})`}],pw={when:`{{ or ${fw.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+fw.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},mw=[{step:sw,place:`door`},{step:bC,place:`session`}],hw=e=>e.map(e=>e.step.disarm),gw=hw(mw),_w=hw(mw.filter(e=>e.place!==`door`));function vw(e){let t=XC(e.name);return e.control.kind===`inline`?CC(t):Al(t,e.control.list.ref,{kind:`container`,direction:`vertical`,children:[CC($C(e.name)),...e.beneath.map((t,n)=>CC(ew(e.name,n)))]},`drop`)}function yw(e){return e===mC}function bw(e){let t=CC(mC);if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[bw(n),...r]}:{kind:`container`,direction:`vertical`,children:[t,e]}}return e.kind===`container`&&e.when===void 0?{...e,children:[t,...e.children]}:{kind:`container`,direction:`horizontal`,children:[t,e]}}function xw(e){return Sw(e)>0?e:bw(e)}function Sw(e){let t=0;for(let n of pc(e))n.kind===`segment`&&yw(n.name)&&(t+=1);return t}function Cw(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&yw(e.name)||e.opens!==void 0&&Cw(e.opens.body,!0):e.children.some(e=>Cw(e,n))}const ww={session:{direction:`vertical`,content:[CC(_C),{kind:`container`,direction:`horizontal`,children:[CC(yC),CC(xC)]}]},look:{direction:`horizontal`,content:[]},layout:{direction:`horizontal`,content:[CC(AC),CC(gC)]},config:{direction:`horizontal`,content:[]},tools:{direction:`vertical`,content:[CC(HC),...PS.map(e=>CC(GC(e.name)))]}},Tw=e=>({kind:`container`,direction:ww[e].direction,children:[...ww[e].content,...ow(e)]});function Ew(e){return e.kind===`segment`?yw(e.name)?Al(e.name,PC,Ow,`above`):e:Aw(e)}function Dw(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[CC(zC),...ow(`door`),CC(kC)]},{kind:`container`,direction:`horizontal`,children:TC.map(({member:e})=>Al(EC(e),OC(e),Tw(e),`drop`))}]}}const Ow=Dw();function kw(e){let t=new Map;for(let e of pc(Ow))e.kind===`segment`&&e.opens!==void 0&&t.set(e.opens.ref.key,e.opens.ref.variable);return[...t].map(([t,n])=>{let r=e.variables[n];if(r?.kind!==`state`||r.default===void 0)throw Error(`settings menu: the door folds "${t}", but "${n}" is not a state variable the menu declares with a default`);let i=`${mC}.fold.${td(t)}`;return e.actions[i]={set:t,to:r.default},i})}function Aw(e){return{...e,children:e.children.map(e=>Ew(e))}}function jw(e){let t={variables:{[mC]:Il(mC,Tl)},actions:{[NC]:Ll(mC,hC),[UC]:{doctor:`run`},[gC]:{do:[...Mv]},...vC.actions,...bC.actions,...SC.actions,[kC]:{save:!0},[FC]:{undo:!0},[LC]:{back:!0},[IC]:{do:[LC,...gw]},[VC]:{redo:!0},[AC]:{preset:`save`},[jC]:{preset:`delete`,name:`{{ .${Tx.preset.effectiveVar} }}`}},segments:{[mC]:{template:`{{ $door := ${Pl(mC,Fl(e),Fl(`✖`))} }}{{ if ${Ml(PC)} }}{{ fg (color "error") $door }}{{ else }}{{ $door }}{{ end }}`},[_C]:{template:vC.template},[yC]:{template:bC.template,when:bC.when},[xC]:{template:SC.template,bg:SC.bg,when:SC.when},[zC]:BC,[kC]:pw,[AC]:{template:`{{ action "${AC}" "+ preset" }}`},[HC]:{template:`{{ action "${UC}" "🩺 doctor" }}`},[gC]:{template:`{{ action "${gC}" "✎ arrange" "✎ done" }}`}}};t.variables[RC]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of cw)t.variables[lw(e)]={kind:`input`,path:e,type:`number`,default:0};t.variables[wC]=Il(wC,`session`);for(let{member:e,label:n}of TC){t.actions[DC(e)]=Ll(wC,e),t.actions[EC(e)]={do:[DC(e),..._w]};let r=nw(aw(e).map(e=>e.name)),i=`(ternary ${Fl(` •`)} "" ${r})`,a=e=>`(print ${Fl(e)} ${i})`;t.segments[EC(e)]={template:`{{ ${Pl(EC(e),a(n),a(`▾ ${n}`))} }}`}}return Object.assign(t.variables,bC.variables,sw.variables),Nw(t),Mw(t),t.actions[mC]={do:[NC,...gw,...kw(t)]},t}function Mw(e){for(let t of PS){let n=RS(t.name),r=WC(t.name);for(let t of Object.values(n))e.variables[t]={kind:`state`,key:t,default:``};e.actions[r]={doctor:`fix`,check:t.name},e.segments[GC(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${ns}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function Nw(e){for(let t of rw){Object.assign(e.actions,t.control.actions);let n=QC(t.name);e.actions[n]={reset:t.configKey},e.variables[tw(t.name)]={kind:`input`,path:`resettable.${t.name}`,type:`boolean`,default:!1};let r=`{{ if .${tw(t.name)} }} {{ action "${n}" "↺" }}{{ end }}`;Object.assign(e.variables,t.control.variables),e.segments[XC(t.name)]={template:`${t.control.template}${r}`},t.control.kind===`picker`&&(e.segments[$C(t.name)]={template:t.control.list.template}),t.beneath.forEach((n,r)=>{e.segments[ew(t.name,r)]=n})}Object.assign(e.actions,sw.actions)}function Pw(e){let{variables:t,actions:n}=Vv();Object.assign(e.variables,t),Object.assign(e.actions,n)}function Fw(e){let t=jw(e.globals.menuGlyph??`🍫`);Pw(t);let n={...e.presets},r=[];for(let t of uv(e.presets)){let{node:i}=pv(e,t),a=Ew(xw(i));r.push(a),n[t]={...fv(e.presets,t),root:a}}let i=Px(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const Iw=`${id}live`,Lw=[`☐ live`,`☑ live`],Rw=`${id}done`,zw=`${id}cancel`,Bw=`${id}rewind`,Vw=`${id}changes`,Hw=`(gt .${Vw} 0)`,Uw=`(or ${Hw} (gt .${uw} 0))`,Ww={variable:Iw,key:Iw,member:`open`};function Gw(e){return`${id}configuring.p${e}`}function Kw(e){return`and ${Ml(Iv)} (not ${Ml(Ww)}) (ne .${Gw(e)} "true")`}function qw(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${kv} "${kl(e)}")`).join(` `)} false }}`}}function Jw(e,t,n){return`{{ if ${Kw(e)} }}${t}{{ else }}${n}{{ end }}`}const Yw=`{{ and ${Ml(Iv)} .preset.customized }}`,Xw=sd;function Zw(e){return new Map([...Yx(e),...$w(e)])}const Qw=`${id}addable`;function $w(e){return new Map([[Qw,{members:Object.keys(e.segments).filter(e=>!Xw(e)),library:{groups:$u.map(e=>({id:e,label:ed[e]})),entry:t=>{let n=e.segments[t];return{group:n.group??`other`,...n.description!==void 0&&{description:n.description}}}}}]])}function eT(e,t,n){return n.segments[e]={template:t,when:Lv,bg:gS},{kind:`segment`,name:e}}function tT(e,t,n){let r=`${id}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${lo}`}) (action "${r}" "✖") }}`}function nT(e){return`{{ if ${Ml(Iv)} }}${e}{{ end }}`}function rT(e,t){return e.reduce((e,t)=>`{{ if and ${Ml(Iv)} ${Ml(t)} }}true{{ else }}${e}{{ end }}`,t)}function iT(e){return e.flatMap(e=>[...pc(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function aT(e,t,n){return`${Pv}${e}.${t}.${n}`}function oT(e,t,n,r){let i=lc(n),a=`${id}${e.presetIdent}`,o=Fv(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`,c=tv(s),l=`${s}.fold`;e.artifacts.actions[l]={set:c,to:Tl},e.artifacts.actions[s]={do:[`${s}.open`,l]},e.artifacts.actions[`${s}.open`]={set:kv,to:o};let u={},d=Object.entries(r).map(([r,o])=>{let s=aT(e.presetIdent,i,r),l=`${Pv}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Dc(n.settings?.[r]??o.default)},u[r]={id:i,key:s,variable:l};let d=`${a}.setting.${t}.${r}`,f=iS(nS(o),s,l,d,c);if(Object.assign(e.artifacts.actions,f.actions),Object.assign(e.artifacts.variables,f.variables),f.kind===`inline`)return e.artifacts.segments[d]={template:f.template},{kind:`segment`,name:d};let p=`${d}.list`;return e.artifacts.segments[d]={template:f.template},e.artifacts.segments[p]={template:f.list.template},Al(d,f.list.ref,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:p}]},`drop`)});return{term:`{{ action "${s}" "⚙️" }}`,ref:{variable:kv,key:kv,member:o},body:{kind:`container`,direction:`vertical`,children:d},drafts:u}}const sT=`${id}label:`;function cT(e){if(e.startsWith(sT)){let t=e.slice(sT.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function lT(e,t,n,r){let{artifacts:i}=n,a=lc(e),o=`${sT}${a}:${e.name}`;i.segments[o]={template:`{{ "${kl(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=e.settings?.[Sc];return{...Al(o,r.ref,r.body,`drop`,rT([r.ref],`{{ ${Kw(n.presetIdent)} }}`)),...s!==void 0&&{settings:{theme:s}},drafts:{[Sc]:r.drafts[Sc]}}}function uT(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${id}${i}.insert.${t}`,s=`${id}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:Qw,anchor:n,relation:r};let c=$_(o),l=ev(s,o,void 0),u=rv(l),d=nv(l,c);return a.variables[l]=Il(l,Tl),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=Ll(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${Ml({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${lo}`}) $m }}{{ end }}`}}function dT(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!Xw(e.name)),i=e=>dT(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=fc(o,i);if(Xw(o.name)){n.push(s);continue}let c=lc(o),l=a===r?[uT(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=uT(t,u,c,`after`),f=tT(t,u,c),p=t.segments[o.name],m=oT(t,u,o,Cc(p)),h=nT(f),g=nT(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>eT(e.host,e.template,t.artifacts)),{...lT(o,p,t,m),lead:h,trail:g},{...s,when:Jw(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},eT(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[_]}:_)}return{...e,children:n,...e.when!==void 0&&{when:rT(iT(n),Jw(t.presetIdent,`true`,e.when))}}}function fT(e,t,n,r,i,a,o){let s=`${id}${t}.resetLayout`,c=`${id}${t}.customized`;return r.actions[s]={reset:n},r.segments[c]={template:`{{ action "${s}" "↺ reset layout" }}`,when:Yw},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...i,{kind:`segment`,name:c},a]},pT(e,o)]}}function pT(e,t){if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t]};let n=e.children.at(-1);return e.direction===`vertical`&&n!==void 0&&(n.kind===`segment`||n.when===void 0)?{...e,children:[...e.children.slice(0,-1),pT(n,t)]}:{...e,children:[...e.children,t]}}function mT(e,t,n,r,i,a){let{node:o}=pv(e,t),s={presetIdent:td(t),rootKey:lS(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},c=dT(o,s);return n.variables[Gw(s.presetIdent)]=qw(s.configured),fT(c,s.presetIdent,s.rootKey,n,r,i,a)}function hT(e){let t={variables:{},actions:{},segments:{}},n=mS(`${id}help`,SS,[Iv],t);t.variables[Iw]=Il(Iw,Tl),t.actions[Iw]=Ll(Iw,Ww.member),t.segments[Iw]={template:Nl(Iw,...Lw),when:Lv};let r={kind:`segment`,name:Iw},i=n;t.variables[Vw]={kind:`input`,path:`history.sinceEdit`,type:`number`,default:0},t.actions[Rw]={do:[kC,...Mv]},t.segments[Rw]={template:`{{ if ${Uw} }}{{ action "${Rw}" "✓ save" }}{{ else }}{{ action "${Rw}" "✓ done" }}{{ end }}`,when:Lv},t.actions[Bw]={rewind:!0},t.actions[zw]={do:[Bw,...Mv]},t.segments[zw]={template:`{{ action "${zw}" "↩ cancel" }}`,when:`{{ and ${Ml(Iv)} ${Hw} }}`};let a=[{kind:`segment`,name:Rw},{kind:`segment`,name:zw}],o={...e.presets},s=[];for(let n of uv(e.presets)){let c=mT(e,n,t,a,r,i);s.push(c),o[n]={...fv(e.presets,n),root:c}}let c=Px(t,s,e);return{...e,variables:{...c,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:o}}const gT=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`rewind`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function _T(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function vT(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function yT(e,t){if(t===void 0)return{};if(!Lc(t))return Q(e,`actions`,`actions must be an object, got ${Rc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=bT(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Q(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function bT(e,t,n){if(!Lc(n))return Q(e,t,`${t} must be an action object, got ${Rc(n)}`),null;if(`persistWhen`in n)return Q(e,t,`${t}.persistWhen was removed: declare the \`set\` alone — a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=gT.filter(e=>e in n);return r.length===1?xT[r[0]](e,t,n):(Q(e,t,`action must declare exactly one of: ${gT.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const xT={set:(e,t,n)=>$T(e,t,n,`set`,YT),persist:(e,t,n)=>$T(e,t,n,`persist`,XT),copy:ST(`copy`),open:ST(`open`),reset:CT,undo:TT(`undo`),redo:TT(`redo`),back:TT(`back`),rewind:TT(`rewind`),save:TT(`save`),preset:ET,doctor:DT,ceiling:OT,slash:kT,do:AT};function ST(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Mc(t,n,r,e);return i===null?null:{[e]:i}}}function CT(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=jT(e,t,`reset`,n,`reset key must be non-empty (the config globals field to clear)`,e=>`reset key "${e}" contains "/" — keys must be slash-free`);return r===null?null:{reset:r}}const wT={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,rewind:`it steps the session's settings history back to where edit mode opened`,save:`it saves the session's unsaved settings`};function TT(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Q(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${wT[e]}), got ${K(r[e])}`),null)}}function ET(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Q(e,`${t}.preset`,`preset must be "save" or "delete", got ${K(r)}`),null;if(r===`save`)return{preset:`save`};let a=Mc(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function DT(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Q(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${K(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||IS(a)===void 0?(Q(e,`${t}.check`,`doctor fix must name a check (have: ${PS.map(e=>e.name).join(`, `)}), got ${K(a)}`),null):{doctor:`fix`,check:a}}function OT(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Q(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${K(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Q(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${K(a)}`),null):{ceiling:`set`,to:a}}function kT(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=YS(n.slash);return r.kind===`refused`?(Q(e,`${t}.slash`,r.reason),null):{slash:r.line}}function AT(e,t,n){for(let r of Object.keys(n))r!==`do`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Q(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${K(r)}`),null):{do:r}}function jT(e,t,n,r,i,a){let o=Mc(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Q(e,s,i),null):o.includes(`/`)?(Q(e,s,a(o)),null):o}const MT={set:`the SessionState key to write`,persist:`the config globals field to write`};function NT(e,t,n,r){let i=MT[r],a=jT(e,t,r,n,`${r} key must be non-empty (${i})`,e=>`${r} key "${e}" contains "/" — keys must be slash-free`);return a===null?null:{[r]:a}}function PT(e){return e===`set`?`set-state`:`set-config`}const FT={to:eE(`set`)},IT={to:eE(`persist`)},LT={from:tE(`set`)},RT={from:tE(`persist`)},zT={min:oE(),max:oE(),by:oE()},BT={int:rE()},VT={cycle:nE(`set`)},HT={cycle:nE(`persist`)},UT={removeSegment:iE(`removeSegment`)},WT={insertSegment:iE(`insertSegment`),anchor:iE(`anchor`),relation:aE()},GT={insertSegmentFrom:tE(`persist`),anchor:iE(`anchor`),relation:aE()},KT={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},qT={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function JT(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>Vc(e,t,n,r),c=al(t);return{detect:a,allowed:[...o,...i],label:i.join(`/`),json:{type:`object`,properties:{...Object.fromEntries(o.map(e=>[e,{type:`string`}])),...c.properties},required:[...o,...c.required??[]],additionalProperties:!1},parse:n.length?Yc(s,...n):s}}const YT=[JT(`set`,FT),JT(`set`,LT),JT(`set`,zT,[KT,qT]),JT(`set`,BT),JT(`set`,VT)],XT=[JT(`persist`,IT),JT(`persist`,RT),JT(`persist`,zT,[KT,qT]),JT(`persist`,HT),JT(`persist`,UT),JT(`persist`,WT,[],[`insertSegment`]),JT(`persist`,GT,[],[`insertSegmentFrom`])];function ZT(e){let t=[`"to" (a literal value)`,`"from" (an option domain — a registered domain name like "themes"/"endcaps"/"styles", or an inline array of literal values)`,`"min"/"max"/"by" (a bounded step)`];return e===`set`&&t.push(`"int" (an unbounded integer cursor)`),t.push(`"cycle" (an enumerated domain stepped in order)`),e===`persist`&&t.push(`"removeSegment" (remove a named segment from the layout)`,`"insertSegment"/"anchor"/"relation" (insert a named segment before/after an existing one)`,`"insertSegmentFrom"/"anchor"/"relation" (insert a segment PICKED from an option domain before/after an existing one)`),t}function QT(e){let t=ZT(e),n=t[t.length-1];return`a ${e} action declares exactly one value source: ${t.length===1?n:`${t.slice(0,-1).join(`, `)}, or ${n}`}`}function $T(e,t,n,r,i){let a=NT(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Q(e,t,`${QT(r)}${o.length>1?` — found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Q(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function eE(e){let t=PT(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>jT(n,r,i,a,`${e} value must be non-empty — an empty value cannot be delivered on the ${t} wire`,t=>`${e} value "${t}" contains "/" — ${e} values must be slash-free`)??void 0}}function tE(e){let t=PT(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Q(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Q(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Q(n,s,`${i} array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Q(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Q(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Q(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${K(o)}`)}}}function nE(e){let t=PT(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Q(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${Rc(o)}`);return}let c=o;if(c.length<2){Q(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Q(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Q(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Q(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function rE(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Q(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${K(r[n])}`);return}return!0}}}function iE(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Mc(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Q(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Q(t,o,`${e} "${a}" contains "/" or ":" — segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function aE(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Q(e,`${t}.${n}`,`relation must be "before" or "after", got ${K(i)}`);return}return i}}}function oE(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Q(e,`${t}.${n}`,`${n} must be an integer, got ${K(i)}`);return}return i}}}function sE(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const cE={noun:`style key`,fields:{hueShift:$c(),chromaScale:$c({min:0}),lightnessScale:$c(),lightnessShift:$c()}};function lE(e,t){if(!Lc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${Rc(t)}`,line:G(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:G(e.source,[`styles`,r])});continue}if(qo(r)){e.issues.push({path:`styles.${r}`,message:sE(`styles.${r}`,r,`globals.endcaps`),line:G(e.source,[`styles`,r])});continue}let t=zc(e,cE,`styles.${r}`,i);t!==null&&(n[r]={...cr,...t})}return n}const uE={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:Yd(e,`${t}.${n}`,r[n])},globals:{required:!1,json:cu(),parse:(e,t,n,r)=>r[n]===void 0?void 0:su(e,`${t}.${n}`,r[n])}}};function dE(e,t){if(!Lc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${Rc(t)}`,line:G(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free — a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:G(e.source,[`presets`,r])});continue}let t=zc(e,uE,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function fE(e,t){if(t===void 0)return{};if(!Lc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${Rc(t)}`,line:G(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${K(i)}`,line:G(e.source,[`helpers`,r])});continue}n[r]=i}return n}const pE=new Map([[`session.budget.amount`,{segment:`session`,setting:`budget`}],[`session.budget.warningThreshold`,{segment:`session`,setting:`warnAt`}],[`today.budget.amount`,{segment:`today`,setting:`budget`}],[`today.budget.warningThreshold`,{segment:`today`,setting:`warnAt`}],[`block.budget.heatThreshold`,{segment:`block`,setting:`warnAt`}],[`block.budget.warningThreshold`,{segment:`block`,setting:`errorAt`}],[`weekly.budget.heatThreshold`,{segment:`weekly`,setting:`warnAt`}],[`weekly.budget.warningThreshold`,{segment:`weekly`,setting:`errorAt`}],[`burn.eta.errorMinutes`,{segment:`burnrate`,setting:`errorWithin`}],[`burn.eta.warnMinutes`,{segment:`burnrate`,setting:`warnWithin`}]]);function mE(e){return`it became the "${e.setting}" setting of each "${e.segment}" placement — set it on the placement where a row places "${e.segment}" ({ seg: "${e.segment}", settings: { ${e.setting}: <value> } }), or redeclare segments.${e.segment}.settings.${e.setting} with the default every placement should start from`}function hE(e){let t=pE.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${mE(t)}`}function gE(e){let t=pE.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${mE(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function _E(e,t){let n=new Map;for(let e of Object.keys(t)){let t=td(e),r=n.get(t);r?r.push(e):n.set(t,[e])}for(let[t,r]of n)r.length<2||e.issues.push({path:`presets`,message:`preset names ${r.map(e=>JSON.stringify(e)).join(` and `)} both collapse to the same synthesis identifier "${t}" — edit mode's synthesized reset affordance would silently steal one preset's action for the other. Rename one.`,line:G(e.source,[`presets`])})}function vE(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||zo(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:qo(i)?sE(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:G(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:G(e.source,[`globals`,`preset`])}),_E(e,t.presets);let i=Zw(t),a=Xx(i);for(let[n,r]of Object.entries(t.actions)){let[t,o]=`from`in r?[`from`,r.from]:`insertSegmentFrom`in r?[`insertSegmentFrom`,r.insertSegmentFrom]:[null,null];if(t!==null&&typeof o==`string`&&!a.includes(o)){e.issues.push({path:`actions.${n}.${t}`,message:`actions.${n} ${t}: references ${$x(o,i)}`,line:G(e.source,[`actions`,n,t])});continue}if(!(`set`in r))continue;Ox.has(r.set)&&e.issues.push({path:`actions.${n}.set`,message:`actions.${n} sets "${r.set}", which has no session pick — globals.${r.set} is set in the config file only, so a click would change nothing; write it with { persist: "${r.set}", … } instead`,line:G(e.source,[`actions`,n,`set`])});let s=Mx.get(r.set);s!==void 0&&FE(e,n,r,s,i)}for(let[n,r]of Object.entries(t.actions))`do`in r&&r.do.forEach((i,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,i)?t.actions[i]:void 0,s=o===void 0?`references unknown action "${i}"`:`do`in o?`"${i}" is itself a do action — list its members here instead`:r.do.indexOf(i)===a?a>0&&vT(o)?`"${i}" takes its value from the template (from/int/insertSegmentFrom), so it can only be the first member — only the first is bound the region's display`:void 0:`"${i}" is listed twice — each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:G(e.source,[`actions`,n,`do`])})});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=dS(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${fu().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:G(e.source,[`actions`,n,a])});continue}let s=yE.filter(e=>e in r);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a "presets.<name>.root" target — ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){bE(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!uv(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names preset "${o.preset}" which is not declared (have: ${uv(t.presets).join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${dd(o.segment)}`,line:G(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:G(e.source,[`actions`,n,a])})}}let o=sy(t);for(let t of o.names)t!==`settings`&&!t.startsWith(xE)||e.issues.push({path:`variables`,message:`variable "${t}" is named under "settings", which a segment's templates read as its placement's own settings (.settings.<name>) — rename it`,line:G(e.source,[`variables`,t])});let s=(t,n,r)=>{Sw(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${mC}" ${Sw(t)} times — it may appear at most once per layout (it is one disclosure, and one state key holds one open state). Remove all but the placement you want; removing every placement puts the menu at its default position.`,line:r}),Cw(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${mC}" under a \`when\` or inside a disclosure body — the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),c(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell — everything inside a cell wears that cell's hue and tone, so it would place nothing. Set it on the row whose children are the cells (the horizontal container) or on the root, which places the rows.`,line:r});let i=new Map;for(let e of pc(t)){if(e.kind!==`segment`)continue;let t=lc(e);i.set(t,[...i.get(t)??[],e])}for(let[t,a]of i){if(a.length<2)continue;let o=a[1].name,s=dc(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" — an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function c(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>c(n,t||cc[e.direction]===`cell`))}let l=(n,r)=>{for(let[i,a]of vl(n,r)){let n=G(e.source,a.split(`.`));if(i.when!==void 0&&(NE(e,`${a}.when`,i.when,o,{line:n}),ME(e,`${a}.when`,i.when,n)),i.kind===`segment`){if(yw(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:a,message:`${r} gives the global settings menu anchor "${mC}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${mC}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:a,message:`${r} entry "${i.name}" does not match any declared segment${dd(i.name)}`,line:n}),kE(e,t,i,a,n)}}};n.root!==void 0&&l(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&l(t.root,`presets.${e}.root`);let u=new Map([[`root`,gl(t.root)]]);for(let e of uv(t.presets)){let{node:n,path:r}=pv(t,e);u.set(r,n)}for(let[t,n]of u)s(n,t,G(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){AE(e,`variables.${n}`,r,o);let t=hE(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:G(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))AE(e,`segments.${n}.vars.${t}`,i,o,n);let i=Cc(r);CE(e,n,i);let a=SE(o,i);for(let o of[`template`,`bg`,`fg`,`when`]){let s=r[o];if(typeof s==`string`){NE(e,`segments.${n}.${o}`,s,a,{segCtx:n,settings:i});for(let{name:r,site:i,via:a}of iy(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=i===`options`?` (in a picker, menu or carousel)`:``;if(a!==null){PE(e,a,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${o}`,message:`${o} references unknown action "${r}"${s}`,line:G(e.source,[`segments`,n,o])})}}}}for(let[n,r]of Object.entries(t.variables))jE(e,`variables.${n}`,r,o);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,i]of Object.entries(r.vars))jE(e,`segments.${n}.vars.${t}`,i,o,n)}const yE=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function bE(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=G(e.source,[`actions`,n,r]);if(!uv(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${uv(t.presets).join(`, `)})`,line:c});return}if(r===`reset`)return;let l=`removeSegment`in o,u=`insertSegment`in o,d=`insertSegmentFrom`in o;if(!l&&!u&&!d){e.issues.push({path:s,message:`actions.${n}: "${i}" is a "presets.<name>.root" target and can only be paired with "removeSegment", "insertSegment", or "insertSegmentFrom" (not "to"/"from"/"cycle"/bounded — those have no meaning as a tree op)`,line:c});return}let f=(r,i)=>{Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" is not a declared segment (have: ${Object.keys(t.segments).join(`, `)})${dd(i)}`,line:c})},p=new Set(uc(pv(t,a).node)),m=(r,i)=>{!ud.has(i)||p.has(i)||Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" names no placement${dd(i)}`,line:c})};`removeSegment`in o&&m(`removeSegment`,o.removeSegment),`insertSegment`in o&&f(`insertSegment`,o.insertSegment),(`insertSegment`in o||`insertSegmentFrom`in o)&&m(`anchor`,o.anchor)}const xE=`settings.`;function SE(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>xE+e)])}}function CE(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:G(e.source,[`segments`,t,`settings`,n])})},a=EE(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Tc(n,TE(n)))i(e,`the defaults do not stand together: ${t}`)}function wE(e){return EE(e).length>0||Tc(e,TE(e)).length>0}function TE(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function EE(e){let t=t=>wc(DE(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||wc(DE(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${OE(e,n).join(`, `)||`none`})`}];let i=[n];for(let e=r;e!==void 0;e=t(e)){if(e===n)return i.every(e=>n<=e)?[{setting:n,message:`atLeast closes a cycle (${[...i,n].join(` ≥ `)}) — every setting on it could only ever equal the rest`}]:[];if(i.includes(e))return[];i.push(e)}return[]})}function DE(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function OE(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&wc(n)!==void 0).map(([e])=>e)}function kE(e,t,n,r,i){let a=Object.prototype.hasOwnProperty.call(t.segments,n.name)?t.segments[n.name]:void 0;if(a===void 0)return;let o=Cc(a),s=`${r}: placement "${lc(n)}" of segment "${n.name}"`;for(let[t,a]of Object.entries(n.settings??{})){let c=Object.prototype.hasOwnProperty.call(o,t)?o[t]:void 0,l=c===void 0?`sets "${t}", which segment "${n.name}" does not declare (it has: ${Object.keys(o).join(`, `)})`:Ec(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Ao(a):``}, but it must be ${kc(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Ec(o[e],t))||wE(o)))for(let{message:t}of Tc(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function AE(e,t,n,r,i){n.kind===`template`&&NE(e,`${t}.template`,n.template,r,{segCtx:i}),bc(n)&&n.cache&&`key`in n.cache&&NE(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function jE(e,t,n,r,i){if(bc(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.names.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.names.has(s)?` (segment-local vars are namespaced — write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:G(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function ME(e,t,n,r){try{Dv.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function NE(e,t,n,r,i){for(let[a,o]of ey(n,r.helpers)){if(oy(a,r))continue;if(a.startsWith(xE)){let n=o===null?``:` through helper "${o}"`,r=a.slice(9),s=i?.segCtx===void 0||i.settings===void 0?`Template reads ".${a}"${n}, but only a segment's own templates have settings — call it from a segment that declares "${r}"`:`Template reads ".${a}"${n}, but segment "${i.segCtx}" has no setting "${r}" (it has: ${Object.keys(i.settings).join(`, `)}) — declare it under segments.${i.segCtx}.settings`;e.issues.push({path:t,message:s,line:i?.line??G(e.source,t.split(`.`))});continue}if(o!==null){PE(e,o,`Template references unknown variable ".${a}"${gE(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&oy(n,r)?` (segment-local vars are namespaced — write ".${n}")`:gE(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??G(e.source,t.split(`.`))})}}function PE(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:G(e.source,[`helpers`,t])})}function FE(e,t,n,r,i){let a=n.set,o=Yl(Tx[r].configKey),s=`${a} takes ${tS(o,i)}`;if(`min`in n&&(o===`bool`||`from`in o)){e.issues.push({path:`actions.${t}.min`,message:`actions.${t}: a stepper writes the integers from ${n.min} to ${n.max}, and ${a} is not an integer range; ${s}`,line:G(e.source,[`actions`,t,`min`])});return}let c=RE(n,i);if(c===LE){e.issues.push({path:`actions.${t}.int`,message:`actions.${t}.int: an int cursor writes whatever integer the template binds, and a click outside the ${a} domain would change nothing; ${s}`,line:G(e.source,[`actions`,t,`int`])});return}let l=c.filter(e=>!eS(o,e.value,i));if(l.length!==0){if(a===Tx.style.sessionKey&&c.every(e=>qo(e.value))){let r=Tx.endcaps.sessionKey;e.issues.push(`to`in n?{path:`actions.${t}.to`,message:sE(`actions.${t}.to`,n.to,`set: "${r}", to`),line:G(e.source,[`actions`,t,`to`])}:{path:`actions.${t}.set`,message:`actions.${t}.set: "${a}" here writes only endcaps shapes, not styles — endcaps were renamed from "style" to "endcaps"; write set: "${r}"`,line:G(e.source,[`actions`,t,`set`])});return}for(let n of new Set(l.map(e=>e.field))){let r=l.filter(e=>e.field===n).map(e=>JSON.stringify(e.value)),i=r.length<=IE?r.join(`, `):`${r.slice(0,IE).join(`, `)} and ${r.length-IE} more`,o=`actions.${t}.${n}`;e.issues.push({path:o,message:`${o}: ${i} ${r.length===1?`is`:`are`} outside the ${a} domain — a click would write it and nothing would change; ${s}`,line:G(e.source,[`actions`,t,n])})}}}const IE=3,LE=Symbol(`any integer`);function RE(e,t){return`to`in e?[{field:`to`,value:e.to}]:`cycle`in e?e.cycle.map(e=>({field:`cycle`,value:e})):`from`in e?Zx(e.from,t).members.map(e=>({field:`from`,value:e})):`min`in e?[{field:`min`,value:String(e.min)},{field:`max`,value:String(e.max)}]:LE}function zE(e,t){let{graph:n,nodeInfo:r}=BE(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` → `)}`,line:G(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function BE(e){let t=new Set(Object.keys(e.variables)),n=new Map;for(let t of Object.keys(e.variables))n.set(t,{declarationPath:`variables.${t}`,linePathParts:[`variables`,t]});for(let[r,i]of Object.entries(e.segments))if(i.vars)for(let e of Object.keys(i.vars)){let i=`${r}.${e}`;t.add(i),n.set(i,{declarationPath:`segments.${r}.vars.${e}`,linePathParts:[`segments`,r,`vars`,e]})}let r=new Map;for(let e of t)r.set(e,new Set);let i=(n,i)=>{for(let a of ey(i,e.helpers).keys()){if(t.has(a)){r.get(n).add(a);continue}let e=a.split(`.`)[0];e!==a&&t.has(e)&&r.get(n).add(e)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),bc(n)&&(n.cache&&`key`in n.cache&&i(e,n.cache.key),n.cache&&`depends_on`in n.cache))for(let i of n.cache.depends_on)t.has(i)&&r.get(e).add(i)};for(let[t,n]of Object.entries(e.variables))a(t,n);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))a(`${t}.${e}`,r);return{graph:r,nodeInfo:n}}const VE=[`json5`,`json`];function HE(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function UE(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?h.homedir()+e.slice(1):e}function WE(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?VE.map(t=>l.join(e,`.cc-candybar.${t}`)):[],...VE.map(e=>l.join(r,`.cc-candybar.${e}`)),...VE.map(e=>`${GE()}.${e}`)])]}function GE(){let e=process.env.XDG_CONFIG_HOME??l.join(h.homedir(),`.config`);return l.join(e,`cc-candybar`,`config`)}function KE(e,t,n){let i=[],a=new Map;for(let o of WE(e,t,n)){let e=HE(o);if(e===`absent`)continue;if(e!==`present`){i.push(e);continue}let t=l.join(r.realpathSync(l.dirname(o)),l.basename(o).replace(/\.(json5|json)$/,``));a.has(t)||a.set(t,o)}let o=[...a.values()].reverse();if(n===void 0)return{kind:`chain`,layers:o,home:qE(o),unchecked:i};let[s]=i,c=n;return o.length>0?{kind:`chain`,layers:o,home:c,unchecked:i}:s===void 0?{kind:`missing`,path:n,home:c}:{kind:`unreadable`,...s,home:c}}function qE(e){let t=GE();return e.find(e=>VE.some(n=>e===`${t}.${n}`))??`${t}.${VE[0]}`}function JE(e,t,n){let r=KE(e,t,n),i=r.kind===`chain`?r.layers:[];return{path:r.home,above:i.filter(e=>e!==r.home)}}function YE(e){return XE(e).join(`
|
|
164
|
+
`)||null}function XE(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 ZE(e,t){let n=WE(e,t).filter(e=>HE(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 QE(e){return`plugin ${e.path} was not loaded: ${e.reason}`}const $E=new Set([`plugin`,`data`,`segments`,`helpers`,`actions`]),eD=/^[a-z][a-z0-9_]*$/,tD=`plugins.`;function nD(e){return`${tD}${e}.data`}function rD(e){try{return{ok:!0,value:e()}}catch(e){return{ok:!1,reason:iD(e)}}}function iD(e){return e instanceof nc?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 aD(e,t,n,i){let a=l.dirname(t);return e.reduce((e,t)=>{let n=l.resolve(a,UE(t)),o=rD(()=>{let e=r.readFileSync(n,`utf-8`);return{source:e,json:at.default.parse(e)}}),s=o.ok?oD(o.value.json):void 0,c=o.ok?rD(()=>{let t=xl(dD(n,o.value,e.config),e.config);return i(t),t}):o;return c.ok?{...e,config:c.value,loaded:[...e.loaded,n]}:{...e,dropped:[...e.dropped,{path:n,plugin:s,reason:c.reason}]}},{config:n,loaded:[],dropped:[]})}function oD(e){return Lc(e)&&typeof e.plugin==`string`&&eD.test(e.plugin)?e.plugin:void 0}function sD(e){let t=e=>e.startsWith(`plugins.`)?e.slice(8).split(`.`)[0]:void 0,n=new Set(Object.keys(e.config.segments).map(t));return r=>{let i=t(r);if(i===void 0)return[];let a=e.dropped.filter(e=>e.plugin===i);return a.length>0||n.has(i)?a:e.dropped.filter(e=>e.plugin===void 0)}}function cD(e,t,n){let r=uv(e.presets).flatMap(t=>[...pc(pv(e,t).node)]).flatMap(e=>e.kind===`segment`?[e]:[]),i=new Set([...r.map(e=>e.name),...Object.keys(e.segments)]),a=Object.fromEntries([...i].filter(e=>!(e in t.segments)).flatMap(e=>{let t=n(e);return t.length===0?[]:[[e,lD(e,t,r.filter(t=>t.name===e))]]}));return{...e,segments:{...e.segments,...a}}}function lD(e,t,n){let r=`⚠ ${e}: plugin not loaded (${t.map(e=>e.path).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,uD(e,t)]));return{template:`{{ ${JSON.stringify(r)} }}`,bg:`error`,description:`stands in for a segment whose plugin did not load`,settings:a}}function uD(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 dD(e,{source:t,json:n},r){let i=[],a=()=>{throw new nc(e,i)};if(!Lc(n))return i.push({path:``,message:`a plugin definition must be an object, got ${Rc(n)}`}),a();for(let e of Object.keys(n))$E.has(e)||i.push({path:e,message:`a plugin definition may not declare "${e}". Expected only: ${[...$E].join(`, `)}`});let{plugin:o,data:s}=n;(typeof o!=`string`||!eD.test(o))&&i.push({path:`plugin`,message:`"plugin" must be a name matching ${eD} (it prefixes every name the plugin declares)`}),(typeof s!=`string`||s===``)&&i.push({path:`data`,message:`"data" must be the path of the plugin's JSON data file, relative to this definition`}),Lc(n.segments)||i.push({path:`segments`,message:`"segments" must be an object naming the plugin's segments`}),i.length>0&&a();let c=o,u=l.resolve(l.dirname(e),UE(s)),d={source:t,issues:i,allowedPalettes:new Set(No()),groups:[]},f=Eu(d,`data`,{[nD(c)]:{kind:`file`,path:u,parse:{json:!0},cache:{watch_file:u},default:{}}});for(let[e,t]of Object.entries(n.segments))Lc(t)&&`vars`in t&&i.push({path:`segments.${e}.vars`,message:`a plugin segment may not declare "vars": a plugin's only source is its data file`});let p={variables:f,segments:pD(c,Ed(d,n.segments,new Set)),helpers:pD(c,fE(d,n.helpers)),actions:pD(c,yT(d,n.actions))};for(let[e,t]of[[`variables`,Object.keys(p.variables??{})],[`segments`,Object.keys(p.segments??{})],[`helpers`,Object.keys(p.helpers??{})],[`actions`,Object.keys(p.actions??{})]])for(let n of t)n in r[e]&&i.push({path:e,message:`"${n}" is already declared by the config this plugin loads into`});for(let[e,t]of fD(p))try{Dv.parse(t)}catch(t){i.push({path:e,message:`Template parse error in ${e}: ${t.message}`})}return i.length>0&&a(),p}function*fD(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 pD(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[`${tD}${e}.${t}`,n]))}function mD(e,t,n){return e===null?{...vD,config:xl(vD.raw,t)}:hD(e,r.readFileSync(e,`utf-8`),t,n)}function hD(e,t,n,r){let i=xD(e,t,r,(t,i)=>{let a=aD(t,e,n,t=>yD(_D(t),e,r)),o=sD(a);return{inherited:new Set([...Td(a.config),...i.filter(e=>o(e).length>0)]),layer:{plugins:a,owning:o}}}),{plugins:a,owning:o}=i.layer;return{source:t,raw:i.raw,warnings:[...i.warnings,...a.dropped.map(QE)],plugins:{loaded:a.loaded,dropped:a.dropped},config:cD(xl(i.raw,a.config),a.config,o)}}function gD(e,t,n,i=e=>r.readFileSync(e,`utf-8`),a){let o=[];for(let r of e){n.entered(r);let e=hD(r,i(r),o.at(-1)?.config??t,a);n.warned(e.warnings),o.push({...e,path:r})}let s=o.at(-1);if(s===void 0)return{layers:o,config:yD(mD(null,t),`<default>`,a)};try{return{layers:o,config:yD(s,s.path,a)}}catch(e){for(let e of o.slice(0,-1))n.entered(e.path),yD(e,e.path,a);throw n.entered(s.path),e}}function _D(e){return{config:e,raw:{root:e.root,presets:e.presets},source:``}}const vD={raw:{},source:``,warnings:[],plugins:{loaded:[],dropped:[]}};function yD({config:e,raw:t,source:n},r=`<config>`,i=new Set(No())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(vE(o,e,t),zE(o,e),a.length>0)throw new nc(r,a);let s=Ev(e,a);if(a.length>0)throw new nc(r,a);return hT(Fw(s))}function bD(e,t,n=new Set(No()),r=SD){return xD(e,t,n,()=>({inherited:r,layer:null})).raw}function xD(e,t,n,r){let i=CD(e,t),a=ac(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(No()),groups:[]};if(!Lc(i))throw new nc(e,[{path:``,message:`Config root must be an object, got ${Rc(i)}`}],o);let{inherited:l,layer:u}=r(i.plugins===void 0?[]:ED({...c,issues:[]},i.plugins)??[],Lc(i.segments)?Object.keys(i.segments):[]),d=wD(c,i,l);if(s.length>0)throw new nc(e,s,o);return{raw:d,warnings:o,layer:u}}const SD=new Set;function CD(e,t){try{return at.default.parse(t)}catch(t){let n=t;throw new nc(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function wD(e,t,n){for(let n of Object.keys(t))TD.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...TD].join(`, `)}`,line:G(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=ou(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Eu(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Ed(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.
|
|
165
165
|
Replace: layout: [["seg1", "seg2"], ["seg3"]]
|
|
166
166
|
With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
|
|
167
|
-
Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=Yd(e,`root`,t.root)),t.actions!==void 0&&(r.actions=yT(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=lE(e,t.styles)),t.presets!==void 0&&(r.presets=dE(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=lu(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=fE(e,t.helpers)),t.plugins!==void 0&&(r.plugins=
|
|
168
|
-
`)}function
|
|
169
|
-
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const
|
|
170
|
-
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function
|
|
171
|
-
`)}function
|
|
172
|
-
`)}]}function
|
|
173
|
-
`),process.exit(1));let t;try{t=
|
|
174
|
-
`),process.exit(1)}function
|
|
167
|
+
Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=Yd(e,`root`,t.root)),t.actions!==void 0&&(r.actions=yT(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=lE(e,t.styles)),t.presets!==void 0&&(r.presets=dE(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=lu(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=fE(e,t.helpers)),t.plugins!==void 0&&(r.plugins=ED(e,t.plugins)),rf(e,r),wv(e,r),Bv(e,r),ld(e,r,ad,`the global settings menu`),r}const TD=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`,`plugins`]);function ED(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 ${Rc(t)}`,line:G(e.source,[`plugins`])})}function DD(e){let t=ND(e.termCols),n=ND(e.termRows),r=PD(e.ssh),i=jD(e.tmux),a=AD(e.configEnv),o=kD(e.claudeConfigDir),s=OD(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 OD(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=>kD(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function kD(e){return typeof e==`string`&&l.isAbsolute(e)?e:void 0}function AD(e){return typeof e==`string`&&e!==``?UE(e):void 0}function jD(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 MD=1e4;function ND(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>MD?MD:t}function PD(e){return typeof e==`boolean`?e:void 0}function FD(e){return typeof e==`string`&&e!==``&&e.length<=64?e:null}var ID=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function LD(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function RD(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 ID(`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 ID(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function zD(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=RD(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(LD(t))})}async function BD(e,t,n){let r=null;try{r=await GD(ze(),t.connectMs);let i=await zD(r,{v:3,...e},t.budgetMs);return UD(e.kind,i,n)}catch(e){return WD(e)}finally{r&&r.destroy()}}function VD(e,t){return typeof e==`string`?e:t}function HD(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function UD(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=VD(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:HD(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 WD(e){if(e instanceof ID||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 GD(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 KD(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 qD=`1.118.2`,JD={connectMs:50,budgetMs:150},YD={connectMs:50,budgetMs:200};function XD(e){let t=e.output;return typeof t==`string`?t:void 0}function ZD(e,t,n,r){return BD({kind:`render`,hookData:e,args:t,cwd:n,...r},JD,XD)}function QD(e,t){return BD({kind:`click`,verb:e,value:t,clientVersion:qD},YD,XD)}function $D(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
|
+
`)}function eO(e,t){return e===`darwin`?[tO(`footprint`,[`-p`,String(t)]),tO(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[nO(`/proc/self/smaps_rollup`),nO(`/proc/self/status`)]:[]}function tO(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}`}${rO(n.stderr)}`}}}}function nO(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 rO(e){let t=e.split(`
|
|
169
|
+
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const iO=`CC_CANDYBAR_RSS_LIMIT_MB`;function aO(e){let t=e[iO];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${iO} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function oO(e){return aO(e)*2}const sO=1024*1024;function cO(e){return aO(e)*sO}const lO={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function uO(e,t,n){let{prefix:r,suffix:i}=lO[t];return l.join(e,`${r}${n}${i}`)}function dO(e){for(let t of Object.keys(lO)){let{prefix:n,suffix:r}=lO[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function fO(e){let t=e.rssLimitBytes??512*sO,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 pO(e.log,`memory report`,()=>{let t=uO(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),pO(e.log,`heap snapshot`,()=>{let t=uO(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),pO(e.log,`artifact rotation`,()=>{hO(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 pO(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function mO(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=dO(t);if(n===null)return t;let{prefix:r,suffix:i}=lO[n];return t.slice(r.length,t.length-i.length)}function hO(e,t,n){let r=new Map;for(let t of e){let e=mO(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 gO(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:()=>$D(eO(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=>dO(e)!==null).map(e=>l.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function _O(e={}){if(NO()!==null)return;let n=e.spawn??PO,r=AO();if(r.kind===`contended`){let e=yO();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),vO(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),vO(n);return}try{vO(n)}finally{MO()}}function vO(e){EO()&&bO(e)}function yO(){try{let e=r.statSync(Je());return Date.now()-e.mtimeMs}catch{return null}}function bO(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
|
|
170
|
+
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function xO(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function SO(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function CO(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 wO(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 TO(){try{r.unlinkSync(Xe())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function EO(){let e=Ye(),n=Xe(),r=CO(n),i=xO(DO(e),SO(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`),OO(e),wO(n,Math.min(r+1,5)),!0)}function DO(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function OO(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 kO=null;function AO(){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 kO={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(!jO(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 jO(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function MO(){if(!kO)return;let{fd:e,path:t}=kO;kO=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function NO(){try{return r.mkdirSync(Re(),{recursive:!0}),null}catch(e){return`mkdir ${Re()}: ${e.message}`}}function PO(){let e=t.execPath,n=t.argv[1];return n?Me({bin:e,args:[`--max-old-space-size=${oO(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const FO=`cc-candybar`,IO=`dispatch`,LO=`set-state`,RO=`step-state`,zO=`copy`,BO=`open-vscode`,VO=`toolbar-toggle`,HO=`show-config-error`,UO=`show-config-warning`,WO=`set-config`,GO=`step-config`,KO=`save`,qO=`save-preset`,JO=`delete-preset`,YO=`reset-config`,XO=`apply-layout-op`,ZO=`undo`,QO=`redo`,$O=`back`,ek=`rewind`,tk=`apply-update`,nk=`doctor-run`,rk=`doctor-fix`,ik=`doctor-probe`,ak=`ceiling`,ok=`slash`;function sk(e){return e.map(encodeURIComponent).join(`/`)}function ck(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function lk(e){return`${FO}://${IO}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${sk(e.args)}`)}`).join(`&`)}`}function uk(e){return new T(e).getAll(`e`).map(mk)}const dk=new Set([LO,YO]);function fk(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&pk(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function pk(e,t){if(e.verb!==t.verb||!dk.has(e.verb))return;let[n,r]=[mk(e.value),mk(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function mk(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const hk=/^[A-Za-z0-9_./,:@%+-][A-Za-z0-9_./,:@%+=-]*$/;function gk(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function _k(e){return hk.test(e)?e:gk(e)}const vk=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function yk(e){let t=vk.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 bk(e){return e.join(`.`)}function xk([e,t,n],[r,i,a]){return e-r||t-i||n-a}const Sk=`@promptctl/cc-candybar`;async function Ck(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`?yk(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function wk(e,t){let n=yk(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=xk(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 Tk(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${bk(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${bk(t.installed)} is newer than the registry's latest release (${bk(t.latest)}): an unpublished build.\n`};case`stale`:{let n=bk(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${bk(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 Ek=`CCCandybarURLHandler`,Dk=[],Ok={"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 kk(e,t){return[e,...t].map(_k).join(` `)}function Ak(){return l.join(h.homedir(),`Applications`,`${Ek}.app`)}function jk(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function Mk(){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 Nk(){return l.join(Mk(),`bin`,`cc-candybar`)}function Pk(){return l.join(Mk(),`dist`,`index.mjs`)}function Fk(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(`
|
|
171
|
+
`)}function Ik(e){let t=/do shell script "'([^']+)' '([^']+)' url-handle "/.exec(e);if(t===null)return null;let n=e=>e.replace(/\\"/g,`"`);return{node:n(t[1]),script:n(t[2])}}function Lk(e){return l.join(e,`Contents`,`Resources`,`Scripts`,`main.scpt`)}function Rk(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:l.resolve(l.dirname(e),`..`,`dist`,`index.mjs`)}function zk(t){let n=Ok[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:l.resolve(l.dirname(t),`..`,`bin`,`cc-candybar`)}}function Bk(e,t){l.resolve(e)!==l.resolve(t)&&r.copyFileSync(e,t)}function Vk(e){let t=r.openSync(e,`r`);try{let n=Buffer.alloc(2),i=r.readSync(t,n,0,2,0);if(i<2)throw Error(`install: staged render entry at ${e} is truncated (${i} byte(s)). Re-run: pnpm dlx ${Sk}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function Hk(){let e=Rk(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=zk(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(l.dirname(Pk()),{recursive:!0}),r.mkdirSync(l.dirname(Nk()),{recursive:!0}),Bk(e,Pk()),Bk(t.sourcePath,Nk()),r.chmodSync(Nk(),493),r.rmSync(l.join(Mk(),`url-handler.mjs`),{force:!0});let n=Vk(Nk());return process.stdout.write(`Staged cc-candybar v${qD} runtime at ${Mk()}\n`+(n===`native`?` render entry: native binary (${process.platform}-${process.arch})\n`:` render entry: node shim (no native binary for ${process.platform}-${process.arch}; renders are correct but pay node startup)\n`)),{binPath:Nk(),distPath:Pk(),entryKind:n}}function Uk(){return[{key:`CFBundleIdentifier`,xml:`<string>com.cccandybar.url-handler</string>`},{key:`CFBundleURLTypes`,xml:[`<array>`,` <dict>`,` <key>CFBundleURLName</key>`,` <string>Claude Powerline Click Action</string>`,` <key>CFBundleURLSchemes</key>`,` <array>`,` <string>${FO}</string>`,` </array>`,` </dict>`,`</array>`].join(`
|
|
172
|
+
`)}]}function Wk(e){let t=Ak();r.mkdirSync(l.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=O({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,Fk(process.execPath,e)],category:`install.osacompile`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`osacompile failed (${n.reason})`);let i=l.join(t,`Contents`,`Info.plist`);for(let{key:e}of Uk())O({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of Uk()){let n=O({bin:`/usr/bin/plutil`,args:[`-insert`,e,`-xml`,t,i],category:`install.plutil`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`plutil -insert ${e} failed (${n.reason})`)}process.stdout.write(`Registering ${FO}:// with Launch Services\n`);let a=O({bin:`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister`,args:[`-f`,t],category:`install.lsregister`});if(!a.ok)throw process.stderr.write(a.stderr),Error(`lsregister failed (${a.reason})`);process.stdout.write(`✓ ${Ek}.app installed and registered.\n`),process.stdout.write(` Test: open '${FO}://hello-world' && pbpaste\n`)}function Gk(){jk(),Wk(Hk().distPath)}function Kk(e,t=FO){let n=`${t}://`;if(!e.startsWith(n))throw Error(`expected ${n} scheme, got: ${e}`);let r=e.slice(n.length),i=r.indexOf(`/`);return i===-1?{verb:zO,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function qk(e){e||(process.stderr.write(`url-handle: missing URL argument.
|
|
173
|
+
`),process.exit(1));let t;try{t=Kk(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await QD(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(_O(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(Jk(n)+`
|
|
174
|
+
`),process.exit(1)}function Jk(e){switch(e.cause){case`version_mismatch`:return`url-handle: daemon rejected click (version mismatch: client v${e.clientV} ≠ daemon v${e.daemonV})`;case`bad_request`:return`url-handle: daemon rejected click (bad request: ${e.message})`;case`render_failed`:return`url-handle: daemon rejected click (handler failed: ${e.message})`;case`malformed_response`:return`url-handle: daemon rejected click (malformed response: ${e.message})`}}function Yk(){return`✓ install complete.
|
|
175
175
|
Restart Claude Code to pick up the new statusline.
|
|
176
|
-
Tip: every bar carries a settings menu — click it (${El} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/endcaps/wrap/padding controls.\n`}async function
|
|
177
|
-
`),
|
|
178
|
-
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function
|
|
179
|
-
`)}function
|
|
180
|
-
`);return e?`${l}\n${e}`:l}function
|
|
181
|
-
`))}function XA(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new V({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: ${xA(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(xA(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`,RA([m],r)}const ZA=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function QA(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function $A(e,t){return r.readdirSync(t).filter(ZA).sort().flatMap(n=>{let i=l.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?$A(e,i):[[l.relative(e,i).split(l.sep).join(`/`),QA(i,a)]]})}function ej(e){let t=oe.createHash(`sha256`);for(let[n,r]of $A(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const tj=e=>e.slice(0,7);function nj(e){return l.dirname(l.dirname(e))}function rj(){return{version:KD,digest:`4965effe6a74f3452e720914774014fb370941ff77ac2b9cf404f225c188b5b2`}}function ij(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 aj(e,t){try{let n=nj(E(e)),i=l.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=ej(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:ij(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 oj(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function sj(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 cj(e,t,n){let r=dc(e,new Set(n.map(uc).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const lj=/^-?\d+$/;function uj(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 dj(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!lj.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 fj(e,t,n){return r=>r?lj.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 pj(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=>!lj.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 mj(e){return e===`config`?`set-config`:`set-state`}function hj(e,t,n){return t.kind===`int`?dj(`menu page "${e}"`):t.kind===`range`?fj(t.min,t.max,`${n} stepper "${e}"`):uj(t.allowed,`${n} "${e}"`,mj(n))}function gj(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:pj(e,n,t)}))}function _j(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 gj(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,hj(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 vj(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};_j(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=_j(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const yj=vj({},`config`,Ej);function bj(e,t){return yj.register(e,t)}function xj(e){return yj.gateFor(e)}function Sj(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:Zx(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:[oj({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[oj({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Zx(e.insertSegmentFrom,t).members.map(t=>oj({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function Cj(e,t){let n=mu(e).get(t);return n===void 0?null:String(n)}function wj(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?dS(n.persist):null;e?.scope===`preset-root`&&t.add(lS(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function Tj(e){let t=Zw(e);return[...wj(e),...Object.values(e.actions).flatMap(e=>Sj(e,t))]}function Ej(e){return gj(Tj(e),`config`)}const Dj=$S(`commands.`),Oj=fC(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),kj=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,Aj=`{{ \$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 (${kj}) (basename .project_dir) (ne (${kj}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,jj=`{{ ${wS} }}`,Mj={min:0,max:100,step:5},Nj={warnAt:{label:`warning at %`,domain:Mj,default:50},errorAt:{label:`error at %`,domain:{...Mj,atLeast:`warnAt`},default:80}};function Pj(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:Mj,default:80}}}const Fj={globals:{palette:`tokyo-night`},variables:{...Dj.variables,...Cx,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:Aj},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:jj,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:HS(``).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:Dj.template,when:Dj.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:Pj(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:Pj(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:Nj,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:Nj,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) ${lo} }}`,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:Oj.template,bg:Oj.bg,when:Oj.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:{...HS(``).actions,...Dj.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`},...Oj.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}},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) ${lo}) .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:pC(`.`),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 .)) }}`}},Ij=new Set([Fj.globals.palette,...Object.values(Fj.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Lj=xl(yD(`<default>`,JSON.stringify(Fj),Ij),Fj),Rj=uv(Lj.presets);function zj(e){return Rj.includes(e)}function Bj(e){if(!e)return 0;try{return s(e).mtimeMs}catch{return 0}}const Vj=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 Hj(e){return((...t)=>Vj.run(()=>e(...t)))}const Uj=Hj(w),Wj=Hj(C),Gj=Hj(ee);async function Kj(e,t){return Vj.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 qj(e,t){return Vj.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 Jj=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function Yj(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 Xj(e){let t=await Zj(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function Zj(e){for(let t of[65536,1048576]){let n=await qj(e,t);if(n.kind!==`ok`)return n;let r=Qj(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function Qj(e,t){let n=e.toString(`utf8`).split(`
|
|
182
|
-
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!
|
|
176
|
+
Tip: every bar carries a settings menu — click it (${El} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/endcaps/wrap/padding controls.\n`}async function Xk(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...Dk],i=Hk();process.platform===`darwin`?Wk(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
|
|
177
|
+
`),Zk(i.binPath,r,t),process.stdout.write(Yk());let a=Tk(Sk,wk(qD,await Ck(Sk,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function Zk(e,t,n,i){let a=i??nC(tC(eC(process.env,process.cwd())));r.mkdirSync(l.dirname(a),{recursive:!0});let o={};if(r.existsSync(a))try{o=JSON.parse(r.readFileSync(a,`utf-8`))}catch(e){throw Error(`Could not parse ${a}: ${e instanceof Error?e.message:String(e)}`)}let s=o.statusLine?.command,c=[e,_k(e),gk(e)],u=typeof s==`string`&&(s.startsWith(`pnpm dlx @promptctl/cc-candybar@`)||c.some(e=>s===e||s.startsWith(`${e} `)));if(s&&!u&&!n){process.stderr.write(`Skipping settings.json update: existing statusLine.command appears customized.\n Current: ${s}\n To overwrite, re-run with --force.\n`);return}o.statusLine={type:`command`,command:kk(e,t)},Pe(a,JSON.stringify(o,null,2)),process.stdout.write(`Updated ${a}\n`)}function Qk(e,t){return e.kind===`owned`?t(e.pid,e.startTime)?{kind:`attach-and-exit`,reason:`live owner pid=${e.pid} holds the socket`}:{kind:`reclaim`,reason:`owner pid=${e.pid} is gone or recycled`}:e.kind===`absent`?{kind:`reclaim`,reason:`no lease — stale socket, no live owner`}:{kind:`reclaim`,reason:`unreadable lease (${e.detail}) — cannot prove a live owner`}}function $k(e){let t;try{t=r.readFileSync(e,`utf8`)}catch(e){return e.code===`ENOENT`?{kind:`absent`}:{kind:`unreadable`,detail:`read failed: ${e.message}`}}let n;try{n=JSON.parse(t)}catch(e){return{kind:`unreadable`,detail:`bad JSON: ${e.message}`}}let i=n,a=i?.pid;if(typeof a!=`number`||!Number.isInteger(a)||a<=0)return{kind:`unreadable`,detail:`no valid pid (got ${JSON.stringify(a)})`};let o=i?.startTime;return o!=null&&typeof o!=`string`?{kind:`unreadable`,detail:`invalid startTime (got ${JSON.stringify(o)})`}:{kind:`owned`,pid:a,startTime:o??null}}function eA(e,n){let i=`${e}.${t.pid}.tmp`;try{return r.writeFileSync(i,JSON.stringify(n),{mode:384}),r.renameSync(i,e),null}catch(e){let t=e.message;try{r.unlinkSync(i)}catch(e){if(e.code!==`ENOENT`)return`${t}; also failed to remove temp ${i}: ${e.message}`}return t}}function tA(e,t){let n=$k(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function nA(e){try{let t=r.statSync(e);return{kind:`present`,identity:{dev:t.dev,ino:t.ino}}}catch(e){return e.code===`ENOENT`?{kind:`absent`}:{kind:`unreadable`,detail:e.message}}}function rA(e,t,n,r){let i=iA(e,t);return i===null?r.kind===`owned`?r.pid===n?{kind:`owned`}:{kind:`displaced`,reason:`lease reassigned (names pid=${r.pid}, we are pid=${n}) — a reclaimer overwrote it`}:{kind:`displaced`,reason:`lease not held (${r.kind}) — no longer the socket owner`}:{kind:`displaced`,reason:i}}function iA(e,t){return t.kind===`present`?t.identity.dev===e.dev&&t.identity.ino===e.ino?null:`socket replaced (bound dev=${e.dev} ino=${e.ino}, now dev=${t.identity.dev} ino=${t.identity.ino})`:t.kind===`absent`?`socket path gone (ENOENT) — unlinked by a reclaimer`:`socket path unreadable (${t.detail}) — cannot prove ownership`}function aA(e){let t=!1;function n(){let n=rA(e.bound,e.readIdentity(),e.myPid,e.readLease());return n.kind===`displaced`&&!t&&(t=!0,e.log(`warn`,`ownership self-check: ${n.reason}; shutting down`),e.shutdown(0)),n}function r(t=e.intervalMs??5e3){let r=setInterval(()=>{n().kind===`displaced`&&clearInterval(r)},t);return r.unref(),{disarm:()=>clearInterval(r)}}return{check:n,arm:r}}function oA(e,t=O){let n=t({bin:`ps`,args:[`-o`,`lstart=`,`-p`,String(e)],category:`process-fingerprint`,timeoutMs:2e3,env:{...process.env,LC_ALL:`C`,TZ:`UTC`}});if(n.ok){let e=n.stdout.trim();return e.length>0?{kind:`start`,token:e}:{kind:`unavailable`,detail:`ps produced no start-time`}}return{kind:`unavailable`,detail:n.reason===`spawn-error`?n.error??`ps spawn failed`:`ps ${n.reason} (exit ${n.exitCode})`}}function sA(e,t,n){if(t===null)return n.pidAlive(e);let r=n.readStartTime(e);switch(r.kind){case`start`:return r.token===t;case`unavailable`:return n.pidAlive(e)}}function cA(e,t=oA){let n=t(e);return n.kind===`start`?n.token:null}const lA=`CC_CANDYBAR_PARENT_PID`;function uA(e){let t=e[lA];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${lA} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function dA(e){if(e.anchor.kind===`outlives-nobody`)return{disarm:()=>{}};let{pid:t}=e.anchor,n=setInterval(()=>{e.isAlive(t)||e.onOrphaned(`spawner pid ${t} gone`)},e.intervalMs??250);return n.unref(),{disarm:()=>clearInterval(n)}}function fA(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function pA(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function mA(e,t,n){return e?t>=n?{allow:!1,reason:`${t} live isolated daemons registered >= ceiling ${n}`}:{allow:!0,reason:`${t} live isolated daemons registered < ceiling ${n}`}:{allow:!0,reason:`canonical production socket — exempt (bind() already caps it to one)`}}function hA(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>l.join(e,t))}catch{return[]}}function gA(e){let t;try{t=r.readFileSync(e,`utf8`)}catch{return null}try{let e=JSON.parse(t),n=e?.pid;return typeof n!=`number`||!Number.isInteger(n)||n<=0?null:{pid:n,startTime:typeof e?.startTime==`string`?e.startTime:null}}catch{return null}}function _A(e,t,n){let r=0;for(let i of e)t(i.identity.pid,i.identity.startTime)?r++:n(i.path);return r}function vA(e){if(!e.isolated)return{decision:mA(!1,0,e.ceiling),registryPath:null};e.ensureDirSafe(e.registryDir);let t=[];for(let n of e.listFiles(e.registryDir)){let r=e.readEntry(n);r!==null&&r.pid!==e.pid&&t.push({path:n,identity:r})}let n=mA(!0,_A(t,e.isSameLiveProcess,e.removeFile),e.ceiling);if(!n.allow)return{decision:n,registryPath:null};let r=l.join(e.registryDir,`pid-${e.pid}.json`);return e.writeEntry(r,{pid:e.pid,startTime:e.startTime}),{decision:n,registryPath:r}}function yA(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function bA(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:qe(),ceiling:pA(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>sA(e,t,{readStartTime:oA,pidAlive:fA}),listFiles:hA,readEntry:gA,removeFile:e=>{try{r.unlinkSync(e)}catch{}},writeEntry:(e,t)=>{let n=`${e}.${t.pid}.tmp`;try{r.writeFileSync(n,JSON.stringify(t),{mode:384}),r.renameSync(n,e)}catch(e){try{r.unlinkSync(n)}catch(e){e.code}throw e}},ensureDirSafe:process.env.CC_CANDYBAR_DAEMON_REGISTRY_DIR?Ve:e=>{Ve(l.dirname(e)),Ve(e)},...t}}function xA(e){return e<32||e===127||e>=128&&e<=159}function SA(e){let t=``;for(let n of e)t+=xA(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function CA(e,t){let n=SA(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const wA=`\x1B[38;2;255;255;255m`,TA=`\x1B[48;2;200;40;40m`;function EA(e){let t=/;2;(\d+);(\d+);(\d+)m$/.exec(e);if(t===null)throw Error(`diagnostic-style: not a 24-bit SGR: ${e}`);return`#`+t.slice(1,4).map(e=>Number(e).toString(16).padStart(2,`0`)).join(``)}const DA={fg:EA(wA),bg:EA(TA)},OA={fg:EA(`\x1B[38;2;0;0;0m`),bg:EA(`\x1B[48;2;220;160;40m`)},kA=new yi;function AA(e){return kA.resolve(e)}function jA(e,t){return ka(e,{...t,theme:kA,onStyleError:e=>{throw e}})}const MA={unicode:ya,ascii:{glyph:`>`,divider:`|`,lead:`<`,tail:`>`}},NA={unicode:{},ascii:{left:`(`,right:`)`}};function PA(e,t,n){switch(e){case`capsule`:return new Ta(NA[t]);case`plain`:return new Ea(n===void 0?{}:{separator:n});case`powerline`:return new Sa(MA[t]);default:return e}}const FA=new Map;function IA(e){let t=JSON.stringify([e.endcaps,e.charset,e.separator??null]),n=FA.get(t);if(n!==void 0)return n;let r=PA(e.endcaps,e.charset,e.separator),i=e=>new W(`x`,{end:``,overflow:`ignore`,style:new V({bgcolor:e})}),a=e=>new W(jA(new da(e,r),{colorSystem:null}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return FA.set(t,s),s}function LA(e){return IA(e).chrome}function RA(e){return IA(e).seam}function zA(e,t){if(e.length===0)return``;let n=PA(t.endcaps,t.charset,t.separator),r=t.colorCompatibility,i=t.wrap&&Number.isFinite(t.width)?jA(new Fa([...e],{joiner:n}),{width:t.width,colorSystem:r}):jA(new da([...e],n),{colorSystem:r});if(!i.endsWith(`
|
|
178
|
+
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function BA(e){return Math.min(20,e??20)}const VA={heading:`ERROR`,glyph:`⚠`,colors:DA},HA={heading:`WARNING`,glyph:`⚠`,colors:OA},UA={heading:`UPDATE`,glyph:`⬆`,colors:OA};function WA(e,t){return{text:SA(e),link:t}}function GA(e,t,n){let[r,...i]=[KA(e,VA,HO),t,KA(n,HA,UO)].flat();return r===void 0?null:{channels:[r,...i]}}function KA(e,t,n){let r=lk([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>WA(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function qA(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
|
|
179
|
+
`)}function JA(e,t,n,r){if(t===null)return e;let i=YA(r),a=t.channels.flatMap(e=>XA(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[ZA(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
|
|
180
|
+
`);return e?`${l}\n${e}`:l}function YA(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function XA(e,t){let n=new V({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)=>zA([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(`
|
|
181
|
+
`))}function ZA(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new V({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: ${SA(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(SA(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`,zA([m],r)}const QA=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function $A(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function ej(e,t){return r.readdirSync(t).filter(QA).sort().flatMap(n=>{let i=l.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?ej(e,i):[[l.relative(e,i).split(l.sep).join(`/`),$A(i,a)]]})}function tj(e){let t=oe.createHash(`sha256`);for(let[n,r]of ej(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const nj=e=>e.slice(0,7);function rj(e){return l.dirname(l.dirname(e))}function ij(){return{version:qD,digest:`8eb4e464a11ff820442af8ac21df69eabff7780bf5d9cc333856a00a3b6f072f`}}function aj(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 oj(e,t){try{let n=rj(E(e)),i=l.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=tj(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:aj(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 sj(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function cj(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 lj(e,t,n){let r=dc(e,new Set(n.map(uc).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const uj=/^-?\d+$/;function dj(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 fj(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!uj.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 pj(e,t,n){return r=>r?uj.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 mj(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=>!uj.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 hj(e){return e===`config`?`set-config`:`set-state`}function gj(e,t,n){return t.kind===`int`?fj(`menu page "${e}"`):t.kind===`range`?pj(t.min,t.max,`${n} stepper "${e}"`):dj(t.allowed,`${n} "${e}"`,hj(n))}function _j(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:mj(e,n,t)}))}function vj(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 _j(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,gj(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 yj(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};vj(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=vj(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const bj=yj({},`config`,Dj);function xj(e,t){return bj.register(e,t)}function Sj(e){return bj.gateFor(e)}function Cj(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:Zx(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:[sj({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[sj({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Zx(e.insertSegmentFrom,t).members.map(t=>sj({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function wj(e,t){let n=mu(e).get(t);return n===void 0?null:String(n)}function Tj(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?dS(n.persist):null;e?.scope===`preset-root`&&t.add(lS(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function Ej(e){let t=Zw(e);return[...Tj(e),...Object.values(e.actions).flatMap(e=>Cj(e,t))]}function Dj(e){return _j(Ej(e),`config`)}const Oj=$S(`commands.`),kj=fC(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),Aj=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,jj=`{{ \$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 (${Aj}) (basename .project_dir) (ne (${Aj}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,Mj=`{{ ${wS} }}`,Nj={min:0,max:100,step:5},Pj={warnAt:{label:`warning at %`,domain:Nj,default:50},errorAt:{label:`error at %`,domain:{...Nj,atLeast:`warnAt`},default:80}};function Fj(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:Nj,default:80}}}const Ij={globals:{palette:`tokyo-night`},variables:{...Oj.variables,...Cx,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:jj},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:Mj,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:HS(``).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:Oj.template,when:Oj.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:Fj(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:Fj(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:Pj,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:Pj,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) ${lo} }}`,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:kj.template,bg:kj.bg,when:kj.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:{...HS(``).actions,...Oj.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`},...kj.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}},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) ${lo}) .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:pC(`.`),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 .)) }}`}},Lj=new Set([Ij.globals.palette,...Object.values(Ij.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Rj=xl(bD(`<default>`,JSON.stringify(Ij),Lj),Ij),zj=uv(Rj.presets);function Bj(e){return zj.includes(e)}function Vj(e){if(!e)return 0;try{return s(e).mtimeMs}catch{return 0}}const Hj=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 Uj(e){return((...t)=>Hj.run(()=>e(...t)))}const Wj=Uj(w),Gj=Uj(C),Kj=Uj(ee);async function qj(e,t){return Hj.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 Jj(e,t){return Hj.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 Yj=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function Xj(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 Zj(e){let t=await Qj(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function Qj(e){for(let t of[65536,1048576]){let n=await Jj(e,t);if(n.kind!==`ok`)return n;let r=$j(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function $j(e,t){let n=e.toString(`utf8`).split(`
|
|
182
|
+
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!Yj.test(t))continue;let r=Xj(t);if(r!=null)return r}return null}function eM(e,t){return{...e,claudeConfigDir:tC(t.claudeConfigDir),env:t.mementoEnv}}const tM=l.join(`lib`,`ceiling_config.py`),nM=l.join(`skills`,`ceiling`,`bin`,`ceiling`);function rM(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 iM(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 aM(e,t){if(!r.existsSync(e))return Y;let n;try{n=rM(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=iM([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=[tM,nM].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 oM(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 sM(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function cM(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 lM(e,t){let n=await je({bin:`python3`,args:[`-c`,`
|
|
183
183
|
import json, math, sys
|
|
184
184
|
sys.path.insert(0, sys.argv[1])
|
|
185
185
|
from ceiling_config import CONFIG_NAME, anchored, ceiling_in, in_force, session_directory
|
|
@@ -188,41 +188,41 @@ ceiling = in_force(directory, anchored(sys.argv[3]))
|
|
|
188
188
|
layer = ceiling_in(directory / CONFIG_NAME)
|
|
189
189
|
print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
|
|
190
190
|
"session": layer.text if layer else None}))
|
|
191
|
-
`,l.join(e,`lib`),t.sessionId,t.cwd],env:
|
|
192
|
-
`).at(-1).trim();function
|
|
193
|
-
`),c=ck([{verb:HO,args:[s]}]),l=t.kind===`running`?UA(`[${i.busy}]`,c):UA(`[${i.act}]`,ck([{verb:ek,args:[n.sessionId]}]));return[{severity:HA,message:s,lines:[[UA(a,c),l,UA(`[dismiss]`,ck([{verb:IO,args:[n.sessionId,bN,r]}])),UA(`[disable]`,ck([{verb:UO,args:[n.sessionId,xN,`false`]},{verb:IO,args:[n.sessionId,SN,`false`]}]))],...o.map(e=>[UA(e,c)])]}]}function kN(e,t){return e.kind===`stale`?{kind:`source`,root:e.root,newer:e.source,running:e.running}:e.kind===`not-source-checkout`&&t!==null&&t.kind===`stale`?{kind:`release`,newer:t.latest,running:t.installed}:null}function AN(e){switch(e.kind){case`current`:return[`info`,`build: current ${wN(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${wN(e.source)}, running ${wN(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function jN(e){switch(e.kind){case`current`:return[`info`,`release: current ${yk(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${yk(e.latest)}, running ${yk(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${yk(e.installed)}, latest ${yk(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function MN(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const NN=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function PN(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=NN(e.stderr)??e.error??NN(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function FN(){let e=[bj(xN,[`false`]),pN(SN,[`false`]),pN(bN,[])];return()=>e.forEach(e=>e())}function IN(e){let{entryUrl:t,intervalMs:n,releaseIntervalMs:r,registryUrl:i,fetchImpl:a,onApplied:o,log:s}=e,c={kind:`unchecked`,reason:`not sampled yet`},l=null,u=EN,d=null,f=MN(s),p=MN(s),m=()=>kN(c,l);function h(){let e=m(),t=e===null?null:CN(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:pN(bN,[t])})}function g(){c=aj(t,rj),f(AN(c)),h()}async function _(){l=Ck(KD,await Sk(xk,a,i)),p(jN(l)),h()}return{arm(){FN(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>ON(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=TN(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=DN,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),je({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=EN,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=PN(n);u={kind:`failed`,identity:CN(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var LN=class{static CACHE_DIR=Le();static USAGE_CACHE_DIR=l.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=l.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=l.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return D(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(D(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(D(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return D(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=l.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),D(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await ue(50);else throw e}return D(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=l.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),D(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&D(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){D(`Failed to create cache directories:`,e)}}static createProjectHash(e){return se(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=l.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){D(`Cache for ${e} is locked, waiting...`),await ue(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(D(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(D(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return D(`No shared ${e} usage cache found`),null;D(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await ue(75)}}return D(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){D(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=l.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),D(`[CACHE-SET] ${e} disk cache stored`)}catch(t){D(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const RN={"claude-haiku-4-5-20251001":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-opus-4-20250514":{name:`Claude Opus 4`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1-20250805":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-sonnet-4-20250514":{name:`Claude Sonnet 4`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-4-opus-20250514":{name:`Claude 4 Opus`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-4-sonnet-20250514":{name:`Claude 4 Sonnet`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-opus-4-5":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-5-20251101":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6-20260205":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-sonnet-4-6":{name:`Claude Sonnet 4.6`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3}};var zN=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL=`https://raw.githubusercontent.com/promptctl/cc-candybar/main/pricing.json`;static async loadDiskCache(){let e=Date.now()-1440*60*1e3;return await LN.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await LN.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ie(this.GITHUB_PRICING_URL),n=le({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){D(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){D(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(D(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),D(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(D(`Invalid pricing data structure`),e(null))}catch(t){D(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{D(`Response error:`,t),e(null)})});n.on(`error`,t=>{D(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{D(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return D(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return D(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),D(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(D(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(RN).length} models`),this.executionCache=RN,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(RN).length} models`),RN)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return D(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),D(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const BN=String.raw`(?:^|[\s;&|(])`,VN=e=>RegExp(`(?:^|:)(?:${e})$`),HN=[{phase:`impl`,tool:`Edit`,match:/^/},{phase:`impl`,tool:`MultiEdit`,match:/^/},{phase:`impl`,tool:`Write`,match:/^/},{phase:`impl`,tool:`NotebookEdit`,match:/^/},{phase:`review`,tool:`Bash`,match:RegExp(`${BN}gh\\s+pr\\s+create\\b`)},{phase:`review`,tool:`Skill`,match:VN(`code-review|simplify`)},{phase:`groom`,tool:`Bash`,match:RegExp(`${BN}lit\\s+(done|close)\\b`)},{phase:`groom`,tool:`Skill`,match:VN(`groom-backlog`)},{phase:`handoff`,tool:`Skill`,match:VN(`message-in-a-bottle`)}],UN=e=>RegExp(`${BN}lit\\s+(?:${e})(?:\\s+(?:--?[\\w-]+(?:=\\S*)?|''))*\\s+([A-Za-z0-9][\\w.-]*)`),WN=[{verb:UN(`start`),to:`in_progress`},{verb:UN(`done|close`),to:`closed`}];function GN(e){return HN.find(t=>t.tool===e.tool&&t.match.test(e.subject))?.phase}function KN(e,t){if(t.tool===`Bash`)for(let{verb:n,to:r}of WN){let i=n.exec(t.subject)?.[1];if(i!==void 0)return{call:e,id:i,to:r}}}const qN=/^lit:state (.*)$/gm;function JN(e){return[...e.matchAll(qN)].map(([e,t])=>YN(t)??{kind:`unreadable`,line:e.trim()})}function YN(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!=`object`||!t)return;let{id:n,status:r,epic:i}=t;if(typeof n!=`string`||typeof r!=`string`)return;if(i===null)return{kind:`state`,id:n,status:r,epic:null};if(typeof i!=`object`||i===void 0)return;let a=i;if(!(typeof a.id!=`string`||typeof a.done!=`number`||typeof a.total!=`number`))return{kind:`state`,id:n,status:r,epic:{id:a.id,done:a.done,total:a.total}}}function XN(e,t){let n=t??{};return{tool:e,subject:e===`Bash`&&typeof n.command==`string`?$N(n.command):e===`Skill`&&typeof n.skill==`string`?n.skill:e}}const ZN=/(<<-?\s*(['"]?)(\w+)\2[^\n]*\n)[\s\S]*?\n\s*\3(?=\n|$)/g,QN=/'[^']*'|"(?:[^"\\]|\\.)*"/g;function $N(e){return e.replace(ZN,`$1`).replace(QN,`''`)}function eP(e){return typeof e==`string`?[e]:Array.isArray(e)?e.flatMap(e=>typeof e==`object`&&e&&typeof e.text==`string`?[e.text]:[]):[]}const tP=/^(\S+) \[(open|in_progress|closed)\//gm,nP=/^Ticket (\S+) has been closed\./gm,rP={sentinels:[],said:[]};function iP(e){let t;for(let n of eP(e)){let e=n.includes(`lit:state `),r=n.includes(` [`),i=n.includes(`has been closed.`);if(!(!e&&!r&&!i)){if(t??={sentinels:[],said:[]},e&&t.sentinels.push(...JN(n)),r)for(let[,e,r]of n.matchAll(tP))t.said.push({id:e,status:r});if(i)for(let[,e]of n.matchAll(nP))t.said.push({id:e,status:`closed`})}}if(t===void 0)return rP;for(let e of t.sentinels)e.kind===`state`&&t.said.push({id:e.id,status:e.status});return t}const aP=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function oP(e){if(typeof e==`string`)return aP.exec(e)?.[1]}function sP(e){let t=e?.todos;if(!Array.isArray(t))return;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let{content:t,activeForm:r,status:i}=e,a=i===`in_progress`,o=a&&typeof r==`string`?r:t;typeof o==`string`&&n.push({text:o,active:a,done:i===`completed`})}return n}function cP(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o,s=[],c=[],l,u=[];if(typeof t==`string`)o=t;else if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;switch(t.type){case`tool_use`:{let{id:e,name:n}=t;if(typeof e!=`string`||typeof n!=`string`)break;r.push({id:e,name:n});let i=XN(n,t.input),o=KN(e,i);o!==void 0&&s.push(o),l=GN(i)??l,n===`TodoWrite`&&(a=sP(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id,n=iP(t.content);if(u.push(...n.sentinels),typeof e==`string`){i.push(e);for(let t of n.said)c.push({call:e,...t})}break}case`text`:o??=t.text;break;default:break}}let d=n?oP(o):void 0,f=s.length===0&&l===void 0&&u.length===0&&c.length===0?void 0:{...s.length>0&&{claims:s},...l!==void 0&&{phase:l},...u.length>0&&{sentinels:u},...c.length>0&&{said:c}};if(!(r.length===0&&i.length===0&&a===void 0&&d===void 0&&f===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...d!==void 0&&{command:d},...f!==void 0&&{lit:f}}}function lP(e){if(e!==void 0)return[e];let t=g();return[p(t,`.config`,`claude`),p(t,`.claude`)].filter(e=>a(e))}async function uP(e){let t=[];for(let n of e){let e=p(n,`projects`);if(a(e))try{let n=await Uj(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=p(e,r.name);t.push(n)}}catch(t){D(`Failed to read projects directory ${e}:`,t)}}return t}async function dP(e,t,n){let r=[],i=p(t,e,`subagents`);try{let t=(await Uj(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=p(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await Wj(t,`utf-8`)).split(`
|
|
194
|
-
`)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{D(`Failed to check agent file ${t}`)}}}catch(e){D(`Failed to read subagents directory ${i}:`,e)}return r}function
|
|
195
|
-
`))if(n.trim())try{let e=hP(JSON.parse(n));e&&t.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`);continue}return t}async function _P(e){return gP(await Wj(e,`utf-8`))}async function vP(e,t){let n=await Kj(e,t===void 0?void 0:{offset:t.offset,ino:t.ino});if(n.kind!==`ok`)return n;let{buf:r,start:i,mtimeMs:a,ino:o,reset:s}=n.value,c=r.lastIndexOf(10);return J(c<0?{entries:[],cursor:{offset:i,mtimeMs:a,ino:o},reset:s}:{entries:gP(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function yP(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=de({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=hP(JSON.parse(t));e&&r.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{D(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{D(`File stream error for ${e}:`,t),n(t)})})}var bP=class{inflight=new Map;run(e,t){return this.inflight.get(e)??this.start(e,t)}start(e,t){let n=t();this.inflight.set(e,n);let r=()=>{this.inflight.get(e)===n&&this.inflight.delete(e)};return n.then(r,r),n}get size(){return this.inflight.size}};function xP(e,t){let n=e?e.input+e.cacheCreation+e.cacheRead:0,r=e?e.output:0;return{input:n,output:r,total:n+r,atMs:t}}const SP=new Map,CP={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},wP={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function TP(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function EP(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function DP(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function OP(e,t,n,r){let i=TP(new Date(EP())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:DP(),l=new Map;if(a)for(let[e,t]of a.days)e>=i&&l.set(e,{...t});for(let e of n){let t=e.message?.usage;if(!t)continue;o++;let n=e.costUSD??await zN.calculateCostForEntry(e.raw);s+=n,c.input+=t.input_tokens||0,c.output+=t.output_tokens||0,c.cacheCreation+=t.cache_creation_input_tokens||0,c.cacheRead+=t.cache_read_input_tokens||0;let r=TP(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...CP};a.cost+=n,a.input+=t.input_tokens||0,a.output+=t.output_tokens||0,a.cacheCreation+=t.cache_creation_input_tokens||0,a.cacheRead+=t.cache_read_input_tokens||0,l.set(r,a)}return{cursor:r,entries:o,cost:s,breakdown:c,days:l}}function kP(e){let t=0,n=0,r=DP(),i=new Map;for(let a of e.values()){t+=a.entries,n+=a.cost,r.input+=a.breakdown.input,r.output+=a.breakdown.output,r.cacheCreation+=a.breakdown.cacheCreation,r.cacheRead+=a.breakdown.cacheRead;for(let[e,t]of a.days){let n=i.get(e)??{...CP};n.cost+=t.cost,n.input+=t.input,n.output+=t.output,n.cacheCreation+=t.cacheCreation,n.cacheRead+=t.cacheRead,i.set(e,n)}}if(t===0)return{sessionInfo:wP,days:i};let a=r.input+r.output+r.cacheCreation+r.cacheRead;return{sessionInfo:{cost:n,calculatedCost:n,officialCost:null,tokens:a,tokenBreakdown:r},days:i}}async function AP(e,t,n){let r=0,i=async()=>{for(;r<e.length;){let t=e[r++];await n(t)}},a=Math.min(t,e.length);await Promise.all(Array.from({length:a},i))}var jP=class{entries=new Map;flight=new bP;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new bP;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??Bb,this.maxEntries=e.maxEntries??256,this.staleAgeMs=e.staleAgeMs??864e5;let t=e.sweepIntervalMs??3e5;t>0&&(this.sweepTimer=setInterval(()=>this.sweepStale(),t),this.sweepTimer.unref())}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,sweeps:this.sweeps,seeds:this.seeds}}async getUsageInfo(e,t){let n=await this.ingest(e,t?.transcript_path);if(n.kind===`failed`)return n;let r=n.kind===`ok`?n.value.sessionInfo:wP,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t){let n=TP(new Date),r=lP(t);try{await this.ensureSeeded(n,r)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let i=await this.ingest(e?.session_id??``,e?.transcript_path);if(i.kind===`failed`)return i;let a=r.map(e=>p(e,`projects`)+m),o={...CP},s=!1;for(let[t,r]of this.entries){let i=r.transcriptPath??``,c=t===e?.session_id||a.some(e=>i.startsWith(e))?r.days:SP;s||=c.has(n);let l=c.get(n)??CP;o.cost+=l.cost,o.input+=l.input,o.output+=l.output,o.cacheCreation+=l.cacheCreation,o.cacheRead+=l.cacheRead}return s?J({cost:o.cost,tokens:o.input+o.output+o.cacheCreation+o.cacheRead,tokenBreakdown:{input:o.input,output:o.output,cacheCreation:o.cacheCreation,cacheRead:o.cacheRead},date:n}):Y}async observeSpeed(e,t,n){let r=Bj(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=xP(i.kind===`ok`?i.value.sessionInfo.tokenBreakdown:null,n),o=this.speedRings.get(e)??[],s;for(let e of o)e.atMs<a.atMs&&(s===void 0||e.atMs>s.atMs)&&(s=e);return o.push(a),o.sort((e,t)=>e.atMs-t.atMs),o.length>64&&o.shift(),this.speedRings.set(e,o),J({...s!==void 0&&{prev:s},cur:a,samples:[...o]})})}async ingest(e,t,n){if(!e)return Y;let r=n??Bj(t),i=this.entries.get(e);if(i&&r!==0&&i.transcriptMtime===r)return i.lastSeenAt=Date.now(),this.entries.delete(e),this.entries.set(e,i),this.hits++,J(i);if(!t)return i?J(i):Y;this.misses++;let a;try{a=await this.flight.run(`${e}:${r}`,()=>this.refold(e,t,this.entries.get(e)))}catch(t){return X(`usage refold (${e}): ${t instanceof Error?t.message:String(t)}`)}if(a.kind!==`ok`)return a;let o={files:a.value.files,sessionInfo:a.value.sessionInfo,days:a.value.days,transcriptMtime:a.value.mainMtime,transcriptPath:t,lastSeenAt:Date.now()};return this.entries.delete(e),this.entries.set(e,o),this.evictIfNeeded(),J(o)}async refold(e,t,n){let r=await dP(e,d(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await vP(e,r?.cursor);if(o.kind===`failed`)return o;if(o.kind===`absent`){r&&i.set(e,r);continue}let{entries:s,cursor:c,reset:l}=o.value;i.set(e,await OP(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...kP(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=EP(),n=await uP(e),r=[];for(let e of n){let n;try{n=await Uj(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=p(e,i),a;try{a=(await Gj(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await AP(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},MP=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return D(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);D(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{D(`Calculating context tokens from transcript: ${e}`);let n=await mP(e);if(n.length===0)return D(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,D(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return D(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return D(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},NP=class{states=new Map;constructor(e,t,n=256){this.empty=e,this.step=t,this.maxSessions=n}async read(e,t){let n=this.states.get(e),r=Bj(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await vP(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:n?.value??this.empty};let{entries:a,cursor:o,reset:s}=i.value,c=s||n===void 0?this.empty:n.value;for(let e of a)c=this.step(c,e);for(this.touch(e,{cursor:o,value:c});this.states.size>this.maxSessions;){let e=this.states.keys().next().value;if(e===void 0)break;this.states.delete(e)}return{kind:`ok`,value:c}}touch(e,t){this.states.delete(e),this.states.set(e,t)}};const PP={messageCount:0,recent:[]};function FP(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!fP(t),recent:n.length>20?n.slice(-20):n}}function IP(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(fP(r))t=r.timestamp;else if(e===`assistant`&&t){let e=(r.timestamp.getTime()-t.getTime())/1e3;e>.1&&e<300&&(n=e)}}return n}var LP=class{fold=new NP(PP,FP);async getMetricsInfo(e,t){if(D(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:IP(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};function RP(e,t,n){return n.some(e=>e.call===t.call&&e.id===t.id&&e.status===t.to)?t.to===`closed`?e?.id===t.id?null:e:{id:t.id,phase:`prep`,epic:e?.id===t.id?e.epic:null,unread:null}:e}function zP(e,t,n){let r=[...e.claims,...t?.claims??[]],i=e=>n.includes(e.call),a=r.filter(i).reduce((e,n)=>RP(e,n,t?.said??[]),e.ticket),o=r.filter(e=>!i(e));if(a===null||t===void 0)return{claims:o,ticket:a};let s=t.sentinels??[],c=s.findLast(e=>e.kind===`state`&&e.id===a.id),l=s.findLast(e=>e.kind===`unreadable`);return{claims:o,ticket:{id:a.id,phase:t.phase??a.phase,epic:c?.kind===`state`?c.epic:a.epic,unread:l?.kind===`unreadable`?l.line:a.unread}}}const BP={ticket:null,claims:[],command:null,todos:[],pending:[],done:[]};function VP(e,t){let n=e.findIndex(e=>e.name===t);return n<0?[...e,{name:t,count:1}]:e.map((e,t)=>t===n?{name:e.name,count:e.count+1}:e)}function HP(e,t){if(t.isSidechain)return e;let n=fP(t)?{...e,command:t.activity?.command??null,pending:[],done:[]}:e,r=t.activity;if(r===void 0)return n;let i=n.pending,a=n.done;r.started!==void 0&&(i=[...i,...r.started]);for(let e of r.finished??[]){let t=i.findIndex(t=>t.id===e);t<0||(a=VP(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos,...zP(n,r.lit,r.finished??[])}}function UP(e){return{ticket:e.ticket,command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>VP(e,t.name),[]),done:e.done}}var WP=class{fold=new NP(BP,HP);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(UP(n.value))}};function GP(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function KP(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function qP(e,t,n,r){return KP(O(GP(e,t,n,r)),n)}async function JP(e,t,n){return KP(await je(GP(e,t,n)),n)}const YP=e=>`${e.socket}\n${e.pane}`;var XP=class{names=new Map;asking=new bP;constructor(e=Date.now){this.now=e}getSessionName(e){let t=YP(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){D(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await JP(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const ZP=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:$e.map(t=>e.env?.[t]??null)]);var QP=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=ZP(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=ZP(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function $P(e){return{gitProvider:new Yb({watchers:e.watchers,logger:e.logger}),usageStore:new jP({logger:e.logger}),contextProvider:new MP,metricsProvider:new LP,activityProvider:new WP,tmuxService:new XP,mementoProvider:new QP(uM()),autoCompact:uC,log:e.logger}}function eF(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function tF(e,t){let n=W.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function nF(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function rF({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function iF(e){let t=rF(e);if(t.length===1)return e.text;let n=tF(t);return n.style=e.text.style,n}function aF(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,lead:s=[],trail:c=[]}=t;if(e.length===0)return[];let l=tF(e,a).pad(o),u=new W(` `.repeat(o)),d={...s.length>0&&{lead:tF([u,...s],a)},...c.length>0&&{trail:tF([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(nF(l,n,f),[{text:l,...d}])}const oF=RegExp(`\\x1b\\[[0-9;]*m|${Xi.source}`,`g`);function sF(e){return Gt(e.replace(oF,``))}function cF(e,t){let n=e.map(iF),r=[];if(e.forEach(({fill:e},t)=>{e!==void 0&&r.push({at:t,how:e})}),r.length===0||!Number.isFinite(t.width))return n;let i=RA(n,t).split(`
|
|
196
|
-
`);if(i.length>1)return n;let a=Math.max(0,t.width-sF(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:i},a)=>{let c=o+(a===r.length-1?s:0),{text:l}=e[t];nF(l,l.cellLength+c,i),n[t]=iF(e[t])}),n}function lF(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=uF(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e){let e={frag:a,style:kA(a.style)};if(e.style.link){i();let r=uF([e],t);r.plain.length>0&&n.push(r)}else r.push(e)}return i(),n}function uF(e,t){let n=t!==void 0&&!t.isNull?t:void 0,r=e.map(e=>dF(e.frag,n?n.add(e.style):e.style)),i=W.fromFragments(r);return i.end=``,i.overflow=`ignore`,r.length===1?i.style=r[0].style:n!==void 0&&(i.style=n),i}function dF(e,t){let n=e.copy();return n.style=t,n}function fF(e,t,n,r){let i=new Map,a=Object.entries(t);for(let[t,o]of[...a.filter(([,e])=>!(`do`in e)),...a.filter(([,e])=>`do`in e)])i.set(t,pF(e,t,o,n,r,i));return i}function pF(e,t,n,r,i,a){if(`set`in n){let e=r.get(n.set)??n.set;if(`to`in n)return{kind:`set-literal`,key:n.set,value:n.to,stateVar:e};if(`from`in n){let t=Zx(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=kx.get(n.persist)??n.persist;if(`to`in n)return{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e};if(`from`in n){let t=Zx(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=Zx(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:gF(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:gF(e,n.open,t)};if(`reset`in n)return{kind:`reset`,key:n.reset};if(`doctor`in n)return n.doctor===`run`?{kind:`doctor-run`}:{kind:`doctor-fix`,check:n.check};if(`ceiling`in n)return{kind:`ceiling`,args:_T(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:gF(e,n.name,t)};let[o,...s]=n.do.map(e=>{let n=a.get(e);if(n===void 0)throw Error(`action "${t}" fires "${e}", which is not declared in this config`);return n});return{kind:`do`,head:o,rest:s}}function mF(e){return e.kind===`do`?mF(e.head):e}function hF(e){switch(mF(e).kind){case`set-option`:case`set-int`:case`persist-option`:case`layout-op-option`:return!0;case`set-literal`:case`set-bounded`:case`set-cycle`:case`copy`:case`open`:case`persist-literal`:case`persist-bounded`:case`persist-cycle`:case`reset`:case`layout-op`:case`undo`:case`redo`:case`back`:case`rewind`:case`save`:case`preset-save`:case`preset-delete`:case`doctor-run`:case`doctor-fix`:case`ceiling`:case`slash`:case`do`:return!1}}function gF(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function _F(e,t){return e.has(t)?gy(e.read(t)):``}function vF(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function yF(e,t,n,r){let i=new W(e,{style:V.combine([r,new V({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function bF(e,t){return Math.max(e.members.indexOf(_F(t,e.stateVar)),0)}function xF(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=_F(r,e.stateVar);return{effects:[{verb:IO,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=_F(r,e.stateVar);return{effects:[{verb:IO,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=_F(r,e.stateVar);return{effects:[{verb:IO,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(bF(e,r)+1)%e.members.length];return{effects:[{verb:IO,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:LO,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:RO,args:[vF(e.text,lb(r))]}],active:!1};case`open`:return{effects:[{verb:zO,args:[vF(e.target,lb(r))]}],active:!1};case`persist-literal`:{let t=_F(r,e.stateVar);return{effects:[{verb:UO,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=_F(r,e.stateVar);return{effects:[{verb:UO,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(bF(e,r)+1)%e.members.length];return{effects:[{verb:UO,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:WO,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:JO,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:XO,args:[i]}],active:!1};case`redo`:return{effects:[{verb:ZO,args:[i]}],active:!1};case`back`:return{effects:[{verb:QO,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:$O,args:[i]}],active:!1};case`save`:return{effects:[{verb:GO,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:KO,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:qO,args:[i,vF(e.name,lb(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:tk,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:nk,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:ik,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:ak,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:YO,args:[i,e.key,oj(e.op)]}],active:!1};case`do`:{let a=xF(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>xF(e,t,void 0,r,i).effects)],active:a.active}}case`layout-op-option`:{let r={op:`insert`,segment:n??t,anchor:e.anchor,relation:e.relation};return{effects:[{verb:YO,args:[i,e.key,oj(r)]}],active:!1}}}}function SF(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:Ol(`action "${e}"`,n,t.members.length,bF(t,r)),boundValue:void 0};if(n.length>2)throw Error(`action "${e}" takes a display and an optional bound value, got ${n.length} arguments (per-state displays are a cycle action's form)`);return{display:n[0],boundValue:n[1]}}function CF(e,t,n){let r=n.compiled.get(e);if(!r)throw Error(`action "${e}" is not declared in this config`);let i=n.store,{display:a,boundValue:o}=SF(e,mF(r),t,i),{effects:s,active:c}=xF(r,a,o,i,_F(i,`session.id`));return yF(a,ck(s),c)}function wF(e){return{action:{fn:(t,...n)=>CF(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function TF(e,t){return yF(`✕`,ck([{verb:IO,args:[_F(e,`session.id`),t,Tl]}]),!1)}function EF(e,t,n){return new V({bgcolor:I.fromRgba(t),color:I.fromRgba(uo(e,t,n))})}function DF(e,t,n){return new V({color:I.fromRgba(Or(eo(e,`warning`),t,lo,n))})}function OF(e,t,n){return V.combine([EF(e,t,n),DF(e,t,n)])}function kF(e,t,n){return EF(e.palette,wo(e.palette,e.disclosure,[t],n),n)}function AF(e,t,n,r,i,a){return r===void 0?n=>kF(e,{...n,distribution:t},i):(e,t)=>jF(r(t,n),a,i)}function jF(e,t,n){return new V({bgcolor:I.fromRgba(t),color:I.fromRgba(Or(eo(e,`primary`),t,4.5,n))})}function MF(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>NF(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function NF(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function PF(e,t){return new W(e).truncate(t,{marker:`…`}).plain}function FF(e){return{current:null,drawnAt:e}}function IF(e,t,n,r,i,a){let o={segName:t,placementId:n,palette:r,disclosure:i,tint:a,bg:void 0,drops:[]};return e.current=o,o}function LF(e,t){let n=e.current;if(n===null)throw Error(`${t} is only available inside a segment's templates — there is no active segment here. Segment-scoped functions cannot be used in variable declarations or layout-node "when" predicates, which are evaluated outside any segment.`);return n}function RF(e){return new W(e).cellLength}function zF(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function BF(e){return Math.max(1,zF(e)-(RF(`✕`)+2*e.padding+e.seamCols))}function VF(e,t,n){if(!Number.isFinite(t))return e.length>0?[e.map((e,t)=>t)]:[];let r=Math.max(1,t-n),i=[],a=[],o=0;for(let t=0;t<e.length;t++){let n=e[t];a.length===0?(a=[t],o=n):o+1+n<=r?(a.push(t),o+=1+n):(i.push(a),a=[t],o=n)}return a.length>0&&i.push(a),i}function HF(e,t,n){let r=RF(`←`)+1+RF(`→`)+1,i=VF(e,t,n);return(i.length>1?VF(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function UF(e,t){let n=[];for(let t of e)n.length>0&&n.push(new W(` `)),n.push(t);let r=W.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function WF(e,t,n,r){let i=e.compiled.get(t);if(!i||i.kind!==n)throw Error(`picker references action "${t}" which must be ${r}, got ${i?`a ${i.kind} action`:`no such action`}`);return i}function GF(e,t,n){let r=e.compiled.get(t),i=r&&mF(r);if(!i||i.kind!==`set-option`&&i.kind!==`persist-option`&&i.kind!==`layout-op-option`)throw Error(`${n} references action "${t}" which must be a set-option, persist-option, or layout-op-option action ({ set, from }, { persist, from }, or { persist, insertSegmentFrom, anchor, relation }), got ${i?`a ${i.kind} action`:`no such action`}`);return i}function KF(e,t,n,r,i,a,o){let s=GF(i,e,`picker`),c=i.compiled.get(e),l=i.store,u=_F(l,`session.id`),d=`stateVar`in s?_F(l,s.stateVar):void 0,f=r?n.kind===`led`?BF(i):zF(i):1/0,p=n.kind===`led`?0:RF(`✕`)+1,m=s.library&&{groups:s.library.groups,entries:s.options.map(s.library.entry)},h=m===void 0?HF(s.options.map(RF),f,p):MF(m.entries,m.groups,r),g=parseInt(_F(l,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>ck([{verb:IO,args:[u,t.key,String(e)]}]),b=n.kind===`led`?[]:[{verb:IO,args:[u,...n.writes.flatMap(([e,t])=>[e,t])]}],x=n.kind===`own`&&n.onPick?b:[],S=e=>ck([...xF(c,e,e,l,u).effects,...x]),C=(e,t)=>{let n=s.options[e];return yF(t,S(n),n===d,a({index:e,count:s.options.length},n))},w=n.kind===`led`?[]:[yF(`✕`,ck(b),!1,o)];_>0&&w.push(yF(`←`,y(_-1),!1));let ee=_<h.length-1?[yF(`→`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[UF([...w,...e.map(e=>C(e,s.options[e])),...ee],r)]}let te=new V({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new W(`${v[0].label}${ne}`,{style:te})]:[],ie=[UF([...w,...re,...ee],r)];for(let e of v){v.length>1&&ie.push(UF([new W(e.label,{style:te})],r));let t=Math.max(...e.indices.map(e=>RF(s.options[e])));for(let n of e.indices){let e=s.options[n],i=m.entries[n].description,a=i===void 0?void 0:xA(i),o=` `.repeat(t-RF(e)+2),c=a===void 0?e:`${e}${o}${a}`;ie.push(UF([C(n,PF(c,f))],r))}}return ie}function qF(e,t){return{picker:{fn:(n,r,i,a,o,...s)=>{rb(`picker "${n}"`,[`closeOnPick`,`paged`,`inBody`],s);let c=WF(e,r,`set-int`,`an int action ({ set, int: true })`);if(o===!0&&i===!0)throw Error(`{{ picker "${n}" … }} sets both closeOnPick and inBody; a picker in a body is closed by the body's ✕, so it has no close to fold into a pick`);let l=GF(e,n,`picker`);if(l.library!==void 0)throw Error(`{{ picker "${n}" … }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let u=LF(t,`{{ picker }}`);if(u.bg===void 0)throw Error(`{{ picker }} is not available while segments.${u.segName}'s own "bg:" is being evaluated — a picker is drawn on that background`);let[d]=KF(n,{key:c.key,stateVar:c.stateVar},o===!0?{kind:`led`}:{kind:`own`,writes:[[c.key,`-1`]],onPick:i===!0},a===!0,e,AF(u,qa(void 0),e,l.paletteOf,t.drawnAt(),u.bg),DF(u.palette,u.bg,t.drawnAt()));return d},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function JF(e,t,n,r,i){let a=Math.min(Math.floor((t-1)/2),i),o=n,s=0;for(;s<a;){let t=o+RF(e(-(s+1)))+1+RF(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function YF(e,t,n,r,i,a){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let o=n.store;if(!o.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let s=n.compiled.get(e),c=_F(o,`session.id`),{options:l}=t,u=l.length;if(u===0)return UF([],!0);let d=_F(o,t.stateVar),f=Math.max(l.indexOf(d),0),p=e=>((f+e)%u+u)%u,m=e=>l[p(e)],h=new Map,g=e=>{let t=h.get(e);if(t!==void 0)return t;let n=ck(xF(s,m(e),m(e),o,c).effects);return h.set(e,n),n},_=e=>yF(m(e),g(e),m(e)===d,r({index:p(e),count:u},m(e))),v=a===void 0?_(0):yF(m(0),ck(xF(n.compiled.get(a),m(0),void 0,o,c).effects),!1),y=JF(m,u,RF(`◀`)+1+v.cellLength+1+RF(`▶`),BF(n),i),b=e=>Array.from({length:y},(t,n)=>_(e*(n+1)));return UF([...b(-1).reverse(),yF(`◀`,g(-1),!1),v,yF(`▶`,g(1),!1),...b(1)],!0)}function XF(e,t){return{carousel:{fn:(n,...r)=>{let[i,a,...o]=r;if(rb(`carousel "${n}"`,[`neighbours`,`centre`],o),i!==void 0&&!(Number.isInteger(i)&&i>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(i)}`);if(a!==void 0&&!(typeof a==`string`&&e.compiled.has(a)))throw Error(`carousel "${n}": centre must name a declared action, got ${JSON.stringify(a)}`);if(a!==void 0&&hF(e.compiled.get(a)))throw Error(`carousel "${n}": centre "${a}" writes a value the template binds, and the centre binds none — name an action that writes a fixed value, a cycle, or a do of them`);let s=i??1/0,c=GF(e,n,`carousel`),l=LF(t,`{{ carousel }}`);if(l.bg===void 0)throw Error(`{{ carousel }} is not available while segments.${l.segName}'s own "bg:" is being evaluated — a carousel is drawn on that background`);return YF(n,c,e,AF(l,qa(void 0),e,c.paletteOf,t.drawnAt(),l.bg),s,a)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}const ZF=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function QF(e,t,n){let r=_o(e,{hue:Ba,depth:0},n);return[Va(t.hues).map((t,n)=>({text:ZF[n%ZF.length],colour:to(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:eo(e,`warning`)},{text:`error`,colour:eo(e,`error`)}]]}function $F(e,t,n,r){let i=QF(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new W(` ${t} `,{style:EF(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new W(e)),a.push(t)}let s=W.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function eI(e,t){return{themePreview:{fn:()=>$F(e.palette,e.variation,t.drawnAt(),BF(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const tI=e=>e.slice(e.lastIndexOf(`.`)+1),nI=(e,t)=>{let n=new W(tI(e));return n.truncate(t,{marker:`…`}),n.plain};function rI(e,t){let n=e.map(e=>e.map(({name:e})=>RF(tI(e)))),r=e=>n.every(n=>n.reduce((t,n)=>t+Math.min(n,e)+2,0)<=t),i=Math.max(1,...n.flat());for(;i>1&&!r(i);)--i;return i}function iI(e,t,n,r){let i=rI(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new W(` ${nI(s,i)} `,{style:EF(l,Oo(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=W.fromFragments(a.flatMap((e,t)=>t===0?e:[new W(`
|
|
197
|
-
`),...e]));return o.overflow=`ignore`,o.end=``,o}function
|
|
191
|
+
`,l.join(e,`lib`),t.sessionId,t.cwd],env:oM(t),timeoutMs:3e3,category:`memento.read`});return n.ok?cM(n.stdout):X(sM(n))}function uM(e,t,n){let r=O({bin:l.join(e,nM),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:oM(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(sM(r))}function dM(){return{locate:e=>aM(rC(e.claudeConfigDir),e.projectDir),read:lM,move:uM}}function fM(e,t,n){let r=n===void 0?``:`CLAUDE_CONFIG_DIR=${_k(n)} `,i=e.added_dirs.map(e=>` --add-dir ${_k(e)}`).join(``);return`cd ${_k(e.project_dir)} && ${r}claude --resume ${_k(t)}${i}`}function pM(e,t,n){let r=dv(t(`preset`),e.globals.preset,e.presets),i=mv(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:Ux(a.palette,t(`theme`),i.palette),style:Go(a.style,t(`style`),i.style,e.styles),endcaps:Jo(a.endcaps,t(`endcaps`),i.endcaps),variation:ts(a.variation,t(`variation`),i.variation),separator:a.default_separator??i.default_separator,autoWrap:ls(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:ds(a.padding,t(`padding`),i.padding),charset:a.charset??i.charset??`unicode`,updateNotice:us(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:a.colorCompatibility??i.colorCompatibility??`truecolor`}}function mM(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function hM(e){return{theme:e.theme,style:e.style,preset:e.preset,variation:e.variation}}function gM(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:Bj(e.preset)},endcaps:{effective:e.endcaps},variation:{effective:e.variation},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding},updateNotice:{effective:e.updateNotice}}}const _M=10*1e3;function vM(e,t,n,r){let i=n-(t*1e3-r);if(i<3e5||e<=0)return;let a=e/i,o=(100-e)/a;return Math.max(0,Math.round(o/6e4))}function yM(e,t){if(!(t<60))return e*3600/t}function bM(e,t,n,r){let i=r-t;if(i<50||i>_M)return;let a=n-e;if(!(a<=0))return a*1e3/i}function xM(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=bM(t.input,t.atMs,n.input,n.atMs),i=bM(t.output,t.atMs,n.output,n.atMs),a=bM(t.total,t.atMs,n.total,n.atMs);if(!(r===void 0&&i===void 0&&a===void 0))return{...r!==void 0&&{input:r},...i!==void 0&&{output:i},...a!==void 0&&{total:a}}}function SM(e){let{samples:t}=e,n=[];for(let e=1;e<t.length;e++){let r=t[e-1],i=t[e],a=i.atMs-r.atMs;if(a<50||a>_M)continue;let o=bM(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function CM(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function wM(e){let t=[],n=(e,n)=>{try{let e=n();return e===``?void 0:e}catch(n){t.push(`host.${e}: ${String(n)}`);return}},r=n(`name`,()=>CM(h.hostname())),i=n(`user`,()=>h.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function TM(e,t){let n=new Map;for(let[t,r]of Object.entries(e.variables))n.set(t,r);for(let[t,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))n.set(`${t}.${e}`,i);let r=[],i=new Set,a=t=>ey(t,e.helpers).keys(),o=mv(e,t);for(let e of Ro){let t=o[e];if(zo(t))for(let e of a(t))r.push(e)}for(let n of pc(pv(e,t).node)){if(n.when)for(let e of a(n.when))r.push(e);if(n.kind!==`segment`)continue;let t=e.segments[n.name];if(t){for(let e of[t.template,t.when,t.bg,t.fg])if(e)for(let t of a(e))r.push(t)}}let s=new Set;for(;r.length>0;){let e=r.pop();for(let t of DM(n,e)){if(i.has(t))continue;i.add(t);let e=n.get(t);if(e){if(e.kind===`input`)s.add(e.path);else if(e.kind===`template`)for(let t of a(e.template))r.push(t)}}}return s}function EM(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=TM(e,n);return t.set(n,i),i}}function DM(e,t){let n=t;for(;n.length>0;){if(e.has(n))return[n];let t=n.lastIndexOf(`.`);if(t<0)break;n=n.slice(0,t)}let r=`${t}.`,i=[];for(let t of e.keys())t.startsWith(r)&&i.push(t);return i}function OM(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function kM(e){let t=t=>e.has(t),n=t(`git.staged`)||t(`git.unstaged`)||t(`git.untracked`)||t(`git.conflicts`);return{...t(`git.sha`)&&{showSha:!0},...n&&{showWorkingTree:!0},...t(`git.stash`)&&{showStashCount:!0},...t(`git.upstream`)&&{showUpstream:!0},...t(`git.repoName`)&&{showRepoName:!0},...t(`git.repoUrl`)&&{showRepoUrl:!0},...t(`git.operation`)&&{showOperation:!0},...t(`git.timeSinceCommit`)&&{showTimeSinceCommit:!0},...(t(`git.prNumber`)||t(`git.prState`)||t(`git.prUrl`)||t(`git.prError`))&&{showPullRequest:!0}}}async function AM(e,t,n,r,i,a,{configPath:o,...s}){let c=e=>OM(r,e),l=(t.clock??(()=>new Date))().getTime(),u=a.tmux??null,d=(e,t,n)=>t?n().catch(t=>X(`${e}: ${String(t)}`)):Promise.resolve(Y),[f,p,m,h,g,_,v,y,b,x,S]=await Promise.all([d(`git`,c(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,kM(r),e.workspace?.project_dir)),d(`session`,c(`session.cost`)||c(`session.tokens`)||c(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),d(`today`,c(`today`),()=>t.usageStore.getTodayInfo(e,a.claudeConfigDir)),d(`context`,c(`context`)||c(`autocompact`),()=>t.contextProvider.getContextInfo(e)),d(`metrics`,c(`metrics`)||c(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),d(`activity`,c(`activity`),()=>t.activityProvider.getActivityInfo(e.session_id,e)),d(`tmux`,c(`tmux.session`),()=>u===null?Promise.resolve(Y):t.tmuxService.getSessionName(u)),d(`cache`,c(`cache`),()=>Zj(e.transcript_path)),d(`speed`,c(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,l)),d(`memento`,c(`memento`),()=>t.mementoProvider.getCeiling(eM({sessionId:e.session_id,projectDir:e.workspace?.project_dir??``,cwd:n??e.workspace?.current_dir??``},a))),d(`autocompact`,c(`autocompact`),()=>Promise.resolve(t.autoCompact(nC(tC(a.claudeConfigDir)))))]),C=[],w=e=>{if(e.kind===`failed`){C.push(e.reason);return}return e.kind===`ok`?e.value:void 0},ee=RM(f);C.push(...ee.failures);let te=wM(a);C.push(...te.failures);let ne=w(p),re=w(m),ie=w(h),T=w(g),E=w(_),ae=w(v),oe=w(y),se=NM(x);x.kind===`failed`&&C.push(`memento: ${x.reason}`);let ce=jM(S,ie?.maxTokens);S.kind===`failed`&&C.push(`autocompact: ${S.reason}`);for(let e of C)t.log(`warn`,`provider fetch failed: ${e}`);let le=e.rate_limits?.five_hour,ue=e.rate_limits?.seven_day,de=le?vM(le.used_percentage,le.resets_at,18e6,l):void 0,fe=ue?vM(ue.used_percentage,ue.resets_at,6048e5,l):void 0,pe=ne?.session.cost,me=T?.sessionDuration,he=c(`burn`)&&pe!=null&&me!=null?yM(pe,me):void 0,ge=w(b),_e=ge===void 0?void 0:xM(ge),ve=ge===void 0?void 0:SM(ge),ye=_e!==void 0||ve!==void 0?{..._e,...ve!==void 0&&{history:ve}}:void 0,be=LM(process.env.HOME??process.env.USERPROFILE),D=e.workspace?{...e.workspace,current_dir:LM(e.workspace.current_dir)??``,project_dir:LM(e.workspace.project_dir)??``,added_dirs:(e.workspace.added_dirs??[]).map(e=>LM(e)??e)}:e.workspace,xe=ne===void 0?void 0:IM({cost:ne.session.cost,tokens:ne.session.tokens}),Se=re===void 0?void 0:{cost:re.cost,tokens:re.tokens},Ce=T===void 0?void 0:IM({lastResponseTime:T.lastResponseTime,responseTime:T.responseTime,sessionDuration:T.sessionDuration,messageCount:T.messageCount,linesAdded:T.linesAdded,linesRemoved:T.linesRemoved}),we=E===void 0?void 0:PM(E);return{...e,...D!==void 0&&{workspace:D},...be!==void 0&&{home:be},...ee.git!==void 0&&{git:ee.git},...u!==null&&{tmux:{pane:u.pane,...ae!==void 0&&{session:ae}}},host:te.host,...gM(i),history:t.history(e.session_id),navigation:{back:t.navigation(e.session_id)},...s,...o!==null&&{configPath:o},resumeCommand:fM(D,e.session_id,a.claudeConfigDir),...xe!==void 0&&{session:xe},...Se!==void 0&&{today:Se},...he!==void 0&&{burn:{costPerHour:he}},...ye!==void 0&&{speed:ye},...c(`block`)&&le!==void 0&&{block:{nativeUtilization:le.used_percentage,resetsAt:le.resets_at,...de!==void 0&&{etaMinutes:de}}},...ue!==void 0&&{weekly:{percentage:ue.used_percentage,resetsAt:ue.resets_at,...fe!==void 0&&{etaMinutes:fe}}},...oe!==void 0&&{cache:{expiresAt:oe}},...ie!==void 0&&{context:{totalTokens:ie.totalTokens,contextLeft:ie.contextLeftPercentage}},...Ce!==void 0&&{metrics:Ce},...we!==void 0&&{activity:we},...se!==void 0&&{memento:se},...ce!==void 0&&{autocompact:ce}}}function jM(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return dC(e.value,t)}}const MM=e=>e.trim().split(`
|
|
192
|
+
`).at(-1).trim();function NM(e){switch(e.kind){case`absent`:return;case`failed`:return{error:MM(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function PM(e){let t=e.todos.findIndex(e=>e.active),n=e.todos.length===0?void 0:{total:e.todos.length,completed:e.todos.filter(e=>e.done).length,...t>=0&&{position:t+1,active:e.todos[t].text}},r=FM(e.running),i=FM(e.done),a=r===void 0&&i===void 0?void 0:{...r!==void 0&&{running:r},...i!==void 0&&{done:i}},o=e.ticket===null?void 0:{id:e.ticket.id,phase:e.ticket.phase,...e.ticket.epic!==null&&{epic:e.ticket.epic},...e.ticket.unread!==null&&{unread:e.ticket.unread}};if(!(o===void 0&&e.command===null&&n===void 0&&a===void 0))return{...o!==void 0&&{ticket:o},...e.command!==null&&{command:e.command},...n!==void 0&&{todo:n},...a!==void 0&&{tool:a}}}function FM(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function IM(e){let t={},n=!1;for(let r of Object.keys(e)){let i=e[r];i!=null&&(t[r]=i,n=!0)}return n?t:void 0}function LM(e){return e===void 0||e.length===0||l.sep!==`\\`?e:e.replace(/\\/g,`/`)}function RM(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const zM={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,autoWrap:e=>e.autoWrap?ns:rs,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?ns:rs},BM=Object.entries(Tx),VM=new Set(Ex.map(e=>e.sessionKey)),HM=()=>!1;function UM(e,t){return pM(e,e=>VM.has(e)?t(e):null,HM)}function WM(e,t,n,r){return e.flatMap(([e,i])=>{let a=zM[e](t);return a===null||a===zM[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function GM(e,t,n){return zM[n](UM(e,t))}function KM(e,t){let n=UM(e,t),r=pM(e,()=>null,HM),i=pM(e,e=>e===Tx.preset.sessionKey?n.preset:null,HM);return WM(BM,n,e=>e===`preset`?r:i,t=>qM(e,n.preset,t.configKey))}function qM(e,t,n){return n in(fv(e.presets,t).globals??{})?uS(t,n):n}function JM(e,t,n){let r=dv(t(Tx.preset.sessionKey),e.globals.preset,e.presets),i=dS(n);return{key:i?.scope===`globals`?qM(e,r,i.field):n,globals:mv(e,r)}}function YM(e,t){let{preset:n}=UM(e,t);return QM(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Oc(a,s);return c===void 0||Dc(c)===Dc(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function XM(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return uv(e.presets).flatMap(n=>{let i=QM(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Tc(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:Oc(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const ZM=new WeakMap;function QM(e,t){let n=ZM.get(e)??new Map;ZM.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...pc(pv(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Cc(e.segments[t.name])[n];return{id:r,setting:n,key:i,decl:a,saved:t.settings?.[n]??a.default}})),a=[...new Map(i.map(e=>[e.key,e])).values()];return n.set(t,a),a}function $M(e,t){let n=UM(e,t),r=pM(e,e=>e===Tx.preset.sessionKey?n.preset:null,HM);return{from:n.preset,globals:fv(e.presets,n.preset).globals??{},picks:WM(BM.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:YM(e,t)}}function eN(e){return{sessionKeys:Ex.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...iu(e)?zj.map(t=>uS(t,e)):[]]}}function tN(e){return new Set(Ex.map(e=>e.configKey).filter(t=>eN(t).fileKeys.some(t=>iN(e,rN(t)))))}function nN(e,t,n){let r=KM(e,n),i=new Set(r.map(e=>e.configKey)),a=jx(e=>i.has(Tx[e].configKey)||t.has(Tx[e].configKey));return{unsaved:r.length+YM(e,n).length,resettable:a}}function rN(e){let t=dS(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return fS(t)}function iN(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&iN(e[n],r)}const aN=No(),oN=new Set(aN),sN=new Set(Ko),cN=e=>e?oN.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${aN.join(`, `)})`}:{ok:!1,reason:`theme name is required`},lN=e=>e?sN.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${Ko.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},uN=new Set([`1`,`true`]),dN=new Set([`0`,`false`]),fN={endcaps:lN,theme:cN,"toolbar-expanded":e=>uN.has(e)?{ok:!0,value:`1`}:dN.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}},pN=yj(fN,`state`,bN);function mN(e,t){return pN.register(e,t)}function hN(e){return pN.gateFor(e)}function gN(e,t){return`set`in e?`to`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:Zx(e.from,t).members}}]:`int`in e?[{key:e.set,spec:{kind:`int`}}]:`cycle`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:e.cycle}}]:[{key:e.set,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function _N(e){return e.filter(e=>e.spec.kind!==`allow-list`||!Object.hasOwn(fN,e.key))}function vN(e,t,n){let r=Mx.get(n);if(r!==void 0)return GM(e,t,r);let i=Object.values(e.variables).find(e=>e.kind===`state`&&e.key===n);return i?.kind===`state`?i.default??null:null}function yN(e){let t=Zw(e);return _N(Object.values(e.actions).flatMap(e=>gN(e,t)))}function bN(e){return _j(yN(e))}const xN=`update.dismissed`,SN=`updateNotice`,CN=Tx.updateNotice.sessionKey;function wN(e){return e.kind===`source`?e.newer.digest:bk(e.newer)}const TN=e=>`${e.version} [${nj(e.digest)}]`;function EN(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:TN(e.newer),running:TN(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:bk(e.newer),running:bk(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${Sk}@${bk(e.newer)}`,`install`]}}}}const DN={kind:`idle`},ON={kind:`running`};function kN(e,t,n){if(e===null)return[];let r=wN(e);if(!n.enabled||n.dismissed===r)return[];let i=EN(e),a=`${i.headline}: ${i.newer}. You're on ${i.running}.`,o=t.kind===`failed`&&t.identity===r?[`${i.act} failed: ${t.reason}`]:[],s=[a,...o].join(`
|
|
193
|
+
`),c=lk([{verb:UO,args:[s]}]),l=t.kind===`running`?WA(`[${i.busy}]`,c):WA(`[${i.act}]`,lk([{verb:tk,args:[n.sessionId]}]));return[{severity:UA,message:s,lines:[[WA(a,c),l,WA(`[dismiss]`,lk([{verb:LO,args:[n.sessionId,xN,r]}])),WA(`[disable]`,lk([{verb:WO,args:[n.sessionId,SN,`false`]},{verb:LO,args:[n.sessionId,CN,`false`]}]))],...o.map(e=>[WA(e,c)])]}]}function AN(e,t){return e.kind===`stale`?{kind:`source`,root:e.root,newer:e.source,running:e.running}:e.kind===`not-source-checkout`&&t!==null&&t.kind===`stale`?{kind:`release`,newer:t.latest,running:t.installed}:null}function jN(e){switch(e.kind){case`current`:return[`info`,`build: current ${TN(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${TN(e.source)}, running ${TN(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function MN(e){switch(e.kind){case`current`:return[`info`,`release: current ${bk(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${bk(e.latest)}, running ${bk(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${bk(e.installed)}, latest ${bk(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function NN(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const PN=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function FN(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=PN(e.stderr)??e.error??PN(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function IN(){let e=[xj(SN,[`false`]),mN(CN,[`false`]),mN(xN,[])];return()=>e.forEach(e=>e())}function LN(e){let{entryUrl:t,intervalMs:n,releaseIntervalMs:r,registryUrl:i,fetchImpl:a,onApplied:o,log:s}=e,c={kind:`unchecked`,reason:`not sampled yet`},l=null,u=DN,d=null,f=NN(s),p=NN(s),m=()=>AN(c,l);function h(){let e=m(),t=e===null?null:wN(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:mN(xN,[t])})}function g(){c=oj(t,ij),f(jN(c)),h()}async function _(){l=wk(qD,await Ck(Sk,a,i)),p(MN(l)),h()}return{arm(){IN(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>kN(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=EN(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=ON,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),je({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=DN,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=FN(n);u={kind:`failed`,identity:wN(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var RN=class{static CACHE_DIR=Le();static USAGE_CACHE_DIR=l.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=l.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=l.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return D(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(D(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(D(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return D(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=l.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),D(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await ue(50);else throw e}return D(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=l.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),D(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&D(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){D(`Failed to create cache directories:`,e)}}static createProjectHash(e){return se(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=l.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){D(`Cache for ${e} is locked, waiting...`),await ue(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(D(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(D(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return D(`No shared ${e} usage cache found`),null;D(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await ue(75)}}return D(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){D(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=l.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),D(`[CACHE-SET] ${e} disk cache stored`)}catch(t){D(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const zN={"claude-haiku-4-5-20251001":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-haiku-4-5":{name:`Claude Haiku 4.5`,input:1,output:5,cache_write_5m:1.25,cache_write_1h:2,cache_read:.1},"claude-opus-4-20250514":{name:`Claude Opus 4`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-opus-4-1-20250805":{name:`Claude Opus 4.1`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-sonnet-4-20250514":{name:`Claude Sonnet 4`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-4-opus-20250514":{name:`Claude 4 Opus`,input:15,output:75,cache_write_5m:18.75,cache_write_1h:30,cache_read:1.5},"claude-4-sonnet-20250514":{name:`Claude 4 Sonnet`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-sonnet-4-5-20250929":{name:`Claude Sonnet 4.5`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3},"claude-opus-4-5":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-5-20251101":{name:`Claude Opus 4.5`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-opus-4-6-20260205":{name:`Claude Opus 4.6`,input:5,output:25,cache_write_5m:6.25,cache_write_1h:10,cache_read:.5},"claude-sonnet-4-6":{name:`Claude Sonnet 4.6`,input:3,output:15,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3}};var BN=class{static executionCache=null;static modelPricingCache=new Map;static GITHUB_PRICING_URL=`https://raw.githubusercontent.com/promptctl/cc-candybar/main/pricing.json`;static async loadDiskCache(){let e=Date.now()-1440*60*1e3;return await RN.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await RN.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ie(this.GITHUB_PRICING_URL),n=le({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){D(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){D(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(D(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),D(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(D(`Invalid pricing data structure`),e(null))}catch(t){D(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{D(`Response error:`,t),e(null)})});n.on(`error`,t=>{D(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{D(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return D(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return D(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),D(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(D(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(zN).length} models`),this.executionCache=zN,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(zN).length} models`),zN)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return D(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),D(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const VN=String.raw`(?:^|[\s;&|(])`,HN=e=>RegExp(`(?:^|:)(?:${e})$`),UN=[{phase:`impl`,tool:`Edit`,match:/^/},{phase:`impl`,tool:`MultiEdit`,match:/^/},{phase:`impl`,tool:`Write`,match:/^/},{phase:`impl`,tool:`NotebookEdit`,match:/^/},{phase:`review`,tool:`Bash`,match:RegExp(`${VN}gh\\s+pr\\s+create\\b`)},{phase:`review`,tool:`Skill`,match:HN(`code-review|simplify`)},{phase:`groom`,tool:`Bash`,match:RegExp(`${VN}lit\\s+(done|close)\\b`)},{phase:`groom`,tool:`Skill`,match:HN(`groom-backlog`)},{phase:`handoff`,tool:`Skill`,match:HN(`message-in-a-bottle`)}],WN=e=>RegExp(`${VN}lit\\s+(?:${e})(?:\\s+(?:--?[\\w-]+(?:=\\S*)?|''))*\\s+([A-Za-z0-9][\\w.-]*)`),GN=[{verb:WN(`start`),to:`in_progress`},{verb:WN(`done|close`),to:`closed`}];function KN(e){return UN.find(t=>t.tool===e.tool&&t.match.test(e.subject))?.phase}function qN(e,t){if(t.tool===`Bash`)for(let{verb:n,to:r}of GN){let i=n.exec(t.subject)?.[1];if(i!==void 0)return{call:e,id:i,to:r}}}const JN=/^lit:state (.*)$/gm;function YN(e){return[...e.matchAll(JN)].map(([e,t])=>XN(t)??{kind:`unreadable`,line:e.trim()})}function XN(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!=`object`||!t)return;let{id:n,status:r,epic:i}=t;if(typeof n!=`string`||typeof r!=`string`)return;if(i===null)return{kind:`state`,id:n,status:r,epic:null};if(typeof i!=`object`||i===void 0)return;let a=i;if(!(typeof a.id!=`string`||typeof a.done!=`number`||typeof a.total!=`number`))return{kind:`state`,id:n,status:r,epic:{id:a.id,done:a.done,total:a.total}}}function ZN(e,t){let n=t??{};return{tool:e,subject:e===`Bash`&&typeof n.command==`string`?eP(n.command):e===`Skill`&&typeof n.skill==`string`?n.skill:e}}const QN=/(<<-?\s*(['"]?)(\w+)\2[^\n]*\n)[\s\S]*?\n\s*\3(?=\n|$)/g,$N=/'[^']*'|"(?:[^"\\]|\\.)*"/g;function eP(e){return e.replace(QN,`$1`).replace($N,`''`)}function tP(e){return typeof e==`string`?[e]:Array.isArray(e)?e.flatMap(e=>typeof e==`object`&&e&&typeof e.text==`string`?[e.text]:[]):[]}const nP=/^(\S+) \[(open|in_progress|closed)\//gm,rP=/^Ticket (\S+) has been closed\./gm,iP={sentinels:[],said:[]};function aP(e){let t;for(let n of tP(e)){let e=n.includes(`lit:state `),r=n.includes(` [`),i=n.includes(`has been closed.`);if(!(!e&&!r&&!i)){if(t??={sentinels:[],said:[]},e&&t.sentinels.push(...YN(n)),r)for(let[,e,r]of n.matchAll(nP))t.said.push({id:e,status:r});if(i)for(let[,e]of n.matchAll(rP))t.said.push({id:e,status:`closed`})}}if(t===void 0)return iP;for(let e of t.sentinels)e.kind===`state`&&t.said.push({id:e.id,status:e.status});return t}const oP=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function sP(e){if(typeof e==`string`)return oP.exec(e)?.[1]}function cP(e){let t=e?.todos;if(!Array.isArray(t))return;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let{content:t,activeForm:r,status:i}=e,a=i===`in_progress`,o=a&&typeof r==`string`?r:t;typeof o==`string`&&n.push({text:o,active:a,done:i===`completed`})}return n}function lP(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o,s=[],c=[],l,u=[];if(typeof t==`string`)o=t;else if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;switch(t.type){case`tool_use`:{let{id:e,name:n}=t;if(typeof e!=`string`||typeof n!=`string`)break;r.push({id:e,name:n});let i=ZN(n,t.input),o=qN(e,i);o!==void 0&&s.push(o),l=KN(i)??l,n===`TodoWrite`&&(a=cP(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id,n=aP(t.content);if(u.push(...n.sentinels),typeof e==`string`){i.push(e);for(let t of n.said)c.push({call:e,...t})}break}case`text`:o??=t.text;break;default:break}}let d=n?sP(o):void 0,f=s.length===0&&l===void 0&&u.length===0&&c.length===0?void 0:{...s.length>0&&{claims:s},...l!==void 0&&{phase:l},...u.length>0&&{sentinels:u},...c.length>0&&{said:c}};if(!(r.length===0&&i.length===0&&a===void 0&&d===void 0&&f===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...d!==void 0&&{command:d},...f!==void 0&&{lit:f}}}function uP(e){if(e!==void 0)return[e];let t=g();return[p(t,`.config`,`claude`),p(t,`.claude`)].filter(e=>a(e))}async function dP(e){let t=[];for(let n of e){let e=p(n,`projects`);if(a(e))try{let n=await Wj(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=p(e,r.name);t.push(n)}}catch(t){D(`Failed to read projects directory ${e}:`,t)}}return t}async function fP(e,t,n){let r=[],i=p(t,e,`subagents`);try{let t=(await Wj(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=p(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await Gj(t,`utf-8`)).split(`
|
|
194
|
+
`)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{D(`Failed to check agent file ${t}`)}}}catch(e){D(`Failed to read subagents directory ${i}:`,e)}return r}function pP(e){let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.firstContentType===`tool_result`;return t===`user`&&!n}const mP=new Map;async function hP(e){try{let t=await Kj(e),n=t.size,r=mP.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return D(`[parse-cache] hit ${e}`),mP.delete(e),mP.set(e,r),r.entries;let i;return n>1048576?(D(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await bP(e)):i=await vP(e),D(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(mP.delete(e),mP.size>=16&&mP.delete(mP.keys().next().value),mP.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return D(`Transcript not present yet: ${e}`),[];throw t}}function gP(e){if(!e.timestamp)return null;let t=e.message,n=t?.usage,r=t?.content,i=Array.isArray(r)&&typeof r[0]==`object`&&r[0]?r[0]:void 0;return{timestamp:new Date(e.timestamp),type:typeof e.type==`string`?e.type:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n,role:typeof t.role==`string`?t.role:void 0,type:typeof t.type==`string`?t.type:void 0,firstContentType:typeof i?.type==`string`?i.type:void 0}:void 0,costUSD:typeof e.costUSD==`number`?e.costUSD:void 0,isSidechain:e.isSidechain===!0,activity:lP(e),raw:{model:typeof e.model==`string`?e.model:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n}:void 0,requestId:typeof e.requestId==`string`?e.requestId:void 0}}}function _P(e){let t=[];for(let n of e.split(`
|
|
195
|
+
`))if(n.trim())try{let e=gP(JSON.parse(n));e&&t.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`);continue}return t}async function vP(e){return _P(await Gj(e,`utf-8`))}async function yP(e,t){let n=await qj(e,t===void 0?void 0:{offset:t.offset,ino:t.ino});if(n.kind!==`ok`)return n;let{buf:r,start:i,mtimeMs:a,ino:o,reset:s}=n.value,c=r.lastIndexOf(10);return J(c<0?{entries:[],cursor:{offset:i,mtimeMs:a,ino:o},reset:s}:{entries:_P(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function bP(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=de({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=gP(JSON.parse(t));e&&r.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{D(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{D(`File stream error for ${e}:`,t),n(t)})})}var xP=class{inflight=new Map;run(e,t){return this.inflight.get(e)??this.start(e,t)}start(e,t){let n=t();this.inflight.set(e,n);let r=()=>{this.inflight.get(e)===n&&this.inflight.delete(e)};return n.then(r,r),n}get size(){return this.inflight.size}};function SP(e,t){let n=e?e.input+e.cacheCreation+e.cacheRead:0,r=e?e.output:0;return{input:n,output:r,total:n+r,atMs:t}}const CP=new Map,wP={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},TP={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function EP(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function DP(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function OP(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function kP(e,t,n,r){let i=EP(new Date(DP())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:OP(),l=new Map;if(a)for(let[e,t]of a.days)e>=i&&l.set(e,{...t});for(let e of n){let t=e.message?.usage;if(!t)continue;o++;let n=e.costUSD??await BN.calculateCostForEntry(e.raw);s+=n,c.input+=t.input_tokens||0,c.output+=t.output_tokens||0,c.cacheCreation+=t.cache_creation_input_tokens||0,c.cacheRead+=t.cache_read_input_tokens||0;let r=EP(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...wP};a.cost+=n,a.input+=t.input_tokens||0,a.output+=t.output_tokens||0,a.cacheCreation+=t.cache_creation_input_tokens||0,a.cacheRead+=t.cache_read_input_tokens||0,l.set(r,a)}return{cursor:r,entries:o,cost:s,breakdown:c,days:l}}function AP(e){let t=0,n=0,r=OP(),i=new Map;for(let a of e.values()){t+=a.entries,n+=a.cost,r.input+=a.breakdown.input,r.output+=a.breakdown.output,r.cacheCreation+=a.breakdown.cacheCreation,r.cacheRead+=a.breakdown.cacheRead;for(let[e,t]of a.days){let n=i.get(e)??{...wP};n.cost+=t.cost,n.input+=t.input,n.output+=t.output,n.cacheCreation+=t.cacheCreation,n.cacheRead+=t.cacheRead,i.set(e,n)}}if(t===0)return{sessionInfo:TP,days:i};let a=r.input+r.output+r.cacheCreation+r.cacheRead;return{sessionInfo:{cost:n,calculatedCost:n,officialCost:null,tokens:a,tokenBreakdown:r},days:i}}async function jP(e,t,n){let r=0,i=async()=>{for(;r<e.length;){let t=e[r++];await n(t)}},a=Math.min(t,e.length);await Promise.all(Array.from({length:a},i))}var MP=class{entries=new Map;flight=new xP;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new xP;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??Bb,this.maxEntries=e.maxEntries??256,this.staleAgeMs=e.staleAgeMs??864e5;let t=e.sweepIntervalMs??3e5;t>0&&(this.sweepTimer=setInterval(()=>this.sweepStale(),t),this.sweepTimer.unref())}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,sweeps:this.sweeps,seeds:this.seeds}}async getUsageInfo(e,t){let n=await this.ingest(e,t?.transcript_path);if(n.kind===`failed`)return n;let r=n.kind===`ok`?n.value.sessionInfo:TP,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t){let n=EP(new Date),r=uP(t);try{await this.ensureSeeded(n,r)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let i=await this.ingest(e?.session_id??``,e?.transcript_path);if(i.kind===`failed`)return i;let a=r.map(e=>p(e,`projects`)+m),o={...wP},s=!1;for(let[t,r]of this.entries){let i=r.transcriptPath??``,c=t===e?.session_id||a.some(e=>i.startsWith(e))?r.days:CP;s||=c.has(n);let l=c.get(n)??wP;o.cost+=l.cost,o.input+=l.input,o.output+=l.output,o.cacheCreation+=l.cacheCreation,o.cacheRead+=l.cacheRead}return s?J({cost:o.cost,tokens:o.input+o.output+o.cacheCreation+o.cacheRead,tokenBreakdown:{input:o.input,output:o.output,cacheCreation:o.cacheCreation,cacheRead:o.cacheRead},date:n}):Y}async observeSpeed(e,t,n){let r=Vj(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=SP(i.kind===`ok`?i.value.sessionInfo.tokenBreakdown:null,n),o=this.speedRings.get(e)??[],s;for(let e of o)e.atMs<a.atMs&&(s===void 0||e.atMs>s.atMs)&&(s=e);return o.push(a),o.sort((e,t)=>e.atMs-t.atMs),o.length>64&&o.shift(),this.speedRings.set(e,o),J({...s!==void 0&&{prev:s},cur:a,samples:[...o]})})}async ingest(e,t,n){if(!e)return Y;let r=n??Vj(t),i=this.entries.get(e);if(i&&r!==0&&i.transcriptMtime===r)return i.lastSeenAt=Date.now(),this.entries.delete(e),this.entries.set(e,i),this.hits++,J(i);if(!t)return i?J(i):Y;this.misses++;let a;try{a=await this.flight.run(`${e}:${r}`,()=>this.refold(e,t,this.entries.get(e)))}catch(t){return X(`usage refold (${e}): ${t instanceof Error?t.message:String(t)}`)}if(a.kind!==`ok`)return a;let o={files:a.value.files,sessionInfo:a.value.sessionInfo,days:a.value.days,transcriptMtime:a.value.mainMtime,transcriptPath:t,lastSeenAt:Date.now()};return this.entries.delete(e),this.entries.set(e,o),this.evictIfNeeded(),J(o)}async refold(e,t,n){let r=await fP(e,d(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await yP(e,r?.cursor);if(o.kind===`failed`)return o;if(o.kind===`absent`){r&&i.set(e,r);continue}let{entries:s,cursor:c,reset:l}=o.value;i.set(e,await kP(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...AP(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=DP(),n=await dP(e),r=[];for(let e of n){let n;try{n=await Wj(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=p(e,i),a;try{a=(await Kj(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await jP(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},NP=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return D(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);D(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{D(`Calculating context tokens from transcript: ${e}`);let n=await hP(e);if(n.length===0)return D(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,D(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return D(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return D(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},PP=class{states=new Map;constructor(e,t,n=256){this.empty=e,this.step=t,this.maxSessions=n}async read(e,t){let n=this.states.get(e),r=Vj(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await yP(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:n?.value??this.empty};let{entries:a,cursor:o,reset:s}=i.value,c=s||n===void 0?this.empty:n.value;for(let e of a)c=this.step(c,e);for(this.touch(e,{cursor:o,value:c});this.states.size>this.maxSessions;){let e=this.states.keys().next().value;if(e===void 0)break;this.states.delete(e)}return{kind:`ok`,value:c}}touch(e,t){this.states.delete(e),this.states.set(e,t)}};const FP={messageCount:0,recent:[]};function IP(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!pP(t),recent:n.length>20?n.slice(-20):n}}function LP(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(pP(r))t=r.timestamp;else if(e===`assistant`&&t){let e=(r.timestamp.getTime()-t.getTime())/1e3;e>.1&&e<300&&(n=e)}}return n}var RP=class{fold=new PP(FP,IP);async getMetricsInfo(e,t){if(D(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:LP(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};function zP(e,t,n){return n.some(e=>e.call===t.call&&e.id===t.id&&e.status===t.to)?t.to===`closed`?e?.id===t.id?null:e:{id:t.id,phase:`prep`,epic:e?.id===t.id?e.epic:null,unread:null}:e}function BP(e,t,n){let r=[...e.claims,...t?.claims??[]],i=e=>n.includes(e.call),a=r.filter(i).reduce((e,n)=>zP(e,n,t?.said??[]),e.ticket),o=r.filter(e=>!i(e));if(a===null||t===void 0)return{claims:o,ticket:a};let s=t.sentinels??[],c=s.findLast(e=>e.kind===`state`&&e.id===a.id),l=s.findLast(e=>e.kind===`unreadable`);return{claims:o,ticket:{id:a.id,phase:t.phase??a.phase,epic:c?.kind===`state`?c.epic:a.epic,unread:l?.kind===`unreadable`?l.line:a.unread}}}const VP={ticket:null,claims:[],command:null,todos:[],pending:[],done:[]};function HP(e,t){let n=e.findIndex(e=>e.name===t);return n<0?[...e,{name:t,count:1}]:e.map((e,t)=>t===n?{name:e.name,count:e.count+1}:e)}function UP(e,t){if(t.isSidechain)return e;let n=pP(t)?{...e,command:t.activity?.command??null,pending:[],done:[]}:e,r=t.activity;if(r===void 0)return n;let i=n.pending,a=n.done;r.started!==void 0&&(i=[...i,...r.started]);for(let e of r.finished??[]){let t=i.findIndex(t=>t.id===e);t<0||(a=HP(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos,...BP(n,r.lit,r.finished??[])}}function WP(e){return{ticket:e.ticket,command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>HP(e,t.name),[]),done:e.done}}var GP=class{fold=new PP(VP,UP);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(WP(n.value))}};function KP(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function qP(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function JP(e,t,n,r){return qP(O(KP(e,t,n,r)),n)}async function YP(e,t,n){return qP(await je(KP(e,t,n)),n)}const XP=e=>`${e.socket}\n${e.pane}`;var ZP=class{names=new Map;asking=new xP;constructor(e=Date.now){this.now=e}getSessionName(e){let t=XP(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){D(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await YP(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const QP=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:$e.map(t=>e.env?.[t]??null)]);var $P=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=QP(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=QP(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function eF(e){return{gitProvider:new Yb({watchers:e.watchers,logger:e.logger}),usageStore:new MP({logger:e.logger}),contextProvider:new NP,metricsProvider:new RP,activityProvider:new GP,tmuxService:new ZP,mementoProvider:new $P(dM()),autoCompact:uC,log:e.logger}}function tF(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function nF(e,t){let n=W.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function rF(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function iF({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function aF(e){let t=iF(e);if(t.length===1)return e.text;let n=nF(t);return n.style=e.text.style,n}function oF(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,lead:s=[],trail:c=[]}=t;if(e.length===0)return[];let l=nF(e,a).pad(o),u=new W(` `.repeat(o)),d={...s.length>0&&{lead:nF([u,...s],a)},...c.length>0&&{trail:nF([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(rF(l,n,f),[{text:l,...d}])}const sF=RegExp(`\\x1b\\[[0-9;]*m|${Xi.source}`,`g`);function cF(e){return Gt(e.replace(sF,``))}function lF(e,t){let n=e.map(aF),r=[];if(e.forEach(({fill:e},t)=>{e!==void 0&&r.push({at:t,how:e})}),r.length===0||!Number.isFinite(t.width))return n;let i=zA(n,t).split(`
|
|
196
|
+
`);if(i.length>1)return n;let a=Math.max(0,t.width-cF(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:i},a)=>{let c=o+(a===r.length-1?s:0),{text:l}=e[t];rF(l,l.cellLength+c,i),n[t]=aF(e[t])}),n}function uF(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=dF(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e){let e={frag:a,style:AA(a.style)};if(e.style.link){i();let r=dF([e],t);r.plain.length>0&&n.push(r)}else r.push(e)}return i(),n}function dF(e,t){let n=t!==void 0&&!t.isNull?t:void 0,r=e.map(e=>fF(e.frag,n?n.add(e.style):e.style)),i=W.fromFragments(r);return i.end=``,i.overflow=`ignore`,r.length===1?i.style=r[0].style:n!==void 0&&(i.style=n),i}function fF(e,t){let n=e.copy();return n.style=t,n}function pF(e,t,n,r){let i=new Map,a=Object.entries(t);for(let[t,o]of[...a.filter(([,e])=>!(`do`in e)),...a.filter(([,e])=>`do`in e)])i.set(t,mF(e,t,o,n,r,i));return i}function mF(e,t,n,r,i,a){if(`set`in n){let e=r.get(n.set)??n.set;if(`to`in n)return{kind:`set-literal`,key:n.set,value:n.to,stateVar:e};if(`from`in n){let t=Zx(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=kx.get(n.persist)??n.persist;if(`to`in n)return{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e};if(`from`in n){let t=Zx(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=Zx(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:_F(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:_F(e,n.open,t)};if(`reset`in n)return{kind:`reset`,key:n.reset};if(`doctor`in n)return n.doctor===`run`?{kind:`doctor-run`}:{kind:`doctor-fix`,check:n.check};if(`ceiling`in n)return{kind:`ceiling`,args:_T(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:_F(e,n.name,t)};let[o,...s]=n.do.map(e=>{let n=a.get(e);if(n===void 0)throw Error(`action "${t}" fires "${e}", which is not declared in this config`);return n});return{kind:`do`,head:o,rest:s}}function hF(e){return e.kind===`do`?hF(e.head):e}function gF(e){switch(hF(e).kind){case`set-option`:case`set-int`:case`persist-option`:case`layout-op-option`:return!0;case`set-literal`:case`set-bounded`:case`set-cycle`:case`copy`:case`open`:case`persist-literal`:case`persist-bounded`:case`persist-cycle`:case`reset`:case`layout-op`:case`undo`:case`redo`:case`back`:case`rewind`:case`save`:case`preset-save`:case`preset-delete`:case`doctor-run`:case`doctor-fix`:case`ceiling`:case`slash`:case`do`:return!1}}function _F(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function vF(e,t){return e.has(t)?gy(e.read(t)):``}function yF(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function bF(e,t,n,r){let i=new W(e,{style:V.combine([r,new V({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function xF(e,t){return Math.max(e.members.indexOf(vF(t,e.stateVar)),0)}function SF(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=vF(r,e.stateVar);return{effects:[{verb:LO,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=vF(r,e.stateVar);return{effects:[{verb:LO,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=vF(r,e.stateVar);return{effects:[{verb:LO,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(xF(e,r)+1)%e.members.length];return{effects:[{verb:LO,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:RO,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:zO,args:[yF(e.text,lb(r))]}],active:!1};case`open`:return{effects:[{verb:BO,args:[yF(e.target,lb(r))]}],active:!1};case`persist-literal`:{let t=vF(r,e.stateVar);return{effects:[{verb:WO,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=vF(r,e.stateVar);return{effects:[{verb:WO,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(xF(e,r)+1)%e.members.length];return{effects:[{verb:WO,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:GO,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:YO,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:ZO,args:[i]}],active:!1};case`redo`:return{effects:[{verb:QO,args:[i]}],active:!1};case`back`:return{effects:[{verb:$O,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:ek,args:[i]}],active:!1};case`save`:return{effects:[{verb:KO,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:qO,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:JO,args:[i,yF(e.name,lb(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:nk,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:rk,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:ak,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:ok,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:XO,args:[i,e.key,sj(e.op)]}],active:!1};case`do`:{let a=SF(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>SF(e,t,void 0,r,i).effects)],active:a.active}}case`layout-op-option`:{let r={op:`insert`,segment:n??t,anchor:e.anchor,relation:e.relation};return{effects:[{verb:XO,args:[i,e.key,sj(r)]}],active:!1}}}}function CF(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:Ol(`action "${e}"`,n,t.members.length,xF(t,r)),boundValue:void 0};if(n.length>2)throw Error(`action "${e}" takes a display and an optional bound value, got ${n.length} arguments (per-state displays are a cycle action's form)`);return{display:n[0],boundValue:n[1]}}function wF(e,t,n){let r=n.compiled.get(e);if(!r)throw Error(`action "${e}" is not declared in this config`);let i=n.store,{display:a,boundValue:o}=CF(e,hF(r),t,i),{effects:s,active:c}=SF(r,a,o,i,vF(i,`session.id`));return bF(a,lk(s),c)}function TF(e){return{action:{fn:(t,...n)=>wF(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function EF(e,t){return bF(`✕`,lk([{verb:LO,args:[vF(e,`session.id`),t,Tl]}]),!1)}function DF(e,t,n){return new V({bgcolor:I.fromRgba(t),color:I.fromRgba(uo(e,t,n))})}function OF(e,t,n){return new V({color:I.fromRgba(Or(eo(e,`warning`),t,lo,n))})}function kF(e,t,n){return V.combine([DF(e,t,n),OF(e,t,n)])}function AF(e,t,n){return DF(e.palette,wo(e.palette,e.disclosure,[t],n),n)}function jF(e,t,n,r,i,a){return r===void 0?n=>AF(e,{...n,distribution:t},i):(e,t)=>MF(r(t,n),a,i)}function MF(e,t,n){return new V({bgcolor:I.fromRgba(t),color:I.fromRgba(Or(eo(e,`primary`),t,4.5,n))})}function NF(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>PF(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function PF(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function FF(e,t){return new W(e).truncate(t,{marker:`…`}).plain}function IF(e){return{current:null,drawnAt:e}}function LF(e,t,n,r,i,a){let o={segName:t,placementId:n,palette:r,disclosure:i,tint:a,bg:void 0,drops:[]};return e.current=o,o}function RF(e,t){let n=e.current;if(n===null)throw Error(`${t} is only available inside a segment's templates — there is no active segment here. Segment-scoped functions cannot be used in variable declarations or layout-node "when" predicates, which are evaluated outside any segment.`);return n}function zF(e){return new W(e).cellLength}function BF(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function VF(e){return Math.max(1,BF(e)-(zF(`✕`)+2*e.padding+e.seamCols))}function HF(e,t,n){if(!Number.isFinite(t))return e.length>0?[e.map((e,t)=>t)]:[];let r=Math.max(1,t-n),i=[],a=[],o=0;for(let t=0;t<e.length;t++){let n=e[t];a.length===0?(a=[t],o=n):o+1+n<=r?(a.push(t),o+=1+n):(i.push(a),a=[t],o=n)}return a.length>0&&i.push(a),i}function UF(e,t,n){let r=zF(`←`)+1+zF(`→`)+1,i=HF(e,t,n);return(i.length>1?HF(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function WF(e,t){let n=[];for(let t of e)n.length>0&&n.push(new W(` `)),n.push(t);let r=W.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function GF(e,t,n,r){let i=e.compiled.get(t);if(!i||i.kind!==n)throw Error(`picker references action "${t}" which must be ${r}, got ${i?`a ${i.kind} action`:`no such action`}`);return i}function KF(e,t,n){let r=e.compiled.get(t),i=r&&hF(r);if(!i||i.kind!==`set-option`&&i.kind!==`persist-option`&&i.kind!==`layout-op-option`)throw Error(`${n} references action "${t}" which must be a set-option, persist-option, or layout-op-option action ({ set, from }, { persist, from }, or { persist, insertSegmentFrom, anchor, relation }), got ${i?`a ${i.kind} action`:`no such action`}`);return i}function qF(e,t,n,r,i,a,o){let s=KF(i,e,`picker`),c=i.compiled.get(e),l=i.store,u=vF(l,`session.id`),d=`stateVar`in s?vF(l,s.stateVar):void 0,f=r?n.kind===`led`?VF(i):BF(i):1/0,p=n.kind===`led`?0:zF(`✕`)+1,m=s.library&&{groups:s.library.groups,entries:s.options.map(s.library.entry)},h=m===void 0?UF(s.options.map(zF),f,p):NF(m.entries,m.groups,r),g=parseInt(vF(l,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>lk([{verb:LO,args:[u,t.key,String(e)]}]),b=n.kind===`led`?[]:[{verb:LO,args:[u,...n.writes.flatMap(([e,t])=>[e,t])]}],x=n.kind===`own`&&n.onPick?b:[],S=e=>lk([...SF(c,e,e,l,u).effects,...x]),C=(e,t)=>{let n=s.options[e];return bF(t,S(n),n===d,a({index:e,count:s.options.length},n))},w=n.kind===`led`?[]:[bF(`✕`,lk(b),!1,o)];_>0&&w.push(bF(`←`,y(_-1),!1));let ee=_<h.length-1?[bF(`→`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[WF([...w,...e.map(e=>C(e,s.options[e])),...ee],r)]}let te=new V({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new W(`${v[0].label}${ne}`,{style:te})]:[],ie=[WF([...w,...re,...ee],r)];for(let e of v){v.length>1&&ie.push(WF([new W(e.label,{style:te})],r));let t=Math.max(...e.indices.map(e=>zF(s.options[e])));for(let n of e.indices){let e=s.options[n],i=m.entries[n].description,a=i===void 0?void 0:SA(i),o=` `.repeat(t-zF(e)+2),c=a===void 0?e:`${e}${o}${a}`;ie.push(WF([C(n,FF(c,f))],r))}}return ie}function JF(e,t){return{picker:{fn:(n,r,i,a,o,...s)=>{rb(`picker "${n}"`,[`closeOnPick`,`paged`,`inBody`],s);let c=GF(e,r,`set-int`,`an int action ({ set, int: true })`);if(o===!0&&i===!0)throw Error(`{{ picker "${n}" … }} sets both closeOnPick and inBody; a picker in a body is closed by the body's ✕, so it has no close to fold into a pick`);let l=KF(e,n,`picker`);if(l.library!==void 0)throw Error(`{{ picker "${n}" … }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let u=RF(t,`{{ picker }}`);if(u.bg===void 0)throw Error(`{{ picker }} is not available while segments.${u.segName}'s own "bg:" is being evaluated — a picker is drawn on that background`);let[d]=qF(n,{key:c.key,stateVar:c.stateVar},o===!0?{kind:`led`}:{kind:`own`,writes:[[c.key,`-1`]],onPick:i===!0},a===!0,e,jF(u,qa(void 0),e,l.paletteOf,t.drawnAt(),u.bg),OF(u.palette,u.bg,t.drawnAt()));return d},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function YF(e,t,n,r,i){let a=Math.min(Math.floor((t-1)/2),i),o=n,s=0;for(;s<a;){let t=o+zF(e(-(s+1)))+1+zF(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function XF(e,t,n,r,i,a){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let o=n.store;if(!o.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let s=n.compiled.get(e),c=vF(o,`session.id`),{options:l}=t,u=l.length;if(u===0)return WF([],!0);let d=vF(o,t.stateVar),f=Math.max(l.indexOf(d),0),p=e=>((f+e)%u+u)%u,m=e=>l[p(e)],h=new Map,g=e=>{let t=h.get(e);if(t!==void 0)return t;let n=lk(SF(s,m(e),m(e),o,c).effects);return h.set(e,n),n},_=e=>bF(m(e),g(e),m(e)===d,r({index:p(e),count:u},m(e))),v=a===void 0?_(0):bF(m(0),lk(SF(n.compiled.get(a),m(0),void 0,o,c).effects),!1),y=YF(m,u,zF(`◀`)+1+v.cellLength+1+zF(`▶`),VF(n),i),b=e=>Array.from({length:y},(t,n)=>_(e*(n+1)));return WF([...b(-1).reverse(),bF(`◀`,g(-1),!1),v,bF(`▶`,g(1),!1),...b(1)],!0)}function ZF(e,t){return{carousel:{fn:(n,...r)=>{let[i,a,...o]=r;if(rb(`carousel "${n}"`,[`neighbours`,`centre`],o),i!==void 0&&!(Number.isInteger(i)&&i>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(i)}`);if(a!==void 0&&!(typeof a==`string`&&e.compiled.has(a)))throw Error(`carousel "${n}": centre must name a declared action, got ${JSON.stringify(a)}`);if(a!==void 0&&gF(e.compiled.get(a)))throw Error(`carousel "${n}": centre "${a}" writes a value the template binds, and the centre binds none — name an action that writes a fixed value, a cycle, or a do of them`);let s=i??1/0,c=KF(e,n,`carousel`),l=RF(t,`{{ carousel }}`);if(l.bg===void 0)throw Error(`{{ carousel }} is not available while segments.${l.segName}'s own "bg:" is being evaluated — a carousel is drawn on that background`);return XF(n,c,e,jF(l,qa(void 0),e,c.paletteOf,t.drawnAt(),l.bg),s,a)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}const QF=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function $F(e,t,n){let r=_o(e,{hue:Ba,depth:0},n);return[Va(t.hues).map((t,n)=>({text:QF[n%QF.length],colour:to(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:eo(e,`warning`)},{text:`error`,colour:eo(e,`error`)}]]}function eI(e,t,n,r){let i=$F(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new W(` ${t} `,{style:DF(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new W(e)),a.push(t)}let s=W.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function tI(e,t){return{themePreview:{fn:()=>eI(e.palette,e.variation,t.drawnAt(),VF(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const nI=e=>e.slice(e.lastIndexOf(`.`)+1),rI=(e,t)=>{let n=new W(nI(e));return n.truncate(t,{marker:`…`}),n.plain};function iI(e,t){let n=e.map(e=>e.map(({name:e})=>zF(nI(e)))),r=e=>n.every(n=>n.reduce((t,n)=>t+Math.min(n,e)+2,0)<=t),i=Math.max(1,...n.flat());for(;i>1&&!r(i);)--i;return i}function aI(e,t,n,r){let i=iI(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new W(` ${rI(s,i)} `,{style:DF(l,Oo(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=W.fromFragments(a.flatMap((e,t)=>t===0?e:[new W(`
|
|
197
|
+
`),...e]));return o.overflow=`ignore`,o.end=``,o}function oI(e,t){return{layoutPreview:{fn:()=>aI(e.layout(),e.variation,t.drawnAt(),VF(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function sI(e,t,n,r){let i=RF(r.activeSegment,`{{ menu }}`),a=r.action,o=ev(i.placementId,e,n.key),s=rv(o),c=$_(e),l=vF(a.store,o)===c,u=vF(a.store,`session.id`),d=l?Tl:c,f=bF(Ol(`{{ menu "${e}" }}`,t,2,+!!l),lk([{verb:LO,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?(()=>{let t=r.activeSegment.drawnAt(),c=_o(i.palette,i.disclosure,t).plane;return qF(e,{key:s,stateVar:s},{kind:`own`,writes:[[o,Tl],[s,`0`]],onPick:n.closeOnPick},n.paged,a,jF(i,n.distribution,a,KF(a,e,`menu`).paletteOf,t,c),OF(i.palette,c,t))})():[]),f}const cI=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function lI(e,t){let n=t[t.length-1],r=cI(n)?n:void 0,i=r===void 0?t:t.slice(0,-1),a=i.findIndex(e=>typeof e!=`string`);if(a!==-1)throw Error(`{{ menu "${e}" }} display #${a+1} is not text (${JSON.stringify(i[a])}) — a menu binds its trigger text, then an optional trailing (dict …) of options`);return{displays:i,options:sv(r??{})}}function uI(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=lI(t,n);return sI(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function dI(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=fI(t,n,r),c=[];for(let e=0;e<r;e++){let t=e<s,l=t&&o!==void 0?o(e*n/r):void 0;c.push(new W(t?i:a,{style:l===void 0?void 0:new V({color:l})}))}let l=W.fromFragments(c);return l.end=``,l.overflow=`ignore`,l}function fI(e,t,n){return!Number.isFinite(e)||!Number.isFinite(t)||t<=0?0:Math.min(n,Math.max(0,Math.round(e/t*n)))}function pI(e){let t={fn:(()=>{let t=RF(e,`{{ bgOf }}`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],arity:{kind:`exact`},returnType:`string`},n={fn:(()=>RF(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=Uy(()=>RF(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...mI(s)];return dI({value:e,max:t,width:n,filled:i,empty:a,colourAt:c===void 0?void 0:e=>String(r.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function mI(e){return e.flatMap(e=>{let t=e.indexOf(`:`),n=t<0?NaN:Number(e.slice(0,t));if(!Number.isFinite(n))throw Error(`{{ gauge }} stop "${e}" must be "<position>:<colour>", e.g. "80:error" or "80:#ff0000"`);return[n,e.slice(t+1)]})}function hI(e){let t=[],n=[];for(let r of e){if(!r.contains(`
|
|
198
198
|
`)){n.push(r);continue}let e=r.split(`
|
|
199
|
-
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function hI(e,t){let n=t.flatMap(e=>e.filter(e=>e.place===`above`)),r=t.map(e=>e.filter(e=>e.place===`flow`));return[...n,...gI(e,r)]}function gI(e,t){switch(e){case`vertical`:return t.flatMap(e=>e);case`horizontal`:return t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,place:`flow`},...t.flatMap(e=>e.slice(1))]}}function _I(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:hI(e.direction,e.children.map((t,i)=>n(t,[...r,vI(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function vI(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:cc[e.direction]}}const yI={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:qa(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,mc(t.path,n)))}},render(e,t){return hI(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,vI(e,r))))}},bI={drop:e=>e.place,above:()=>`above`},xI={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},SI={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:lc(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(jl(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,hc(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render(e,t){let n=t.lookupSegment(e.name);if(!n)throw Error(`Layout segment "${e.name}" has no matching segment`);let{seg:r,compiled:i}=n;if(!t.visible)return[];let a=db(t.scope,e.settings);try{if(!eF(i.when,a))return[];let n=Rx(e.settings.theme,t.palette),o=e.opens!==void 0&&eF(e.opens.open,t.scope),{styles:s,fragments:c,lead:l,trail:u,drops:d,open:f}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},o),p=f?s.trigger:s.closed,m={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:p,padding:t.padding},h=e.opens,g=h===void 0?[]:t.renderBody(h.body,o,s.disclosure).map(e=>({...e,place:bI[h.placement](e)})),_=mI(lF(c,p)).map((e,t)=>({cells:aF(e,{...m,lead:t===0?lF(l,p):[],trail:t===0?lF(u,p):[]}),band:`own`,place:`flow`})),v=d.map(e=>({cells:aF(lF([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),y=(e,t,n)=>aF(lF([e],t),{...m,width:`auto`,baseStyle:t,padding:n}),b=g.findIndex(e=>e.band===`own`),{lead:x,stays:S}=h!==void 0&&b!==-1?xI[h.placement](_,()=>y(t.closeDisclosure(h.key),s.close,t.padding)):{lead:[],stays:_},C=x.flatMap(e=>y(new W(` `.repeat(rF(e).reduce((e,t)=>e+t.cellLength,0))),s.trigger,0)),w=(e,t)=>e.band===`own`?t===b?x:C:[],ee=g.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),te=[...S,...v];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...te.flatMap(e=>e.cells),...g.flatMap(w)].flatMap(rF)),[...te,...ee]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:aF([new W(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:CI(e.lead,e,a,t),trail:CI(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function CI(e,t,n,r){if(e===void 0)return[];try{return r.evaluateSegment(t,n,r.palette,r.region,{bg:void 0,fg:void 0,body:e,lead:void 0,trail:void 0},!1).fragments}catch(e){return r.onSegmentError?.(t.id,e.message??String(e)),[]}}const wI={container:yI,segment:SI};function TI(e){return wI[e]}function EI(e){if(`ttl`in e)return{kind:`ttl`,durationMs:tx(e.ttl)};if(`watch_file`in e)return{kind:`watch_file`,path:e.watch_file};if(`depends_on`in e)return{kind:`depends_on`,varNames:e.depends_on};if(`key`in e)return{kind:`key`,template:e.key};if(`never`in e)return{kind:`never`};throw Error(`Unknown CacheDecl discriminator — loader invariant violated: ${JSON.stringify(e)}`)}function DI(e,t){switch(vc(e)){case`json`:return{kind:`json`,default:t};case`regex`:return{kind:`regex`,regex:new RegExp(e.regex),default:t};case`text`:return{kind:`text`,default:t}}}function OI(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`input`:e.declareInput(t,n.path,n.type??`string`,n.default);break;case`env`:e.declareEnv(t,n.name,n.default);break;case`file`:e.declareFile(t,n.path,{readMode:n.readMode,cache:EI(n.cache),parse:DI(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:EI(n.cache),parse:DI(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,ttlMs:n.cache?tx(n.cache.ttl):void 0,varDefault:n.default});break;case`git`:e.declareGit(t,{field:n.field,cwd:r,varDefault:n.default});break;case`state`:e.declareState(t,{key:n.key,...n.default!==void 0&&{varDefault:n.default}});break}}function kI(e,t){let n=Nf.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}const AI=e=>ts(void 0,null,e.globals.variation);function jI(e,t,n){let r=n.cwd,i=Gx(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:IA({endcaps:`powerline`,charset:Xo}),width:80,basePalette:i,palette:i,variation:za[AI(e)],padding:1,seamCols:LA({endcaps:`powerline`,charset:Xo}),layout:()=>[]},o=FF(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=uv(e.presets),u=Zw(e),d=cb({...wF(a),...qF(a,o),...XF(a,o),...eI(a,o),...aI(a,o),...lI(s),...fI(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=kI(d,e.helpers),p=e=>d.parse(e,f),m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=p(e);return m.set(e,n),n},g=new Map;for(let[t,n]of Ax)n in e.variables&&g.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!g.has(n.key)&&g.set(n.key,t);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))r.kind===`state`&&!g.has(r.key)&&g.set(r.key,`${t}.${e}`);a.compiled=fF(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{OI(t,n,i,r)}catch(e){_.push(`Variable "${n}": ${e.message??String(e)}`)}for(let[n,i]of Object.entries(e.segments))if(i.vars)for(let[e,a]of Object.entries(i.vars))try{OI(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Cc(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>Oc(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return TI(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=pv(e,t);C.set(t,S(n,r))}let w=new Map(Ro.map(e=>[e,new Map])),ee=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of ee)for(let n of Ro){let r=t[n];if(!zo(r))continue;let i=`${e}.${n}`,a=w.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:MI(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:w,loadWarnings:_}}function MI(e,t,n){try{return e(n)}catch(e){throw Error(`${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function NI(e,t,n){let r=e.globalExpressions.get(t).get(n);if(r===void 0)throw Error(`the ${t} rule ${JSON.stringify(n)} reached the render but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r}function PI(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function FI(e,t){return e.kind===`decided`?e.name:t}function II(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(Qo(a.colorCompatibility));let{preset:d=cv}=s??{},f=mv(e,d),p=za[s?.variation??ts(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??Wo(`none`,e.styles),h=s?.theme??Ux(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(FI(h,jo),FI(m,Ho))),t.menuRuntime.action.chromeCols=IA(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=LA(a);let _=lb(n),v=Vo(h,e=>{let n=NI(t,`palette`,e);return Hx(PI(n,_),n.where,e=>u?.(e))}),y=Vo(m,n=>Wo(PI(NI(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=Bx(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,disclosure:u}=Oo(i,a,c),d=IF(t.activeSegment,e.name,e.id,i,u,l),f=vS(d,c,o.bg,o.fg,n),p=()=>_o(i,u,c).state;s&&(d.bg=p());let m=o.body.evaluate(n),h=d.drops.length>0||s;h&&(d.bg=p());let g=o.lead?.evaluate(n)??[],_=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return EF(i,p(),c)},get band(){return EF(i,_o(i,u,c).plane,c)},get close(){return OF(i,p(),c)},disclosure:u},fragments:m,lead:g,trail:_,drops:d.drops,open:h}}finally{t.activeSegment.current=null}},w=(e,t,r)=>{let i=t&&eF(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>w(e,t,Eo(r,n)),renderBody:(e,t,n)=>w(e,i&&t,Do(n)),closeDisclosure:e=>TF(n,e)};return TI(e.kind).render(e,o)},ee=t.roots.get(d);if(ee===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${cv}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let te=e=>{if(!eF(e.when,_))return!1;if(e.kind===`container`)return!0;if(cT(e.name)===void 0)return!1;try{return eF(t.segments[e.name].when,db(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>_I(ee,te).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=cT(e);return r===void 0?[]:[{name:r,address:t,palette:Rx(n.theme,x)}]})),w(ee,!0,To(p)).map(e=>RA(cF(e.cells,a),a)).join(`
|
|
200
|
-
`)}function*
|
|
201
|
-
`)||null}function eL(e,t,n,r){let i=mD(t,Lj),{config:a,raw:o}=i;n.push(...i.warnings);let s=vD(i,t??`<default>`),c=new JI,l=new Sx(c,s.globals.default_empty_value??``,r.gitService,r.sessionState),u;try{u=jI(s,l,{cwd:e}),n.push(...u.loadWarnings),mN(s),xj(s)}catch(e){throw l.dispose(),e}return{config:s,store:c,registry:l,compiled:u,neededInputPaths:TM(s),lastRenderCellsBySegment:new Map,authoredRoots:ZI(a,o),fileHeldSettings:eN(o),unused:BI(o,a),plugins:i.plugins}}function tL(e,t,n,r){let i=KE(e,t,n),a=i.kind===`file`?i.path:null,o=[ZE(e,t),JE(i)],s;try{s=eL(t,a,o,r)}catch(e){return e instanceof nc&&o.push(...e.warnings),{resolvedPath:a,warning:$I(o),state:null,error:e instanceof nc||e instanceof Error?e.message:String(e)}}return{resolvedPath:a,warning:$I(o),state:s,error:null}}var nL=class{entries=new Map;deps;maxEntries;observers;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256,this.observers=t.observers??{}}getOrCreate(e,t,n){let r=XI(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=tL(e,t,n,this.deps);a.state!==null&&YI(a.resolvedPath,a.state.plugins);let o={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:a.error,lastWarning:a.warning,state:a.state??eL(t,null,[],this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a.resolvedPath),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=tL(e.projectDir,e.cwd,e.configFile,this.deps);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(YI(t.resolvedPath,t.state.plugins),e.state.registry.dispose(),e.state=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}refreshWatcher(e,t){e.configFilePath=t;let n=QI(e,t),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const rL=16384;var iL=class{startedAt=new Date;requestsTotal=0;requestsErrored=0;requestsTimedOut=0;inFlight=0;watchersOpened=0;watchersClosed=0;watchersEvicted=0;subprocessTotal=0;subprocessInFlight=0;subprocessCount=new Map;subprocessHistogram=new Map;subprocessHistogramRotator=new Map;rollingTimestamps=[];rollingHead=0;launchStats={onStart:e=>{this.subprocessTotal++,this.subprocessInFlight++,this.subprocessCount.set(e,(this.subprocessCount.get(e)??0)+1),this.recordRollingNow()},onEnd:(e,t)=>{this.subprocessInFlight=Math.max(0,this.subprocessInFlight-1),this.recordDuration(e,t)}};recordRollingNow(){let e=Date.now();if(this.rollingTimestamps.length<rL){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%rL}recordDuration(e,t){let n=this.subprocessHistogram.get(e);if(n||(n=[],this.subprocessHistogram.set(e,n)),n.length<16){n.push(t);return}let r=(this.subprocessHistogramRotator.get(e)??0)%16;n[r]=t,this.subprocessHistogramRotator.set(e,r+1)}snapshotSubprocesses(){let e=Date.now()-6e4,t=0;for(let n of this.rollingTimestamps)n>=e&&t++;let n={};for(let[e,t]of this.subprocessCount)t>0&&(n[e]=t);let r={},i={};for(let[e,t]of this.subprocessHistogram){if(t.length===0)continue;let n=[...t].sort((e,t)=>e-t),a=Math.floor(n.length*.5),o=Math.min(n.length-1,Math.floor(n.length*.99)),s=n[a],c=n[o];s!==void 0&&(r[e]=s),c!==void 0&&(i[e]=c)}return{total:this.subprocessTotal,inFlight:this.subprocessInFlight,lastMinute:t,byCategory:n,p50DurationMs:r,p99DurationMs:i}}snapshot(e){let t=process.memoryUsage();return{pid:process.pid,version:KD,protocolVersion:3,startedAt:this.startedAt.toISOString(),uptimeSec:Math.floor((Date.now()-this.startedAt.getTime())/1e3),rssBytes:t.rss,heapUsedBytes:t.heapUsed,heapTotalBytes:t.heapTotal,externalBytes:t.external,arrayBuffersBytes:t.arrayBuffers,requests:{total:this.requestsTotal,errored:this.requestsErrored,timedOut:this.requestsTimedOut,inFlight:this.inFlight},gitCache:e.gitCache,usageCache:e.usageCache,renderCache:{size:e.renderCacheSize},watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null,handlerProbes:e.handlerProbes}}};function aL(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const oL={load:()=>({}),save:()=>{},flush:()=>{}};function sL(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var cL=class{sessions;storage;atom=(0,py.createAtom)(`SessionState`);constructor(e=oL,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=sL(this.storage.load()),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.get(t)??null):null}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,py.runInAction)(()=>{let n=this.sessions.get(e)??new Map;for(let{key:e,value:r}of t)n.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,py.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.delete(t),n.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,py.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};function lL(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let t of Object.values(e)){if(typeof t!=`object`||!t||Array.isArray(t))return!1;for(let e of Object.values(t))if(typeof e!=`string`)return!1}return!0}var uL=class{timer=null;pending=null;constructor(e,t=500,n=Bb){this.filePath=e,this.debounceMs=t,this.logger=n}load(){let e;try{e=r.readFileSync(this.filePath,`utf8`)}catch(e){let t=e.code;return t!==`ENOENT`&&this.logger(`warn`,`session-state read failed (${t}); starting empty`),{}}try{let t=JSON.parse(e);return lL(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(l.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const dL={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,preset:`string`,endcaps:`string`,variation:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},fL=new Set([`1`,`true`]),pL=new Set([`0`,`false`,``]);function mL(e,t){let n=zL(e),r=n.scope===`segment-palette`?`string`:dL[n.field];if(r===`string`)return JSON.stringify(t);if(r===`number`){let n=Number(t);if(!Number.isFinite(n))throw Error(`persistValueText: "${e}" expects a number, got "${t}"`);return String(n)}if(fL.has(t))return`true`;if(pL.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function hL(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function gL(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function _L(e){return/^\s*$/.test(e)?null:vs(e)}function vL(e,t){return e!==null&&bs(e,t)!==void 0}function yL(e){if(e.kind===`segment`)return e.when===void 0?e.name:{seg:e.name,when:e.when};if(e.kind===`container`){let{kind:t,direction:n,children:r,...i}=e;return{[n===`horizontal`?`h`:`v`]:r.map(yL),...i}}return e}function bL(e){if(!pl(e))return yL(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,yL(t)])),...n}}const xL=Fj,SL=xL.segments,CL=xL.presets,wL=xL.root;function TL(e,t,n,r){if(!vL(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function EL(e,t){let n=fS(t);return t.scope===`segment-palette`&&TL(e,[`segments`,t.segment],SL[t.segment],n.join(`.`)),n}function DL(e){return vs(Os(e))}function OL(){return Object.entries(wL.rows).map(([e,t])=>{let n=yL(t);return{path:[`root`],fragment:DL({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function kL(e,t){let n=e===null?void 0:bs(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function AL(e,t){if(t===void 0)return null;let n=bL(t);return{path:e,fragment:DL(n),unit:{path:e,value:n}}}function jL(e,t){let n=[`presets`,t],r=[...n,`root`],i=CL[t];TL(e,n,i,r.join(`.`));let a=kL(e,r)??AL(r,i?.root);return a!==null&&Ys(a.fragment)?a:null}function ML(e,t){let n=Js(t.fragment);return n===null?new Map([[`#`,{path:t.path,unit:t.unit,node:t.fragment}]]):new Map([...e,...n.map(e=>[e.key,{path:[...t.path,`rows`,e.key],unit:t.unit,node:e.value}])])}function NL(e,t){return[...OL(),kL(e,[`root`]),jL(e,t)].filter(e=>e!==null).reduce(ML,new Map)}function PL(e,t,n){for(let{node:r,...i}of NL(e,t).values())if(Zs(r,n))return i;throw new $(`${FL(e,t).join(`.`)} holds no placement "${n}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`)}function FL(e,t){return jL(e,t)?.path??[`root`]}function IL(e,t){return t.scope===`preset-root`?FL(e,t.preset):fS(t)}function LL(e,{unit:t}){return t===null?e:Hs(e,t.path,Os(t.value),Es)}function RL(e){let t=dS(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function zL(e){let t=RL(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function BL(e,t,n,r){VL(t,r),gL(t,r,e.logger),e.record(t,n,r)}function VL(e,t){try{return vD(hD(e,t,Lj),e)}catch(e){throw e instanceof nc?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function HL(e,t){let n=zL(t),r=_L(hL(e)??``),i=r===null?void 0:bs(r,fS(n));return i!==void 0&&`value`in i?i.value:void 0}function UL(e,t,n){WL(e,t,n,[])}function WL(e,t,n,r){let i=hL(t);BL(e,t,i,GL(n.reduce((e,[t,n])=>Hs(e,EL(_L(e),zL(t)),mL(t,n),Es),i??``),t,r,e=>e))}function GL(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=PL(_L(s),n,i),l=tc(LL(s,c),c.path,i,a,Os(o));if(l===null)throw new $(`${c.path.join(`.`)} in ${t} has no placement "${i}" — the bar you clicked is stale (it reloads on the next render)`);return l},e)}function KL(e,t,n){let r=_L(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of NL(r,t)){if(!Zs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Ss(e,c):Os(s.value);if(a!==`#`)return Hs(e,[...i,`rows`,a],l,Es);if(jL(r,t)!==null)throw new $(`cannot give preset "${t}" its own copy of ${o.join(`.`)}: it already stages rows of its own over that tree`);return Hs(e,i,l,Es)}return e}function qL(e,t){return Ws(e,t,t[0]===`presets`&&t.length>2&&!zj(t[1])?2:0)}function JL(e,t,n){let r=n.map(RL),i=hL(t);if(i===null)return;let a=r.reduce((e,t)=>qL(e,IL(_L(e),t)),i);a!==i&&BL(e,t,i,a)}function YL(e){let t=e===null?void 0:bs(e,[`presets`]),n=new Set([...Rj,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(td));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(td(e)))}function XL(e,t,n,r,i,a){let o=hL(t),s=_L(o??``),c=YL(s),l=[`presets`,c],u=jL(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Ss(o??``,u.fragment):Os(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],Os(r)]]],f=i.map(([e,t])=>{let n=uS(c,e);return[EL(s,zL(n)),mL(n,t)]});return BL(e,t,o,GL([...d,...f].reduce((e,[t,n])=>Hs(e,t,n,Es),Hs(o??``,l,`{}`,Es)),t,a.map(e=>({...e,preset:c})),KL)),c}function ZL(e,t,n){if(zj(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=hL(t),a=_L(i??``);if(i===null||a===null||bs(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=bs(a,[`globals`,`preset`]);BL(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>qL(e,t),i))}function QL(e,t,n,r){let i=RL(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=hL(t),o=r.op===`remove`?r.target:r.anchor,s=PL(_L(a??``),i.preset,o),c=LL(a??``,s),{after:l,placed:u}=$L(c,s.path,r,()=>{let e=VL(t,c);return uv(e.presets).map(t=>pv(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return BL(e,t,a,l),u}function $L(e,t,n,r){switch(n.op){case`remove`:return{after:$s(e,t,n.target),placed:null};case`insert`:{let i=cj(n.segment,n.anchor,r());return{after:ec(e,t,i,n.anchor,n.relation),placed:i}}}}const eR={load:()=>({}),save:()=>{}},tR=new Set(Ex.map(e=>e.sessionKey)),nR=e=>tR.has(e)||e.startsWith(Pv),rR=8*1024*1024,iR={past:[],future:[]},aR=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var oR=class{state=new Map;constructor(e,t,n=eR){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??iR;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??iR}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(aR(n));r.set(aR(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:aL(this.sessionState,e=>nR(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:mR(i,n),o=r.get(e),s=o===void 0?a:vR(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,gR(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint — nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(aR)),a=n.net.filter(e=>!i.has(aR(e))),o=lR(yR(_R(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(xR).join(`, `)} changed since edit mode opened — kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=lR(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...dR(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(aR)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:yR(n,t),future:yR(i,t),...a!==void 0&&{savepoint:{at:yR([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(aR(e))),below:yR(a.below,t)}}}),new $(`${r}: ${o.map(xR).join(`, `)} changed since that edit — refusing to overwrite it; this session's undo history no longer steps it`)}let s=[];try{for(let r of t)this.write(e,r,r[n]),s.push(r);this.put(e,i)}catch(t){try{for(let t of s.reverse())this.write(e,t,t[a])}catch(e){throw Error(`${t.message}; and putting the step back failed, so it is half-applied: ${e.message}`)}throw t}}read(e,t){return t.kind===`session`?this.sessionState.get(e,t.key):hL(t.file)}write(e,t,n){t.kind===`file`?gL(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||sR(n)>rR;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,cR(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${rR} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function sR(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function cR({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...dR(n,1,[])}:{past:e,future:t.slice(1),...dR(n,0,[])}}function lR(e){return e.slice(-50)}const uR=e=>e===Iv.member;function dR(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:fR(e.net,n),below:e.below}}}function fR(e,t){let n=new Map(e.map(e=>[aR(e),e]));for(let e of t){let t=n.get(aR(e));n.set(aR(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const pR=e=>e.map(e=>({...e,before:e.after,after:e.before}));function mR(e,t){let n=[...e.past,t],r=lR(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...dR(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...hR(e.future,a),...i.below]},n.length-r.length,t)}}function hR(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function gR(e,t){return{past:e.past.slice(0,-1),future:lR([...e.future,t]),...dR(e.savepoint,0,pR(t))}}function _R(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...hR(r,t.at-i.length),...t.below]}function vR(e,t){if(uR(t.after)&&!uR(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!uR(t.after)&&uR(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function yR(e,t){return e.map(e=>e.filter(e=>!t.has(aR(e)))).filter(e=>e.length>0)}function bR(e){return e.map(xR).join(`, `)}function xR(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function SR(e){if(typeof e!=`object`||!e)return!1;let t=e,n=e=>e===null||typeof e==`string`;return(t.kind===`session`&&typeof t.key==`string`||t.kind===`file`&&typeof t.file==`string`)&&n(t.before)&&n(t.after)}function CR(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(SR))}function wR(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(SR)&&CR(t.below)}function TR(e){if(typeof e!=`object`||!e)return!1;let t=e;return CR(t.past)&&CR(t.future)&&(t.savepoint===void 0||wR(t.savepoint))}function ER(e,t){let n=e=>e.kind===`file`||nR(e.key)?!0:(t.add(e.key),!1),r=e=>e.map(e=>e.filter(n)).filter(e=>e.length>0),{savepoint:i}=e,a=r(e.past),o=r(e.future);return i===void 0?{past:a,future:o}:{past:a,future:o,savepoint:{at:r(e.past.slice(0,i.at)).length,net:i.net.filter(n),below:r(i.below)}}}function DR(e,t){return{load:()=>{let n;try{n=r.readFileSync(e,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`settings-history read failed (${n}); starting empty`),{}}try{let e=JSON.parse(n);if(typeof e==`object`&&e&&!Array.isArray(e)&&Object.values(e).every(TR)){let n=new Set,r=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,ER(t,n)]));return n.size>0&&t(`warn`,`settings-history load: dropped the changes to ${[...n].map(e=>`"${e}"`).join(`, `)}, no longer a setting`),r}}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}const OR=e=>!nR(e)&&!KS(e)&&e!==`update.dismissed`;var kR=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:aL(e,OR,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,py.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function AR(e){let t=qP(e,`doctor.tmux`,[`display`,`-p`,`-t`,e.pane,`#{client_termfeatures}`]);return t.kind===`ok`?{kind:`ok`,value:t.stdout.trim().split(`,`).filter(e=>e!==``)}:{kind:`failed`,reason:t.reason}}function jR(e){return{probeTmux:AR,loadConfig:e}}function MR(e,t){let n=e.loadConfig(t),r={path:n.path,warnings:n.warning===null?[]:n.warning.split(`
|
|
202
|
-
`)};return n.error===null?{...r,kind:`loaded`,
|
|
203
|
-
`);return}t.stdout.write(
|
|
199
|
+
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function gI(e,t){let n=t.flatMap(e=>e.filter(e=>e.place===`above`)),r=t.map(e=>e.filter(e=>e.place===`flow`));return[...n,..._I(e,r)]}function _I(e,t){switch(e){case`vertical`:return t.flatMap(e=>e);case`horizontal`:return t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,place:`flow`},...t.flatMap(e=>e.slice(1))]}}function vI(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:gI(e.direction,e.children.map((t,i)=>n(t,[...r,yI(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function yI(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:cc[e.direction]}}const bI={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:qa(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,mc(t.path,n)))}},render(e,t){return gI(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,yI(e,r))))}},xI={drop:e=>e.place,above:()=>`above`},SI={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},CI={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:lc(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(jl(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,hc(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render(e,t){let n=t.lookupSegment(e.name);if(!n)throw Error(`Layout segment "${e.name}" has no matching segment`);let{seg:r,compiled:i}=n;if(!t.visible)return[];let a=db(t.scope,e.settings);try{if(!tF(i.when,a))return[];let n=Rx(e.settings.theme,t.palette),o=e.opens!==void 0&&tF(e.opens.open,t.scope),{styles:s,fragments:c,lead:l,trail:u,drops:d,open:f}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},o),p=f?s.trigger:s.closed,m={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:p,padding:t.padding},h=e.opens,g=h===void 0?[]:t.renderBody(h.body,o,s.disclosure).map(e=>({...e,place:xI[h.placement](e)})),_=hI(uF(c,p)).map((e,t)=>({cells:oF(e,{...m,lead:t===0?uF(l,p):[],trail:t===0?uF(u,p):[]}),band:`own`,place:`flow`})),v=d.map(e=>({cells:oF(uF([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),y=(e,t,n)=>oF(uF([e],t),{...m,width:`auto`,baseStyle:t,padding:n}),b=g.findIndex(e=>e.band===`own`),{lead:x,stays:S}=h!==void 0&&b!==-1?SI[h.placement](_,()=>y(t.closeDisclosure(h.key),s.close,t.padding)):{lead:[],stays:_},C=x.flatMap(e=>y(new W(` `.repeat(iF(e).reduce((e,t)=>e+t.cellLength,0))),s.trigger,0)),w=(e,t)=>e.band===`own`?t===b?x:C:[],ee=g.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),te=[...S,...v];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...te.flatMap(e=>e.cells),...g.flatMap(w)].flatMap(iF)),[...te,...ee]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:oF([new W(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:wI(e.lead,e,a,t),trail:wI(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function wI(e,t,n,r){if(e===void 0)return[];try{return r.evaluateSegment(t,n,r.palette,r.region,{bg:void 0,fg:void 0,body:e,lead:void 0,trail:void 0},!1).fragments}catch(e){return r.onSegmentError?.(t.id,e.message??String(e)),[]}}const TI={container:bI,segment:CI};function EI(e){return TI[e]}function DI(e){if(`ttl`in e)return{kind:`ttl`,durationMs:tx(e.ttl)};if(`watch_file`in e)return{kind:`watch_file`,path:e.watch_file};if(`depends_on`in e)return{kind:`depends_on`,varNames:e.depends_on};if(`key`in e)return{kind:`key`,template:e.key};if(`never`in e)return{kind:`never`};throw Error(`Unknown CacheDecl discriminator — loader invariant violated: ${JSON.stringify(e)}`)}function OI(e,t){switch(vc(e)){case`json`:return{kind:`json`,default:t};case`regex`:return{kind:`regex`,regex:new RegExp(e.regex),default:t};case`text`:return{kind:`text`,default:t}}}function kI(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`input`:e.declareInput(t,n.path,n.type??`string`,n.default);break;case`env`:e.declareEnv(t,n.name,n.default);break;case`file`:e.declareFile(t,n.path,{readMode:n.readMode,cache:DI(n.cache),parse:OI(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:DI(n.cache),parse:OI(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,ttlMs:n.cache?tx(n.cache.ttl):void 0,varDefault:n.default});break;case`git`:e.declareGit(t,{field:n.field,cwd:r,varDefault:n.default});break;case`state`:e.declareState(t,{key:n.key,...n.default!==void 0&&{varDefault:n.default}});break}}function AI(e,t){let n=Nf.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}const jI=e=>ts(void 0,null,e.globals.variation);function MI(e,t,n){let r=n.cwd,i=Gx(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:LA({endcaps:`powerline`,charset:Xo}),width:80,basePalette:i,palette:i,variation:za[jI(e)],padding:1,seamCols:RA({endcaps:`powerline`,charset:Xo}),layout:()=>[]},o=IF(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=uv(e.presets),u=Zw(e),d=cb({...TF(a),...JF(a,o),...ZF(a,o),...tI(a,o),...oI(a,o),...uI(s),...pI(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=AI(d,e.helpers),p=e=>d.parse(e,f),m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=p(e);return m.set(e,n),n},g=new Map;for(let[t,n]of Ax)n in e.variables&&g.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!g.has(n.key)&&g.set(n.key,t);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))r.kind===`state`&&!g.has(r.key)&&g.set(r.key,`${t}.${e}`);a.compiled=pF(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{kI(t,n,i,r)}catch(e){_.push(`Variable "${n}": ${e.message??String(e)}`)}for(let[n,i]of Object.entries(e.segments))if(i.vars)for(let[e,a]of Object.entries(i.vars))try{kI(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Cc(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>Oc(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return EI(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=pv(e,t);C.set(t,S(n,r))}let w=new Map(Ro.map(e=>[e,new Map])),ee=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of ee)for(let n of Ro){let r=t[n];if(!zo(r))continue;let i=`${e}.${n}`,a=w.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:NI(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:w,loadWarnings:_}}function NI(e,t,n){try{return e(n)}catch(e){throw Error(`${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function PI(e,t,n){let r=e.globalExpressions.get(t).get(n);if(r===void 0)throw Error(`the ${t} rule ${JSON.stringify(n)} reached the render but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r}function FI(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function II(e,t){return e.kind===`decided`?e.name:t}function LI(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(Qo(a.colorCompatibility));let{preset:d=cv}=s??{},f=mv(e,d),p=za[s?.variation??ts(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??Wo(`none`,e.styles),h=s?.theme??Ux(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(II(h,jo),II(m,Ho))),t.menuRuntime.action.chromeCols=LA(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=RA(a);let _=lb(n),v=Vo(h,e=>{let n=PI(t,`palette`,e);return Hx(FI(n,_),n.where,e=>u?.(e))}),y=Vo(m,n=>Wo(FI(PI(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=Bx(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,disclosure:u}=Oo(i,a,c),d=LF(t.activeSegment,e.name,e.id,i,u,l),f=vS(d,c,o.bg,o.fg,n),p=()=>_o(i,u,c).state;s&&(d.bg=p());let m=o.body.evaluate(n),h=d.drops.length>0||s;h&&(d.bg=p());let g=o.lead?.evaluate(n)??[],_=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return DF(i,p(),c)},get band(){return DF(i,_o(i,u,c).plane,c)},get close(){return kF(i,p(),c)},disclosure:u},fragments:m,lead:g,trail:_,drops:d.drops,open:h}}finally{t.activeSegment.current=null}},w=(e,t,r)=>{let i=t&&tF(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>w(e,t,Eo(r,n)),renderBody:(e,t,n)=>w(e,i&&t,Do(n)),closeDisclosure:e=>EF(n,e)};return EI(e.kind).render(e,o)},ee=t.roots.get(d);if(ee===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${cv}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let te=e=>{if(!tF(e.when,_))return!1;if(e.kind===`container`)return!0;if(cT(e.name)===void 0)return!1;try{return tF(t.segments[e.name].when,db(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>vI(ee,te).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=cT(e);return r===void 0?[]:[{name:r,address:t,palette:Rx(n.theme,x)}]})),w(ee,!0,To(p)).map(e=>zA(lF(e.cells,a),a)).join(`
|
|
200
|
+
`)}function*RI(e){yield*Object.entries(e.variables??{});for(let[t,n]of Object.entries(e.segments??{}))for(let[e,r]of Object.entries(n.vars??{}))yield[`${t}.${e}`,r]}function*zI(e){for(let t of Object.values(e.segments))for(let e of[t.template,t.bg,t.fg,t.when])e!==void 0&&(yield e);for(let t of uv(e.presets)){for(let n of pc(pv(e,t).node))n.when!==void 0&&(yield n.when);let n=mv(e,t);for(let e of Ro){let t=n[e];zo(t)&&(yield t)}}for(let[,t]of RI(e))t.kind===`template`&&(yield t.template),bc(t)&&t.cache&&`key`in t.cache&&(yield t.cache.key);for(let t of Object.values(e.actions))`copy`in t&&(yield t.copy),`open`in t&&(yield t.open),`preset`in t&&t.preset===`delete`&&(yield t.name)}function BI(e,t){return e===t||t.startsWith(`${e}.`)||e.startsWith(`${t}.`)}function VI(e,t){let n=new Set,r=new Set,i=new Set;for(let e of zI(t)){for(let r of ey(e,t.helpers).keys())n.add(r);for(let{name:n}of iy(e,t.helpers))r.add(n);for(let n of ay(e,t.helpers))i.add(n)}for(let[,e]of RI(t))if(bc(e)&&e.cache&&`depends_on`in e.cache)for(let t of e.cache.depends_on)n.add(t);let a=new Set(r);for(let e of r){let n=t.actions[e];if(n!==void 0&&`do`in n)for(let e of n.do)a.add(e)}let o=new Set,s=new Set;for(let e of a){let n=t.actions[e];if(n!==void 0&&(`set`in n&&o.add(n.set),`insertSegment`in n&&s.add(n.insertSegment),`insertSegmentFrom`in n&&Array.isArray(n.insertSegmentFrom)))for(let e of n.insertSegmentFrom)s.add(e)}for(let e of uv(t.presets))for(let n of pc(pv(t,e).node))n.kind===`segment`&&s.add(n.name);let c=(e,t)=>[...n].some(t=>BI(t,e))||t.kind===`state`&&o.has(t.key),l=e=>[...e].filter(e=>!sd(e)),u=(e,t,n)=>l(t).filter(e=>!n(e)).map(t=>({kind:e,name:t})),d=new Map(RI(e));return[...u(`variable`,d.keys(),e=>c(e,d.get(e))),...u(`action`,Object.keys(e.actions??{}),e=>a.has(e)),...u(`helper`,Object.keys(e.helpers??{}),e=>i.has(e)),...u(`segment`,Object.keys(e.segments??{}),e=>s.has(e))]}var HI=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,JI(e,t,n,`initial value`),this.cell=py.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){JI(this.name,this.type,e,`set value`),!Object.is(this.cell.get(),e)&&(this.cell.set(e),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}},UI=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,py.computed)(()=>{let e=n();return JI(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},WI=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=py.observable.box(qI(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=qI(e);KI(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function GI(e){return JSON.stringify(e)}function KI(e,t){return GI(e)===GI(t)}function qI(e){return e.kind===`ok`?{kind:`ok`,value:my(e.value)}:e}function JI(e,t,n,r){let i=hy(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var YI=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new HI(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new WI(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new UI(e,t,()=>n(r)))}read(e){return this.requireVar(e).read()}readDocument(e){let t=this.requireNode(e);if(t.kind!==`document`)throw TypeError(`Variable "${e}" is a ${t.kind}, not a document`);return t.read()}setDocument(e,t){let n=this.requireNode(e);if(n.kind!==`document`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a document (use defineDocument to create one)`);(0,py.runInAction)(()=>n.set(t))}setBox(e,t){let n=this.requireNode(e);if(n.kind!==`box`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a box (use defineBox to create a settable variable)`);(0,py.runInAction)(()=>n.set(t))}runInAction(e){(0,py.runInAction)(e)}has(e){return this.nodes.has(e)}getType(e){return this.requireVar(e).type}getKind(e){return this.requireNode(e).kind}changeKey(e){let t=this.requireNode(e);if(t.kind===`document`)return GI(t.read());try{return String(t.read())}catch(e){return`failed:${e instanceof Error?e.message:String(e)}`}}getNode(e){let t=this.requireNode(e);return t.kind===`document`?{name:t.name,kind:t.kind,read:()=>t.read(),lastUpdatedMs:()=>t.lastUpdatedMs()}:{name:t.name,type:t.type,kind:t.kind,read:()=>t.read(),lastUpdatedMs:()=>t.lastUpdatedMs()}}names(){return[...this.nodes.keys()]}requireNode(e){let t=this.nodes.get(e);if(!t)throw ReferenceError(`Unknown variable "${e}"`);return t}requireVar(e){let t=this.requireNode(e);if(t.kind===`document`)throw TypeError(`Variable "${e}" is a document; read its fields by path (.${e}.<field>)`);return t}assertNotDefined(e){if(this.nodes.has(e))throw Error(`Variable "${e}" is already declared`)}};function XI(e,{loaded:t,dropped:n}){Z(`info`,`config load ${e.join(` < `)||`<default>`}: plugins loaded=${t.length} dropped=${n.length}`+t.map(e=>` +${e}`).join(``)+n.map(e=>` -${e.path} (${e.reason})`).join(``))}function ZI(e,t,n){return e+`\0`+t+`\0`+(n??``)}function QI(e,t){return new Set(uv(e.presets).filter(n=>pv(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function $I(e,t){let n=new Map,{loaded:r,dropped:i}=e.state.plugins;for(let t of[...WE(e.projectDir,e.cwd,e.configFile),...r,...i.map(e=>e.path)]){let{dir:e,name:r}=ly(t);n.has(e)||n.set(e,new Set),n.get(e).add(r)}return{files:t,dirs:[...n.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({path:e,filenames:[...t].sort()}))}}function eL(e){return e.filter(Boolean).join(`
|
|
201
|
+
`)||null}function tL(e,t,n,r,i=()=>{}){let{layers:a,config:o}=gD(t.layers,Rj,{entered:i,warned:e=>n.push(...e)});i(a.length===1?a[0].path:null);let s=a.at(-1)?.config??Rj,c=a.find(e=>e.path===t.home)?.raw??{},l=new YI,u=new Sx(l,o.globals.default_empty_value??``,r.gitService,r.sessionState),d;try{d=MI(o,u,{cwd:e}),n.push(...d.loadWarnings),hN(o),Sj(o)}catch(e){throw u.dispose(),e}return{config:o,store:l,registry:u,compiled:d,neededInputPaths:EM(o),lastRenderCellsBySegment:new Map,authoredRoots:QI(s,c),fileHeldSettings:tN(c),unused:[...new Map(a.flatMap(e=>VI(e.raw,s)).map(e=>[`${e.kind}:${e.name}`,e])).values()],plugins:{loaded:a.flatMap(e=>e.plugins.loaded),dropped:a.flatMap(e=>e.plugins.dropped)}}}function nL(e,t,n,r){let i=KE(e,t,n),a={layers:i.kind===`chain`?i.layers:[],home:i.home},o=[ZE(e,t),YE(i)],s,c=null;try{s=tL(t,a,o,r,e=>{c=e})}catch(e){return e instanceof nc&&o.push(...e.warnings),{layers:a.layers,home:a.home,failedFile:c,warning:eL(o),state:null,error:e instanceof nc||e instanceof Error?e.message:String(e)}}return{layers:a.layers,home:a.home,warning:eL(o),state:s,error:null}}var rL=class{entries=new Map;deps;maxEntries;observers;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256,this.observers=t.observers??{}}getOrCreate(e,t,n){let r=ZI(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=nL(e,t,n,this.deps);a.state!==null&&XI(a.layers,a.state.plugins);let o={projectDir:e,cwd:t,configFile:n,configLayers:[],configHome:``,failedFile:null,lastError:a.error,lastWarning:a.warning,state:a.state??tL(t,{layers:[],home:``},[],this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=nL(e.projectDir,e.cwd,e.configFile,this.deps);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(XI(t.layers,t.state.plugins),e.state.registry.dispose(),e.state=t.state),this.refreshWatcher(e,t),this.observers.onReload?.(e)}refreshWatcher(e,t){e.configLayers=t.layers,e.configHome=t.home,e.failedFile=t.error===null?null:t.failedFile;let n=$I(e,t.layers),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const iL=16384;var aL=class{startedAt=new Date;requestsTotal=0;requestsErrored=0;requestsTimedOut=0;inFlight=0;watchersOpened=0;watchersClosed=0;watchersEvicted=0;subprocessTotal=0;subprocessInFlight=0;subprocessCount=new Map;subprocessHistogram=new Map;subprocessHistogramRotator=new Map;rollingTimestamps=[];rollingHead=0;launchStats={onStart:e=>{this.subprocessTotal++,this.subprocessInFlight++,this.subprocessCount.set(e,(this.subprocessCount.get(e)??0)+1),this.recordRollingNow()},onEnd:(e,t)=>{this.subprocessInFlight=Math.max(0,this.subprocessInFlight-1),this.recordDuration(e,t)}};recordRollingNow(){let e=Date.now();if(this.rollingTimestamps.length<iL){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%iL}recordDuration(e,t){let n=this.subprocessHistogram.get(e);if(n||(n=[],this.subprocessHistogram.set(e,n)),n.length<16){n.push(t);return}let r=(this.subprocessHistogramRotator.get(e)??0)%16;n[r]=t,this.subprocessHistogramRotator.set(e,r+1)}snapshotSubprocesses(){let e=Date.now()-6e4,t=0;for(let n of this.rollingTimestamps)n>=e&&t++;let n={};for(let[e,t]of this.subprocessCount)t>0&&(n[e]=t);let r={},i={};for(let[e,t]of this.subprocessHistogram){if(t.length===0)continue;let n=[...t].sort((e,t)=>e-t),a=Math.floor(n.length*.5),o=Math.min(n.length-1,Math.floor(n.length*.99)),s=n[a],c=n[o];s!==void 0&&(r[e]=s),c!==void 0&&(i[e]=c)}return{total:this.subprocessTotal,inFlight:this.subprocessInFlight,lastMinute:t,byCategory:n,p50DurationMs:r,p99DurationMs:i}}snapshot(e){let t=process.memoryUsage();return{pid:process.pid,version:qD,protocolVersion:3,startedAt:this.startedAt.toISOString(),uptimeSec:Math.floor((Date.now()-this.startedAt.getTime())/1e3),rssBytes:t.rss,heapUsedBytes:t.heapUsed,heapTotalBytes:t.heapTotal,externalBytes:t.external,arrayBuffersBytes:t.arrayBuffers,requests:{total:this.requestsTotal,errored:this.requestsErrored,timedOut:this.requestsTimedOut,inFlight:this.inFlight},gitCache:e.gitCache,usageCache:e.usageCache,renderCache:{size:e.renderCacheSize},watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null,handlerProbes:e.handlerProbes}}};function oL(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const sL={load:()=>({}),save:()=>{},flush:()=>{}};function cL(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var lL=class{sessions;storage;atom=(0,py.createAtom)(`SessionState`);constructor(e=sL,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=cL(this.storage.load()),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.get(t)??null):null}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,py.runInAction)(()=>{let n=this.sessions.get(e)??new Map;for(let{key:e,value:r}of t)n.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,py.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.delete(t),n.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,py.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};function uL(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let t of Object.values(e)){if(typeof t!=`object`||!t||Array.isArray(t))return!1;for(let e of Object.values(t))if(typeof e!=`string`)return!1}return!0}var dL=class{timer=null;pending=null;constructor(e,t=500,n=Bb){this.filePath=e,this.debounceMs=t,this.logger=n}load(){let e;try{e=r.readFileSync(this.filePath,`utf8`)}catch(e){let t=e.code;return t!==`ENOENT`&&this.logger(`warn`,`session-state read failed (${t}); starting empty`),{}}try{let t=JSON.parse(e);return uL(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(l.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const fL={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,preset:`string`,endcaps:`string`,variation:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},pL=new Set([`1`,`true`]),mL=new Set([`0`,`false`,``]);function hL(e,t){let n=BL(e),r=n.scope===`segment-palette`?`string`:fL[n.field];if(r===`string`)return JSON.stringify(t);if(r===`number`){let n=Number(t);if(!Number.isFinite(n))throw Error(`persistValueText: "${e}" expects a number, got "${t}"`);return String(n)}if(pL.has(t))return`true`;if(mL.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function gL(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function _L(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function vL(e){return/^\s*$/.test(e)?null:vs(e)}function yL(e,t){return e!==null&&bs(e,t)!==void 0}function bL(e){if(e.kind===`segment`)return e.when===void 0?e.name:{seg:e.name,when:e.when};if(e.kind===`container`){let{kind:t,direction:n,children:r,...i}=e;return{[n===`horizontal`?`h`:`v`]:r.map(bL),...i}}return e}function xL(e){if(!pl(e))return bL(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,bL(t)])),...n}}const SL=Ij,CL=SL.segments,wL=SL.presets,TL=SL.root;function EL(e,t,n,r){if(!yL(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function DL(e,t){let n=fS(t);return t.scope===`segment-palette`&&EL(e,[`segments`,t.segment],CL[t.segment],n.join(`.`)),n}function OL(e){return vs(Os(e))}function kL(){return Object.entries(TL.rows).map(([e,t])=>{let n=bL(t);return{path:[`root`],fragment:OL({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function AL(e,t){let n=e===null?void 0:bs(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function jL(e,t){if(t===void 0)return null;let n=xL(t);return{path:e,fragment:OL(n),unit:{path:e,value:n}}}function ML(e,t){let n=[`presets`,t],r=[...n,`root`],i=wL[t];EL(e,n,i,r.join(`.`));let a=AL(e,r)??jL(r,i?.root);return a!==null&&Ys(a.fragment)?a:null}function NL(e,t){let n=Js(t.fragment);return n===null?new Map([[`#`,{path:t.path,unit:t.unit,node:t.fragment}]]):new Map([...e,...n.map(e=>[e.key,{path:[...t.path,`rows`,e.key],unit:t.unit,node:e.value}])])}function PL(e,t){return[...kL(),AL(e,[`root`]),ML(e,t)].filter(e=>e!==null).reduce(NL,new Map)}function FL(e,t,n){for(let{node:r,...i}of PL(e,t).values())if(Zs(r,n))return i;throw new $(`${IL(e,t).join(`.`)} holds no placement "${n}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`)}function IL(e,t){return ML(e,t)?.path??[`root`]}function LL(e,t){return t.scope===`preset-root`?IL(e,t.preset):fS(t)}function RL(e,{unit:t}){return t===null?e:Hs(e,t.path,Os(t.value),Es)}function zL(e){let t=dS(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function BL(e){let t=zL(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function VL(e,t,n,r,i){i(t,n,QL(t,r)),_L(t.path,r,e.logger),e.record(t.path,n,r)}function HL(e,t,n){let r=GL(e,t,n);if(r.length>0)throw new $(`refused: ${e.above.join(`, `)} sets ${r.join(`, `)} over ${e.path}, so this click would change nothing on the bar — edit it there`)}const UL=()=>{};function WL(e,t){try{return t()}catch(t){throw!(t instanceof $)||e.above.length===0?t:new $(`${t.message} — or it is declared by ${e.above.join(`, `)}, which the bar does not edit`)}}function GL(e,t,n){let r=KL(e,t);if(r===null)return[];let i=new Set(XL(YL(r),YL(n)));return XL(JL(e,r),JL(e,n)).filter(e=>!i.has(e))}function KL(e,t){try{return qL(e,t)}catch(e){if(e instanceof nc)return null;throw e}}function qL(e,t){return gD(t===null?e.above:[e.path,...e.above],Rj,{entered:()=>{},warned:()=>{}},n=>n===e.path&&t!==null?t:r.readFileSync(n,`utf8`))}function JL(e,t){let[n]=t.layers;return n?.path===e.path?n.config:Rj}function YL(e){return e.layers.at(-1)?.config??Rj}function XL(e,t,n=``){return!ZL(e)||!ZL(t)?JSON.stringify(e)===JSON.stringify(t)?[]:[n]:[...new Set([...Object.keys(e),...Object.keys(t)])].flatMap(r=>XL(e[r],t[r],n===``?r:`${n}.${r}`))}function ZL(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function QL(e,t){try{return qL(e,t)}catch(e){throw e instanceof nc?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function $L(e,t){let n=BL(t),r=vL(gL(e)??``),i=r===null?void 0:bs(r,fS(n));return i!==void 0&&`value`in i?i.value:void 0}function eR(e,t,n){tR(e,t,n,[])}function tR(e,t,n,r){let i=gL(t.path),a=n.reduce((e,[t,n])=>Hs(e,DL(vL(e),BL(t)),hL(t,n),Es),i??``);VL(e,t,i,WL(t,()=>nR(a,t.path,r,e=>e)),HL)}function nR(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=FL(vL(s),n,i),l=tc(RL(s,c),c.path,i,a,Os(o));if(l===null)throw new $(`${c.path.join(`.`)} in ${t} has no placement "${i}" — the bar you clicked is stale (it reloads on the next render)`);return l},e)}function rR(e,t,n){let r=vL(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of PL(r,t)){if(!Zs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Ss(e,c):Os(s.value);if(a!==`#`)return Hs(e,[...i,`rows`,a],l,Es);if(ML(r,t)!==null)throw new $(`cannot give preset "${t}" its own copy of ${o.join(`.`)}: it already stages rows of its own over that tree`);return Hs(e,i,l,Es)}return e}function iR(e,t){return Ws(e,t,t[0]===`presets`&&t.length>2&&!Bj(t[1])?2:0)}function aR(e,t,n){let r=n.map(zL),i=gL(t.path);if(i===null)return;let a=r.reduce((e,t)=>iR(e,LL(vL(e),t)),i);a!==i&&VL(e,t,i,a,UL)}function oR(e){let t=e===null?void 0:bs(e,[`presets`]);return t?.kind===`object`?t.entries.map(e=>e.key):[]}function sR(e,t){let n=new Set([...zj,...oR(e),...t.above.flatMap(e=>Object.keys(at.default.parse(r.readFileSync(e,`utf8`)).presets??{}))].map(td));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(td(e)))}function cR(e,t,n,r,i,a){let o=gL(t.path),s=vL(o??``),c=sR(s,t),l=[`presets`,c],u=WL(t,()=>ML(s,n)),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Ss(o??``,u.fragment):Os(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],Os(r)]]],f=i.map(([e,t])=>{let n=uS(c,e);return[DL(s,BL(n)),hL(n,t)]}),p=[...d,...f].reduce((e,[t,n])=>Hs(e,t,n,Es),Hs(o??``,l,`{}`,Es));return VL(e,t,o,WL(t,()=>nR(p,t.path,a.map(e=>({...e,preset:c})),rR)),HL),c}function lR(e,t,n){if(Bj(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=gL(t.path),a=vL(i??``);if(i===null||a===null||bs(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t.path} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=bs(a,[`globals`,`preset`]);VL(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>iR(e,t),i),UL)}function uR(e,t,n,r){let i=zL(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=gL(t.path),o=r.op===`remove`?r.target:r.anchor,s=WL(t,()=>FL(vL(a??``),i.preset,o)),c=RL(a??``,s),{after:l,placed:u}=dR(c,s.path,r,()=>{let e=QL(t,c).config;return uv(e.presets).map(t=>pv(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t.path} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return VL(e,t,a,l,HL),u}function dR(e,t,n,r){switch(n.op){case`remove`:return{after:$s(e,t,n.target),placed:null};case`insert`:{let i=lj(n.segment,n.anchor,r());return{after:ec(e,t,i,n.anchor,n.relation),placed:i}}}}const fR={load:()=>({}),save:()=>{}},pR=new Set(Ex.map(e=>e.sessionKey)),mR=e=>pR.has(e)||e.startsWith(Pv),hR=8*1024*1024,gR={past:[],future:[]},_R=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var vR=class{state=new Map;constructor(e,t,n=fR){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??gR;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??gR}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(_R(n));r.set(_R(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:oL(this.sessionState,e=>mR(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:ER(i,n),o=r.get(e),s=o===void 0?a:AR(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,OR(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint — nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(_R)),a=n.net.filter(e=>!i.has(_R(e))),o=xR(jR(kR(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(NR).join(`, `)} changed since edit mode opened — kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=xR(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...CR(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(_R)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:jR(n,t),future:jR(i,t),...a!==void 0&&{savepoint:{at:jR([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(_R(e))),below:jR(a.below,t)}}}),new $(`${r}: ${o.map(NR).join(`, `)} changed since that edit — refusing to overwrite it; this session's undo history no longer steps it`)}let s=[];try{for(let r of t)this.write(e,r,r[n]),s.push(r);this.put(e,i)}catch(t){try{for(let t of s.reverse())this.write(e,t,t[a])}catch(e){throw Error(`${t.message}; and putting the step back failed, so it is half-applied: ${e.message}`)}throw t}}read(e,t){return t.kind===`session`?this.sessionState.get(e,t.key):gL(t.file)}write(e,t,n){t.kind===`file`?_L(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||yR(n)>hR;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,bR(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${hR} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function yR(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function bR({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...CR(n,1,[])}:{past:e,future:t.slice(1),...CR(n,0,[])}}function xR(e){return e.slice(-50)}const SR=e=>e===Iv.member;function CR(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:wR(e.net,n),below:e.below}}}function wR(e,t){let n=new Map(e.map(e=>[_R(e),e]));for(let e of t){let t=n.get(_R(e));n.set(_R(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const TR=e=>e.map(e=>({...e,before:e.after,after:e.before}));function ER(e,t){let n=[...e.past,t],r=xR(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...CR(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...DR(e.future,a),...i.below]},n.length-r.length,t)}}function DR(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function OR(e,t){return{past:e.past.slice(0,-1),future:xR([...e.future,t]),...CR(e.savepoint,0,TR(t))}}function kR(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...DR(r,t.at-i.length),...t.below]}function AR(e,t){if(SR(t.after)&&!SR(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!SR(t.after)&&SR(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function jR(e,t){return e.map(e=>e.filter(e=>!t.has(_R(e)))).filter(e=>e.length>0)}function MR(e){return e.map(NR).join(`, `)}function NR(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function PR(e){if(typeof e!=`object`||!e)return!1;let t=e,n=e=>e===null||typeof e==`string`;return(t.kind===`session`&&typeof t.key==`string`||t.kind===`file`&&typeof t.file==`string`)&&n(t.before)&&n(t.after)}function FR(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(PR))}function IR(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(PR)&&FR(t.below)}function LR(e){if(typeof e!=`object`||!e)return!1;let t=e;return FR(t.past)&&FR(t.future)&&(t.savepoint===void 0||IR(t.savepoint))}function RR(e,t){let n=e=>e.kind===`file`||mR(e.key)?!0:(t.add(e.key),!1),r=e=>e.map(e=>e.filter(n)).filter(e=>e.length>0),{savepoint:i}=e,a=r(e.past),o=r(e.future);return i===void 0?{past:a,future:o}:{past:a,future:o,savepoint:{at:r(e.past.slice(0,i.at)).length,net:i.net.filter(n),below:r(i.below)}}}function zR(e,t){return{load:()=>{let n;try{n=r.readFileSync(e,`utf8`)}catch(e){let n=e.code;return n!==`ENOENT`&&t(`warn`,`settings-history read failed (${n}); starting empty`),{}}try{let e=JSON.parse(n);if(typeof e==`object`&&e&&!Array.isArray(e)&&Object.values(e).every(LR)){let n=new Set,r=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,RR(t,n)]));return n.size>0&&t(`warn`,`settings-history load: dropped the changes to ${[...n].map(e=>`"${e}"`).join(`, `)}, no longer a setting`),r}}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}const BR=e=>!mR(e)&&!KS(e)&&e!==`update.dismissed`;var VR=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:oL(e,BR,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,py.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function HR(e){let t=JP(e,`doctor.tmux`,[`display`,`-p`,`-t`,e.pane,`#{client_termfeatures}`]);return t.kind===`ok`?{kind:`ok`,value:t.stdout.trim().split(`,`).filter(e=>e!==``)}:{kind:`failed`,reason:t.reason}}function UR(e){return{probeTmux:HR,loadConfig:e}}function WR(e,t){let n=e.loadConfig(t),r={layers:n.layers,warnings:n.warning===null?[]:n.warning.split(`
|
|
202
|
+
`)};return n.error===null?{...r,kind:`loaded`,unused:n.unused}:{...r,kind:`failed`,error:n.error}}function GR(e){let t=aC(e).env;if(t===void 0)return{path:e,env:{}};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: \`env\` is not an object`);return{path:e,env:t}}function KR(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function qR(e){return{kind:`arrived`,handler:e,bar:qD}}function JR(e,t,n){return{tmux:KR(e,t.tmux),config:WR(e,n),claudeSettings:GR(nC(tC(t.claudeConfigDir)))}}function YR(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=Hs(iC(n),[`env`,e.name],JSON.stringify(e.value),Ds);return r.mkdirSync(l.dirname(n),{recursive:!0}),Pe(n,i),{...t,claudeSettings:GR(n)}}default:return e.kind}}const XR={connectMs:200,budgetMs:500};async function ZR(e){let n=e.includes(`--json`),r=await QR();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${KD(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
|
|
203
|
+
`);return}t.stdout.write(nz(r.value))}function QR(){return BD({kind:`stats`},XR,e=>`stats`in e?e.stats:void 0)}function $R(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function ez(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function tz(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m${e%60}s`:`${Math.floor(e/3600)}h${Math.floor(e%3600/60)}m`}function nz(e){let t=[];t.push(`cc-candybar daemon stats`),t.push(``),t.push(`process`),t.push(` pid ${e.pid}`),t.push(` version ${e.version}`),t.push(` protocol ${e.protocolVersion}`),t.push(` startedAt ${e.startedAt}`),t.push(` uptime ${tz(e.uptimeSec)}`),t.push(` rss ${$R(e.rssBytes)}`),t.push(` heapUsed ${$R(e.heapUsedBytes)}`),t.push(` heapTotal ${$R(e.heapTotalBytes)}`),t.push(` external ${$R(e.externalBytes)}`),t.push(` arrayBuffers ${$R(e.arrayBuffersBytes)}`),t.push(``),t.push(`requests`),t.push(` total ${e.requests.total}`),t.push(` errored ${e.requests.errored}`),t.push(` timedOut ${e.requests.timedOut}`),t.push(` inFlight ${e.requests.inFlight}`),t.push(``),t.push(`gitCache`),t.push(` size ${e.gitCache.size}`),t.push(` hit rate ${ez(e.gitCache.hits,e.gitCache.misses)} (${e.gitCache.hits} / ${e.gitCache.hits+e.gitCache.misses})`),t.push(` invalidations ${e.gitCache.invalidations}`),t.push(``),t.push(`usageCache`),t.push(` size ${e.usageCache.size}`),t.push(` hit rate ${ez(e.usageCache.hits,e.usageCache.misses)} (${e.usageCache.hits} / ${e.usageCache.hits+e.usageCache.misses})`),t.push(` sweeps ${e.usageCache.sweeps}`),t.push(``),t.push(`renderCache`),t.push(` size ${e.renderCache.size}`),t.push(`watchers`),t.push(` active ${e.watchers.active}`),t.push(` opened ${e.watchers.opened}`),t.push(` closed ${e.watchers.closed}`),t.push(` evicted ${e.watchers.evicted}`),t.push(``),t.push(`subprocesses`),t.push(` total ${e.subprocesses.total}`),t.push(` inFlight ${e.subprocesses.inFlight}`),t.push(` lastMinute ${e.subprocesses.lastMinute}`);let n=Object.entries(e.subprocesses.byCategory),r=n.reduce((e,[t])=>Math.max(e,t.length),13);for(let[i,a]of n){let n=e.subprocesses.p50DurationMs[i],o=e.subprocesses.p99DurationMs[i],s=n!==void 0&&o!==void 0?` (p50 ${n}ms · p99 ${o}ms)`:``;t.push(` ${i.padEnd(r)} ${a}${s}`)}return e.nextRestartReason&&(t.push(``),t.push(`nextRestart ${e.nextRestartReason}`)),t.join(`
|
|
204
204
|
`)+`
|
|
205
|
-
`}const
|
|
206
|
-
`).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?
|
|
207
|
-
`);return{inMode:n!==`0`,screen:r}}function fz(e,t){let n=uz(e,`claude-input.type`,[`load-buffer`,`-b`,lz,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,lz,`-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 pz(){return{read:dz,type:fz}}function mz(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function hz(e){return gz(()=>decodeURIComponent(e))}function gz(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function _z(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 vz=(e,t)=>_z(hz(e),t),yz=(e,t)=>{let n=O({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,hz(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`})`)}},bz=(e,t)=>_z(hz(e),t),xz=(e,t)=>_z(hz(e),t),Sz=(e,t)=>{let n=mz(hz(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},Cz=(e,t)=>{let[n=``,...r]=gz(()=>sk(e)),i=mz(n),a=mN(Fz(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})}Dz(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})`)},wz=/^-?\d+$/;function Tz(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const Ez=(e,t)=>{let[n=``,r=``,i=``]=gz(()=>sk(e)),a=mz(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!wz.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=Fz(t,a),c=mN(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&&wz.test(u)?Oz(l,parseInt(u,10)):kz(`step-state`,r,l,_N(s,e=>t.sessionState.get(a,e),r)),f=Tz(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);Dz(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 Dz(e,t,n,r){let i=r.filter(e=>e.key.startsWith(Pv));if(i.length===0)return;let a=YM(Fz(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function Oz(e,t){return Math.max(e.min,Math.min(e.max,t))}function kz(e,t,n,r){if(r===null)return n.min;if(!wz.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return Oz(n,parseInt(r,10))}const Az=`render-origin`;function jz(e){return JSON.stringify(e)}function Mz(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 Nz(e,t){let n=e.sessionState.get(t,Az);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return Mz(n)}function Pz(e,t,n){let r=e.sessionState.get(t,Az);if(r===null)return;let i=Mz(r),a=Iz(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function Fz(e,t){return e.configFor(Nz(e,t))}function Iz(e){return qE(e.projectDir,e.cwd,e.configFile??void 0)}function Lz(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const Rz=(e,t)=>{let[n=``,r=``,i=``]=gz(()=>sk(e)),a=mz(n),o=Nz(t,a),s=t.configFor(o),c=xj(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=Iz(o),d=qM(s,e=>t.sessionState.get(a,e),r);UL(Lz(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u} (session=${a})`)},zz=(e,t)=>{let[n=``,r=``,i=``]=gz(()=>sk(e)),a=mz(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!wz.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=Nz(t,a),c=t.configFor(s),l=xj(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=Iz(s),f=qM(c,e=>t.sessionState.get(a,e),r),p=HL(d,f.key),m=typeof p==`number`?Oz(u,p):kz(`step-config`,r,u,Cj(f.globals,r)),h=Tz(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);UL(Lz(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}→${g.value} (by ${o}) → ${d} (session=${a})`)},Bz=(e,t)=>{let[n=``]=gz(()=>sk(e)),r=mz(n),i=Nz(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=GM(a,o),c=JM(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=mN(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]});Hz(`save`,l,c);let d=Iz(i);WL(Lz(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(Vz)].join(` `)} → ${d} (session=${r})`)},Vz=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Dc(e.value)}`;function Hz(e,t,n){for(let r of n){let n=t.validate(r.key,Dc(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const Uz=(e,t)=>{let[n=``]=gz(()=>sk(e)),r=mz(n),i=Nz(t,r),a=t.configFor(i),o=QM(a,e=>t.sessionState.get(r,e)),s=mN(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]});Hz(`save-preset`,s,o.placements);let l=Iz(i),u=XL(Lz(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...Ex.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,Tx.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(Vz)].join(` `)} → ${l} (session=${r})`)},Wz=(e,t)=>{let[n=``,r=``]=gz(()=>sk(e)),i=mz(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=Nz(t,i),o=Iz(a);ZL(Lz(t,i),o,r),t.reloadConfig(a);let s=Tx.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},Gz=(e,t)=>{let[n=``,...r]=gz(()=>sk(e)),i=mz(n),a=Nz(t,i),o=xj(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=Iz(a),l=r.map($M),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);JL(Lz(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} (session=${i})`)};function Kz(e,t){let n=(e,t)=>[...pc(pv(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(uv(t.presets).flatMap(e=>n(t,e).map(t=>Fv(td(e),lc(t)))));return uv(e.presets).flatMap(t=>n(e,t).map(e=>({member:Fv(td(t),lc(e)),node:e})).filter(({member:e})=>!r.has(e)))}function qz(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[kv]:[]])}const Jz=(e,t)=>{let[n=``,r=``,i=``]=gz(()=>sk(e)),a=mz(n),o=Nz(t,a),s=t.configFor(o),c=xj(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=sj(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=Iz(o),f=QL(Lz(t,a),d,r,u);t.reloadConfig(o);let p=qz(Kz(s,t.configFor(o)),t.sessionState.get(a,kv)).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} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},Yz=(e,t)=>{let[n=``]=gz(()=>sk(e)),r=mz(n);t.journal.commit();let i=t.history.undo(r);Pz(t,r,i),t.dlog(`info`,`undo: restored ${bR(i)} (session=${r})`)},Xz=(e,t)=>{let n=mz(hz(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,mN(Fz(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},Zz=(e,t)=>{let n=mz(hz(e));t.journal.commit();let r=t.history.rewind(n);Pz(t,n,r),t.dlog(`info`,`rewind: put back ${bR(r)||`nothing`} as edit mode found it (session=${n})`)},Qz=(e,t)=>{let[n=``]=gz(()=>sk(e)),r=mz(n);t.journal.commit();let i=t.history.redo(r);Pz(t,r,i),t.dlog(`info`,`redo: re-applied ${bR(i)} (session=${r})`)},$z=(e,t)=>{mz(hz(e)),t.applyUpdate()},eB=`client-hints`;function tB(e,t){let n=e.sessionState.get(t,eB);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 ED(r)}function nB(e,t,n){let r=FS(n);e.sessionState.setBatch(t,BS(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 rB(e,t){return{...IR(e.doctor,tB(e,t),Nz(e,t)),urlHandler:FR(e.clientVersion)}}const iB=(e,t)=>{let n=mz(hz(e));nB(t,n,rB(t,n))},aB=(e,t)=>{let n=YR(hz(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`}`)},oB=(e,t)=>{let[n=``,r=``]=gz(()=>sk(e)),i=mz(n),a=IS(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=rB(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=LR(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),nB(t,i,c)},sB=(e,t)=>{let[n=``,...r]=gz(()=>sk(e)),i=mz(n),a=Nz(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=_T(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=$j({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},tB(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},cB=(e,t)=>{let[n=``,r=``]=gz(()=>sk(e)),i=mz(n),a=Object.values(t.configFor(Nz(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=cz(t.claudeInput,tB(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})`)},lB=`config-override`,uB=new Map([[RO,vz],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=mz(gz(()=>decodeURIComponent(e.slice(0,n)))),i=gz(()=>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,lB),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,lB,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[zO,yz],[IO,Cz],[LO,Ez],[UO,Rz],[WO,zz],[JO,Gz],[GO,Bz],[KO,Uz],[qO,Wz],[YO,Jz],[XO,Yz],[ZO,Qz],[QO,Xz],[$O,Zz],[VO,bz],[HO,xz],[BO,Sz],[ek,$z],[tk,iB],[nk,oB],[rk,aB],[ik,sB],[ak,cB]]),dB=new Set([IO,LO,UO,WO,JO,GO,KO,qO,YO,XO,ZO,QO,$O,BO,ek,tk,nk,ik,ak]),fB=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of dk(lk(e))){if(!i&&dB.has(a)){let e=sk(o);e.length>0&&e[0]&&(i=e[0])}let e=uB.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(`
|
|
208
|
-
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function pB(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 mB=new Map([...uB,[FO,fB]].map(([e,t])=>[e,pB(t)]));Object.freeze([...mB.keys()]);const hB=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`]),gB=[[`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`]],_B=[[`workspace.added_dirs`,`string-list`]];function vB(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of gB){let i=xB(n,e);if(i==null)t.missingRequired.push(e);else{let n=yB(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of _B){let i=xB(n,e),a=i===void 0?r:bB(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))hB.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function yB(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function bB(e){return Array.isArray(e)&&e.every(e=>yB(e)===`string`)?`string-list`:yB(e)}function xB(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 SB(e,t){switch(e){case`vars`:return{what:e,vars:CB(t)};case`segments`:return{what:e,segments:OB(t)};case`config`:return{what:e,config:MB(t)}}}function CB(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=EB(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...wB(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:TB(r.lastUpdatedMs())})}return o}function wB(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 TB(e){return e===null?null:Math.max(0,Date.now()-e)}function EB(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,DB(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}`,DB(i));return t}function DB(e){return e.kind}function OB(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=AB(n),o=kB(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:jB(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function kB(e){let t=new Map;for(let n of uv(e.presets))for(let r of pc(pv(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=lc(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function AB(e){let t=[],n=new Set;for(let r of pc(gl(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 jB(e,t,n){let r=new Set;for(let i of ey(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 MB(e){return e===null?null:e.config}const NB=[`vars`,`segments`,`config`];function PB(e){return typeof e==`string`&&NB.includes(e)}function FB(e){return Math.max(1,e-2)}var IB=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 LB=new iL,RB=new qR;ke(LB.launchStats);const zB=new Hb({counters:LB,logger:Z}),BB=$P({watchers:zB,logger:Z}),{gitProvider:VB,usageStore:HB,mementoProvider:UB}=BB,WB=new cL,GB=new oR(WB,Z),KB=new kR,qB=new IB(Ze()),JB=new nL({gitService:VB,sessionState:WB,watchers:zB},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} file=${e.configFilePath??`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),YB=60*1e3;function XB(){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),fV(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,YB),a.unref())},checkNow:o}}const ZB=XB(),QB=IN({entryUrl:import.meta.url,intervalMs:YB,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>ZB.checkNow(),log:Z});let $B=null,eV=null,tV=0;function nV(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),fV(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),fV(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),fV(0)});try{tV=sO(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),fV(1);return}$B=sA(t.pid);let e=_A(yA($B));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),fV(1);return}eV=e.registryPath,r.mkdirSync(Re(),{recursive:!0}),He(ze()),WB.useStorage(new uL(Ge(),500,Z)),GB.useStorage(DR(Ke(),Z)),uA({anchor:lA(t.env),isAlive:dA,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),fV(0)}}),rV(x.createServer({allowHalfOpen:!1},e=>{pV(e)}),ze(),!1)}function rV(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),fV(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}iV(e,n)}),e.listen(n,()=>aV(n))}function iV(e,n){let i=Zk(Qk(Ue(n)),(e,t)=>oA(e,t,{readStartTime:aA,pidAlive:dA}));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}`),fV(1);return}}rV(e,n,!0)}function aV(e){let n=tA(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),fV(0);return}lV(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(tV/1048576)}MB`),wO();let i=qB.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),ZB.arm(),QB.arm(),cV(),oV(e,n.identity)}function oV(e,n){iA({bound:n,myPid:t.pid,readIdentity:()=>tA(e),readLease:()=>Qk(Ue(e)),shutdown:e=>fV(e),log:Z}).arm()}let sV=null;function cV(){sV=dO(hO(LB.startedAt.getTime(),e=>fV(e),{rssLimitBytes:tV})),sV.arm()}function lV(e){let n=$k(Ue(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:$B});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let uV=0,dV=!1;function fV(e){if(!dV){dV=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{VB.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{HB.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{zB.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{WB.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}eA(We(),t.pid),eV!==null&&vA(eV,t.pid,hA,e=>r.unlinkSync(e)),t.exit(e)}}function pV(e){uV++,LB.inFlight=uV;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:()=>fV(r);try{e.end(ID(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{LB.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=LD(e=>{hV(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),uV=Math.max(0,uV-1),LB.inFlight=uV})}const mV=e=>({resp:e,exitAfterFlush:null});async function hV(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return mV({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 mV({ok:!0,stats:LB.snapshot({gitCache:VB.getStats(),usageCache:HB.getStats(),renderCacheSize:JB.size,watchersActive:zB.size(),nextRestartReason:sV?.describeNextRestart()??null,handlerProbes:RB.list()})});if(e.kind===`render`){LB.requestsTotal++;let t=Date.now();try{let{report:n}=vB(e.hookData);for(let e of n.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let r=[];for(let e of n.missingRequired)r.push(`missing required field '${e}'`);for(let{path:e,expected:t,got:i}of n.typeMismatches)r.push(`field '${e}' expected ${t}, got ${i}`);if(e.cwd===``&&r.push(`request 'cwd' is empty`),r.length>0)return LB.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),mV({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=gV(e.args),s=e.hookData.session_id,c=ED(e),l=JSON.stringify(c);WB.get(s,`client-hints`)!==l&&WB.set(s,eB,l);let u=WB.get(s,`config-override`)??a??c.configEnv,d=JB.getOrCreate(i,e.cwd,u),f=jz({projectDir:i,cwd:e.cwd,configFile:u??null});WB.get(s,`render-origin`)!==f&&WB.set(s,Az,f);let p=c.termCols,m=FB(p??120),h=zA(c.termRows),{authoredRoots:g}=d.state,_=t=>WB.get(e.hookData.session_id,t),v=fM(d.state.config,_,e=>g.has(e)),y=await kM(e.hookData,{...xV,navigation:e=>KB.depth(e,WB,mN(d.state.config))},e.cwd,d.state.neededInputPaths(v.preset),v,c,{...tN(d.state.config,d.state.fileHeldSettings,_),configPath:d.configFilePath}),b=[],x=pM(v,m),S=II(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},mM(v)),C=WB.get(e.hookData.session_id,`click.error`);C&&WB.clear(e.hookData.session_id,`click.error`);let w=[o,d.lastError,C].filter(Boolean).join(`
|
|
209
|
-
`),ee=
|
|
210
|
-
`)),re=
|
|
211
|
-
`})}catch(e){throw
|
|
212
|
-
`);return}t.stdout.write(
|
|
213
|
-
`;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?``:` ${
|
|
205
|
+
`}const rz=e=>({kind:`ok`,value:e}),iz=e=>({kind:`failed`,reason:e});var az=class{arrivals=[];arrive(e){this.arrivals=[...this.arrivals,e].slice(-16)}list(){return this.arrivals}};const oz=/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;function sz(e){return oz.test(e)?e:null}function cz(e){let t=e.opener();if(t.kind===`failed`)return t;if(t.value===null)return rz(null);let n=t.value,r=e.script(n);if(r.kind===`failed`)return rz({app:n,missing:iz(`its script could not be read (${r.reason})`)});let i=Ik(r.value);return rz({app:n,missing:i===null?iz("its script is not one `cc-candybar install` wrote"):rz([i.node,i.script].filter(t=>!e.exists(t)))})}async function lz(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 uz(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(`${FO}://${ik}/${n}`);return(r===null?await lz(e,n):null)??{kind:`lost`,unopened:r,opener:cz(e)}}function dz(e,t,n){let r=O({bin:t,args:[...n],category:e,timeoutMs:5e3});return r.ok?rz(r.stdout):iz(r.stderr.trim()||r.error||r.reason)}const fz=`ObjC.import("AppKit");var u = $.NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL($.NSURL.URLWithString("${FO}://probe"));u.isNil() ? "" : u.path.js`;async function pz(){let e=await QR();if(e.kind!==`ok`)return iz(KD(e).split(`
|
|
206
|
+
`).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?rz({version:t,arrivals:n}):iz(`the running daemon (${t}) predates this check`)}function mz(){return{platform:process.platform,sockets:{own:ze(),handler:Be()},now:Date.now,nonce:ce,daemon:pz,open:e=>{let t=dz(`doctor.open`,`/usr/bin/open`,[`-g`,e]);return t.kind===`ok`?null:t.reason},pause:()=>new Promise(e=>setTimeout(e,100)),opener:()=>{let e=dz(`doctor.launch-services`,`/usr/bin/osascript`,[`-l`,`JavaScript`,`-e`,fz]);if(e.kind===`failed`)return e;let t=e.value.trim();return rz(t===``?null:t)},script:e=>dz(`doctor.osadecompile`,`/usr/bin/osadecompile`,[Lk(e)]),exists:r.existsSync}}const hz=/^─{20,}/,gz=/^❯(\s|$)/,_z=/›\s*stashed$/;function vz(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>hz.test(e)?[t]:[]).at(-2);return n===void 0||!gz.test(t[n+1]??``)?{kind:`no-prompt`}:_z.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const yz={"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 bz(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=vz(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:yz[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const xz=`cc-candybar-slash`;function Sz(e,t,n,r){let i=JP(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function Cz(e){let t=Sz(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(`
|
|
207
|
+
`);return{inMode:n!==`0`,screen:r}}function wz(e,t){let n=Sz(e,`claude-input.type`,[`load-buffer`,`-b`,xz,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,xz,`-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 Tz(){return{read:Cz,type:wz}}function Ez(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function Dz(e){return Oz(()=>decodeURIComponent(e))}function Oz(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function kz(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 Az=(e,t)=>kz(Dz(e),t),jz=(e,t)=>{let n=O({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,Dz(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`})`)}},Mz=(e,t)=>kz(Dz(e),t),Nz=(e,t)=>kz(Dz(e),t),Pz=(e,t)=>{let n=Ez(Dz(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},Fz=(e,t)=>{let[n=``,...r]=Oz(()=>ck(e)),i=Ez(n),a=hN(qz(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})}zz(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})`)},Iz=/^-?\d+$/;function Lz(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const Rz=(e,t)=>{let[n=``,r=``,i=``]=Oz(()=>ck(e)),a=Ez(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Iz.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=qz(t,a),c=hN(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&&Iz.test(u)?Bz(l,parseInt(u,10)):Vz(`step-state`,r,l,vN(s,e=>t.sessionState.get(a,e),r)),f=Lz(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);zz(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 zz(e,t,n,r){let i=r.filter(e=>e.key.startsWith(Pv));if(i.length===0)return;let a=XM(qz(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function Bz(e,t){return Math.max(e.min,Math.min(e.max,t))}function Vz(e,t,n,r){if(r===null)return n.min;if(!Iz.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return Bz(n,parseInt(r,10))}const Hz=`render-origin`;function Uz(e){return JSON.stringify(e)}function Wz(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 Gz(e,t){let n=e.sessionState.get(t,Hz);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return Wz(n)}function Kz(e,t,n){let r=e.sessionState.get(t,Hz);if(r===null)return;let i=Wz(r),{path:a}=Jz(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function qz(e,t){return e.configFor(Gz(e,t))}function Jz(e){return JE(e.projectDir,e.cwd,e.configFile??void 0)}function Yz(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const Xz=(e,t)=>{let[n=``,r=``,i=``]=Oz(()=>ck(e)),a=Ez(n),o=Gz(t,a),s=t.configFor(o),c=Sj(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=Jz(o),d=JM(s,e=>t.sessionState.get(a,e),r);eR(Yz(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u.path} (session=${a})`)},Zz=(e,t)=>{let[n=``,r=``,i=``]=Oz(()=>ck(e)),a=Ez(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!Iz.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=Gz(t,a),c=t.configFor(s),l=Sj(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=Jz(s),f=JM(c,e=>t.sessionState.get(a,e),r),p=$L(d.path,f.key),m=typeof p==`number`?Bz(u,p):Vz(`step-config`,r,u,wj(f.globals,r)),h=Lz(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);eR(Yz(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})`)},Qz=(e,t)=>{let[n=``]=Oz(()=>ck(e)),r=Ez(n),i=Gz(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=KM(a,o),c=YM(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=hN(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]});eB(`save`,l,c);let d=Jz(i);tR(Yz(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($z)].join(` `)} → ${d.path} (session=${r})`)},$z=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Dc(e.value)}`;function eB(e,t,n){for(let r of n){let n=t.validate(r.key,Dc(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const tB=(e,t)=>{let[n=``]=Oz(()=>ck(e)),r=Ez(n),i=Gz(t,r),a=t.configFor(i),o=$M(a,e=>t.sessionState.get(r,e)),s=hN(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]});eB(`save-preset`,s,o.placements);let l=Jz(i),u=cR(Yz(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...Ex.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,Tx.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map($z)].join(` `)} → ${l.path} (session=${r})`)},nB=(e,t)=>{let[n=``,r=``]=Oz(()=>ck(e)),i=Ez(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=Gz(t,i),o=Jz(a);lR(Yz(t,i),o,r),t.reloadConfig(a);let s=Tx.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o.path} (session=${i})`)},rB=(e,t)=>{let[n=``,...r]=Oz(()=>ck(e)),i=Ez(n),a=Gz(t,i),o=Sj(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=Jz(a),l=r.map(eN),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);aR(Yz(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 iB(e,t){let n=(e,t)=>[...pc(pv(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(uv(t.presets).flatMap(e=>n(t,e).map(t=>Fv(td(e),lc(t)))));return uv(e.presets).flatMap(t=>n(e,t).map(e=>({member:Fv(td(t),lc(e)),node:e})).filter(({member:e})=>!r.has(e)))}function aB(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[kv]:[]])}const oB=(e,t)=>{let[n=``,r=``,i=``]=Oz(()=>ck(e)),a=Ez(n),o=Gz(t,a),s=t.configFor(o),c=Sj(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=cj(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=Jz(o),f=uR(Yz(t,a),d,r,u);t.reloadConfig(o);let p=aB(iB(s,t.configFor(o)),t.sessionState.get(a,kv)).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})`)},sB=(e,t)=>{let[n=``]=Oz(()=>ck(e)),r=Ez(n);t.journal.commit();let i=t.history.undo(r);Kz(t,r,i),t.dlog(`info`,`undo: restored ${MR(i)} (session=${r})`)},cB=(e,t)=>{let n=Ez(Dz(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,hN(qz(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},lB=(e,t)=>{let n=Ez(Dz(e));t.journal.commit();let r=t.history.rewind(n);Kz(t,n,r),t.dlog(`info`,`rewind: put back ${MR(r)||`nothing`} as edit mode found it (session=${n})`)},uB=(e,t)=>{let[n=``]=Oz(()=>ck(e)),r=Ez(n);t.journal.commit();let i=t.history.redo(r);Kz(t,r,i),t.dlog(`info`,`redo: re-applied ${MR(i)} (session=${r})`)},dB=(e,t)=>{Ez(Dz(e)),t.applyUpdate()},fB=`client-hints`;function pB(e,t){let n=e.sessionState.get(t,fB);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 DD(r)}function mB(e,t,n){let r=FS(n);e.sessionState.setBatch(t,BS(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 hB(e,t){return{...JR(e.doctor,pB(e,t),Gz(e,t)),urlHandler:qR(e.clientVersion)}}const gB=(e,t)=>{let n=Ez(Dz(e));mB(t,n,hB(t,n))},_B=(e,t)=>{let n=sz(Dz(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`}`)},vB=(e,t)=>{let[n=``,r=``]=Oz(()=>ck(e)),i=Ez(n),a=IS(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=hB(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=YR(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),mB(t,i,c)},yB=(e,t)=>{let[n=``,...r]=Oz(()=>ck(e)),i=Ez(n),a=Gz(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=_T(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=eM({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},pB(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},bB=(e,t)=>{let[n=``,r=``]=Oz(()=>ck(e)),i=Ez(n),a=Object.values(t.configFor(Gz(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=bz(t.claudeInput,pB(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})`)},xB=`config-override`,SB=new Map([[zO,Az],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=Ez(Oz(()=>decodeURIComponent(e.slice(0,n)))),i=Oz(()=>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,xB),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,xB,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[BO,jz],[LO,Fz],[RO,Rz],[WO,Xz],[GO,Zz],[YO,rB],[KO,Qz],[qO,tB],[JO,nB],[XO,oB],[ZO,sB],[QO,uB],[$O,cB],[ek,lB],[HO,Mz],[UO,Nz],[VO,Pz],[tk,dB],[nk,gB],[rk,vB],[ik,_B],[ak,yB],[ok,bB]]),CB=new Set([LO,RO,WO,GO,YO,KO,qO,JO,XO,ZO,QO,$O,ek,VO,tk,nk,rk,ak,ok]),wB=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of fk(uk(e))){if(!i&&CB.has(a)){let e=ck(o);e.length>0&&e[0]&&(i=e[0])}let e=SB.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(`
|
|
208
|
+
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function TB(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 EB=new Map([...SB,[IO,wB]].map(([e,t])=>[e,TB(t)]));Object.freeze([...EB.keys()]);const DB=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`]),OB=[[`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`]],kB=[[`workspace.added_dirs`,`string-list`]];function AB(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of OB){let i=NB(n,e);if(i==null)t.missingRequired.push(e);else{let n=jB(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of kB){let i=NB(n,e),a=i===void 0?r:MB(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))DB.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function jB(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function MB(e){return Array.isArray(e)&&e.every(e=>jB(e)===`string`)?`string-list`:jB(e)}function NB(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 PB(e,t){switch(e){case`vars`:return{what:e,vars:FB(t)};case`segments`:return{what:e,segments:BB(t)};case`config`:return{what:e,config:WB(t)}}}function FB(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=RB(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...IB(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:LB(r.lastUpdatedMs())})}return o}function IB(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 LB(e){return e===null?null:Math.max(0,Date.now()-e)}function RB(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,zB(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}`,zB(i));return t}function zB(e){return e.kind}function BB(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=HB(n),o=VB(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:UB(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function VB(e){let t=new Map;for(let n of uv(e.presets))for(let r of pc(pv(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=lc(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function HB(e){let t=[],n=new Set;for(let r of pc(gl(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 UB(e,t,n){let r=new Set;for(let i of ey(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 WB(e){return e===null?null:e.config}const GB=[`vars`,`segments`,`config`];function KB(e){return typeof e==`string`&&GB.includes(e)}function qB(e){return Math.max(1,e-2)}var JB=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 YB=new aL,XB=new az;ke(YB.launchStats);const ZB=new Hb({counters:YB,logger:Z}),QB=eF({watchers:ZB,logger:Z}),{gitProvider:$B,usageStore:eV,mementoProvider:tV}=QB,nV=new lL,rV=new vR(nV,Z),iV=new VR,aV=new JB(Ze()),oV=new rL({gitService:$B,sessionState:nV,watchers:ZB},{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)}`)}}),sV=60*1e3;function cV(){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),wV(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,sV),a.unref())},checkNow:o}}const lV=cV(),uV=LN({entryUrl:import.meta.url,intervalMs:sV,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>lV.checkNow(),log:Z});let dV=null,fV=null,pV=0;function mV(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),wV(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),wV(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),wV(0)});try{pV=cO(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),wV(1);return}dV=cA(t.pid);let e=vA(bA(dV));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),wV(1);return}fV=e.registryPath,r.mkdirSync(Re(),{recursive:!0}),He(ze()),nV.useStorage(new dL(Ge(),500,Z)),rV.useStorage(zR(Ke(),Z)),dA({anchor:uA(t.env),isAlive:fA,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),wV(0)}}),hV(x.createServer({allowHalfOpen:!1},e=>{TV(e)}),ze(),!1)}function hV(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),wV(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}gV(e,n)}),e.listen(n,()=>_V(n))}function gV(e,n){let i=Qk($k(Ue(n)),(e,t)=>sA(e,t,{readStartTime:oA,pidAlive:fA}));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}`),wV(1);return}}hV(e,n,!0)}function _V(e){let n=nA(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),wV(0);return}xV(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(pV/1048576)}MB`),TO();let i=aV.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),lV.arm(),uV.arm(),bV(),vV(e,n.identity)}function vV(e,n){aA({bound:n,myPid:t.pid,readIdentity:()=>nA(e),readLease:()=>$k(Ue(e)),shutdown:e=>wV(e),log:Z}).arm()}let yV=null;function bV(){yV=fO(gO(YB.startedAt.getTime(),e=>wV(e),{rssLimitBytes:pV})),yV.arm()}function xV(e){let n=eA(Ue(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:dV});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let SV=0,CV=!1;function wV(e){if(!CV){CV=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{$B.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{eV.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{ZB.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{nV.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}tA(We(),t.pid),fV!==null&&yA(fV,t.pid,gA,e=>r.unlinkSync(e)),t.exit(e)}}function TV(e){SV++,YB.inFlight=SV;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:()=>wV(r);try{e.end(LD(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{YB.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=RD(e=>{DV(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),SV=Math.max(0,SV-1),YB.inFlight=SV})}const EV=e=>({resp:e,exitAfterFlush:null});async function DV(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return EV({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 EV({ok:!0,stats:YB.snapshot({gitCache:$B.getStats(),usageCache:eV.getStats(),renderCacheSize:oV.size,watchersActive:ZB.size(),nextRestartReason:yV?.describeNextRestart()??null,handlerProbes:XB.list()})});if(e.kind===`render`){YB.requestsTotal++;let t=Date.now();try{let{report:n}=AB(e.hookData);for(let e of n.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let r=[];for(let e of n.missingRequired)r.push(`missing required field '${e}'`);for(let{path:e,expected:t,got:i}of n.typeMismatches)r.push(`field '${e}' expected ${t}, got ${i}`);if(e.cwd===``&&r.push(`request 'cwd' is empty`),r.length>0)return YB.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),EV({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=OV(e.args),s=e.hookData.session_id,c=DD(e),l=JSON.stringify(c);nV.get(s,`client-hints`)!==l&&nV.set(s,fB,l);let u=nV.get(s,`config-override`)??a??c.configEnv,d=oV.getOrCreate(i,e.cwd,u),f=Uz({projectDir:i,cwd:e.cwd,configFile:u??null});nV.get(s,`render-origin`)!==f&&nV.set(s,Hz,f);let p=c.termCols,m=qB(p??120),h=BA(c.termRows),{authoredRoots:g}=d.state,_=t=>nV.get(e.hookData.session_id,t),v=pM(d.state.config,_,e=>g.has(e)),y=await AM(e.hookData,{...NV,navigation:e=>iV.depth(e,nV,hN(d.state.config))},e.cwd,d.state.neededInputPaths(v.preset),v,c,{...nN(d.state.config,d.state.fileHeldSettings,_),configPath:d.configLayers.includes(d.configHome)?d.configHome:null}),b=[],x=mM(v,m),S=LI(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},hM(v)),C=nV.get(e.hookData.session_id,`click.error`);C&&nV.clear(e.hookData.session_id,`click.error`);let w=[o,d.lastError,C].filter(Boolean).join(`
|
|
209
|
+
`),ee=uV.notice({sessionId:s,dismissed:nV.get(s,xN),enabled:v.updateNotice}),te=d.lastError===null?null:d.failedFile,ne=GA(w,ee,[d.lastWarning??``,...b].filter(Boolean).join(`
|
|
210
|
+
`)),re=aV.sync(s,ne===null?null:qA(ne));re!==null&&Z(`warn`,`diagnostic dump failed: ${re}`);let ie=JA(S,ne,{fullText:re===null?{kind:`file`,path:aV.pathFor(s)}:{kind:`unavailable`,reason:re},failedConfigFile:te},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=$B.getStats(),ae=eV.getStats();return Z(`info`,`render sid=${e.hookData.session_id??`?`} took=${T}ms termCols=${p??`?`} termRows=${c.termRows??`?`} width=${m} git=${E.size}/${E.hits}h/${E.misses}m usage=${ae.size}/${ae.hits}h/${ae.misses}m err=${w?`Y`:`N`} upd=${ee.length} warn=${d.lastWarning?`Y`:`N`}`),EV({ok:!0,output:ie+`
|
|
211
|
+
`})}catch(e){throw YB.requestsErrored++,e}}if(e.kind===`click`)return EV(PV(e.verb,e.value,FD(e.clientVersion)));if(e.kind===`debug`){if(!KB(e.what))return EV({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${GB.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=oV.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?MV(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):jV};return EV({ok:!0,debug:PB(e.what,n)})}return EV({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function OV(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:AD(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const kV={sessionState:nV,dlog:Z,applyUpdate:()=>uV.act(),doctor:UR(e=>{let t=[e.projectDir,e.cwd,e.configFile??void 0];oV.reload(...t);let n=oV.getOrCreate(...t);return{layers:n.configLayers,error:n.lastError,warning:n.lastWarning,unused:n.state.unused}}),probes:XB,memento:tV,claudeInput:Tz(),history:rV,navigation:iV,configFor:e=>oV.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>oV.reload(e.projectDir,e.cwd,e.configFile??void 0)};kV.reloadConfig;const AV={endcaps:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:Xo,width:1/0},jV=new Map;function MV(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,zA(a,{...AV,charset:t,colorCompatibility:n}));return r}const NV={...QB,clock:()=>new Date,history:e=>rV.depth(e)};function PV(e,t,n){let r=EB.get(e);if(!r)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return r(t,{...kV,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 FV={connectMs:200,budgetMs:500};async function IV(e,n){let r=n.includes(`--json`),i=await LV(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${KD(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
|
|
212
|
+
`);return}t.stdout.write(RV(i.value))}function LV(e){return BD({kind:`debug`,what:e},FV,e=>`debug`in e?e.debug:void 0)}function RV(e){switch(e.what){case`vars`:return zV(e.vars);case`segments`:return BV(e.segments);case`config`:return VV(e.config);default:return e}}function zV(e){if(e.length===0)return`no variables (DSL not active)
|
|
213
|
+
`;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?``:` ${UV(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${HV(a.value)}${e}${o}`)}return t.join(`
|
|
214
214
|
`)+`
|
|
215
|
-
`}function
|
|
215
|
+
`}function BV(e){if(e.length===0)return`no segments (DSL not active)
|
|
216
216
|
`;let t=[`segments (${e.length})`,``];for(let n of e){t.push(` ${n.name}`),n.description!==null&&t.push(` shows ${n.description}`),t.push(` template ${n.template}`),n.referencedVars.length>0&&t.push(` vars ${n.referencedVars.join(`, `)}`);for(let{id:e,lastRender:r}of n.placements)r!==null&&t.push(` last ${e}: ${r}`)}return t.join(`
|
|
217
217
|
`)+`
|
|
218
|
-
`}function
|
|
218
|
+
`}function VV(e){return e===null?`config: DSL not active
|
|
219
219
|
`:JSON.stringify(e,null,2)+`
|
|
220
|
-
`}function
|
|
220
|
+
`}function HV(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function UV(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function WV(){let e=KV();return e===null?null:r.readFileSync(e,`utf-8`)}function GV(){let e;try{e=WV()}catch(e){t.stderr.write(`schema: cannot read bundled schema: ${e instanceof Error?e.message:String(e)}\n`),t.exit(2)}e===null&&(t.stderr.write("schema: bundled schema not found (expected schema/cc-candybar.schema.json). Run `pnpm gen:schema` from a source checkout.\n"),t.exit(2)),t.stdout.write(e),t.exit(0)}function KV(){let e=l.join(`schema`,`cc-candybar.schema.json`),n=t.argv[1];if(n===void 0)return null;let i=l.dirname(l.resolve(n));for(;;){let t=l.join(i,e);if(r.existsSync(t))return t;let n=l.dirname(i);if(n===i)return null;i=n}}function qV(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const JV=5e3;function YV(e,t){let n=`/home/tester`,r=Math.floor(Date.now()/1e3),i=`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,a={current_dir:`${n}/code/cc-candybar/src`,project_dir:`${n}/code/cc-candybar`,added_dirs:[]};return{hook_event_name:`Status`,session_id:i,version:`1.15.0`,home:n,cwd:`${n}/code/cc-candybar/src`,transcript_path:`${n}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:a,git:{repoName:`cc-candybar`,repoUrl:`https://github.com/promptctl/cc-candybar`,branch:`main`,sha:`abc1234`,ahead:2,behind:1,staged:3,unstaged:2,untracked:1,conflicts:0,upstream:`origin/main`,stash:1,status:`dirty`,operation:`rebase`,timeSinceCommit:780},session:{cost:.39,tokens:241400},today:{cost:12.5,tokens:34e5},context:{totalTokens:48487,contextLeft:24},metrics:{lastResponseTime:8.2,responseTime:4.2,sessionDuration:930,messageCount:8,linesAdded:512,linesRemoved:88},block:{nativeUtilization:63,resetsAt:r+2*3600},weekly:{percentage:21,resetsAt:r+5*86400},cache:{expiresAt:r+900},tmux:{pane:`%0`,session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:dC(4e5,1e6),...gM(e),history:{undo:1,redo:1,sinceEdit:1},navigation:{back:1},unsaved:1,resettable:jx(()=>!0),resumeCommand:fM(a,i,void 0),configPath:t??`${n}/.config/cc-candybar/config.json5`}}function XV(e,t){let n=KE(e,e),r=YE(n);return r!==null&&t.push(r),n.kind===`chain`?n.layers:[]}async function ZV(e,n=t.cwd()){let i=[],a=e===void 0?null:l.resolve(UE(e)),o=a===null?XV(n,i):[a];if(a!==null){let e;try{e=r.statSync(a,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:a,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:a,message:`not a file`}}let s=ZE(n,n);s!==null&&i.push(s);try{return{kind:`clean`,layers:o,warnings:i,rendered:await eH(o,n,i)}}catch(e){let t=e;return typeof t==`object`&&t&&typeof t.code==`string`&&typeof t.path==`string`&&o.includes(t.path)&&typeof t.message==`string`?{kind:`unreadable`,path:t.path,message:t.message}:(e instanceof nc&&i.push(...e.warnings),{kind:`fatal`,layers:o,message:e instanceof nc||e instanceof Error?e.message:String(e),warnings:i})}}async function QV(e,t,n){let r=gD(e,Rj,{entered:()=>{},warned:e=>n.push(...e)}),{config:i}=r,a=new YI,o=new Sx(a,i.globals.default_empty_value??``,void 0,new lL);try{let s=MI(i,o,{cwd:t});n.push(...s.loadWarnings);let c=await o.settled(JV);return c.length>0&&n.push(`source${c.length===1?``:`s`} still running after ${JV} ms, rendered with fallback values: ${c.join(`, `)}`),{layers:e,droppedPlugins:r.layers.flatMap(e=>e.plugins.dropped),config:i,compiled:s,store:a,registry:o}}catch(e){throw o.dispose(),e}}function $V({layers:e,config:t,compiled:n,store:r,registry:i},a,o){let s=new Map;return{rendered:LI(t,n,r,i,YV(a,e.at(-1)??null),mM(a,o),{onSegmentError:(e,t)=>s.set(`segment "${e}"`,t),onRenderWarning:e=>s.set(`theme rule`,e)},hM(a)),failures:s}}async function eH(e,t,n){let r=await QV(e,t,n),{config:i}=r;try{let e=IN();try{hN(i),Sj(i)}finally{e()}let t=dv(null,i.globals.preset,i.presets),n=(e,t)=>{let n=pM(i,t=>t===`preset`?e:null,()=>t),a;try{a=$V(r,n,200)}catch(e){a={failures:new Map([[`render`,e instanceof Error?e.message:String(e)]])}}return{preset:e,customized:t,...a}},a=n(t,!1),o=[a,n(t,!0),...uv(i.presets).filter(e=>e!==t).flatMap(e=>[n(e,!1),n(e,!0)])],s=new Map;for(let{preset:e,customized:t,failures:n}of o)for(let[r,i]of n){let n=`${r}: ${i}`,a=s.get(n)??new Map;a.set(e,(a.get(e)??new Set).add(t)),s.set(n,a)}let c=[...s].map(([e,n])=>n.get(t)?.has(!1)?e:`${e} (under ${[...n].map(([e,n])=>[...e===t?[]:[`preset "${e}"`],...n.has(!1)?[]:[`.preset.customized = true`]].join(`, `)).join(`; `)})`),l=a.rendered,u=r.droppedPlugins.length,d=[...u>0?[`${u} listed plugin${u===1?``:`s`} did not load (named in the warnings)`]:[],...c.length>0||l===void 0?[`config renders with ${c.length} render error${c.length===1?``:`s`} (the daemon would show them on the bar):\n`+c.map(e=>` ${e}`).join(`
|
|
221
221
|
`)]:[]];if(d.length>0||l===void 0)throw Error(d.join(`
|
|
222
|
-
`));return l}finally{r.registry.dispose()}}function
|
|
223
|
-
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:
|
|
222
|
+
`));return l}finally{r.registry.dispose()}}function tH(e){return e.map(e=>`warning: ${e}\n`).join(``)}function nH(e,t=!1){switch(e.kind){case`clean`:return{stdout:`✓ ${e.layers.join(` < `)||`bundled default (no config file found)`}: config OK${e.warnings.length>0?` (${e.warnings.length} warning${e.warnings.length===1?``:`s`})`:``}\n`+(t?`${e.rendered}\n`:``),stderr:tH(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:tH(e.warnings)+`✗ ${e.layers.join(` < `)||`<default>`}\n${e.message}\n`,code:1};case`unreadable`:return{stdout:``,stderr:`check: cannot read ${e.path}: ${e.message}\n`,code:2}}}const rH=`--render`,iH=`Usage: cc-candybar check [${rH}] [config-file]\n`;function aH(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==rH);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${iH}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${iH}`}:{kind:`run`,target:n[0],render:t.includes(rH)}}async function oH(e){let n=aH(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:nH(await ZV(n.target??qV(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const sH=`${TA}${wA}`;function cH(e){return`${sH}⚠ cc-candybar: ${lH(e)}[0m\n`}function lH(e){switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`protocol mismatch (client v${e.clientV} ≠ daemon ${t})`}case`bad_request`:return`daemon rejected request: ${CA(e.message,60)}`;case`render_failed`:return`render failed: ${CA(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${CA(e.message,60)}`}}function uH(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
|
|
223
|
+
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:cH(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function dH(e,t){if(e!==void 0&&/^\+?\d+$/.test(e)){let t=Number(e);if(t>0&&t<=4294967295)return t}if(t&&t>0)return t}const fH=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`];function pH(e,t,n){return{termCols:dH(e.COLUMNS,n.columns),termRows:dH(e.LINES,n.rows),ssh:fH.some(t=>(e[t]??``)!==``),tmux:ES(e),configEnv:qV(e),claudeConfigDir:eC(e,t),mementoEnv:et(e,t)}}const mH=` (fix: click the settings menu (${El} by default) › 🧰 tools › 🩺 doctor, then [fix] on the bar)`;function hH({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:mH}\n`+(t.more??[]).map(e=>` ${e}\n`).join(``)}function gH(e){let t=nL(e.projectDir,e.cwd,e.configFile??void 0,{sessionState:new lL});return t.state?.registry.dispose(),{layers:t.layers,error:t.error,warning:t.warning,unused:t.state?.unused??[]}}async function _H(e,t,n,r,i=void 0){let a;try{a={...JR(e,{tmux:ES(n),claudeConfigDir:eC(n,r)},{projectDir:r,cwd:r,configFile:AD(i??qV(n))??null}),urlHandler:await uz(t)}}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let o=FS(a);return{stdout:o.map(hH).join(``),stderr:``,code:+!o.every(e=>e.verdict.ok)}}async function vH(e){(e.length>1||e[0]===``||e[0]?.startsWith(`--`))&&(t.stderr.write(`doctor: expected at most one config file
|
|
224
224
|
Usage: cc-candybar doctor [config-file]
|
|
225
|
-
`),t.exit(2));let n=t.cwd(),r=await
|
|
225
|
+
`),t.exit(2));let n=t.cwd(),r=await _H(UR(gH),mz(),t.env,n,e[0]===void 0?void 0:l.resolve(n,UE(e[0])));t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const yH=e=>e.some(e=>t.argv.includes(e));function bH(){console.log(CS)}async function xH(){try{yH(xS.help)&&(bH(),t.exit(0)),yH(xS.version)&&(console.log(`cc-candybar ${qD}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await Xk(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(Gk(),t.exit(0)),e===`url-handle`){await qk(t.argv[3]);return}if(e===`daemon`){mV();return}if(e===`daemon-stats`&&(await ZR(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await oH(t.argv.slice(3));return}if(e===`schema`){GV();return}if(e===`doctor`){await vH(t.argv.slice(3));return}KB(e)&&(await IV(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
|
|
226
226
|
|
|
227
227
|
cc-candybar is designed to be used as a Claude Code statusLine command.
|
|
228
228
|
It reads hook data from stdin and outputs formatted statusline.
|
|
@@ -238,4 +238,4 @@ Add to ~/.claude/settings.json:
|
|
|
238
238
|
Run with --help for more options.
|
|
239
239
|
|
|
240
240
|
To test output manually:
|
|
241
|
-
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar`),t.exit(1)),D(`Working directory: ${t.cwd()}`),D(`Process args:`,t.argv);let r=await n(t.stdin);D(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),
|
|
241
|
+
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar`),t.exit(1)),D(`Working directory: ${t.cwd()}`),D(`Process args:`,t.argv);let r=await n(t.stdin);D(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),bH(),t.exit(1));let i=uH(await ZD(r,t.argv,t.cwd(),pH(t.env,t.cwd(),t.stderr)));i.debug!==null&&D(i.debug),i.kick&&_O(),t.stdout.write(i.output),t.exit(0)}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`Error generating statusline:`,n),t.exit(1)}}xH();export{};
|