@promptctl/cc-candybar 1.94.0 → 1.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.mjs +43 -43
- package/package.json +5 -5
- package/schema/cc-candybar.schema.json +3 -0
package/dist/index.mjs
CHANGED
|
@@ -154,38 +154,38 @@ Config tooling:
|
|
|
154
154
|
config [--json] The effective merged config. (All three query the
|
|
155
155
|
running daemon; none spawn one.)
|
|
156
156
|
|
|
157
|
-
`,ob=`${Ml}live`,sb=[`☐ live`,`☑ live`],cb=`${Ml}done`,lb={variable:ob,key:ob,member:`open`},ub=`and ${bc(Yg)} (not ${bc(lb)})`,db=`{{ ${ub} }}`;function fb(e,t){return`{{ if ${ub} }}${e}{{ else }}${t}{{ end }}`}const pb=`{{ and ${bc(Yg)} .preset.customized }}`,mb=Fl,hb=`${Ml}addable`;function gb(e){return new Map([[hb,{members:Object.keys(e.segments).filter(e=>!mb(e))}]])}function _b(e,t,n){return n.segments[e]={template:t,when:Xg},{kind:`segment`,name:e}}function vb(e,t,n){let r=`${Ml}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ action "${r}" "🚫" }}`}function yb(e){return`{{ if ${bc(Yg)} }}${e.join(``)}{{ end }}`}function bb(e,t){return e.reduce((e,t)=>`{{ if ${bc(t)} }}true{{ else }}${e}{{ end }}`,t)}function xb(e){return e.flatMap(e=>[...os(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.mode`?[e.opens.ref]:[]))}function Sb(e,t,n){return`${qg}${e}.${t}.${n}`}function Cb(e,t,n,r,i){let a=_c(e.label),{domain:o}=e;if(o===`bool`)return i.actions[r]={set:t,cycle:[`false`,`true`]},`{{ action "${r}" "☐ ${a}" "☑ ${a}" }}`;if(o===`theme`)return i.actions[r]={set:t,from:Uy},`{{ "${a}" }} {{ carousel "${r}" }}`;if(`min`in o){for(let e of[-1,1])i.actions[`${r}.${e<0?`down`:`up`}`]={set:t,min:o.min,max:o.max,by:e};return`{{ action "${r}.down" "◀" }} {{ "${a}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`}return i.actions[r]={set:t,cycle:[...o]},`{{ action "${r}" ${o.map(e=>`"${a}: ${_c(e)}"`).join(` `)} }}`}function wb(e,t,n,r){let i=ns(n),a=`${Ml}${e.presetIdent}`,o=Jg(e.presetIdent,i),s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:Wg,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Sb(e.presetIdent,i,r),l=`${qg}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:ys(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`;return e.artifacts.segments[u]={template:Cb(o,s,l,u,e.artifacts)},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "⚙" }}`,ref:{variable:Wg,key:Wg,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const Tb=`${Ml}label:`;function Eb(e){if(e.startsWith(Tb)){let t=e.slice(Tb.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Db(e,t,n,r){let i=ns(e),a=`${Tb}${i}:${e.name}`;n.segments[a]={template:`{{ "${_c(i)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let o=e.settings?.[gs];return{...vc(a,r.ref,r.body,`drop`,bb([r.ref],db)),...o!==void 0&&{settings:{theme:o}},drafts:{[gs]:r.drafts[gs]}}}function Ob(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${Ml}${i}.insert.${t}`,s=`${Ml}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:hb,anchor:n,relation:r};let c=hg(o),l=gg(s,o,void 0),u=yg(l),d=vg(l,c);return a.variables[l]=Sc(l,pc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=Cc(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${bc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${Qi}`}) $m }}{{ end }}`}}function kb(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!mb(e.name)),i=e=>kb(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=as(o,i);if(mb(o.name)){n.push(s);continue}let c=ns(o),l=a===r?[Ob(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Ob(t,u,c,`after`),f=vb(t,u,c),p=t.segments[o.name],m=wb(t,u,o,_s(p)),h=yb([m.term,f]),g={kind:`container`,direction:`horizontal`,children:[...l.map(e=>_b(e.host,e.template,t.artifacts)),{...Db(o,p,t.artifacts,m),trail:h},{...s,when:fb(`false`,o.when??`true`),trail:h,drafts:m.drafts},_b(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[g]}:g)}return{...e,children:n,...e.when!==void 0&&{when:bb(xb(n),fb(`true`,e.when))}}}function Ab(e,t,n,r,i,a,o){let s=`${Ml}${n}.resetLayout`,c=`${Ml}${n}.customized`;i.actions[s]={reset:r};let l=_c(t);return i.segments[c]={template:`{{ action "${s}" "↺ ${l} customized" }}`,when:pb},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},jb(e,o)]}}function jb(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),jb(n,t)]}:{...e,children:[...e.children,t]}}function Mb(e,t,n,r,i){let{node:a}=kg(e,t),o={presetIdent:kl(t),rootKey:Xy(t),segments:e.segments,artifacts:n,posCounter:{n:0}};return Ab(kb(a,o),t,o.presetIdent,o.rootKey,n,r,i)}function Nb(e){let t={variables:{},actions:{},segments:{}},n=tb(`${Ml}help`,ib,[Yg],t);t.variables[ob]=Sc(ob,pc),t.actions[ob]=Cc(ob,lb.member),t.segments[ob]={template:xc(ob,...sb),when:Xg};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ob},n]};t.segments[cb]={template:`{{ action "${Gg}" "✎ done" }}`,when:Xg};let i={kind:`segment`,name:cb},a={...e.presets},o=[];for(let n of Eg(e.presets)){let s=Mb(e,n,t,i,r);o.push(s),a[n]={...Og(e.presets,n),root:s}}let s=ky(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Pb={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Fb(e){let t=e[Pb.socket]??``,n=e[Pb.pane]??``;if(t===``||n===``)return null;let r=e[Pb.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Ib=Pb.truecolor,Lb=[{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[Ib];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Ib} 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:Ib,value:`1`}}}}}}];function Rb(e){return Lb.map(t=>({check:t,verdict:t.probe(e)}))}function zb(e){return Lb.find(t=>t.name===e)}const Bb=`${Nl}doctor.`;function Vb(e){let t=`${Bb}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Hb(e){return e.flatMap(({check:e,verdict:t})=>{let n=Vb(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:Za}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?Za:Xa}]})}const Ub={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Wb(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,actions:Object.fromEntries(Object.entries(Ub).map(([t,n])=>[`${e}${t}`,n]))}}const Gb=`${Nl}menu`,Kb=`open`,qb=`${Nl}edit`,Jb=`${Nl}close`,Yb=`${Nl}toolbar`,Xb=Wb(Nl),Zb=`${Nl}config`,Qb=`${Nl}save`,$b=`${Nl}unsaved`,ex=`${Nl}preset.save`,tx=`${Nl}preset.delete`,nx=`${Nl}resetAll`,rx=`${nx}.arm`,ix=`${nx}.disarm`,ax=`armed`,ox=`disarmed`,sx=`${Gb}.toggle`,cx=`${Zb}.toggle`,lx={variable:Gb,key:Gb,member:Kb},ux={variable:Zb,key:Zb,member:Kb},dx=`${Nl}tools`,fx={variable:dx,key:dx,member:Kb},px=[{seg:`${Nl}undo`,depth:`undo`,action:{undo:!0},display:`↶ undo`},{seg:`${Nl}redo`,depth:`redo`,action:{redo:!0},display:`↷ redo`}],mx=e=>`${Nl}history.${e}`,hx=`${Nl}doctor`,gx=`${hx}.run`,_x=e=>`${hx}.fix.${e}`,vx=e=>`${hx}.${e}`,yx=`${Nl}pickers`,bx=[`{{ themePreview }}`],xx=[{name:`preset`,...Cy.preset,glyph:`▦`,domain:`presets`,beneath:[`{{ layoutPreview }}`,`{{ action "${ex}" "⊕ save as preset" }}{{ if not .preset.bundled }} {{ action "${tx}" (printf "🗑 delete %s" .${Cy.preset.effectiveVar}) }}{{ end }}`]}],Sx=[{name:`theme`,...Cy.theme,glyph:`🎨`,domain:`themes`,beneath:bx},{name:`look`,...Cy.look,glyph:`◐`,domain:`looks`,beneath:bx},{name:`style`,...Cy.style,glyph:`✦`,domain:`styles`,beneath:[]},{name:`progression`,...Cy.progression,glyph:`🎼`,domain:`progressions`,beneath:[`{{ layoutPreview }}`]},{name:`charset`,...Cy.charset,glyph:`🔣`,domain:`charsets`,beneath:[]},{name:`colorCompatibility`,...Cy.colorCompatibility,glyph:`🌈`,domain:`colorCompatibilities`,beneath:[]}],Cx={name:`wrap`,...Cy.autoWrap},wx={name:`padding`,...Cy.padding},Tx=`${Nl}${Cx.name}`,Ex=`${Nl}${wx.name}`,Dx=[...xx,...Sx],Ox=[...Dx,Cx,wx];new Set(Ox.flatMap(e=>[e.sessionKey,e.configKey]));const kx=e=>`${Nl}${e}`,Ax=e=>`${Nl}apply.${e}`,jx=e=>`${Nl}reset.${e}`,Mx=e=>`${Nl}carousel.${e}`,Nx=(e,t)=>`${Mx(e)}.${t}`,Px=_g(yx),Fx=e=>({variable:Px,key:Px,member:hg(Ax(e.name))});function Ix(e){return vc(kx(e.name),Fx(e),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:Mx(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:Nx(e.name,n)}))]},`drop`)}function Lx(e){return e===Gb}function Rx(e){let t={kind:`segment`,name:Gb};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[Rx(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 zx(e){return Bx(e)>0?e:Rx(e)}function Bx(e){let t=0;for(let n of os(e))n.kind===`segment`&&Lx(n.name)&&(t+=1);return t}function Vx(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&Lx(e.name)||e.opens!==void 0&&Vx(e.opens.body,!0):e.children.some(e=>Vx(e,n))}function Hx(e){return e.kind===`segment`?Lx(e.name)?vc(e.name,lx,{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:Yb},...xx.map(Ix),{kind:`segment`,name:Qb},vc(Zb,ux,{kind:`container`,direction:`horizontal`,children:[...Sx.map(Ix),{kind:`segment`,name:Tx},{kind:`segment`,name:Ex},{kind:`segment`,name:nx}]},`drop`),vc(dx,fx,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:hx},...Lb.map(e=>({kind:`segment`,name:vx(e.name)}))]},`drop`),{kind:`segment`,name:qb},...px.map(e=>({kind:`segment`,name:e.seg}))]},`inline`):e:Ux(e)}function Ux(e){return{...e,children:e.children.map(e=>Hx(e))}}function Wx(e){let t={variables:{[Gb]:Sc(Gb,pc)},actions:{[sx]:Cc(Gb,Kb),[Gb]:{do:[sx,ix]},[cx]:Cc(Zb,Kb),[Zb]:{do:[cx,ix]},[dx]:Cc(dx,Kb),[gx]:{doctor:`run`},[Jb]:{set:lx.key,to:pc},[qb]:{do:[Gg,Jb]},...Xb.actions,[Qb]:{save:!0},[ex]:{preset:`save`},[tx]:{preset:`delete`,name:`{{ .${Cy.preset.effectiveVar} }}`}},segments:{[Gb]:{template:xc(Gb,e,`❌`)},[Yb]:{template:Xb.template},[Qb]:{when:`{{ gt .${$b} 0 }}`,template:`{{ action "${Qb}" (printf "💾 save %d" .${$b}) }}`},[Zb]:{template:xc(Zb,`⚙ config ▸`,`⚙ config ▾`)},[dx]:{template:xc(dx,`🧰 tools ▸`,`🧰 tools ▾`)},[hx]:{template:`{{ action "${gx}" "🩺 doctor" }}`},[Tx]:{template:`{{ action "${Ax(`wrap`)}" "wrap: on" "wrap: off" }} {{ action "${jx(`wrap`)}" "↺" }}`},[Ex]:{template:`{{ action "${Ax(`padding`)}.down" "◀" }} padding {{ .${wx.effectiveVar} }} {{ action "${Ax(`padding`)}.up" "▶" }} {{ action "${jx(`padding`)}" "↺" }}`},[qb]:{template:`{{ action "${qb}" "✎ edit" "✎ done" }}`},[nx]:{template:`{{ if eq .${nx} "${ax}" }}{{ action "${nx}" "⟲ confirm reset all" }}{{ else }}{{ action "${rx}" "⟲ reset all" }}{{ end }}`}}};return t.variables[$b]={kind:`input`,path:`unsaved`,type:`number`,default:0},t.variables[Zb]=Sc(Zb,pc),t.variables[dx]=Sc(dx,pc),t.variables[nx]={kind:`state`,key:nx,default:ox},qx(t),Kx(t),Gx(t),t}function Gx(e){for(let t of px){let n=mx(t.depth);e.variables[n]={kind:`input`,path:`history.${t.depth}`,type:`number`,default:0},e.actions[t.seg]=t.action,e.segments[t.seg]={when:`{{ gt .${n} 0 }}`,template:`{{ action "${t.seg}" "${t.display}" }}`}}}function Kx(e){for(let t of Lb){let n=Vb(t.name),r=_x(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[vx(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${Xa}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function qx(e){for(let t of Dx){let n=Ax(t.name);e.actions[n]={set:t.sessionKey,from:t.domain},e.actions[jx(t.name)]={reset:t.configKey},Jx(t,e)}e.actions[Ax(Cx.name)]={set:Cx.sessionKey,cycle:[...Qa]},e.actions[jx(Cx.name)]={reset:Cx.configKey};for(let t of[-1,1])e.actions[`${Ax(wx.name)}.${t<0?`down`:`up`}`]={set:wx.sessionKey,...$a,by:t};e.actions[jx(wx.name)]={reset:wx.configKey},e.actions[rx]={set:nx,to:ax},e.actions[ix]={set:nx,to:ox},e.actions[nx]={do:[ix,...Ox.map(e=>jx(e.name))]}}function Jx(e,t){let n=Ax(e.name),r=Fx(e),i=vg(r.key,r.member);t.variables[r.key]=Sc(r.key,pc),t.actions[i]=Cc(r.key,r.member),t.segments[kx(e.name)]={template:`${e.glyph} {{ .${e.effectiveVar} }} ${xc(i,`▸`,`▾`)} {{ action "${jx(e.name)}" "↺" }}`},t.segments[Mx(e.name)]={template:`{{ carousel "${n}" }}`},e.beneath.forEach((n,r)=>{t.segments[Nx(e.name,r)]={template:n}})}function Yx(e){e.variables[Wg]=Sc(Wg,pc),e.actions[Gg]=Cc(Wg,Kg)}function Xx(e){let t=Wx(e.globals.menuGlyph??`🍫`);Yx(t);let n={...e.presets},r=[];for(let t of Eg(e.presets)){let{node:i}=kg(e,t),a=Hx(zx(i));r.push(a),n[t]={...Og(e.presets,t),root:a}}let i=ky(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const Zx=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function Qx(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function $x(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}const eS=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function tS(e){return typeof e==`string`&&eS.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 nS(e,t){if(t===void 0)return{};if(!ks(t))return Z(e,`actions`,`actions must be an object, got ${As(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=rS(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Z(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function rS(e,t,n){if(!ks(n))return Z(e,t,`${t} must be an action object, got ${As(n)}`),null;if(`persistWhen`in n)return Z(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=Zx.filter(e=>e in n);return r.length===1?iS[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${Zx.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const iS={set:(e,t,n)=>IS(e,t,n,`set`,MS),persist:(e,t,n)=>IS(e,t,n,`persist`,NS),copy:aS(`copy`),open:aS(`open`),reset:oS,undo:cS(`undo`),redo:cS(`redo`),save:cS(`save`),preset:lS,doctor:uS,ceiling:dS,slash:fS,do:pS};function aS(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=ws(t,n,r,e);return i===null?null:{[e]:i}}}function oS(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=mS(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 sS={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,save:`it saves the session's unsaved settings`};function cS(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Z(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${sS[e]}), got ${G(r[e])}`),null)}}function lS(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Z(e,`${t}.preset`,`preset must be "save" or "delete", got ${G(r)}`),null;if(r===`save`)return{preset:`save`};let a=ws(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function uS(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Z(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${G(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||zb(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Lb.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function dS(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Z(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${G(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Z(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${G(a)}`),null):{ceiling:`set`,to:a}}function fS(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=tS(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function pS(e,t,n){for(let r of Object.keys(n))r!==`do`&&Z(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===``)?(Z(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 ${G(r)}`),null):{do:r}}function mS(e,t,n,r,i,a){let o=ws(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const hS={set:`the SessionState key to write`,persist:`the config globals field to write`};function gS(e,t,n,r){let i=hS[r],a=mS(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 _S(e){return e===`set`?`set-state`:`set-config`}const vS={to:LS(`set`)},yS={to:LS(`persist`)},bS={from:RS(`set`)},xS={from:RS(`persist`)},SS={min:US(),max:US(),by:US()},CS={int:BS()},wS={cycle:zS(`set`)},TS={cycle:zS(`persist`)},ES={removeSegment:VS(`removeSegment`)},DS={insertSegment:VS(`insertSegment`),anchor:VS(`anchor`),relation:HS()},OS={insertSegmentFrom:RS(`persist`),anchor:VS(`anchor`),relation:HS()},kS={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},AS={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function jS(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>Ms(e,t,n,r),c=qs(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?Bs(s,...n):s}}const MS=[jS(`set`,vS),jS(`set`,bS),jS(`set`,SS,[kS,AS]),jS(`set`,CS),jS(`set`,wS)],NS=[jS(`persist`,yS),jS(`persist`,xS),jS(`persist`,SS,[kS,AS]),jS(`persist`,TS),jS(`persist`,ES),jS(`persist`,DS,[],[`insertSegment`]),jS(`persist`,OS,[],[`insertSegmentFrom`])];function PS(e){let t=[`"to" (a literal value)`,`"from" (an option domain — a registered domain name like "themes"/"styles"/"looks", 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 FS(e){let t=PS(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 IS(e,t,n,r,i){let a=gS(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${FS(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)||Z(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 LS(e){let t=_S(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>mS(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 RS(e){let t=_S(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===``){Z(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){Z(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===``)){Z(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){Z(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){Z(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Z(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${G(o)}`)}}}function zS(e){let t=_S(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`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${As(o)}`);return}let c=o;if(c.length<2){Z(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){Z(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(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){Z(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function BS(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Z(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${G(r[n])}`);return}return!0}}}function VS(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=ws(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(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 HS(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Z(e,`${t}.${n}`,`relation must be "before" or "after", got ${G(i)}`);return}return i}}}function US(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Z(e,`${t}.${n}`,`${n} must be an integer, got ${G(i)}`);return}return i}}}const WS={noun:`look key`,fields:{hueShift:Us(),chromaScale:Us({min:0}),lightnessScale:Us(),lightnessShift:Us()}};function GS(e,t){if(!ks(t))return e.issues.push({path:`looks`,message:`looks must be an object mapping look names to adaptation objects, got ${As(t)}`,line:W(e.source,[`looks`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`looks.${r}`,message:`look name ${JSON.stringify(r)} must be non-empty and slash-free — a look picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:W(e.source,[`looks`,r])});continue}let t=js(e,WS,`looks.${r}`,i);t!==null&&(n[r]={...On,...t})}return n}const KS={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:Su(e,`${t}.${n}`,r[n])},globals:{required:!1,json:Bc(),parse:(e,t,n,r)=>r[n]===void 0?void 0:zc(e,`${t}.${n}`,r[n])}}};function qS(e,t){if(!ks(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${As(t)}`,line:W(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:W(e.source,[`presets`,r])});continue}let t=js(e,KS,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function JS(e,t){if(t===void 0)return{};if(!ks(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${As(t)}`,line:W(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 ${G(i)}`,line:W(e.source,[`helpers`,r])});continue}n[r]=i}return n}function YS(e,t){let n=new Map;for(let e of Object.keys(t)){let t=kl(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:W(e.source,[`presets`])})}function XS(e,t,n){t.globals.look!==void 0&&!Oa(t.globals.look)&&!Object.prototype.hasOwnProperty.call(t.looks,t.globals.look)&&e.issues.push({path:`globals.look`,message:`globals.look "${t.globals.look}" does not match any declared look (have: ${Object.keys(t.looks).join(`, `)})`,line:W(e.source,[`globals`,`look`])}),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:W(e.source,[`globals`,`preset`])}),YS(e,t.presets);let r=Wy(t);for(let[n,i]of Object.entries(t.actions))!(`set`in i)||!(`from`in i)||typeof i.from!=`string`||Gy(r).includes(i.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${i.from}" (have: ${Gy(r).join(`, `)})`,line:W(e.source,[`actions`,n,`from`])});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&&$x(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:W(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=Qy(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Wc().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:W(e.source,[`actions`,n,a])});continue}let s=ZS.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:W(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){QS(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!Eg(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: ${Eg(t.presets).join(`, `)})`,line:W(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(`, `)})${zl(o.segment)}`,line:W(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:W(e.source,[`actions`,n,a])})}}let i=__(t);for(let t of i.names)t!==`settings`&&!t.startsWith($S)||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:W(e.source,[`variables`,t])});let a=(t,n,r)=>{Bx(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${Gb}" ${Bx(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}),Vx(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${Gb}" 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}),o(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 os(t)){if(e.kind!==`segment`)continue;let t=ns(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=is(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 o(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>o(n,t||ts[e.direction]===`cell`))}let s=(n,r)=>{for(let[a,o]of oc(n,r)){let n=W(e.source,o.split(`.`));if(a.when!==void 0&&(aC(e,`${o}.when`,a.when,i,{line:n}),iC(e,`${o}.when`,a.when,n)),a.kind===`segment`){if(Lx(a.name)){(a.id!==void 0||a.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${Gb}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${Gb}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,a.name)||e.issues.push({path:o,message:`${r} entry "${a.name}" does not match any declared segment${zl(a.name)}`,line:n}),tC(e,t,a,o,n)}}};n.root!==void 0&&s(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&s(t.root,`presets.${e}.root`);let c=new Map([[`root`,ic(t.root)]]);for(let e of Eg(t.presets)){let{node:n,path:r}=kg(t,e);c.set(r,n)}for(let[t,n]of c)a(n,t,W(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables))nC(e,`variables.${n}`,r,i);for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,a]of Object.entries(r.vars))nC(e,`segments.${n}.vars.${t}`,a,i,n);let a=_s(r),o=eC(i,a);for(let i of[`template`,`bg`,`fg`,`when`]){let s=r[i];if(typeof s==`string`){aC(e,`segments.${n}.${i}`,s,o,{segCtx:n,settings:a});for(let r of p_(s))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${i}`,message:`${i} references unknown action "${r}"`,line:W(e.source,[`segments`,n,i])});for(let r of h_(s))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${i}`,message:`${i} references unknown action "${r}" (in a picker, menu or carousel)`,line:W(e.source,[`segments`,n,i])})}}}for(let[n,r]of Object.entries(t.variables))rC(e,`variables.${n}`,r,i);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,a]of Object.entries(r.vars))rC(e,`segments.${n}.vars.${t}`,a,i,n)}const ZS=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function QS(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!Eg(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${Eg(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(`, `)})${zl(i)}`,line:c})},p=new Set(rs(kg(t,a).node)),m=(r,i)=>{!Rl.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${zl(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 $S=`settings.`;function eC(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>$S+e)])}}function tC(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=_s(a),s=`${r}: placement "${ns(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(`, `)})`:vs(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}, but it must be ${xs(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}}function nC(e,t,n,r,i){n.kind===`template`&&aC(e,`${t}.template`,n.template,r,{segCtx:i}),ps(n)&&n.cache&&`key`in n.cache&&aC(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function rC(e,t,n,r,i){if(ps(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:W(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function iC(e,t,n,r){try{Ug.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function aC(e,t,n,r,i){for(let[a,o]of d_(n,r.helpers)){if(g_(a,r))continue;if(a.startsWith($S)){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??W(e.source,t.split(`.`))});continue}if(o!==null){oC(e,o,a);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&g_(n,r)?` (segment-local vars are namespaced — write ".${n}")`:``;e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function oC(e,t,n){let r=`helpers.${t}`,i=`Template references unknown variable ".${n}"`;e.issues.some(e=>e.path===r&&e.message===i)||e.issues.push({path:r,message:i,line:W(e.source,[`helpers`,t])})}function sC(e,t){let{graph:n,nodeInfo:r}=cC(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:W(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function cC(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 d_(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),ps(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 lC=[`json5`,`json`];function uC(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function dC(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?f.homedir()+e.slice(1):e}function fC(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?lC.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...lC.map(e=>c.join(r,`.cc-candybar.${e}`)),...lC.map(e=>`${pC()}.${e}`)])]}function pC(){let e=process.env.XDG_CONFIG_HOME??c.join(f.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function mC(e,t,n){let r=[];for(let i of fC(e,t,n)){let e=uC(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 hC(e,t,n){let r=mC(e,t,n);return r.kind===`default`?`${pC()}.${lC[0]}`:r.path}function gC(e){return _C(e).join(`
|
|
158
|
-
`)||null}function
|
|
157
|
+
`,ob=`${Ml}live`,sb=[`☐ live`,`☑ live`],cb=`${Ml}done`,lb={variable:ob,key:ob,member:`open`},ub=`and ${bc(Yg)} (not ${bc(lb)})`,db=`{{ ${ub} }}`;function fb(e,t){return`{{ if ${ub} }}${e}{{ else }}${t}{{ end }}`}const pb=`{{ and ${bc(Yg)} .preset.customized }}`,mb=Fl,hb=`${Ml}addable`;function gb(e){return new Map([[hb,{members:Object.keys(e.segments).filter(e=>!mb(e))}]])}function _b(e,t,n){return n.segments[e]={template:t,when:Xg},{kind:`segment`,name:e}}function vb(e,t,n){let r=`${Ml}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ action "${r}" "🚫" }}`}function yb(e){return`{{ if ${bc(Yg)} }}${e.join(``)}{{ end }}`}function bb(e,t){return e.reduce((e,t)=>`{{ if ${bc(t)} }}true{{ else }}${e}{{ end }}`,t)}function xb(e){return e.flatMap(e=>[...os(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.mode`?[e.opens.ref]:[]))}function Sb(e,t,n){return`${qg}${e}.${t}.${n}`}function Cb(e,t,n,r,i){let a=_c(e.label),{domain:o}=e;if(o===`bool`)return i.actions[r]={set:t,cycle:[`false`,`true`]},`{{ action "${r}" "☐ ${a}" "☑ ${a}" }}`;if(o===`theme`)return i.actions[r]={set:t,from:Uy},`{{ "${a}" }} {{ carousel "${r}" }}`;if(`min`in o){for(let e of[-1,1])i.actions[`${r}.${e<0?`down`:`up`}`]={set:t,min:o.min,max:o.max,by:e};return`{{ action "${r}.down" "◀" }} {{ "${a}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`}return i.actions[r]={set:t,cycle:[...o]},`{{ action "${r}" ${o.map(e=>`"${a}: ${_c(e)}"`).join(` `)} }}`}function wb(e,t,n,r){let i=ns(n),a=`${Ml}${e.presetIdent}`,o=Jg(e.presetIdent,i),s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:Wg,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Sb(e.presetIdent,i,r),l=`${qg}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:ys(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`;return e.artifacts.segments[u]={template:Cb(o,s,l,u,e.artifacts)},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "⚙" }}`,ref:{variable:Wg,key:Wg,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const Tb=`${Ml}label:`;function Eb(e){if(e.startsWith(Tb)){let t=e.slice(Tb.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Db(e,t,n,r){let i=ns(e),a=`${Tb}${i}:${e.name}`;n.segments[a]={template:`{{ "${_c(i)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let o=e.settings?.[gs];return{...vc(a,r.ref,r.body,`drop`,bb([r.ref],db)),...o!==void 0&&{settings:{theme:o}},drafts:{[gs]:r.drafts[gs]}}}function Ob(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${Ml}${i}.insert.${t}`,s=`${Ml}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:hb,anchor:n,relation:r};let c=hg(o),l=gg(s,o,void 0),u=yg(l),d=vg(l,c);return a.variables[l]=Sc(l,pc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=Cc(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${bc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${Qi}`}) $m }}{{ end }}`}}function kb(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!mb(e.name)),i=e=>kb(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=as(o,i);if(mb(o.name)){n.push(s);continue}let c=ns(o),l=a===r?[Ob(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Ob(t,u,c,`after`),f=vb(t,u,c),p=t.segments[o.name],m=wb(t,u,o,_s(p)),h=yb([m.term,f]),g={kind:`container`,direction:`horizontal`,children:[...l.map(e=>_b(e.host,e.template,t.artifacts)),{...Db(o,p,t.artifacts,m),trail:h},{...s,when:fb(`false`,o.when??`true`),trail:h,drafts:m.drafts},_b(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[g]}:g)}return{...e,children:n,...e.when!==void 0&&{when:bb(xb(n),fb(`true`,e.when))}}}function Ab(e,t,n,r,i,a,o){let s=`${Ml}${n}.resetLayout`,c=`${Ml}${n}.customized`;i.actions[s]={reset:r};let l=_c(t);return i.segments[c]={template:`{{ action "${s}" "↺ ${l} customized" }}`,when:pb},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},jb(e,o)]}}function jb(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),jb(n,t)]}:{...e,children:[...e.children,t]}}function Mb(e,t,n,r,i){let{node:a}=kg(e,t),o={presetIdent:kl(t),rootKey:Xy(t),segments:e.segments,artifacts:n,posCounter:{n:0}};return Ab(kb(a,o),t,o.presetIdent,o.rootKey,n,r,i)}function Nb(e){let t={variables:{},actions:{},segments:{}},n=tb(`${Ml}help`,ib,[Yg],t);t.variables[ob]=Sc(ob,pc),t.actions[ob]=Cc(ob,lb.member),t.segments[ob]={template:xc(ob,...sb),when:Xg};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ob},n]};t.segments[cb]={template:`{{ action "${Gg}" "✎ done" }}`,when:Xg};let i={kind:`segment`,name:cb},a={...e.presets},o=[];for(let n of Eg(e.presets)){let s=Mb(e,n,t,i,r);o.push(s),a[n]={...Og(e.presets,n),root:s}}let s=ky(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Pb={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Fb(e){let t=e[Pb.socket]??``,n=e[Pb.pane]??``;if(t===``||n===``)return null;let r=e[Pb.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Ib=Pb.truecolor,Lb=[{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[Ib];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Ib} 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:Ib,value:`1`}}}}}}];function Rb(e){return Lb.map(t=>({check:t,verdict:t.probe(e)}))}function zb(e){return Lb.find(t=>t.name===e)}const Bb=`${Nl}doctor.`;function Vb(e){let t=`${Bb}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Hb(e){return e.flatMap(({check:e,verdict:t})=>{let n=Vb(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:Za}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?Za:Xa}]})}const Ub={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Wb(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,actions:Object.fromEntries(Object.entries(Ub).map(([t,n])=>[`${e}${t}`,n]))}}const Gb=`armed`,Kb=`disarmed`;function qb(e,t,n){let r=`${e}.arm`,i=`${e}.disarm`;return{template:`{{ if eq .${e} "${Gb}" }}{{ action "${e}" "${t.confirm}" }} {{ action "${i}" "✕" }}{{ else }}{{ action "${r}" "${t.arm}" }}{{ end }}`,actions:{[r]:{set:e,to:Gb},[i]:{set:e,to:Kb},[e]:{do:[i,...n]}},variables:{[e]:{kind:`state`,key:e,default:Kb}},disarm:i}}const Jb=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Yb(e){return typeof e==`string`&&Jb.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 Xb(e){let t=Yb(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Zb=[`/compact`,`/model`],Qb=`/clear`;function $b(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=qb(`${e}clear`,{arm:Qb,confirm:`${Qb} ✓ confirm`},[n]);return{template:Zb.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(Zb.map(e=>[t(e),{slash:Xb(e)}])),...r.actions,[n]:{slash:Xb(Qb)}},variables:r.variables,disarm:r.disarm}}const ex=`${Nl}menu`,tx=`open`,nx=`${Nl}edit`,rx=`${Nl}close`,ix=`${Nl}toolbar`,ax=Wb(Nl),ox=`${Nl}commands`,sx=$b(`${ox}.`),cx=`${Nl}config`,lx=`${Nl}save`,ux=`${Nl}unsaved`,dx=`${Nl}preset.save`,fx=`${Nl}preset.delete`,px=`${Nl}resetAll`,mx=`${ex}.toggle`,hx=`${cx}.toggle`,gx={variable:ex,key:ex,member:tx},_x={variable:cx,key:cx,member:tx},vx=`${Nl}tools`,yx={variable:vx,key:vx,member:tx},bx=[{seg:`${Nl}undo`,depth:`undo`,action:{undo:!0},display:`↶ undo`},{seg:`${Nl}redo`,depth:`redo`,action:{redo:!0},display:`↷ redo`}],xx=e=>`${Nl}history.${e}`,Sx=`${Nl}doctor`,Cx=`${Sx}.run`,wx=e=>`${Sx}.fix.${e}`,Tx=e=>`${Sx}.${e}`,Ex=`${Nl}pickers`,Dx=[`{{ themePreview }}`],Ox=[{name:`preset`,...Cy.preset,glyph:`▦`,domain:`presets`,beneath:[`{{ layoutPreview }}`,`{{ action "${dx}" "⊕ save as preset" }}{{ if not .preset.bundled }} {{ action "${fx}" (printf "🗑 delete %s" .${Cy.preset.effectiveVar}) }}{{ end }}`]}],kx=[{name:`theme`,...Cy.theme,glyph:`🎨`,domain:`themes`,beneath:Dx},{name:`look`,...Cy.look,glyph:`◐`,domain:`looks`,beneath:Dx},{name:`style`,...Cy.style,glyph:`✦`,domain:`styles`,beneath:[]},{name:`progression`,...Cy.progression,glyph:`🎼`,domain:`progressions`,beneath:[`{{ layoutPreview }}`]},{name:`charset`,...Cy.charset,glyph:`🔣`,domain:`charsets`,beneath:[]},{name:`colorCompatibility`,...Cy.colorCompatibility,glyph:`🌈`,domain:`colorCompatibilities`,beneath:[]}],Ax={name:`wrap`,...Cy.autoWrap},jx={name:`padding`,...Cy.padding},Mx=`${Nl}${Ax.name}`,Nx=`${Nl}${jx.name}`,Px=[...Ox,...kx],Fx=[...Px,Ax,jx];new Set(Fx.flatMap(e=>[e.sessionKey,e.configKey]));const Ix=e=>`${Nl}${e}`,Lx=e=>`${Nl}apply.${e}`,Rx=e=>`${Nl}reset.${e}`,zx=qb(px,{arm:`⟲ reset all`,confirm:`⟲ confirm reset all`},Fx.map(e=>Rx(e.name))),Bx=[zx,sx],Vx=e=>`${Nl}carousel.${e}`,Hx=(e,t)=>`${Vx(e)}.${t}`,Ux=_g(Ex),Wx=e=>({variable:Ux,key:Ux,member:hg(Lx(e.name))});function Gx(e){return vc(Ix(e.name),Wx(e),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:Vx(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:Hx(e.name,n)}))]},`drop`)}function Kx(e){return e===ex}function qx(e){let t={kind:`segment`,name:ex};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[qx(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 Jx(e){return Yx(e)>0?e:qx(e)}function Yx(e){let t=0;for(let n of os(e))n.kind===`segment`&&Kx(n.name)&&(t+=1);return t}function Xx(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&Kx(e.name)||e.opens!==void 0&&Xx(e.opens.body,!0):e.children.some(e=>Xx(e,n))}function Zx(e){return e.kind===`segment`?Kx(e.name)?vc(e.name,gx,{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ix},{kind:`segment`,name:ox},...Ox.map(Gx),{kind:`segment`,name:lx},vc(cx,_x,{kind:`container`,direction:`horizontal`,children:[...kx.map(Gx),{kind:`segment`,name:Mx},{kind:`segment`,name:Nx},{kind:`segment`,name:px}]},`drop`),vc(vx,yx,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:Sx},...Lb.map(e=>({kind:`segment`,name:Tx(e.name)}))]},`drop`),{kind:`segment`,name:nx},...bx.map(e=>({kind:`segment`,name:e.seg}))]},`inline`):e:Qx(e)}function Qx(e){return{...e,children:e.children.map(e=>Zx(e))}}function $x(e){let t={variables:{[ex]:Sc(ex,pc)},actions:{[mx]:Cc(ex,tx),[ex]:{do:[mx,...Bx.map(e=>e.disarm)]},[hx]:Cc(cx,tx),[cx]:{do:[hx,zx.disarm]},[vx]:Cc(vx,tx),[Cx]:{doctor:`run`},[rx]:{set:gx.key,to:pc},[nx]:{do:[Gg,rx]},...ax.actions,...sx.actions,[lx]:{save:!0},[dx]:{preset:`save`},[fx]:{preset:`delete`,name:`{{ .${Cy.preset.effectiveVar} }}`}},segments:{[ex]:{template:xc(ex,e,`❌`)},[ix]:{template:ax.template},[ox]:{template:sx.template},[lx]:{when:`{{ gt .${ux} 0 }}`,template:`{{ action "${lx}" (printf "💾 save %d" .${ux}) }}`},[cx]:{template:xc(cx,`⚙ config ▸`,`⚙ config ▾`)},[vx]:{template:xc(vx,`🧰 tools ▸`,`🧰 tools ▾`)},[Sx]:{template:`{{ action "${Cx}" "🩺 doctor" }}`},[Mx]:{template:`{{ action "${Lx(`wrap`)}" "wrap: on" "wrap: off" }} {{ action "${Rx(`wrap`)}" "↺" }}`},[Nx]:{template:`{{ action "${Lx(`padding`)}.down" "◀" }} padding {{ .${jx.effectiveVar} }} {{ action "${Lx(`padding`)}.up" "▶" }} {{ action "${Rx(`padding`)}" "↺" }}`},[nx]:{template:`{{ action "${nx}" "✎ edit" "✎ done" }}`},[px]:{template:zx.template}}};return t.variables[ux]={kind:`input`,path:`unsaved`,type:`number`,default:0},t.variables[cx]=Sc(cx,pc),t.variables[vx]=Sc(vx,pc),Object.assign(t.variables,sx.variables,zx.variables),nS(t),tS(t),eS(t),t}function eS(e){for(let t of bx){let n=xx(t.depth);e.variables[n]={kind:`input`,path:`history.${t.depth}`,type:`number`,default:0},e.actions[t.seg]=t.action,e.segments[t.seg]={when:`{{ gt .${n} 0 }}`,template:`{{ action "${t.seg}" "${t.display}" }}`}}}function tS(e){for(let t of Lb){let n=Vb(t.name),r=wx(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[Tx(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${Xa}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function nS(e){for(let t of Px){let n=Lx(t.name);e.actions[n]={set:t.sessionKey,from:t.domain},e.actions[Rx(t.name)]={reset:t.configKey},rS(t,e)}e.actions[Lx(Ax.name)]={set:Ax.sessionKey,cycle:[...Qa]},e.actions[Rx(Ax.name)]={reset:Ax.configKey};for(let t of[-1,1])e.actions[`${Lx(jx.name)}.${t<0?`down`:`up`}`]={set:jx.sessionKey,...$a,by:t};e.actions[Rx(jx.name)]={reset:jx.configKey},Object.assign(e.actions,zx.actions)}function rS(e,t){let n=Lx(e.name),r=Wx(e),i=vg(r.key,r.member);t.variables[r.key]=Sc(r.key,pc),t.actions[i]=Cc(r.key,r.member),t.segments[Ix(e.name)]={template:`${e.glyph} {{ .${e.effectiveVar} }} ${xc(i,`▸`,`▾`)} {{ action "${Rx(e.name)}" "↺" }}`},t.segments[Vx(e.name)]={template:`{{ carousel "${n}" }}`},e.beneath.forEach((n,r)=>{t.segments[Hx(e.name,r)]={template:n}})}function iS(e){e.variables[Wg]=Sc(Wg,pc),e.actions[Gg]=Cc(Wg,Kg)}function aS(e){let t=$x(e.globals.menuGlyph??`🍫`);iS(t);let n={...e.presets},r=[];for(let t of Eg(e.presets)){let{node:i}=kg(e,t),a=Zx(Jx(i));r.push(a),n[t]={...Og(e.presets,t),root:a}}let i=ky(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const oS=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function sS(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function cS(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function lS(e,t){if(t===void 0)return{};if(!ks(t))return Z(e,`actions`,`actions must be an object, got ${As(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=uS(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Z(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function uS(e,t,n){if(!ks(n))return Z(e,t,`${t} must be an action object, got ${As(n)}`),null;if(`persistWhen`in n)return Z(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=oS.filter(e=>e in n);return r.length===1?dS[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${oS.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const dS={set:(e,t,n)=>US(e,t,n,`set`,zS),persist:(e,t,n)=>US(e,t,n,`persist`,BS),copy:fS(`copy`),open:fS(`open`),reset:pS,undo:hS(`undo`),redo:hS(`redo`),save:hS(`save`),preset:gS,doctor:_S,ceiling:vS,slash:yS,do:bS};function fS(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=ws(t,n,r,e);return i===null?null:{[e]:i}}}function pS(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=xS(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 mS={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,save:`it saves the session's unsaved settings`};function hS(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Z(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${mS[e]}), got ${G(r[e])}`),null)}}function gS(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Z(e,`${t}.preset`,`preset must be "save" or "delete", got ${G(r)}`),null;if(r===`save`)return{preset:`save`};let a=ws(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function _S(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Z(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${G(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||zb(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Lb.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function vS(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Z(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${G(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Z(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${G(a)}`),null):{ceiling:`set`,to:a}}function yS(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=Yb(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function bS(e,t,n){for(let r of Object.keys(n))r!==`do`&&Z(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===``)?(Z(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 ${G(r)}`),null):{do:r}}function xS(e,t,n,r,i,a){let o=ws(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const SS={set:`the SessionState key to write`,persist:`the config globals field to write`};function CS(e,t,n,r){let i=SS[r],a=xS(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 wS(e){return e===`set`?`set-state`:`set-config`}const TS={to:WS(`set`)},ES={to:WS(`persist`)},DS={from:GS(`set`)},OS={from:GS(`persist`)},kS={min:XS(),max:XS(),by:XS()},AS={int:qS()},jS={cycle:KS(`set`)},MS={cycle:KS(`persist`)},NS={removeSegment:JS(`removeSegment`)},PS={insertSegment:JS(`insertSegment`),anchor:JS(`anchor`),relation:YS()},FS={insertSegmentFrom:GS(`persist`),anchor:JS(`anchor`),relation:YS()},IS={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},LS={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function RS(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>Ms(e,t,n,r),c=qs(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?Bs(s,...n):s}}const zS=[RS(`set`,TS),RS(`set`,DS),RS(`set`,kS,[IS,LS]),RS(`set`,AS),RS(`set`,jS)],BS=[RS(`persist`,ES),RS(`persist`,OS),RS(`persist`,kS,[IS,LS]),RS(`persist`,MS),RS(`persist`,NS),RS(`persist`,PS,[],[`insertSegment`]),RS(`persist`,FS,[],[`insertSegmentFrom`])];function VS(e){let t=[`"to" (a literal value)`,`"from" (an option domain — a registered domain name like "themes"/"styles"/"looks", 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 HS(e){let t=VS(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 US(e,t,n,r,i){let a=CS(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${HS(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)||Z(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 WS(e){let t=wS(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>xS(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 GS(e){let t=wS(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===``){Z(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){Z(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===``)){Z(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){Z(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){Z(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Z(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${G(o)}`)}}}function KS(e){let t=wS(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`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${As(o)}`);return}let c=o;if(c.length<2){Z(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){Z(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(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){Z(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function qS(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Z(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${G(r[n])}`);return}return!0}}}function JS(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=ws(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(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 YS(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Z(e,`${t}.${n}`,`relation must be "before" or "after", got ${G(i)}`);return}return i}}}function XS(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Z(e,`${t}.${n}`,`${n} must be an integer, got ${G(i)}`);return}return i}}}const ZS={noun:`look key`,fields:{hueShift:Us(),chromaScale:Us({min:0}),lightnessScale:Us(),lightnessShift:Us()}};function QS(e,t){if(!ks(t))return e.issues.push({path:`looks`,message:`looks must be an object mapping look names to adaptation objects, got ${As(t)}`,line:W(e.source,[`looks`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`looks.${r}`,message:`look name ${JSON.stringify(r)} must be non-empty and slash-free — a look picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:W(e.source,[`looks`,r])});continue}let t=js(e,ZS,`looks.${r}`,i);t!==null&&(n[r]={...On,...t})}return n}const $S={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:Su(e,`${t}.${n}`,r[n])},globals:{required:!1,json:Bc(),parse:(e,t,n,r)=>r[n]===void 0?void 0:zc(e,`${t}.${n}`,r[n])}}};function eC(e,t){if(!ks(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${As(t)}`,line:W(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:W(e.source,[`presets`,r])});continue}let t=js(e,$S,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function tC(e,t){if(t===void 0)return{};if(!ks(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${As(t)}`,line:W(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 ${G(i)}`,line:W(e.source,[`helpers`,r])});continue}n[r]=i}return n}function nC(e,t){let n=new Map;for(let e of Object.keys(t)){let t=kl(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:W(e.source,[`presets`])})}function rC(e,t,n){t.globals.look!==void 0&&!Oa(t.globals.look)&&!Object.prototype.hasOwnProperty.call(t.looks,t.globals.look)&&e.issues.push({path:`globals.look`,message:`globals.look "${t.globals.look}" does not match any declared look (have: ${Object.keys(t.looks).join(`, `)})`,line:W(e.source,[`globals`,`look`])}),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:W(e.source,[`globals`,`preset`])}),nC(e,t.presets);let r=Wy(t);for(let[n,i]of Object.entries(t.actions))!(`set`in i)||!(`from`in i)||typeof i.from!=`string`||Gy(r).includes(i.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${i.from}" (have: ${Gy(r).join(`, `)})`,line:W(e.source,[`actions`,n,`from`])});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&&cS(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:W(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=Qy(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Wc().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:W(e.source,[`actions`,n,a])});continue}let s=iC.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:W(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){aC(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!Eg(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: ${Eg(t.presets).join(`, `)})`,line:W(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(`, `)})${zl(o.segment)}`,line:W(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:W(e.source,[`actions`,n,a])})}}let i=__(t);for(let t of i.names)t!==`settings`&&!t.startsWith(oC)||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:W(e.source,[`variables`,t])});let a=(t,n,r)=>{Yx(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${ex}" ${Yx(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}),Xx(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${ex}" 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}),o(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 os(t)){if(e.kind!==`segment`)continue;let t=ns(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=is(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 o(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>o(n,t||ts[e.direction]===`cell`))}let s=(n,r)=>{for(let[a,o]of oc(n,r)){let n=W(e.source,o.split(`.`));if(a.when!==void 0&&(fC(e,`${o}.when`,a.when,i,{line:n}),dC(e,`${o}.when`,a.when,n)),a.kind===`segment`){if(Kx(a.name)){(a.id!==void 0||a.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${ex}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${ex}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,a.name)||e.issues.push({path:o,message:`${r} entry "${a.name}" does not match any declared segment${zl(a.name)}`,line:n}),cC(e,t,a,o,n)}}};n.root!==void 0&&s(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&s(t.root,`presets.${e}.root`);let c=new Map([[`root`,ic(t.root)]]);for(let e of Eg(t.presets)){let{node:n,path:r}=kg(t,e);c.set(r,n)}for(let[t,n]of c)a(n,t,W(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables))lC(e,`variables.${n}`,r,i);for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,a]of Object.entries(r.vars))lC(e,`segments.${n}.vars.${t}`,a,i,n);let a=_s(r),o=sC(i,a);for(let i of[`template`,`bg`,`fg`,`when`]){let s=r[i];if(typeof s==`string`){fC(e,`segments.${n}.${i}`,s,o,{segCtx:n,settings:a});for(let r of p_(s))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${i}`,message:`${i} references unknown action "${r}"`,line:W(e.source,[`segments`,n,i])});for(let r of h_(s))Object.prototype.hasOwnProperty.call(t.actions,r)||e.issues.push({path:`segments.${n}.${i}`,message:`${i} references unknown action "${r}" (in a picker, menu or carousel)`,line:W(e.source,[`segments`,n,i])})}}}for(let[n,r]of Object.entries(t.variables))uC(e,`variables.${n}`,r,i);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,a]of Object.entries(r.vars))uC(e,`segments.${n}.vars.${t}`,a,i,n)}const iC=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function aC(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!Eg(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${Eg(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(`, `)})${zl(i)}`,line:c})},p=new Set(rs(kg(t,a).node)),m=(r,i)=>{!Rl.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${zl(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 oC=`settings.`;function sC(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>oC+e)])}}function cC(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=_s(a),s=`${r}: placement "${ns(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(`, `)})`:vs(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}, but it must be ${xs(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}}function lC(e,t,n,r,i){n.kind===`template`&&fC(e,`${t}.template`,n.template,r,{segCtx:i}),ps(n)&&n.cache&&`key`in n.cache&&fC(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function uC(e,t,n,r,i){if(ps(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:W(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function dC(e,t,n,r){try{Ug.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function fC(e,t,n,r,i){for(let[a,o]of d_(n,r.helpers)){if(g_(a,r))continue;if(a.startsWith(oC)){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??W(e.source,t.split(`.`))});continue}if(o!==null){pC(e,o,a);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&g_(n,r)?` (segment-local vars are namespaced — write ".${n}")`:``;e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function pC(e,t,n){let r=`helpers.${t}`,i=`Template references unknown variable ".${n}"`;e.issues.some(e=>e.path===r&&e.message===i)||e.issues.push({path:r,message:i,line:W(e.source,[`helpers`,t])})}function mC(e,t){let{graph:n,nodeInfo:r}=hC(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:W(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function hC(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 d_(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),ps(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 gC=[`json5`,`json`];function _C(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function vC(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?f.homedir()+e.slice(1):e}function yC(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?gC.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...gC.map(e=>c.join(r,`.cc-candybar.${e}`)),...gC.map(e=>`${bC()}.${e}`)])]}function bC(){let e=process.env.XDG_CONFIG_HOME??c.join(f.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function xC(e,t,n){let r=[];for(let i of yC(e,t,n)){let e=_C(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 SC(e,t,n){let r=xC(e,t,n);return r.kind===`default`?`${bC()}.${gC[0]}`:r.path}function CC(e){return wC(e).join(`
|
|
158
|
+
`)||null}function wC(e){switch(e.kind){case`file`:case`default`: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 TC(e,t){let n=yC(e,t).filter(e=>_C(e)===`present`),r=new Map;for(let e of n){let t=c.dirname(e),n=c.basename(e).replace(/\.(json5|json)$/,``),i=c.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 EC(e,t,n){return e===null?{...OC,config:lc(OC.raw,t)}:DC(e,r.readFileSync(e,`utf-8`),t,n)}function DC(e,t,n,r){let i={source:t,...jC(e,t,r,Ql(n))};return{...i,config:lc(i.raw,n)}}const OC={raw:{},source:``,warnings:[]};function kC({config:e,raw:t,source:n},r=`<config>`,i=new Set(Sa())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(rC(o,e,t),mC(o,e),a.length>0)throw new Yo(r,a);let s=Hg(e,a);if(a.length>0)throw new Yo(r,a);return Nb(aS(s))}function AC(e,t,n=new Set(Sa()),r=MC){return jC(e,t,n,r).raw}function jC(e,t,n,r){let i=NC(e,t),a=Qo(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(Sa()),groups:[]};if(!ks(i))throw new Yo(e,[{path:``,message:`Config root must be an object, got ${As(i)}`}],o);let l=PC(c,i,r);if(s.length>0)throw new Yo(e,s,o);return{raw:l,warnings:o}}const MC=new Set;function NC(e,t){try{return Xe.default.parse(t)}catch(t){let n=t;throw new Yo(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function PC(e,t,n){for(let n of Object.keys(t))FC.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...FC].join(`, `)}`,line:W(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Rc(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=il(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=$l(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.
|
|
159
159
|
Replace: layout: [["seg1", "seg2"], ["seg3"]]
|
|
160
160
|
With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
|
|
161
|
-
Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=Su(e,`root`,t.root)),t.actions!==void 0&&(r.actions=
|
|
162
|
-
`)}function
|
|
163
|
-
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const
|
|
164
|
-
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function
|
|
165
|
-
`)}function
|
|
166
|
-
`)}]}function
|
|
167
|
-
`),process.exit(1));let t;try{t=
|
|
168
|
-
`),process.exit(1)}function
|
|
161
|
+
Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=Su(e,`root`,t.root)),t.actions!==void 0&&(r.actions=lS(e,t.actions)),t.looks!==void 0&&(r.looks=QS(e,t.looks)),t.presets!==void 0&&(r.presets=eC(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Vc(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=tC(e,t.helpers)),Au(e,r),Bg(e,r),$g(e,r),Ll(e,r,Nl,`the global settings menu`),r}const FC=new Set([`globals`,`variables`,`segments`,`layout`,`root`,`actions`,`looks`,`presets`,`editGlobals`,`helpers`]);function IC(e){let t=VC(e.termCols),n=VC(e.termRows),r=HC(e.ssh),i=zC(e.tmux),a=RC(e.configEnv),o=LC(e.claudeConfigDir);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}}}function LC(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function RC(e){return typeof e==`string`&&e!==``?vC(e):void 0}function zC(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 BC=1e4;function VC(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>BC?BC:t}function HC(e){return typeof e==`boolean`?e:void 0}var UC=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function WC(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function GC(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 UC(`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 UC(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function KC(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=GC(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(WC(t))})}async function qC(e,t,n){let r=null;try{r=await QC(Ne(),t.connectMs);let i=await KC(r,{v:3,...e},t.budgetMs);return XC(e.kind,i,n)}catch(e){return ZC(e)}finally{r&&r.destroy()}}function JC(e,t){return typeof e==`string`?e:t}function YC(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function XC(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=JC(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:YC(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 ZC(e){if(e instanceof UC||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 QC(e,t){return new Promise((n,r)=>{let i=g.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function $C(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 ew={connectMs:50,budgetMs:150},tw={connectMs:50,budgetMs:200};function nw(e){let t=e.output;return typeof t==`string`?t:void 0}function rw(e,t,n,r){return qC({kind:`render`,hookData:e,args:t,cwd:n,...r},ew,nw)}function iw(e,t){return qC({kind:`click`,verb:e,value:t},tw,nw)}let aw=null;function ow(e){if(aw!==null)return aw;r.mkdirSync(c.dirname(e),{recursive:!0});try{aw=r.statSync(e).size}catch{aw=0}return aw}function sw(e){for(let t=2;t>=1;t--){let n=`${e}.${t}`,i=`${e}.${t+1}`;try{r.renameSync(n,i)}catch{}}try{r.renameSync(e,`${e}.1`)}catch{}aw=0}function Q(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=Ge(),t=ow(e);r.appendFileSync(e,n),aw=t+Buffer.byteLength(n,`utf8`),aw>=5242880&&sw(e)}catch(e){aw=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}function cw(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(`
|
|
162
|
+
`)}function lw(e,t){return e===`darwin`?[uw(`footprint`,[`-p`,String(t)]),uw(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[dw(`/proc/self/smaps_rollup`),dw(`/proc/self/status`)]:[]}function uw(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=Ee({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}`}${fw(n.stderr)}`}}}}function dw(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 fw(e){let t=e.split(`
|
|
163
|
+
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const pw=`CC_CANDYBAR_RSS_LIMIT_MB`;function mw(e){let t=e[pw];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${pw} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function hw(e){return mw(e)*2}const gw=1024*1024;function _w(e){return mw(e)*gw}const vw={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function yw(e,t,n){let{prefix:r,suffix:i}=vw[t];return c.join(e,`${r}${n}${i}`)}function bw(e){for(let t of Object.keys(vw)){let{prefix:n,suffix:r}=vw[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function xw(e){let t=e.rssLimitBytes??512*gw,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 Sw(e.log,`memory report`,()=>{let t=yw(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),Sw(e.log,`heap snapshot`,()=>{let t=yw(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),Sw(e.log,`artifact rotation`,()=>{ww(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 Sw(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function Cw(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=bw(t);if(n===null)return t;let{prefix:r,suffix:i}=vw[n];return t.slice(r.length,t.length-i.length)}function ww(e,t,n){let r=new Map;for(let t of e){let e=Cw(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 Tw(e,t,n={}){let i=Me();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Q,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>cw(lw(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>C.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>bw(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function Ew(e={}){if(Hw()!==null)return;let n=e.spawn??Uw,r=zw();if(r.kind===`contended`){let e=Ow();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),Dw(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),Dw(n);return}try{Dw(n)}finally{Vw()}}function Dw(e){Fw()&&kw(e)}function Ow(){try{let e=r.statSync(Ve());return Date.now()-e.mtimeMs}catch{return null}}function kw(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
|
|
164
|
+
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function Aw(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function jw(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function Mw(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 Nw(e,n){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,String(n),{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.backoff: ${e.message}\n`)}}function Pw(){try{r.unlinkSync(Ue())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function Fw(){let e=He(),n=Ue(),r=Mw(n),i=Aw(Iw(e),jw(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`),Lw(e),Nw(n,Math.min(r+1,5)),!0)}function Iw(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function Lw(e){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,`${t.pid} ${Date.now()}\n`,{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.cooldown: ${e.message}\n`)}}let Rw=null;function zw(){let e=Ve();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 Rw={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(!Bw(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 Bw(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function Vw(){if(!Rw)return;let{fd:e,path:t}=Rw;Rw=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function Hw(){try{return r.mkdirSync(Me(),{recursive:!0}),null}catch(e){return`mkdir ${Me()}: ${e.message}`}}function Uw(){let e=t.execPath,n=t.argv[1];return n?De({bin:e,args:[`--max-old-space-size=${hw(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const Ww=`cc-candybar`,Gw=`dispatch`,Kw=`set-state`,qw=`step-state`,Jw=`copy`,Yw=`open-vscode`,Xw=`toolbar-toggle`,Zw=`show-config-error`,Qw=`show-config-warning`,$w=`set-config`,eT=`step-config`,tT=`save`,nT=`save-preset`,rT=`delete-preset`,iT=`reset-config`,aT=`apply-layout-op`,oT=`undo`,sT=`redo`,cT=`apply-update`,lT=`doctor-run`,uT=`doctor-fix`,dT=`ceiling`,fT=`slash`;function pT(e){return e.map(encodeURIComponent).join(`/`)}function mT(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function hT(e){return`${Ww}://${Gw}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${pT(e.args)}`)}`).join(`&`)}`}function gT(e){return new te(e).getAll(`e`).map(bT)}const _T=new Set([Kw,iT]);function vT(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&yT(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function yT(e,t){if(e.verb!==t.verb||!_T.has(e.verb))return;let[n,r]=[bT(e.value),bT(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function bT(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const xT=`1.95.0`;function ST(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function CT(e){return e??c.join(f.homedir(),`.claude`)}function wT(e){return c.join(e,`settings.json`)}function TT(e){return c.join(e,`plugins`,`installed_plugins.json`)}function ET(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function DT(e){let t;try{let n=ET(e);if(/^\s*$/.test(n))return{};t=bo.parse(n)}catch(t){throw Error(`cannot read ${e}: ${OT(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const OT=e=>e instanceof Error?e.message:String(e),kT=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function AT(e){let t=kT.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 jT(e){return e.join(`.`)}function MT([e,t,n],[r,i,a]){return e-r||t-i||n-a}const NT=`@promptctl/cc-candybar`;async function PT(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`?AT(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function FT(e,t){let n=AT(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=MT(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 IT(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${jT(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${jT(t.installed)} is newer than the registry's latest release (${jT(t.latest)}): an unpublished build.\n`};case`stale`:{let n=jT(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${jT(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 LT=`CCCandybarURLHandler`,RT=[],zT={"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 BT(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function VT(e,t){return[e,...t].map(BT).join(` `)}function HT(){return c.join(f.homedir(),`Applications`,`${LT}.app`)}function UT(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function WT(){if(process.platform===`darwin`)return c.join(f.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(f.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function GT(){return c.join(WT(),`bin`,`cc-candybar`)}function KT(){return c.join(WT(),`dist`,`index.mjs`)}function qT(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(`
|
|
165
|
+
`)}function JT(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:c.resolve(c.dirname(e),`..`,`dist`,`index.mjs`)}function YT(t){let n=zT[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:c.resolve(c.dirname(t),`..`,`bin`,`cc-candybar`)}}function XT(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function ZT(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 ${NT}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function QT(){let e=JT(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=YT(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(KT()),{recursive:!0}),r.mkdirSync(c.dirname(GT()),{recursive:!0}),XT(e,KT()),XT(t.sourcePath,GT()),r.chmodSync(GT(),493),r.rmSync(c.join(WT(),`url-handler.mjs`),{force:!0});let n=ZT(GT());return process.stdout.write(`Staged cc-candybar v${xT} runtime at ${WT()}\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:GT(),distPath:KT(),entryKind:n}}function $T(){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>${Ww}</string>`,` </array>`,` </dict>`,`</array>`].join(`
|
|
166
|
+
`)}]}function eE(e){let t=HT();r.mkdirSync(c.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=Ee({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,qT(process.execPath,e)],category:`install.osacompile`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`osacompile failed (${n.reason})`);let i=c.join(t,`Contents`,`Info.plist`);for(let{key:e}of $T())Ee({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of $T()){let n=Ee({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 ${Ww}:// with Launch Services\n`);let a=Ee({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(`✓ ${LT}.app installed and registered.\n`),process.stdout.write(` Test: open '${Ww}://hello-world' && pbpaste\n`)}function tE(){UT(),eE(QT().distPath)}function nE(e,t=Ww){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:Jw,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function rE(e){e||(process.stderr.write(`url-handle: missing URL argument.
|
|
167
|
+
`),process.exit(1));let t;try{t=nE(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await iw(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(Ew(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(iE(n)+`
|
|
168
|
+
`),process.exit(1)}function iE(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 aE(){return`✓ install complete.
|
|
169
169
|
Restart Claude Code to pick up the new statusline.
|
|
170
|
-
Tip: every bar carries a settings menu — click it (${mc} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/look/style/wrap/padding controls.\n`}async function
|
|
171
|
-
`),
|
|
172
|
-
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function
|
|
173
|
-
`)}function
|
|
174
|
-
`);return e?`${l}\n${e}`:l}function
|
|
175
|
-
`))}function ZE(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new B({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new H(e,{style:t,end:``,noWrap:!0}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(re(a.path).href)):c(`full text unavailable: ${TE(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(TE(o),s.withLink(re(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=H.fromFragments([...d,...p]).truncate(r.width);return m.noWrap=!0,zE([m],r)}const QE=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function $E(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function eD(e,t){return r.readdirSync(t).filter(QE).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?eD(e,i):[[c.relative(e,i).split(c.sep).join(`/`),$E(i,a)]]})}function tD(e){let t=ie.createHash(`sha256`);for(let[n,r]of eD(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const nD=e=>e.slice(0,7);function rD(e){return c.dirname(c.dirname(e))}function iD(){return{version:mT,digest:`8a0efa478842372414e9b787c195cfd4e2e5cf554244f173239c74e050e9e7ab`}}function aD(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function oD(e,t){try{let n=rD(ne(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=tD(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:aD(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 sD(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function cD(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 lD(e,t,n){let r=is(e,new Set(n.map(rs).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const uD=/^-?\d+$/;function dD(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 fD(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!uD.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 pD(e,t,n){return r=>r?uD.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 mD(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=>!uD.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 hD(e){return e===`config`?`set-config`:`set-state`}function gD(e,t,n){return t.kind===`int`?fD(`menu page "${e}"`):t.kind===`range`?pD(t.min,t.max,`${n} stepper "${e}"`):dD(t.allowed,`${n} "${e}"`,hD(n))}function _D(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:mD(e,n,t)}))}function vD(e,t=`state`){let n=new Map(Object.entries(e).map(([e,t])=>[e,{validator:t,permanent:!0}]));function r(){let e=[];for(let[t,r]of n)r.permanent&&e.push(t);return e}return{register(e,i){if(!e)throw Error(`register: key is required`);if(e.includes(`/`))throw Error(`register: key "${e}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);let a=n.get(e);if(a){if(a.permanent)throw Error(`register: key "${e}" is a built-in ${t} key and cannot be re-claimed (built-in keys: ${[...r()].join(`, `)})`);let n=mD(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=gD(e,n,t)}else{let r=mD(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:gD(e,r,t)})}let o=!0;return()=>{if(!o)return;o=!1;let r=n.get(e);if(!r||r.permanent)return;let a=r.specs.indexOf(i);a>=0&&r.specs.splice(a,1),r.specs.length===0?n.delete(e):(r.merged=mD(e,r.specs,t),r.validator=gD(e,r.merged,t))}},validate(e,r){let i=n.get(e);return i?i.validator(r):{ok:!1,reason:`unknown ${t} key "${e}" (have: ${[...n.keys()].join(`, `)})`}},listKeys(){return[...n.keys()]},listBaselineKeys(){return r()},rangeParamsFor(e){let t=n.get(e);if(!t||t.permanent||t.merged.kind!==`range`)return null;let{min:r,max:i}=t.merged;return{min:r,max:i}}}}const yD=vD({},`config`);function bD(){return yD.listKeys()}function xD(e,t){return yD.validate(e,t)}function SD(e){return yD.rangeParamsFor(e)}function CD(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:Ky(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:[sD({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[sD({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ky(e.insertSegmentFrom,t).members.map(t=>sD({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function wD(e,t){let n=Kc(e.globals).get(t);return n===void 0?null:String(n)}function TD(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?Qy(n.persist):null;e?.scope===`preset-root`&&t.add(Xy(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function ED(e){let t=new Map([...Wy(e),...gb(e)]);return[...TD(e),...Object.values(e.actions).flatMap(e=>CD(e,t))]}function DD(e){return _D(ED(e),`config`)}function OD(e,t){return yD.register(e,t)}const kD=Array.from({length:10},(e,t)=>(t+1)*1e5),AD=kD[0],jD=kD[kD.length-1];function MD(e){let t;try{t=bT(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>=AD&&n<=jD?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${AD}–${jD} tokens)`)}function ND(e,t){let n=Math.min(t??jD,jD),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:kD.filter(e=>e<r).at(-1)??0,higher:kD.find(e=>e>r&&e<=n)??0}}const PD=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,FD=`{{ \$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 (${PD}) (basename .project_dir) (ne (${PD}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,ID={globals:{palette:`tokyo-night`},variables:{...Sy,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},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"block.budget.heatThreshold":{kind:`literal`,value:50},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"weekly.budget.heatThreshold":{kind:`literal`,value:50},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"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:``},"autocompact.window":{kind:`input`,path:`autocompact.window`,type:`number`,default:-1},...Object.fromEntries([`applied`,`lower`,`higher`].map(e=>[`autocompact.${e}`,{kind:`input`,path:`autocompact.${e}`,type:`number`,default:0}])),"autocompact.error":{kind:`input`,path:`autocompact.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:``}},segments:{directory:{description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project.",template:FD},model:{description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{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:`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,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:{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:{description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:Wb(``).template},themeSwitcher:{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:{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" .session.budget.amount "warn" .session.budget.warningThreshold) }}`},today:{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" .today.budget.amount "warn" .today.budget.warningThreshold) }}`},block:{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) .block.budget.heatThreshold "warning" .block.budget.warningThreshold "error" }}`,when:`{{ gt .block.resetsAt 0 }}`},weekly:{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) .weekly.budget.heatThreshold "warning" .weekly.budget.warningThreshold "error" }}`,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{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" .burn.eta.errorMinutes "warning" .burn.eta.warnMinutes (tint) }}`,when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{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:{description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{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) ${Qi} }}`,when:`{{ gt .cache.expiresAt 0 }}`},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:{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:{description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session.`,template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}{{ template "formatTokenCount" .autocompact.applied }}{{ end }}{{ if gt .autocompact.lower 0 }} {{ action (printf "autocompact.%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "autocompact.%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "autocompact.auto" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`},metrics:{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) }}`},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`}]},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:{...Wb(``).actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},"autocompact.auto":{slash:`/autocompact auto`},...Object.fromEntries(kD.map(e=>[`autocompact.${e}`,{slash:`/autocompact ${e}`}]))},looks:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`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:{style:`plain`,look:`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:{style:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${Qi}) .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:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,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 .)) }}`}},LD=new Set([ID.globals.palette,...Object.values(ID.segments).map(e=>e.palette)].filter(e=>e!==void 0)),RD=lc(CC(`<default>`,JSON.stringify(ID),LD),ID),zD=Eg(RD.presets);function BD(e){return zD.includes(e)}function VD(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const HD=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 UD(e){return((...t)=>HD.run(()=>e(...t)))}const WD=UD(y),GD=UD(v),KD=UD(b);async function qD(e,t){return HD.run(async()=>{let n=null;try{n=await _(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 JD(e,t){return HD.run(async()=>{let n=null;try{n=await _(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 YD=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function XD(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 ZD(e){let t=await QD(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function QD(e){for(let t of[65536,1048576]){let n=await JD(e,t);if(n.kind!==`ok`)return n;let r=$D(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function $D(e,t){let n=e.toString(`utf8`).split(`
|
|
176
|
-
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!
|
|
177
|
-
`).at(-1).trim();function
|
|
178
|
-
`),c=cT([{verb:Gw,args:[s]}]),l=t.kind===`running`?WE(`[${i.busy}]`,c):WE(`[${i.act}]`,cT([{verb:tT,args:[n.sessionId]}]));return[{severity:UE,message:s,lines:[[WE(a,c),l,WE(`[dismiss]`,cT([{verb:zw,args:[n.sessionId,nk,r]}])),WE(`[disable]`,cT([{verb:Kw,args:[n.sessionId,rk,`false`]}]))],...o.map(e=>[WE(e,c)])]}]}function uk(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 dk(e){switch(e.kind){case`current`:return[`info`,`build: current ${ak(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${ak(e.source)}, running ${ak(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function fk(e){switch(e.kind){case`current`:return[`info`,`release: current ${wT(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${wT(e.latest)}, running ${wT(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${wT(e.installed)}, latest ${wT(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function pk(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const mk=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function hk(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=mk(e.stderr)??e.error??mk(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function gk(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=sk,d=null,f=pk(s),p=pk(s),m=()=>uk(c,l);function h(){let e=m(),t=e===null?null:ik(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:JO(nk,{kind:`allow-list`,allowed:[t]})})}function g(){c=oD(t,iD),f(dk(c)),h()}async function _(){l=OT(mT,await DT(ET,a,i)),p(fk(l)),h()}return{arm(){OD(rk,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>lk(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=ok(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=ck,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),Te({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=sk,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=hk(n);u={kind:`failed`,identity:ik(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var _k=class{static CACHE_DIR=O();static USAGE_CACHE_DIR=c.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=c.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=c.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=c.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 ae(50);else throw e}return D(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=c.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 T(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=c.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 ae(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 ae(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=c.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 vk={"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 yk=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 _k.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await _k.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ee(this.GITHUB_PRICING_URL),n=E({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(vk).length} models`),this.executionCache=vk,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(vk).length} models`),vk)}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 bk=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function xk(e){if(typeof e==`string`)return bk.exec(e)?.[1]}function Sk(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 Ck(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o;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}),n===`TodoWrite`&&(a=Sk(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id;typeof e==`string`&&i.push(e);break}case`text`:o??=t.text;break;default:break}}let s=n?xk(o):void 0;if(!(r.length===0&&i.length===0&&a===void 0&&s===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...s!==void 0&&{command:s}}}function wk(){let e=[],t=process.env.CLAUDE_CONFIG_DIR;if(t&&t.split(`,`).forEach(t=>{let n=t.trim();a(n)&&e.push(n)}),e.length===0){let t=p(),n=d(t,`.config`,`claude`),r=d(t,`.claude`);a(n)&&e.push(n),a(r)&&e.push(r)}return e}async function Tk(e){let t=[];for(let n of e){let e=d(n,`projects`);if(a(e))try{let n=await WD(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=d(e,r.name);t.push(n)}}catch(t){D(`Failed to read projects directory ${e}:`,t)}}return t}async function Ek(e,t,n){let r=[],i=d(t,e,`subagents`);try{let t=(await WD(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=d(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await GD(t,`utf-8`)).split(`
|
|
179
|
-
`)[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
|
|
180
|
-
`))if(n.trim())try{let e=
|
|
181
|
-
`);if(i.length>1)return n;let a=Math.max(0,t.width-Qk(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];Jk(l,l.cellLength+c,i),n[t]=Yk(e[t])}),n}function eA(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=tA(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(rA(a.style).link){i();let e=tA([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function tA(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>nA(e,t)):e,r=H.fromFragments(n);return r.end=``,r.noWrap=!0,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function nA(e,t){let n=e.copy();return n.style=t.add(rA(e.style)),n}function rA(e){return e instanceof B?e:B.parse(e)}var iA=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function aA(e,t,n,r,i){let{palette:a,tint:o}=e,s=oA(n,i),c=s===void 0?o:sA(a,s,`bg`);e.bg=c;let l=oA(r,i),u=l===void 0?$i(a,c,t):sA(a,l,`fg`);return new B({bgcolor:P.fromRgba(c),color:P.fromRgba(u)})}function oA(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function sA(e,t,n){try{return Vn(e,t)}catch(e){throw e instanceof Rn?new iA(t,n,e.message):e}}function cA(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,lA(e,t,o,n,r,i));return i}function lA(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=Ky(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}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=Ty.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=Ky(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}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=Ky(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:dA(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:dA(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:Qx(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(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:dA(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 uA(e){return e.kind===`do`?uA(e.head):e}function dA(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function fA(e,t){return e.has(t)?w_(e.read(t)):``}function pA(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function mA(e,t,n,r){let i=new H(e,{style:B.combine([r,new B({link:t,bold:n})])});return i.noWrap=!0,i.end=``,i}function hA(e,t){return Math.max(e.members.indexOf(fA(t,e.stateVar)),0)}function gA(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=fA(r,e.stateVar);return{effects:[{verb:zw,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=fA(r,e.stateVar);return{effects:[{verb:zw,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=fA(r,e.stateVar);return{effects:[{verb:zw,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(hA(e,r)+1)%e.members.length];return{effects:[{verb:zw,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:Bw,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:Vw,args:[pA(e.text,hv(r))]}],active:!1};case`open`:return{effects:[{verb:Hw,args:[pA(e.target,hv(r))]}],active:!1};case`persist-literal`:{let t=fA(r,e.stateVar);return{effects:[{verb:Kw,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=fA(r,e.stateVar);return{effects:[{verb:Kw,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(hA(e,r)+1)%e.members.length];return{effects:[{verb:Kw,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:qw,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:Zw,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:$w,args:[i]}],active:!1};case`redo`:return{effects:[{verb:eT,args:[i]}],active:!1};case`save`:return{effects:[{verb:Jw,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:Yw,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:Xw,args:[i,pA(e.name,hv(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:nT,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:rT,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:iT,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:aT,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:Qw,args:[i,e.key,sD(e.op)]}],active:!1};case`do`:{let a=gA(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>gA(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:Qw,args:[i,e.key,sD(r)]}],active:!1}}}}function _A(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:gc(`action "${e}"`,n,t.members.length,hA(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 vA(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}=_A(e,uA(r),t,i),{effects:s,active:c}=gA(r,a,o,i,fA(i,`session.id`));return mA(a,cT(s),c)}function yA(e){return{action:{fn:(t,...n)=>vA(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function bA(e,t){return mA(`✕`,cT([{verb:zw,args:[fA(e,`session.id`),t,pc]}]),!1)}function xA(e,t,n){return new B({bgcolor:P.fromRgba(t),color:P.fromRgba($i(e,t,n))})}function SA(e,t,n){return xA(e.palette,fa(e.palette,e.disclosure,[t],n),n)}function CA(e,t,n,r,i){return r===void 0?n=>SA(e,{...n,distribution:t},i):(e,t)=>wA(r(t,n),i)}function wA(e,t){let n=Ui(e,`background`);return new B({bgcolor:P.fromRgba(n),color:P.fromRgba(Jn(Ui(e,`primary`),n,4.5,t))})}function TA(e){return{current:null,drawnAt:e}}function EA(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 DA(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 OA(e){return new H(e).cellLength}function kA(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function AA(e){return Math.max(1,kA(e)-(OA(`✕`)+2*e.padding+e.seamCols))}function jA(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 MA(e,t){let n=[];for(let t of e)n.length>0&&n.push(new H(` `)),n.push(t);let r=H.fromFragments(n);return r.noWrap=t,r.end=``,r}function NA(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 PA(e,t,n){let r=e.compiled.get(t),i=r&&uA(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 FA(e,t,n,r,i,a,o){let s=PA(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=fA(l,`session.id`),d=`stateVar`in s?fA(l,s.stateVar):void 0,f=s.options.map(OA),p=i?kA(a):1/0,m=OA(`✕`)+1,h=OA(`←`)+1+OA(`→`)+1,g=jA(f,p,m),_=g.length>1?jA(f,p,m+h):g,v=parseInt(fA(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>cT([{verb:zw,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=cT([{verb:zw,args:[u,...S]}]),ee=r?[{verb:zw,args:[u,...S]}]:[],te=e=>cT([...gA(c,e,e,l,u).effects,...ee]),ne=[mA(`✕`,C,!1)];y>0&&ne.push(mA(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(mA(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(mA(`→`,x(y+1),!1)),MA(ne,i)}function IA(e,t){return{picker:{fn:(n,r,i,a)=>{let o=NA(e,r,`set-int`,`an int action ({ set, int: true })`);return FA(n,{key:o.key,stateVar:o.stateVar},[[o.key,`-1`]],i===!0,a===!0,e,CA(DA(t,`{{ picker }}`),Li(void 0),e,PA(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}function LA(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+OA(e(-(s+1)))+1+OA(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function RA(e,t,n,r,i){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 a=n.store;if(!a.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 o=n.compiled.get(e),s=fA(a,`session.id`),{options:c}=t,l=c.length,u=fA(a,t.stateVar),d=Math.max(c.indexOf(u),0),f=e=>((d+e)%l+l)%l,p=e=>c[f(e)],m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=cT(gA(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>mA(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=LA(p,l,OA(`◀`)+1+OA(p(0))+1+OA(`▶`),AA(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return MA([...v(-1).reverse(),mA(`◀`,h(-1),!1),g(0),mA(`▶`,h(1),!1),...v(1)],!0)}function zA(e,t){return{carousel:{fn:(n,r,...i)=>{if(i.length>0)throw Error(`carousel "${n}": takes at most one neighbours count after the action name, got ${1+i.length}`);if(r!==void 0&&!(Number.isInteger(r)&&r>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(r)}`);let a=r??1/0,o=PA(e,n,`carousel`);return RA(n,o,e,CA(DA(t,`{{ carousel }}`),Li(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`float`],returnType:`T`}}}const BA=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function VA(e,t,n){let r=aa(e,{hue:Ai,depth:0},n);return[U(t).map((t,n)=>({text:BA[n%BA.length],colour:Wi(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:Ui(e,`warning`)},{text:`error`,colour:Ui(e,`error`)}]]}function HA(e,t,n,r){let i=VA(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:xA(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 H(e)),a.push(t)}let s=H.fromFragments(a);return s.noWrap=!0,s.end=``,s}function UA(e,t){return{themePreview:{fn:()=>HA(e.palette,e.progression,t.drawnAt(),AA(e)),argTypes:[],returnType:`T`}}}const WA=e=>e.slice(e.lastIndexOf(`.`)+1),GA=(e,t)=>{let n=new H(WA(e));return n.truncate(t,{marker:`…`}),n.plain};function KA(e,t){let n=e.map(e=>e.map(({name:e})=>OA(WA(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 qA(e,t,n,r){let i=KA(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${GA(s,i)} `,{style:xA(l,ga(l,{kind:`bar`,progression:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=H.fromFragments(a.flatMap((e,t)=>t===0?e:[new H(`
|
|
182
|
-
`),...e]));return o.noWrap=!0,o.end=``,o}function
|
|
170
|
+
Tip: every bar carries a settings menu — click it (${mc} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/look/style/wrap/padding controls.\n`}async function oE(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...RT],i=QT();process.platform===`darwin`?eE(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
|
|
171
|
+
`),sE(i.binPath,r,t),process.stdout.write(aE());let a=IT(NT,FT(xT,await PT(NT,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function sE(e,t,n,i){let a=i??wT(CT(ST(process.env,process.cwd())));r.mkdirSync(c.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,l=[e,BT(e)],u=typeof s==`string`&&(s.startsWith(`pnpm dlx @promptctl/cc-candybar@`)||l.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:VT(e,t)},ke(a,JSON.stringify(o,null,2)),process.stdout.write(`Updated ${a}\n`)}function cE(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 lE(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 uE(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 dE(e,t){let n=lE(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function fE(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 pE(e,t,n,r){let i=mE(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 mE(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 hE(e){let t=!1;function n(){let n=pE(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 gE(e,t=Ee){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 _E(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 vE(e,t=gE){let n=t(e);return n.kind===`start`?n.token:null}const yE=`CC_CANDYBAR_PARENT_PID`;function bE(e){let t=e[yE];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${yE} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function xE(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 SE(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function CE(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function wE(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 TE(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>c.join(e,t))}catch{return[]}}function EE(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 DE(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 OE(e){if(!e.isolated)return{decision:wE(!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=wE(!0,DE(t,e.isSameLiveProcess,e.removeFile),e.ceiling);if(!n.allow)return{decision:n,registryPath:null};let r=c.join(e.registryDir,`pid-${e.pid}.json`);return e.writeEntry(r,{pid:e.pid,startTime:e.startTime}),{decision:n,registryPath:r}}function kE(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function AE(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:Be(),ceiling:CE(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>_E(e,t,{readStartTime:gE,pidAlive:SE}),listFiles:TE,readEntry:EE,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?Pe:e=>{Pe(c.dirname(e)),Pe(e)},...t}}function jE(e){return e<32||e===127||e>=128&&e<=159}function ME(e){let t=``;for(let n of e)t+=jE(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function NE(e,t){let n=ME(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const PE=`\x1B[38;2;255;255;255m`,FE=`\x1B[48;2;200;40;40m`;function IE(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 LE={fg:IE(PE),bg:IE(FE)},RE={fg:IE(`\x1B[38;2;0;0;0m`),bg:IE(`\x1B[48;2;220;160;40m`)},zE={unicode:hi,ascii:{glyph:`>`,divider:`|`,lead:`<`,tail:`>`}},BE={unicode:{},ascii:{left:`(`,right:`)`}};function VE(e,t,n){switch(e){case`capsule`:return new _i(BE[t]);case`plain`:return new vi(n===void 0?{}:{separator:n});case`powerline`:return new gi(zE[t]);default:return e}}const HE=new Map;function UE(e){let t=JSON.stringify([e.style,e.charset,e.separator??null]),n=HE.get(t);if(n!==void 0)return n;let r=VE(e.style,e.charset,e.separator),i=e=>new H(`x`,{end:``,noWrap:!0,style:new B({bgcolor:e})}),a=e=>new H(xi(new oi(e,r),{colorSystem:null}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return HE.set(t,s),s}function WE(e){return UE(e).chrome}function GE(e){return UE(e).seam}function KE(e,t){if(e.length===0)return``;let n=VE(t.style,t.charset,t.separator),r=t.colorCompatibility,i=t.wrap&&Number.isFinite(t.width)?xi(new Di([...e],{joiner:n}),{width:t.width,colorSystem:r}):xi(new oi([...e],n),{colorSystem:r});if(!i.endsWith(`
|
|
172
|
+
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function qE(e){return Math.min(20,e??20)}const JE={heading:`ERROR`,glyph:`⚠`,colors:LE},YE={heading:`WARNING`,glyph:`⚠`,colors:RE},XE={heading:`UPDATE`,glyph:`⬆`,colors:RE};function ZE(e,t){return{text:ME(e),link:t}}function QE(e,t,n){let[r,...i]=[$E(e,JE,Zw),t,$E(n,YE,Qw)].flat();return r===void 0?null:{channels:[r,...i]}}function $E(e,t,n){let r=hT([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>ZE(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function eD(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
|
|
173
|
+
`)}function tD(e,t,n,r){if(t===null)return e;let i=nD(r),a=t.channels.flatMap(e=>rD(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[iD(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
|
|
174
|
+
`);return e?`${l}\n${e}`:l}function nD(e){return{style:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function rD(e,t){let n=new B({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Lt(Math.max(2,t.width-1)),i=(e,t)=>new H(`${e} `,{style:t,end:``,noWrap:!0});return e.lines.flatMap((a,o)=>KE([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=>Bt(e,r)).map(e=>i(e,t))})],t).split(`
|
|
175
|
+
`))}function iD(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new B({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new H(e,{style:t,end:``,noWrap:!0}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(re(a.path).href)):c(`full text unavailable: ${ME(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(ME(o),s.withLink(re(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=H.fromFragments([...d,...p]).truncate(r.width);return m.noWrap=!0,KE([m],r)}const aD=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function oD(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function sD(e,t){return r.readdirSync(t).filter(aD).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?sD(e,i):[[c.relative(e,i).split(c.sep).join(`/`),oD(i,a)]]})}function cD(e){let t=ie.createHash(`sha256`);for(let[n,r]of sD(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const lD=e=>e.slice(0,7);function uD(e){return c.dirname(c.dirname(e))}function dD(){return{version:xT,digest:`3ac3448bef042bdf61bf69cafed3be048d77d73c23523b37026ee3fef0be3e71`}}function fD(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function pD(e,t){try{let n=uD(ne(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=cD(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:fD(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 mD(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function hD(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 gD(e,t,n){let r=is(e,new Set(n.map(rs).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const _D=/^-?\d+$/;function vD(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 yD(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!_D.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 bD(e,t,n){return r=>r?_D.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 xD(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=>!_D.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 SD(e){return e===`config`?`set-config`:`set-state`}function CD(e,t,n){return t.kind===`int`?yD(`menu page "${e}"`):t.kind===`range`?bD(t.min,t.max,`${n} stepper "${e}"`):vD(t.allowed,`${n} "${e}"`,SD(n))}function wD(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:xD(e,n,t)}))}function TD(e,t=`state`){let n=new Map(Object.entries(e).map(([e,t])=>[e,{validator:t,permanent:!0}]));function r(){let e=[];for(let[t,r]of n)r.permanent&&e.push(t);return e}return{register(e,i){if(!e)throw Error(`register: key is required`);if(e.includes(`/`))throw Error(`register: key "${e}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);let a=n.get(e);if(a){if(a.permanent)throw Error(`register: key "${e}" is a built-in ${t} key and cannot be re-claimed (built-in keys: ${[...r()].join(`, `)})`);let n=xD(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=CD(e,n,t)}else{let r=xD(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:CD(e,r,t)})}let o=!0;return()=>{if(!o)return;o=!1;let r=n.get(e);if(!r||r.permanent)return;let a=r.specs.indexOf(i);a>=0&&r.specs.splice(a,1),r.specs.length===0?n.delete(e):(r.merged=xD(e,r.specs,t),r.validator=CD(e,r.merged,t))}},validate(e,r){let i=n.get(e);return i?i.validator(r):{ok:!1,reason:`unknown ${t} key "${e}" (have: ${[...n.keys()].join(`, `)})`}},listKeys(){return[...n.keys()]},listBaselineKeys(){return r()},rangeParamsFor(e){let t=n.get(e);if(!t||t.permanent||t.merged.kind!==`range`)return null;let{min:r,max:i}=t.merged;return{min:r,max:i}}}}const ED=TD({},`config`);function DD(){return ED.listKeys()}function OD(e,t){return ED.validate(e,t)}function kD(e){return ED.rangeParamsFor(e)}function AD(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:Ky(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:[mD({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[mD({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ky(e.insertSegmentFrom,t).members.map(t=>mD({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function jD(e,t){let n=Kc(e.globals).get(t);return n===void 0?null:String(n)}function MD(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?Qy(n.persist):null;e?.scope===`preset-root`&&t.add(Xy(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function ND(e){let t=new Map([...Wy(e),...gb(e)]);return[...MD(e),...Object.values(e.actions).flatMap(e=>AD(e,t))]}function PD(e){return wD(ND(e),`config`)}function FD(e,t){return ED.register(e,t)}const ID=Array.from({length:10},(e,t)=>(t+1)*1e5),LD=ID[0],RD=ID[ID.length-1];function zD(e){let t;try{t=DT(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>=LD&&n<=RD?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${LD}–${RD} tokens)`)}function BD(e,t){let n=Math.min(t??RD,RD),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:ID.filter(e=>e<r).at(-1)??0,higher:ID.find(e=>e>r&&e<=n)??0}}const VD=$b(`commands.`),HD=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,UD=`{{ \$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 (${HD}) (basename .project_dir) (ne (${HD}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,WD={globals:{palette:`tokyo-night`},variables:{...VD.variables,...Sy,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},"session.budget.amount":{kind:`literal`,value:0},"session.budget.warningThreshold":{kind:`literal`,value:80},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"today.budget.amount":{kind:`literal`,value:50},"today.budget.warningThreshold":{kind:`literal`,value:80},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"block.budget.warningThreshold":{kind:`literal`,value:80},"block.budget.heatThreshold":{kind:`literal`,value:50},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"weekly.budget.warningThreshold":{kind:`literal`,value:80},"weekly.budget.heatThreshold":{kind:`literal`,value:50},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"burn.eta.warnMinutes":{kind:`literal`,value:60},"burn.eta.errorMinutes":{kind:`literal`,value:30},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"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:``},"autocompact.window":{kind:`input`,path:`autocompact.window`,type:`number`,default:-1},...Object.fromEntries([`applied`,`lower`,`higher`].map(e=>[`autocompact.${e}`,{kind:`input`,path:`autocompact.${e}`,type:`number`,default:0}])),"autocompact.error":{kind:`input`,path:`autocompact.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:``}},segments:{directory:{description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project.",template:UD},model:{description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{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:`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,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:{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:{description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:Wb(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:VD.template},themeSwitcher:{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:{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" .session.budget.amount "warn" .session.budget.warningThreshold) }}`},today:{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" .today.budget.amount "warn" .today.budget.warningThreshold) }}`},block:{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) .block.budget.heatThreshold "warning" .block.budget.warningThreshold "error" }}`,when:`{{ gt .block.resetsAt 0 }}`},weekly:{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) .weekly.budget.heatThreshold "warning" .weekly.budget.warningThreshold "error" }}`,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{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" .burn.eta.errorMinutes "warning" .burn.eta.warnMinutes (tint) }}`,when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{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:{description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{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) ${Qi} }}`,when:`{{ gt .cache.expiresAt 0 }}`},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:{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:{description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session.`,template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}{{ template "formatTokenCount" .autocompact.applied }}{{ end }}{{ if gt .autocompact.lower 0 }} {{ action (printf "autocompact.%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "autocompact.%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "autocompact.auto" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`},metrics:{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) }}`},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`}]},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:{...Wb(``).actions,...VD.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},"autocompact.auto":{slash:Xb(`/autocompact auto`)},...Object.fromEntries(ID.map(e=>[`autocompact.${e}`,{slash:Xb(`/autocompact ${e}`)}]))},looks:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`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:{style:`plain`,look:`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:{style:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${Qi}) .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:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,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 .)) }}`}},GD=new Set([WD.globals.palette,...Object.values(WD.segments).map(e=>e.palette)].filter(e=>e!==void 0)),KD=lc(AC(`<default>`,JSON.stringify(WD),GD),WD),qD=Eg(KD.presets);function JD(e){return qD.includes(e)}function YD(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const XD=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 ZD(e){return((...t)=>XD.run(()=>e(...t)))}const QD=ZD(y),$D=ZD(v),eO=ZD(b);async function tO(e,t){return XD.run(async()=>{let n=null;try{n=await _(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 nO(e,t){return XD.run(async()=>{let n=null;try{n=await _(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 rO=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function iO(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 aO(e){let t=await oO(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function oO(e){for(let t of[65536,1048576]){let n=await nO(e,t);if(n.kind!==`ok`)return n;let r=sO(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function sO(e,t){let n=e.toString(`utf8`).split(`
|
|
176
|
+
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!rO.test(t))continue;let r=iO(t);if(r!=null)return r}return null}function cO(e,t,n){let r=Dg(t(`preset`),e.globals.preset,e.presets),i=Ag(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:Ry(a.palette,t(`theme`),i.palette),look:Pa(a.look,t(`look`),i.look,e.looks),style:La(a.style,t(`style`),i.style),progression:Ya(a.progression,t(`progression`),i.progression),separator:a.default_separator??i.default_separator,autoWrap:no(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:ro(a.padding,t(`padding`),i.padding),charset:Va(a.charset,t(`charset`),i.charset),updateNotice:a.updateNotice??i.updateNotice??!0,colorCompatibility:Ga(a.colorCompatibility,t(`colorCompatibility`),i.colorCompatibility)}}function lO(e,t){return{style:e.style,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function uO(e){return{theme:e.theme,look:e.look,preset:e.preset,progression:e.progression}}function dO(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:JD(e.preset)},style:{effective:e.style},progression:{effective:e.progression},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding}}}const fO=10*1e3;function pO(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 mO(e,t){if(!(t<60))return e*3600/t}function hO(e,t,n,r){let i=r-t;if(i<50||i>fO)return;let a=n-e;if(!(a<=0))return a*1e3/i}function gO(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=hO(t.input,t.atMs,n.input,n.atMs),i=hO(t.output,t.atMs,n.output,n.atMs),a=hO(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 _O(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>fO)continue;let o=hO(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function vO(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function yO(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`,()=>vO(f.hostname())),i=n(`user`,()=>f.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function bO(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=>d_(t,e.helpers).keys();for(let n of os(kg(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 o=new Set;for(;r.length>0;){let e=r.pop();for(let t of SO(n,e)){if(i.has(t))continue;i.add(t);let e=n.get(t);if(e){if(e.kind===`input`)o.add(e.path);else if(e.kind===`template`)for(let t of a(e.template))r.push(t)}}}return o}function xO(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=bO(e,n);return t.set(n,i),i}}function SO(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 CO(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function wO(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 TO(e,t,n,r,i,a,o){let s=e=>CO(r,e),c=(t.clock??(()=>new Date))().getTime(),l=(e,t,n)=>t?n().catch(t=>X(`${e}: ${String(t)}`)):Promise.resolve(Y),[u,d,f,p,m,h,g,_,v,y,b]=await Promise.all([l(`git`,s(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,wO(r),e.workspace?.project_dir)),l(`session`,s(`session.cost`)||s(`session.tokens`)||s(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),l(`today`,s(`today`),()=>t.usageStore.getTodayInfo(e)),l(`context`,s(`context`)||s(`autocompact`),()=>t.contextProvider.getContextInfo(e)),l(`metrics`,s(`metrics`)||s(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),l(`activity`,s(`activity`),()=>t.activityProvider.getActivityInfo(e.session_id,e)),l(`tmux`,s(`tmux`),()=>t.tmuxService.getSessionId()),l(`cache`,s(`cache`),()=>aO(e.transcript_path)),l(`speed`,s(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,c)),l(`memento`,s(`memento`),()=>t.mementoProvider.getCeiling({sessionId:e.session_id,projectDir:e.workspace?.project_dir??``,cwd:n??e.workspace?.current_dir??``})),l(`autocompact`,s(`autocompact`),()=>Promise.resolve(t.autoCompact(wT(CT(a.claudeConfigDir)))))]),x=[],S=e=>{if(e.kind===`failed`){x.push(e.reason);return}return e.kind===`ok`?e.value:void 0},C=NO(u);x.push(...C.failures);let ee=yO(a);x.push(...ee.failures);let te=S(d),ne=S(f),re=S(p),w=S(m),ie=S(h),T=S(g),E=S(_),ae=OO(y);y.kind===`failed`&&x.push(`memento: ${y.reason}`);let oe=EO(b,re?.maxTokens);b.kind===`failed`&&x.push(`autocompact: ${b.reason}`);for(let e of x)t.log(`warn`,`provider fetch failed: ${e}`);let se=e.rate_limits?.five_hour,ce=e.rate_limits?.seven_day,le=se?pO(se.used_percentage,se.resets_at,18e6,c):void 0,ue=ce?pO(ce.used_percentage,ce.resets_at,6048e5,c):void 0,de=te?.session.cost,fe=w?.sessionDuration,pe=s(`burn`)&&de!=null&&fe!=null?mO(de,fe):void 0,me=S(v),he=me===void 0?void 0:gO(me),D=me===void 0?void 0:_O(me),ge=he!==void 0||D!==void 0?{...he,...D!==void 0&&{history:D}}:void 0,_e=MO(process.env.HOME??process.env.USERPROFILE),ve=e.workspace?{...e.workspace,current_dir:MO(e.workspace.current_dir)??``,project_dir:MO(e.workspace.project_dir)??``}:e.workspace,ye=te===void 0?void 0:jO({cost:te.session.cost,tokens:te.session.tokens}),be=ne===void 0?void 0:{cost:ne.cost,tokens:ne.tokens},xe=w===void 0?void 0:jO({lastResponseTime:w.lastResponseTime,responseTime:w.responseTime,sessionDuration:w.sessionDuration,messageCount:w.messageCount,linesAdded:w.linesAdded,linesRemoved:w.linesRemoved}),Se=ie===void 0?void 0:kO(ie);return{...e,...ve!==void 0&&{workspace:ve},..._e!==void 0&&{home:_e},...C.git!==void 0&&{git:C.git},...T!==void 0&&{tmux:{session:T}},host:ee.host,...dO(i),history:t.history(e.session_id),unsaved:o,...ye!==void 0&&{session:ye},...be!==void 0&&{today:be},...pe!==void 0&&{burn:{costPerHour:pe}},...ge!==void 0&&{speed:ge},...s(`block`)&&se!==void 0&&{block:{nativeUtilization:se.used_percentage,resetsAt:se.resets_at,...le!==void 0&&{etaMinutes:le}}},...ce!==void 0&&{weekly:{percentage:ce.used_percentage,resetsAt:ce.resets_at,...ue!==void 0&&{etaMinutes:ue}}},...E!==void 0&&{cache:{expiresAt:E}},...re!==void 0&&{context:{totalTokens:re.totalTokens,contextLeft:re.contextLeftPercentage}},...xe!==void 0&&{metrics:xe},...Se!==void 0&&{activity:Se},...ae!==void 0&&{memento:ae},...oe!==void 0&&{autocompact:oe}}}function EO(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return BD(e.value,t)}}const DO=e=>e.trim().split(`
|
|
177
|
+
`).at(-1).trim();function OO(e){switch(e.kind){case`absent`:return;case`failed`:return{error:DO(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function kO(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=AO(e.running),i=AO(e.done),a=r===void 0&&i===void 0?void 0:{...r!==void 0&&{running:r},...i!==void 0&&{done:i}};if(!(e.command===null&&n===void 0&&a===void 0))return{...e.command!==null&&{command:e.command},...n!==void 0&&{todo:n},...a!==void 0&&{tool:a}}}function AO(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function jO(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 MO(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function NO(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 PO={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,look:e=>e.look.kind===`decided`?e.look.name:null,style:e=>e.style,progression:e=>e.progression,charset:e=>e.charset,colorCompatibility:e=>e.colorCompatibility,autoWrap:e=>e.autoWrap?Xa:Za,padding:e=>String(e.padding)},FO=Object.entries(Cy),IO=new Set(wy.map(e=>e.sessionKey)),LO=()=>!1;function RO(e,t){return cO(e,e=>IO.has(e)?t(e):null,LO)}function zO(e,t,n,r){return e.flatMap(([e,i])=>{let a=PO[e](t);return a===null||a===PO[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function BO(e,t,n){return PO[n](RO(e,t))}function VO(e,t){let n=RO(e,t),r=cO(e,()=>null,LO),i=cO(e,e=>e===Cy.preset.sessionKey?n.preset:null,LO),a=Og(e.presets,n.preset).globals??{};return zO(FO,n,e=>e===`preset`?r:i,e=>e.configKey in a?Zy(n.preset,e.configKey):e.configKey)}function HO(e,t){let{preset:n}=RO(e,t);return WO(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:bs(a,s);return c===void 0||ys(c)===ys(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}const UO=new WeakMap;function WO(e,t){let n=UO.get(e)??new Map;UO.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...os(kg(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=_s(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 GO(e,t){let n=RO(e,t),r=cO(e,e=>e===Cy.preset.sessionKey?n.preset:null,LO);return{from:n.preset,globals:Og(e.presets,n.preset).globals??{},picks:zO(FO.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:HO(e,t)}}function KO(e){return{sessionKeys:wy.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...Ic(e)?qD.map(t=>Zy(t,e)):[]]}}const qO=Sa(),JO=new Set(qO),YO=new Set(Fa),XO=e=>e?JO.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${qO.join(`, `)})`}:{ok:!1,reason:`theme name is required`},ZO=e=>e?YO.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${Fa.join(`, `)})`}:{ok:!1,reason:`style name is required`},QO=new Set([`1`,`true`]),$O=new Set([`0`,`false`]),ek=TD({style:ZO,theme:XO,"toolbar-expanded":e=>QO.has(e)?{ok:!0,value:`1`}:$O.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function tk(){return ek.listKeys()}function nk(e,t){return ek.register(e,t)}function rk(e,t){return ek.validate(e,t)}function ik(e){return ek.rangeParamsFor(e)}function ak(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:Ky(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 ok(e){let t=new Set(ek.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function sk(e,t,n){let r=Dy.get(n);if(r!==void 0)return BO(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 ck(e){let t=Wy(e);return ok(Object.values(e.actions).flatMap(e=>ak(e,t)))}function lk(e){return wD(ck(e))}const uk=`update.dismissed`,dk=`updateNotice`;function fk(e){return e.kind===`source`?e.newer.digest:jT(e.newer)}const pk=e=>`${e.version} [${lD(e.digest)}]`;function mk(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:pk(e.newer),running:pk(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:jT(e.newer),running:jT(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${NT}@${jT(e.newer)}`,`install`]}}}}const hk={kind:`idle`},gk={kind:`running`};function _k(e,t,n){if(e===null)return[];let r=fk(e);if(!n.enabled||n.dismissed===r)return[];let i=mk(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(`
|
|
178
|
+
`),c=hT([{verb:Qw,args:[s]}]),l=t.kind===`running`?ZE(`[${i.busy}]`,c):ZE(`[${i.act}]`,hT([{verb:cT,args:[n.sessionId]}]));return[{severity:XE,message:s,lines:[[ZE(a,c),l,ZE(`[dismiss]`,hT([{verb:Kw,args:[n.sessionId,uk,r]}])),ZE(`[disable]`,hT([{verb:$w,args:[n.sessionId,dk,`false`]}]))],...o.map(e=>[ZE(e,c)])]}]}function vk(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 yk(e){switch(e.kind){case`current`:return[`info`,`build: current ${pk(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${pk(e.source)}, running ${pk(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function bk(e){switch(e.kind){case`current`:return[`info`,`release: current ${jT(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${jT(e.latest)}, running ${jT(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${jT(e.installed)}, latest ${jT(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function xk(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const Sk=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function Ck(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=Sk(e.stderr)??e.error??Sk(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function wk(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=hk,d=null,f=xk(s),p=xk(s),m=()=>vk(c,l);function h(){let e=m(),t=e===null?null:fk(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:nk(uk,{kind:`allow-list`,allowed:[t]})})}function g(){c=pD(t,dD),f(yk(c)),h()}async function _(){l=FT(xT,await PT(NT,a,i)),p(bk(l)),h()}return{arm(){FD(dk,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>_k(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=mk(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=gk,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),Te({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=hk,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=Ck(n);u={kind:`failed`,identity:fk(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var Tk=class{static CACHE_DIR=O();static USAGE_CACHE_DIR=c.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=c.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=c.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=c.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 ae(50);else throw e}return D(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=c.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 T(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=c.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 ae(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 ae(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=c.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 Ek={"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 Dk=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 Tk.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await Tk.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ee(this.GITHUB_PRICING_URL),n=E({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(Ek).length} models`),this.executionCache=Ek,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(Ek).length} models`),Ek)}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 Ok=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function kk(e){if(typeof e==`string`)return Ok.exec(e)?.[1]}function Ak(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 jk(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o;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}),n===`TodoWrite`&&(a=Ak(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id;typeof e==`string`&&i.push(e);break}case`text`:o??=t.text;break;default:break}}let s=n?kk(o):void 0;if(!(r.length===0&&i.length===0&&a===void 0&&s===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...s!==void 0&&{command:s}}}function Mk(){let e=[],t=process.env.CLAUDE_CONFIG_DIR;if(t&&t.split(`,`).forEach(t=>{let n=t.trim();a(n)&&e.push(n)}),e.length===0){let t=p(),n=d(t,`.config`,`claude`),r=d(t,`.claude`);a(n)&&e.push(n),a(r)&&e.push(r)}return e}async function Nk(e){let t=[];for(let n of e){let e=d(n,`projects`);if(a(e))try{let n=await QD(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=d(e,r.name);t.push(n)}}catch(t){D(`Failed to read projects directory ${e}:`,t)}}return t}async function Pk(e,t,n){let r=[],i=d(t,e,`subagents`);try{let t=(await QD(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=d(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await $D(t,`utf-8`)).split(`
|
|
179
|
+
`)[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 Fk(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 Ik=new Map;async function Lk(e){try{let t=await eO(e),n=t.size,r=Ik.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return D(`[parse-cache] hit ${e}`),Ik.delete(e),Ik.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 Hk(e)):i=await Bk(e),D(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(Ik.delete(e),Ik.size>=16&&Ik.delete(Ik.keys().next().value),Ik.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 Rk(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:jk(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 zk(e){let t=[];for(let n of e.split(`
|
|
180
|
+
`))if(n.trim())try{let e=Rk(JSON.parse(n));e&&t.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`);continue}return t}async function Bk(e){return zk(await $D(e,`utf-8`))}async function Vk(e,t){let n=await tO(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:zk(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function Hk(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=oe({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=Rk(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 Uk=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 Wk(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 Gk={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},Kk={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function qk(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function Jk(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function Yk(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function Xk(e,t,n,r){let i=qk(new Date(Jk())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:Yk(),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 Dk.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=qk(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...Gk};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 Zk(e){let t=0,n=0,r=Yk(),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)??{...Gk};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:Kk,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 Qk(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 $k=class{entries=new Map;flight=new Uk;seeded=new Map;speedRings=new Map;speedFlight=new Uk;maxEntries;staleAgeMs;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){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:Kk,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e){let t=qk(new Date);try{await this.ensureSeeded(t)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let n=await this.ingest(e?.session_id??``,e?.transcript_path);if(n.kind===`failed`)return n;let r={...Gk},i=!1;for(let e of this.entries.values()){i||=e.days.has(t);let n=e.days.get(t)??Gk;r.cost+=n.cost,r.input+=n.input,r.output+=n.output,r.cacheCreation+=n.cacheCreation,r.cacheRead+=n.cacheRead}return i?J({cost:r.cost,tokens:r.input+r.output+r.cacheCreation+r.cacheRead,tokenBreakdown:{input:r.input,output:r.output,cacheCreation:r.cacheCreation,cacheRead:r.cacheRead},date:t}):Y}async observeSpeed(e,t,n){let r=YD(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=Wk(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??YD(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 Pk(e,u(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 Vk(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 Xk(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...Zk(i),mainMtime:a})}ensureSeeded(e){let t=this.seeded.get(e);if(t)return t;this.seeded.clear();let n=this.seed(e);return this.seeded.set(e,n),n.catch(()=>{this.seeded.get(e)===n&&this.seeded.delete(e)}),n}async seed(e){let t=Jk(),n=await Nk(Mk()),r=[];for(let e of n){let n;try{n=await QD(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=d(e,i),a;try{a=(await eO(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await Qk(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&Q(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,Q(`info`,`usageStore seed sessions=${r.length}`)}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++,Q(`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),Q(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}};function eA(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function tA(e,t){let n=H.fromFragments(e);return n.end=``,n.noWrap=!0,t!==void 0&&!t.isNull&&(n.style=t),n}function nA(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:n.truncateMarker}):e.cellLength<t&&e.align(n.justify,t)}function rA({text:e,trail:t}){if(t===void 0)return e;let n=tA([e,t]);return n.style=e.style,n}function iA(e,t){let{width:n,justify:r,truncate:i,truncateMarker:a=`…`,baseStyle:o,padding:s,trail:c=[]}=t;if(e.length===0)return[];let l=tA(e,o).pad(s),u=c.length===0?{}:{trail:tA([...c,new H(` `.repeat(s))],o)};if(n===`auto`)return[{text:l,...u}];let d={justify:r,truncate:i,truncateMarker:a};return n===`fill`?[{text:l,fill:d,...u}]:(nA(l,n,d),[{text:l,...u}])}const aA=RegExp(`\\x1b\\[[0-9;]*m|${Jr.source}`,`g`);function oA(e){return k(e.replace(aA,``))}function sA(e,t){let n=e.map(rA),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=KE(n,t).split(`
|
|
181
|
+
`);if(i.length>1)return n;let a=Math.max(0,t.width-oA(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];nA(l,l.cellLength+c,i),n[t]=rA(e[t])}),n}function cA(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=lA(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(dA(a.style).link){i();let e=lA([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function lA(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>uA(e,t)):e,r=H.fromFragments(n);return r.end=``,r.noWrap=!0,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function uA(e,t){let n=e.copy();return n.style=t.add(dA(e.style)),n}function dA(e){return e instanceof B?e:B.parse(e)}var fA=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function pA(e,t,n,r,i){let{palette:a,tint:o}=e,s=mA(n,i),c=s===void 0?o:hA(a,s,`bg`);e.bg=c;let l=mA(r,i),u=l===void 0?$i(a,c,t):hA(a,l,`fg`);return new B({bgcolor:P.fromRgba(c),color:P.fromRgba(u)})}function mA(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function hA(e,t,n){try{return Vn(e,t)}catch(e){throw e instanceof Rn?new fA(t,n,e.message):e}}function gA(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,_A(e,t,o,n,r,i));return i}function _A(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=Ky(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}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=Ty.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=Ky(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}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=Ky(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:yA(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:yA(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:sS(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(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:yA(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 vA(e){return e.kind===`do`?vA(e.head):e}function yA(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function bA(e,t){return e.has(t)?w_(e.read(t)):``}function xA(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function SA(e,t,n,r){let i=new H(e,{style:B.combine([r,new B({link:t,bold:n})])});return i.noWrap=!0,i.end=``,i}function CA(e,t){return Math.max(e.members.indexOf(bA(t,e.stateVar)),0)}function wA(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=bA(r,e.stateVar);return{effects:[{verb:Kw,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=bA(r,e.stateVar);return{effects:[{verb:Kw,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=bA(r,e.stateVar);return{effects:[{verb:Kw,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(CA(e,r)+1)%e.members.length];return{effects:[{verb:Kw,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:qw,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:Jw,args:[xA(e.text,hv(r))]}],active:!1};case`open`:return{effects:[{verb:Yw,args:[xA(e.target,hv(r))]}],active:!1};case`persist-literal`:{let t=bA(r,e.stateVar);return{effects:[{verb:$w,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=bA(r,e.stateVar);return{effects:[{verb:$w,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(CA(e,r)+1)%e.members.length];return{effects:[{verb:$w,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:eT,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:iT,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:oT,args:[i]}],active:!1};case`redo`:return{effects:[{verb:sT,args:[i]}],active:!1};case`save`:return{effects:[{verb:tT,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:nT,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:rT,args:[i,xA(e.name,hv(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:lT,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:uT,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:dT,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:fT,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:aT,args:[i,e.key,mD(e.op)]}],active:!1};case`do`:{let a=wA(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>wA(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:aT,args:[i,e.key,mD(r)]}],active:!1}}}}function TA(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:gc(`action "${e}"`,n,t.members.length,CA(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 EA(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}=TA(e,vA(r),t,i),{effects:s,active:c}=wA(r,a,o,i,bA(i,`session.id`));return SA(a,hT(s),c)}function DA(e){return{action:{fn:(t,...n)=>EA(t,n,e),argTypes:[`string`,`string`],returnType:`T`}}}function OA(e,t){return SA(`✕`,hT([{verb:Kw,args:[bA(e,`session.id`),t,pc]}]),!1)}function kA(e,t,n){return new B({bgcolor:P.fromRgba(t),color:P.fromRgba($i(e,t,n))})}function AA(e,t,n){return kA(e.palette,fa(e.palette,e.disclosure,[t],n),n)}function jA(e,t,n,r,i){return r===void 0?n=>AA(e,{...n,distribution:t},i):(e,t)=>MA(r(t,n),i)}function MA(e,t){let n=Ui(e,`background`);return new B({bgcolor:P.fromRgba(n),color:P.fromRgba(Jn(Ui(e,`primary`),n,4.5,t))})}function NA(e){return{current:null,drawnAt:e}}function PA(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 FA(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 IA(e){return new H(e).cellLength}function LA(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function RA(e){return Math.max(1,LA(e)-(IA(`✕`)+2*e.padding+e.seamCols))}function zA(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 BA(e,t){let n=[];for(let t of e)n.length>0&&n.push(new H(` `)),n.push(t);let r=H.fromFragments(n);return r.noWrap=t,r.end=``,r}function VA(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 HA(e,t,n){let r=e.compiled.get(t),i=r&&vA(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 UA(e,t,n,r,i,a,o){let s=HA(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=bA(l,`session.id`),d=`stateVar`in s?bA(l,s.stateVar):void 0,f=s.options.map(IA),p=i?LA(a):1/0,m=IA(`✕`)+1,h=IA(`←`)+1+IA(`→`)+1,g=zA(f,p,m),_=g.length>1?zA(f,p,m+h):g,v=parseInt(bA(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>hT([{verb:Kw,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=hT([{verb:Kw,args:[u,...S]}]),ee=r?[{verb:Kw,args:[u,...S]}]:[],te=e=>hT([...wA(c,e,e,l,u).effects,...ee]),ne=[SA(`✕`,C,!1)];y>0&&ne.push(SA(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(SA(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(SA(`→`,x(y+1),!1)),BA(ne,i)}function WA(e,t){return{picker:{fn:(n,r,i,a)=>{let o=VA(e,r,`set-int`,`an int action ({ set, int: true })`);return UA(n,{key:o.key,stateVar:o.stateVar},[[o.key,`-1`]],i===!0,a===!0,e,jA(FA(t,`{{ picker }}`),Li(void 0),e,HA(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`,`bool`],returnType:`T`}}}function GA(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+IA(e(-(s+1)))+1+IA(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function KA(e,t,n,r,i){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 a=n.store;if(!a.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 o=n.compiled.get(e),s=bA(a,`session.id`),{options:c}=t,l=c.length,u=bA(a,t.stateVar),d=Math.max(c.indexOf(u),0),f=e=>((d+e)%l+l)%l,p=e=>c[f(e)],m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=hT(wA(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>SA(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=GA(p,l,IA(`◀`)+1+IA(p(0))+1+IA(`▶`),RA(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return BA([...v(-1).reverse(),SA(`◀`,h(-1),!1),g(0),SA(`▶`,h(1),!1),...v(1)],!0)}function qA(e,t){return{carousel:{fn:(n,r,...i)=>{if(i.length>0)throw Error(`carousel "${n}": takes at most one neighbours count after the action name, got ${1+i.length}`);if(r!==void 0&&!(Number.isInteger(r)&&r>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(r)}`);let a=r??1/0,o=HA(e,n,`carousel`);return KA(n,o,e,jA(FA(t,`{{ carousel }}`),Li(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`float`],returnType:`T`}}}const JA=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function YA(e,t,n){let r=aa(e,{hue:Ai,depth:0},n);return[U(t).map((t,n)=>({text:JA[n%JA.length],colour:Wi(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:Ui(e,`warning`)},{text:`error`,colour:Ui(e,`error`)}]]}function XA(e,t,n,r){let i=YA(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:kA(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 H(e)),a.push(t)}let s=H.fromFragments(a);return s.noWrap=!0,s.end=``,s}function ZA(e,t){return{themePreview:{fn:()=>XA(e.palette,e.progression,t.drawnAt(),RA(e)),argTypes:[],returnType:`T`}}}const QA=e=>e.slice(e.lastIndexOf(`.`)+1),$A=(e,t)=>{let n=new H(QA(e));return n.truncate(t,{marker:`…`}),n.plain};function ej(e,t){let n=e.map(e=>e.map(({name:e})=>IA(QA(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 tj(e,t,n,r){let i=ej(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${$A(s,i)} `,{style:kA(l,ga(l,{kind:`bar`,progression:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=H.fromFragments(a.flatMap((e,t)=>t===0?e:[new H(`
|
|
182
|
+
`),...e]));return o.noWrap=!0,o.end=``,o}function nj(e,t){return{layoutPreview:{fn:()=>tj(e.layout(),e.progression,t.drawnAt(),RA(e)),argTypes:[],returnType:`T`}}}function rj(e,t,n,r){let i=FA(r.activeSegment,`{{ menu }}`),a=r.action,o=gg(i.placementId,e,n.key),s=yg(o),c=hg(e),l=bA(a.store,o)===c,u=bA(a.store,`session.id`),d=l?pc:c,f=SA(gc(`{{ menu "${e}" }}`,t,2,+!!l),hT([{verb:Kw,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?[UA(e,{key:s,stateVar:s},[[o,pc],[s,`0`]],n.closeOnPick,n.paged,a,jA(i,n.distribution,a,HA(a,e,`menu`).paletteOf,r.activeSegment.drawnAt()))]:[]),f}const ij=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function aj(e,t){let n=t[t.length-1],r=ij(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:Cg(r??{})}}function oj(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=aj(t,n);return rj(t,r,i,e)},argTypes:[`string`,`value`],returnType:`T`}}}function sj(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=cj(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 H(t?i:a,{style:l===void 0?void 0:new B({color:l})}))}let l=H.fromFragments(c);return l.end=``,l.noWrap=!0,l}function cj(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 lj(e){let t={fn:(()=>{let t=FA(e,`{{ bgOf }}`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],returnType:`string`},n={fn:(()=>FA(e,`{{ tint }}`).tint.hex),argTypes:[],returnType:`string`},r=X_(()=>FA(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>sj({value:e,max:t,width:n,filled:i,empty:a,colourAt:o===void 0||s.length===0?void 0:e=>String(r.ramp.fn(e,o,...uj(s)))})),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`,`string`],returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function uj(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 dj(e){let t=[],n=[];for(let r of e){if(!r.contains(`
|
|
183
183
|
`)){n.push(r);continue}let e=r.split(`
|
|
184
|
-
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}const ij=({text:e,trail:t})=>t===void 0?[e]:[e,t];function aj(e,t){switch(e){case`vertical`:return sj(t.flatMap(e=>e));case`horizontal`:{let e=t.find(e=>e[0]?.span===`row`);return e===void 0?t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,span:`shared`},...t.flatMap(e=>e.slice(1))]:sj(e)}}}function oj(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,span:`shared`}]:aj(e.direction,e.children.map((t,i)=>n(t,[...r,cj(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function sj(e){return e.map(e=>e.span===`row`?{...e,span:`shared`}:e)}function cj(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:ts[e.direction]}}const lj={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:Li(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,ss(t.path,n)))}},render(e,t){return aj(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,cj(e,r))))}},uj={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:ns(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(yc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,cs(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...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=_v(t.scope,e.settings);try{if(!Kk(i.when,a))return[];let n=Ny(e.settings.theme,t.palette),{styles:o,fragments:s,trail:c,drops:l}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,trail:e.trail}),u=e.opens!==void 0&&Kk(e.opens.open,t.scope),d=l.length>0||u?o.trigger:o.closed,f={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:d,padding:t.padding},p=e.opens===void 0?[]:t.renderBody(e.opens.body,u,o.disclosure),m=p.slice(0,+(e.opens?.placement===`inline`)),h=p.slice(m.length),g=e.opens!==void 0&&h.some(e=>e.band===`own`)?Xk(eA([t.closeDisclosure(e.opens.key)],o.trigger),{...f,width:`auto`,baseStyle:o.trigger}):[],_=e=>e.band===`own`?g:[],v=h.map(e=>({cells:[..._(e),...e.cells],band:`deeper`,span:`shared`})),y=rj(eA(s,d)).map((e,t)=>({cells:Xk(e,{...f,trail:t===0?eA(c,d):[]}),band:`own`,span:`shared`})),b=l.map(e=>({cells:Xk(eA([e],o.band),{...f,baseStyle:o.band}),band:`deeper`,span:`shared`})),x=[...y,...b];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...x.flatMap(e=>e.cells),...h.flatMap(_)].flatMap(ij)),[...x.map((e,t)=>t===0&&m.length>0?{cells:[...e.cells,...m.flatMap(e=>e.cells)],band:`own`,span:`row`}:e),...v]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:Xk([new H(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,trail:dj(e,a,t)}),band:`own`,span:`shared`}]}}};function dj(e,t,n){if(e.trail===void 0)return[];try{return n.evaluateSegment(e,t,n.palette,n.region,{bg:void 0,fg:void 0,body:e.trail,trail:void 0}).fragments}catch(t){return n.onSegmentError?.(e.id,t.message??String(t)),[]}}const fj={container:lj,segment:uj};function pj(e){return fj[e]}function mj(e){if(`ttl`in e)return{kind:`ttl`,durationMs:iy(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 hj(e,t){switch(ds(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 gj(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:mj(n.cache),parse:hj(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cache:mj(n.cache),parse:hj(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?iy(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 _j(e,t){let n=rd.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 vj=e=>Ya(void 0,null,e.globals.progression);function yj(e,t,n){let r=n?.cwd??process.cwd(),i=By(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:LE({style:`powerline`,charset:za}),width:80,basePalette:i,palette:i,progression:ki[vj(e)],padding:1,seamCols:RE({style:`powerline`,charset:za}),layout:()=>[]},o=TA(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.looks),l=Eg(e.presets),u=new Map([...Wy(e),...gb(e)]),d=mv({...yA(a),...IA(a,o),...zA(a,o),...UA(a,o),...JA(a,o),...QA(s),...tj(o),looks:{fn:()=>c,argTypes:[]},presets:{fn:()=>l,argTypes:[]}},n?.clock,t.drawnAt),f=_j(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 Ey)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=cA(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{gj(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{gj(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=_s(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:()=>bs(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 pj(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=kg(e,t);C.set(t,S(n,r))}let ee=new Map;for(let t of Da){let n=e.globals[t];Oa(n)&&ee.set(t,bj(p,t,n))}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function bj(e,t,n){try{return e(n)}catch(e){throw Error(`globals.${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function xj(e,t,n){let r=e.globalExpressions.get(t);if(r===void 0)throw Error(`globals.${t} is an expression but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r.evaluate(n).map(e=>e.plain).join(``)}function Sj(e,t){return e.kind===`decided`?e.name:t}function Cj(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(Ka(a.colorCompatibility));let{preset:d=wg}=s??{},f=ki[s?.progression??vj(e)];t.menuRuntime.action.progression=f;let p=s?.look??Na(`none`,e.looks),m=s?.theme??Ry(void 0,null,e.globals.palette),h=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},look:{effective:t}});r.applyInput(h(Sj(m,ya),Sj(p,ja))),t.menuRuntime.action.chromeCols=LE(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=RE(a);let g=hv(n),_=Aa(m,()=>xj(t,`palette`,g),e=>Ly(e,e=>u?.(e))),v=Aa(p,()=>xj(t,`look`,g),t=>Na(t,e.looks));(_!==m||v!==p)&&r.applyInput(h(_.name,v.name));let y=_.value;t.menuRuntime.action.basePalette=y;let b=Fy(y,v.value);t.menuRuntime.action.palette=b,c?.clear();let x=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},S=(e,n,i,a,o)=>{try{let s=r.drawnAt(),{tint:c,disclosure:l}=ga(i,a,s),u=EA(t.activeSegment,e.name,e.id,i,l,c),d=aA(u,s,o.bg,o.fg,n),f=o.body.evaluate(n),p=o.trail?.evaluate(n)??[];return{styles:{closed:d,get trigger(){return xA(i,aa(i,l,s).state,s)},get band(){return xA(i,aa(i,l,s).plane,s)},disclosure:l},fragments:f,trail:p,drops:u.drops}}finally{t.activeSegment.current=null}},C=(e,t,r)=>{let i=t&&Kk(e.when,g),o={scope:g,palette:b,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:S,lookupSegment:x,renderChild:(e,t,n)=>C(e,t,ma(r,n)),renderBody:(e,t,n)=>C(e,i&&t,ha(n)),closeDisclosure:e=>bA(n,e)};return pj(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 "${wg}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let te=e=>{if(!Kk(e.when,g))return!1;if(e.kind===`container`)return!0;if(Eb(e.name)===void 0)return!1;try{return Kk(t.segments[e.name].when,_v(g,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>oj(ee,te).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Eb(e);return r===void 0?[]:[{name:r,address:t,palette:Ny(n.theme,b)}]})),C(ee,!0,pa(f)).map(e=>zE($k(e.cells,a),a)).join(`
|
|
185
|
-
`)}var
|
|
186
|
-
`)||null}var Lj=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=Mj(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=this.loadFromDisk(e,t,n),o={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:a.error,lastWarning:a.warning,state:a.state??this.buildState(t,null,[]),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.state.validatorDisposers.forEach(e=>e()),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=this.loadFromDisk(e.projectDir,e.cwd,e.configFile);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(e.state.registry.dispose(),e.state.validatorDisposers.forEach(e=>e()),e.state=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}loadFromDisk(e,t,n){let r=mC(e,t,n),i=r.kind===`file`?r.path:null,a=[vC(e,t),gC(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof Yo&&a.push(...e.warnings),{resolvedPath:i,warning:Ij(a),state:null,error:e instanceof Yo||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:Ij(a),state:o,error:null}}buildState(e,t,n){let r=yC(t,RD),{config:i,raw:a}=r;n.push(...r.warnings);let o=SC(r,t??`<default>`),s=new jj,c=new xy(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=yj(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of tk(o))u.push(JO(e,t));for(let{key:e,spec:t}of DD(o))u.push(OD(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:pO(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:Nj(i,a)}}refreshWatcher(e,t){e.configFilePath=t;let n=Fj(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){Q(`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 Rj=16384;var zj=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<Rj){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%Rj}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:mT,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}}};const Bj={load:()=>({}),save:()=>{},flush:()=>{}};function Vj(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var Hj=class{sessions;storage;atom=(0,x_.createAtom)(`SessionState`);constructor(e=Bj,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=Vj(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,x_.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,x_.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,x_.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};const Uj=(e,t)=>D(t);function Wj(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 Gj=class{timer=null;pending=null;constructor(e,t=500,n=Uj){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 Wj(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(c.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const Kj={default_bg:`string`,default_fg:`string`,default_empty_value:`string`,default_separator:`string`,default_truncate_marker:`string`,palette:`string`,look:`string`,preset:`string`,style:`string`,progression:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},qj=new Set([`1`,`true`]),Jj=new Set([`0`,`false`,``]);function Yj(e,t){let n=bM(e),r=n.scope===`segment-palette`?`string`:Kj[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(qj.has(t))return`true`;if(Jj.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function Xj(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function Zj(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),ke(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function Qj(e){return/^\s*$/.test(e)?null:uo(e)}function $j(e,t){return e!==null&&po(e,t)!==void 0}function eM(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(eM),...i}}return e}function tM(e){if(!tc(e))return eM(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,eM(t)])),...n}}const nM=ID,rM=nM.segments,iM=nM.presets,aM=nM.root;function oM(e,t,n,r){if(!$j(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function sM(e,t){let n=$y(t);return t.scope===`segment-palette`&&oM(e,[`segments`,t.segment],rM[t.segment],n.join(`.`)),n}function cM(e){return uo(xo(e))}function lM(){return Object.entries(aM.rows).map(([e,t])=>{let n=eM(t);return{path:[`root`],fragment:cM({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function uM(e,t){let n=e===null?void 0:po(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function dM(e,t){if(t===void 0)return null;let n=tM(t);return{path:e,fragment:cM(n),unit:{path:e,value:n}}}function fM(e,t){let n=[`presets`,t],r=[...n,`root`],i=iM[t];oM(e,n,i,r.join(`.`));let a=uM(e,r)??dM(r,i?.root);return a!==null&&Ho(a.fragment)?a:null}function pM(e,t){let n=Vo(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 mM(e,t){return[...lM(),uM(e,[`root`]),fM(e,t)].filter(e=>e!==null).reduce(pM,new Map)}function hM(e,t,n){for(let{node:r,...i}of mM(e,t).values())if(Wo(r,n))return i;throw new $(`${gM(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 gM(e,t){return fM(e,t)?.path??[`root`]}function _M(e,t){return t.scope===`preset-root`?gM(e,t.preset):$y(t)}function vM(e,{unit:t}){return t===null?e:Fo(e,t.path,xo(t.value),yo)}function yM(e){let t=Qy(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function bM(e){let t=yM(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function xM(e,t,n,r){SM(t,r),Zj(t,r,e.logger),e.record(t,n,r)}function SM(e,t){try{return SC(bC(e,t,RD),e)}catch(e){throw e instanceof Yo?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function CM(e,t){let n=bM(t),r=Qj(Xj(e)??``),i=r===null?void 0:po(r,$y(n));return i!==void 0&&`value`in i?i.value:void 0}function wM(e,t,n){TM(e,t,n,[])}function TM(e,t,n,r){let i=Xj(t);xM(e,t,i,EM(n.reduce((e,[t,n])=>Fo(e,sM(Qj(e),bM(t)),Yj(t,n),yo),i??``),t,r,e=>e))}function EM(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=hM(Qj(s),n,i),l=Jo(vM(s,c),c.path,i,a,xo(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 DM(e,t,n){let r=Qj(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of mM(r,t)){if(!Wo(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?ho(e,c):xo(s.value);if(a!==`#`)return Fo(e,[...i,`rows`,a],l,yo);if(fM(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 Fo(e,i,l,yo)}return e}function OM(e,t){return Lo(e,t,t[0]===`presets`&&t.length>2&&!BD(t[1])?2:0)}function kM(e,t,n){let r=n.map(yM),i=Xj(t);if(i===null)return;let a=r.reduce((e,t)=>OM(e,_M(Qj(e),t)),i);a!==i&&xM(e,t,i,a)}function AM(e){let t=e===null?void 0:po(e,[`presets`]),n=new Set([...zD,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(kl));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(kl(e)))}function jM(e,t,n,r,i,a){let o=Xj(t),s=Qj(o??``),c=AM(s),l=[`presets`,c],u=fM(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?ho(o??``,u.fragment):xo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],xo(r)]]],f=i.map(([e,t])=>{let n=Zy(c,e);return[sM(s,bM(n)),Yj(n,t)]});return xM(e,t,o,EM([...d,...f].reduce((e,[t,n])=>Fo(e,t,n,yo),Fo(o??``,l,`{}`,yo)),t,a.map(e=>({...e,preset:c})),DM)),c}function MM(e,t,n){if(BD(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=Xj(t),a=Qj(i??``);if(i===null||a===null||po(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=po(a,[`globals`,`preset`]);xM(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>OM(e,t),i))}function NM(e,t,n,r){let i=yM(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=Xj(t),o=r.op===`remove`?r.target:r.anchor,s=hM(Qj(a??``),i.preset,o),c=vM(a??``,s),{after:l,placed:u}=PM(c,s.path,r,()=>{let e=SM(t,c);return Eg(e.presets).map(t=>kg(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 xM(e,t,a,l),u}function PM(e,t,n,r){switch(n.op){case`remove`:return{after:Ko(e,t,n.target),placed:null};case`insert`:{let i=lD(n.segment,n.anchor,r());return{after:qo(e,t,i,n.anchor,n.relation),placed:i}}}}const FM={load:()=>({}),save:()=>{}},IM=new Set(wy.map(e=>e.sessionKey)),LM=e=>IM.has(e)||e.startsWith(qg),RM={past:[],future:[]},zM=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var BM=class{state=new Map;constructor(e,t,n=FM){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}=this.state.get(e)??RM;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??RM}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(zM(n));r.set(zM(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=this.sessionState,r=(e,r,i)=>{let a=r.filter(LM).map(t=>({key:t,before:n.get(e,t)}));i();for(let{key:r,before:i}of a)t(e,{kind:`session`,key:r,before:i,after:n.get(e,r)})};return{sessionState:{get:(e,t)=>n.get(e,t),set:(e,t,i)=>r(e,[t],()=>n.set(e,t,i)),setBatch:(e,t)=>r(e,t.map(e=>e.key),()=>n.setBatch(e,t)),clear:(e,t)=>r(e,[t],()=>n.clear(e,t))},file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=[...e];e.clear();for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length!==0&&this.put(e,{past:UM([...this.history(e).past,t]),future:[]})}}}}undo(e){let{past:t,future:n}=this.history(e),r=t.at(-1);if(r===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,r,`before`,`undo`,{past:t.slice(0,-1),future:UM([...n,r])}),r}redo(e){let{past:t,future:n}=this.history(e),r=n.at(-1);if(r===void 0)throw new $(`redo: nothing to redo`);return this.apply(e,r,`after`,`redo`,{past:UM([...t,r]),future:n.slice(0,-1)}),r}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(zM));throw this.put(e,{past:WM(this.history(e).past,t),future:WM(this.history(e).future,t)}),new $(`${r}: ${o.map(KM).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):Xj(t.file)}write(e,t,n){t.kind===`file`?Zj(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)&&n.set(e,t);n.size>32||VM(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,HM(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function VM(e){let t=0;for(let{past:n,future:r}of e.values())for(let e of[...n,...r])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function HM({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function UM(e){return e.slice(-50)}function WM(e,t){return e.map(e=>e.filter(e=>!t.has(zM(e)))).filter(e=>e.length>0)}function GM(e){return e.map(KM).join(`, `)}function KM(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function qM(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 JM(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(qM))}function YM(e){if(typeof e!=`object`||!e)return!1;let t=e;return JM(t.past)&&JM(t.future)}function XM(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(YM))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),ke(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)}}}}function ZM(e,t,n,r){let i=Ee({bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r});if(i.ok)return{kind:`ok`,stdout:i.stdout};if(i.reason===`rate-limited`)return{kind:`rate-limited`,reason:i.error??`rate-limited`};let a=i.error??[i.reason,i.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${n[0]} failed (${a})`}}function QM(e){let t=ZM(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 $M(){return{probeTmux:QM}}function eN(e){let t=bT(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 tN(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function nN(e,t){return{tmux:tN(e,t.tmux),claudeSettings:eN(_T(gT(t.claudeConfigDir)))}}function rN(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=Fo(yT(n),[`env`,e.name],JSON.stringify(e.value),bo);return r.mkdirSync(c.dirname(n),{recursive:!0}),ke(n,i),{...t,claudeSettings:eN(n)}}default:return e.kind}}const iN=/^─{20,}/,aN=/^❯(\s|$)/,oN=/›\s*stashed$/;function sN(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>iN.test(e)?[t]:[]).at(-2);return n===void 0||!aN.test(t[n+1]??``)?{kind:`no-prompt`}:oN.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const cN={"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 lN(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=sN(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:cN[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const uN=`cc-candybar-slash`;function dN(e,t,n,r){let i=ZM(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function fN(e){let t=dN(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(`
|
|
187
|
-
`);return{inMode:n!==`0`,screen:r}}function pN(e,t){let n=dN(e,`claude-input.type`,[`load-buffer`,`-b`,uN,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,uN,`-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 mN(){return{read:fN,type:pN}}function hN(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function gN(e){return _N(()=>decodeURIComponent(e))}function _N(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function vN(e,t){let n=Ee({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 yN=(e,t)=>vN(gN(e),t),bN=(e,t)=>{let n=Ee({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,gN(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`})`)}},xN=(e,t)=>vN(gN(e),t),SN=(e,t)=>vN(gN(e),t),CN=(e,t)=>{let n=hN(gN(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},wN=(e,t)=>{let[n=``,...r]=_N(()=>sT(e)),i=hN(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${qO().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: ${qO().join(`, `)})`);let a=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=YO(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},TN=/^-?\d+$/;function EN(e,t,n){return e>n?t:e<t?n:e}const DN=(e,t)=>{let[n=``,r=``,i=``]=_N(()=>sT(e)),a=hN(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!TN.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=XO(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${qO().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&TN.test(c)?ON(s,parseInt(c,10)):kN(`step-state`,r,s,$O(t.configFor(NN(t,a)),e=>t.sessionState.get(a,e),r)),u=EN(l+o,s.min,s.max),d=YO(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function ON(e,t){return Math.max(e.min,Math.min(e.max,t))}function kN(e,t,n,r){if(r===null)return n.min;if(!TN.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return ON(n,parseInt(r,10))}const AN=`render-origin`;function jN(e){return JSON.stringify(e)}function MN(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 NN(e,t){let n=e.sessionState.get(t,AN);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return MN(n)}function PN(e){return hC(e.projectDir,e.cwd,e.configFile??void 0)}function FN(e,t){return PN(NN(e,t))}function IN(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const LN=(e,t)=>{let[n=``,r=``,i=``]=_N(()=>sT(e)),a=hN(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${bD().join(`, `)})`);let o=xD(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=FN(t,a);wM(IN(t,a),s,[[r,o.value]]),t.dlog(`info`,`set-config: ${r}=${o.value} → ${s} (session=${a})`)},RN=(e,t)=>{let[n=``,r=``,i=``]=_N(()=>sT(e)),a=hN(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!TN.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=SD(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${bD().join(`, `)})`);let c=NN(t,a),l=PN(c),u=CM(l,r),d=typeof u==`number`?ON(s,u):kN(`step-config`,r,s,wD(t.configFor(c),r)),f=EN(d+o,s.min,s.max),p=xD(r,String(f));if(!p.ok)throw new $(`step-config: ${p.reason}`);wM(IN(t,a),l,[[r,p.value]]),t.dlog(`info`,`step-config: ${r} ${d}→${p.value} (by ${o}) → ${l} (session=${a})`)},zN=(e,t)=>{let[n=``]=_N(()=>sT(e)),r=hN(n),i=NN(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=NO(a,o),c=PO(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=YO(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});VN(`save`,c);let u=PN(i);TM(IN(t,r),u,l,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: ${[...l.map(([e,t])=>`${e}=${t}`),...c.map(BN)].join(` `)} → ${u} (session=${r})`)},BN=e=>`${e.preset}/${e.id}.settings.${e.setting}=${ys(e.value)}`;function VN(e,t){for(let n of t){let t=YO(n.key,ys(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const HN=(e,t)=>{let[n=``]=_N(()=>sT(e)),r=hN(n),i=NN(t,r),a=LO(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=YO(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});VN(`save-preset`,a.placements);let s=PN(i),c=jM(IN(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...wy.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,Cy.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(BN)].join(` `)} → ${s} (session=${r})`)},UN=(e,t)=>{let[n=``,r=``]=_N(()=>sT(e)),i=hN(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=NN(t,i),o=PN(a);MM(IN(t,i),o,r),t.reloadConfig(a);let s=Cy.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},WN=(e,t)=>{let[n=``,...r]=_N(()=>sT(e)),i=hN(n),a=bD(),o=r.length===0?[``]:r.filter(e=>!a.includes(e));if(o.length>0)throw new $(`reset-config: unknown config key "${o.join(`", "`)}" (have: ${a.join(`, `)})`);let s=NN(t,i),c=PN(s),l=r.map(RO),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);kM(IN(t,i),c,u),t.reloadConfig(s);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 GN(e,t){let n=(e,t)=>[...os(kg(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(Eg(t.presets).flatMap(e=>n(t,e).map(t=>`${e}\0${ns(t)}`)));return Eg(e.presets).flatMap(t=>n(e,t).flatMap(e=>r.has(`${t}\0${ns(e)}`)?[]:Object.values(e.drafts??{}).map(e=>e.key)))}const KN=(e,t)=>{let[n=``,r=``,i=``]=_N(()=>sT(e)),a=hN(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${bD().join(`, `)})`);let o=xD(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=cD(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=NN(t,a),l=PN(c),u=t.configFor(c),d=NM(IN(t,a),l,r,s);t.reloadConfig(c);let f=GN(u,t.configFor(c)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of f)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${o.value} → ${l} placed=${JSON.stringify(d)} released=${JSON.stringify(f)} (session=${a})`)},qN=(e,t)=>{let[n=``]=_N(()=>sT(e)),r=hN(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${GM(i)} (session=${r})`)},JN=(e,t)=>{let[n=``]=_N(()=>sT(e)),r=hN(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${GM(i)} (session=${r})`)},YN=(e,t)=>{hN(gN(e)),t.applyUpdate()},XN=`client-hints`;function ZN(e,t){let n=e.sessionState.get(t,XN);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 kC(r)}function QN(e,t,n){let r=Rb(n);e.sessionState.setBatch(t,Hb(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const $N=(e,t)=>{let n=hN(gN(e));QN(t,n,nN(t.doctor,ZN(t,n)))},eP=(e,t)=>{let[n=``,r=``]=_N(()=>sT(e)),i=hN(n),a=zb(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=nN(t.doctor,ZN(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=rN(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),QN(t,i,c)},tP=(e,t)=>{let[n=``,...r]=_N(()=>sT(e)),i=hN(n),a=NN(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=Qx(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`};t.memento.move({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i})`)},nP=(e,t)=>{let[n=``,r=``]=_N(()=>sT(e)),i=hN(n),a=Object.values(t.configFor(NN(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: ${a.map(e=>e.slash).join(`, `)||`none`})`);let s=lN(t.claudeInput,ZN(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})`)},rP=`config-override`,iP=new Map([[Vw,yN],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=hN(_N(()=>decodeURIComponent(e.slice(0,n)))),i=_N(()=>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,rP),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,rP,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Hw,bN],[zw,wN],[Bw,DN],[Kw,LN],[qw,RN],[Zw,WN],[Jw,zN],[Yw,HN],[Xw,UN],[Qw,KN],[$w,qN],[eT,JN],[Ww,xN],[Gw,SN],[Uw,CN],[tT,YN],[nT,$N],[rT,eP],[iT,tP],[aT,nP]]),aP=new Set([zw,Bw,Kw,qw,Zw,Jw,Yw,Xw,Qw,$w,eT,Uw,tT,nT,rT,iT,aT]),oP=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of dT(lT(e))){if(!i&&aP.has(a)){let e=sT(o);e.length>0&&e[0]&&(i=e[0])}let e=iP.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(`
|
|
188
|
-
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function sP(e){return(t,n)=>{let r=n.history.begin(),i=[];try{e(t,{...n,sessionState:r.sessionState,journal:r})}catch(e){i.push(e)}try{r.commit()}catch(e){i.push(e)}if(i.length===1)throw i[0];if(i.length>1)throw Error(i.map(e=>String(e.message??e)).join(`; `))}}const cP=new Map([...iP,[Rw,oP]].map(([e,t])=>[e,sP(t)]));Object.freeze([...cP.keys()]);const lP=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`]),uP=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]];function dP(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of uP){let i=pP(n,e);if(i==null)t.missingRequired.push(e);else{let n=fP(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))lP.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function fP(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function pP(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 mP(e,t){switch(e){case`vars`:return{what:e,vars:hP(t)};case`segments`:return{what:e,segments:bP(t)};case`config`:return{what:e,config:wP(t)}}}function hP(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=vP(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,...gP(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:_P(r.lastUpdatedMs())})}return o}function gP(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 _P(e){return e===null?null:Math.max(0,Date.now()-e)}function vP(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,yP(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}`,yP(i));return t}function yP(e){return e.kind}function bP(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=SP(n),o=xP(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:CP(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function xP(e){let t=new Map;for(let n of Eg(e.presets))for(let r of os(kg(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=ns(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function SP(e){let t=[],n=new Set;for(let r of os(ic(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 CP(e,t,n){let r=new Set;for(let i of d_(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 wP(e){return e===null?null:e.config}const TP=[`vars`,`segments`,`config`];function EP(e){return typeof e==`string`&&TP.includes(e)}function DP(e){return Math.max(1,e-2)}var OP=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 kk(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)}},kP=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=VD(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await Nk(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 AP={messageCount:0,recent:[]};function jP(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!Dk(t),recent:n.length>20?n.slice(-20):n}}function MP(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(Dk(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 NP=class{fold=new kP(AP,jP);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:MP(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};const PP={command:null,todos:[],pending:[],done:[]};function FP(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 IP(e,t){if(t.isSidechain)return e;let n=Dk(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=FP(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos}}function LP(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>FP(e,t.name),[]),done:e.done}}var RP=class{fold=new kP(PP,IP);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(LP(n.value))}};const zP=new Map;function BP(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var VP=class{async getSessionId(){if(!process.env.TMUX_PANE)return Y;let e=BP(process.env.TMUX),t=zP.get(e);if(t!==void 0)return t;D(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await Te({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?J(n.stdout.trim()):Y:X(`tmux display-message: ${n.reason}`);return zP.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};const HP=e=>`${e.sessionId}|${e.projectDir}|${e.cwd}`;var UP=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=HP(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.projectDir),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.projectDir);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=HP(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};const WP=c.join(`lib`,`ceiling_config.py`),GP=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function KP(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 qP(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 JP(e,t){if(!r.existsSync(e))return Y;let n;try{n=KP(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=qP([c.join(c.dirname(c.dirname(e)),`settings.json`),c.join(t,`.claude`,`settings.json`),c.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[WP,GP].filter(e=>!r.existsSync(c.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 YP(e){let{CLAUDE_PROJECT_DIR:t,CLAUDE_CODE_SESSION_ID:n,...r}=process.env;return{...r,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function XP(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function ZP(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 QP(e,t){let n=await Te({bin:`python3`,args:[`-c`,`
|
|
184
|
+
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}const fj=({text:e,trail:t})=>t===void 0?[e]:[e,t];function pj(e,t){switch(e){case`vertical`:return hj(t.flatMap(e=>e));case`horizontal`:{let e=t.find(e=>e[0]?.span===`row`);return e===void 0?t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,span:`shared`},...t.flatMap(e=>e.slice(1))]:hj(e)}}}function mj(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,span:`shared`}]:pj(e.direction,e.children.map((t,i)=>n(t,[...r,gj(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function hj(e){return e.map(e=>e.span===`row`?{...e,span:`shared`}:e)}function gj(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:ts[e.direction]}}const _j={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:Li(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,ss(t.path,n)))}},render(e,t){return pj(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,gj(e,r))))}},vj={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:ns(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(yc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,cs(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...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=_v(t.scope,e.settings);try{if(!eA(i.when,a))return[];let n=Ny(e.settings.theme,t.palette),{styles:o,fragments:s,trail:c,drops:l}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,trail:e.trail}),u=e.opens!==void 0&&eA(e.opens.open,t.scope),d=l.length>0||u?o.trigger:o.closed,f={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:d,padding:t.padding},p=e.opens===void 0?[]:t.renderBody(e.opens.body,u,o.disclosure),m=p.slice(0,+(e.opens?.placement===`inline`)),h=p.slice(m.length),g=e.opens!==void 0&&h.some(e=>e.band===`own`)?iA(cA([t.closeDisclosure(e.opens.key)],o.trigger),{...f,width:`auto`,baseStyle:o.trigger}):[],_=e=>e.band===`own`?g:[],v=h.map(e=>({cells:[..._(e),...e.cells],band:`deeper`,span:`shared`})),y=dj(cA(s,d)).map((e,t)=>({cells:iA(e,{...f,trail:t===0?cA(c,d):[]}),band:`own`,span:`shared`})),b=l.map(e=>({cells:iA(cA([e],o.band),{...f,baseStyle:o.band}),band:`deeper`,span:`shared`})),x=[...y,...b];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...x.flatMap(e=>e.cells),...h.flatMap(_)].flatMap(fj)),[...x.map((e,t)=>t===0&&m.length>0?{cells:[...e.cells,...m.flatMap(e=>e.cells)],band:`own`,span:`row`}:e),...v]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:iA([new H(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,trail:yj(e,a,t)}),band:`own`,span:`shared`}]}}};function yj(e,t,n){if(e.trail===void 0)return[];try{return n.evaluateSegment(e,t,n.palette,n.region,{bg:void 0,fg:void 0,body:e.trail,trail:void 0}).fragments}catch(t){return n.onSegmentError?.(e.id,t.message??String(t)),[]}}const bj={container:_j,segment:vj};function xj(e){return bj[e]}function Sj(e){if(`ttl`in e)return{kind:`ttl`,durationMs:iy(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 Cj(e,t){switch(ds(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 wj(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:Sj(n.cache),parse:Cj(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cache:Sj(n.cache),parse:Cj(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?iy(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 Tj(e,t){let n=rd.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 Ej=e=>Ya(void 0,null,e.globals.progression);function Dj(e,t,n){let r=n?.cwd??process.cwd(),i=By(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:WE({style:`powerline`,charset:za}),width:80,basePalette:i,palette:i,progression:ki[Ej(e)],padding:1,seamCols:GE({style:`powerline`,charset:za}),layout:()=>[]},o=NA(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.looks),l=Eg(e.presets),u=new Map([...Wy(e),...gb(e)]),d=mv({...DA(a),...WA(a,o),...qA(a,o),...ZA(a,o),...nj(a,o),...oj(s),...lj(o),looks:{fn:()=>c,argTypes:[]},presets:{fn:()=>l,argTypes:[]}},n?.clock,t.drawnAt),f=Tj(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 Ey)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=gA(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{wj(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{wj(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=_s(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:()=>bs(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 xj(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=kg(e,t);C.set(t,S(n,r))}let ee=new Map;for(let t of Da){let n=e.globals[t];Oa(n)&&ee.set(t,Oj(p,t,n))}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function Oj(e,t,n){try{return e(n)}catch(e){throw Error(`globals.${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function kj(e,t,n){let r=e.globalExpressions.get(t);if(r===void 0)throw Error(`globals.${t} is an expression but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r.evaluate(n).map(e=>e.plain).join(``)}function Aj(e,t){return e.kind===`decided`?e.name:t}function jj(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(Ka(a.colorCompatibility));let{preset:d=wg}=s??{},f=ki[s?.progression??Ej(e)];t.menuRuntime.action.progression=f;let p=s?.look??Na(`none`,e.looks),m=s?.theme??Ry(void 0,null,e.globals.palette),h=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},look:{effective:t}});r.applyInput(h(Aj(m,ya),Aj(p,ja))),t.menuRuntime.action.chromeCols=WE(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=GE(a);let g=hv(n),_=Aa(m,()=>kj(t,`palette`,g),e=>Ly(e,e=>u?.(e))),v=Aa(p,()=>kj(t,`look`,g),t=>Na(t,e.looks));(_!==m||v!==p)&&r.applyInput(h(_.name,v.name));let y=_.value;t.menuRuntime.action.basePalette=y;let b=Fy(y,v.value);t.menuRuntime.action.palette=b,c?.clear();let x=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},S=(e,n,i,a,o)=>{try{let s=r.drawnAt(),{tint:c,disclosure:l}=ga(i,a,s),u=PA(t.activeSegment,e.name,e.id,i,l,c),d=pA(u,s,o.bg,o.fg,n),f=o.body.evaluate(n),p=o.trail?.evaluate(n)??[];return{styles:{closed:d,get trigger(){return kA(i,aa(i,l,s).state,s)},get band(){return kA(i,aa(i,l,s).plane,s)},disclosure:l},fragments:f,trail:p,drops:u.drops}}finally{t.activeSegment.current=null}},C=(e,t,r)=>{let i=t&&eA(e.when,g),o={scope:g,palette:b,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:S,lookupSegment:x,renderChild:(e,t,n)=>C(e,t,ma(r,n)),renderBody:(e,t,n)=>C(e,i&&t,ha(n)),closeDisclosure:e=>OA(n,e)};return xj(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 "${wg}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let te=e=>{if(!eA(e.when,g))return!1;if(e.kind===`container`)return!0;if(Eb(e.name)===void 0)return!1;try{return eA(t.segments[e.name].when,_v(g,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>mj(ee,te).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Eb(e);return r===void 0?[]:[{name:r,address:t,palette:Ny(n.theme,b)}]})),C(ee,!0,pa(f)).map(e=>KE(sA(e.cells,a),a)).join(`
|
|
185
|
+
`)}var Mj=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,Rj(e,t,n,`initial value`),this.cell=x_.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){Rj(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}},Nj=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,x_.computed)(()=>{let e=n();return Rj(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},Pj=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=x_.observable.box(Lj(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=Lj(e);Ij(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function Fj(e){return JSON.stringify(e)}function Ij(e,t){return Fj(e)===Fj(t)}function Lj(e){return e.kind===`ok`?{kind:`ok`,value:S_(e.value)}:e}function Rj(e,t,n,r){let i=C_(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var zj=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new Mj(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new Pj(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new Nj(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,x_.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,x_.runInAction)(()=>n.set(t))}runInAction(e){(0,x_.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 Fj(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 Bj(e,t,n){return e+`\0`+t+`\0`+(n??``)}function Vj(e,t){return new Set(Eg(e.presets).filter(n=>kg(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function Hj(e){let t=c.basename(e),n=c.dirname(e);for(;!r.existsSync(n);)t=c.basename(n),n=c.dirname(n);return{dir:n,name:t}}function Uj(e,t){let n=new Map;for(let t of yC(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=Hj(t);n.has(e)||n.set(e,new Set),n.get(e).add(r)}return{files:t===null?[]:[t],dirs:[...n.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({path:e,filenames:[...t].sort()}))}}function Wj(e){return e.filter(Boolean).join(`
|
|
186
|
+
`)||null}var Gj=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=Bj(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=this.loadFromDisk(e,t,n),o={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:a.error,lastWarning:a.warning,state:a.state??this.buildState(t,null,[]),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.state.validatorDisposers.forEach(e=>e()),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=this.loadFromDisk(e.projectDir,e.cwd,e.configFile);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(e.state.registry.dispose(),e.state.validatorDisposers.forEach(e=>e()),e.state=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}loadFromDisk(e,t,n){let r=xC(e,t,n),i=r.kind===`file`?r.path:null,a=[TC(e,t),CC(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof Yo&&a.push(...e.warnings),{resolvedPath:i,warning:Wj(a),state:null,error:e instanceof Yo||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:Wj(a),state:o,error:null}}buildState(e,t,n){let r=EC(t,KD),{config:i,raw:a}=r;n.push(...r.warnings);let o=kC(r,t??`<default>`),s=new zj,c=new xy(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=Dj(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of lk(o))u.push(nk(e,t));for(let{key:e,spec:t}of PD(o))u.push(FD(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:xO(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:Vj(i,a)}}refreshWatcher(e,t){e.configFilePath=t;let n=Uj(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){Q(`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 Kj=16384;var qj=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<Kj){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%Kj}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:xT,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}}};const Jj={load:()=>({}),save:()=>{},flush:()=>{}};function Yj(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var Xj=class{sessions;storage;atom=(0,x_.createAtom)(`SessionState`);constructor(e=Jj,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=Yj(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,x_.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,x_.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,x_.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};const Zj=(e,t)=>D(t);function Qj(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 $j=class{timer=null;pending=null;constructor(e,t=500,n=Zj){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 Qj(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(c.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const eM={default_bg:`string`,default_fg:`string`,default_empty_value:`string`,default_separator:`string`,default_truncate_marker:`string`,palette:`string`,look:`string`,preset:`string`,style:`string`,progression:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},tM=new Set([`1`,`true`]),nM=new Set([`0`,`false`,``]);function rM(e,t){let n=OM(e),r=n.scope===`segment-palette`?`string`:eM[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(tM.has(t))return`true`;if(nM.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function iM(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function aM(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),ke(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function oM(e){return/^\s*$/.test(e)?null:uo(e)}function sM(e,t){return e!==null&&po(e,t)!==void 0}function cM(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(cM),...i}}return e}function lM(e){if(!tc(e))return cM(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,cM(t)])),...n}}const uM=WD,dM=uM.segments,fM=uM.presets,pM=uM.root;function mM(e,t,n,r){if(!sM(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function hM(e,t){let n=$y(t);return t.scope===`segment-palette`&&mM(e,[`segments`,t.segment],dM[t.segment],n.join(`.`)),n}function gM(e){return uo(xo(e))}function _M(){return Object.entries(pM.rows).map(([e,t])=>{let n=cM(t);return{path:[`root`],fragment:gM({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function vM(e,t){let n=e===null?void 0:po(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function yM(e,t){if(t===void 0)return null;let n=lM(t);return{path:e,fragment:gM(n),unit:{path:e,value:n}}}function bM(e,t){let n=[`presets`,t],r=[...n,`root`],i=fM[t];mM(e,n,i,r.join(`.`));let a=vM(e,r)??yM(r,i?.root);return a!==null&&Ho(a.fragment)?a:null}function xM(e,t){let n=Vo(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 SM(e,t){return[..._M(),vM(e,[`root`]),bM(e,t)].filter(e=>e!==null).reduce(xM,new Map)}function CM(e,t,n){for(let{node:r,...i}of SM(e,t).values())if(Wo(r,n))return i;throw new $(`${wM(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 wM(e,t){return bM(e,t)?.path??[`root`]}function TM(e,t){return t.scope===`preset-root`?wM(e,t.preset):$y(t)}function EM(e,{unit:t}){return t===null?e:Fo(e,t.path,xo(t.value),yo)}function DM(e){let t=Qy(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function OM(e){let t=DM(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function kM(e,t,n,r){AM(t,r),aM(t,r,e.logger),e.record(t,n,r)}function AM(e,t){try{return kC(DC(e,t,KD),e)}catch(e){throw e instanceof Yo?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function jM(e,t){let n=OM(t),r=oM(iM(e)??``),i=r===null?void 0:po(r,$y(n));return i!==void 0&&`value`in i?i.value:void 0}function MM(e,t,n){NM(e,t,n,[])}function NM(e,t,n,r){let i=iM(t);kM(e,t,i,PM(n.reduce((e,[t,n])=>Fo(e,hM(oM(e),OM(t)),rM(t,n),yo),i??``),t,r,e=>e))}function PM(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=CM(oM(s),n,i),l=Jo(EM(s,c),c.path,i,a,xo(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 FM(e,t,n){let r=oM(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of SM(r,t)){if(!Wo(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?ho(e,c):xo(s.value);if(a!==`#`)return Fo(e,[...i,`rows`,a],l,yo);if(bM(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 Fo(e,i,l,yo)}return e}function IM(e,t){return Lo(e,t,t[0]===`presets`&&t.length>2&&!JD(t[1])?2:0)}function LM(e,t,n){let r=n.map(DM),i=iM(t);if(i===null)return;let a=r.reduce((e,t)=>IM(e,TM(oM(e),t)),i);a!==i&&kM(e,t,i,a)}function RM(e){let t=e===null?void 0:po(e,[`presets`]),n=new Set([...qD,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(kl));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(kl(e)))}function zM(e,t,n,r,i,a){let o=iM(t),s=oM(o??``),c=RM(s),l=[`presets`,c],u=bM(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?ho(o??``,u.fragment):xo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],xo(r)]]],f=i.map(([e,t])=>{let n=Zy(c,e);return[hM(s,OM(n)),rM(n,t)]});return kM(e,t,o,PM([...d,...f].reduce((e,[t,n])=>Fo(e,t,n,yo),Fo(o??``,l,`{}`,yo)),t,a.map(e=>({...e,preset:c})),FM)),c}function BM(e,t,n){if(JD(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=iM(t),a=oM(i??``);if(i===null||a===null||po(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=po(a,[`globals`,`preset`]);kM(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>IM(e,t),i))}function VM(e,t,n,r){let i=DM(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=iM(t),o=r.op===`remove`?r.target:r.anchor,s=CM(oM(a??``),i.preset,o),c=EM(a??``,s),{after:l,placed:u}=HM(c,s.path,r,()=>{let e=AM(t,c);return Eg(e.presets).map(t=>kg(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 kM(e,t,a,l),u}function HM(e,t,n,r){switch(n.op){case`remove`:return{after:Ko(e,t,n.target),placed:null};case`insert`:{let i=gD(n.segment,n.anchor,r());return{after:qo(e,t,i,n.anchor,n.relation),placed:i}}}}const UM={load:()=>({}),save:()=>{}},WM=new Set(wy.map(e=>e.sessionKey)),GM=e=>WM.has(e)||e.startsWith(qg),KM={past:[],future:[]},qM=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var JM=class{state=new Map;constructor(e,t,n=UM){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}=this.state.get(e)??KM;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??KM}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(qM(n));r.set(qM(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=this.sessionState,r=(e,r,i)=>{let a=r.filter(GM).map(t=>({key:t,before:n.get(e,t)}));i();for(let{key:r,before:i}of a)t(e,{kind:`session`,key:r,before:i,after:n.get(e,r)})};return{sessionState:{get:(e,t)=>n.get(e,t),set:(e,t,i)=>r(e,[t],()=>n.set(e,t,i)),setBatch:(e,t)=>r(e,t.map(e=>e.key),()=>n.setBatch(e,t)),clear:(e,t)=>r(e,[t],()=>n.clear(e,t))},file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=[...e];e.clear();for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length!==0&&this.put(e,{past:ZM([...this.history(e).past,t]),future:[]})}}}}undo(e){let{past:t,future:n}=this.history(e),r=t.at(-1);if(r===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,r,`before`,`undo`,{past:t.slice(0,-1),future:ZM([...n,r])}),r}redo(e){let{past:t,future:n}=this.history(e),r=n.at(-1);if(r===void 0)throw new $(`redo: nothing to redo`);return this.apply(e,r,`after`,`redo`,{past:ZM([...t,r]),future:n.slice(0,-1)}),r}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(qM));throw this.put(e,{past:QM(this.history(e).past,t),future:QM(this.history(e).future,t)}),new $(`${r}: ${o.map(eN).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):iM(t.file)}write(e,t,n){t.kind===`file`?aM(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)&&n.set(e,t);n.size>32||YM(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,XM(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function YM(e){let t=0;for(let{past:n,future:r}of e.values())for(let e of[...n,...r])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function XM({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function ZM(e){return e.slice(-50)}function QM(e,t){return e.map(e=>e.filter(e=>!t.has(qM(e)))).filter(e=>e.length>0)}function $M(e){return e.map(eN).join(`, `)}function eN(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function tN(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 nN(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(tN))}function rN(e){if(typeof e!=`object`||!e)return!1;let t=e;return nN(t.past)&&nN(t.future)}function iN(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(rN))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),ke(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)}}}}function aN(e,t,n,r){let i=Ee({bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r});if(i.ok)return{kind:`ok`,stdout:i.stdout};if(i.reason===`rate-limited`)return{kind:`rate-limited`,reason:i.error??`rate-limited`};let a=i.error??[i.reason,i.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${n[0]} failed (${a})`}}function oN(e){let t=aN(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 sN(){return{probeTmux:oN}}function cN(e){let t=DT(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 lN(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function uN(e,t){return{tmux:lN(e,t.tmux),claudeSettings:cN(wT(CT(t.claudeConfigDir)))}}function dN(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=Fo(ET(n),[`env`,e.name],JSON.stringify(e.value),bo);return r.mkdirSync(c.dirname(n),{recursive:!0}),ke(n,i),{...t,claudeSettings:cN(n)}}default:return e.kind}}const fN=/^─{20,}/,pN=/^❯(\s|$)/,mN=/›\s*stashed$/;function hN(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>fN.test(e)?[t]:[]).at(-2);return n===void 0||!pN.test(t[n+1]??``)?{kind:`no-prompt`}:mN.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const gN={"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 _N(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=hN(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:gN[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const vN=`cc-candybar-slash`;function yN(e,t,n,r){let i=aN(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function bN(e){let t=yN(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(`
|
|
187
|
+
`);return{inMode:n!==`0`,screen:r}}function xN(e,t){let n=yN(e,`claude-input.type`,[`load-buffer`,`-b`,vN,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,vN,`-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 SN(){return{read:bN,type:xN}}function CN(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function wN(e){return TN(()=>decodeURIComponent(e))}function TN(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function EN(e,t){let n=Ee({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 DN=(e,t)=>EN(wN(e),t),ON=(e,t)=>{let n=Ee({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,wN(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`})`)}},kN=(e,t)=>EN(wN(e),t),AN=(e,t)=>EN(wN(e),t),jN=(e,t)=>{let n=CN(wN(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},MN=(e,t)=>{let[n=``,...r]=TN(()=>mT(e)),i=CN(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${tk().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: ${tk().join(`, `)})`);let a=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=rk(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},NN=/^-?\d+$/;function PN(e,t,n){return e>n?t:e<t?n:e}const FN=(e,t)=>{let[n=``,r=``,i=``]=TN(()=>mT(e)),a=CN(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!NN.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=ik(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${tk().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&NN.test(c)?IN(s,parseInt(c,10)):LN(`step-state`,r,s,sk(t.configFor(VN(t,a)),e=>t.sessionState.get(a,e),r)),u=PN(l+o,s.min,s.max),d=rk(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function IN(e,t){return Math.max(e.min,Math.min(e.max,t))}function LN(e,t,n,r){if(r===null)return n.min;if(!NN.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return IN(n,parseInt(r,10))}const RN=`render-origin`;function zN(e){return JSON.stringify(e)}function BN(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 VN(e,t){let n=e.sessionState.get(t,RN);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return BN(n)}function HN(e){return SC(e.projectDir,e.cwd,e.configFile??void 0)}function UN(e,t){return HN(VN(e,t))}function WN(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const GN=(e,t)=>{let[n=``,r=``,i=``]=TN(()=>mT(e)),a=CN(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${DD().join(`, `)})`);let o=OD(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=UN(t,a);MM(WN(t,a),s,[[r,o.value]]),t.dlog(`info`,`set-config: ${r}=${o.value} → ${s} (session=${a})`)},KN=(e,t)=>{let[n=``,r=``,i=``]=TN(()=>mT(e)),a=CN(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!NN.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=kD(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${DD().join(`, `)})`);let c=VN(t,a),l=HN(c),u=jM(l,r),d=typeof u==`number`?IN(s,u):LN(`step-config`,r,s,jD(t.configFor(c),r)),f=PN(d+o,s.min,s.max),p=OD(r,String(f));if(!p.ok)throw new $(`step-config: ${p.reason}`);MM(WN(t,a),l,[[r,p.value]]),t.dlog(`info`,`step-config: ${r} ${d}→${p.value} (by ${o}) → ${l} (session=${a})`)},qN=(e,t)=>{let[n=``]=TN(()=>mT(e)),r=CN(n),i=VN(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=VO(a,o),c=HO(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=rk(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});YN(`save`,c);let u=HN(i);NM(WN(t,r),u,l,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: ${[...l.map(([e,t])=>`${e}=${t}`),...c.map(JN)].join(` `)} → ${u} (session=${r})`)},JN=e=>`${e.preset}/${e.id}.settings.${e.setting}=${ys(e.value)}`;function YN(e,t){for(let n of t){let t=rk(n.key,ys(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const XN=(e,t)=>{let[n=``]=TN(()=>mT(e)),r=CN(n),i=VN(t,r),a=GO(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=rk(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});YN(`save-preset`,a.placements);let s=HN(i),c=zM(WN(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...wy.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,Cy.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(JN)].join(` `)} → ${s} (session=${r})`)},ZN=(e,t)=>{let[n=``,r=``]=TN(()=>mT(e)),i=CN(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=VN(t,i),o=HN(a);BM(WN(t,i),o,r),t.reloadConfig(a);let s=Cy.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},QN=(e,t)=>{let[n=``,...r]=TN(()=>mT(e)),i=CN(n),a=DD(),o=r.length===0?[``]:r.filter(e=>!a.includes(e));if(o.length>0)throw new $(`reset-config: unknown config key "${o.join(`", "`)}" (have: ${a.join(`, `)})`);let s=VN(t,i),c=HN(s),l=r.map(KO),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);LM(WN(t,i),c,u),t.reloadConfig(s);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 $N(e,t){let n=(e,t)=>[...os(kg(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(Eg(t.presets).flatMap(e=>n(t,e).map(t=>`${e}\0${ns(t)}`)));return Eg(e.presets).flatMap(t=>n(e,t).flatMap(e=>r.has(`${t}\0${ns(e)}`)?[]:Object.values(e.drafts??{}).map(e=>e.key)))}const eP=(e,t)=>{let[n=``,r=``,i=``]=TN(()=>mT(e)),a=CN(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${DD().join(`, `)})`);let o=OD(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=hD(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=VN(t,a),l=HN(c),u=t.configFor(c),d=VM(WN(t,a),l,r,s);t.reloadConfig(c);let f=$N(u,t.configFor(c)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of f)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${o.value} → ${l} placed=${JSON.stringify(d)} released=${JSON.stringify(f)} (session=${a})`)},tP=(e,t)=>{let[n=``]=TN(()=>mT(e)),r=CN(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${$M(i)} (session=${r})`)},nP=(e,t)=>{let[n=``]=TN(()=>mT(e)),r=CN(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${$M(i)} (session=${r})`)},rP=(e,t)=>{CN(wN(e)),t.applyUpdate()},iP=`client-hints`;function aP(e,t){let n=e.sessionState.get(t,iP);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 IC(r)}function oP(e,t,n){let r=Rb(n);e.sessionState.setBatch(t,Hb(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const sP=(e,t)=>{let n=CN(wN(e));oP(t,n,uN(t.doctor,aP(t,n)))},cP=(e,t)=>{let[n=``,r=``]=TN(()=>mT(e)),i=CN(n),a=zb(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=uN(t.doctor,aP(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=dN(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),oP(t,i,c)},lP=(e,t)=>{let[n=``,...r]=TN(()=>mT(e)),i=CN(n),a=VN(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=sS(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`};t.memento.move({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i})`)},uP=(e,t)=>{let[n=``,r=``]=TN(()=>mT(e)),i=CN(n),a=Object.values(t.configFor(VN(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=_N(t.claudeInput,aP(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})`)},dP=`config-override`,fP=new Map([[Jw,DN],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=CN(TN(()=>decodeURIComponent(e.slice(0,n)))),i=TN(()=>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,dP),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,dP,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Yw,ON],[Kw,MN],[qw,FN],[$w,GN],[eT,KN],[iT,QN],[tT,qN],[nT,XN],[rT,ZN],[aT,eP],[oT,tP],[sT,nP],[Zw,kN],[Qw,AN],[Xw,jN],[cT,rP],[lT,sP],[uT,cP],[dT,lP],[fT,uP]]),pP=new Set([Kw,qw,$w,eT,iT,tT,nT,rT,aT,oT,sT,Xw,cT,lT,uT,dT,fT]),mP=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of vT(gT(e))){if(!i&&pP.has(a)){let e=mT(o);e.length>0&&e[0]&&(i=e[0])}let e=fP.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(`
|
|
188
|
+
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function hP(e){return(t,n)=>{let r=n.history.begin(),i=[];try{e(t,{...n,sessionState:r.sessionState,journal:r})}catch(e){i.push(e)}try{r.commit()}catch(e){i.push(e)}if(i.length===1)throw i[0];if(i.length>1)throw Error(i.map(e=>String(e.message??e)).join(`; `))}}const gP=new Map([...fP,[Gw,mP]].map(([e,t])=>[e,hP(t)]));Object.freeze([...gP.keys()]);const _P=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`]),vP=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]];function yP(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of vP){let i=xP(n,e);if(i==null)t.missingRequired.push(e);else{let n=bP(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))_P.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function bP(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function xP(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 SP(e,t){switch(e){case`vars`:return{what:e,vars:CP(t)};case`segments`:return{what:e,segments:OP(t)};case`config`:return{what:e,config:MP(t)}}}function CP(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=EP(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,...wP(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:TP(r.lastUpdatedMs())})}return o}function wP(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 TP(e){return e===null?null:Math.max(0,Date.now()-e)}function EP(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,DP(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}`,DP(i));return t}function DP(e){return e.kind}function OP(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=AP(n),o=kP(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:jP(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function kP(e){let t=new Map;for(let n of Eg(e.presets))for(let r of os(kg(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=ns(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function AP(e){let t=[],n=new Set;for(let r of os(ic(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 jP(e,t,n){let r=new Set;for(let i of d_(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 MP(e){return e===null?null:e.config}const NP=[`vars`,`segments`,`config`];function PP(e){return typeof e==`string`&&NP.includes(e)}function FP(e){return Math.max(1,e-2)}var IP=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 Lk(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)}},LP=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=YD(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await Vk(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 RP={messageCount:0,recent:[]};function zP(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!Fk(t),recent:n.length>20?n.slice(-20):n}}function BP(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(Fk(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 VP=class{fold=new LP(RP,zP);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:BP(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};const HP={command:null,todos:[],pending:[],done:[]};function UP(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 WP(e,t){if(t.isSidechain)return e;let n=Fk(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=UP(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos}}function GP(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>UP(e,t.name),[]),done:e.done}}var KP=class{fold=new LP(HP,WP);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(GP(n.value))}};const qP=new Map;function JP(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var YP=class{async getSessionId(){if(!process.env.TMUX_PANE)return Y;let e=JP(process.env.TMUX),t=qP.get(e);if(t!==void 0)return t;D(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await Te({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?J(n.stdout.trim()):Y:X(`tmux display-message: ${n.reason}`);return qP.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};const XP=e=>`${e.sessionId}|${e.projectDir}|${e.cwd}`;var ZP=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=XP(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.projectDir),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.projectDir);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=XP(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};const QP=c.join(`lib`,`ceiling_config.py`),$P=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function eF(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 tF(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 nF(e,t){if(!r.existsSync(e))return Y;let n;try{n=eF(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=tF([c.join(c.dirname(c.dirname(e)),`settings.json`),c.join(t,`.claude`,`settings.json`),c.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[QP,$P].filter(e=>!r.existsSync(c.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 rF(e){let{CLAUDE_PROJECT_DIR:t,CLAUDE_CODE_SESSION_ID:n,...r}=process.env;return{...r,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function iF(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function aF(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 oF(e,t){let n=await Te({bin:`python3`,args:[`-c`,`
|
|
189
189
|
import json, math, sys
|
|
190
190
|
sys.path.insert(0, sys.argv[1])
|
|
191
191
|
from ceiling_config import CONFIG_NAME, anchored, ceiling_in, in_force, session_directory
|
|
@@ -194,26 +194,26 @@ ceiling = in_force(directory, anchored(sys.argv[3]))
|
|
|
194
194
|
layer = ceiling_in(directory / CONFIG_NAME)
|
|
195
195
|
print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
|
|
196
196
|
"session": layer.text if layer else None}))
|
|
197
|
-
`,c.join(e,`lib`),t.sessionId,t.cwd],env:
|
|
198
|
-
`),te=
|
|
199
|
-
`)),w=
|
|
200
|
-
`})}catch(e){throw
|
|
201
|
-
`);return}t.stdout.write(
|
|
197
|
+
`,c.join(e,`lib`),t.sessionId,t.cwd],env:rF(t),timeoutMs:3e3,category:`memento.read`});return n.ok?aF(n.stdout):X(iF(n))}function sF(e,t,n){let r=Ee({bin:c.join(e,$P),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:rF(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(iF(r))}function cF(){let e=TT(CT(ST(process.env,process.cwd())));return{locate:t=>nF(e,t),read:oF,move:sF}}var lF=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return c.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 uF=new qj;Ce(uF.launchStats);const dF=new Wv({counters:uF,logger:Q}),fF=new Qv({watchers:dF,logger:Q}),pF=new $k,mF=new Xj,hF=new JM(mF,Q),gF=new lF(We()),_F=new IP,vF=new VP,yF=new KP,bF=new YP,xF=new ZP(cF()),SF=new Gj({gitService:fF,sessionState:mF,watchers:dF},{observers:{onReload:e=>Q(`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)}`)}}),CF=60*1e3;function wF(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(ne(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){Q(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),BF(0);return}}catch(e){Q(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,CF),a.unref())},checkNow:o}}const TF=wF(),EF=wk({entryUrl:import.meta.url,intervalMs:CF,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>TF.checkNow(),log:Q});let DF=null,OF=null,kF=0;function AF(){t.on(`uncaughtException`,e=>{Q(`error`,`uncaughtException: ${e.stack||e.message}`),BF(1)}),t.on(`unhandledRejection`,e=>{Q(`error`,`unhandledRejection: ${String(e)}`),BF(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Q(`info`,`received ${e}, shutting down`),BF(0)});try{kF=_w(t.env)}catch(e){Q(`error`,`refusing to boot: ${e.message}`),BF(1);return}DF=vE(t.pid);let e=OE(AE(DF));if(!e.decision.allow){Q(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),BF(1);return}OF=e.registryPath,r.mkdirSync(Me(),{recursive:!0}),Fe(Ne()),mF.useStorage(new $j(Re(),500,Q)),hF.useStorage(iN(ze(),Q)),xE({anchor:bE(t.env),isAlive:SE,onOrphaned:e=>{Q(`info`,`parent watchdog: ${e}; shutting down`),BF(0)}}),jF(g.createServer({allowHalfOpen:!1},e=>{VF(e)}),Ne(),!1)}function jF(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Q(`error`,`server error: ${i.message}`),BF(1);return}if(r){Q(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}MF(e,n)}),e.listen(n,()=>NF(n))}function MF(e,n){let i=cE(lE(Ie(n)),(e,t)=>_E(e,t,{readStartTime:gE,pidAlive:SE}));if(i.kind===`attach-and-exit`){Q(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Q(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Q(`error`,`cannot unlink stale socket ${n}: ${e.message}`),BF(1);return}}jF(e,n,!0)}function NF(e){let n=fE(e);if(n.kind!==`present`){Q(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),BF(0);return}LF(e);try{r.chmodSync(e,384)}catch(e){Q(`warn`,`chmod socket failed: ${e.message}`)}Q(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(C.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(kF/1048576)}MB`),Pw();let i=gF.reset();i!==null&&Q(`warn`,`diagnostic dump wipe failed: ${i}`),TF.arm(),EF.arm(),IF(),PF(e,n.identity)}function PF(e,n){hE({bound:n,myPid:t.pid,readIdentity:()=>fE(e),readLease:()=>lE(Ie(e)),shutdown:e=>BF(e),log:Q}).arm()}let FF=null;function IF(){FF=xw(Tw(uF.startedAt.getTime(),e=>BF(e),{rssLimitBytes:kF})),FF.arm()}function LF(e){let n=uE(Ie(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:DF});n!==null&&Q(`warn`,`lease write failed: ${n}`)}let RF=0,zF=!1;function BF(e){if(!zF){zF=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{fF.close()}catch(e){Q(`warn`,`gitService close failed: ${e.message}`)}try{pF.close()}catch(e){Q(`warn`,`usageStore close failed: ${e.message}`)}try{dF.closeAll()}catch(e){Q(`warn`,`watcherRegistry close failed: ${e.message}`)}try{mF.flush()}catch(e){Q(`warn`,`sessionState flush failed: ${e.message}`)}dE(Le(),t.pid),OF!==null&&kE(OF,t.pid,EE,e=>r.unlinkSync(e)),t.exit(e)}}function VF(e){RF++,uF.inFlight=RF;let t=!1,n=(n,r)=>{if(t){r!==null&&Q(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>BF(r);try{e.end(WC(n),i)}catch(e){Q(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{uF.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=GC(e=>{UF(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Q(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Q(`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=>{Q(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),RF=Math.max(0,RF-1),uF.inFlight=RF})}const HF=e=>({resp:e,exitAfterFlush:null});async function UF(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return HF({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Q(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Q(`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 HF({ok:!0,stats:uF.snapshot({gitCache:fF.getStats(),usageCache:pF.getStats(),renderCacheSize:SF.size,watchersActive:dF.size(),nextRestartReason:FF?.describeNextRestart()??null})});if(e.kind===`render`){uF.requestsTotal++;let t=Date.now();try{let{report:n}=yP(e.hookData);for(let e of n.unknownTopLevelFields)Q(`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 uF.requestsErrored++,Q(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),HF({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=WF(e.args),s=e.hookData.session_id,c=IC(e),l=JSON.stringify(c);mF.get(s,`client-hints`)!==l&&mF.set(s,iP,l);let u=mF.get(s,`config-override`)??a??c.configEnv,d=SF.getOrCreate(i,e.cwd,u),f=zN({projectDir:i,cwd:e.cwd,configFile:u??null});mF.get(s,`render-origin`)!==f&&mF.set(s,RN,f);let p=c.termCols,m=FP(p??120),h=qE(c.termRows),{authoredRoots:g}=d.state,_=t=>mF.get(e.hookData.session_id,t),v=cO(d.state.config,_,e=>g.has(e)),y=await TO(e.hookData,YF,e.cwd,d.state.neededInputPaths(v.preset),v,c,VO(d.state.config,_).length+HO(d.state.config,_).length),b=[],x=lO(v,m),S=jj(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},uO(v)),C=mF.get(e.hookData.session_id,`click.error`);C&&mF.clear(e.hookData.session_id,`click.error`);let ee=[o,d.lastError,C].filter(Boolean).join(`
|
|
198
|
+
`),te=EF.notice({sessionId:s,dismissed:mF.get(s,uk),enabled:v.updateNotice}),ne=d.lastError===null?null:d.configFilePath,re=QE(ee,te,[d.lastWarning??``,...b].filter(Boolean).join(`
|
|
199
|
+
`)),w=gF.sync(s,re===null?null:eD(re));w!==null&&Q(`warn`,`diagnostic dump failed: ${w}`);let ie=tD(S,re,{fullText:w===null?{kind:`file`,path:gF.pathFor(s)}:{kind:`unavailable`,reason:w},failedConfigFile:ne},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=fF.getStats(),ae=pF.getStats();return Q(`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=${ee?`Y`:`N`} upd=${te.length} warn=${d.lastWarning?`Y`:`N`}`),HF({ok:!0,output:ie+`
|
|
200
|
+
`})}catch(e){throw uF.requestsErrored++,e}}if(e.kind===`click`)return HF(await XF(e.verb,e.value));if(e.kind===`debug`){if(!PP(e.what))return HF({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${NP.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=SF.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?JF(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):qF};return HF({ok:!0,debug:SP(e.what,n)})}return HF({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function WF(e){let{values:t,tokens:n}=w({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:RC(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const GF={sessionState:mF,dlog:Q,applyUpdate:()=>EF.act(),doctor:sN(),memento:xF,claudeInput:SN(),history:hF,configFor:e=>SF.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>SF.reload(e.projectDir,e.cwd,e.configFile??void 0)},KF={style:`powerline`,colorCompatibility:Ua,wrap:!0,padding:1,charset:za,width:1/0},qF=new Map;function JF(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,KE(a,{...KF,charset:t,colorCompatibility:n}));return r}const YF={gitProvider:fF,usageStore:pF,contextProvider:_F,metricsProvider:vF,activityProvider:yF,tmuxService:bF,mementoProvider:xF,autoCompact:zD,log:Q,clock:()=>new Date,history:e=>hF.depth(e)};function XF(e,t){let n=gP.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,GF),{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 ZF={connectMs:200,budgetMs:500};async function QF(e){let n=e.includes(`--json`),r=await $F();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${$C(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
|
|
201
|
+
`);return}t.stdout.write(rI(r.value))}function $F(){return qC({kind:`stats`},ZF,e=>`stats`in e?e.stats:void 0)}function eI(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function tI(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function nI(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 rI(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 ${nI(e.uptimeSec)}`),t.push(` rss ${eI(e.rssBytes)}`),t.push(` heapUsed ${eI(e.heapUsedBytes)}`),t.push(` heapTotal ${eI(e.heapTotalBytes)}`),t.push(` external ${eI(e.externalBytes)}`),t.push(` arrayBuffers ${eI(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 ${tI(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 ${tI(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(`
|
|
202
202
|
`)+`
|
|
203
|
-
`}const
|
|
204
|
-
`);return}t.stdout.write(
|
|
205
|
-
`;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?``:` ${
|
|
203
|
+
`}const iI={connectMs:200,budgetMs:500};async function aI(e,n){let r=n.includes(`--json`),i=await oI(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${$C(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
|
|
204
|
+
`);return}t.stdout.write(sI(i.value))}function oI(e){return qC({kind:`debug`,what:e},iI,e=>`debug`in e?e.debug:void 0)}function sI(e){switch(e.what){case`vars`:return cI(e.vars);case`segments`:return lI(e.segments);case`config`:return uI(e.config);default:return e}}function cI(e){if(e.length===0)return`no variables (DSL not active)
|
|
205
|
+
`;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?``:` ${fI(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${dI(a.value)}${e}${o}`)}return t.join(`
|
|
206
206
|
`)+`
|
|
207
|
-
`}function
|
|
207
|
+
`}function lI(e){if(e.length===0)return`no segments (DSL not active)
|
|
208
208
|
`;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(`
|
|
209
209
|
`)+`
|
|
210
|
-
`}function
|
|
210
|
+
`}function uI(e){return e===null?`config: DSL not active
|
|
211
211
|
`:JSON.stringify(e,null,2)+`
|
|
212
|
-
`}function
|
|
213
|
-
`));return n.rendered}finally{r.registry.dispose()}}function
|
|
214
|
-
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:
|
|
212
|
+
`}function dI(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function fI(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function pI(){let e=hI();return e===null?null:r.readFileSync(e,`utf-8`)}function mI(){let e;try{e=pI()}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 hI(){let e=c.join(`schema`,`cc-candybar.schema.json`),n=t.argv[1];if(n===void 0)return null;let i=c.dirname(c.resolve(n));for(;;){let t=c.join(i,e);if(r.existsSync(t))return t;let n=c.dirname(i);if(n===i)return null;i=n}}function gI(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const _I=5e3;function vI(e){let t=`/home/tester`,n=Math.floor(Date.now()/1e3);return{hook_event_name:`Status`,session_id:`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,version:`1.15.0`,home:t,cwd:`${t}/code/cc-candybar/src`,transcript_path:`${t}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:{current_dir:`${t}/code/cc-candybar/src`,project_dir:`${t}/code/cc-candybar`},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:n+2*3600},weekly:{percentage:21,resetsAt:n+5*86400},cache:{expiresAt:n+900},tmux:{session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:BD(4e5,1e6),...dO(e),history:{undo:1,redo:1},unsaved:1}}function yI(e,t){let n=xC(e,e),r=CC(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function bI(e,n=t.cwd()){let i=[],a=e===void 0?yI(n,i):c.resolve(vC(e));if(e!==void 0&&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 o=TC(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await CI(a,n,i)}}catch(e){let t=e;return a!==null&&typeof t==`object`&&t&&typeof t.code==`string`&&t.path===a&&typeof t.message==`string`?{kind:`unreadable`,path:a,message:t.message}:(e instanceof Yo&&i.push(...e.warnings),{kind:`fatal`,configPath:a,message:e instanceof Yo||e instanceof Error?e.message:String(e),warnings:i})}}async function xI(e,t,n){let r=EC(e,KD);n.push(...r.warnings);let i=kC(r,e??`<default>`),a=new zj,o=new xy(a,i.globals.default_empty_value??``,void 0,new Xj);try{let e=Dj(i,o,{cwd:t});n.push(...e.loadWarnings);let r=await o.settled(_I);return r.length>0&&n.push(`source${r.length===1?``:`s`} still running after ${_I} ms, rendered with fallback values: ${r.join(`, `)}`),{config:i,compiled:e,store:a,registry:o}}catch(e){throw o.dispose(),e}}function SI({config:e,compiled:t,store:n,registry:r},i,a){let o=new Map;return{rendered:jj(e,t,n,r,vI(i),lO(i,a),{onSegmentError:(e,t)=>o.set(`segment "${e}"`,t),onRenderWarning:e=>o.set(`globals.palette`,e)},uO(i)),failures:o}}async function CI(e,t,n){let r=await xI(e,t,n),{config:i}=r;try{lk(i);let e=cO(i,()=>null,()=>!1),t=e=>SI(r,e,200),n=t(e),a=t({...e,presetCustomized:!0}),o=[...[...n.failures].map(([e,t])=>`${e}: ${t}`),...[...a.failures].filter(([e])=>!n.failures.has(e)).map(([e,t])=>`${e}: ${t} (under .preset.customized = true)`)];if(o.length>0)throw Error(`config renders with ${o.length} render error${o.length===1?``:`s`} (the daemon would show them on the bar):\n`+o.map(e=>` ${e}`).join(`
|
|
213
|
+
`));return n.rendered}finally{r.registry.dispose()}}function wI(e){return e.map(e=>`warning: ${e}\n`).join(``)}function TI(e,t=!1){switch(e.kind){case`clean`:return{stdout:`✓ ${e.configPath??`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:wI(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:wI(e.warnings)+`✗ ${e.configPath??`<default>`}\n${e.message}\n`,code:1};case`unreadable`:return{stdout:``,stderr:`check: cannot read ${e.path}: ${e.message}\n`,code:2}}}const EI=`--render`,DI=`Usage: cc-candybar check [${EI}] [config-file]\n`;function OI(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==EI);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${DI}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${DI}`}:{kind:`run`,target:n[0],render:t.includes(EI)}}async function kI(e){let n=OI(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:TI(await bI(n.target??gI(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const AI=`${FE}${PE}`;function jI(e){return`${AI}⚠ cc-candybar: ${MI(e)}[0m\n`}function MI(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: ${NE(e.message,60)}`;case`render_failed`:return`render failed: ${NE(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${NE(e.message,60)}`}}function NI(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
|
|
214
|
+
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:jI(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function PI(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 FI=` (fix: click the settings menu (${mc} by default) › 🧰 tools ▸ 🩺 doctor, then [fix] on the bar)`;function II({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:FI}\n`}function LI(e,t,n){let r;try{r=uN(e,{tmux:Fb(t),claudeConfigDir:ST(t,n)})}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let i=Rb(r);return{stdout:i.map(II).join(``),stderr:``,code:+!i.every(e=>e.verdict.ok)}}function RI(e){e.length>0&&(t.stderr.write(`doctor: takes no arguments
|
|
215
215
|
Usage: cc-candybar doctor
|
|
216
|
-
`),t.exit(2));let n=
|
|
216
|
+
`),t.exit(2));let n=LI(sN(),t.env,t.cwd());t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}function zI(){return PI(t.env.COLUMNS,t.stderr.columns)}function BI(){return PI(t.env.LINES,t.stderr.rows)}const VI=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`],HI=e=>e.some(e=>t.argv.includes(e));function UI(){return VI.some(e=>(t.env[e]??``)!==``)}function WI(){console.log(ab)}async function GI(){try{HI(rb.help)&&(WI(),t.exit(0)),HI(rb.version)&&(console.log(`cc-candybar ${xT}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await oE(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(tE(),t.exit(0)),e===`url-handle`){await rE(t.argv[3]);return}if(e===`daemon`){AF();return}if(e===`daemon-stats`&&(await QF(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await kI(t.argv.slice(3));return}if(e===`schema`){mI();return}if(e===`doctor`){RI(t.argv.slice(3));return}PP(e)&&(await aI(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
|
|
217
217
|
|
|
218
218
|
cc-candybar is designed to be used as a Claude Code statusLine command.
|
|
219
219
|
It reads hook data from stdin and outputs formatted statusline.
|
|
@@ -229,4 +229,4 @@ Add to ~/.claude/settings.json:
|
|
|
229
229
|
Run with --help for more options.
|
|
230
230
|
|
|
231
231
|
To test output manually:
|
|
232
|
-
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar --style=powerline`),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`),
|
|
232
|
+
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar --style=powerline`),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`),WI(),t.exit(1));let i=NI(await rw(r,t.argv,t.cwd(),{termCols:zI(),termRows:BI(),ssh:UI(),tmux:Fb(t.env),configEnv:gI(t.env),claudeConfigDir:ST(t.env,t.cwd())}));i.debug!==null&&D(i.debug),i.kick&&Ew(),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)}}GI();export{};
|