@promptctl/cc-candybar 1.98.0 → 1.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -21,7 +21,7 @@ import{createRequire as e}from"node:module";import t from"node:process";import{j
21
21
  `,this._tabSize=t?.tabSize??8,this._noWrap=t?.noWrap??!1}get plain(){return this._text}set plain(e){let t=yi(e);this._text=t;let n=t.length;this._spans=this._spans.map(e=>e.end>n?new Oi(e.start,Math.min(e.end,n),e.style):e).filter(e=>e.start<n)}get length(){return this._text.length}get cellLength(){return Lt(this._text)}get hasContent(){return this._text.length>0}get style(){return this._style}set style(e){this._style=wi(e)}get justify(){return this._justify}set justify(e){this._justify=e}get overflow(){return this._overflow}set overflow(e){this._overflow=e}get end(){return this._end}set end(e){this._end=e}get noWrap(){return this._noWrap}set noWrap(e){this._noWrap=e}get spans(){return this._spans}resolvedStyle(e){return Ei(e,this._style)}edgeStyle(e,t){let n=this.resolvedStyle(t);if(this._text.length===0)return n;let r=e===`left`?0:this._text.length-1,i=n;for(let e of this._spans)e.start<=r&&r<e.end&&(i=i.add(Ei(t,e.style)));return i}append(t,n){if(t instanceof e){if(n!==void 0)throw Error(`Style argument must not be provided when appending RichText`);let e=this._text.length;this._text+=t._text,this._addSpan(e,this._text.length,t._style);for(let n of t._spans)this._spans.push(n.move(e));return this}let r=yi(t),i=this._text.length;return this._text+=r,this._addSpan(i,this._text.length,n??``),this}contains(t){let n=t instanceof e?t._text:t;return this._text.includes(n)}at(t){let n=t<0?this._text.length+t:t;return this._text[n]===void 0?new e(``):this.slice(n,n+1)}slice(e,t){let n=this._text,r=n.length,i=e??0,a=t??r,o=i<0?Math.max(0,r+i):Math.min(i,r),s=a<0?Math.max(0,r+a):Math.min(a,r);if(o>=s)return this.blankCopy();let c=n.slice(o,s),l=this.blankCopy(c);for(let e of this._spans){let t=Math.max(e.start,o)-o,n=Math.min(e.end,s)-o;t<n&&l._spans.push(new Oi(t,n,e.style))}return l}_addSpan(e,t,n){let r=wi(n);Ti(r)||this._spans.push(new Oi(e,t,r))}stylize(e,t,n){let r=this._text.length,i=t===void 0?0:t<0?r+t:t,a=n===void 0?r:n<0?r+n:n;if(i>=a||i>=r||a<=0)return this;let o=Math.max(0,i),s=Math.min(r,a);return this._addSpan(o,s,e),this}highlightRegex(e,t){let n=this._text,r=0,i=e.flags.includes(`g`)?e.flags:e.flags+`g`,a=new RegExp(e.source,i),o;for(;(o=a.exec(n))!==null;){if(o[0].length===0){a.lastIndex++;continue}if(o.groups){let e=0;for(let[t,n]of Object.entries(o.groups))if(n!==void 0){let r=o[0].indexOf(n,e);if(r>=0){let i=o.index+r;this._addSpan(i,i+n.length,t),e=r+n.length}}r++;continue}this._addSpan(o.index,o.index+o[0].length,t??``),r++}return r}highlightWords(e,t,n){let r=n?.caseSensitive!==!1,i=0;for(let n of e){if(n.length===0)continue;let e=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r?`g`:`gi`,o=RegExp(`\\b${e}\\b`,a),s;for(;(s=o.exec(this._text))!==null;)this._addSpan(s.index,s.index+s[0].length,t),i++}return i}copy(){let t=new e(this._text,{style:this._style,justify:this._justify,overflow:this._overflow,end:this._end,tabSize:this._tabSize,noWrap:this._noWrap});return t._spans=this._spans.slice(),t}blankCopy(t){return new e(t??``,{style:this._style,justify:this._justify,overflow:this._overflow,end:this._end,tabSize:this._tabSize,noWrap:this._noWrap})}split(e){let t=e??`
22
22
  `,n=this._text,r=[],i=0;for(;;){let e=n.indexOf(t,i);if(e===-1){r.push(this.slice(i));break}r.push(this.slice(i,e)),i=e+t.length}return r}divide(e){if(e.length===0)return[this.copy()];let t=[],n=0;for(let r of e)t.push(this.slice(n,r)),n=r;return t.push(this.slice(n)),t}rstrip(){let e=this._text.replace(/\s+$/,``);return e.length<this._text.length&&(this.plain=e),this}pad(e,t){let n=(t??` `).repeat(e);return this._spans=this._spans.map(t=>t.move(e)),this._text=n+this._text+n,this}padLeft(e,t){let n=t??` `;return this._spans=this._spans.map(t=>t.move(e)),this._text=n.repeat(e)+this._text,this}padRight(e,t){let n=t??` `;return this._text+=n.repeat(e),this}setLength(e){return this._text.length<e?this._text+=` `.repeat(e-this._text.length):this._text.length>e&&(this.plain=this._text.slice(0,e)),this}extendStyle(e){let t=this._text.length;return this._text+=` `.repeat(e),this._spans=this._spans.map(n=>n.end===t?n.extend(e):n),this}truncate(e,t){if(this.cellLength<=e)return this;let n=t?.mode??`right`,r=Bt(e),i=Gt(t?.marker??`…`,r),a=Rt(r-Lt(i));if(n===`right`)return this._cropRightTo(a),i&&(this._text+=i),this;if(n===`left`)return this._cropLeftTo(a),i&&(this._spans=this._spans.map(e=>e.move(i.length)),this._text=i+this._text),this;let o=Rt(Math.floor(a/2)),s=Rt(a-o),c=Gt(this._text,o).length,l=this._text.length-Kt(this._text,s).length,u=this._text.slice(0,c),d=this._text.slice(l),f=c,p=l,m=i.length-(p-f),h=[];for(let e of this._spans)e.end<=f?h.push(e):e.start>=p?h.push(e.move(m)):(e.start<f&&h.push(new Oi(e.start,f,e.style)),e.end>p&&h.push(new Oi(p+m,e.end+m,e.style)));return this._text=u+i+d,this._spans=h,this}_cropRightTo(e){this.plain=Gt(this._text,e)}_cropLeftTo(e){let t=this._text.length-Kt(this._text,e).length,n=-t;this._spans=this._spans.map(e=>{if(!(e.end<=t))return new Oi(Math.max(0,e.start+n),e.end+n,e.style)}).filter(e=>e!==void 0),this._text=this._text.slice(t)}align(e,t){let n=this.cellLength;if(n>=t)return this;let r=t-n;switch(e){case`left`:this.padRight(r);break;case`right`:this.padLeft(r);break;case`center`:{let e=Math.floor(r/2),t=r-e;this.padLeft(e),this.padRight(t);break}}return this}removeSuffix(e){return this._text.endsWith(e)&&(this.plain=this._text.slice(0,-e.length)),this}appendTokens(e){for(let[t,n]of e)this.append(t,n);return this}static assemble(t,n){let r=new e(``,{style:n?.style});for(let n of t)if(typeof n==`string`)r.append(n);else if(n instanceof e)r.append(n);else{let[e,t]=n;r.append(e,t)}return r}static styled(t,n){let r=new e(t);return r.stylize(n),r}static fromFragments(t,n){let r=new e(``,{end:n?.end??``});for(let e of t)r.append(e);return r}*render(e){let t=this._expandTabs(this._text),n=this.resolvedStyle(e),r=this._buildSegments(t,n,e),i=V.splitLines(r),a=Bt(si(e,this).maxWidth),o=this._overflow??e.overflow??`fold`,s=this._noWrap||(e.noWrap??!1),c=o===`ignore`?Bt(1/0):a,l=s?Bt(1/0):c,u=o===`ignore`?void 0:this._justify??e.justify,d=ri(e,`…`,`.`),f=t.endsWith(`
23
23
  `);for(let e=0;e<i.length;e+=1){let t=i[e],r=e<i.length-1||f,s=ui(xi(t),l,{fold:o===`fold`}),p=V.divide(t,s),m=this._justifyLines(p.map(e=>[...this._fitLine(e,c,o,d)]),a,n,u);for(let e=0;e<m.length;e+=1)yield*m[e],(e<m.length-1||r)&&(yield V.line())}this._end&&(yield new V(this._end))}measure(e){let t=this._expandTabs(this._text).split(`
24
- `),n=0,r=0;for(let e of t){let t=Lt(e);n=Math.max(n,t);let i=e.split(/\s+/);for(let e of i)e.length>0&&(r=Math.max(r,Lt(e)))}let i=Bt(e.maxWidth);return{minimum:Math.min(r,i),maximum:Math.min(n,i)}}_expandTabs(e){return e.includes(` `)?e.replace(/\t/g,` `.repeat(this._tabSize)):e}_buildSegments(e,t,n){let r=t=>Math.max(0,Math.min(t,e.length)),i=new Set([0,e.length]);for(let e of this._spans)i.add(r(e.start)),i.add(r(e.end));let a=[...i].sort((e,t)=>e-t),o=new Map(a.map((e,t)=>[e,t])),s=a.slice(0,-1).map(()=>t);for(let e of this._spans){let t=r(e.end),i=Ei(n,e.style),c=o.get(r(e.start));for(let e=c;a[e]<t;e++)s[e]=s[e].add(i)}return s.map((t,n)=>new V(e.slice(a[n],a[n+1]),t.isNull?void 0:t))}_justifyLines(e,t,n,r){return r===`full`?e.map((r,i)=>i===e.length-1?r:this._fillLine(r,t,n)):e.map(e=>[...this._justifyLine(e,t,r)])}*_justifyLine(e,t,n){switch(n){case`center`:case`right`:{let r=V.adjustLineLength(e,V.getLineLength(e)-Si(e),void 0,!1),i=Math.max(t-V.getLineLength(r),0),a=n===`center`?Math.floor(i/2):i;a>0&&(yield new V(` `.repeat(a))),yield*r;let o=i-a;o>0&&(yield new V(` `.repeat(o)));break}case`left`:yield*V.adjustLineLength(e,Math.max(t,V.getLineLength(e)));break;default:yield*e;break}}_fillLine(e,t,n){let r=xi(e),i=r.split(` `);r.endsWith(` `)&&i.pop();let a=i.length-1,o=Array(a).fill(1),s=i.reduce((e,t)=>e+Lt(t),0)+a;for(let e=0;s<t&&a>0;e=(e+1)%a)o[a-1-e]+=1,s+=1;let c=[],l=0;for(let e=0;e<i.length;e+=1)l+=Lt(i[e]),c.push(l),l+=1,e<a&&c.push(l);let u=V.divide(e,c),d=(e,t)=>e.filter(e=>e.hasText).at(t)?.style??n,f=[];for(let e=0;e<i.length;e+=1)if(f.push(...u[e*2]),e<a){let t=d(u[e*2],-1),r=d(u[e*2+2],0),i=t.equals(r)?t:n;f.push(new V(` `.repeat(o[e]),i.isNull?void 0:i))}return f}*_fitLine(e,t,n,r){let i=V.getLineLength(e);if(i-Si(e)<=t){yield*V.adjustLineLength(e,Math.min(i,t),void 0,!1);return}if(n===`ellipsis`&&t>0){yield*V.adjustLineLength(e,t-1,void 0,!1),yield new V(r);return}yield*V.adjustLineLength(e,t,void 0,!1)}},ki=class{items;joiner;constructor(e,t){this.items=e,this.joiner=t}*render(e){let t=this.items;if(t.length!==0){yield*this.joiner.join(null,t[0]).render(e);for(let n=0;n<t.length;n++){let r=t[n];yield*r.render(e);let i=n+1<t.length?t[n+1]:null;yield*this.joiner.join(r,i).render(e)}yield V.line()}}};const Ai={*render(e){}};function ji(e){return{render:e}}function U(e){return new B({color:e.bgcolor})}function Mi(e){return e!==void 0&&!e.isDefault?e:void 0}function Ni(e){return new B({bgcolor:e}).drawnColors().bgcolor}function*Pi(e,t){e!==``&&(yield new V(e,new B({color:Ni(t)})))}function Fi(e,t){let{color:n,bgcolor:r}=e.drawnColors(t??P.TRUECOLOR);if(n===void 0||r===void 0)return!1;let i=n.fixedValue,a=r.fixedValue;return i!==void 0&&a!==void 0?z.fromRgba(i).deltaE(z.fromRgba(a))<.04:n.number===r.number}const Ii=Object.freeze({glyph:``,divider:``,lead:``,tail:``}),Li=Object.freeze({glyph:`>`,divider:`>`,lead:``,tail:`>`}),Ri=({glyph:e,divider:t,lead:n,tail:r})=>e+t+n+r;var zi=class{_glyphs;constructor(e=Ii){this._glyphs=e}join(e,t){let n=this._glyphs;return ji(function*(r){let{glyph:i,divider:a,lead:o,tail:s}=ri(r,n,Li,Ri),c=e?.edgeStyle(`right`,r),l=Mi(c?.bgcolor),u=Mi(t?.edgeStyle(`left`,r).bgcolor);if(l===void 0){u!==void 0&&(yield*Pi(o,u));return}if(u===void 0){yield*Pi(s,l);return}let d=new B({color:Ni(l),bgcolor:u});yield Fi(d,r.colorSystem)?new V(a,new B({color:c?.color,bgcolor:l})):new V(i,d)})}};const Bi={left:`(`,right:`)`},Vi=({left:e,right:t})=>e+t;var Hi=class{_caps;_separator;constructor(e){this._caps={left:e?.left??``,right:e?.right??``},this._separator=e?.separator??` `}*_emit(e,t,n){let r=ri(n,this._caps,Bi,Vi),i=ri(n,this._separator,` `);if(!(e===null&&t===null)){if(e===null){yield new V(r.left,U(t.edgeStyle(`left`,n)));return}if(t===null){yield new V(r.right,U(e.edgeStyle(`right`,n)));return}yield new V(r.right,U(e.edgeStyle(`right`,n))),i.length>0&&(yield new V(i)),yield new V(r.left,U(t.edgeStyle(`left`,n)))}}join(e,t){return ji(n=>this._emit(e,t,n))}},Ui=class{_separator;_style;constructor(e){this._separator=e?.separator??` | `,this._style=e?.style??B.parse(`dim`)}join(e,t){if(e===null||t===null)return Ai;let n=this._separator,r=this._style;return ji(e=>[new V(ri(e,n,` | `),r)])}};function Wi(e,t){if(e.isControl||e.text.length===0)return;let n=e.style;return!n||n.isNull?{text:e.text,sgrCodes:``,link:void 0}:{text:e.text,sgrCodes:t.colorSystem===null?``:n.toSgrCodes(t.colorSystem),link:t.hyperlinks?n.link:void 0}}function Gi(e,t){let n=[];for(let r of e){let e=Wi(r,t);e&&n.push(e)}if(n.length===0)return``;let r=[],i=0;for(;i<n.length;){let e=n[i].sgrCodes,t=i+1;for(;t<n.length&&n[t].sgrCodes===e;)t++;e.length>0&&r.push(`\x1b[${e}m`);let a=i;for(;a<t;){let e=n[a].link,i=a+1;for(;i<t&&n[i].link===e;)i++;if(e){r.push(gi(e));for(let e=a;e<i;e++)r.push(n[e].text);r.push(`\x1B]8;;\x1B\\`)}else for(let e=a;e<i;e++)r.push(n[e].text);a=i}e.length>0&&r.push(`\x1B[0m`),i=t}return r.join(``)}function Ki(e,t){let n=t?.width??80,r={};t?.env!==void 0&&(r.env=t.env),t?.isTTY!==void 0&&(r.isTTY=t.isTTY);let i=t?.colorSystem,a=pn(i===void 0?P.TRUECOLOR:i,r),o={colorSystem:t?.noColor?null:a.colorSystem,hyperlinks:t?.hyperlinks??a.hyperlinks},s={maxWidth:n,isTerminal:!1,asciiOnly:t?.asciiOnly??!1,onStyleError:t?.onStyleError,colorSystem:o.colorSystem};return Gi(e.render(s),o)}function qi(e,t){let n=[...e.render(t)],r=0;for(let e of n)r+=e.cellLength;return{segments:n,width:r}}const Ji={segments:[],width:0},Yi={left:()=>0,justify:()=>0,center:e=>Math.floor(e/2),right:e=>e};function Xi(e,t){return Yi[e](t)}function Zi(e,t,n,r){let i=Math.max(0,r-1),a=e===`justify`&&!t&&i>0&&n>0?n:0,o=i>0?Math.floor(a/i):0,s=a-o*i;return Array.from({length:i},(e,t)=>o+ +(t<s))}var Qi=class{items;joiner;gap;align;constructor(e,t){this.items=e,this.joiner=t?.joiner,this.gap=t?.gap??0,this.align=t?.align??`left`}*render(e){let t=this.items;if(t.length===0)return;let n=Math.max(1,e.maxWidth),r=this.gap,i=this.joiner,a=t.map(t=>qi(t,e)),o=n=>i?qi(i.join(null,t[n]),e):Ji,s=n=>i?qi(i.join(t[n],null),e):Ji,c=(n,r)=>i?qi(i.join(t[n],t[r]),e):Ji,l=[],u=null,d=r>0?{segments:[new V(` `.repeat(r))],width:r}:Ji;for(let e=0;e<t.length;e++){let t=a[e];if(u===null){let n=o(e),r=s(e),i=n.width>0?[n,t]:[t],a=[i.length-1];u={blocks:i,width:n.width+t.width,lastIndex:e,itemBlockIndices:a},u.endCap=r;continue}let i=u.lastIndex,f=c(i,e),p=s(e),m=(r>0?r:0)+f.width+(r>0?r:0)+t.width;if(u.width+m+p.width<=n)r>0&&u.blocks.push(d),f.width>0&&u.blocks.push(f),r>0&&u.blocks.push(d),u.blocks.push(t),u.itemBlockIndices.push(u.blocks.length-1),u.width+=m,u.lastIndex=e,u.endCap=p;else{let n=u.endCap;n.width>0&&u.blocks.push(n),u.width+=n.width,l.push(u);let r=o(e),i=s(e),a=r.width>0?[r,t]:[t],c=[a.length-1];u={blocks:a,width:r.width+t.width,lastIndex:e,itemBlockIndices:c},u.endCap=i}}let f=u;{let e=f.endCap;e.width>0&&f.blocks.push(e),f.width+=e.width,l.push(f)}let p=this.align;for(let e=0;e<l.length;e++){let t=l[e],r=e===l.length-1,i=Math.max(0,n-t.width),a=Xi(p,i),o=Zi(p,r,i,t.itemBlockIndices.length),s=new Map;t.itemBlockIndices.forEach((e,t)=>s.set(e,t)),a>0&&(yield new V(` `.repeat(a)));for(let e=0;e<t.blocks.length;e++){let n=s.get(e);if(n!==void 0&&n>0){let e=o[n-1];e>0&&(yield new V(` `.repeat(e)))}yield*t.blocks[e].segments}yield V.line()}}measure(e){let t=this.items;if(t.length===0)return{minimum:0,maximum:0};let n=0,r=0;for(let i=0;i<t.length;i++){let a=qi(t[i],e).width,o=this.joiner?qi(this.joiner.join(null,t[i]),e).width:0,s=this.joiner?qi(this.joiner.join(t[i],null),e).width:0;n=Math.max(n,a+o+s),r+=a,i>0&&(r+=this.gap*2,this.joiner&&(r+=qi(this.joiner.join(t[i-1],t[i]),e).width))}return this.joiner&&(r+=qi(this.joiner.join(null,t[0]),e).width,r+=qi(this.joiner.join(t[t.length-1],null),e).width),{minimum:n,maximum:r}}};const $i=[`primary`,`secondary`,`accent`],ea={"secondary-accent":[`secondary`,`accent`],"primary-secondary":[`primary`,`secondary`],primary:[`primary`]},ta=`accent`,na=[0,.5,1],ra=e=>e.flatMap(e=>na.map(t=>({hue:e,tone:t}))),ia=ra($i.filter(e=>Object.values(ea).some(t=>t.includes(e)))),aa=e=>{let t=0,n=.5;for(let r=e;r>0;r>>=1,n/=2)t+=n*(r&1);return t},oa=[`van-der-corput`,`golden-angle`,`ends-interleaved`,`monotonic`,`uniform`],sa=e=>typeof e==`string`&&oa.includes(e),ca={"van-der-corput":aa,"golden-angle":e=>e*.6180339887498949%1,"ends-interleaved":(e,t)=>((e%2==0?e/2:t-1-(e-1)/2)+.5)/t,monotonic:(e,t)=>(e+.5)/t,uniform:()=>.5},la=e=>ca[e??`van-der-corput`];function ua(e){let t=0,n=1;for(let{index:r,count:i,distribution:a}of e)t+=a(r,i)*n,n*=.37;return t%1}const da=(e,t)=>Math.floor(e*t),fa=(e,t)=>Math.round(e*t)%t;function pa(e,t,n){let r=e[n(t===void 0?0:t.distribution(t.index,t.count),e.length)];if(r===void 0)throw Error(`vocabularySelect: empty vocabulary`);return r}function ma(e,t){let n=t.findIndex(e=>e.axis===`cell`),r=n===-1?t:t.slice(0,n);return{hue:pa(e,r.at(-1),da),tone:pa(na,t[r.length],fa)}}function ha(e,t){let n=e.get(t);if(n===void 0)throw Error(`palette "${e.name}" has no "${t}" role; decoration needs it`);return n}function ga(e,t){let n=_a.get(e);n===void 0&&(n=new Map,_a.set(e,n));let r=`${t.hue}|${t.tone}`,i=n.get(r);if(i!==void 0)return i;let a=z.fromRgba(ha(e,t.hue)),o=z.fromRgba(ha(e,`surface`)),s=(e,t)=>e.mixAxes(a,{l:t,c:.8,h:1,alpha:0}),c=s(o.mixAxes(z.fromRgba(ha(e,`background`)),{l:.5,c:0,h:0,alpha:0}),0).mixAxes(s(o,.35),{l:t.tone,c:t.tone,h:t.tone,alpha:0}).toRgba();return n.set(r,c),c}const _a=new WeakMap,va=(e,t,n)=>ga(e,ma(t,n)),ya=2.2;function ba(e,t,n){let r=xa(e,t,n);if(`refused`in r)throw Error(r.refused);return r.state}function xa(e,t,n){let r=Sa.get(e);r===void 0&&(r=new Map,Sa.set(e,r));let i=`${t}|${n}`,a=r.get(i);if(a!==void 0)return a;let o=Ca(e,t,n);return r.set(i,o),o}const Sa=new WeakMap;function Ca(e,t,n){let r=ia.map(t=>or(ga(e,t),P.TRUECOLOR)),i=wn(ha(e,`surface`),ha(e,t),.92),a=ha(e,`foreground`),o=r.reduce((e,t)=>ir(e,t,ya),a),s=[...Array.from({length:13},(e,t)=>wn(i,a,t/12)),o].find(e=>r.every(t=>N(or(e,P.TRUECOLOR),t)>=ya));if(s===void 0)return{refused:`palette "${e.name}": "${t}" cannot clear the ${ya} state floor even beyond foreground`};let c=ar(s,n,(e,t)=>r.every(n=>N(e,t(n))>=ya));return c===void 0?{refused:`palette "${e.name}": "${t}" cannot clear the ${ya} state floor on the colours drawn at depth ${P[n]}`}:{state:c}}const wa=4.5;function Ta(e,t,n){let r=Ea.get(e);r===void 0&&(r=new Map,Ea.set(e,r));let i=`${t.hex}|${n}`,a=r.get(i);if(a!==void 0)return a;let o=rr(t),s=ir([`background`,`foreground`].map(t=>ha(e,t)).reduce((e,t)=>N(o,t)<N(o,e)?t:e),t,wa,n);return r.set(i,s),s}const Ea=new WeakMap,Da={base:.42,perDepth:.14,cap:.75},Oa={floor:.12,span:.8};function ka(e,t){return $i[($i.indexOf(e)+t)%$i.length]}const Aa={triggerPlane:.1,nestedPlane:.035,nestedTriggerPlane:.08};function ja(e,t,n){let r=`${t.hue}|${t.depth}|${n}`,i=La.get(e);i===void 0&&(i=new Map,La.set(e,i));let a=i.get(r);if(a!==void 0)return a;let o=ba(e,ka(t.hue,t.depth),n),s=Ia(e,t,o,n),c=ar(Na(e,t).plane,n,(e,t)=>s.every(([n,r])=>Ma(e,t(n))>=r));if(c===void 0)throw Error(`palette "${e.name}": the ${t.hue} band at depth ${t.depth} cannot keep its floors on the colours drawn at depth ${P[n]}`);let l={state:o,plane:c};return i.set(r,l),l}const Ma=(e,t)=>z.fromRgba(e).deltaE(z.fromRgba(t));function Na(e,t){let n=`${t.hue}|${t.depth}`,r=Pa.get(e);r===void 0&&(r=new Map,Pa.set(e,r));let i=r.get(n);if(i!==void 0)return i;let a=Fa(e,t);return r.set(n,a),a}const Pa=new WeakMap;function Fa(e,t){let n=ba(e,ka(t.hue,t.depth),P.TRUECOLOR),r=Math.min(Da.cap,Da.base+Da.perDepth*t.depth);return{state:n,plane:wn(n,ha(e,`background`),r)}}function Ia(e,t,n,r){let{hue:i,depth:a}=t,o=t=>Na(e,{hue:i,depth:t}).state,s=t=>Na(e,{hue:i,depth:t}).plane,c=e=>or(e,P.TRUECOLOR),l=s(a),u=(e,t)=>Ma(c(l),c(t))>=e?e:0,d=ka(i,a+1),f=xa(e,d,r),p=xa(e,d,P.TRUECOLOR);return[[n,u(Aa.triggerPlane,o(a))],...`state`in f&&`state`in p?[[f.state,u(Aa.nestedTriggerPlane,p.state)]]:[],...a>0?[[ja(e,{hue:i,depth:a-1},r).plane,u(Aa.nestedPlane,s(a-1))]]:[]]}const La=new WeakMap;function Ra(e,t,n,r){let i=ja(e,t,r),a=Na(e,t),o=ar(wn(a.plane,a.state,Oa.floor+Oa.span*ua(n)),r,(e,t)=>e.hex!==t(i.plane).hex&&e.hex!==t(i.state).hex);if(o===void 0)throw Error(`palette "${e.name}": a ${t.hue} band item at depth ${t.depth} is drawn as its plane or its trigger at depth ${P[r]}, and nothing that depth draws is neither`);return o}const za=e=>({kind:`bar`,progression:e,address:[]}),Ba=(e,t)=>({...e,address:[...e.address,t]}),Va=e=>({kind:`band`,band:e,address:[]});function Ha(e,t,n){switch(t.kind){case`bar`:return{tint:va(e,t.progression,t.address),disclosure:{hue:ta,depth:0}};case`band`:return{tint:Ra(e,t.band,t.address,n),disclosure:{hue:t.band.hue,depth:t.band.depth+1}}}}const Ua=new Map([[`dark`,`textual-dark`],[`light`,`textual-light`]]);function Wa(e){let t=typeof e==`string`?Ua.get(e):void 0;return t===void 0?``:` — "${e}" was retired; write "${t}", the same palette`}const Ga=`textual-dark`;function Ka(e,t,n,r,i){let a=t===null?null:i(t);return e??a??n??r}function qa(){return xr()}function Ja(){return[`bar`,...qa()]}let Ya;function Xa(e){return Ya??=new Set(Ja()),Ya.has(e)}function Za(e,t,n,r,i){let a=e=>Object.prototype.hasOwnProperty.call(i,e)?e:null;return Ka(e===void 0?null:a(e),t,a(n??r),r,a)}const Qa=[`look`,`palette`];function $a(e){return e!==void 0&&e.includes(`{{`)}function eo(e,t,n,r,i){let a=$a(n)?{kind:`expression`,source:n}:i(n??r.name);return Ka(e===void 0?null:i(e),t,a,r,i)}function to(e,t){return e.kind===`decided`?e:t(e.source)}const no=`none`;function ro(e,t){let n=t[e];return n===void 0?null:{kind:`decided`,name:e,value:n}}function io(e,t){return ro(e,t)??ro(`none`,t)??{kind:`decided`,name:`none`,value:Ln}}function ao(e,t,n,r){return eo(e,t,n,io(no,r),e=>ro(e,r))}const oo=[`powerline`,`capsule`,`plain`];function so(e){return oo.includes(e)}function co(e,t,n){return Ka(e,t,n,`powerline`,e=>so(e)?e:null)}const lo=[`unicode`,`ascii`],uo=`unicode`;function fo(e){return lo.includes(e)}function po(e,t,n){return Ka(e,t,n,uo,e=>fo(e)?e:null)}const mo=[`truecolor`,`256`,`ansi`,`none`],ho=`truecolor`;function go(e){return mo.includes(e)}function _o(e,t,n){return Ka(e,t,n,ho,e=>go(e)?e:null)}function vo(e){return mn(e)??P.DEFAULT}const yo=Object.keys(ea);function bo(e){return yo.includes(e)}function xo(e,t,n){return Ka(e,t,n,`secondary-accent`,e=>bo(e)?e:null)}const So=`true`,Co=`false`,wo=[So,Co],To={min:0,max:16};function Eo(e){return e===`true`?!0:e===`false`?!1:null}function Do(e){if(!/^\d+$/.test(e))return null;let t=Number(e);return t>=To.min&&t<=To.max?t:null}function Oo(e,t,n){return Ka(e,t,n,!0,Eo)}function ko(e,t,n){return Ka(e,t,n,!0,Eo)}function Ao(e,t,n){return Ka(e,t,n,1,Do)}var jo=class extends Error{constructor(e,t){super(`${e} (at offset ${t})`),this.reason=e,this.offset=t,this.name=`Json5EditError`}};const Mo=/[A-Za-z_$\p{L}]/u,No=/[A-Za-z0-9_$\u200C\u200D\p{L}\p{N}]/u,Po=/[A-Za-z0-9_$.+\-\p{L}\p{N}]/u,Fo=/[\t\n\v\f\r \u00A0\uFEFF\u2028\u2029\p{Zs}]/u;var Io=class{pos=0;constructor(e){this.text=e}peek(){return this.text[this.pos]??``}fail(e){throw new jo(e,this.pos)}skipTrivia(){for(;;){let e=this.peek();if(e===``)return;if(Fo.test(e))this.pos++;else if(e===`/`&&this.text[this.pos+1]===`/`){let e=this.text.indexOf(`
24
+ `),n=0,r=0;for(let e of t){let t=Lt(e);n=Math.max(n,t);let i=e.split(/\s+/);for(let e of i)e.length>0&&(r=Math.max(r,Lt(e)))}let i=Bt(e.maxWidth);return{minimum:Math.min(r,i),maximum:Math.min(n,i)}}_expandTabs(e){return e.includes(` `)?e.replace(/\t/g,` `.repeat(this._tabSize)):e}_buildSegments(e,t,n){let r=t=>Math.max(0,Math.min(t,e.length)),i=new Set([0,e.length]);for(let e of this._spans)i.add(r(e.start)),i.add(r(e.end));let a=[...i].sort((e,t)=>e-t),o=new Map(a.map((e,t)=>[e,t])),s=a.slice(0,-1).map(()=>t);for(let e of this._spans){let t=r(e.end),i=Ei(n,e.style),c=o.get(r(e.start));for(let e=c;a[e]<t;e++)s[e]=s[e].add(i)}return s.map((t,n)=>new V(e.slice(a[n],a[n+1]),t.isNull?void 0:t))}_justifyLines(e,t,n,r){return r===`full`?e.map((r,i)=>i===e.length-1?r:this._fillLine(r,t,n)):e.map(e=>[...this._justifyLine(e,t,r)])}*_justifyLine(e,t,n){switch(n){case`center`:case`right`:{let r=V.adjustLineLength(e,V.getLineLength(e)-Si(e),void 0,!1),i=Math.max(t-V.getLineLength(r),0),a=n===`center`?Math.floor(i/2):i;a>0&&(yield new V(` `.repeat(a))),yield*r;let o=i-a;o>0&&(yield new V(` `.repeat(o)));break}case`left`:yield*V.adjustLineLength(e,Math.max(t,V.getLineLength(e)));break;default:yield*e;break}}_fillLine(e,t,n){let r=xi(e),i=r.split(` `);r.endsWith(` `)&&i.pop();let a=i.length-1,o=Array(a).fill(1),s=i.reduce((e,t)=>e+Lt(t),0)+a;for(let e=0;s<t&&a>0;e=(e+1)%a)o[a-1-e]+=1,s+=1;let c=[],l=0;for(let e=0;e<i.length;e+=1)l+=Lt(i[e]),c.push(l),l+=1,e<a&&c.push(l);let u=V.divide(e,c),d=(e,t)=>e.filter(e=>e.hasText).at(t)?.style??n,f=[];for(let e=0;e<i.length;e+=1)if(f.push(...u[e*2]),e<a){let t=d(u[e*2],-1),r=d(u[e*2+2],0),i=t.equals(r)?t:n;f.push(new V(` `.repeat(o[e]),i.isNull?void 0:i))}return f}*_fitLine(e,t,n,r){let i=V.getLineLength(e);if(i-Si(e)<=t){yield*V.adjustLineLength(e,Math.min(i,t),void 0,!1);return}if(n===`ellipsis`&&t>0){yield*V.adjustLineLength(e,t-1,void 0,!1),yield new V(r);return}yield*V.adjustLineLength(e,t,void 0,!1)}},ki=class{items;joiner;constructor(e,t){this.items=e,this.joiner=t}*render(e){let t=this.items;if(t.length!==0){yield*this.joiner.join(null,t[0]).render(e);for(let n=0;n<t.length;n++){let r=t[n];yield*r.render(e);let i=n+1<t.length?t[n+1]:null;yield*this.joiner.join(r,i).render(e)}yield V.line()}}};const Ai={*render(e){}};function ji(e){return{render:e}}function U(e){return new B({color:e.bgcolor})}function Mi(e){return e!==void 0&&!e.isDefault?e:void 0}function Ni(e){return new B({bgcolor:e}).drawnColors().bgcolor}function*Pi(e,t){e!==``&&(yield new V(e,new B({color:Ni(t)})))}function Fi(e,t){let{color:n,bgcolor:r}=e.drawnColors(t??P.TRUECOLOR);if(n===void 0||r===void 0)return!1;let i=n.fixedValue,a=r.fixedValue;return i!==void 0&&a!==void 0?z.fromRgba(i).deltaE(z.fromRgba(a))<.04:n.number===r.number}const Ii=Object.freeze({glyph:``,divider:``,lead:``,tail:``}),Li=Object.freeze({glyph:`>`,divider:`>`,lead:``,tail:`>`}),Ri=({glyph:e,divider:t,lead:n,tail:r})=>e+t+n+r;var zi=class{_glyphs;constructor(e=Ii){this._glyphs=e}join(e,t){let n=this._glyphs;return ji(function*(r){let{glyph:i,divider:a,lead:o,tail:s}=ri(r,n,Li,Ri),c=e?.edgeStyle(`right`,r),l=Mi(c?.bgcolor),u=Mi(t?.edgeStyle(`left`,r).bgcolor);if(l===void 0){u!==void 0&&(yield*Pi(o,u));return}if(u===void 0){yield*Pi(s,l);return}let d=new B({color:Ni(l),bgcolor:u});yield Fi(d,r.colorSystem)?new V(a,new B({color:c?.color,bgcolor:l})):new V(i,d)})}};const Bi={left:`(`,right:`)`},Vi=({left:e,right:t})=>e+t;var Hi=class{_caps;_separator;constructor(e){this._caps={left:e?.left??``,right:e?.right??``},this._separator=e?.separator??` `}*_emit(e,t,n){let r=ri(n,this._caps,Bi,Vi),i=ri(n,this._separator,` `);if(!(e===null&&t===null)){if(e===null){yield new V(r.left,U(t.edgeStyle(`left`,n)));return}if(t===null){yield new V(r.right,U(e.edgeStyle(`right`,n)));return}yield new V(r.right,U(e.edgeStyle(`right`,n))),i.length>0&&(yield new V(i)),yield new V(r.left,U(t.edgeStyle(`left`,n)))}}join(e,t){return ji(n=>this._emit(e,t,n))}},Ui=class{_separator;_style;constructor(e){this._separator=e?.separator??` | `,this._style=e?.style??B.parse(`dim`)}join(e,t){if(e===null||t===null)return Ai;let n=this._separator,r=this._style;return ji(e=>[new V(ri(e,n,` | `),r)])}};function Wi(e,t){if(e.isControl||e.text.length===0)return;let n=e.style;return!n||n.isNull?{text:e.text,sgrCodes:``,link:void 0}:{text:e.text,sgrCodes:t.colorSystem===null?``:n.toSgrCodes(t.colorSystem),link:t.hyperlinks?n.link:void 0}}function Gi(e,t){let n=[];for(let r of e){let e=Wi(r,t);e&&n.push(e)}if(n.length===0)return``;let r=[],i=0;for(;i<n.length;){let e=n[i].sgrCodes,t=i+1;for(;t<n.length&&n[t].sgrCodes===e;)t++;e.length>0&&r.push(`\x1b[${e}m`);let a=i;for(;a<t;){let e=n[a].link,i=a+1;for(;i<t&&n[i].link===e;)i++;if(e){r.push(gi(e));for(let e=a;e<i;e++)r.push(n[e].text);r.push(`\x1B]8;;\x1B\\`)}else for(let e=a;e<i;e++)r.push(n[e].text);a=i}e.length>0&&r.push(`\x1B[0m`),i=t}return r.join(``)}function Ki(e,t){let n=t?.width??80,r={};t?.env!==void 0&&(r.env=t.env),t?.isTTY!==void 0&&(r.isTTY=t.isTTY);let i=t?.colorSystem,a=pn(i===void 0?P.TRUECOLOR:i,r),o={colorSystem:t?.noColor?null:a.colorSystem,hyperlinks:t?.hyperlinks??a.hyperlinks},s={maxWidth:n,isTerminal:!1,asciiOnly:t?.asciiOnly??!1,onStyleError:t?.onStyleError,colorSystem:o.colorSystem};return Gi(e.render(s),o)}function qi(e,t){let n=[...e.render(t)],r=0;for(let e of n)r+=e.cellLength;return{segments:n,width:r}}const Ji={segments:[],width:0},Yi={left:()=>0,justify:()=>0,center:e=>Math.floor(e/2),right:e=>e};function Xi(e,t){return Yi[e](t)}function Zi(e,t,n,r){let i=Math.max(0,r-1),a=e===`justify`&&!t&&i>0&&n>0?n:0,o=i>0?Math.floor(a/i):0,s=a-o*i;return Array.from({length:i},(e,t)=>o+ +(t<s))}var Qi=class{items;joiner;gap;align;constructor(e,t){this.items=e,this.joiner=t?.joiner,this.gap=t?.gap??0,this.align=t?.align??`left`}*render(e){let t=this.items;if(t.length===0)return;let n=Math.max(1,e.maxWidth),r=this.gap,i=this.joiner,a=t.map(t=>qi(t,e)),o=n=>i?qi(i.join(null,t[n]),e):Ji,s=n=>i?qi(i.join(t[n],null),e):Ji,c=(n,r)=>i?qi(i.join(t[n],t[r]),e):Ji,l=[],u=null,d=r>0?{segments:[new V(` `.repeat(r))],width:r}:Ji;for(let e=0;e<t.length;e++){let t=a[e];if(u===null){let n=o(e),r=s(e),i=n.width>0?[n,t]:[t],a=[i.length-1];u={blocks:i,width:n.width+t.width,lastIndex:e,itemBlockIndices:a},u.endCap=r;continue}let i=u.lastIndex,f=c(i,e),p=s(e),m=(r>0?r:0)+f.width+(r>0?r:0)+t.width;if(u.width+m+p.width<=n)r>0&&u.blocks.push(d),f.width>0&&u.blocks.push(f),r>0&&u.blocks.push(d),u.blocks.push(t),u.itemBlockIndices.push(u.blocks.length-1),u.width+=m,u.lastIndex=e,u.endCap=p;else{let n=u.endCap;n.width>0&&u.blocks.push(n),u.width+=n.width,l.push(u);let r=o(e),i=s(e),a=r.width>0?[r,t]:[t],c=[a.length-1];u={blocks:a,width:r.width+t.width,lastIndex:e,itemBlockIndices:c},u.endCap=i}}let f=u;{let e=f.endCap;e.width>0&&f.blocks.push(e),f.width+=e.width,l.push(f)}let p=this.align;for(let e=0;e<l.length;e++){let t=l[e],r=e===l.length-1,i=Math.max(0,n-t.width),a=Xi(p,i),o=Zi(p,r,i,t.itemBlockIndices.length),s=new Map;t.itemBlockIndices.forEach((e,t)=>s.set(e,t)),a>0&&(yield new V(` `.repeat(a)));for(let e=0;e<t.blocks.length;e++){let n=s.get(e);if(n!==void 0&&n>0){let e=o[n-1];e>0&&(yield new V(` `.repeat(e)))}yield*t.blocks[e].segments}yield V.line()}}measure(e){let t=this.items;if(t.length===0)return{minimum:0,maximum:0};let n=0,r=0;for(let i=0;i<t.length;i++){let a=qi(t[i],e).width,o=this.joiner?qi(this.joiner.join(null,t[i]),e).width:0,s=this.joiner?qi(this.joiner.join(t[i],null),e).width:0;n=Math.max(n,a+o+s),r+=a,i>0&&(r+=this.gap*2,this.joiner&&(r+=qi(this.joiner.join(t[i-1],t[i]),e).width))}return this.joiner&&(r+=qi(this.joiner.join(null,t[0]),e).width,r+=qi(this.joiner.join(t[t.length-1],null),e).width),{minimum:n,maximum:r}}};const $i=[`primary`,`secondary`,`accent`],ea={accent:[`secondary`,`accent`],duo:[`primary`,`secondary`],mono:[`primary`]},ta=`accent`,na=[0,.5,1],ra=e=>e.flatMap(e=>na.map(t=>({hue:e,tone:t}))),ia=ra($i.filter(e=>Object.values(ea).some(t=>t.includes(e)))),aa=e=>{let t=0,n=.5;for(let r=e;r>0;r>>=1,n/=2)t+=n*(r&1);return t},oa=[`van-der-corput`,`golden-angle`,`ends-interleaved`,`monotonic`,`uniform`],sa=e=>typeof e==`string`&&oa.includes(e),ca={"van-der-corput":aa,"golden-angle":e=>e*.6180339887498949%1,"ends-interleaved":(e,t)=>((e%2==0?e/2:t-1-(e-1)/2)+.5)/t,monotonic:(e,t)=>(e+.5)/t,uniform:()=>.5},la=e=>ca[e??`van-der-corput`];function ua(e){let t=0,n=1;for(let{index:r,count:i,distribution:a}of e)t+=a(r,i)*n,n*=.37;return t%1}const da=(e,t)=>Math.floor(e*t),fa=(e,t)=>Math.round(e*t)%t;function pa(e,t,n){let r=e[n(t===void 0?0:t.distribution(t.index,t.count),e.length)];if(r===void 0)throw Error(`vocabularySelect: empty vocabulary`);return r}function ma(e,t){let n=t.findIndex(e=>e.axis===`cell`),r=n===-1?t:t.slice(0,n);return{hue:pa(e,r.at(-1),da),tone:pa(na,t[r.length],fa)}}function ha(e,t){let n=e.get(t);if(n===void 0)throw Error(`palette "${e.name}" has no "${t}" role; decoration needs it`);return n}function ga(e,t){let n=_a.get(e);n===void 0&&(n=new Map,_a.set(e,n));let r=`${t.hue}|${t.tone}`,i=n.get(r);if(i!==void 0)return i;let a=z.fromRgba(ha(e,t.hue)),o=z.fromRgba(ha(e,`surface`)),s=(e,t)=>e.mixAxes(a,{l:t,c:.8,h:1,alpha:0}),c=s(o.mixAxes(z.fromRgba(ha(e,`background`)),{l:.5,c:0,h:0,alpha:0}),0).mixAxes(s(o,.35),{l:t.tone,c:t.tone,h:t.tone,alpha:0}).toRgba();return n.set(r,c),c}const _a=new WeakMap,va=(e,t,n)=>ga(e,ma(t,n)),ya=2.2;function ba(e,t,n){let r=xa(e,t,n);if(`refused`in r)throw Error(r.refused);return r.state}function xa(e,t,n){let r=Sa.get(e);r===void 0&&(r=new Map,Sa.set(e,r));let i=`${t}|${n}`,a=r.get(i);if(a!==void 0)return a;let o=Ca(e,t,n);return r.set(i,o),o}const Sa=new WeakMap;function Ca(e,t,n){let r=ia.map(t=>or(ga(e,t),P.TRUECOLOR)),i=wn(ha(e,`surface`),ha(e,t),.92),a=ha(e,`foreground`),o=r.reduce((e,t)=>ir(e,t,ya),a),s=[...Array.from({length:13},(e,t)=>wn(i,a,t/12)),o].find(e=>r.every(t=>N(or(e,P.TRUECOLOR),t)>=ya));if(s===void 0)return{refused:`palette "${e.name}": "${t}" cannot clear the ${ya} state floor even beyond foreground`};let c=ar(s,n,(e,t)=>r.every(n=>N(e,t(n))>=ya));return c===void 0?{refused:`palette "${e.name}": "${t}" cannot clear the ${ya} state floor on the colours drawn at depth ${P[n]}`}:{state:c}}const wa=4.5;function Ta(e,t,n){let r=Ea.get(e);r===void 0&&(r=new Map,Ea.set(e,r));let i=`${t.hex}|${n}`,a=r.get(i);if(a!==void 0)return a;let o=rr(t),s=ir([`background`,`foreground`].map(t=>ha(e,t)).reduce((e,t)=>N(o,t)<N(o,e)?t:e),t,wa,n);return r.set(i,s),s}const Ea=new WeakMap,Da={base:.42,perDepth:.14,cap:.75},Oa={floor:.12,span:.8};function ka(e,t){return $i[($i.indexOf(e)+t)%$i.length]}const Aa={triggerPlane:.1,nestedPlane:.035,nestedTriggerPlane:.08};function ja(e,t,n){let r=`${t.hue}|${t.depth}|${n}`,i=La.get(e);i===void 0&&(i=new Map,La.set(e,i));let a=i.get(r);if(a!==void 0)return a;let o=ba(e,ka(t.hue,t.depth),n),s=Ia(e,t,o,n),c=ar(Na(e,t).plane,n,(e,t)=>s.every(([n,r])=>Ma(e,t(n))>=r));if(c===void 0)throw Error(`palette "${e.name}": the ${t.hue} band at depth ${t.depth} cannot keep its floors on the colours drawn at depth ${P[n]}`);let l={state:o,plane:c};return i.set(r,l),l}const Ma=(e,t)=>z.fromRgba(e).deltaE(z.fromRgba(t));function Na(e,t){let n=`${t.hue}|${t.depth}`,r=Pa.get(e);r===void 0&&(r=new Map,Pa.set(e,r));let i=r.get(n);if(i!==void 0)return i;let a=Fa(e,t);return r.set(n,a),a}const Pa=new WeakMap;function Fa(e,t){let n=ba(e,ka(t.hue,t.depth),P.TRUECOLOR),r=Math.min(Da.cap,Da.base+Da.perDepth*t.depth);return{state:n,plane:wn(n,ha(e,`background`),r)}}function Ia(e,t,n,r){let{hue:i,depth:a}=t,o=t=>Na(e,{hue:i,depth:t}).state,s=t=>Na(e,{hue:i,depth:t}).plane,c=e=>or(e,P.TRUECOLOR),l=s(a),u=(e,t)=>Ma(c(l),c(t))>=e?e:0,d=ka(i,a+1),f=xa(e,d,r),p=xa(e,d,P.TRUECOLOR);return[[n,u(Aa.triggerPlane,o(a))],...`state`in f&&`state`in p?[[f.state,u(Aa.nestedTriggerPlane,p.state)]]:[],...a>0?[[ja(e,{hue:i,depth:a-1},r).plane,u(Aa.nestedPlane,s(a-1))]]:[]]}const La=new WeakMap;function Ra(e,t,n,r){let i=ja(e,t,r),a=Na(e,t),o=ar(wn(a.plane,a.state,Oa.floor+Oa.span*ua(n)),r,(e,t)=>e.hex!==t(i.plane).hex&&e.hex!==t(i.state).hex);if(o===void 0)throw Error(`palette "${e.name}": a ${t.hue} band item at depth ${t.depth} is drawn as its plane or its trigger at depth ${P[r]}, and nothing that depth draws is neither`);return o}const za=e=>({kind:`bar`,variation:e,address:[]}),Ba=(e,t)=>({...e,address:[...e.address,t]}),Va=e=>({kind:`band`,band:e,address:[]});function Ha(e,t,n){switch(t.kind){case`bar`:return{tint:va(e,t.variation,t.address),disclosure:{hue:ta,depth:0}};case`band`:return{tint:Ra(e,t.band,t.address,n),disclosure:{hue:t.band.hue,depth:t.band.depth+1}}}}const Ua=new Map([[`dark`,`textual-dark`],[`light`,`textual-light`]]);function Wa(e){let t=typeof e==`string`?Ua.get(e):void 0;return t===void 0?``:` — "${e}" was retired; write "${t}", the same palette`}const Ga=`textual-dark`;function Ka(e,t,n,r,i){let a=t===null?null:i(t);return e??a??n??r}function qa(){return xr()}function Ja(){return[`bar`,...qa()]}let Ya;function Xa(e){return Ya??=new Set(Ja()),Ya.has(e)}function Za(e,t,n,r,i){let a=e=>Object.prototype.hasOwnProperty.call(i,e)?e:null;return Ka(e===void 0?null:a(e),t,a(n??r),r,a)}const Qa=[`style`,`palette`];function $a(e){return e!==void 0&&e.includes(`{{`)}function eo(e,t,n,r,i){let a=$a(n)?{kind:`expression`,source:n}:i(n??r.name);return Ka(e===void 0?null:i(e),t,a,r,i)}function to(e,t){return e.kind===`decided`?e:t(e.source)}const no=`none`;function ro(e,t){let n=t[e];return n===void 0?null:{kind:`decided`,name:e,value:n}}function io(e,t){return ro(e,t)??ro(`none`,t)??{kind:`decided`,name:`none`,value:Ln}}function ao(e,t,n,r){return eo(e,t,n,io(no,r),e=>ro(e,r))}const oo=[`powerline`,`capsule`,`plain`];function so(e){return oo.includes(e)}function co(e,t,n){return Ka(e,t,n,`powerline`,e=>so(e)?e:null)}const lo=[`unicode`,`ascii`],uo=`unicode`;function fo(e){return lo.includes(e)}function po(e,t,n){return Ka(e,t,n,uo,e=>fo(e)?e:null)}const mo=[`truecolor`,`256`,`ansi`,`none`],ho=`truecolor`;function go(e){return mo.includes(e)}function _o(e,t,n){return Ka(e,t,n,ho,e=>go(e)?e:null)}function vo(e){return mn(e)??P.DEFAULT}const yo=Object.keys(ea);function bo(e){return yo.includes(e)}function xo(e,t,n){return Ka(e,t,n,`accent`,e=>bo(e)?e:null)}const So=`true`,Co=`false`,wo=[So,Co],To={min:0,max:16};function Eo(e){return e===`true`?!0:e===`false`?!1:null}function Do(e){if(!/^\d+$/.test(e))return null;let t=Number(e);return t>=To.min&&t<=To.max?t:null}function Oo(e,t,n){return Ka(e,t,n,!0,Eo)}function ko(e,t,n){return Ka(e,t,n,!0,Eo)}function Ao(e,t,n){return Ka(e,t,n,1,Do)}var jo=class extends Error{constructor(e,t){super(`${e} (at offset ${t})`),this.reason=e,this.offset=t,this.name=`Json5EditError`}};const Mo=/[A-Za-z_$\p{L}]/u,No=/[A-Za-z0-9_$\u200C\u200D\p{L}\p{N}]/u,Po=/[A-Za-z0-9_$.+\-\p{L}\p{N}]/u,Fo=/[\t\n\v\f\r \u00A0\uFEFF\u2028\u2029\p{Zs}]/u;var Io=class{pos=0;constructor(e){this.text=e}peek(){return this.text[this.pos]??``}fail(e){throw new jo(e,this.pos)}skipTrivia(){for(;;){let e=this.peek();if(e===``)return;if(Fo.test(e))this.pos++;else if(e===`/`&&this.text[this.pos+1]===`/`){let e=this.text.indexOf(`
25
25
  `,this.pos);this.pos=e===-1?this.text.length:e}else if(e===`/`&&this.text[this.pos+1]===`*`){let e=this.text.indexOf(`*/`,this.pos+2);e===-1&&this.fail(`unterminated block comment`),this.pos=e+2}else return}}expect(e){this.peek()!==e&&this.fail(`expected "${e}"`),this.pos++}value(){this.skipTrivia();let e=this.peek();if(e===`{`)return this.object();if(e===`[`)return this.array();if(e===`"`||e===`'`){let e=this.stringSpan();return{kind:`string`,span:e,value:this.decode(e)}}e===``&&this.fail(`unexpected end of input`);let t=this.pos;for(;this.pos<this.text.length&&Po.test(this.peek());)this.pos++;this.pos===t&&this.fail(`unexpected character "${e}"`);let n={start:t,end:this.pos},r=this.decode(n);return r===null?{kind:`null`,span:n}:typeof r==`boolean`?{kind:`boolean`,span:n,value:r}:typeof r==`number`?{kind:`number`,span:n,value:r}:this.fail(`unexpected word "${this.text.slice(t,this.pos)}"`)}decode(e){try{return Qe.default.parse(this.text.slice(e.start,e.end))}catch(t){throw new jo(t.message,e.start)}}stringSpan(){let e=this.pos,t=this.peek();for(this.pos++;;){let n=this.peek();if(n===``&&this.fail(`unterminated string`),n===`\\`){let e=this.text.startsWith(`\r
26
26
  `,this.pos+1);this.pos+=e?3:2;continue}if(this.pos++,n===t)return{start:e,end:this.pos};n===`
27
27
  `&&this.fail(`unterminated string`)}}key(){let e=this.peek();if(e===`"`||e===`'`){let e=this.stringSpan();return{key:this.decode(e),span:e}}let t=this.pos;for(Mo.test(e)||this.fail(`expected an object key`);this.pos<this.text.length&&No.test(this.peek());)this.pos++;return{key:this.text.slice(t,this.pos),span:{start:t,end:this.pos}}}object(){let e=this.pos;this.expect(`{`);let t=[];for(;this.skipTrivia(),this.peek()!==`}`;){let{key:e,span:n}=this.key();if(t.some(t=>t.key===e))throw new jo(`duplicate key "${e}"`,n.start);this.skipTrivia(),this.expect(`:`);let r=this.value();if(t.push({key:e,keySpan:n,value:r,span:{start:n.start,end:r.span.end}}),this.skipTrivia(),this.peek()===`,`){this.pos++;continue}this.peek()!==`}`&&this.fail(`expected "," or "}"`)}return this.expect(`}`),{kind:`object`,span:{start:e,end:this.pos},entries:t}}array(){let e=this.pos;this.expect(`[`);let t=[];for(;this.skipTrivia(),this.peek()!==`]`;){if(t.push(this.value()),this.skipTrivia(),this.peek()===`,`){this.pos++;continue}this.peek()!==`]`&&this.fail(`expected "," or "]"`)}return this.expect(`]`),{kind:`array`,span:{start:e,end:this.pos},elements:t}}};function Lo(e){let t=new Io(e),n=t.value();return t.skipTrivia(),t.pos!==e.length&&t.fail(`trailing content after the document`),n}function Ro(e,t){return e.kind===`object`?e.entries.find(e=>e.key===t):void 0}function zo(e,t){let n=e;for(let e of t)n=n===void 0?void 0:Ro(n,e)?.value;return n}function Bo(e,t){return e.slice(t.span.start,t.span.end)}function Vo(e,t){let n=es(e,t.span.start),r=Ho(t),i=e=>r.some(t=>t.start<e&&e<t.end),a=t.span.start;return Bo(e,t).split(`
@@ -37,7 +37,7 @@ import{createRequire as e}from"node:module";import t from"node:process";import{j
37
37
  `).join(`${n}${t}`)}function Xo(e,t,n){let[r,...i]=e,a=i.length===0?t:`{\n ${Yo(Xo(i,t,n),` `,`
38
38
  `)}${n.trailingComma}\n}`;return`${n.key(r)}: ${a}`}function Zo(e,t,n,r){return e.slice(0,t)+r+e.slice(n)}function Qo(e,t){return e.lastIndexOf(`
39
39
  `,t-1)+1}function $o(e){return/^[ \t]*$/.test(e)}function es(e,t){let n=Qo(e,t);return/^[ \t]*/.exec(e.slice(n))[0]}function ts(e,t){return $o(e.slice(Qo(e,t),t))}const ns=/(?:\/\/[^\n]*?)?(\r\n|\n|$)/y;function rs(e,t){let n=t;for(;n<e.length&&(e[n]===` `||e[n]===` `);)n++;let r=e[n]===`,`?n+1:-1;for(r!==-1&&(n=r);n<e.length&&(e[n]===` `||e[n]===` `);)n++;ns.lastIndex=n;let i=ns.exec(e);if(i===null)return{commaEnd:r,line:null};let a=n+i[0].length;return{commaEnd:r,line:{at:a-i[1].length,next:a}}}function is(e,t){let{commaEnd:n,line:r}=rs(e,t.end);if(ts(e,t.start)&&r!==null)return Zo(e,Qo(e,t.start),r.next,``);if(n!==-1){let r=n;for(;r<e.length&&e[r]===` `;)r++;return Zo(e,t.start,r,``)}let i=t.start;for(;i>0&&(e[i-1]===` `||e[i-1]===` `);)i--;return e[i-1]===`,`?Zo(e,i-1,t.end,``):Zo(e,t.start,t.end,``)}function as(e,t,n,r,i){let a=n.commaEnd!==-1,o=a?e:Zo(e,t.end,t.end,`,`),s=n.line.at+ +!a,c=Jo(e);return Zo(o,s,s,`${c}${i}${Yo(r,i,c)}${a?`,`:``}`)}function os(e,t,n,r){let i=t.kind===`object`?t.entries:t.elements,a=i[i.length-1],o=es(e,t.span.start);if(a===void 0){let i=o+` `,a=Jo(e);return Zo(e,t.span.start+1,t.span.end-1,`${a}${i}${Yo(n,i,a)}${r.trailingComma}${a}${o}`)}let{commaEnd:s,line:c}=rs(e,a.span.end);if(ts(e,a.span.start)&&c!==null){let t=e.slice(Qo(e,a.span.start),a.span.start);return as(e,a.span,{commaEnd:s,line:c},n,t)}let l=s===-1?a.span.end:s;return Zo(e,l,l,`${s===-1?`, `:` `}${n}${s===-1?``:`,`}`)}function ss(e,t,n,r){if(t.length===0)throw new jo(`setValue needs a non-empty path`,0);if(/^\s*$/.test(e)){let i=Jo(e);return`{${i} ${Yo(Xo(t,n,r),` `,i)}${r.trailingComma}${i}}${i}`}return cs(e,Lo(e),t,n,r)}function cs(e,t,n,r,i){let a=t;for(let t=0;t<n.length;t++){if(a.kind!==`object`)throw new jo(`cannot set ${n.join(`.`)}: ${n.slice(0,t).join(`.`)||`the document`} is not an object`,a.span.start);let o=Ro(a,n[t]);if(o===void 0)return os(e,a,Xo(n.slice(t),r,i),i);if(t===n.length-1){let t=es(e,o.keySpan.start);return Zo(e,o.value.span.start,o.value.span.end,Yo(r,t,Jo(e)))}a=o.value}throw new jo(`unreachable: path exhausted`,0)}function ls(e,t,n=0){if(t.length===0)throw new jo(`deleteValue needs a non-empty path`,0);if(/^\s*$/.test(e))return e;let r=t.slice(0,-1),i=zo(Lo(e),r),a=i===void 0?void 0:Ro(i,t[t.length-1]);if(a===void 0||i?.kind!==`object`)return e;let o=is(e,a.span);return r.length>n&&i.entries.length===1?ls(o,r,n):o}const us=[`h`,`v`,`children`];function ds(e){if(e.kind===`string`)return e.value;if(e.kind!==`object`)return;let t=Ro(e,`seg`)?.value,n=Ro(e,`kind`)?.value,r=Ro(e,`name`)?.value,i=t?.kind===`string`?t.value:n?.kind===`string`&&n.value===`segment`&&r?.kind===`string`?r.value:void 0;if(i===void 0)return;let a=Ro(e,`id`)?.value;return a?.kind===`string`?a.value:i}function fs(e){return e.kind===`object`?us.map(t=>Ro(e,t)?.value).filter(e=>e?.kind===`array`):[]}function ps(e){let t=Ro(e,`rows`)?.value;return t?.kind===`object`?t.entries:null}function ms(e){if(e.kind!==`object`)return!0;let t=ps(e);return t===null||t.length>0||e.entries.some(e=>e.key!==`rows`)}function*hs(e,t){yield{node:e,bareAt:t};for(let t of fs(e))for(let e of t.elements)yield*hs(e,null);for(let n of ps(e)??[])yield*hs(n.value,t===null?null:[...t,`rows`,n.key])}function gs(e,t){for(let{node:n}of hs(e,null))if(ds(n)===t)return!0;return!1}function _s(e,t,n){let r=zo(Lo(e),t);if(r===void 0)return null;for(let{node:i,bareAt:a}of hs(r,t))if(ds(i)===n)return a===null?{text:e,ref:i}:_s(ss(e,a,`{ h: [${Bo(e,i)}] }`,Go),t,n);return null}function vs(e,t,n){let r=_s(e,t,n);return r===null?null:is(r.text,r.ref.span)}function ys(e,t,n,r,i){let a=_s(e,t,r);if(a===null)return null;let{text:o,ref:s}=a,c=n.id===void 0?JSON.stringify(n.seg):`{ seg: ${JSON.stringify(n.seg)}, id: ${JSON.stringify(n.id)} }`,{commaEnd:l,line:u}=rs(o,s.span.end);if(ts(o,s.span.start)&&u!==null){let e=o.slice(Qo(o,s.span.start),s.span.start);return i===`after`?as(o,s.span,{commaEnd:l,line:u},c,e):Zo(o,s.span.start,s.span.start,`${c},${Jo(o)}${e}`)}let d=Bo(o,s),f=i===`before`?`${c}, ${d}`:`${d}, ${c}`;return Zo(o,s.span.start,s.span.end,f)}function bs(e,t,n,r,i){let a=_s(e,t,n);if(a===null)return null;let{text:o,ref:s}=a,c=`{ ${Wo(r)}: ${i} }`;return s.kind===`string`?Zo(o,s.span.start,s.span.end,`{ seg: ${JSON.stringify(s.value)}, settings: ${c} }`):Ro(s,`settings`)===void 0?cs(o,s,[`settings`],c,Go):cs(o,s,[`settings`,r],i,Go)}var xs=class extends Error{file;issues;warnings;constructor(e,t,n=[]){super(Ts(e,t)),this.name=`ConfigError`,this.file=e,this.issues=t,this.warnings=n}};function W(e,t){let n=0,r;for(let i of t){if(i===``||/^\d+$/.test(i))continue;let t=Ss(e,n,i);if(t===-1)return r===void 0?void 0:Cs(e,r);n=t,r=t}return r===void 0?void 0:Cs(e,r)}function Ss(e,t,n){let r=n.replace(/[\\^$.*+?()[\]{}|]/g,`\\$&`),i=RegExp(`(?:["']${r}["']|\\b${r}\\b)\\s*:`,`g`);i.lastIndex=t;let a=i.exec(e);return a?a.index:-1}function Cs(e,t){let n=1;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}function ws(e,t){try{return Lo(t),null}catch(n){if(!(n instanceof jo))throw n;return`${e}:${Cs(t,n.offset)}: ${n.reason} — the settings menu cannot edit this file until it is fixed`}}function Ts(e,t){if(t.length===0)return`${e}: invalid config (no details)`;let n=[`Invalid config in ${e} (${t.length} issue${t.length===1?``:`s`}):`];for(let e of t){let t=[];e.line!==void 0&&t.push(`line ${e.line}${e.col===void 0?``:`:${e.col}`}`),e.path&&t.push(e.path);let r=t.length>0?`[${t.join(` • `)}] `:``;n.push(` ${r}${e.message}`)}return n.join(`
40
- `)}const Es=[`vertical`,`horizontal`],Ds={vertical:`row`,horizontal:`cell`};function Os(e){return e.id??e.name}function ks(e){return[...Ms(e)].flatMap(e=>e.kind===`segment`?[Os(e)]:[])}function As(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e}-${n}`);)n++;return`${e}-${n}`}function js(e,t){return e.opens===void 0?e:{...e,opens:{...e.opens,body:t(e.opens.body)}}}function*Ms(e){yield e;for(let t of Is(e))yield*Ms(t)}const Ns=(e,t)=>`${e}.children[${t}]`,Ps=e=>`${e}.opens.body`;function*Fs(e,t){if(yield[e,t],e.kind===`container`)for(let[n,r]of e.children.entries())yield*Fs(r,Ns(t,n));else e.opens!==void 0&&(yield*Fs(e.opens.body,Ps(t)))}function Is(e){return e.kind===`container`?e.children:e.opens===void 0?[]:[e.opens.body]}function Ls(e){return e===void 0||`text`in e?`text`:`regex`in e?`regex`:`json`}const Rs=[`ttl`,`watch_file`,`depends_on`,`key`,`never`];function zs(e){return e.kind!==`literal`&&e.kind!==`input`&&e.kind!==`env`&&e.kind!==`state`}const Bs=[`branch`,`sha`,`dirty`,`ahead`,`behind`,`stash`],Vs=[`file`,`shell`,`git`],Hs=`theme`;function Us(e){return{...e.settings,[Hs]:{label:Hs,domain:`theme`,default:e.palette??`bar`}}}function Ws(e){let t=e?.domain;return typeof t==`object`&&`min`in t?t:void 0}function Gs(e,t){return Object.entries(e).flatMap(([n,r])=>{let i=Ws(r)?.atLeast;if(i===void 0)return[];let a=t[n],o=t[i];return a>=o?[]:[{setting:n,message:`"${n}" (${a}) is below "${i}" (${o}) — ${r.label} must be at least ${e[i].label}`}]})}function Ks(e,t){let{domain:n}=e;return n===`bool`?typeof t==`boolean`:n===`theme`?typeof t==`string`&&Xa(t):`min`in n?typeof t==`number`&&Number.isInteger(t)&&t>=n.min&&t<=n.max:typeof t==`string`&&n.includes(t)}function qs(e){return String(e)}function Js(e,t){let{domain:n}=e,r=n===`bool`?t===`true`?!0:t===`false`?!1:t:typeof n==`object`&&`min`in n&&/^-?\d+$/.test(t)?Number(t):t;return Ks(e,r)?r:void 0}function Ys(e){let{domain:t}=e;return t===`bool`?`true or false`:t===`theme`?`"bar" (the bar's own theme) or an installed theme name`:`min`in t?`an integer from ${t.min} to ${t.max}`:`one of ${t.map(e=>JSON.stringify(e)).join(`, `)}`}const Xs=[`left`,`center`,`right`],Zs=[`right`,`left`,`middle`];function Qs(e,t,n,r){let i=n[r];return typeof i==`string`?i:(e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be a string, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),r])}),null)}function $s(e,t,n,r){let i=n.default;if(i!==void 0){if(!(r===`string`&&typeof i==`string`||r===`number`&&typeof i==`number`||r===`boolean`&&typeof i==`boolean`)){e.issues.push({path:`${t}.default`,message:`default must be a ${r}, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),`default`])});return}return i}}function ec(e,t,n,r){let i=n[r];if(i!==void 0){if(typeof i!=`string`){e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be a string, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),r])});return}return i}}function tc(e,t,n){let r=ec(e,t,n,`palette`);if(r!==void 0){if(!e.allowedPalettes.has(r)){e.issues.push({path:`${t}.palette`,message:`Unknown palette "${r}"${Wa(r)}. Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:W(e.source,[...t.split(`.`),`palette`])});return}return r}}function nc(e,t,n,r,i){let a=n[r];if(a!==void 0){if(typeof a!=`string`||!i.includes(a)){e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be one of: ${i.join(`, `)}; got ${G(a)}`,line:W(e.source,[...t.split(`.`),r])});return}return a}}function rc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ic(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function G(e){return typeof e==`string`?JSON.stringify(e):e===void 0?`undefined`:String(e)}function ac(e,t,n,r){if(!rc(r))return e.issues.push({path:n,message:`${n} must be an object, got ${ic(r)}`,line:W(e.source,n.split(`.`))}),null;let i=Object.entries(t.removed??{}).filter(([e])=>r[e]!==void 0);for(let[t,r]of i)lc(e,`${n}.${t}`,`${n}.${t} was removed: ${r}`);return cc(e,n,r,t.noun,new Set(Object.keys(t.fields)),new Set(i.map(([e])=>`${n}.${e}`))),oc(e,t.fields,n,r)}function oc(e,t,n,r){let i=t,a={},o=!0;for(let[t,s]of Object.entries(i)){let i=s.parse(e,n,t,r);i===void 0?s.required&&(o=!1):a[t]=i}return o?a:null}const sc=new Set;function cc(e,t,n,r,i,a=sc){for(let o of Object.keys(n))!i.has(o)&&!a.has(`${t}.${o}`)&&e.issues.push({path:`${t}.${o}`,message:`Unknown ${r} "${o}". Expected one of: ${[...i].join(`, `)}`,line:W(e.source,[...t.split(`.`),o])})}function lc(e,t,n){return e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))}),null}function uc(e,t,n,r){if(!rc(r))return e.issues.push({path:n,message:`${t.noun} must be an object, got ${ic(r)}`,line:W(e.source,n.split(`.`))}),null;let i=t.arms,a=Object.keys(i),o=Object.keys(r).filter(e=>e in i),s=Object.keys(r).filter(e=>!(e in i));for(let r of s)e.issues.push({path:`${n}.${r}`,message:`Unknown ${t.noun} key "${r}". Expected exactly one of: ${a.join(`, `)}`,line:W(e.source,[...n.split(`.`),r])});if(o.length===0)return e.issues.push({path:n,message:`${t.noun} must declare exactly one of: ${a.join(`, `)}`,line:W(e.source,n.split(`.`))}),null;if(o.length>1)return e.issues.push({path:n,message:`${t.noun} must declare exactly one of: ${a.join(`, `)} (found: ${o.join(`, `)})`,line:W(e.source,n.split(`.`))}),null;let c=o[0];return i[c].parse(e,`${n}.${c}`,r[c])}function dc(e,t,n,r){if(!rc(r))return e.issues.push({path:n,message:`${n} must be an object, got ${ic(r)}`,line:W(e.source,n.split(`.`))}),null;let i=r[t.tag];if(typeof i!=`string`)return e.issues.push({path:`${n}.${t.tag}`,message:`${n}.${t.tag} must be a string, got ${ic(i)}`,line:W(e.source,n.split(`.`))}),null;let a=t.arms;if(!(i in a))return e.issues.push({path:`${n}.${t.tag}`,message:`Unknown ${t.noun} "${i}". Expected one of: ${Object.keys(a).join(`, `)}`,line:W(e.source,[...n.split(`.`),t.tag])}),null;let o=a[i],s=e.issues.length,c=o.parse(e,n,r),l=new Set(e.issues.slice(s).map(e=>e.path));return cc(e,n,r,`${i} ${t.memberNoun} key`,o.keys,l),c}function fc(e,t,n){return{json:Ec(wc(n),e,t),keys:new Set([e,...Object.keys(n)])}}function pc(e){return(...t)=>e()(...t)}function mc(e,...t){return(n,r,i)=>{let a=e(n,r,i);if(a===null)return null;for(let e of t){if(e.ok(a))continue;let{field:t,message:i}=e.issue(a),o=t===``?r:`${r}.${t}`;return n.issues.push({path:o,message:i,line:W(n.source,o.split(`.`))}),null}return a}}function hc(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>ec(e,t,r,n)}}function gc(){return{required:!1,json:{type:`boolean`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(typeof i!=`boolean`){e.issues.push({path:`${t}.${n}`,message:`${n} must be a boolean, got ${ic(i)}`,line:W(e.source,[n])});return}return i}}}}function _c(e){let{min:t,max:n}=e;return{required:!1,json:{type:`integer`,minimum:t,maximum:n},parse:(e,r,i,a)=>{let o=a[i];if(o!==void 0){if(typeof o!=`number`||!Number.isInteger(o)||o<t||o>n){e.issues.push({path:`${r}.${i}`,message:`${i} must be an integer between ${t} and ${n}, got ${G(o)}`,line:W(e.source,[i])});return}return o}}}}function vc(e={}){let{min:t}=e;return{required:!1,json:{type:`number`,...t!==void 0&&{minimum:t}},parse:(e,n,r,i)=>{let a=i[r];if(a!==void 0){if(typeof a!=`number`||!Number.isFinite(a)||t!==void 0&&a<t){let i=t===void 0?`a finite number`:`a finite number >= ${t}`;e.issues.push({path:`${n}.${r}`,message:`${r} must be ${i}, got ${G(a)}`,line:W(e.source,[r])});return}return a}}}}function yc(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>tc(e,t,r)}}function bc(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>Qs(e,t,r,n)??void 0}}function xc(e,t){return d(t)?null:`${e} must be an absolute path (\`~\` and relative paths are not expanded), got ${JSON.stringify(t)}`}function Sc(){return{required:!0,json:{type:`string`,pattern:`^/`},parse:(e,t,n,r)=>{let i=Qs(e,t,r,n);if(i===null)return;let a=xc(`${t}.${n}`,i);return a===null?i:lc(e,`${t}.${n}`,a)??void 0}}}function Cc(e){return{required:!1,json:{enum:[...e]},parse:(t,n,r,i)=>nc(t,n,i,r,e)}}function wc(e,t={closed:!0}){let n=e,r={},i=[];for(let[e,t]of Object.entries(n))r[e]=t.json,t.required&&i.push(e);return{type:`object`,properties:r,...i.length>0&&{required:i},...t.closed&&{additionalProperties:!1}}}function Tc(e){return wc(e.fields)}function Ec(e,t,n){let r=e,i={[t]:{const:n},...r.properties},a=[t,...r.required??[]];return{...r,properties:i,required:a}}function Dc(e){let t=e.arms;return{anyOf:Object.values(t).map(e=>e.json)}}function Oc(e){let t=e.arms;return{anyOf:Object.entries(t).map(([e,t])=>({type:`object`,properties:{[e]:t.json},required:[e],additionalProperties:!1}))}}const kc=/^[A-Za-z_][A-Za-z0-9_]*$/;function Ac(e){return`#${e+1}`}const jc={rows:{}};function Mc(e){return`rows`in e}function Nc(e){return Object.fromEntries(e.map((e,t)=>[Ac(t),e]))}function Pc(e){if(e.kind===`container`&&e.direction===`vertical`){let{kind:t,direction:n,children:r,...i}=e;return{...i,rows:Nc(r)}}let{when:t,...n}=e;return{...t!==void 0&&{when:t},rows:Nc([n])}}function Fc(e){let{rows:t,...n}=e;return{kind:`container`,direction:`vertical`,children:Object.values(t),...n}}function Ic(e){return Mc(e)?Fc(e):e}function*Lc(e,t){if(!Mc(e)){yield*Fs(e,t);return}yield[Fc(e),t];for(let[n,r]of Object.entries(e.rows))yield*Fs(r,`${t}.rows.${n}`)}function Rc(e,t){return Mc(e)?{...t,...e,rows:{...t.rows,...e.rows}}:Pc(e)}function zc(e){if(!Mc(e))return!0;let{rows:t,...n}=e;return Object.values(n).some(e=>e!==void 0)||Object.keys(t).length>0}function Bc(e,t){return{globals:{...t.globals,...e.globals??{}},variables:{...t.variables,...e.variables??{}},segments:Uc(t.segments,Vc(t.segments,e.segments??{})),root:Rc(e.root??jc,t.root),actions:{...t.actions,...e.actions??{}},looks:{...t.looks,...e.looks??{}},presets:Uc(t.presets,Hc(t.presets,e.presets??{})),editGlobals:{...t.editGlobals,...e.editGlobals??{}},helpers:{...t.helpers,...e.helpers??{}}}}function Vc(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,n.settings===void 0?n:{...n,settings:{...e[t]?.settings,...n.settings}}]))}function Hc(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,n.globals===void 0?n:{...n,globals:{...e[t]?.globals,...n.globals}}]))}function Uc(e,t){return{...e,...Object.fromEntries(Object.entries(t).map(([t,n])=>[t,{...e[t],...n}]))}}const Wc=`closed`,Gc=`🍫`;function Kc(e,t,n){if(t===0)return`${e} needs a display (the clickable text)`;if(t!==1&&t!==n)return`${e} cycles ${n} members; bind one display per member (${n}) or one static display, got ${t}`}function qc(e,t,n,r){let i=Kc(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function Jc(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Yc(e,t,n,r,i){return{kind:`segment`,name:e,opens:{ref:t,body:n,placement:r},...i!==void 0&&{when:i}}}function Xc(e,...t){return`{{ and ${[e,...t].map(Zc).join(` `)} }}`}function Zc(e){return`(eq .${e.variable} "${Jc(e.member)}")`}function Qc(e,t,n){return`{{ action "${e}" "${Jc(t)}" "${Jc(n)}" }}`}function $c(e,t){return{kind:`state`,key:e,default:t}}function el(e,t){return{set:e,cycle:[Wc,t]}}const tl={required:!1,json:{enum:[...mo]},parse:(e,t,n,r)=>{if(r[n]===`auto`){e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: "auto" is not supported — the render daemon runs detached, so terminal detection would read the daemon's environment, not your terminal's. Pick an explicit depth: ${mo.join(`, `)}`,line:W(e.source,[...t.split(`.`),n])});return}return nc(e,t,r,n,mo)}},nl={required:!1,json:{type:`string`},parse:(e,t,n,r)=>{let i=ec(e,t,r,n);return $a(i)?i:tc(e,t,r)}},rl=/^[^\r\n]*\S[^\r\n]*$/u,il=RegExp(`^(?:❌|✕)[\\uFE0E\\uFE0F]?$`,`u`),al={required:!1,json:{type:`string`,pattern:rl.source,not:{pattern:il.source}},parse:(e,t,n,r)=>{let i=ec(e,t,r,n);if(i===void 0||rl.test(i)&&!il.test(i))return i;e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: must be one line of visible text other than a close glyph ("❌", "✕") — the settings menu needs a glyph to click`,line:W(e.source,[...t.split(`.`),n])})}};function ol(e){return{spec:Cc(e),domain:{from:e}}}function sl(){return{spec:gc(),domain:`bool`}}function cl(e){return{spec:e,domain:`text`}}const ll={default_empty_value:cl(hc()),default_separator:cl(hc()),palette:{spec:nl,domain:{from:`themes`}},look:{spec:hc(),domain:{from:`looks`}},preset:{spec:hc(),domain:{from:`presets`}},style:ol(oo),progression:ol(yo),autoWrap:sl(),padding:{spec:_c(To),domain:{...To,step:1}},charset:ol(lo),updateNotice:sl(),colorCompatibility:{spec:tl,domain:{from:mo}},menuGlyph:cl(al)},ul=Object.fromEntries(Object.entries(ll).map(([e,t])=>[e,t.spec]));function dl(e){return ll[e].domain}function fl(e,t){return{required:!1,json:{not:{},description:`not allowed here — ${e}`},parse:(e,n,r,i)=>{i[r]!==void 0&&e.issues.push({path:`${n}.${r}`,message:t(`${n}.${r}`),line:W(e.source,[...n.split(`.`),r])})}}}function pl(e){return fl(`${e} cannot select a preset`,t=>`${t}: ${e} cannot select a preset. Which preset is active is resolved once, as session pick over globals.preset over "default"; a fragment naming another would be a second authority over that. Set the default arrangement in the top-level globals.preset instead.`)}function ml(e){return fl(`${e} cannot change the settings menu glyph`,t=>`${t}: ${e} cannot change the settings menu glyph — one menu is shared by every preset. Set it in the top-level globals.menuGlyph instead.`)}function hl(e,t){return{...e,json:{...e.json,not:{pattern:`\\{\\{`}},parse:(n,r,i,a)=>{let o=a[i];if(typeof o==`string`&&$a(o)){n.issues.push({path:`${r}.${i}`,message:`${r}.${i}: a rule is not allowed here — ${t} is decided later than any rule could be settled, so it names a value. Write the rule in globals.${i} (or a preset's globals.${i}) instead.`,line:W(n.source,[...r.split(`.`),i])});return}return e.parse(n,r,i,a)}}}const gl={default_bg:"nothing reads it — a segment with no `bg:` wears the decoration tint of its place in the bar. Delete the key, and author `bg:` on the segments that need a fixed colour.",default_fg:"nothing reads it — a segment with no `fg:` wears text chosen for contrast against its background. Delete the key, and author `fg:` on the segments that need a fixed colour.",default_truncate_marker:'nothing reads it — a segment clipped to its `width:` always ends in "…". Delete the key.'},_l={noun:`globals key`,fields:ul,removed:gl},vl={preset:pl(`a preset`),menuGlyph:ml(`a preset`)},yl={noun:`preset globals key`,fields:{...ul,...vl},removed:gl};function bl(e){return Dl(e)&&!(e in vl)}const xl={noun:`editGlobals key`,removed:gl,fields:{...ul,preset:pl(`the editGlobals fragment`),menuGlyph:ml(`the editGlobals fragment`),palette:hl(ul.palette,`the editGlobals fragment`),look:hl(ul.look,`the editGlobals fragment`)}};function Sl(e,t,n){return n===void 0?{}:ac(e,_l,t,n)??{}}function Cl(e,t,n){return ac(e,yl,t,n)??{}}function wl(){return Tc(yl)}function Tl(e,t,n){return ac(e,xl,t,n)??{}}const El=new Set(Object.keys(ul));function Dl(e){return El.has(e)}function Ol(){return[...El]}const kl={padding:1};function Al(e){let t=new Map;for(let[n,r]of Object.entries(kl)){let i=e[n];t.set(n,typeof i==`number`?i:r)}return t}function jl(e,t,n,r){return n.cache===void 0?(Vs.includes(r)&&e.issues.push({path:`${t}.cache`,message:`${r} variables must declare a cache policy (one of: ${Rs.join(`, `)})`,line:W(e.source,t.split(`.`))}),null):Il(e,`${t}.cache`,n.cache)}function Ml(e,t,n){if(n.cache!==void 0)return Il(e,`${t}.cache`,n.cache)??void 0}function Nl(e){return{required:!0,json:zl(),parse:(t,n,r,i)=>jl(t,n,i,e)??void 0}}function Pl(){return{required:!1,json:zl(),parse:(e,t,n,r)=>Ml(e,t,r)}}const Fl={noun:`cache`,arms:{ttl:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&Vl(n)?{ttl:n}:lc(e,t,`cache.ttl must be a duration string like "5s", "100ms", "2m", "1h"; got ${G(n)}`)},watch_file:{json:{type:`string`,pattern:`^/`},parse:(e,t,n)=>{if(typeof n!=`string`)return lc(e,t,`cache.watch_file must be a path string, got ${G(n)}`);let r=xc(`cache.watch_file`,n);return r===null?{watch_file:n}:lc(e,t,r)}},depends_on:{json:{type:`array`,items:{type:`string`}},parse:(e,t,n)=>Array.isArray(n)&&n.every(e=>typeof e==`string`)?{depends_on:n}:lc(e,t,`cache.depends_on must be an array of variable-name strings, got ${G(n)}`)},key:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&n!==``?{key:n}:lc(e,t,`cache.key must be a non-empty template string, got ${G(n)}`)},never:{json:{const:!0},parse:(e,t,n)=>n===!0?{never:!0}:lc(e,t,`cache.never must be the literal boolean true, got ${G(n)}`)}}};function Il(e,t,n){return uc(e,Fl,t,n)}const Ll={noun:`time-variable cache`,arms:{ttl:Fl.arms.ttl}};function Rl(){return{required:!1,json:Oc(Ll),parse:(e,t,n,r)=>r.cache===void 0?void 0:uc(e,Ll,`${t}.cache`,r.cache)??void 0}}function zl(){return Oc(Fl)}const Bl=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/;function Vl(e){return Bl.test(e)}function Hl(e,t,n){if(n===void 0)return{};if(!rc(n))return e.issues.push({path:t,message:`${t} must be an object, got ${ic(n)}`,line:W(e.source,t.split(`.`))}),{};let r={};for(let[i,a]of Object.entries(n)){let n=dc(e,uu,`${t}.${i}`,a);n!==null&&(r[i]=n)}return r}function Ul(){return{required:!0,json:{type:[`string`,`number`,`boolean`]},parse:(e,t,n,r)=>{let i=r.value;if(typeof i!=`string`&&typeof i!=`number`&&typeof i!=`boolean`){e.issues.push({path:`${t}.value`,message:`literal value must be string|number|boolean, got ${ic(i)}`,line:W(e.source,t.split(`.`))});return}return i}}}function Wl(){return{required:!0,json:{enum:[...Bs]},parse:(e,t,n,r)=>{let i=r.field;if(typeof i!=`string`||!Bs.includes(i)){e.issues.push({path:`${t}.field`,message:`git field must be one of: ${Bs.join(`, `)}, got ${JSON.stringify(i)}`,line:W(e.source,[...t.split(`.`),`field`])});return}return i}}}function Gl(){return{required:!1,json:{type:[`string`,`number`,`boolean`]},parse:(e,t,n,r)=>{let i=r.type;return $s(e,t,r,i===`number`||i===`boolean`||i===`string`?i:`string`)}}}const Kl={noun:`parse`,arms:{text:{json:{const:!0},parse:(e,t,n)=>n===!0?{text:!0}:lc(e,t,`parse.text must be the literal boolean true, got ${G(n)}`)},regex:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`?ql(e,t,n):lc(e,t,`parse.regex must be a pattern string, got ${G(n)}`)},json:{json:{const:!0},parse:(e,t,n)=>n===!0?{json:!0}:lc(e,t,`parse.json must be the literal boolean true, got ${G(n)}`)}}};function ql(e,t,n){let r;try{new RegExp(n),r=RegExp(`${n}|`).exec(``).length-1}catch(n){return lc(e,t,`parse.regex is not a valid regular expression: ${n.message}`)}return r>=1?{regex:n}:lc(e,t,`parse.regex must contain a capture group — its group 1 is the value; got ${JSON.stringify(n)}`)}function Jl(){return{required:!1,json:Oc(Kl),parse:(e,t,n,r)=>(r.regex!==void 0&&e.issues.push({path:`${t}.regex`,message:`${t}.regex was retired; the regex is the parse step's regex arm now: parse: { regex: ${JSON.stringify(r.regex)} }`,line:W(e.source,[...t.split(`.`),`regex`])}),r.parse===void 0?void 0:uc(e,Kl,`${t}.parse`,r.parse)??void 0)}}function Yl(){return{required:!1,json:{type:[`string`,`number`,`boolean`,`array`,`object`],description:`The value published when the source fails: a string under the text/regex parse arms, any non-null JSON value under the json arm`},parse:(e,t,n,r)=>rc(r.parse)&&`json`in r.parse?Xl(e,t,r.default):ec(e,t,r,`default`)}}function Xl(e,t,n){if(n!==void 0)return Zl(n)?n:lc(e,`${t}.default`,`${t}.default must be a JSON value (a json-parsed source's document), got ${G(n)}`)??void 0}function Zl(e){return e!==null&&Ql(e)}function Ql(e){if(e===null)return!0;switch(typeof e){case`string`:case`boolean`:return!0;case`number`:return Number.isFinite(e);case`object`:{if(Array.isArray(e))return e.every(Ql);let t=Object.getPrototypeOf(e);return(t===Object.prototype||t===null)&&Object.values(e).every(Ql)}default:return!1}}const $l={value:Ul(),default:hc()},eu={path:bc(),type:Cc([`string`,`number`,`boolean`]),default:Gl()},tu={name:bc(),default:hc()},nu={path:Sc(),readMode:Cc([`whole`,`first-line`]),parse:Jl(),cache:Nl(`file`),default:Yl()},ru={command:bc(),parse:Jl(),cache:Nl(`shell`),default:Yl()},iu={template:bc(),cache:Pl(),default:hc()},au={layout:bc(),cache:Rl(),default:hc()},ou={field:Wl(),cache:Nl(`git`),default:hc()},su={key:bc(),default:hc()},cu=`kind`;function lu(e,t){return{...fc(cu,e,t),parse:(n,r,i)=>{let a=oc(n,t,r,i);return a===null?null:{kind:e,...a}}}}const uu={tag:cu,noun:`source kind`,memberNoun:`variable`,arms:{literal:lu(`literal`,$l),input:lu(`input`,eu),env:lu(`env`,tu),file:lu(`file`,nu),shell:lu(`shell`,ru),template:lu(`template`,iu),time:lu(`time`,au),git:lu(`git`,ou),state:lu(`state`,su)}};function du(){return Dc(uu)}function fu(){return{type:`object`,additionalProperties:du()}}function pu(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}const mu=`groups.`,hu=`menus.`,gu=`edit.`,K=`candybar.`,_u=[mu,hu,gu,K];function vu(e){return _u.some(t=>e.startsWith(t))}function yu(e){let t=pu(e);return _u.find(e=>t.startsWith(pu(e)))}function bu(e,t,n,r){for(let i of[`variables`,`actions`,`segments`])for(let a of Object.keys(t[i]??{}))a.startsWith(n)&&e.issues.push({path:`${i}.${a}`,message:`"${a}" is in the reserved "${n}" namespace (synthesized by ${r}) — rename it`,line:W(e.source,[`root`])})}const xu=new Map([[`gitTaculous`,`gitaculous`],[`git`,`gitaculous`],[`settings.menu`,`candybar.menu`]]);function Su(e){let t=xu.get(e);return t===void 0?``:` (the built-in segment "${e}" was renamed to "${t}" — update this reference)`}const Cu=/^[A-Za-z_][A-Za-z0-9_]*$/,wu={pattern:Cu.source},Tu={anyOf:[{type:`boolean`},{type:`string`},{type:`integer`}]},Eu={type:`object`,additionalProperties:!1,required:[`label`,`domain`,`default`],properties:{label:{type:`string`,pattern:`^[^\\n\\r]+$`},domain:{anyOf:[{const:`bool`},{type:`array`,items:{type:`string`,pattern:`^[^/\\n\\r]+$`},minItems:1,uniqueItems:!0},{type:`object`,additionalProperties:!1,required:[`min`,`max`],properties:{min:{type:`integer`},max:{type:`integer`},step:{type:`integer`,minimum:1},atLeast:{type:`string`,...wu}}}]},default:Tu}},Du=[`label`,`domain`,`default`],Ou=[`min`,`max`,`step`,`atLeast`];function ku(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function Au(e,t,n){if(n===`bool`)return`bool`;if(Array.isArray(n)){let r=n.filter(e=>typeof e==`string`);if(n.length===0||r.length!==n.length)return ku(e,t,`a list domain must be a non-empty list of words, got ${JSON.stringify(n)}`);if(new Set(r).size!==r.length)return ku(e,t,`a list domain names each word once, got ${JSON.stringify(n)}`);let i=r.filter(e=>e===``||e.includes(`/`)||/[\n\r]/.test(e));return i.length>0?ku(e,t,`a list domain's words must be non-empty, slash-free, and newline-free — configure mode writes each on the set-state wire — got ${JSON.stringify(i)}`):r}if(rc(n)){let{min:r,max:i,step:a=1,atLeast:o}=n;return Object.keys(n).filter(e=>!Ou.includes(e)).length===0&&Number.isInteger(r)&&Number.isInteger(i)&&r<=i&&Number.isInteger(a)&&a>=1&&(o===void 0||typeof o==`string`)?{min:r,max:i,step:a,...o!==void 0&&{atLeast:o}}:ku(e,t,`a range domain is { min, max, step?, atLeast? } with integers min ≤ max, a whole step ≥ 1, and atLeast naming another range setting, got ${JSON.stringify(n)}`)}return ku(e,t,`domain must be "bool", a list of words, or { min, max }, got ${G(n)}`)}function ju(e,t,n){if(!rc(n))return ku(e,t,`${t} must be { label, domain, default }, got ${ic(n)}`);for(let r of Object.keys(n))Du.includes(r)||ku(e,`${t}.${r}`,`Unknown setting key "${r}". Expected one of: ${Du.join(`, `)}`);let{label:r}=n,i=typeof r==`string`&&r.length>0&&!/[\n\r]/.test(r);i||ku(e,`${t}.label`,`a setting needs a one-line, non-empty "label" — the name its control shows, spliced into a synthesized template string — got ${G(r)}`);let a=Au(e,`${t}.domain`,n.domain);if(!i||a===void 0)return;let o={label:r,domain:a,default:n.default};return!Mu(n.default)||!Ks(o,n.default)?ku(e,`${t}.default`,`default must be ${Ys(o)}, got ${G(n.default)}`):o}function Mu(e){return typeof e==`boolean`||typeof e==`string`||typeof e==`number`}function Nu(){return{required:!1,json:{type:`object`,propertyNames:{...wu,not:{const:Hs}},additionalProperties:Eu},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!rc(i))return ku(e,a,`${a} must be an object of name → { label, domain, default }, got ${ic(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i)){if(!Cu.test(t)){ku(e,`${a}.${t}`,`setting name "${t}" is read as .settings.${t} in a template, so it must be an identifier (letters, digits, _; not starting with a digit)`);continue}if(t===`theme`){ku(e,`${a}.${t}`,`setting "${Hs}" is one every placement already has — its default for this segment is segments.<name>.palette, and a placement sets its own with settings: { ${Hs}: "<theme>" }`);continue}let r=ju(e,`${a}.${t}`,n);r!==void 0&&(o[t]=r)}return o}}}function Pu(){return{required:!1,json:{type:`string`,minLength:1,pattern:`^[^:/]+$`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return typeof i==`string`&&i.length>0&&!/[:/]/.test(i)?i:ku(e,`${t}.${n}`,`a placement "id" must be a non-empty string without "/" or ":", got ${G(i)}`)}}}function Fu(){return{required:!1,json:{type:`object`,propertyNames:wu,additionalProperties:Tu},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!rc(i))return ku(e,a,`a placement's "settings" must be an object of setting name → value, got ${ic(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i))Mu(n)?o[t]=n:ku(e,`${a}.${t}`,`setting "${t}" must be a boolean, a word, or a number, got ${ic(n)}`);return o}}}function Iu(e){return new Set(Object.keys(e.segments).filter(e=>!vu(e)))}function Lu(e,t,n){if(t===void 0)return{};if(!rc(t))return e.issues.push({path:`segments`,message:`segments must be an object, got ${ic(t)}`,line:W(e.source,[`segments`])}),{};let r={};for(let[i,a]of Object.entries(t)){let t=ac(e,n.has(i)?Uu:Hu,`segments.${i}`,a);t!==null&&(r[i]=t)}return r}function Ru(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>r[n]===void 0?lc(e,`${t}.${n}`,`${t} declares no template — only a segment the bundled default declares may omit it (inheriting the bundled template); a segment of your own needs its own${Su(t.slice(9))}`)??void 0:Qs(e,t,r,n)??void 0}}function zu(){return{required:!1,json:{anyOf:[{const:`auto`},{const:`fill`},{type:`integer`,minimum:1}]},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(i===`auto`)return`auto`;if(i===`fill`)return`fill`;if(typeof i==`number`&&Number.isInteger(i)&&i>0)return i;e.issues.push({path:`${t}.${n}`,message:`width must be "auto", "fill", or a positive integer, got ${G(i)}`,line:W(e.source,[...t.split(`.`),n])})}}}}function Bu(){return{required:!1,json:fu(),parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return Hl(e,`${t}.${n}`,i)}}}const Vu={template:Ru(),description:hc(),width:zu(),justify:Cc(Xs),truncate:Cc(Zs),bg:hc(),fg:hc(),when:hc(),palette:yc(),vars:Bu(),settings:Nu()},Hu={noun:`segment key`,fields:Vu},Uu={noun:`segment key`,fields:{...Vu,template:hc()}},Wu=`#/definitions/LayoutNode`,Gu={kind:`container`,direction:`vertical`,children:[]};function Ku(e){return{required:!0,json:{const:e},parse:()=>e}}function qu(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&i.length>0?i:(e.issues.push({path:`${t}.${n}`,message:`a segment node must have a non-empty "name" (a segment name), got ${G(i)}`,line:W(e.source,[`root`])}),``)}}}function Ju(){return{required:!0,json:{enum:[...Es]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&Es.includes(i)?i:(e.issues.push({path:`${t}.${n}`,message:`a container "direction" must be one of: ${Es.join(`, `)} (got ${JSON.stringify(i)})`,line:W(e.source,[`root`])}),`vertical`)}}}function Yu(e){return{required:!0,json:{type:`array`,items:{$ref:Wu}},parse:(t,n,r,i)=>{let a=i[r];return Array.isArray(a)?a.map((i,a)=>e(t,`${n}.${r}[${a}]`,i)):(t.issues.push({path:`${n}.${r}`,message:`a container must have a "children" array of layout nodes, got ${ic(a)}`,line:W(t.source,[`root`])}),[])}}}const Xu={noun:`layout-node key`,fields:{kind:Ku(`segment`),name:qu(),when:hc(),id:Pu(),settings:Fu()}},Zu=()=>Cc(oa),Qu={noun:`layout-node key`,fields:{kind:Ku(`container`),direction:Ju(),children:Yu(pc(()=>rd)),when:hc(),distribution:Zu()}};function $u(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&i.length>0?i:(e.issues.push({path:`${t}.${n}`,message:`a "seg" node must have a non-empty segment name, got ${G(i)}`,line:W(e.source,[`root`])}),``)}}}const ed={noun:`layout-node key`,fields:{seg:$u(),when:hc(),id:Pu(),settings:Fu()}},td={noun:`layout-node key`,fields:{h:Yu(pc(()=>rd)),when:hc(),distribution:Zu()}},nd={noun:`layout-node key`,fields:{v:Yu(pc(()=>rd)),when:hc(),distribution:Zu()}},rd=(e,t,n)=>{if(typeof n==`string`)return n.length===0?(e.issues.push({path:t,message:`a bare-string layout node must be a non-empty segment name`,line:W(e.source,[`root`])}),Gu):{kind:`segment`,name:n};if(!rc(n))return e.issues.push({path:t,message:`a layout node must be a string (segment name) or an object with "kind" / "seg" / "h" / "v", got ${ic(n)}`,line:W(e.source,[`root`])}),Gu;if(n.kind===`container`)return ac(e,Qu,t,n)??Gu;if(n.kind===`segment`)return ac(e,Xu,t,n)??Gu;if(n.kind===`cells`)return e.issues.push({path:t,message:`kind: "cells" is no longer supported — use the h-arm spelling instead:
40
+ `)}const Es=[`vertical`,`horizontal`],Ds={vertical:`row`,horizontal:`cell`};function Os(e){return e.id??e.name}function ks(e){return[...Ms(e)].flatMap(e=>e.kind===`segment`?[Os(e)]:[])}function As(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e}-${n}`);)n++;return`${e}-${n}`}function js(e,t){return e.opens===void 0?e:{...e,opens:{...e.opens,body:t(e.opens.body)}}}function*Ms(e){yield e;for(let t of Is(e))yield*Ms(t)}const Ns=(e,t)=>`${e}.children[${t}]`,Ps=e=>`${e}.opens.body`;function*Fs(e,t){if(yield[e,t],e.kind===`container`)for(let[n,r]of e.children.entries())yield*Fs(r,Ns(t,n));else e.opens!==void 0&&(yield*Fs(e.opens.body,Ps(t)))}function Is(e){return e.kind===`container`?e.children:e.opens===void 0?[]:[e.opens.body]}function Ls(e){return e===void 0||`text`in e?`text`:`regex`in e?`regex`:`json`}const Rs=[`ttl`,`watch_file`,`depends_on`,`key`,`never`];function zs(e){return e.kind!==`literal`&&e.kind!==`input`&&e.kind!==`env`&&e.kind!==`state`}const Bs=[`branch`,`sha`,`dirty`,`ahead`,`behind`,`stash`],Vs=[`file`,`shell`,`git`],Hs=`theme`;function Us(e){return{...e.settings,[Hs]:{label:Hs,domain:`theme`,default:e.palette??`bar`}}}function Ws(e){let t=e?.domain;return typeof t==`object`&&`min`in t?t:void 0}function Gs(e,t){return Object.entries(e).flatMap(([n,r])=>{let i=Ws(r)?.atLeast;if(i===void 0)return[];let a=t[n],o=t[i];return a>=o?[]:[{setting:n,message:`"${n}" (${a}) is below "${i}" (${o}) — ${r.label} must be at least ${e[i].label}`}]})}function Ks(e,t){let{domain:n}=e;return n===`bool`?typeof t==`boolean`:n===`theme`?typeof t==`string`&&Xa(t):`min`in n?typeof t==`number`&&Number.isInteger(t)&&t>=n.min&&t<=n.max:typeof t==`string`&&n.includes(t)}function qs(e){return String(e)}function Js(e,t){let{domain:n}=e,r=n===`bool`?t===`true`?!0:t===`false`?!1:t:typeof n==`object`&&`min`in n&&/^-?\d+$/.test(t)?Number(t):t;return Ks(e,r)?r:void 0}function Ys(e){let{domain:t}=e;return t===`bool`?`true or false`:t===`theme`?`"bar" (the bar's own theme) or an installed theme name`:`min`in t?`an integer from ${t.min} to ${t.max}`:`one of ${t.map(e=>JSON.stringify(e)).join(`, `)}`}const Xs=[`left`,`center`,`right`],Zs=[`right`,`left`,`middle`];function Qs(e,t,n,r){let i=n[r];return typeof i==`string`?i:(e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be a string, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),r])}),null)}function $s(e,t,n,r){let i=n.default;if(i!==void 0){if(!(r===`string`&&typeof i==`string`||r===`number`&&typeof i==`number`||r===`boolean`&&typeof i==`boolean`)){e.issues.push({path:`${t}.default`,message:`default must be a ${r}, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),`default`])});return}return i}}function ec(e,t,n,r){let i=n[r];if(i!==void 0){if(typeof i!=`string`){e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be a string, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),r])});return}return i}}function tc(e,t,n){let r=ec(e,t,n,`palette`);if(r!==void 0){if(!e.allowedPalettes.has(r)){e.issues.push({path:`${t}.palette`,message:`Unknown palette "${r}"${Wa(r)}. Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:W(e.source,[...t.split(`.`),`palette`])});return}return r}}function nc(e,t,n,r,i){let a=n[r];if(a!==void 0){if(typeof a!=`string`||!i.includes(a)){e.issues.push({path:`${t}.${r}`,message:`${t}.${r} must be one of: ${i.join(`, `)}; got ${G(a)}`,line:W(e.source,[...t.split(`.`),r])});return}return a}}function rc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ic(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function G(e){return typeof e==`string`?JSON.stringify(e):e===void 0?`undefined`:String(e)}function ac(e,t,n,r){if(!rc(r))return e.issues.push({path:n,message:`${n} must be an object, got ${ic(r)}`,line:W(e.source,n.split(`.`))}),null;let i=Object.entries(t.removed??{}).filter(([e])=>r[e]!==void 0);for(let[t,r]of i)lc(e,`${n}.${t}`,`${n}.${t} was removed: ${r}`);return cc(e,n,r,t.noun,new Set(Object.keys(t.fields)),new Set(i.map(([e])=>`${n}.${e}`))),oc(e,t.fields,n,r)}function oc(e,t,n,r){let i=t,a={},o=!0;for(let[t,s]of Object.entries(i)){let i=s.parse(e,n,t,r);i===void 0?s.required&&(o=!1):a[t]=i}return o?a:null}const sc=new Set;function cc(e,t,n,r,i,a=sc){for(let o of Object.keys(n))!i.has(o)&&!a.has(`${t}.${o}`)&&e.issues.push({path:`${t}.${o}`,message:`Unknown ${r} "${o}". Expected one of: ${[...i].join(`, `)}`,line:W(e.source,[...t.split(`.`),o])})}function lc(e,t,n){return e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))}),null}function uc(e,t,n,r){if(!rc(r))return e.issues.push({path:n,message:`${t.noun} must be an object, got ${ic(r)}`,line:W(e.source,n.split(`.`))}),null;let i=t.arms,a=Object.keys(i),o=Object.keys(r).filter(e=>e in i),s=Object.keys(r).filter(e=>!(e in i));for(let r of s)e.issues.push({path:`${n}.${r}`,message:`Unknown ${t.noun} key "${r}". Expected exactly one of: ${a.join(`, `)}`,line:W(e.source,[...n.split(`.`),r])});if(o.length===0)return e.issues.push({path:n,message:`${t.noun} must declare exactly one of: ${a.join(`, `)}`,line:W(e.source,n.split(`.`))}),null;if(o.length>1)return e.issues.push({path:n,message:`${t.noun} must declare exactly one of: ${a.join(`, `)} (found: ${o.join(`, `)})`,line:W(e.source,n.split(`.`))}),null;let c=o[0];return i[c].parse(e,`${n}.${c}`,r[c])}function dc(e,t,n,r){if(!rc(r))return e.issues.push({path:n,message:`${n} must be an object, got ${ic(r)}`,line:W(e.source,n.split(`.`))}),null;let i=r[t.tag];if(typeof i!=`string`)return e.issues.push({path:`${n}.${t.tag}`,message:`${n}.${t.tag} must be a string, got ${ic(i)}`,line:W(e.source,n.split(`.`))}),null;let a=t.arms;if(!(i in a))return e.issues.push({path:`${n}.${t.tag}`,message:`Unknown ${t.noun} "${i}". Expected one of: ${Object.keys(a).join(`, `)}`,line:W(e.source,[...n.split(`.`),t.tag])}),null;let o=a[i],s=e.issues.length,c=o.parse(e,n,r),l=new Set(e.issues.slice(s).map(e=>e.path));return cc(e,n,r,`${i} ${t.memberNoun} key`,o.keys,l),c}function fc(e,t,n){return{json:Ec(wc(n),e,t),keys:new Set([e,...Object.keys(n)])}}function pc(e){return(...t)=>e()(...t)}function mc(e,...t){return(n,r,i)=>{let a=e(n,r,i);if(a===null)return null;for(let e of t){if(e.ok(a))continue;let{field:t,message:i}=e.issue(a),o=t===``?r:`${r}.${t}`;return n.issues.push({path:o,message:i,line:W(n.source,o.split(`.`))}),null}return a}}function hc(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>ec(e,t,r,n)}}function gc(){return{required:!1,json:{type:`boolean`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(typeof i!=`boolean`){e.issues.push({path:`${t}.${n}`,message:`${n} must be a boolean, got ${ic(i)}`,line:W(e.source,[n])});return}return i}}}}function _c(e){let{min:t,max:n}=e;return{required:!1,json:{type:`integer`,minimum:t,maximum:n},parse:(e,r,i,a)=>{let o=a[i];if(o!==void 0){if(typeof o!=`number`||!Number.isInteger(o)||o<t||o>n){e.issues.push({path:`${r}.${i}`,message:`${i} must be an integer between ${t} and ${n}, got ${G(o)}`,line:W(e.source,[i])});return}return o}}}}function vc(e={}){let{min:t}=e;return{required:!1,json:{type:`number`,...t!==void 0&&{minimum:t}},parse:(e,n,r,i)=>{let a=i[r];if(a!==void 0){if(typeof a!=`number`||!Number.isFinite(a)||t!==void 0&&a<t){let i=t===void 0?`a finite number`:`a finite number >= ${t}`;e.issues.push({path:`${n}.${r}`,message:`${r} must be ${i}, got ${G(a)}`,line:W(e.source,[r])});return}return a}}}}function yc(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>tc(e,t,r)}}function bc(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>Qs(e,t,r,n)??void 0}}function xc(e,t){return d(t)?null:`${e} must be an absolute path (\`~\` and relative paths are not expanded), got ${JSON.stringify(t)}`}function Sc(){return{required:!0,json:{type:`string`,pattern:`^/`},parse:(e,t,n,r)=>{let i=Qs(e,t,r,n);if(i===null)return;let a=xc(`${t}.${n}`,i);return a===null?i:lc(e,`${t}.${n}`,a)??void 0}}}function Cc(e){return{required:!1,json:{enum:[...e]},parse:(t,n,r,i)=>nc(t,n,i,r,e)}}function wc(e,t={closed:!0}){let n=e,r={},i=[];for(let[e,t]of Object.entries(n))r[e]=t.json,t.required&&i.push(e);return{type:`object`,properties:r,...i.length>0&&{required:i},...t.closed&&{additionalProperties:!1}}}function Tc(e){return wc(e.fields)}function Ec(e,t,n){let r=e,i={[t]:{const:n},...r.properties},a=[t,...r.required??[]];return{...r,properties:i,required:a}}function Dc(e){let t=e.arms;return{anyOf:Object.values(t).map(e=>e.json)}}function Oc(e){let t=e.arms;return{anyOf:Object.entries(t).map(([e,t])=>({type:`object`,properties:{[e]:t.json},required:[e],additionalProperties:!1}))}}const kc=/^[A-Za-z_][A-Za-z0-9_]*$/;function Ac(e){return`#${e+1}`}const jc={rows:{}};function Mc(e){return`rows`in e}function Nc(e){return Object.fromEntries(e.map((e,t)=>[Ac(t),e]))}function Pc(e){if(e.kind===`container`&&e.direction===`vertical`){let{kind:t,direction:n,children:r,...i}=e;return{...i,rows:Nc(r)}}let{when:t,...n}=e;return{...t!==void 0&&{when:t},rows:Nc([n])}}function Fc(e){let{rows:t,...n}=e;return{kind:`container`,direction:`vertical`,children:Object.values(t),...n}}function Ic(e){return Mc(e)?Fc(e):e}function*Lc(e,t){if(!Mc(e)){yield*Fs(e,t);return}yield[Fc(e),t];for(let[n,r]of Object.entries(e.rows))yield*Fs(r,`${t}.rows.${n}`)}function Rc(e,t){return Mc(e)?{...t,...e,rows:{...t.rows,...e.rows}}:Pc(e)}function zc(e){if(!Mc(e))return!0;let{rows:t,...n}=e;return Object.values(n).some(e=>e!==void 0)||Object.keys(t).length>0}function Bc(e,t){return{globals:{...t.globals,...e.globals??{}},variables:{...t.variables,...e.variables??{}},segments:Uc(t.segments,Vc(t.segments,e.segments??{})),root:Rc(e.root??jc,t.root),actions:{...t.actions,...e.actions??{}},styles:{...t.styles,...e.styles??{}},presets:Uc(t.presets,Hc(t.presets,e.presets??{})),editGlobals:{...t.editGlobals,...e.editGlobals??{}},helpers:{...t.helpers,...e.helpers??{}}}}function Vc(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,n.settings===void 0?n:{...n,settings:{...e[t]?.settings,...n.settings}}]))}function Hc(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,n.globals===void 0?n:{...n,globals:{...e[t]?.globals,...n.globals}}]))}function Uc(e,t){return{...e,...Object.fromEntries(Object.entries(t).map(([t,n])=>[t,{...e[t],...n}]))}}const Wc=`closed`,Gc=`🍫`;function Kc(e,t,n){if(t===0)return`${e} needs a display (the clickable text)`;if(t!==1&&t!==n)return`${e} cycles ${n} members; bind one display per member (${n}) or one static display, got ${t}`}function qc(e,t,n,r){let i=Kc(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function Jc(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Yc(e,t,n,r,i){return{kind:`segment`,name:e,opens:{ref:t,body:n,placement:r},...i!==void 0&&{when:i}}}function Xc(e,...t){return`{{ and ${[e,...t].map(Zc).join(` `)} }}`}function Zc(e){return`(eq .${e.variable} "${Jc(e.member)}")`}function Qc(e,t,n){return`{{ action "${e}" "${Jc(t)}" "${Jc(n)}" }}`}function $c(e,t){return{kind:`state`,key:e,default:t}}function el(e,t){return{set:e,cycle:[Wc,t]}}const tl={required:!1,json:{enum:[...mo]},parse:(e,t,n,r)=>{if(r[n]===`auto`){e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: "auto" is not supported — the render daemon runs detached, so terminal detection would read the daemon's environment, not your terminal's. Pick an explicit depth: ${mo.join(`, `)}`,line:W(e.source,[...t.split(`.`),n])});return}return nc(e,t,r,n,mo)}},nl={required:!1,json:{type:`string`},parse:(e,t,n,r)=>{let i=ec(e,t,r,n);return $a(i)?i:tc(e,t,r)}},rl=/^[^\r\n]*\S[^\r\n]*$/u,il=RegExp(`^(?:❌|✕)[\\uFE0E\\uFE0F]?$`,`u`),al={required:!1,json:{type:`string`,pattern:rl.source,not:{pattern:il.source}},parse:(e,t,n,r)=>{let i=ec(e,t,r,n);if(i===void 0||rl.test(i)&&!il.test(i))return i;e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: must be one line of visible text other than a close glyph ("❌", "✕") — the settings menu needs a glyph to click`,line:W(e.source,[...t.split(`.`),n])})}};function ol(e){return{spec:Cc(e),domain:{from:e}}}function sl(){return{spec:gc(),domain:`bool`}}function cl(e){return{spec:e,domain:`text`}}const ll={default_empty_value:cl(hc()),default_separator:cl(hc()),palette:{spec:nl,domain:{from:`themes`}},style:{spec:hc(),domain:{from:`styles`}},preset:{spec:hc(),domain:{from:`presets`}},endcaps:ol(oo),variation:ol(yo),autoWrap:sl(),padding:{spec:_c(To),domain:{...To,step:1}},charset:ol(lo),updateNotice:sl(),colorCompatibility:{spec:tl,domain:{from:mo}},menuGlyph:cl(al)},ul=Object.fromEntries(Object.entries(ll).map(([e,t])=>[e,t.spec]));function dl(e){return ll[e].domain}function fl(e,t){return{required:!1,json:{not:{},description:`not allowed here — ${e}`},parse:(e,n,r,i)=>{i[r]!==void 0&&e.issues.push({path:`${n}.${r}`,message:t(`${n}.${r}`),line:W(e.source,[...n.split(`.`),r])})}}}function pl(e){return fl(`${e} cannot select a preset`,t=>`${t}: ${e} cannot select a preset. Which preset is active is resolved once, as session pick over globals.preset over "default"; a fragment naming another would be a second authority over that. Set the default arrangement in the top-level globals.preset instead.`)}function ml(e){return fl(`${e} cannot change the settings menu glyph`,t=>`${t}: ${e} cannot change the settings menu glyph — one menu is shared by every preset. Set it in the top-level globals.menuGlyph instead.`)}function hl(e,t){return{...e,json:{...e.json,not:{pattern:`\\{\\{`}},parse:(n,r,i,a)=>{let o=a[i];if(typeof o==`string`&&$a(o)){n.issues.push({path:`${r}.${i}`,message:`${r}.${i}: a rule is not allowed here — ${t} is decided later than any rule could be settled, so it names a value. Write the rule in globals.${i} (or a preset's globals.${i}) instead.`,line:W(n.source,[...r.split(`.`),i])});return}return e.parse(n,r,i,a)}}}const gl={default_bg:"nothing reads it — a segment with no `bg:` wears the decoration tint of its place in the bar. Delete the key, and author `bg:` on the segments that need a fixed colour.",default_fg:"nothing reads it — a segment with no `fg:` wears text chosen for contrast against its background. Delete the key, and author `fg:` on the segments that need a fixed colour.",default_truncate_marker:'nothing reads it — a segment clipped to its `width:` always ends in "…". Delete the key.',look:`it was renamed "style" — write the same name as style: "<name>"`,progression:`it was renamed "variation", and its values with it: accent (was secondary-accent), duo (was primary-secondary), mono (was primary)`},_l={noun:`globals key`,fields:ul,removed:gl},vl={preset:pl(`a preset`),menuGlyph:ml(`a preset`)},yl={noun:`preset globals key`,fields:{...ul,...vl},removed:gl};function bl(e){return Dl(e)&&!(e in vl)}const xl={noun:`editGlobals key`,removed:gl,fields:{...ul,preset:pl(`the editGlobals fragment`),menuGlyph:ml(`the editGlobals fragment`),palette:hl(ul.palette,`the editGlobals fragment`),style:hl(ul.style,`the editGlobals fragment`)}};function Sl(e,t,n){return n===void 0?{}:ac(e,_l,t,n)??{}}function Cl(e,t,n){return ac(e,yl,t,n)??{}}function wl(){return Tc(yl)}function Tl(e,t,n){return ac(e,xl,t,n)??{}}const El=new Set(Object.keys(ul));function Dl(e){return El.has(e)}function Ol(){return[...El]}const kl={padding:1};function Al(e){let t=new Map;for(let[n,r]of Object.entries(kl)){let i=e[n];t.set(n,typeof i==`number`?i:r)}return t}function jl(e,t,n,r){return n.cache===void 0?(Vs.includes(r)&&e.issues.push({path:`${t}.cache`,message:`${r} variables must declare a cache policy (one of: ${Rs.join(`, `)})`,line:W(e.source,t.split(`.`))}),null):Il(e,`${t}.cache`,n.cache)}function Ml(e,t,n){if(n.cache!==void 0)return Il(e,`${t}.cache`,n.cache)??void 0}function Nl(e){return{required:!0,json:zl(),parse:(t,n,r,i)=>jl(t,n,i,e)??void 0}}function Pl(){return{required:!1,json:zl(),parse:(e,t,n,r)=>Ml(e,t,r)}}const Fl={noun:`cache`,arms:{ttl:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&Vl(n)?{ttl:n}:lc(e,t,`cache.ttl must be a duration string like "5s", "100ms", "2m", "1h"; got ${G(n)}`)},watch_file:{json:{type:`string`,pattern:`^/`},parse:(e,t,n)=>{if(typeof n!=`string`)return lc(e,t,`cache.watch_file must be a path string, got ${G(n)}`);let r=xc(`cache.watch_file`,n);return r===null?{watch_file:n}:lc(e,t,r)}},depends_on:{json:{type:`array`,items:{type:`string`}},parse:(e,t,n)=>Array.isArray(n)&&n.every(e=>typeof e==`string`)?{depends_on:n}:lc(e,t,`cache.depends_on must be an array of variable-name strings, got ${G(n)}`)},key:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&n!==``?{key:n}:lc(e,t,`cache.key must be a non-empty template string, got ${G(n)}`)},never:{json:{const:!0},parse:(e,t,n)=>n===!0?{never:!0}:lc(e,t,`cache.never must be the literal boolean true, got ${G(n)}`)}}};function Il(e,t,n){return uc(e,Fl,t,n)}const Ll={noun:`time-variable cache`,arms:{ttl:Fl.arms.ttl}};function Rl(){return{required:!1,json:Oc(Ll),parse:(e,t,n,r)=>r.cache===void 0?void 0:uc(e,Ll,`${t}.cache`,r.cache)??void 0}}function zl(){return Oc(Fl)}const Bl=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/;function Vl(e){return Bl.test(e)}function Hl(e,t,n){if(n===void 0)return{};if(!rc(n))return e.issues.push({path:t,message:`${t} must be an object, got ${ic(n)}`,line:W(e.source,t.split(`.`))}),{};let r={};for(let[i,a]of Object.entries(n)){let n=dc(e,uu,`${t}.${i}`,a);n!==null&&(r[i]=n)}return r}function Ul(){return{required:!0,json:{type:[`string`,`number`,`boolean`]},parse:(e,t,n,r)=>{let i=r.value;if(typeof i!=`string`&&typeof i!=`number`&&typeof i!=`boolean`){e.issues.push({path:`${t}.value`,message:`literal value must be string|number|boolean, got ${ic(i)}`,line:W(e.source,t.split(`.`))});return}return i}}}function Wl(){return{required:!0,json:{enum:[...Bs]},parse:(e,t,n,r)=>{let i=r.field;if(typeof i!=`string`||!Bs.includes(i)){e.issues.push({path:`${t}.field`,message:`git field must be one of: ${Bs.join(`, `)}, got ${JSON.stringify(i)}`,line:W(e.source,[...t.split(`.`),`field`])});return}return i}}}function Gl(){return{required:!1,json:{type:[`string`,`number`,`boolean`]},parse:(e,t,n,r)=>{let i=r.type;return $s(e,t,r,i===`number`||i===`boolean`||i===`string`?i:`string`)}}}const Kl={noun:`parse`,arms:{text:{json:{const:!0},parse:(e,t,n)=>n===!0?{text:!0}:lc(e,t,`parse.text must be the literal boolean true, got ${G(n)}`)},regex:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`?ql(e,t,n):lc(e,t,`parse.regex must be a pattern string, got ${G(n)}`)},json:{json:{const:!0},parse:(e,t,n)=>n===!0?{json:!0}:lc(e,t,`parse.json must be the literal boolean true, got ${G(n)}`)}}};function ql(e,t,n){let r;try{new RegExp(n),r=RegExp(`${n}|`).exec(``).length-1}catch(n){return lc(e,t,`parse.regex is not a valid regular expression: ${n.message}`)}return r>=1?{regex:n}:lc(e,t,`parse.regex must contain a capture group — its group 1 is the value; got ${JSON.stringify(n)}`)}function Jl(){return{required:!1,json:Oc(Kl),parse:(e,t,n,r)=>(r.regex!==void 0&&e.issues.push({path:`${t}.regex`,message:`${t}.regex was retired; the regex is the parse step's regex arm now: parse: { regex: ${JSON.stringify(r.regex)} }`,line:W(e.source,[...t.split(`.`),`regex`])}),r.parse===void 0?void 0:uc(e,Kl,`${t}.parse`,r.parse)??void 0)}}function Yl(){return{required:!1,json:{type:[`string`,`number`,`boolean`,`array`,`object`],description:`The value published when the source fails: a string under the text/regex parse arms, any non-null JSON value under the json arm`},parse:(e,t,n,r)=>rc(r.parse)&&`json`in r.parse?Xl(e,t,r.default):ec(e,t,r,`default`)}}function Xl(e,t,n){if(n!==void 0)return Zl(n)?n:lc(e,`${t}.default`,`${t}.default must be a JSON value (a json-parsed source's document), got ${G(n)}`)??void 0}function Zl(e){return e!==null&&Ql(e)}function Ql(e){if(e===null)return!0;switch(typeof e){case`string`:case`boolean`:return!0;case`number`:return Number.isFinite(e);case`object`:{if(Array.isArray(e))return e.every(Ql);let t=Object.getPrototypeOf(e);return(t===Object.prototype||t===null)&&Object.values(e).every(Ql)}default:return!1}}const $l={value:Ul(),default:hc()},eu={path:bc(),type:Cc([`string`,`number`,`boolean`]),default:Gl()},tu={name:bc(),default:hc()},nu={path:Sc(),readMode:Cc([`whole`,`first-line`]),parse:Jl(),cache:Nl(`file`),default:Yl()},ru={command:bc(),parse:Jl(),cache:Nl(`shell`),default:Yl()},iu={template:bc(),cache:Pl(),default:hc()},au={layout:bc(),cache:Rl(),default:hc()},ou={field:Wl(),cache:Nl(`git`),default:hc()},su={key:bc(),default:hc()},cu=`kind`;function lu(e,t){return{...fc(cu,e,t),parse:(n,r,i)=>{let a=oc(n,t,r,i);return a===null?null:{kind:e,...a}}}}const uu={tag:cu,noun:`source kind`,memberNoun:`variable`,arms:{literal:lu(`literal`,$l),input:lu(`input`,eu),env:lu(`env`,tu),file:lu(`file`,nu),shell:lu(`shell`,ru),template:lu(`template`,iu),time:lu(`time`,au),git:lu(`git`,ou),state:lu(`state`,su)}};function du(){return Dc(uu)}function fu(){return{type:`object`,additionalProperties:du()}}function pu(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}const mu=`groups.`,hu=`menus.`,gu=`edit.`,K=`candybar.`,_u=[mu,hu,gu,K];function vu(e){return _u.some(t=>e.startsWith(t))}function yu(e){let t=pu(e);return _u.find(e=>t.startsWith(pu(e)))}function bu(e,t,n,r){for(let i of[`variables`,`actions`,`segments`])for(let a of Object.keys(t[i]??{}))a.startsWith(n)&&e.issues.push({path:`${i}.${a}`,message:`"${a}" is in the reserved "${n}" namespace (synthesized by ${r}) — rename it`,line:W(e.source,[`root`])})}const xu=new Map([[`gitTaculous`,`gitaculous`],[`git`,`gitaculous`],[`settings.menu`,`candybar.menu`]]);function Su(e){let t=xu.get(e);return t===void 0?``:` (the built-in segment "${e}" was renamed to "${t}" — update this reference)`}const Cu=/^[A-Za-z_][A-Za-z0-9_]*$/,wu={pattern:Cu.source},Tu={anyOf:[{type:`boolean`},{type:`string`},{type:`integer`}]},Eu={type:`object`,additionalProperties:!1,required:[`label`,`domain`,`default`],properties:{label:{type:`string`,pattern:`^[^\\n\\r]+$`},domain:{anyOf:[{const:`bool`},{type:`array`,items:{type:`string`,pattern:`^[^/\\n\\r]+$`},minItems:1,uniqueItems:!0},{type:`object`,additionalProperties:!1,required:[`min`,`max`],properties:{min:{type:`integer`},max:{type:`integer`},step:{type:`integer`,minimum:1},atLeast:{type:`string`,...wu}}}]},default:Tu}},Du=[`label`,`domain`,`default`],Ou=[`min`,`max`,`step`,`atLeast`];function ku(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function Au(e,t,n){if(n===`bool`)return`bool`;if(Array.isArray(n)){let r=n.filter(e=>typeof e==`string`);if(n.length===0||r.length!==n.length)return ku(e,t,`a list domain must be a non-empty list of words, got ${JSON.stringify(n)}`);if(new Set(r).size!==r.length)return ku(e,t,`a list domain names each word once, got ${JSON.stringify(n)}`);let i=r.filter(e=>e===``||e.includes(`/`)||/[\n\r]/.test(e));return i.length>0?ku(e,t,`a list domain's words must be non-empty, slash-free, and newline-free — configure mode writes each on the set-state wire — got ${JSON.stringify(i)}`):r}if(rc(n)){let{min:r,max:i,step:a=1,atLeast:o}=n;return Object.keys(n).filter(e=>!Ou.includes(e)).length===0&&Number.isInteger(r)&&Number.isInteger(i)&&r<=i&&Number.isInteger(a)&&a>=1&&(o===void 0||typeof o==`string`)?{min:r,max:i,step:a,...o!==void 0&&{atLeast:o}}:ku(e,t,`a range domain is { min, max, step?, atLeast? } with integers min ≤ max, a whole step ≥ 1, and atLeast naming another range setting, got ${JSON.stringify(n)}`)}return ku(e,t,`domain must be "bool", a list of words, or { min, max }, got ${G(n)}`)}function ju(e,t,n){if(!rc(n))return ku(e,t,`${t} must be { label, domain, default }, got ${ic(n)}`);for(let r of Object.keys(n))Du.includes(r)||ku(e,`${t}.${r}`,`Unknown setting key "${r}". Expected one of: ${Du.join(`, `)}`);let{label:r}=n,i=typeof r==`string`&&r.length>0&&!/[\n\r]/.test(r);i||ku(e,`${t}.label`,`a setting needs a one-line, non-empty "label" — the name its control shows, spliced into a synthesized template string — got ${G(r)}`);let a=Au(e,`${t}.domain`,n.domain);if(!i||a===void 0)return;let o={label:r,domain:a,default:n.default};return!Mu(n.default)||!Ks(o,n.default)?ku(e,`${t}.default`,`default must be ${Ys(o)}, got ${G(n.default)}`):o}function Mu(e){return typeof e==`boolean`||typeof e==`string`||typeof e==`number`}function Nu(){return{required:!1,json:{type:`object`,propertyNames:{...wu,not:{const:Hs}},additionalProperties:Eu},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!rc(i))return ku(e,a,`${a} must be an object of name → { label, domain, default }, got ${ic(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i)){if(!Cu.test(t)){ku(e,`${a}.${t}`,`setting name "${t}" is read as .settings.${t} in a template, so it must be an identifier (letters, digits, _; not starting with a digit)`);continue}if(t===`theme`){ku(e,`${a}.${t}`,`setting "${Hs}" is one every placement already has — its default for this segment is segments.<name>.palette, and a placement sets its own with settings: { ${Hs}: "<theme>" }`);continue}let r=ju(e,`${a}.${t}`,n);r!==void 0&&(o[t]=r)}return o}}}function Pu(){return{required:!1,json:{type:`string`,minLength:1,pattern:`^[^:/]+$`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return typeof i==`string`&&i.length>0&&!/[:/]/.test(i)?i:ku(e,`${t}.${n}`,`a placement "id" must be a non-empty string without "/" or ":", got ${G(i)}`)}}}function Fu(){return{required:!1,json:{type:`object`,propertyNames:wu,additionalProperties:Tu},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!rc(i))return ku(e,a,`a placement's "settings" must be an object of setting name → value, got ${ic(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i))Mu(n)?o[t]=n:ku(e,`${a}.${t}`,`setting "${t}" must be a boolean, a word, or a number, got ${ic(n)}`);return o}}}function Iu(e){return new Set(Object.keys(e.segments).filter(e=>!vu(e)))}function Lu(e,t,n){if(t===void 0)return{};if(!rc(t))return e.issues.push({path:`segments`,message:`segments must be an object, got ${ic(t)}`,line:W(e.source,[`segments`])}),{};let r={};for(let[i,a]of Object.entries(t)){let t=ac(e,n.has(i)?Uu:Hu,`segments.${i}`,a);t!==null&&(r[i]=t)}return r}function Ru(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>r[n]===void 0?lc(e,`${t}.${n}`,`${t} declares no template — only a segment the bundled default declares may omit it (inheriting the bundled template); a segment of your own needs its own${Su(t.slice(9))}`)??void 0:Qs(e,t,r,n)??void 0}}function zu(){return{required:!1,json:{anyOf:[{const:`auto`},{const:`fill`},{type:`integer`,minimum:1}]},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(i===`auto`)return`auto`;if(i===`fill`)return`fill`;if(typeof i==`number`&&Number.isInteger(i)&&i>0)return i;e.issues.push({path:`${t}.${n}`,message:`width must be "auto", "fill", or a positive integer, got ${G(i)}`,line:W(e.source,[...t.split(`.`),n])})}}}}function Bu(){return{required:!1,json:fu(),parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return Hl(e,`${t}.${n}`,i)}}}const Vu={template:Ru(),description:hc(),width:zu(),justify:Cc(Xs),truncate:Cc(Zs),bg:hc(),fg:hc(),when:hc(),palette:yc(),vars:Bu(),settings:Nu()},Hu={noun:`segment key`,fields:Vu},Uu={noun:`segment key`,fields:{...Vu,template:hc()}},Wu=`#/definitions/LayoutNode`,Gu={kind:`container`,direction:`vertical`,children:[]};function Ku(e){return{required:!0,json:{const:e},parse:()=>e}}function qu(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&i.length>0?i:(e.issues.push({path:`${t}.${n}`,message:`a segment node must have a non-empty "name" (a segment name), got ${G(i)}`,line:W(e.source,[`root`])}),``)}}}function Ju(){return{required:!0,json:{enum:[...Es]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&Es.includes(i)?i:(e.issues.push({path:`${t}.${n}`,message:`a container "direction" must be one of: ${Es.join(`, `)} (got ${JSON.stringify(i)})`,line:W(e.source,[`root`])}),`vertical`)}}}function Yu(e){return{required:!0,json:{type:`array`,items:{$ref:Wu}},parse:(t,n,r,i)=>{let a=i[r];return Array.isArray(a)?a.map((i,a)=>e(t,`${n}.${r}[${a}]`,i)):(t.issues.push({path:`${n}.${r}`,message:`a container must have a "children" array of layout nodes, got ${ic(a)}`,line:W(t.source,[`root`])}),[])}}}const Xu={noun:`layout-node key`,fields:{kind:Ku(`segment`),name:qu(),when:hc(),id:Pu(),settings:Fu()}},Zu=()=>Cc(oa),Qu={noun:`layout-node key`,fields:{kind:Ku(`container`),direction:Ju(),children:Yu(pc(()=>rd)),when:hc(),distribution:Zu()}};function $u(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&i.length>0?i:(e.issues.push({path:`${t}.${n}`,message:`a "seg" node must have a non-empty segment name, got ${G(i)}`,line:W(e.source,[`root`])}),``)}}}const ed={noun:`layout-node key`,fields:{seg:$u(),when:hc(),id:Pu(),settings:Fu()}},td={noun:`layout-node key`,fields:{h:Yu(pc(()=>rd)),when:hc(),distribution:Zu()}},nd={noun:`layout-node key`,fields:{v:Yu(pc(()=>rd)),when:hc(),distribution:Zu()}},rd=(e,t,n)=>{if(typeof n==`string`)return n.length===0?(e.issues.push({path:t,message:`a bare-string layout node must be a non-empty segment name`,line:W(e.source,[`root`])}),Gu):{kind:`segment`,name:n};if(!rc(n))return e.issues.push({path:t,message:`a layout node must be a string (segment name) or an object with "kind" / "seg" / "h" / "v", got ${ic(n)}`,line:W(e.source,[`root`])}),Gu;if(n.kind===`container`)return ac(e,Qu,t,n)??Gu;if(n.kind===`segment`)return ac(e,Xu,t,n)??Gu;if(n.kind===`cells`)return e.issues.push({path:t,message:`kind: "cells" is no longer supported — use the h-arm spelling instead:
41
41
  Old: { kind: "cells", segments: ["seg1", "seg2"] }
42
42
  New: { h: ["seg1", "seg2"] }`,line:W(e.source,[`root`])}),Gu;if(n.kind===`group`){let r=ac(e,ud,t,n);return r===null?Gu:(e.groups.push({name:r.name,label:r.label,...r.open!==void 0&&{open:r.open},...r.direction!==void 0&&{direction:r.direction},...r.key!==void 0&&{key:r.key},...r.bg!==void 0&&{bg:r.bg},...r.fg!==void 0&&{fg:r.fg},...r.when!==void 0&&{when:r.when},path:t}),fd(r))}let r=`h`in n,i=`v`in n,a=`seg`in n;if(+!!r+ +!!i+ +!!a>1){let r=[`seg`,`h`,`v`].filter(e=>e in n);return e.issues.push({path:t,message:`a layout node may have exactly one of "seg", "h", or "v" — got ${r.map(e=>`"${e}"`).join(` and `)} together`,line:W(e.source,[`root`])}),Gu}if(a){let r=ac(e,ed,t,n);return r===null?Gu:{kind:`segment`,name:r.seg,...r.when!==void 0&&{when:r.when},...r.id!==void 0&&{id:r.id},...r.settings!==void 0&&{settings:r.settings}}}if(r){let r=ac(e,td,t,n);return r===null?Gu:{kind:`container`,direction:`horizontal`,children:r.h,...r.when!==void 0&&{when:r.when},...r.distribution!==void 0&&{distribution:r.distribution}}}if(i){let r=ac(e,nd,t,n);return r===null?Gu:{kind:`container`,direction:`vertical`,children:r.v,...r.when!==void 0&&{when:r.when},...r.distribution!==void 0&&{distribution:r.distribution}}}return e.issues.push({path:`${t}.kind`,message:`a layout node "kind" must be "container", "segment", or "group", or use the terse A-grammar: a bare string, or an object with "seg", "h", or "v" (got ${JSON.stringify(n.kind)})`,line:W(e.source,[`root`])}),Gu};function id(){return{required:!0,json:{type:`object`,propertyNames:{pattern:kc.source},additionalProperties:{$ref:Wu}},parse:(e,t,n,r)=>{let i=r[n];if(!rc(i))return e.issues.push({path:`${t}.${n}`,message:`"rows" must be an object of row name → layout node, got ${ic(i)}`,line:W(e.source,[...t.split(`.`),n])}),{};let a={};for(let[r,o]of Object.entries(i)){if(!kc.test(r)){e.issues.push({path:`${t}.${n}.${r}`,message:`row name "${r}" must be an identifier (letters, digits, _; not starting with a digit) — it names the row in the config file and merges by name over the bundled default's rows`,line:W(e.source,[...t.split(`.`),n,r])});continue}a[r]=rd(e,`${t}.${n}.${r}`,o)}return a}}}const ad={noun:`root key`,fields:{rows:id(),when:hc(),distribution:Zu()}};function od(e,t,n){return rc(n)&&`rows`in n?ac(e,ad,t,n)??{rows:{}}:rd(e,t,n)}function sd(){return{required:!0,json:{type:`string`,pattern:kc.source},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`string`||!kc.test(i)||i===`closed`){e.issues.push({path:`${t}.${n}`,message:`a group "name" must be an identifier (letters, digits, _; not starting with a digit) and not the reserved "${Wc}", got ${G(i)}`,line:W(e.source,[`root`])});return}return i}}}function cd(){return{required:!1,json:{type:`string`,minLength:1},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0){if(typeof i!=`string`||i===``||i.includes(`/`)){e.issues.push({path:`${t}.${n}`,message:`a group "key" must be a non-empty, slash-free SessionState key, got ${G(i)}`,line:W(e.source,[`root`])});return}return i}}}}function ld(){return{required:!0,json:{type:`string`,pattern:`^[^\\n\\r]*$`},parse:(e,t,n,r)=>{let i=Qs(e,t,r,n);if(i!==null){if(/[\n\r]/.test(i)){e.issues.push({path:`${t}.${n}`,message:`${t}.${n}: group label must not contain newlines`,line:W(e.source,[...t.split(`.`),n])});return}return i}}}}const ud={noun:`layout-node key`,fields:{kind:Ku(`group`),name:sd(),label:ld(),open:gc(),direction:Cc(Es),key:cd(),bg:hc(),fg:hc(),when:hc(),distribution:Zu(),children:Yu(pc(()=>rd))}};function dd(e){return e.key??`groups.`+e.name}function fd(e){let t=mu+e.name;return Yc(t,{variable:t,key:dd(e),member:e.name},{kind:`container`,direction:e.direction??`vertical`,children:e.children,...e.distribution!==void 0&&{distribution:e.distribution}},`drop`,e.when)}function pd(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,[`root`])})}function md(e,t){bu(e,t,mu,`group nodes`);let n=e.groups;if(n.length===0)return;let r=new Set;for(let t of n)r.has(t.name)&&pd(e,t.path,`duplicate group name "${t.name}" — group names must be unique (they name the synthesized state var, action, and toggle segment)`),r.add(t.name);for(let t of n)for(let r of n)t!==r&&t.path.startsWith(`${r.path}.`)&&dd(t)===dd(r)&&pd(e,t.path,`group "${t.name}" shares key "${dd(t)}" with its ancestor group "${r.name}" — a shared key holds ONE open group, so an ancestor and a descendant cannot share one. Sibling accordions share a key; nested groups use distinct keys.`);let i=new Map;for(let t of n){let n=dd(t);if(i.has(n)||i.set(n,Wc),t.open===!0){let r=i.get(n);r!==`closed`&&pd(e,t.path,`groups "${r}" and "${t.name}" share key "${n}" and both declare open: true — a shared key holds one open group; pick one`),i.set(n,t.name)}}let a={},o={},s={};for(let e of n){let t=mu+e.name,r=dd(e),c=n.filter(t=>t!==e&&e.path.startsWith(t.path+`.`)).length,l=` `.repeat(c);a[t]=$c(r,i.get(r)),o[t]=el(r,e.name),s[t]={template:Qc(t,`${l}${e.label} ▸`,`${l}${e.label} ▾`),...e.bg!==void 0&&{bg:e.bg},...e.fg!==void 0&&{fg:e.fg}}}t.variables={...t.variables??{},...a},t.actions={...t.actions??{},...o},t.segments={...t.segments??{},...s}}var hd=class extends Error{name=`TemplateError`;kind=`EvalError`;pos;source;constructor(e,t,n={}){super(e,{cause:n.cause}),this.pos=t,this.source=n.source}get sourceSnippet(){return this.source?wd(this.source,this.pos):``}toString(){let e=`${this.name}: ${this.message}\n at line ${this.pos.line}, column ${this.pos.column}`,t=this.sourceSnippet;return t?`${e}\n\n${t}`:e}},gd=class extends hd{name=`ParseError`;kind=`ParseError`;expected;found;constructor(e,t,n={}){super(e,t,n),this.expected=n.expected,this.found=n.found}},_d=class extends hd{name=`EvalError`;kind=`EvalError`},vd=class extends _d{name=`FuncNotFoundError`;kind=`FuncNotFoundError`;funcName;suggestions;constructor(e,t,n={}){let r=Td(e,n.available??[]),i=r.length===0?``:` (did you mean: ${r.join(`, `)}?)`;super(`function ${JSON.stringify(e)} is not registered${i}`,t,n),this.funcName=e,this.suggestions=r}},yd=class extends _d{name=`ArgCountError`;kind=`ArgCountError`;funcName;accepted;got;constructor(e,t,n,r,i={}){let a=t.minimum===t.maximum?`${t.minimum}`:`at least ${t.minimum}`;super(`wrong number of args for ${e}: want ${a} got ${n}`,r,i),this.funcName=e,this.accepted=t,this.got=n}},bd=class extends _d{name=`TypeMismatchError`;kind=`TypeMismatchError`;funcName;argIndex;expected;receivedSummary;constructor(e,t,n,r,i,a={}){super(`function ${JSON.stringify(e)} arg ${t}: expected ${n}, but a ${r} flowed in. Pass it through \`unstyled\` (or your engine's flatten function) to convert.`,i,a),this.funcName=e,this.argIndex=t,this.expected=n,this.receivedSummary=r}},xd=class extends bd{constructor(e,t,n,r,i={}){super(e,t,`integer`,String(n),r,i),this.message=Number.isInteger(Number(n))?`integer out of range: ${String(n)}`:`expected integer; found ${String(n)}`}},Sd=class extends _d{name=`MissingFieldError`;kind=`MissingFieldError`;path;constructor(e,t,n={}){super(`field "${e.join(`.`)}" not found on receiver`,t,n),this.path=e}},Cd=class extends _d{name=`FailError`;kind=`FailError`;constructor(e,t={line:0,column:0,offset:0},n={}){super(e,t,n)}};function wd(e,t){let n=e.split(`
43
43
  `),r=t.line-1,i=[];if(r-1>=0&&r-1<n.length&&i.push({num:r,text:n[r-1]??``}),r>=0&&r<n.length&&i.push({num:r+1,text:n[r]??``}),r+1<n.length&&i.push({num:r+2,text:n[r+1]??``}),i.length===0)return``;let a=String(i[i.length-1]?.num??1).length,o=[];for(let e of i)if(o.push(` ${String(e.num).padStart(a,` `)} | ${e.text}`),e.num===t.line){let e=` ${` `.repeat(a)} | `,n=` `.repeat(Math.max(0,t.column-1));o.push(`${e}${n}^`)}return o.join(`
@@ -83,11 +83,11 @@ The target is already observable of different type.
83
83
  Extending builtins is not supported.`),e;Object.isExtensible(e)||n(`Cannot make the designated object observable; it is not extensible`);var r=t?.name??(x(e)?`ObservableObject`:e.constructor.name)+`@`+h();return C(e,k,new Xi(e,new Map,String(r),Ft(t))),e}var Qi=te(`ObservableObjectAdministration`,Xi);function $i(e){return Ji[e]||(Ji[e]={get:function(){return this[k].getObservablePropValue_(e)},set:function(t){return this[k].setObservablePropValue_(e,t)}})}function ea(e){return b(e)?Qi(e[k]):!1}function ta(e,t,n){var r;e.appliedAnnotations_[n]=t,(r=e.target_[we])==null||delete r[n]}function na(e,t,r){if(wa(t)||n(`Cannot annotate '`+e.name_+`.`+r.toString()+`': Invalid annotation.`),!Ge(t)&&D(e.appliedAnnotations_,r)){var i=e.name_+`.`+r.toString(),a=e.appliedAnnotations_[r].annotationType_,o=t.annotationType_;n(`Cannot apply '`+o+`' to '`+i+`':`+(`
84
84
  The field is already annotated with '`+a+`'.`)+`
85
85
  Re-annotating fields is not allowed.
86
- Use 'override' annotation for methods overridden by subclass.`)}}var ra=la(0),ia=function(){var e=!1,t={};return Object.defineProperty(t,`0`,{set:function(){e=!0}}),Object.create(t)[0]=1,e===!1}(),aa=0,oa=function(){};function sa(e,t){Object.setPrototypeOf?Object.setPrototypeOf(e.prototype,t):e.prototype.__proto__===void 0?e.prototype=t:e.prototype.__proto__=t}sa(oa,Array.prototype);var ca=function(e){function t(t,n,r,i){var a;return r===void 0&&(r=`ObservableArray@`+h()),i===void 0&&(i=!1),a=e.call(this)||this,ga(function(){var e=new ki(r,n,i,!0);e.proxy_=a,ee(a,k,e),t&&t.length&&a.spliceWithArray(0,0,t),ia&&Object.defineProperty(a,`0`,ra)}),a}O(t,e);var n=t.prototype;return n.concat=function(){this[k].atom_.reportObserved();var e=[...arguments];return Array.prototype.concat.apply(this.slice(),e.map(function(e){return Ii(e)?e.slice():e}))},n[Symbol.iterator]=function(){var e=this,t=0;return Sa({next:function(){return t<e.length?{value:e[t++],done:!1}:{done:!0,value:void 0}}})},pe(t,[{key:`length`,get:function(){return this[k].getArrayLength_()},set:function(e){this[k].setArrayLength_(e)}},{key:Symbol.toStringTag,get:function(){return`Array`}}])}(oa);Object.entries(ji).forEach(function(e){var t=e[0],n=e[1];t!==`concat`&&C(ca.prototype,t,n)});function la(e){return{enumerable:!1,configurable:!0,get:function(){return this[k].get_(e)},set:function(t){this[k].set_(e,t)}}}function ua(e){s(ca.prototype,``+e,la(e))}function da(e){if(e>aa){for(var t=aa;t<e+100;t++)ua(t);aa=e}}da(1e3);function fa(e,t,n){return new ca(e,t,n)}function pa(e,t){if(typeof e==`object`&&e){if(Ii(e))return t!==void 0&&n(23),e[k].atom_;if(Ki(e))return e.atom_;if(Vi(e)){if(t===void 0)return e.keysAtom_;var r=e.data_.get(t)||e.hasMap_.get(t);return r||n(25,t,ha(e)),r}if(ea(e)){if(!t)return n(26);var i=e[k].values_.get(t);return i||n(27,t,ha(e)),i}if(Me(e)||nn(e)||R(e))return e}else if(v(e)&&R(e[k]))return e[k];n(28)}function ma(e,t){if(e||n(29),t!==void 0)return ma(pa(e,t));if(Me(e)||nn(e)||R(e)||Vi(e)||Ki(e))return e;if(e[k])return e[k];n(24,e)}function ha(e,t){var n;if(t!==void 0)n=pa(e,t);else if(lr(e))return e.name;else n=ea(e)||Vi(e)||Ki(e)?ma(e):pa(e);return n.name_}function ga(e){var t=F(),n=Zt(!0);jn();try{return e()}finally{Mn(),Qt(n),hn(t)}}var _a=c.toString;function va(e,t,n){return n===void 0&&(n=-1),ya(e,t,n)}function ya(e,t,n,r,i){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return!1;if(e!==e)return t!==t;var a=typeof e;if(a!==`function`&&a!==`object`&&typeof t!=`object`)return!1;var o=_a.call(e);if(o!==_a.call(t))return!1;switch(o){case`[object RegExp]`:case`[object String]`:return``+e==``+t;case`[object Number]`:return+e==+e?+e==0?1/e==1/t:+e==+t:+t!=+t;case`[object Date]`:case`[object Boolean]`:return+e==+t;case`[object Symbol]`:return typeof Symbol<`u`&&Symbol.valueOf.call(e)===Symbol.valueOf.call(t);case`[object Map]`:case`[object Set]`:n>=0&&n++;break}e=ba(e),t=ba(t);var s=o===`[object Array]`;if(!s){if(typeof e!=`object`||typeof t!=`object`)return!1;var c=e.constructor,l=t.constructor;if(c!==l&&!(v(c)&&c instanceof c&&v(l)&&l instanceof l)&&`constructor`in e&&`constructor`in t)return!1}if(n===0)return!1;n<0&&(n=-1),r||=[],i||=[];for(var u=r.length;u--;)if(r[u]===e)return i[u]===t;if(r.push(e),i.push(t),s){if(u=e.length,u!==t.length)return!1;for(;u--;)if(!ya(e[u],t[u],n-1,r,i))return!1}else{var d=Object.keys(e),f=d.length;if(Object.keys(t).length!==f)return!1;for(var p=0;p<f;p++){var m=d[p];if(!(D(t,m)&&ya(e[m],t[m],n-1,r,i)))return!1}}return r.pop(),i.pop(),!0}function ba(e){return Ii(e)?e.slice():ne(e)||Vi(e)||w(e)||Ki(e)?Array.from(e.entries()):e}var xa=i().Iterator?.prototype||{};function Sa(e){return e[Symbol.iterator]=Ca,Object.assign(Object.create(xa),e)}function Ca(){return this}function wa(e){return e instanceof Object&&typeof e.annotationType_==`string`&&v(e.make_)&&v(e.extend_)}[`Symbol`,`Map`,`Set`].forEach(function(e){i()[e]===void 0&&n(`MobX requires global '`+e+`' to be available or polyfilled`)}),typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__==`object`&&__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({spy:Yn,extras:{getDebugName:ha},$mobx:k}),e.$mobx=k,e.FlowCancellationError=jr,e.ObservableMap=Bi,e.ObservableSet=Gi,e.Reaction=Rn,e._allowStateChanges=Xt,e._allowStateChangesInsideComputed=cr,e._allowStateReadsEnd=_n,e._allowStateReadsStart=gn,e._autoAction=sr,e._endAction=Yt,e._getAdministration=ma,e._getGlobalState=wn,e._interceptReads=zr,e._isComputingDerivation=P,e._resetGlobalState=Tn,e._startAction=Jt,e.action=or,e.autorun=ur,e.comparer=Re,e.computed=Vt,e.configure=Cr,e.createAtom=Ne,e.defineProperty=V,e.entries=Xr,e.extendObservable=wr,e.flow=Fr,e.flowResult=Lr,e.get=ei,e.getAtom=pa,e.getDebugName=ha,e.getDependencyTree=Tr,e.getObserverTree=Dr,e.has=$r,e.intercept=Br,e.isAction=lr,e.isBoxedObservable=M,e.isComputed=Ur,e.isComputedProp=Wr,e.isFlow=Rr,e.isFlowCancellationError=Mr,e.isObservable=Kr,e.isObservableArray=Ii,e.isObservableMap=Vi,e.isObservableObject=ea,e.isObservableProp=qr,e.isObservableSet=Ki,e.keys=Jr,e.makeAutoObservable=Ti,e.makeObservable=Ci,e.observable=j,e.observe=ni,e.onBecomeObserved=_r,e.onBecomeUnobserved=vr,e.onReactionError=zn,e.override=We,e.ownKeys=ti,e.reaction=pr,e.remove=Qr,e.runInAction=cr,e.set=Zr,e.spy=Yn,e.toJS=si,e.trace=ci,e.transaction=ui,e.untracked=mn,e.values=Yr,e.when=di})),_v=me(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=hv():t.exports=gv()}))();function vv(e){if(Array.isArray(e))return Object.freeze(e.map(vv));if(typeof e==`object`&&e){let t=Object.create(null),n=Object.entries(e).sort(([e],[t])=>e<t?-1:+(e>t));for(let[e,r]of n)t[e]=vv(r);return Object.freeze(t)}return e}function yv(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function bv(e){return typeof e==`string`?e:String(e)}function xv(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function Sv(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}function Cv(e,t){if(!(e instanceof H))throw TypeError(`template function expected a RichText fragment, got ${typeof e==`object`?Object.prototype.toString.call(e):typeof e}`);let n=e.copy();return n.style=wv(e.style).add(t),n}function wv(e){if(e instanceof B)return e;try{return B.parse(e)}catch(t){throw t instanceof zr?TypeError(`template function cannot style a fragment whose base style "${e}" is not a style definition: a style name resolves only against the theme of a render`,{cause:t}):t}}function Tv(e){return{fn:(t=>Cv(t,e)),argTypes:[`liftable`],arity:{kind:`exact`},returnType:`T`}}function Ev(e){return{fn:((t,n)=>Cv(n,new B({[e]:gn.parse(t)}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`}}function Dv(e,t){return new B({[e]:t})}function Ov(){let e={};for(let t of Ir)e[t]=Tv(Dv(t,!0)),e[`not_${t}`]=Tv(Dv(t,!1));for(let[t,n]of Object.entries(Rr))e[t]=Tv(Dv(n,!0));return e}const kv={fn:((e,t)=>Cv(t,B.parse(e))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`},Av={fn:((e,t)=>Cv(t,new B({link:e}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`};function jv(){return{fg:Ev(`color`),bg:Ev(`bgcolor`),...Ov(),link:Av,style:kv}}function Mv(e,t){if(!Jn.test(e.trim()))throw TypeError(`${t} expected a color (#RRGGBB or #RRGGBBAA), got ${JSON.stringify(e)} — to use a palette name here, wrap it: ${t} (color ${JSON.stringify(e)}) …`);return Yn(e)}function Nv(e,t){return{fn:t,argTypes:e,arity:{kind:`exact`},returnType:`string`}}function Pv(e,t,n,r){let i=r===void 0||e>=r.min&&e<=r.max;if(!Number.isFinite(e)||!i){let i=r===void 0?`a finite number`:`within ${r.min}..${r.max} (${r.note})`;throw RangeError(`${t}'s ${n} must be ${i}, got ${e}`)}return e}const Fv=Nv([`string`,`int`],((e,t)=>nr(Mv(e,`darken`),t).hex)),Iv=Nv([`string`,`int`],((e,t)=>nr(Mv(e,`lighten`),-t).hex)),Lv={min:0,max:100,note:`0 = from, 100 = toward`},Rv=Nv([`string`,`string`,`float`],((e,t,n)=>wn(Mv(e,`mix`),Mv(t,`mix`),Pv(n,`mix`,`percentage`,Lv)/100).hex)),zv={min:1,max:21,note:`4.5 = AA body text, 3 = AA large text`},Bv=Nv([`string`],(e=>rr(Mv(e,`contrastOn`)).hex)),Vv=e=>Nv([`string`,`string`,`float`],((t,n,r)=>ir(Mv(t,`readableOn`),Mv(n,`readableOn`),Pv(r,`readableOn`,`ratio`,zv),e()).hex)),Hv={hueShift:`shiftHue`,chromaScale:`scaleChroma`,lightnessScale:`scaleLightness`,lightnessShift:`shiftLightness`};function Uv(){let e={};for(let[t,n]of Object.entries(Hv)){let r=t;e[n]=Nv([`string`,`float`],((e,t)=>{let i={...Ln,[r]:Pv(t,n,`amount`)};return z.fromRgba(Mv(e,n)).applyKey(i).toRgba().hex}))}return e}function Wv(e=()=>P.TRUECOLOR){return{darken:Fv,lighten:Iv,mix:Rv,contrastOn:Bv,readableOn:Vv(e),...Uv()}}function Gv(e,t){if(e.length%2!=0)throw RangeError(`ramp's last stop (position ${String(e[e.length-1])}) has no color — stops are <position> <color> pairs`);let n=[];for(let r=0;r<e.length;r+=2)n.push({at:e[r],color:Xn(t,e[r+1])});return n}function Kv(e){return{color:{fn:(t=>Xn(e(),t).hex),argTypes:[`string`],arity:{kind:`exact`},returnType:`string`},ramp:{fn:((t,n,...r)=>new Pr(Nr(n),Gv(r,e())).at(t).hex),argTypes:[`float`,`string`],arity:{kind:`alternating`,minimum:4},returnType:`string`}}}function qv(e){return{...jv(),...Wv(e)}}new B({color:`red`,dim:!0});const Jv=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,Yv=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function Xv(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(Jv);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(Yv);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function Zv(e){let t=e.match(Yv);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function Qv(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function $v(e){return e.toLocaleString()}function ey(e){if(e.length===0)throw Error(`a cascade needs at least one stop, e.g. "0:calm"`);let t=[];for(let[n,r]of e.entries()){let e=r.indexOf(`:`),i=e<0?NaN:Number(r.slice(0,e));if(!Number.isFinite(i))throw Error(`cascade stop ${n} ("${r}") must be "<position>:<result>", e.g. "80:hot" — the position must be a number`);let a=t[n-1];if(a!==void 0&&i<a.at)throw Error(`cascade stops must be in ascending position order; stop ${n} at ${i} follows stop ${n-1} at ${a.at}`);t.push({at:i,text:r.slice(e+1)})}return t}function ty(e,t){if(!Number.isFinite(e))throw Error(`a cascade needs a finite value, got ${e}`);let n=-1;for(;n+1<t.length&&t[n+1].at<=e;)n++;return(n<0?t[0]:t[n]).text}const ny=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],ry=ny.length;function iy(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(ry-1));o+=ny[t]}return o}function ay(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}function oy(e,t,n){if(n.length!==0)throw Error(`${e}: takes at most ${t.length} optional argument${t.length===1?``:`s`} (${t.join(`, `)}), got ${t.length+n.length}`)}const sy=qa(),cy=[...oo];function ly(){return{basename:{fn:e=>l(e),argTypes:[`string`],arity:{kind:`exact`}},dirname:{fn:e=>u(e),argTypes:[`string`],arity:{kind:`exact`}},abbreviatePath:{fn:e=>Qv(e),argTypes:[`string`],arity:{kind:`exact`}},int:{fn:e=>Math.trunc(xv(e)),argTypes:[`value`],arity:{kind:`exact`}},string:{fn:e=>bv(e),argTypes:[`value`],arity:{kind:`exact`}},bool:{fn:e=>Sv(e),argTypes:[`value`],arity:{kind:`exact`}},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`],arity:{kind:`exact`}},themes:{fn:()=>sy,argTypes:[],arity:{kind:`exact`}},styles:{fn:()=>cy,argTypes:[],arity:{kind:`exact`}},sparkline:{fn:(e,t,...n)=>(oy(`sparkline`,[`width`],n),iy(ay(e),t)),argTypes:[`string`,`int`],arity:{kind:`variadic`}},cascade:{fn:(e,...t)=>ty(e,ey(t)),argTypes:[`float`,`string`],arity:{kind:`variadic`}}}}function uy(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`],arity:{kind:`exact`}},formatInteger:{fn:e=>$v(e),argTypes:[`int`],arity:{kind:`exact`}},round:{fn:e=>Math.round(e),argTypes:[`float`],arity:{kind:`exact`}},formatModelName:{fn:e=>Xv(e),argTypes:[`string`],arity:{kind:`exact`}},shortenModelName:{fn:e=>Zv(e),argTypes:[`string`],arity:{kind:`exact`}}}}function dy(e,t=()=>new Date,n){return cp({fromString:e=>new H(e),toString:e=>e.plain,isT:e=>e instanceof H,clock:t,missingKey:`error`,funcs:{...Zm(),...l_(),...Lh(),...ag(),...Um(t),...Np(),...dh(),...qv(n),...ly(),...uy(t),...e??{}}})}function fy(e){return py(e,new Set(e.names()),``)}function py(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.getKind(a)===`document`?hy(a,e.readDocument(a)):e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return py(e,t,a)}})}function my(e,t){return new Proxy(e,{has:(e,t)=>t===`settings`||Reflect.has(e,t),get:(e,n)=>n===`settings`?t:Reflect.get(e,n)})}function hy(e,t){switch(t.kind){case`ok`:return t.value;case`absent`:throw Error(`variable "${e}" has no value yet: its source has not completed a scan`);case`failed`:throw Error(`variable "${e}": ${t.reason}`)}}function J(e){return{kind:`ok`,value:e}}const Y={kind:`absent`};function X(e){return{kind:`failed`,reason:e}}function gy(e,t){return e?.kind===`ok`?e.value:t}function _y(e,t,n){return t.ok?J(t.stdout):t.reason===`non-zero`&&n===`absent`||t.reason===`non-zero`&&n===t.exitCode?Y:X(`${e}: ${[t.reason,t.exitCode==null?null:`exit ${t.exitCode}`,t.error??vy(t.stderr)].filter(Boolean).join(`, `)}`)}function vy(e){return e.trim().split(`
86
+ Use 'override' annotation for methods overridden by subclass.`)}}var ra=la(0),ia=function(){var e=!1,t={};return Object.defineProperty(t,`0`,{set:function(){e=!0}}),Object.create(t)[0]=1,e===!1}(),aa=0,oa=function(){};function sa(e,t){Object.setPrototypeOf?Object.setPrototypeOf(e.prototype,t):e.prototype.__proto__===void 0?e.prototype=t:e.prototype.__proto__=t}sa(oa,Array.prototype);var ca=function(e){function t(t,n,r,i){var a;return r===void 0&&(r=`ObservableArray@`+h()),i===void 0&&(i=!1),a=e.call(this)||this,ga(function(){var e=new ki(r,n,i,!0);e.proxy_=a,ee(a,k,e),t&&t.length&&a.spliceWithArray(0,0,t),ia&&Object.defineProperty(a,`0`,ra)}),a}O(t,e);var n=t.prototype;return n.concat=function(){this[k].atom_.reportObserved();var e=[...arguments];return Array.prototype.concat.apply(this.slice(),e.map(function(e){return Ii(e)?e.slice():e}))},n[Symbol.iterator]=function(){var e=this,t=0;return Sa({next:function(){return t<e.length?{value:e[t++],done:!1}:{done:!0,value:void 0}}})},pe(t,[{key:`length`,get:function(){return this[k].getArrayLength_()},set:function(e){this[k].setArrayLength_(e)}},{key:Symbol.toStringTag,get:function(){return`Array`}}])}(oa);Object.entries(ji).forEach(function(e){var t=e[0],n=e[1];t!==`concat`&&C(ca.prototype,t,n)});function la(e){return{enumerable:!1,configurable:!0,get:function(){return this[k].get_(e)},set:function(t){this[k].set_(e,t)}}}function ua(e){s(ca.prototype,``+e,la(e))}function da(e){if(e>aa){for(var t=aa;t<e+100;t++)ua(t);aa=e}}da(1e3);function fa(e,t,n){return new ca(e,t,n)}function pa(e,t){if(typeof e==`object`&&e){if(Ii(e))return t!==void 0&&n(23),e[k].atom_;if(Ki(e))return e.atom_;if(Vi(e)){if(t===void 0)return e.keysAtom_;var r=e.data_.get(t)||e.hasMap_.get(t);return r||n(25,t,ha(e)),r}if(ea(e)){if(!t)return n(26);var i=e[k].values_.get(t);return i||n(27,t,ha(e)),i}if(Me(e)||nn(e)||R(e))return e}else if(v(e)&&R(e[k]))return e[k];n(28)}function ma(e,t){if(e||n(29),t!==void 0)return ma(pa(e,t));if(Me(e)||nn(e)||R(e)||Vi(e)||Ki(e))return e;if(e[k])return e[k];n(24,e)}function ha(e,t){var n;if(t!==void 0)n=pa(e,t);else if(lr(e))return e.name;else n=ea(e)||Vi(e)||Ki(e)?ma(e):pa(e);return n.name_}function ga(e){var t=F(),n=Zt(!0);jn();try{return e()}finally{Mn(),Qt(n),hn(t)}}var _a=c.toString;function va(e,t,n){return n===void 0&&(n=-1),ya(e,t,n)}function ya(e,t,n,r,i){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return!1;if(e!==e)return t!==t;var a=typeof e;if(a!==`function`&&a!==`object`&&typeof t!=`object`)return!1;var o=_a.call(e);if(o!==_a.call(t))return!1;switch(o){case`[object RegExp]`:case`[object String]`:return``+e==``+t;case`[object Number]`:return+e==+e?+e==0?1/e==1/t:+e==+t:+t!=+t;case`[object Date]`:case`[object Boolean]`:return+e==+t;case`[object Symbol]`:return typeof Symbol<`u`&&Symbol.valueOf.call(e)===Symbol.valueOf.call(t);case`[object Map]`:case`[object Set]`:n>=0&&n++;break}e=ba(e),t=ba(t);var s=o===`[object Array]`;if(!s){if(typeof e!=`object`||typeof t!=`object`)return!1;var c=e.constructor,l=t.constructor;if(c!==l&&!(v(c)&&c instanceof c&&v(l)&&l instanceof l)&&`constructor`in e&&`constructor`in t)return!1}if(n===0)return!1;n<0&&(n=-1),r||=[],i||=[];for(var u=r.length;u--;)if(r[u]===e)return i[u]===t;if(r.push(e),i.push(t),s){if(u=e.length,u!==t.length)return!1;for(;u--;)if(!ya(e[u],t[u],n-1,r,i))return!1}else{var d=Object.keys(e),f=d.length;if(Object.keys(t).length!==f)return!1;for(var p=0;p<f;p++){var m=d[p];if(!(D(t,m)&&ya(e[m],t[m],n-1,r,i)))return!1}}return r.pop(),i.pop(),!0}function ba(e){return Ii(e)?e.slice():ne(e)||Vi(e)||w(e)||Ki(e)?Array.from(e.entries()):e}var xa=i().Iterator?.prototype||{};function Sa(e){return e[Symbol.iterator]=Ca,Object.assign(Object.create(xa),e)}function Ca(){return this}function wa(e){return e instanceof Object&&typeof e.annotationType_==`string`&&v(e.make_)&&v(e.extend_)}[`Symbol`,`Map`,`Set`].forEach(function(e){i()[e]===void 0&&n(`MobX requires global '`+e+`' to be available or polyfilled`)}),typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__==`object`&&__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({spy:Yn,extras:{getDebugName:ha},$mobx:k}),e.$mobx=k,e.FlowCancellationError=jr,e.ObservableMap=Bi,e.ObservableSet=Gi,e.Reaction=Rn,e._allowStateChanges=Xt,e._allowStateChangesInsideComputed=cr,e._allowStateReadsEnd=_n,e._allowStateReadsStart=gn,e._autoAction=sr,e._endAction=Yt,e._getAdministration=ma,e._getGlobalState=wn,e._interceptReads=zr,e._isComputingDerivation=P,e._resetGlobalState=Tn,e._startAction=Jt,e.action=or,e.autorun=ur,e.comparer=Re,e.computed=Vt,e.configure=Cr,e.createAtom=Ne,e.defineProperty=V,e.entries=Xr,e.extendObservable=wr,e.flow=Fr,e.flowResult=Lr,e.get=ei,e.getAtom=pa,e.getDebugName=ha,e.getDependencyTree=Tr,e.getObserverTree=Dr,e.has=$r,e.intercept=Br,e.isAction=lr,e.isBoxedObservable=M,e.isComputed=Ur,e.isComputedProp=Wr,e.isFlow=Rr,e.isFlowCancellationError=Mr,e.isObservable=Kr,e.isObservableArray=Ii,e.isObservableMap=Vi,e.isObservableObject=ea,e.isObservableProp=qr,e.isObservableSet=Ki,e.keys=Jr,e.makeAutoObservable=Ti,e.makeObservable=Ci,e.observable=j,e.observe=ni,e.onBecomeObserved=_r,e.onBecomeUnobserved=vr,e.onReactionError=zn,e.override=We,e.ownKeys=ti,e.reaction=pr,e.remove=Qr,e.runInAction=cr,e.set=Zr,e.spy=Yn,e.toJS=si,e.trace=ci,e.transaction=ui,e.untracked=mn,e.values=Yr,e.when=di})),_v=me(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=hv():t.exports=gv()}))();function vv(e){if(Array.isArray(e))return Object.freeze(e.map(vv));if(typeof e==`object`&&e){let t=Object.create(null),n=Object.entries(e).sort(([e],[t])=>e<t?-1:+(e>t));for(let[e,r]of n)t[e]=vv(r);return Object.freeze(t)}return e}function yv(e){let t=typeof e;if(t===`string`||t===`number`||t===`boolean`)return t;throw TypeError(`Variable values must be string|number|boolean (got ${t})`)}function bv(e){return typeof e==`string`?e:String(e)}function xv(e){if(typeof e==`number`)return e;if(typeof e==`boolean`)return+!!e;let t=e.trim();if(t===``)throw TypeError(`Cannot cast empty string to number`);let n=Number(t);if(!Number.isFinite(n))throw TypeError(`Cannot cast ${JSON.stringify(e)} to number`);return n}function Sv(e){if(typeof e==`boolean`)return e;if(typeof e==`number`){if(e===0||e===1)return e===1;throw TypeError(`Cannot cast number ${e} to bool (only 0 and 1 are accepted)`)}if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`Cannot cast ${JSON.stringify(e)} to bool (expected "true" or "false")`)}function Cv(e,t){if(!(e instanceof H))throw TypeError(`template function expected a RichText fragment, got ${typeof e==`object`?Object.prototype.toString.call(e):typeof e}`);let n=e.copy();return n.style=wv(e.style).add(t),n}function wv(e){if(e instanceof B)return e;try{return B.parse(e)}catch(t){throw t instanceof zr?TypeError(`template function cannot style a fragment whose base style "${e}" is not a style definition: a style name resolves only against the theme of a render`,{cause:t}):t}}function Tv(e){return{fn:(t=>Cv(t,e)),argTypes:[`liftable`],arity:{kind:`exact`},returnType:`T`}}function Ev(e){return{fn:((t,n)=>Cv(n,new B({[e]:gn.parse(t)}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`}}function Dv(e,t){return new B({[e]:t})}function Ov(){let e={};for(let t of Ir)e[t]=Tv(Dv(t,!0)),e[`not_${t}`]=Tv(Dv(t,!1));for(let[t,n]of Object.entries(Rr))e[t]=Tv(Dv(n,!0));return e}const kv={fn:((e,t)=>Cv(t,B.parse(e))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`},Av={fn:((e,t)=>Cv(t,new B({link:e}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`};function jv(){return{fg:Ev(`color`),bg:Ev(`bgcolor`),...Ov(),link:Av,style:kv}}function Mv(e,t){if(!Jn.test(e.trim()))throw TypeError(`${t} expected a color (#RRGGBB or #RRGGBBAA), got ${JSON.stringify(e)} — to use a palette name here, wrap it: ${t} (color ${JSON.stringify(e)}) …`);return Yn(e)}function Nv(e,t){return{fn:t,argTypes:e,arity:{kind:`exact`},returnType:`string`}}function Pv(e,t,n,r){let i=r===void 0||e>=r.min&&e<=r.max;if(!Number.isFinite(e)||!i){let i=r===void 0?`a finite number`:`within ${r.min}..${r.max} (${r.note})`;throw RangeError(`${t}'s ${n} must be ${i}, got ${e}`)}return e}const Fv=Nv([`string`,`int`],((e,t)=>nr(Mv(e,`darken`),t).hex)),Iv=Nv([`string`,`int`],((e,t)=>nr(Mv(e,`lighten`),-t).hex)),Lv={min:0,max:100,note:`0 = from, 100 = toward`},Rv=Nv([`string`,`string`,`float`],((e,t,n)=>wn(Mv(e,`mix`),Mv(t,`mix`),Pv(n,`mix`,`percentage`,Lv)/100).hex)),zv={min:1,max:21,note:`4.5 = AA body text, 3 = AA large text`},Bv=Nv([`string`],(e=>rr(Mv(e,`contrastOn`)).hex)),Vv=e=>Nv([`string`,`string`,`float`],((t,n,r)=>ir(Mv(t,`readableOn`),Mv(n,`readableOn`),Pv(r,`readableOn`,`ratio`,zv),e()).hex)),Hv={hueShift:`shiftHue`,chromaScale:`scaleChroma`,lightnessScale:`scaleLightness`,lightnessShift:`shiftLightness`};function Uv(){let e={};for(let[t,n]of Object.entries(Hv)){let r=t;e[n]=Nv([`string`,`float`],((e,t)=>{let i={...Ln,[r]:Pv(t,n,`amount`)};return z.fromRgba(Mv(e,n)).applyKey(i).toRgba().hex}))}return e}function Wv(e=()=>P.TRUECOLOR){return{darken:Fv,lighten:Iv,mix:Rv,contrastOn:Bv,readableOn:Vv(e),...Uv()}}function Gv(e,t){if(e.length%2!=0)throw RangeError(`ramp's last stop (position ${String(e[e.length-1])}) has no color — stops are <position> <color> pairs`);let n=[];for(let r=0;r<e.length;r+=2)n.push({at:e[r],color:Xn(t,e[r+1])});return n}function Kv(e){return{color:{fn:(t=>Xn(e(),t).hex),argTypes:[`string`],arity:{kind:`exact`},returnType:`string`},ramp:{fn:((t,n,...r)=>new Pr(Nr(n),Gv(r,e())).at(t).hex),argTypes:[`float`,`string`],arity:{kind:`alternating`,minimum:4},returnType:`string`}}}function qv(e){return{...jv(),...Wv(e)}}new B({color:`red`,dim:!0});const Jv=/^(?:(?:global|apac|au|eu|us|us-east-\d|us-west-\d|eu-west-\d|eu-central-\d)\.)?(?:anthropic\.|azure_ai\/|bedrock\/|vertex_ai\/)?claude-(?:(?<family>opus|sonnet|haiku)-(?<newMajor>\d+)(?:-(?<newMinor>\d))?|(?<oldMajor>\d+)(?:-(?<oldMinor>\d))?-(?<oldFamily>opus|sonnet|haiku))(?:[-@]\d{8})?(?:-v\d+:\d+)?(?:-latest)?$/i,Yv=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function Xv(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(Jv);if(n?.groups){let{family:e,newMajor:t,newMinor:r,oldMajor:i,oldMinor:a,oldFamily:o}=n.groups,s=e||o,c=t||i,l=r||a;if(s&&c)return`${s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()} ${l?`${c}.${l}`:c}`}let r=t.match(Yv);if(r?.groups){let e=r.groups.family,t=r.groups.major,n=r.groups.minor;return`${e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()} ${n?`${t}.${n}`:t}`}return t||e}function Zv(e){let t=e.match(Yv);if(!t?.groups)return e;let n=t.groups.family,r=t.groups.major,i=t.groups.minor;return`${n.charAt(0).toUpperCase()}${i?`${r}.${i}`:r}`}function Qv(e){let t=e.split(`/`),n=t.length-1;return t.map((e,t)=>{if(t===n)return e;let r=e.match(/^\.*./);return r?r[0]:e}).join(`/`)}function $v(e){return e.toLocaleString()}function ey(e){if(e.length===0)throw Error(`a cascade needs at least one stop, e.g. "0:calm"`);let t=[];for(let[n,r]of e.entries()){let e=r.indexOf(`:`),i=e<0?NaN:Number(r.slice(0,e));if(!Number.isFinite(i))throw Error(`cascade stop ${n} ("${r}") must be "<position>:<result>", e.g. "80:hot" — the position must be a number`);let a=t[n-1];if(a!==void 0&&i<a.at)throw Error(`cascade stops must be in ascending position order; stop ${n} at ${i} follows stop ${n-1} at ${a.at}`);t.push({at:i,text:r.slice(e+1)})}return t}function ty(e,t){if(!Number.isFinite(e))throw Error(`a cascade needs a finite value, got ${e}`);let n=-1;for(;n+1<t.length&&t[n+1].at<=e;)n++;return(n<0?t[0]:t[n]).text}const ny=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],ry=ny.length;function iy(e,t){let n=t===void 0?e:t<=0?[]:e.slice(-t);if(n.length===0)return``;let r=n[0],i=n[0];for(let e of n)e<r&&(r=e),e>i&&(i=e);let a=i-r,o=``;for(let e of n){let t=a===0?0:Math.round((e-r)/a*(ry-1));o+=ny[t]}return o}function ay(e){let t=[];for(let n of e.split(`,`)){let e=n.trim();if(e===``)continue;let r=Number(e);if(!Number.isFinite(r))throw TypeError(`sparkline: non-numeric series element ${JSON.stringify(n)}`);t.push(r)}return t}function oy(e,t,n){if(n.length!==0)throw Error(`${e}: takes at most ${t.length} optional argument${t.length===1?``:`s`} (${t.join(`, `)}), got ${t.length+n.length}`)}const sy=qa(),cy=[...oo];function ly(){return{basename:{fn:e=>l(e),argTypes:[`string`],arity:{kind:`exact`}},dirname:{fn:e=>u(e),argTypes:[`string`],arity:{kind:`exact`}},abbreviatePath:{fn:e=>Qv(e),argTypes:[`string`],arity:{kind:`exact`}},int:{fn:e=>Math.trunc(xv(e)),argTypes:[`value`],arity:{kind:`exact`}},string:{fn:e=>bv(e),argTypes:[`value`],arity:{kind:`exact`}},bool:{fn:e=>Sv(e),argTypes:[`value`],arity:{kind:`exact`}},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`],arity:{kind:`exact`}},themes:{fn:()=>sy,argTypes:[],arity:{kind:`exact`}},endcaps:{fn:()=>cy,argTypes:[],arity:{kind:`exact`}},sparkline:{fn:(e,t,...n)=>(oy(`sparkline`,[`width`],n),iy(ay(e),t)),argTypes:[`string`,`int`],arity:{kind:`variadic`}},cascade:{fn:(e,...t)=>ty(e,ey(t)),argTypes:[`float`,`string`],arity:{kind:`variadic`}}}}function uy(e=()=>new Date){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`],arity:{kind:`exact`}},formatInteger:{fn:e=>$v(e),argTypes:[`int`],arity:{kind:`exact`}},round:{fn:e=>Math.round(e),argTypes:[`float`],arity:{kind:`exact`}},formatModelName:{fn:e=>Xv(e),argTypes:[`string`],arity:{kind:`exact`}},shortenModelName:{fn:e=>Zv(e),argTypes:[`string`],arity:{kind:`exact`}}}}function dy(e,t=()=>new Date,n){return cp({fromString:e=>new H(e),toString:e=>e.plain,isT:e=>e instanceof H,clock:t,missingKey:`error`,funcs:{...Zm(),...l_(),...Lh(),...ag(),...Um(t),...Np(),...dh(),...qv(n),...ly(),...uy(t),...e??{}}})}function fy(e){return py(e,new Set(e.names()),``)}function py(e,t,n){return new Proxy(Object.create(null),{has(e,r){if(typeof r!=`string`)return!1;let i=n?`${n}.${r}`:r;if(t.has(i))return!0;let a=`${i}.`;for(let e of t)if(e.startsWith(a))return!0;return!1},get(r,i){if(typeof i!=`string`)return;let a=n?`${n}.${i}`:i;if(t.has(a))return e.getKind(a)===`document`?hy(a,e.readDocument(a)):e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return py(e,t,a)}})}function my(e,t){return new Proxy(e,{has:(e,t)=>t===`settings`||Reflect.has(e,t),get:(e,n)=>n===`settings`?t:Reflect.get(e,n)})}function hy(e,t){switch(t.kind){case`ok`:return t.value;case`absent`:throw Error(`variable "${e}" has no value yet: its source has not completed a scan`);case`failed`:throw Error(`variable "${e}": ${t.reason}`)}}function J(e){return{kind:`ok`,value:e}}const Y={kind:`absent`};function X(e){return{kind:`failed`,reason:e}}function gy(e,t){return e?.kind===`ok`?e.value:t}function _y(e,t,n){return t.ok?J(t.stdout):t.reason===`non-zero`&&n===`absent`||t.reason===`non-zero`&&n===t.exitCode?Y:X(`${e}: ${[t.reason,t.exitCode==null?null:`exit ${t.exitCode}`,t.error??vy(t.stderr)].filter(Boolean).join(`, `)}`)}function vy(e){return e.trim().split(`
87
87
  `,1)[0]??``}function yy(e,t){if(e.kind!==`ok`)return e;let n=t(e.value);return n===null?Y:J(n)}function by(e){if(e.kind!==`ok`)return e;let t=e.value.trim();return t?J(t):Y}const xy=/^[A-Za-z]:[\\/]/;function Sy(e){let t=e.trim();if(xy.test(t))return null;let n=t.match(/^(?:[^@/]+@)?(\[[^\]]+\]):(.*)$/)??t.match(/^(?:[^@/:]+@)?([^/:]+):(?!\/\/)(.*)$/),r=n?`ssh://${n[1]}/${n[2].replace(/^\/+/,``)}`:t,i;try{i=new URL(r)}catch{return null}return{scheme:i.protocol.replace(/:$/,``),host:i.hostname.toLowerCase(),port:i.port,path:i.pathname.replace(/^\/+/,``).replace(/\/+$/,``)}}function Cy(e){return Sy(e)?.host||null}function wy(e){let t=Cy(e);return t?t===`github.com`||t.endsWith(`.github.com`)?`github`:/(^|\.)gitlab\./.test(t)?`gitlab`:null:null}function Ty(e){let t=new Map;for(let n of e.split(`
88
88
  `)){let e=n.match(/^remote\.(.+)\.url\s+(\S.*)$/);if(!e)continue;let r=t.get(e[1])??[];r.push(e[2].trim()),t.set(e[1],r)}return[...t].map(([e,t])=>({name:e,urls:t}))}function Ey(e){return e.urls.find(e=>jy(e)!==null)??e.urls[0]??null}function Dy(e){return e.find(e=>e.name===`origin`)??e[0]??null}function Oy(e){let t=Dy(e);return t?Ey(t):null}function ky(e){let t=Dy(e);return t?t.urls.find(e=>wy(e)!==null)??Ey(t):null}function Ay(e){let t=(Sy(e)?.path??e.replace(/[\\/]+$/,``)).split(`/`);return(t[t.length-1]??``).replace(/\.git$/,``)||null}function jy(e){let t=Sy(e);if(!t)return null;let n=t.scheme===`https`?{scheme:`https`,port:t.port}:t.scheme===`http`?{scheme:`http`,port:t.port}:t.scheme===`ssh`||t.scheme===`git`?{scheme:`https`,port:``}:null;if(!n||!t.host)return null;let r=t.path.replace(/\.git$/,``);if(!r)return null;let i=n.port?`${t.host}:${n.port}`:t.host;return`${n.scheme}://${i}/${r}`}function My(e){let t=Oy(e);return t===null?null:jy(t)}function Ny(e,t,n,r){return t.ok?r(t.stdout):t.reason===`spawn-error`&&/ENOENT/i.test(t.error??``)||t.reason===`non-zero`&&n.test(t.stderr)?Y:X(`${e}: ${[t.reason,t.exitCode==null?null:`exit ${t.exitCode}`,t.error??vy(t.stderr)].filter(Boolean).join(`, `)}`)}function Py(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Fy(e){let t=`detached`,n=Y,r=Y,i=Y,a=0,o=0,s=0,c=0;for(let l of e.split(`
89
89
  `)){if(!l)continue;if(l.startsWith(`# `)){let e=l.slice(2);if(e.startsWith(`branch.oid `)){let t=e.slice(11).trim();n=t===`(initial)`?Y:J(t)}else if(e.startsWith(`branch.head `)){let n=e.slice(12).trim();t=n===`(detached)`?`detached`:n}else if(e.startsWith(`branch.upstream `))r=J(e.slice(16).trim());else if(e.startsWith(`branch.ab `)){let t=e.slice(10).trim().match(/^\+(\d+)\s+-(\d+)$/);t&&(i=J({ahead:parseInt(t[1],10),behind:parseInt(t[2],10)}))}continue}let e=l[0];if(e===`1`||e===`2`){let e=l.slice(2,4);e[0]!==`.`&&a++,e[1]!==`.`&&o++}else e===`u`?c++:e===`?`&&s++}let l=`clean`;return c>0?l=`conflicts`:(a||o||s)&&(l=`dirty`),{branch:t,status:l,aheadBehind:i,oid:n,upstream:r,workingTree:{staged:a,unstaged:o,untracked:s,conflicts:c}}}function Iy(e){let t;try{t=JSON.parse(e)}catch(e){return X(`gh pr view: unparseable JSON (${e instanceof Error?e.message:String(e)})`)}if(!Py(t))return X(`gh pr view: JSON is not an object`);let{number:n,state:r,url:i}=t;return typeof n!=`number`||typeof r!=`string`||typeof i!=`string`?X(`gh pr view: missing number/state/url`):r.toUpperCase()===`OPEN`?J({number:n,state:r,url:i}):Y}function Ly(e){let t;try{t=JSON.parse(e)}catch(e){return X(`glab mr view: unparseable JSON (${e instanceof Error?e.message:String(e)})`)}if(!Py(t))return X(`glab mr view: JSON is not an object`);let n=t.iid,r=t.state,i=t.web_url;return typeof n!=`number`||typeof r!=`string`||typeof i!=`string`?X(`glab mr view: missing iid/state/web_url`):r.toLowerCase()===`opened`?J({number:n,state:r,url:i}):Y}function Ry(e){try{let t=r.statSync(e);return{key:`${t.dev}:${t.ino}`,stamp:`${t.mtimeMs}:${t.size}`}}catch{return null}}var zy=class{isGitRepo(e){try{return r.existsSync(c.join(e,`.git`))}catch{return!1}}async execGitAsync(e,t){return De({bin:`git`,args:[...e],cwd:t.cwd,env:{...process.env,GIT_OPTIONAL_LOCKS:`0`},timeoutMs:t.timeout,category:`git`})}async resolveEffectiveGitDir(e,t){return this.isWorktree(e)?J(e):t&&this.isGitRepo(t)?J(t):this.isGitRepo(e)?J(e):this.findGitRoot(e)}async findGitRoot(e){let t=c.resolve(e);for(;;){if(this.isGitRepo(t))return J(t);let e=c.dirname(t);if(e===t)return Y;t=e}}async getGitInfo(e,t={},n){try{return await this.computeGitInfo(e,t,n)}catch(e){return X(`git: ${e instanceof Error?e.message:String(e)}`)}}async computeGitInfo(e,t={},n){let r,i=this.isWorktree(e);if(i)r=e;else if(n&&this.isGitRepo(n))r=n;else if(this.isGitRepo(e))r=e;else{let t=await this.findGitRoot(e);if(t.kind!==`ok`)return t;r=t.value}let a=await this.getCoreAsync(r);if(a.kind!==`ok`)return a;let o={branch:a.value.branch,status:a.value.status,aheadBehind:a.value.aheadBehind};t.showWorkingTree&&(o.workingTree=a.value.workingTree),t.showSha&&(o.sha=yy(a.value.oid,e=>e.slice(0,7))),t.showUpstream&&(o.upstream=a.value.upstream),t.showTag&&(o.tag=await this.getNearestTagAsync(r)),t.showTimeSinceCommit&&(o.timeSinceCommit=await this.timeSinceCommit(r,a.value.oid)),t.showStashCount&&(o.stashCount=this.getStashCount(r));let s=t.showRepoName||t.showRepoUrl?await this.getRemotesAsync(r):void 0;return s!==void 0&&t.showRepoName&&(o.repoName=yy(s,e=>this.repoNameFrom(e,r)),o.isWorktree=i),s!==void 0&&t.showRepoUrl&&(o.repoUrl=yy(s,My)),t.showOperation&&(o.operation=this.getOngoingOperation(r)),J(o)}resolveGitDir(e){let t=c.join(e,`.git`);try{if(r.existsSync(t)&&r.statSync(t).isFile()){let n=r.readFileSync(t,`utf-8`).match(/^gitdir:\s*(.+)$/m);if(n?.[1])return c.resolve(e,n[1].trim())}}catch{}return t}getOngoingOperation(e){try{let t=this.resolveGitDir(e);return r.existsSync(c.join(t,`MERGE_HEAD`))?J(`MERGE`):r.existsSync(c.join(t,`CHERRY_PICK_HEAD`))?J(`CHERRY-PICK`):r.existsSync(c.join(t,`REVERT_HEAD`))?J(`REVERT`):r.existsSync(c.join(t,`BISECT_LOG`))?J(`BISECT`):r.existsSync(c.join(t,`rebase-merge`))||r.existsSync(c.join(t,`rebase-apply`))?J(`REBASE`):Y}catch(e){return X(`git operation probe: ${e instanceof Error?e.message:String(e)}`)}}async getNearestTagAsync(e){return by(_y(`git describe --tags`,await this.execGitAsync([`describe`,`--tags`,`--abbrev=0`],{cwd:e,timeout:2e3}),`absent`))}async timeSinceCommit(e,t){return t.kind===`ok`?yy(await this.commitTimestampMs(e,t.value),e=>Math.floor((Date.now()-e)/1e3)):t}commitTimes=new Map;async commitTimestampMs(e,t){let n=this.commitTimes.get(t);if(n!==void 0)return this.commitTimes.delete(t),this.commitTimes.set(t,n),n;let r=this.readCommitTimestampMs(e,t);for(this.commitTimes.set(t,r),r.then(e=>{e.kind!==`ok`&&this.commitTimes.get(t)===r&&this.commitTimes.delete(t)},()=>{this.commitTimes.get(t)===r&&this.commitTimes.delete(t)});this.commitTimes.size>256;){let e=this.commitTimes.keys().next().value;if(e===void 0)break;this.commitTimes.delete(e)}return r}async readCommitTimestampMs(e,t){let n=by(_y(`git log -1`,await this.execGitAsync([`log`,`-1`,`--format=%ct`,t,`--`],{cwd:e,timeout:2e3}),`absent`));if(n.kind!==`ok`)return n;let r=parseInt(n.value,10)*1e3;return Number.isNaN(r)?X(`git log -1: unparseable timestamp "${n.value}"`):J(r)}resolveCommonGitDir(e){let t=this.resolveGitDir(e);try{let e=r.readFileSync(c.join(t,`commondir`),`utf-8`).trim();if(e)return c.resolve(t,e)}catch{}return t}getStashCount(e){let t=c.join(this.resolveCommonGitDir(e),`logs`,`refs`,`stash`),n;try{n=r.readFileSync(t,`utf-8`)}catch(e){return e.code===`ENOENT`?J(0):X(`git stash reflog ${t}: ${e instanceof Error?e.message:String(e)}`)}let i=n.trim();return J(i?i.split(`
90
- `).length:0)}async getRemotesAsync(e){let t=Ry(c.join(this.resolveCommonGitDir(e),`config`));if(t===null)return this.readRemotes(e);let{key:n,stamp:r}=t,i=this.remotesByConfig.get(n);if(i!==void 0&&i.stamp===r)return this.remotesByConfig.delete(n),this.remotesByConfig.set(n,i),i.remotes;let a=this.readRemotes(e);for(this.remotesByConfig.set(n,{stamp:r,remotes:a}),a.then(e=>{let t=this.remotesByConfig.get(n);e.kind!==`ok`&&t?.remotes===a&&this.remotesByConfig.delete(n)},()=>{this.remotesByConfig.get(n)?.remotes===a&&this.remotesByConfig.delete(n)});this.remotesByConfig.size>256;){let e=this.remotesByConfig.keys().next().value;if(e===void 0)break;this.remotesByConfig.delete(e)}return a}remotesByConfig=new Map;async readRemotes(e){let t=_y(`git config --get-regexp remote url`,await this.execGitAsync([`config`,`--local`,`--get-regexp`,`^remote\\..*\\.url$`],{cwd:e,timeout:2e3}),1);return t.kind===`failed`?t:J(t.kind===`ok`?Ty(t.value):[])}repoNameFrom(e,t){let n=Oy(e);return(n===null?null:Ay(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=ky(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return De({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=wy(t);return n===`github`?Ny(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,Iy):n===`gitlab`?Ny(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,Ly):Y}isWorktree(e){try{let t=c.join(e,`.git`);return!!(r.existsSync(t)&&r.statSync(t).isFile())}catch{return!1}}async getCoreAsync(e){O(`[GIT-EXEC] Running git status --porcelain=v2 in ${e}`);let t=_y(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(Fy(t.value)):t}};const By=(e,t)=>O(t);var Vy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??By}acquire(e,t,n){if(this.closed)return{release:()=>{}};let r=this.slots.get(e);if(r)return r.refcount++,r.onInvalidate=n,r.lastTouched=Date.now(),this.slots.delete(e),this.slots.set(e,r),this.makeHandle(e);let i={key:e,watchers:[],refcount:1,debounceTimer:null,onInvalidate:n,targets:t,lastTouched:Date.now()};return this.openWatchers(i),this.slots.set(e,i),this.counters&&this.counters.watchersOpened++,this.evictIfNeeded(),this.makeHandle(e)}makeHandle(e){let t=!1;return{release:()=>{if(t)return;t=!0;let n=this.slots.get(e);n&&(n.refcount=Math.max(0,n.refcount-1),n.refcount===0&&(this.closeSlot(n),this.slots.delete(e)))}}}openWatchers(e){let t=()=>{e.debounceTimer||(e.debounceTimer=setTimeout(()=>{e.debounceTimer=null;try{e.onInvalidate()}catch(e){this.logger(`warn`,`watcher invalidate threw: ${e.message}`)}},50),e.debounceTimer.unref())};for(let n of e.targets.files)try{let i=r.watch(n,{persistent:!1},t);i.on(`error`,e=>{this.logger(`warn`,`watcher error ${n}: ${e.message}`)}),e.watchers.push(i)}catch(e){this.logger(`warn`,`watch failed ${n}: ${e.message}`)}for(let n of e.targets.dirs)try{let i=n.filenames?new Set(n.filenames):null,a=r.watch(n.path,{persistent:!1},(e,n)=>{i&&(!n||!i.has(n))||t()});a.on(`error`,e=>{this.logger(`warn`,`watcher error ${n.path}: ${e.message}`)}),e.watchers.push(a)}catch(e){this.logger(`warn`,`watch failed ${n.path}: ${e.message}`)}}closeSlot(e){e.debounceTimer&&=(clearTimeout(e.debounceTimer),null);for(let t of e.watchers)try{t.close()}catch{}e.watchers=[],this.counters&&this.counters.watchersClosed++}evictIfNeeded(){for(;this.slots.size>this.maxWatchers;){let e=this.slots.keys().next().value;if(e===void 0)break;let t=this.slots.get(e);this.closeSlot(t),this.slots.delete(e),this.counters&&this.counters.watchersEvicted++;try{t.onInvalidate()}catch{}this.logger(`info`,`watcher LRU evict ${e}`)}}size(){return this.slots.size}closeAll(){this.closed=!0;for(let e of this.slots.values())this.closeSlot(e);this.slots.clear()}},Hy=class{running=new Set;again=new Set;run(e,t){return this.again.add(e),this.running.has(e)?{kind:`queued`}:(this.running.add(e),{kind:`started`,done:this.loop(e,t)})}async loop(e,t){try{do this.again.delete(e),await t();while(this.again.has(e))}finally{this.running.delete(e),this.again.delete(e)}}clear(){this.running.clear(),this.again.clear()}get size(){return this.running.size}};const Uy=(e,t)=>O(t),Wy={showSha:!0,showStashCount:!0};function Gy(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function Ky(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function qy(e,t){return e.head!==t.head||e.index!==t.index}function Jy(e){let t=[],n=c.join(e,`refs/heads`);try{r.statSync(n).isDirectory()&&t.push({path:n})}catch{}return{files:[c.join(e,`HEAD`),c.join(e,`index`)],dirs:t}}var Yy=class extends zy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Hy;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new zy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??Uy,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Vy({logger:this.logger}),this.ownsWatchers=!0);let t=e.sanityIntervalMs??3e5;t>0&&(this.sanityTimer=setInterval(()=>this.runSanityCheck(),t),this.sanityTimer.unref())}getWatcherRegistry(){return this.watchers}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,invalidations:this.invalidations,watchers:this.watchers.size()}}resolveEffectiveGitDir(e,t){let n=`${e}|${t??``}`,r=Date.now(),i=this.resolutions.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.resolutions.delete(n),this.resolutions.set(n,i),i.dir;let a=this.inner.resolveEffectiveGitDir(e,t);return this.resolutions.set(n,{dir:a,computedAt:r}),a.catch(()=>{this.resolutions.get(n)?.dir===a&&this.resolutions.delete(n)}),this.evictResolutionsIfNeeded(),a}evictResolutionsIfNeeded(){for(;this.resolutions.size>this.maxEntries;){let e=this.resolutions.keys().next().value;if(e===void 0)break;this.resolutions.delete(e)}}async getGitInfo(e,t={},n){let r=await this.resolveEffectiveGitDir(e,n);return r.kind===`ok`?this.getGitInfoForRoot(r.value,t):r}getGitInfoForRoot(e,t){let n=`${e}|${Gy(t)}`,r=Date.now(),i=this.entries.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.entries.delete(n),this.entries.set(n,i),this.hits++,Promise.resolve(J(i.info));let a=this.fetchInFlight.get(n);if(a)return a;let o=this.doFetch(e,n,t,r).finally(()=>{this.fetchInFlight.delete(n)});return this.fetchInFlight.set(n,o),o}async doFetch(e,t,n,r){this.misses++;let i=this.inner.resolveGitDir(e),a=Ky(i),o=await this.inner.getGitInfo(e,n);if(o.kind!==`ok`)return o;let s=o.value;n.showPullRequest&&(s.pullRequest=await this.getPullRequestCached(e,s.branch)),this.dropEntry(t);let c=this.watchers.acquire(`git:${e}`,Jy(i),()=>this.invalidateRepo(e));return this.entries.set(t,{info:s,computedAt:r,mtime:a,watcher:c,repoRoot:e}),this.evictIfNeeded(),o}async getPullRequestCached(e,t){let n=await this.inner.getRepoRemoteUrl(e);if(n.kind===`failed`)return n;if(n.kind===`absent`)return Y;let r=n.value,i=`${e}|${t}|${r}`,a=Date.now(),o=this.prCache.get(i);if(o){let e=o.pr.kind===`failed`?45e3:3e5;if(a-o.computedAt<e)return this.prCache.delete(i),this.prCache.set(i,o),o.pr}let s=this.prFetchInFlight.get(i);if(s)return s;let c=this.inner.resolvePullRequest(e,r).then(e=>(this.prCache.set(i,{pr:e,computedAt:Date.now()}),this.evictPrIfNeeded(),e)).finally(()=>{this.prFetchInFlight.delete(i)});return this.prFetchInFlight.set(i,c),c}evictPrIfNeeded(){for(;this.prCache.size>this.maxEntries;){let e=this.prCache.keys().next().value;if(e===void 0)break;this.prCache.delete(e)}}deliverable(e,t){return e.kind===`failed`?(this.logger(`warn`,`git fetch failed (${t}): ${e.reason}`),null):e.kind===`ok`?e.value:null}subscribe(e,t){let n=!1,r=null;return{firstDelivery:(async()=>{let i=await this.resolveEffectiveGitDir(e);if(n)return;if(i.kind!==`ok`){i.kind===`failed`&&this.logger(`warn`,`git resolve failed (subscribe ${e}): ${i.reason}`),this.safeInvoke(t,null);return}let a=i.value,o=this.subscribersByRepo.get(a);if(!o){let t=this.inner.resolveGitDir(a),n=this.watchers.acquire(`git:${a}`,Jy(t),()=>this.invalidateRepo(a));o={workingDir:e,repoRoot:a,callbacks:new Set,watcher:n},this.subscribersByRepo.set(a,o)}o.callbacks.add(t),r={repoRoot:a,entry:o};let s=await this.getGitInfoForRoot(a,{...Wy});n||this.safeInvoke(t,this.deliverable(s,a))})(),unsubscribe:()=>{if(n=!0,!r)return;let{repoRoot:e,entry:i}=r;i.callbacks.delete(t),i.callbacks.size===0&&(i.watcher.release(),this.subscribersByRepo.delete(e))}}}invalidateRepo(e){let t=0;for(let[n,r]of this.entries)r.repoRoot===e&&(r.watcher.release(),this.entries.delete(n),t++);t>0&&(this.invalidations+=t,this.logger(`info`,`gitCache invalidate ${e} dropped=${t}`)),this.refreshSubscribers(e)}refreshSubscribers(e){let t=this.subscribersByRepo.get(e);!t||t.callbacks.size===0||this.refreshes.run(e,()=>this.refreshOnce(e))}async refreshOnce(e){let t=this.subscribersByRepo.get(e);if(!t||t.callbacks.size===0)return;let n=await this.getGitInfoForRoot(e,{...Wy}),r=this.deliverable(n,e),i=this.subscribersByRepo.get(e);if(!(!i||i.callbacks.size===0))for(let e of[...i.callbacks])i.callbacks.has(e)&&this.safeInvoke(e,r)}safeInvoke(e,t){try{e(t)}catch(e){this.logger(`warn`,`git subscriber threw: ${e.message??String(e)}`)}}dropEntry(e){let t=this.entries.get(e);t&&(t.watcher.release(),this.entries.delete(e))}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.dropEntry(e),this.logger(`info`,`gitCache evict ${e}`)}}runSanityCheck(){let e=new Map;for(let t of this.entries.values()){let n=e.get(t.repoRoot);n||(n=Ky(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),qy(t.mtime,n)&&this.invalidateRepo(t.repoRoot)}}runSanityCheckNow(){this.runSanityCheck()}close(){this.sanityTimer&&=(clearInterval(this.sanityTimer),null);for(let e of this.entries.values())e.watcher.release();this.entries.clear();for(let e of this.subscribersByRepo.values())e.callbacks.clear(),e.watcher.release();this.subscribersByRepo.clear(),this.refreshes.clear(),this.fetchInFlight.clear(),this.prCache.clear(),this.prFetchInFlight.clear(),this.resolutions.clear(),this.ownsWatchers&&this.watchers.closeAll()}};const Xy=/\r\n|\r|\n/g,Zy=e=>J(e.replace(Xy,` `).trim());function Qy(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(Xy,` `))}}const $y=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function eb(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(O(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function tb(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}const nb=`session.id`;function rb(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await De({bin:`/bin/sh`,args:[`-c`,e],cwd:t,category:`user-shell`,signal:n});if(!r.ok&&r.reason===`aborted`)throw n.reason;return r.ok?J(r.stdout):X(`shell "${e}" ${r.exitCode===null?[r.reason,r.error].filter(e=>e!==void 0).join(`: `):`exited with code ${r.exitCode}`} in ${t}`)}}}function ib(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await x(e,{encoding:`utf8`,signal:n});return J(t===`first-line`?r.split(/\r?\n/)[0]??``:r)}catch{if(n.aborted)throw n.reason;return X(`file unreadable: ${e}`)}}}}function ab(e,t,n){if(e.kind!==`ok`)return e;let r=t(e.value);return r.kind===`failed`?X(`${r.reason} in ${n}`):r}const ob=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],sb=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],cb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],lb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function ub(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>ob[e.getMonth()]],[`Monday`,e=>cb[e.getDay()]],[`Jan`,e=>sb[e.getMonth()]],[`Mon`,e=>lb[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const db={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function fb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=db[t];try{return gb(r,e)}catch{return _b(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return gy(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return gy(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return gy(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return gy(e.stashCount,0)}}var pb=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},mb=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:te(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ee(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ee(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function hb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function gb(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?bv(e):t===`number`?xv(e):Sv(e)}function _b(e){return e===`number`?0:e===`boolean`?!1:``}var vb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new pb;ttlMgr=new mb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Hy;abort=new AbortController;drawn=_v.observable.box(P.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=dy(void 0,void 0,this.drawnAt);gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new Yy({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,yv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){this.declareSource(e,rb(t,n.cwd,this.abort.signal),eb(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,ib(t,n.readMode??`whole`,this.abort.signal),n.cache,n.parse)}declareSource(e,t,n,r){let i=this.publisherFor(e,r,t.where),a=()=>this.runSource(e,t,i);a(),this.registerCachePolicy(e,n,a)}publisherFor(e,t,n){switch(t.kind){case`text`:return this.scalarPublisher(e,Zy,t.default,n);case`regex`:return this.scalarPublisher(e,Qy(t.regex),t.default,n);case`json`:return this.documentPublisher(e,t.default,n)}}scalarPublisher(e,t,n,r){let i=this.stringInitial(n);return this.store.defineBox(e,`string`,i),n=>{let a=ab(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,gy(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=ab(i,$y,n);this.noteOutcome(e,a),this.store.setDocument(e,a.kind===`ok`||t===void 0?a:r)}}runSource(e,t,n){let r=this.reads.run(e,()=>t.read().then(n,e=>{if(e!==this.abort.signal.reason)throw e}));r.kind===`started`&&this.track(e,r.done)}track(e,t){let n=t.finally(()=>{this.inFlight.get(e)===n&&this.inFlight.delete(e)});this.inFlight.set(e,n)}async settled(e){let t=Date.now()+e;for(;this.inFlight.size>0;){let e=t-Date.now();if(e<=0)break;let n,r=await Promise.race([Promise.all(this.inFlight.values()).then(()=>`settled`),new Promise(t=>{n=setTimeout(()=>t(`deadline`),e)})]);if(clearTimeout(n),r===`deadline`)break}return[...this.inFlight.keys()]}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=fy(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){let r=t instanceof Error?t.message:String(t);if(this.recordError(e,r),n.varDefault===void 0)throw Error(`variable "${e}": ${r}`);return n.varDefault}});try{this.store.read(e)}catch{}}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return ub(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,ub(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=db[t.field],r=t.varDefault===void 0?_b(n):gb(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map,n=this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,fb(t,n,i,this.defaultEmptyValue))})});i={fieldSubs:e,firstDelivery:n.firstDelivery,unsubscribe:n.unsubscribe},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault}),this.track(e,i.firstDelivery)}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(nb);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=hb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,gb(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}drawAt(e){this.store.runInAction(()=>this.drawn.set(e))}getLastError(e){return this.lastErrors.get(e)}dispose(){this.abort.abort();for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.reads.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,_v.reaction)(()=>{let t=fy(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,_v.reaction)(()=>t.varNames.map(e=>this.store.changeKey(e)).join(`,`),n);this.cleanups.push(e);break}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,gb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,_b(t))}}defaultFor(e){try{return gb(this.defaultEmptyValue,e)}catch{return _b(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}noteOutcome(e,t){t.kind===`ok`?this.lastErrors.delete(e):this.recordError(e,t.kind===`failed`?t.reason:`no value`)}};const yb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[nb]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"look.effective":{kind:`input`,path:`look.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"preset.customized":{kind:`input`,path:`preset.customized`,type:`boolean`,default:!1},"preset.bundled":{kind:`input`,path:`preset.bundled`,type:`boolean`,default:!0},"style.effective":{kind:`input`,path:`style.effective`,default:``},"progression.effective":{kind:`input`,path:`progression.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"updateNotice.effective":{kind:`input`,path:`updateNotice.effective`,type:`boolean`,default:!0},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},bb={theme:{configKey:`palette`,sessionKey:`theme`,effectiveVar:`theme.effective`,label:`🎨`},preset:{configKey:`preset`,sessionKey:`preset`,effectiveVar:`preset.effective`,label:`▦`},look:{configKey:`look`,sessionKey:`look`,effectiveVar:`look.effective`,label:`◐`},style:{configKey:`style`,sessionKey:`style`,effectiveVar:`style.effective`,label:`✦`},progression:{configKey:`progression`,sessionKey:`progression`,effectiveVar:`progression.effective`,label:`🎼`},charset:{configKey:`charset`,sessionKey:`charset`,effectiveVar:`charset.effective`,label:`🔣`},colorCompatibility:{configKey:`colorCompatibility`,sessionKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`,label:`🌈`},autoWrap:{configKey:`autoWrap`,sessionKey:`autoWrap`,effectiveVar:`autoWrap.effective`,label:`wrap`},padding:{configKey:`padding`,sessionKey:`padding`,effectiveVar:`padding.effective`,label:`padding`},updateNotice:{configKey:`updateNotice`,sessionKey:`updateNotice`,effectiveVar:`updateNotice.effective`,label:`update notice`}},xb=Object.values(bb),Sb=new Map(xb.map(e=>[e.configKey,e.effectiveVar])),Cb=new Map(xb.map(e=>[e.sessionKey,e.effectiveVar])),wb=new Map(Object.keys(bb).map(e=>[bb[e].sessionKey,e]));function Tb(e,t,n){let r=new Set,i=e=>{for(let t of sv(e??``,n).keys())r.add(t)};for(let t of Object.values(e.segments))i(t.template),i(t.bg),i(t.fg),i(t.when);for(let e of t)for(let t of Ms(e))i(t.when);for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(nb);for(let t of Object.values(e.actions)){r.add(nb),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Cb.get(t.set):void 0,n=`persist`in t?Sb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Eb(e,t,n){let r=pv({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of Tb(e,t,n.helpers)){if(fv(a,r))continue;let e=yb[a];if(e===void 0)throw Error(`synthesized chrome reads ".${a}", which it does not declare and PAYLOAD_INPUTS does not supply`);i[a]=e}return i}const Db=new Map,Ob=new Map;function kb(e){let t=jb(e);if(t===null)throw Error(`Palette "${e}" did not resolve in the theme registry — allowed names and the registry are inconsistent`);return t}function Ab(e,t){return e===`bar`?t:kb(e)}function jb(e){let t=Db.get(e);if(t!==void 0)return t;let n=Sr(e);return n===null?null:(Db.set(e,n),n)}function Mb(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Ob.get(n);if(r!==void 0)return r;let i=Ar(e,t);return Ob.set(n,i),i}function Nb(e){let t=jb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Pb(e,t,n){let r=Nb(e);return r===null?(n(`${t} rendered "${Ga}": "${e}" names no installed theme${Wa(e)}`),Ib()):r}function Fb(e,t,n){return eo(e,t,n,Ib(),Nb)}function Ib(){return Nb(Ga)}function Lb(e){return to(Fb(void 0,null,e),Ib).value}const Rb=new Map;function zb(e,t,n){Rb.set(e,{permanent:!0,resolve:t,paletteOf:n})}zb(`themes`,()=>qa(),e=>kb(e));const Bb=`placementThemes`;zb(Bb,Ja,(e,t)=>Ab(e,t.palette)),zb(`styles`,()=>oo),zb(`progressions`,()=>yo),zb(`charsets`,()=>lo),zb(`colorCompatibilities`,()=>mo);function Vb(e){return new Map([[`looks`,{members:Object.keys(e.looks),paletteOf:(t,n)=>Mb(n.basePalette,e.looks[t])}],[`presets`,{members:x_(e.presets)}]])}function Hb(e){return[...new Set([...Rb.keys(),...e.keys()])]}function Ub(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Rb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${Hb(t).join(`, `)})`)}function Wb(e){return{label:e.label,domain:Gb(e.domain)}}function Gb(e){return e===`theme`?{from:Bb}:e===`bool`||`min`in e?e:{from:e}}function Kb(e,t,n,r){let i=Jc(e.label),{domain:a}=e;if(a===`bool`)return{kind:`inline`,template:`{{ action "${r}" "☑ ${i}" "☐ ${i}" }}`,actions:{[r]:{set:t,cycle:[...wo]}}};if(`from`in a)return{kind:`ring`,template:`{{ carousel "${r}" }}`,actions:{[r]:{set:t,from:a.from}}};let o=e=>({set:t,min:a.min,max:a.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "◀" }} {{ "${i}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`,actions:{[`${r}.down`]:o(-a.step),[`${r}.up`]:o(a.step)}}}const qb=/^segments\.([^.]+)\.palette$/,Jb=/^presets\.(.+)\.root$/,Yb=/^presets\.(.+)\.globals\.([^.]+)$/;function Xb(e){return`presets.${e}.root`}function Zb(e,t){return`presets.${e}.globals.${t}`}function Qb(e){if(Dl(e))return{scope:`globals`,field:e};let t=qb.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=Yb.exec(e);if(n&&bl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Jb.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function $b(e){switch(e.scope){case`globals`:return[`globals`,e.field];case`preset-globals`:return[`presets`,e.preset,`globals`,e.field];case`segment-palette`:return[`segments`,e.segment,`palette`]}}const ex=`open`;function tx(e,t,n,r){let i={variable:e,key:e,member:ex};return r.variables[e]=$c(e,Wc),r.actions[e]=el(e,ex),r.segments[e]={template:Qc(e,`(?)`,`✕`),...nx(n)},Yc(e,i,{kind:`container`,direction:`horizontal`,children:t.map((t,n)=>{let i=`${e}.${n}`;return r.segments[i]={template:t},{kind:`segment`,name:i}})},`drop`)}function nx(e){let[t,...n]=e;return t===void 0?{}:{when:Xc(t,...n)}}const rx={help:[`-h`,`--help`],version:[`-V`,`--version`]},ix=[`✚ inserts`,`🚫 removes`,`⚙ configures`,`↺ resets layout`],ax=`
90
+ `).length:0)}async getRemotesAsync(e){let t=Ry(c.join(this.resolveCommonGitDir(e),`config`));if(t===null)return this.readRemotes(e);let{key:n,stamp:r}=t,i=this.remotesByConfig.get(n);if(i!==void 0&&i.stamp===r)return this.remotesByConfig.delete(n),this.remotesByConfig.set(n,i),i.remotes;let a=this.readRemotes(e);for(this.remotesByConfig.set(n,{stamp:r,remotes:a}),a.then(e=>{let t=this.remotesByConfig.get(n);e.kind!==`ok`&&t?.remotes===a&&this.remotesByConfig.delete(n)},()=>{this.remotesByConfig.get(n)?.remotes===a&&this.remotesByConfig.delete(n)});this.remotesByConfig.size>256;){let e=this.remotesByConfig.keys().next().value;if(e===void 0)break;this.remotesByConfig.delete(e)}return a}remotesByConfig=new Map;async readRemotes(e){let t=_y(`git config --get-regexp remote url`,await this.execGitAsync([`config`,`--local`,`--get-regexp`,`^remote\\..*\\.url$`],{cwd:e,timeout:2e3}),1);return t.kind===`failed`?t:J(t.kind===`ok`?Ty(t.value):[])}repoNameFrom(e,t){let n=Oy(e);return(n===null?null:Ay(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=ky(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return De({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=wy(t);return n===`github`?Ny(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,Iy):n===`gitlab`?Ny(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,Ly):Y}isWorktree(e){try{let t=c.join(e,`.git`);return!!(r.existsSync(t)&&r.statSync(t).isFile())}catch{return!1}}async getCoreAsync(e){O(`[GIT-EXEC] Running git status --porcelain=v2 in ${e}`);let t=_y(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(Fy(t.value)):t}};const By=(e,t)=>O(t);var Vy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??By}acquire(e,t,n){if(this.closed)return{release:()=>{}};let r=this.slots.get(e);if(r)return r.refcount++,r.onInvalidate=n,r.lastTouched=Date.now(),this.slots.delete(e),this.slots.set(e,r),this.makeHandle(e);let i={key:e,watchers:[],refcount:1,debounceTimer:null,onInvalidate:n,targets:t,lastTouched:Date.now()};return this.openWatchers(i),this.slots.set(e,i),this.counters&&this.counters.watchersOpened++,this.evictIfNeeded(),this.makeHandle(e)}makeHandle(e){let t=!1;return{release:()=>{if(t)return;t=!0;let n=this.slots.get(e);n&&(n.refcount=Math.max(0,n.refcount-1),n.refcount===0&&(this.closeSlot(n),this.slots.delete(e)))}}}openWatchers(e){let t=()=>{e.debounceTimer||(e.debounceTimer=setTimeout(()=>{e.debounceTimer=null;try{e.onInvalidate()}catch(e){this.logger(`warn`,`watcher invalidate threw: ${e.message}`)}},50),e.debounceTimer.unref())};for(let n of e.targets.files)try{let i=r.watch(n,{persistent:!1},t);i.on(`error`,e=>{this.logger(`warn`,`watcher error ${n}: ${e.message}`)}),e.watchers.push(i)}catch(e){this.logger(`warn`,`watch failed ${n}: ${e.message}`)}for(let n of e.targets.dirs)try{let i=n.filenames?new Set(n.filenames):null,a=r.watch(n.path,{persistent:!1},(e,n)=>{i&&(!n||!i.has(n))||t()});a.on(`error`,e=>{this.logger(`warn`,`watcher error ${n.path}: ${e.message}`)}),e.watchers.push(a)}catch(e){this.logger(`warn`,`watch failed ${n.path}: ${e.message}`)}}closeSlot(e){e.debounceTimer&&=(clearTimeout(e.debounceTimer),null);for(let t of e.watchers)try{t.close()}catch{}e.watchers=[],this.counters&&this.counters.watchersClosed++}evictIfNeeded(){for(;this.slots.size>this.maxWatchers;){let e=this.slots.keys().next().value;if(e===void 0)break;let t=this.slots.get(e);this.closeSlot(t),this.slots.delete(e),this.counters&&this.counters.watchersEvicted++;try{t.onInvalidate()}catch{}this.logger(`info`,`watcher LRU evict ${e}`)}}size(){return this.slots.size}closeAll(){this.closed=!0;for(let e of this.slots.values())this.closeSlot(e);this.slots.clear()}},Hy=class{running=new Set;again=new Set;run(e,t){return this.again.add(e),this.running.has(e)?{kind:`queued`}:(this.running.add(e),{kind:`started`,done:this.loop(e,t)})}async loop(e,t){try{do this.again.delete(e),await t();while(this.again.has(e))}finally{this.running.delete(e),this.again.delete(e)}}clear(){this.running.clear(),this.again.clear()}get size(){return this.running.size}};const Uy=(e,t)=>O(t),Wy={showSha:!0,showStashCount:!0};function Gy(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function Ky(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function qy(e,t){return e.head!==t.head||e.index!==t.index}function Jy(e){let t=[],n=c.join(e,`refs/heads`);try{r.statSync(n).isDirectory()&&t.push({path:n})}catch{}return{files:[c.join(e,`HEAD`),c.join(e,`index`)],dirs:t}}var Yy=class extends zy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Hy;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new zy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??Uy,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Vy({logger:this.logger}),this.ownsWatchers=!0);let t=e.sanityIntervalMs??3e5;t>0&&(this.sanityTimer=setInterval(()=>this.runSanityCheck(),t),this.sanityTimer.unref())}getWatcherRegistry(){return this.watchers}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,invalidations:this.invalidations,watchers:this.watchers.size()}}resolveEffectiveGitDir(e,t){let n=`${e}|${t??``}`,r=Date.now(),i=this.resolutions.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.resolutions.delete(n),this.resolutions.set(n,i),i.dir;let a=this.inner.resolveEffectiveGitDir(e,t);return this.resolutions.set(n,{dir:a,computedAt:r}),a.catch(()=>{this.resolutions.get(n)?.dir===a&&this.resolutions.delete(n)}),this.evictResolutionsIfNeeded(),a}evictResolutionsIfNeeded(){for(;this.resolutions.size>this.maxEntries;){let e=this.resolutions.keys().next().value;if(e===void 0)break;this.resolutions.delete(e)}}async getGitInfo(e,t={},n){let r=await this.resolveEffectiveGitDir(e,n);return r.kind===`ok`?this.getGitInfoForRoot(r.value,t):r}getGitInfoForRoot(e,t){let n=`${e}|${Gy(t)}`,r=Date.now(),i=this.entries.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.entries.delete(n),this.entries.set(n,i),this.hits++,Promise.resolve(J(i.info));let a=this.fetchInFlight.get(n);if(a)return a;let o=this.doFetch(e,n,t,r).finally(()=>{this.fetchInFlight.delete(n)});return this.fetchInFlight.set(n,o),o}async doFetch(e,t,n,r){this.misses++;let i=this.inner.resolveGitDir(e),a=Ky(i),o=await this.inner.getGitInfo(e,n);if(o.kind!==`ok`)return o;let s=o.value;n.showPullRequest&&(s.pullRequest=await this.getPullRequestCached(e,s.branch)),this.dropEntry(t);let c=this.watchers.acquire(`git:${e}`,Jy(i),()=>this.invalidateRepo(e));return this.entries.set(t,{info:s,computedAt:r,mtime:a,watcher:c,repoRoot:e}),this.evictIfNeeded(),o}async getPullRequestCached(e,t){let n=await this.inner.getRepoRemoteUrl(e);if(n.kind===`failed`)return n;if(n.kind===`absent`)return Y;let r=n.value,i=`${e}|${t}|${r}`,a=Date.now(),o=this.prCache.get(i);if(o){let e=o.pr.kind===`failed`?45e3:3e5;if(a-o.computedAt<e)return this.prCache.delete(i),this.prCache.set(i,o),o.pr}let s=this.prFetchInFlight.get(i);if(s)return s;let c=this.inner.resolvePullRequest(e,r).then(e=>(this.prCache.set(i,{pr:e,computedAt:Date.now()}),this.evictPrIfNeeded(),e)).finally(()=>{this.prFetchInFlight.delete(i)});return this.prFetchInFlight.set(i,c),c}evictPrIfNeeded(){for(;this.prCache.size>this.maxEntries;){let e=this.prCache.keys().next().value;if(e===void 0)break;this.prCache.delete(e)}}deliverable(e,t){return e.kind===`failed`?(this.logger(`warn`,`git fetch failed (${t}): ${e.reason}`),null):e.kind===`ok`?e.value:null}subscribe(e,t){let n=!1,r=null;return{firstDelivery:(async()=>{let i=await this.resolveEffectiveGitDir(e);if(n)return;if(i.kind!==`ok`){i.kind===`failed`&&this.logger(`warn`,`git resolve failed (subscribe ${e}): ${i.reason}`),this.safeInvoke(t,null);return}let a=i.value,o=this.subscribersByRepo.get(a);if(!o){let t=this.inner.resolveGitDir(a),n=this.watchers.acquire(`git:${a}`,Jy(t),()=>this.invalidateRepo(a));o={workingDir:e,repoRoot:a,callbacks:new Set,watcher:n},this.subscribersByRepo.set(a,o)}o.callbacks.add(t),r={repoRoot:a,entry:o};let s=await this.getGitInfoForRoot(a,{...Wy});n||this.safeInvoke(t,this.deliverable(s,a))})(),unsubscribe:()=>{if(n=!0,!r)return;let{repoRoot:e,entry:i}=r;i.callbacks.delete(t),i.callbacks.size===0&&(i.watcher.release(),this.subscribersByRepo.delete(e))}}}invalidateRepo(e){let t=0;for(let[n,r]of this.entries)r.repoRoot===e&&(r.watcher.release(),this.entries.delete(n),t++);t>0&&(this.invalidations+=t,this.logger(`info`,`gitCache invalidate ${e} dropped=${t}`)),this.refreshSubscribers(e)}refreshSubscribers(e){let t=this.subscribersByRepo.get(e);!t||t.callbacks.size===0||this.refreshes.run(e,()=>this.refreshOnce(e))}async refreshOnce(e){let t=this.subscribersByRepo.get(e);if(!t||t.callbacks.size===0)return;let n=await this.getGitInfoForRoot(e,{...Wy}),r=this.deliverable(n,e),i=this.subscribersByRepo.get(e);if(!(!i||i.callbacks.size===0))for(let e of[...i.callbacks])i.callbacks.has(e)&&this.safeInvoke(e,r)}safeInvoke(e,t){try{e(t)}catch(e){this.logger(`warn`,`git subscriber threw: ${e.message??String(e)}`)}}dropEntry(e){let t=this.entries.get(e);t&&(t.watcher.release(),this.entries.delete(e))}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.dropEntry(e),this.logger(`info`,`gitCache evict ${e}`)}}runSanityCheck(){let e=new Map;for(let t of this.entries.values()){let n=e.get(t.repoRoot);n||(n=Ky(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),qy(t.mtime,n)&&this.invalidateRepo(t.repoRoot)}}runSanityCheckNow(){this.runSanityCheck()}close(){this.sanityTimer&&=(clearInterval(this.sanityTimer),null);for(let e of this.entries.values())e.watcher.release();this.entries.clear();for(let e of this.subscribersByRepo.values())e.callbacks.clear(),e.watcher.release();this.subscribersByRepo.clear(),this.refreshes.clear(),this.fetchInFlight.clear(),this.prCache.clear(),this.prFetchInFlight.clear(),this.resolutions.clear(),this.ownsWatchers&&this.watchers.closeAll()}};const Xy=/\r\n|\r|\n/g,Zy=e=>J(e.replace(Xy,` `).trim());function Qy(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(Xy,` `))}}const $y=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function eb(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(O(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function tb(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}const nb=`session.id`;function rb(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await De({bin:`/bin/sh`,args:[`-c`,e],cwd:t,category:`user-shell`,signal:n});if(!r.ok&&r.reason===`aborted`)throw n.reason;return r.ok?J(r.stdout):X(`shell "${e}" ${r.exitCode===null?[r.reason,r.error].filter(e=>e!==void 0).join(`: `):`exited with code ${r.exitCode}`} in ${t}`)}}}function ib(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await x(e,{encoding:`utf8`,signal:n});return J(t===`first-line`?r.split(/\r?\n/)[0]??``:r)}catch{if(n.aborted)throw n.reason;return X(`file unreadable: ${e}`)}}}}function ab(e,t,n){if(e.kind!==`ok`)return e;let r=t(e.value);return r.kind===`failed`?X(`${r.reason} in ${n}`):r}const ob=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],sb=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],cb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],lb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function ub(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>ob[e.getMonth()]],[`Monday`,e=>cb[e.getDay()]],[`Jan`,e=>sb[e.getMonth()]],[`Mon`,e=>lb[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const db={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function fb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=db[t];try{return gb(r,e)}catch{return _b(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return gy(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return gy(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return gy(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return gy(e.stashCount,0)}}var pb=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},mb=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:te(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ee(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ee(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function hb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function gb(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?bv(e):t===`number`?xv(e):Sv(e)}function _b(e){return e===`number`?0:e===`boolean`?!1:``}var vb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new pb;ttlMgr=new mb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Hy;abort=new AbortController;drawn=_v.observable.box(P.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=dy(void 0,void 0,this.drawnAt);gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new Yy({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,yv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){this.declareSource(e,rb(t,n.cwd,this.abort.signal),eb(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,ib(t,n.readMode??`whole`,this.abort.signal),n.cache,n.parse)}declareSource(e,t,n,r){let i=this.publisherFor(e,r,t.where),a=()=>this.runSource(e,t,i);a(),this.registerCachePolicy(e,n,a)}publisherFor(e,t,n){switch(t.kind){case`text`:return this.scalarPublisher(e,Zy,t.default,n);case`regex`:return this.scalarPublisher(e,Qy(t.regex),t.default,n);case`json`:return this.documentPublisher(e,t.default,n)}}scalarPublisher(e,t,n,r){let i=this.stringInitial(n);return this.store.defineBox(e,`string`,i),n=>{let a=ab(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,gy(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=ab(i,$y,n);this.noteOutcome(e,a),this.store.setDocument(e,a.kind===`ok`||t===void 0?a:r)}}runSource(e,t,n){let r=this.reads.run(e,()=>t.read().then(n,e=>{if(e!==this.abort.signal.reason)throw e}));r.kind===`started`&&this.track(e,r.done)}track(e,t){let n=t.finally(()=>{this.inFlight.get(e)===n&&this.inFlight.delete(e)});this.inFlight.set(e,n)}async settled(e){let t=Date.now()+e;for(;this.inFlight.size>0;){let e=t-Date.now();if(e<=0)break;let n,r=await Promise.race([Promise.all(this.inFlight.values()).then(()=>`settled`),new Promise(t=>{n=setTimeout(()=>t(`deadline`),e)})]);if(clearTimeout(n),r===`deadline`)break}return[...this.inFlight.keys()]}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=fy(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){let r=t instanceof Error?t.message:String(t);if(this.recordError(e,r),n.varDefault===void 0)throw Error(`variable "${e}": ${r}`);return n.varDefault}});try{this.store.read(e)}catch{}}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return ub(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,ub(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=db[t.field],r=t.varDefault===void 0?_b(n):gb(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map,n=this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,fb(t,n,i,this.defaultEmptyValue))})});i={fieldSubs:e,firstDelivery:n.firstDelivery,unsubscribe:n.unsubscribe},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault}),this.track(e,i.firstDelivery)}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(nb);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=hb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,gb(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}drawAt(e){this.store.runInAction(()=>this.drawn.set(e))}getLastError(e){return this.lastErrors.get(e)}dispose(){this.abort.abort();for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.reads.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,_v.reaction)(()=>{let t=fy(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,_v.reaction)(()=>t.varNames.map(e=>this.store.changeKey(e)).join(`,`),n);this.cleanups.push(e);break}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,gb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,_b(t))}}defaultFor(e){try{return gb(this.defaultEmptyValue,e)}catch{return _b(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}noteOutcome(e,t){t.kind===`ok`?this.lastErrors.delete(e):this.recordError(e,t.kind===`failed`?t.reason:`no value`)}};const yb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[nb]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"preset.customized":{kind:`input`,path:`preset.customized`,type:`boolean`,default:!1},"preset.bundled":{kind:`input`,path:`preset.bundled`,type:`boolean`,default:!0},"endcaps.effective":{kind:`input`,path:`endcaps.effective`,default:``},"variation.effective":{kind:`input`,path:`variation.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"updateNotice.effective":{kind:`input`,path:`updateNotice.effective`,type:`boolean`,default:!0},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},bb={theme:{configKey:`palette`,sessionKey:`theme`,effectiveVar:`theme.effective`,label:`🎨`},preset:{configKey:`preset`,sessionKey:`preset`,effectiveVar:`preset.effective`,label:`▦`},style:{configKey:`style`,sessionKey:`style`,effectiveVar:`style.effective`,label:`◐`},endcaps:{configKey:`endcaps`,sessionKey:`endcaps`,effectiveVar:`endcaps.effective`,label:`✦`},variation:{configKey:`variation`,sessionKey:`variation`,effectiveVar:`variation.effective`,label:`🎼`},charset:{configKey:`charset`,sessionKey:`charset`,effectiveVar:`charset.effective`,label:`🔣`},colorCompatibility:{configKey:`colorCompatibility`,sessionKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`,label:`🌈`},autoWrap:{configKey:`autoWrap`,sessionKey:`autoWrap`,effectiveVar:`autoWrap.effective`,label:`wrap`},padding:{configKey:`padding`,sessionKey:`padding`,effectiveVar:`padding.effective`,label:`padding`},updateNotice:{configKey:`updateNotice`,sessionKey:`updateNotice`,effectiveVar:`updateNotice.effective`,label:`update notice`}},xb=Object.values(bb),Sb=new Map(xb.map(e=>[e.configKey,e.effectiveVar])),Cb=new Map(xb.map(e=>[e.sessionKey,e.effectiveVar])),wb=new Map(Object.keys(bb).map(e=>[bb[e].sessionKey,e]));function Tb(e,t,n){let r=new Set,i=e=>{for(let t of sv(e??``,n).keys())r.add(t)};for(let t of Object.values(e.segments))i(t.template),i(t.bg),i(t.fg),i(t.when);for(let e of t)for(let t of Ms(e))i(t.when);for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(nb);for(let t of Object.values(e.actions)){r.add(nb),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Cb.get(t.set):void 0,n=`persist`in t?Sb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Eb(e,t,n){let r=pv({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of Tb(e,t,n.helpers)){if(fv(a,r))continue;let e=yb[a];if(e===void 0)throw Error(`synthesized chrome reads ".${a}", which it does not declare and PAYLOAD_INPUTS does not supply`);i[a]=e}return i}const Db=new Map,Ob=new Map;function kb(e){let t=jb(e);if(t===null)throw Error(`Palette "${e}" did not resolve in the theme registry — allowed names and the registry are inconsistent`);return t}function Ab(e,t){return e===`bar`?t:kb(e)}function jb(e){let t=Db.get(e);if(t!==void 0)return t;let n=Sr(e);return n===null?null:(Db.set(e,n),n)}function Mb(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Ob.get(n);if(r!==void 0)return r;let i=Ar(e,t);return Ob.set(n,i),i}function Nb(e){let t=jb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Pb(e,t,n){let r=Nb(e);return r===null?(n(`${t} rendered "${Ga}": "${e}" names no installed theme${Wa(e)}`),Ib()):r}function Fb(e,t,n){return eo(e,t,n,Ib(),Nb)}function Ib(){return Nb(Ga)}function Lb(e){return to(Fb(void 0,null,e),Ib).value}const Rb=new Map;function zb(e,t,n){Rb.set(e,{permanent:!0,resolve:t,paletteOf:n})}zb(`themes`,()=>qa(),e=>kb(e));const Bb=`placementThemes`;zb(Bb,Ja,(e,t)=>Ab(e,t.palette)),zb(`endcaps`,()=>oo),zb(`variations`,()=>yo),zb(`charsets`,()=>lo),zb(`colorCompatibilities`,()=>mo);function Vb(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Mb(n.basePalette,e.styles[t])}],[`presets`,{members:x_(e.presets)}]])}function Hb(e){return[...new Set([...Rb.keys(),...e.keys()])]}function Ub(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Rb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${Hb(t).join(`, `)})`)}function Wb(e){return{label:e.label,domain:Gb(e.domain)}}function Gb(e){return e===`theme`?{from:Bb}:e===`bool`||`min`in e?e:{from:e}}function Kb(e,t,n,r){let i=Jc(e.label),{domain:a}=e;if(a===`bool`)return{kind:`inline`,template:`{{ action "${r}" "☑ ${i}" "☐ ${i}" }}`,actions:{[r]:{set:t,cycle:[...wo]}}};if(`from`in a)return{kind:`ring`,template:`{{ carousel "${r}" }}`,actions:{[r]:{set:t,from:a.from}}};let o=e=>({set:t,min:a.min,max:a.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "◀" }} {{ "${i}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`,actions:{[`${r}.down`]:o(-a.step),[`${r}.up`]:o(a.step)}}}const qb=/^segments\.([^.]+)\.palette$/,Jb=/^presets\.(.+)\.root$/,Yb=/^presets\.(.+)\.globals\.([^.]+)$/;function Xb(e){return`presets.${e}.root`}function Zb(e,t){return`presets.${e}.globals.${t}`}function Qb(e){if(Dl(e))return{scope:`globals`,field:e};let t=qb.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=Yb.exec(e);if(n&&bl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Jb.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function $b(e){switch(e.scope){case`globals`:return[`globals`,e.field];case`preset-globals`:return[`presets`,e.preset,`globals`,e.field];case`segment-palette`:return[`segments`,e.segment,`palette`]}}const ex=`open`;function tx(e,t,n,r){let i={variable:e,key:e,member:ex};return r.variables[e]=$c(e,Wc),r.actions[e]=el(e,ex),r.segments[e]={template:Qc(e,`(?)`,`✕`),...nx(n)},Yc(e,i,{kind:`container`,direction:`horizontal`,children:t.map((t,n)=>{let i=`${e}.${n}`;return r.segments[i]={template:t},{kind:`segment`,name:i}})},`drop`)}function nx(e){let[t,...n]=e;return t===void 0?{}:{when:Xc(t,...n)}}const rx={help:[`-h`,`--help`],version:[`-V`,`--version`]},ix=[`✚ inserts`,`🚫 removes`,`⚙ configures`,`↺ resets layout`],ax=`
91
91
  cc-candybar - Beautiful powerline statusline for Claude Code
92
92
 
93
93
  Usage: cc-candybar [options]
@@ -109,7 +109,7 @@ Configuration:
109
109
  needed, and writing your own \`root\` cannot delete it. Click
110
110
  it on the bar (${Gc} by default; globals.menuGlyph changes it) for
111
111
  quick actions, preset switching, edit mode, and a config menu of
112
- clickable theme/look/style/progression/charset/colour-depth/wrap/padding
112
+ clickable theme/style/variation/endcaps/charset/colour-depth/wrap/padding
113
113
  controls. A change applies to this session at once; 💾 save appears while
114
114
  you have unsaved changes and writes them to your config file.
115
115
  Its 🧰 tools row holds 🩺 doctor: click it to check your setup, and click a
@@ -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
- `,ox=`${gu}live`,sx=[`☐ live`,`☑ live`],cx=`${gu}done`,lx={variable:ox,key:ox,member:`open`},ux=`and ${Zc(W_)} (not ${Zc(lx)})`,dx=`{{ ${ux} }}`;function fx(e,t){return`{{ if ${ux} }}${e}{{ else }}${t}{{ end }}`}const px=`{{ and ${Zc(W_)} .preset.customized }}`,mx=vu,hx=`${gu}addable`;function gx(e){return new Map([[hx,{members:Object.keys(e.segments).filter(e=>!mx(e))}]])}function _x(e,t,n){return n.segments[e]={template:t,when:G_},{kind:`segment`,name:e}}function vx(e,t,n){let r=`${gu}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ action "${r}" "🚫" }}`}function yx(e){return`{{ if ${Zc(W_)} }}${e.join(``)}{{ end }}`}function bx(e,t){return e.reduce((e,t)=>`{{ if ${Zc(t)} }}true{{ else }}${e}{{ end }}`,t)}function xx(e){return e.flatMap(e=>[...Ms(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.mode`?[e.opens.ref]:[]))}function Sx(e,t,n){return`${H_}${e}.${t}.${n}`}function Cx(e,t,n,r){let i=Os(n),a=`${gu}${e.presetIdent}`,o=U_(e.presetIdent,i),s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:z_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Sx(e.presetIdent,i,r),l=`${H_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:qs(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=Kb(Wb(o),s,l,u);return Object.assign(e.artifacts.actions,d.actions),e.artifacts.segments[u]={template:d.kind===`ring`?`{{ "${Jc(o.label)}" }} ${d.template}`:d.template},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "⚙" }}`,ref:{variable:z_,key:z_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const wx=`${gu}label:`;function Tx(e){if(e.startsWith(wx)){let t=e.slice(wx.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Ex(e,t,n,r){let i=Os(e),a=`${wx}${i}:${e.name}`;n.segments[a]={template:`{{ "${Jc(i)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let o=e.settings?.[Hs];return{...Yc(a,r.ref,r.body,`drop`,bx([r.ref],dx)),...o!==void 0&&{settings:{theme:o}},drafts:{[Hs]:r.drafts[Hs]}}}function Dx(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${gu}${i}.insert.${t}`,s=`${gu}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:hx,anchor:n,relation:r};let c=u_(o),l=d_(s,o,void 0),u=m_(l),d=p_(l,c);return a.variables[l]=$c(l,Wc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=el(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${Zc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${wa}`}) $m }}{{ end }}`}}function Ox(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!mx(e.name)),i=e=>Ox(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=js(o,i);if(mx(o.name)){n.push(s);continue}let c=Os(o),l=a===r?[Dx(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Dx(t,u,c,`after`),f=vx(t,u,c),p=t.segments[o.name],m=Cx(t,u,o,Us(p)),h=yx([m.term,f]),g={kind:`container`,direction:`horizontal`,children:[...l.map(e=>_x(e.host,e.template,t.artifacts)),{...Ex(o,p,t.artifacts,m),trail:h},{...s,when:fx(`false`,o.when??`true`),trail:h,drafts:m.drafts},_x(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:bx(xx(n),fx(`true`,e.when))}}}function kx(e,t,n,r,i,a,o){let s=`${gu}${n}.resetLayout`,c=`${gu}${n}.customized`;i.actions[s]={reset:r};let l=Jc(t);return i.segments[c]={template:`{{ action "${s}" "↺ ${l} customized" }}`,when:px},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},Ax(e,o)]}}function Ax(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),Ax(n,t)]}:{...e,children:[...e.children,t]}}function jx(e,t,n,r,i){let{node:a}=w_(e,t),o={presetIdent:pu(t),rootKey:Xb(t),segments:e.segments,artifacts:n,posCounter:{n:0}};return kx(Ox(a,o),t,o.presetIdent,o.rootKey,n,r,i)}function Mx(e){let t={variables:{},actions:{},segments:{}},n=tx(`${gu}help`,ix,[W_],t);t.variables[ox]=$c(ox,Wc),t.actions[ox]=el(ox,lx.member),t.segments[ox]={template:Qc(ox,...sx),when:G_};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ox},n]};t.segments[cx]={template:`{{ action "${B_}" "✎ done" }}`,when:G_};let i={kind:`segment`,name:cx},a={...e.presets},o=[];for(let n of x_(e.presets)){let s=jx(e,n,t,i,r);o.push(s),a[n]={...C_(e.presets,n),root:s}}let s=Eb(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Nx={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Px(e){let t=e[Nx.socket]??``,n=e[Nx.pane]??``;if(t===``||n===``)return null;let r=e[Nx.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Fx=Nx.truecolor,Ix=[{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[Fx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Fx} 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:Fx,value:`1`}}}}}}];function Lx(e){return Ix.map(t=>({check:t,verdict:t.probe(e)}))}function Rx(e){return Ix.find(t=>t.name===e)}const zx=`${K}doctor.`;function Bx(e){let t=`${zx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Vx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Bx(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:Co}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?Co:So}]})}const Hx={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Ux(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(Hx).map(([t,n])=>[`${e}${t}`,n]))}}const Wx=`armed`,Gx=`disarmed`;function Kx(e,t,n){let r=`${e}.arm`,i=`${e}.disarm`,a=`(eq .${e} "${Wx}")`;return{template:`{{ if ${a} }}{{ action "${e}" "${t.confirm}" }} {{ action "${i}" "✕" }}{{ else }}{{ action "${r}" "${t.arm}" }}{{ end }}`,actions:{[r]:{set:e,to:Wx},[i]:{set:e,to:Gx},[e]:{do:[i,...n]}},armed:a,variables:{[e]:{kind:`state`,key:e,default:Gx}},disarm:i}}const qx=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Jx(e){return typeof e==`string`&&qx.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 Yx(e){let t=Jx(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Xx=[`/compact`,`/model`],Zx=`/clear`;function Qx(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=Kx(`${e}clear`,{arm:Zx,confirm:`${Zx} ✓ confirm`},[n]);return{template:Xx.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(Xx.map(e=>[t(e),{slash:Yx(e)}])),...r.actions,[n]:{slash:Yx(Zx)}},variables:r.variables,disarm:r.disarm}}const $x=`${K}menu`,eS=`open`,tS=`${K}edit`,nS=`${K}close`,rS=`${K}toolbar`,iS=Ux(K),aS=`${K}commands`,oS=Qx(`${aS}.`),sS=`${K}config`,cS=`${K}save`,lS=`${K}unsaved`,uS=`${K}preset.save`,dS=`${K}preset.delete`,fS=`${K}resetAll`,pS=`${$x}.toggle`,mS={variable:$x,key:$x,member:eS},hS={variable:sS,key:sS,member:eS},gS=`${K}tools`,_S={variable:gS,key:gS,member:eS},vS=`${K}undo`,yS=`${K}redo`,bS=`${K}resettable`,xS=`${K}doctor`,SS=`${xS}.run`,CS=e=>`${xS}.fix.${e}`,wS=e=>`${xS}.${e}`,TS=`${K}pickers`,ES=[`{{ themePreview }}`],DS={preset:[`{{ layoutPreview }}`,`{{ action "${uS}" "⊕ save as preset" }}{{ if not .preset.bundled }} {{ action "${dS}" (printf "🗑 delete %s" .${bb.preset.effectiveVar}) }}{{ end }}`],theme:ES,look:ES,progression:[`{{ layoutPreview }}`]},OS=e=>`${K}${e}`,kS=e=>`${K}apply.${e}`,AS=e=>`${K}reset.${e}`,jS=e=>`${K}carousel.${e}`,MS=(e,t)=>`${jS(e)}.${t}`,NS=Object.keys(bb).map(e=>{let t=bb[e],n=dl(t.configKey);if(n===`text`)throw Error(`settings menu: globals.${t.configKey} is free text, which no control can change — list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);let r=Kb({label:t.label,domain:n},t.sessionKey,t.effectiveVar,kS(e));return{...t,name:e,control:r,beneath:DS[e]??[]}}),PS=new Set([`preset`]),FS=NS.filter(e=>PS.has(e.name)),IS=NS.filter(e=>!PS.has(e.name));new Set(NS.flatMap(e=>[e.sessionKey,e.configKey]));const LS=Kx(fS,{arm:`⟲`,confirm:`⟲ reset all?`},NS.map(e=>AS(e.name))),RS=(e,t,n)=>({count:e,path:t,body:n,shown:`(gt .${e} 0)`}),zS=[RS(lS,`unsaved`,`{{ action "${cS}" (printf "💾 save %d" .${lS}) }}`),RS(`${K}history.undo`,`history.undo`,`{{ action "${vS}" "↶" }}`),RS(`${K}history.redo`,`history.redo`,`{{ action "${yS}" "↷" }}`),{count:bS,path:`resettable`,body:LS.template,shown:`(or (gt .${bS} 0) ${LS.armed})`}],BS={when:`{{ or ${zS.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+zS.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},VS=[LS,oS],HS=f_(TS),US=e=>({variable:HS,key:HS,member:u_(kS(e))});function WS(e){let t=OS(e.name);return e.control.kind===`inline`?{kind:`segment`,name:t}:Yc(t,US(e.name),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:jS(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:MS(e.name,n)}))]},`drop`)}function GS(e){return e===$x}function KS(e){let t={kind:`segment`,name:$x};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[KS(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 qS(e){return JS(e)>0?e:KS(e)}function JS(e){let t=0;for(let n of Ms(e))n.kind===`segment`&&GS(n.name)&&(t+=1);return t}function YS(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&GS(e.name)||e.opens!==void 0&&YS(e.opens.body,!0):e.children.some(e=>YS(e,n))}function XS(e){return e.kind===`segment`?GS(e.name)?Yc(e.name,mS,{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...FS.map(WS),{kind:`segment`,name:cS}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:rS},{kind:`segment`,name:aS},Yc(sS,hS,{kind:`container`,direction:`horizontal`,children:IS.map(WS)},`drop`),Yc(gS,_S,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:xS},...Ix.map(e=>({kind:`segment`,name:wS(e.name)}))]},`drop`),{kind:`segment`,name:tS}]}]},`above`):e:ZS(e)}function ZS(e){return{...e,children:e.children.map(e=>XS(e))}}function QS(e){let t={variables:{[$x]:$c($x,Wc)},actions:{[pS]:el($x,eS),[$x]:{do:[pS,...VS.map(e=>e.disarm)]},[sS]:el(sS,eS),[gS]:el(gS,eS),[SS]:{doctor:`run`},[nS]:{set:mS.key,to:Wc},[tS]:{do:[B_,nS]},...iS.actions,...oS.actions,[cS]:{save:!0},[vS]:{undo:!0},[yS]:{redo:!0},[uS]:{preset:`save`},[dS]:{preset:`delete`,name:`{{ .${bb.preset.effectiveVar} }}`}},segments:{[$x]:{template:Qc($x,e,`❌`)},[rS]:{template:iS.template},[aS]:{template:oS.template},[cS]:BS,[sS]:{template:Qc(sS,`⚙ config ▸`,`⚙ config ▾`)},[gS]:{template:Qc(gS,`🧰 tools ▸`,`🧰 tools ▾`)},[xS]:{template:`{{ action "${SS}" "🩺 doctor" }}`},[tS]:{template:`{{ action "${tS}" "✎ edit" "✎ done" }}`}}};for(let e of zS)t.variables[e.count]={kind:`input`,path:e.path,type:`number`,default:0};return t.variables[sS]=$c(sS,Wc),t.variables[gS]=$c(gS,Wc),Object.assign(t.variables,oS.variables,LS.variables),eC(t),$S(t),t}function $S(e){for(let t of Ix){let n=Bx(t.name),r=CS(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[wS(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${So}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function eC(e){for(let t of NS){Object.assign(e.actions,t.control.actions);let n=AS(t.name);e.actions[n]={reset:t.configKey};let r=`{{ action "${n}" "↺" }}`;if(t.control.kind===`inline`){e.segments[OS(t.name)]={template:`${t.control.template} ${r}`};continue}let i=US(t.name),a=p_(i.key,i.member);e.variables[i.key]=$c(i.key,Wc),e.actions[a]=el(i.key,i.member),e.segments[OS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} ${Qc(a,`▸`,`▾`)} `+r},e.segments[jS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[MS(t.name,r)]={template:n}})}Object.assign(e.actions,LS.actions)}function tC(e){e.variables[z_]=$c(z_,Wc),e.actions[B_]=el(z_,V_)}function nC(e){let t=QS(e.globals.menuGlyph??`🍫`);tC(t);let n={...e.presets},r=[];for(let t of x_(e.presets)){let{node:i}=w_(e,t),a=XS(qS(i));r.push(a),n[t]={...C_(e.presets,t),root:a}}let i=Eb(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const rC=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function iC(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function aC(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function oC(e,t){if(t===void 0)return{};if(!rc(t))return Z(e,`actions`,`actions must be an object, got ${ic(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=sC(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 sC(e,t,n){if(!rc(n))return Z(e,t,`${t} must be an action object, got ${ic(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=rC.filter(e=>e in n);return r.length===1?cC[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${rC.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const cC={set:(e,t,n)=>BC(e,t,n,`set`,IC),persist:(e,t,n)=>BC(e,t,n,`persist`,LC),copy:lC(`copy`),open:lC(`open`),reset:uC,undo:fC(`undo`),redo:fC(`redo`),save:fC(`save`),preset:pC,doctor:mC,ceiling:hC,slash:gC,do:_C};function lC(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=Qs(t,n,r,e);return i===null?null:{[e]:i}}}function uC(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=vC(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 dC={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 fC(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 — ${dC[e]}), got ${G(r[e])}`),null)}}function pC(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=Qs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function mC(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`||Rx(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Ix.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function hC(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 gC(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=Jx(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function _C(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 vC(e,t,n,r,i,a){let o=Qs(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 yC={set:`the SessionState key to write`,persist:`the config globals field to write`};function bC(e,t,n,r){let i=yC[r],a=vC(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 xC(e){return e===`set`?`set-state`:`set-config`}const SC={to:VC(`set`)},CC={to:VC(`persist`)},wC={from:HC(`set`)},TC={from:HC(`persist`)},EC={min:qC(),max:qC(),by:qC()},DC={int:WC()},OC={cycle:UC(`set`)},kC={cycle:UC(`persist`)},AC={removeSegment:GC(`removeSegment`)},jC={insertSegment:GC(`insertSegment`),anchor:GC(`anchor`),relation:KC()},MC={insertSegmentFrom:HC(`persist`),anchor:GC(`anchor`),relation:KC()},NC={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},PC={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function FC(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>oc(e,t,n,r),c=wc(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?mc(s,...n):s}}const IC=[FC(`set`,SC),FC(`set`,wC),FC(`set`,EC,[NC,PC]),FC(`set`,DC),FC(`set`,OC)],LC=[FC(`persist`,CC),FC(`persist`,TC),FC(`persist`,EC,[NC,PC]),FC(`persist`,kC),FC(`persist`,AC),FC(`persist`,jC,[],[`insertSegment`]),FC(`persist`,MC,[],[`insertSegmentFrom`])];function RC(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 zC(e){let t=RC(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 BC(e,t,n,r,i){let a=bC(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${zC(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 VC(e){let t=xC(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>vC(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 HC(e){let t=xC(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 UC(e){let t=xC(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 ${ic(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 WC(){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 GC(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Qs(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 KC(){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 qC(){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 JC={noun:`look key`,fields:{hueShift:vc(),chromaScale:vc({min:0}),lightnessScale:vc(),lightnessShift:vc()}};function YC(e,t){if(!rc(t))return e.issues.push({path:`looks`,message:`looks must be an object mapping look names to adaptation objects, got ${ic(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=ac(e,JC,`looks.${r}`,i);t!==null&&(n[r]={...Ln,...t})}return n}const XC={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:od(e,`${t}.${n}`,r[n])},globals:{required:!1,json:wl(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Cl(e,`${t}.${n}`,r[n])}}};function ZC(e,t){if(!rc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${ic(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=ac(e,XC,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function QC(e,t){if(t===void 0)return{};if(!rc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${ic(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}const $C=new Map([[`session.budget.amount`,{segment:`session`,setting:`budget`}],[`session.budget.warningThreshold`,{segment:`session`,setting:`warnAt`}],[`today.budget.amount`,{segment:`today`,setting:`budget`}],[`today.budget.warningThreshold`,{segment:`today`,setting:`warnAt`}],[`block.budget.heatThreshold`,{segment:`block`,setting:`warnAt`}],[`block.budget.warningThreshold`,{segment:`block`,setting:`errorAt`}],[`weekly.budget.heatThreshold`,{segment:`weekly`,setting:`warnAt`}],[`weekly.budget.warningThreshold`,{segment:`weekly`,setting:`errorAt`}],[`burn.eta.errorMinutes`,{segment:`burnrate`,setting:`errorWithin`}],[`burn.eta.warnMinutes`,{segment:`burnrate`,setting:`warnWithin`}]]);function ew(e){return`it became the "${e.setting}" setting of each "${e.segment}" placement — set it on the placement where a row places "${e.segment}" ({ seg: "${e.segment}", settings: { ${e.setting}: <value> } }), or redeclare segments.${e.segment}.settings.${e.setting} with the default every placement should start from`}function tw(e){let t=$C.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${ew(t)}`}function nw(e){let t=$C.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${ew(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function rw(e,t){let n=new Map;for(let e of Object.keys(t)){let t=pu(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 iw(e,t,n){let r=[[[`globals`],t.globals.look],[[`editGlobals`],t.editGlobals.look],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.look])];for(let[n,i]of r)i===void 0||$a(i)||Object.prototype.hasOwnProperty.call(t.looks,i)||e.issues.push({path:`${n.join(`.`)}.look`,message:`${n.join(`.`)}.look "${i}" does not match any declared look (have: ${Object.keys(t.looks).join(`, `)})`,line:W(e.source,[...n,`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`])}),rw(e,t.presets);let i=Vb(t);for(let[n,r]of Object.entries(t.actions))!(`set`in r)||!(`from`in r)||typeof r.from!=`string`||Hb(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${Hb(i).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&&aC(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=Qb(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Ol().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=aw.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`){ow(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!x_(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: ${x_(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(`, `)})${Su(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 a=pv(t);for(let t of a.names)t!==`settings`&&!t.startsWith(sw)||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 o=(t,n,r)=>{JS(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" ${JS(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}),YS(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" 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}),s(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 Ms(t)){if(e.kind!==`segment`)continue;let t=Os(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=As(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 s(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>s(n,t||Ds[e.direction]===`cell`))}let c=(n,r)=>{for(let[i,o]of Lc(n,r)){let n=W(e.source,o.split(`.`));if(i.when!==void 0&&(yw(e,`${o}.when`,i.when,a,{line:n}),vw(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(GS(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${$x}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${$x}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:o,message:`${r} entry "${i.name}" does not match any declared segment${Su(i.name)}`,line:n}),hw(e,t,i,o,n)}}};n.root!==void 0&&c(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&c(t.root,`presets.${e}.root`);let l=new Map([[`root`,Fc(t.root)]]);for(let e of x_(t.presets)){let{node:n,path:r}=w_(t,e);l.set(r,n)}for(let[t,n]of l)o(n,t,W(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){gw(e,`variables.${n}`,r,a);let t=tw(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:W(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))gw(e,`segments.${n}.vars.${t}`,i,a,n);let i=Us(r);lw(e,n,i);let o=cw(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){yw(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of dv(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=i===`options`?` (in a picker, menu or carousel)`:``;if(o!==null){bw(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"${s}`,line:W(e.source,[`segments`,n,a])})}}}}for(let[n,r]of Object.entries(t.variables))_w(e,`variables.${n}`,r,a);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,i]of Object.entries(r.vars))_w(e,`segments.${n}.vars.${t}`,i,a,n)}const aw=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function ow(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!x_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${x_(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(`, `)})${Su(i)}`,line:c})},p=new Set(ks(w_(t,a).node)),m=(r,i)=>{!xu.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${Su(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 sw=`settings.`;function cw(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>sw+e)])}}function lw(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:W(e.source,[`segments`,t,`settings`,n])})},a=fw(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Gs(n,dw(n)))i(e,`the defaults do not stand together: ${t}`)}function uw(e){return fw(e).length>0||Gs(e,dw(e)).length>0}function dw(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function fw(e){let t=t=>Ws(pw(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Ws(pw(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${mw(e,n).join(`, `)||`none`})`}];let i=[n];for(let e=r;e!==void 0;e=t(e)){if(e===n)return i.every(e=>n<=e)?[{setting:n,message:`atLeast closes a cycle (${[...i,n].join(` ≥ `)}) — every setting on it could only ever equal the rest`}]:[];if(i.includes(e))return[];i.push(e)}return[]})}function pw(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function mw(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Ws(n)!==void 0).map(([e])=>e)}function hw(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=Us(a),s=`${r}: placement "${Os(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(`, `)})`:Ks(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Wa(a):``}, but it must be ${Ys(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Ks(o[e],t))||uw(o)))for(let{message:t}of Gs(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function gw(e,t,n,r,i){n.kind===`template`&&yw(e,`${t}.template`,n.template,r,{segCtx:i}),zs(n)&&n.cache&&`key`in n.cache&&yw(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function _w(e,t,n,r,i){if(zs(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 vw(e,t,n,r){try{R_.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function yw(e,t,n,r,i){for(let[a,o]of sv(n,r.helpers)){if(fv(a,r))continue;if(a.startsWith(sw)){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){bw(e,o,`Template references unknown variable ".${a}"${nw(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&fv(n,r)?` (segment-local vars are namespaced — write ".${n}")`:nw(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function bw(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:W(e.source,[`helpers`,t])})}function xw(e,t){let{graph:n,nodeInfo:r}=Sw(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 Sw(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 sv(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),zs(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 Cw=[`json5`,`json`];function ww(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Tw(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?p.homedir()+e.slice(1):e}function Ew(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Cw.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...Cw.map(e=>c.join(r,`.cc-candybar.${e}`)),...Cw.map(e=>`${Dw()}.${e}`)])]}function Dw(){let e=process.env.XDG_CONFIG_HOME??c.join(p.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function Ow(e,t,n){let r=[];for(let i of Ew(e,t,n)){let e=ww(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 kw(e,t,n){let r=Ow(e,t,n);return r.kind===`default`?`${Dw()}.${Cw[0]}`:r.path}function Aw(e){return jw(e).join(`
158
- `)||null}function jw(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 Mw(e,t){let n=Ew(e,t).filter(e=>ww(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 Nw(e,t,n){return e===null?{...Fw,config:Bc(Fw.raw,t)}:Pw(e,r.readFileSync(e,`utf-8`),t,n)}function Pw(e,t,n,r){let i={source:t,...Rw(e,t,r,Iu(n))};return{...i,config:Bc(i.raw,n)}}const Fw={raw:{},source:``,warnings:[]};function Iw({config:e,raw:t,source:n},r=`<config>`,i=new Set(qa())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(iw(o,e,t),xw(o,e),a.length>0)throw new xs(r,a);let s=L_(e,a);if(a.length>0)throw new xs(r,a);return Mx(nC(s))}function Lw(e,t,n=new Set(qa()),r=zw){return Rw(e,t,n,r).raw}function Rw(e,t,n,r){let i=Bw(e,t),a=ws(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(qa()),groups:[]};if(!rc(i))throw new xs(e,[{path:``,message:`Config root must be an object, got ${ic(i)}`}],o);let l=Vw(c,i,r);if(s.length>0)throw new xs(e,s,o);return{raw:l,warnings:o}}const zw=new Set;function Bw(e,t){try{return Qe.default.parse(t)}catch(t){let n=t;throw new xs(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function Vw(e,t,n){for(let n of Object.keys(t))Hw.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...Hw].join(`, `)}`,line:W(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Sl(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Hl(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Lu(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.
157
+ `,ox=`${gu}live`,sx=[`☐ live`,`☑ live`],cx=`${gu}done`,lx={variable:ox,key:ox,member:`open`},ux=`and ${Zc(W_)} (not ${Zc(lx)})`,dx=`{{ ${ux} }}`;function fx(e,t){return`{{ if ${ux} }}${e}{{ else }}${t}{{ end }}`}const px=`{{ and ${Zc(W_)} .preset.customized }}`,mx=vu,hx=`${gu}addable`;function gx(e){return new Map([[hx,{members:Object.keys(e.segments).filter(e=>!mx(e))}]])}function _x(e,t,n){return n.segments[e]={template:t,when:G_},{kind:`segment`,name:e}}function vx(e,t,n){let r=`${gu}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ action "${r}" "🚫" }}`}function yx(e){return`{{ if ${Zc(W_)} }}${e.join(``)}{{ end }}`}function bx(e,t){return e.reduce((e,t)=>`{{ if ${Zc(t)} }}true{{ else }}${e}{{ end }}`,t)}function xx(e){return e.flatMap(e=>[...Ms(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.mode`?[e.opens.ref]:[]))}function Sx(e,t,n){return`${H_}${e}.${t}.${n}`}function Cx(e,t,n,r){let i=Os(n),a=`${gu}${e.presetIdent}`,o=U_(e.presetIdent,i),s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:z_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Sx(e.presetIdent,i,r),l=`${H_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:qs(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=Kb(Wb(o),s,l,u);return Object.assign(e.artifacts.actions,d.actions),e.artifacts.segments[u]={template:d.kind===`ring`?`{{ "${Jc(o.label)}" }} ${d.template}`:d.template},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "⚙" }}`,ref:{variable:z_,key:z_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const wx=`${gu}label:`;function Tx(e){if(e.startsWith(wx)){let t=e.slice(wx.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Ex(e,t,n,r){let i=Os(e),a=`${wx}${i}:${e.name}`;n.segments[a]={template:`{{ "${Jc(i)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let o=e.settings?.[Hs];return{...Yc(a,r.ref,r.body,`drop`,bx([r.ref],dx)),...o!==void 0&&{settings:{theme:o}},drafts:{[Hs]:r.drafts[Hs]}}}function Dx(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${gu}${i}.insert.${t}`,s=`${gu}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:hx,anchor:n,relation:r};let c=u_(o),l=d_(s,o,void 0),u=m_(l),d=p_(l,c);return a.variables[l]=$c(l,Wc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=el(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${Zc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${wa}`}) $m }}{{ end }}`}}function Ox(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!mx(e.name)),i=e=>Ox(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=js(o,i);if(mx(o.name)){n.push(s);continue}let c=Os(o),l=a===r?[Dx(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Dx(t,u,c,`after`),f=vx(t,u,c),p=t.segments[o.name],m=Cx(t,u,o,Us(p)),h=yx([m.term,f]),g={kind:`container`,direction:`horizontal`,children:[...l.map(e=>_x(e.host,e.template,t.artifacts)),{...Ex(o,p,t.artifacts,m),trail:h},{...s,when:fx(`false`,o.when??`true`),trail:h,drafts:m.drafts},_x(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:bx(xx(n),fx(`true`,e.when))}}}function kx(e,t,n,r,i,a,o){let s=`${gu}${n}.resetLayout`,c=`${gu}${n}.customized`;i.actions[s]={reset:r};let l=Jc(t);return i.segments[c]={template:`{{ action "${s}" "↺ ${l} customized" }}`,when:px},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},Ax(e,o)]}}function Ax(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),Ax(n,t)]}:{...e,children:[...e.children,t]}}function jx(e,t,n,r,i){let{node:a}=w_(e,t),o={presetIdent:pu(t),rootKey:Xb(t),segments:e.segments,artifacts:n,posCounter:{n:0}};return kx(Ox(a,o),t,o.presetIdent,o.rootKey,n,r,i)}function Mx(e){let t={variables:{},actions:{},segments:{}},n=tx(`${gu}help`,ix,[W_],t);t.variables[ox]=$c(ox,Wc),t.actions[ox]=el(ox,lx.member),t.segments[ox]={template:Qc(ox,...sx),when:G_};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ox},n]};t.segments[cx]={template:`{{ action "${B_}" "✎ done" }}`,when:G_};let i={kind:`segment`,name:cx},a={...e.presets},o=[];for(let n of x_(e.presets)){let s=jx(e,n,t,i,r);o.push(s),a[n]={...C_(e.presets,n),root:s}}let s=Eb(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Nx={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Px(e){let t=e[Nx.socket]??``,n=e[Nx.pane]??``;if(t===``||n===``)return null;let r=e[Nx.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Fx=Nx.truecolor,Ix=[{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[Fx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Fx} 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:Fx,value:`1`}}}}}}];function Lx(e){return Ix.map(t=>({check:t,verdict:t.probe(e)}))}function Rx(e){return Ix.find(t=>t.name===e)}const zx=`${K}doctor.`;function Bx(e){let t=`${zx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Vx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Bx(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:Co}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?Co:So}]})}const Hx={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Ux(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(Hx).map(([t,n])=>[`${e}${t}`,n]))}}const Wx=`armed`,Gx=`disarmed`;function Kx(e,t,n){let r=`${e}.arm`,i=`${e}.disarm`,a=`(eq .${e} "${Wx}")`;return{template:`{{ if ${a} }}{{ action "${e}" "${t.confirm}" }} {{ action "${i}" "✕" }}{{ else }}{{ action "${r}" "${t.arm}" }}{{ end }}`,actions:{[r]:{set:e,to:Wx},[i]:{set:e,to:Gx},[e]:{do:[i,...n]}},armed:a,variables:{[e]:{kind:`state`,key:e,default:Gx}},disarm:i}}const qx=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Jx(e){return typeof e==`string`&&qx.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 Yx(e){let t=Jx(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Xx=[`/compact`,`/model`],Zx=`/clear`;function Qx(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=Kx(`${e}clear`,{arm:Zx,confirm:`${Zx} ✓ confirm`},[n]);return{template:Xx.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(Xx.map(e=>[t(e),{slash:Yx(e)}])),...r.actions,[n]:{slash:Yx(Zx)}},variables:r.variables,disarm:r.disarm}}const $x=`${K}menu`,eS=`open`,tS=`${K}edit`,nS=`${K}close`,rS=`${K}toolbar`,iS=Ux(K),aS=`${K}commands`,oS=Qx(`${aS}.`),sS=`${K}config`,cS=`${K}save`,lS=`${K}unsaved`,uS=`${K}preset.save`,dS=`${K}preset.delete`,fS=`${K}resetAll`,pS=`${$x}.toggle`,mS={variable:$x,key:$x,member:eS},hS={variable:sS,key:sS,member:eS},gS=`${K}tools`,_S={variable:gS,key:gS,member:eS},vS=`${K}undo`,yS=`${K}redo`,bS=`${K}resettable`,xS=`${K}doctor`,SS=`${xS}.run`,CS=e=>`${xS}.fix.${e}`,wS=e=>`${xS}.${e}`,TS=`${K}pickers`,ES=[`{{ themePreview }}`],DS={preset:[`{{ layoutPreview }}`,`{{ action "${uS}" "⊕ save as preset" }}{{ if not .preset.bundled }} {{ action "${dS}" (printf "🗑 delete %s" .${bb.preset.effectiveVar}) }}{{ end }}`],theme:ES,style:ES,variation:[`{{ layoutPreview }}`]},OS=e=>`${K}${e}`,kS=e=>`${K}apply.${e}`,AS=e=>`${K}reset.${e}`,jS=e=>`${K}carousel.${e}`,MS=(e,t)=>`${jS(e)}.${t}`,NS=Object.keys(bb).map(e=>{let t=bb[e],n=dl(t.configKey);if(n===`text`)throw Error(`settings menu: globals.${t.configKey} is free text, which no control can change — list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);let r=Kb({label:t.label,domain:n},t.sessionKey,t.effectiveVar,kS(e));return{...t,name:e,control:r,beneath:DS[e]??[]}}),PS=new Set([`preset`]),FS=NS.filter(e=>PS.has(e.name)),IS=NS.filter(e=>!PS.has(e.name));new Set(NS.flatMap(e=>[e.sessionKey,e.configKey]));const LS=Kx(fS,{arm:`⟲`,confirm:`⟲ reset all?`},NS.map(e=>AS(e.name))),RS=(e,t,n)=>({count:e,path:t,body:n,shown:`(gt .${e} 0)`}),zS=[RS(lS,`unsaved`,`{{ action "${cS}" (printf "💾 save %d" .${lS}) }}`),RS(`${K}history.undo`,`history.undo`,`{{ action "${vS}" "↶" }}`),RS(`${K}history.redo`,`history.redo`,`{{ action "${yS}" "↷" }}`),{count:bS,path:`resettable`,body:LS.template,shown:`(or (gt .${bS} 0) ${LS.armed})`}],BS={when:`{{ or ${zS.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+zS.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},VS=[LS,oS],HS=f_(TS),US=e=>({variable:HS,key:HS,member:u_(kS(e))});function WS(e){let t=OS(e.name);return e.control.kind===`inline`?{kind:`segment`,name:t}:Yc(t,US(e.name),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:jS(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:MS(e.name,n)}))]},`drop`)}function GS(e){return e===$x}function KS(e){let t={kind:`segment`,name:$x};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[KS(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 qS(e){return JS(e)>0?e:KS(e)}function JS(e){let t=0;for(let n of Ms(e))n.kind===`segment`&&GS(n.name)&&(t+=1);return t}function YS(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&GS(e.name)||e.opens!==void 0&&YS(e.opens.body,!0):e.children.some(e=>YS(e,n))}function XS(e){return e.kind===`segment`?GS(e.name)?Yc(e.name,mS,{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...FS.map(WS),{kind:`segment`,name:cS}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:rS},{kind:`segment`,name:aS},Yc(sS,hS,{kind:`container`,direction:`horizontal`,children:IS.map(WS)},`drop`),Yc(gS,_S,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:xS},...Ix.map(e=>({kind:`segment`,name:wS(e.name)}))]},`drop`),{kind:`segment`,name:tS}]}]},`above`):e:ZS(e)}function ZS(e){return{...e,children:e.children.map(e=>XS(e))}}function QS(e){let t={variables:{[$x]:$c($x,Wc)},actions:{[pS]:el($x,eS),[$x]:{do:[pS,...VS.map(e=>e.disarm)]},[sS]:el(sS,eS),[gS]:el(gS,eS),[SS]:{doctor:`run`},[nS]:{set:mS.key,to:Wc},[tS]:{do:[B_,nS]},...iS.actions,...oS.actions,[cS]:{save:!0},[vS]:{undo:!0},[yS]:{redo:!0},[uS]:{preset:`save`},[dS]:{preset:`delete`,name:`{{ .${bb.preset.effectiveVar} }}`}},segments:{[$x]:{template:Qc($x,e,`❌`)},[rS]:{template:iS.template},[aS]:{template:oS.template},[cS]:BS,[sS]:{template:Qc(sS,`⚙ config ▸`,`⚙ config ▾`)},[gS]:{template:Qc(gS,`🧰 tools ▸`,`🧰 tools ▾`)},[xS]:{template:`{{ action "${SS}" "🩺 doctor" }}`},[tS]:{template:`{{ action "${tS}" "✎ edit" "✎ done" }}`}}};for(let e of zS)t.variables[e.count]={kind:`input`,path:e.path,type:`number`,default:0};return t.variables[sS]=$c(sS,Wc),t.variables[gS]=$c(gS,Wc),Object.assign(t.variables,oS.variables,LS.variables),eC(t),$S(t),t}function $S(e){for(let t of Ix){let n=Bx(t.name),r=CS(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[wS(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${So}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function eC(e){for(let t of NS){Object.assign(e.actions,t.control.actions);let n=AS(t.name);e.actions[n]={reset:t.configKey};let r=`{{ action "${n}" "↺" }}`;if(t.control.kind===`inline`){e.segments[OS(t.name)]={template:`${t.control.template} ${r}`};continue}let i=US(t.name),a=p_(i.key,i.member);e.variables[i.key]=$c(i.key,Wc),e.actions[a]=el(i.key,i.member),e.segments[OS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} ${Qc(a,`▸`,`▾`)} `+r},e.segments[jS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[MS(t.name,r)]={template:n}})}Object.assign(e.actions,LS.actions)}function tC(e){e.variables[z_]=$c(z_,Wc),e.actions[B_]=el(z_,V_)}function nC(e){let t=QS(e.globals.menuGlyph??`🍫`);tC(t);let n={...e.presets},r=[];for(let t of x_(e.presets)){let{node:i}=w_(e,t),a=XS(qS(i));r.push(a),n[t]={...C_(e.presets,t),root:a}}let i=Eb(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const rC=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function iC(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function aC(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function oC(e,t){if(t===void 0)return{};if(!rc(t))return Z(e,`actions`,`actions must be an object, got ${ic(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=sC(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 sC(e,t,n){if(!rc(n))return Z(e,t,`${t} must be an action object, got ${ic(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=rC.filter(e=>e in n);return r.length===1?cC[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${rC.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const cC={set:(e,t,n)=>BC(e,t,n,`set`,IC),persist:(e,t,n)=>BC(e,t,n,`persist`,LC),copy:lC(`copy`),open:lC(`open`),reset:uC,undo:fC(`undo`),redo:fC(`redo`),save:fC(`save`),preset:pC,doctor:mC,ceiling:hC,slash:gC,do:_C};function lC(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=Qs(t,n,r,e);return i===null?null:{[e]:i}}}function uC(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=vC(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 dC={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 fC(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 — ${dC[e]}), got ${G(r[e])}`),null)}}function pC(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=Qs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function mC(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`||Rx(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Ix.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function hC(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 gC(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=Jx(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function _C(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 vC(e,t,n,r,i,a){let o=Qs(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 yC={set:`the SessionState key to write`,persist:`the config globals field to write`};function bC(e,t,n,r){let i=yC[r],a=vC(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 xC(e){return e===`set`?`set-state`:`set-config`}const SC={to:VC(`set`)},CC={to:VC(`persist`)},wC={from:HC(`set`)},TC={from:HC(`persist`)},EC={min:qC(),max:qC(),by:qC()},DC={int:WC()},OC={cycle:UC(`set`)},kC={cycle:UC(`persist`)},AC={removeSegment:GC(`removeSegment`)},jC={insertSegment:GC(`insertSegment`),anchor:GC(`anchor`),relation:KC()},MC={insertSegmentFrom:HC(`persist`),anchor:GC(`anchor`),relation:KC()},NC={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},PC={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function FC(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>oc(e,t,n,r),c=wc(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?mc(s,...n):s}}const IC=[FC(`set`,SC),FC(`set`,wC),FC(`set`,EC,[NC,PC]),FC(`set`,DC),FC(`set`,OC)],LC=[FC(`persist`,CC),FC(`persist`,TC),FC(`persist`,EC,[NC,PC]),FC(`persist`,kC),FC(`persist`,AC),FC(`persist`,jC,[],[`insertSegment`]),FC(`persist`,MC,[],[`insertSegmentFrom`])];function RC(e){let t=[`"to" (a literal value)`,`"from" (an option domain — a registered domain name like "themes"/"endcaps"/"styles", or an inline array of literal values)`,`"min"/"max"/"by" (a bounded step)`];return e===`set`&&t.push(`"int" (an unbounded integer cursor)`),t.push(`"cycle" (an enumerated domain stepped in order)`),e===`persist`&&t.push(`"removeSegment" (remove a named segment from the layout)`,`"insertSegment"/"anchor"/"relation" (insert a named segment before/after an existing one)`,`"insertSegmentFrom"/"anchor"/"relation" (insert a segment PICKED from an option domain before/after an existing one)`),t}function zC(e){let t=RC(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 BC(e,t,n,r,i){let a=bC(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${zC(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 VC(e){let t=xC(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>vC(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 HC(e){let t=xC(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 UC(e){let t=xC(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 ${ic(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 WC(){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 GC(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Qs(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 KC(){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 qC(){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}}}function JC(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const YC={noun:`style key`,fields:{hueShift:vc(),chromaScale:vc({min:0}),lightnessScale:vc(),lightnessShift:vc()}};function XC(e,t){if(!rc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${ic(t)}`,line:W(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:W(e.source,[`styles`,r])});continue}if(so(r)){e.issues.push({path:`styles.${r}`,message:JC(`styles.${r}`,r,`globals.endcaps`),line:W(e.source,[`styles`,r])});continue}let t=ac(e,YC,`styles.${r}`,i);t!==null&&(n[r]={...Ln,...t})}return n}const ZC={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:od(e,`${t}.${n}`,r[n])},globals:{required:!1,json:wl(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Cl(e,`${t}.${n}`,r[n])}}};function QC(e,t){if(!rc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${ic(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=ac(e,ZC,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function $C(e,t){if(t===void 0)return{};if(!rc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${ic(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}const ew=new Map([[`session.budget.amount`,{segment:`session`,setting:`budget`}],[`session.budget.warningThreshold`,{segment:`session`,setting:`warnAt`}],[`today.budget.amount`,{segment:`today`,setting:`budget`}],[`today.budget.warningThreshold`,{segment:`today`,setting:`warnAt`}],[`block.budget.heatThreshold`,{segment:`block`,setting:`warnAt`}],[`block.budget.warningThreshold`,{segment:`block`,setting:`errorAt`}],[`weekly.budget.heatThreshold`,{segment:`weekly`,setting:`warnAt`}],[`weekly.budget.warningThreshold`,{segment:`weekly`,setting:`errorAt`}],[`burn.eta.errorMinutes`,{segment:`burnrate`,setting:`errorWithin`}],[`burn.eta.warnMinutes`,{segment:`burnrate`,setting:`warnWithin`}]]);function tw(e){return`it became the "${e.setting}" setting of each "${e.segment}" placement — set it on the placement where a row places "${e.segment}" ({ seg: "${e.segment}", settings: { ${e.setting}: <value> } }), or redeclare segments.${e.segment}.settings.${e.setting} with the default every placement should start from`}function nw(e){let t=ew.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${tw(t)}`}function rw(e){let t=ew.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${tw(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function iw(e,t){let n=new Map;for(let e of Object.keys(t)){let t=pu(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 aw(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||$a(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:so(i)?JC(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:W(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:W(e.source,[`globals`,`preset`])}),iw(e,t.presets);let i=Vb(t);for(let[n,r]of Object.entries(t.actions))!(`set`in r)||!(`from`in r)||typeof r.from!=`string`||Hb(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${Hb(i).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&&aC(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=Qb(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Ol().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=ow.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`){sw(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!x_(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: ${x_(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(`, `)})${Su(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 a=pv(t);for(let t of a.names)t!==`settings`&&!t.startsWith(cw)||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 o=(t,n,r)=>{JS(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" ${JS(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}),YS(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" 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}),s(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 Ms(t)){if(e.kind!==`segment`)continue;let t=Os(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=As(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 s(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>s(n,t||Ds[e.direction]===`cell`))}let c=(n,r)=>{for(let[i,o]of Lc(n,r)){let n=W(e.source,o.split(`.`));if(i.when!==void 0&&(bw(e,`${o}.when`,i.when,a,{line:n}),yw(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(GS(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${$x}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${$x}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:o,message:`${r} entry "${i.name}" does not match any declared segment${Su(i.name)}`,line:n}),gw(e,t,i,o,n)}}};n.root!==void 0&&c(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&c(t.root,`presets.${e}.root`);let l=new Map([[`root`,Fc(t.root)]]);for(let e of x_(t.presets)){let{node:n,path:r}=w_(t,e);l.set(r,n)}for(let[t,n]of l)o(n,t,W(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){_w(e,`variables.${n}`,r,a);let t=nw(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:W(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))_w(e,`segments.${n}.vars.${t}`,i,a,n);let i=Us(r);uw(e,n,i);let o=lw(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){bw(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of dv(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=i===`options`?` (in a picker, menu or carousel)`:``;if(o!==null){xw(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"${s}`,line:W(e.source,[`segments`,n,a])})}}}}for(let[n,r]of Object.entries(t.variables))vw(e,`variables.${n}`,r,a);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,i]of Object.entries(r.vars))vw(e,`segments.${n}.vars.${t}`,i,a,n)}const ow=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function sw(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!x_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${x_(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(`, `)})${Su(i)}`,line:c})},p=new Set(ks(w_(t,a).node)),m=(r,i)=>{!xu.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${Su(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 cw=`settings.`;function lw(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>cw+e)])}}function uw(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:W(e.source,[`segments`,t,`settings`,n])})},a=pw(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Gs(n,fw(n)))i(e,`the defaults do not stand together: ${t}`)}function dw(e){return pw(e).length>0||Gs(e,fw(e)).length>0}function fw(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function pw(e){let t=t=>Ws(mw(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Ws(mw(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${hw(e,n).join(`, `)||`none`})`}];let i=[n];for(let e=r;e!==void 0;e=t(e)){if(e===n)return i.every(e=>n<=e)?[{setting:n,message:`atLeast closes a cycle (${[...i,n].join(` ≥ `)}) — every setting on it could only ever equal the rest`}]:[];if(i.includes(e))return[];i.push(e)}return[]})}function mw(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function hw(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Ws(n)!==void 0).map(([e])=>e)}function gw(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=Us(a),s=`${r}: placement "${Os(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(`, `)})`:Ks(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Wa(a):``}, but it must be ${Ys(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Ks(o[e],t))||dw(o)))for(let{message:t}of Gs(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function _w(e,t,n,r,i){n.kind===`template`&&bw(e,`${t}.template`,n.template,r,{segCtx:i}),zs(n)&&n.cache&&`key`in n.cache&&bw(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function vw(e,t,n,r,i){if(zs(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 yw(e,t,n,r){try{R_.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function bw(e,t,n,r,i){for(let[a,o]of sv(n,r.helpers)){if(fv(a,r))continue;if(a.startsWith(cw)){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){xw(e,o,`Template references unknown variable ".${a}"${rw(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&fv(n,r)?` (segment-local vars are namespaced — write ".${n}")`:rw(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function xw(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:W(e.source,[`helpers`,t])})}function Sw(e,t){let{graph:n,nodeInfo:r}=Cw(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 Cw(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 sv(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),zs(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 ww=[`json5`,`json`];function Tw(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Ew(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?p.homedir()+e.slice(1):e}function Dw(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?ww.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...ww.map(e=>c.join(r,`.cc-candybar.${e}`)),...ww.map(e=>`${Ow()}.${e}`)])]}function Ow(){let e=process.env.XDG_CONFIG_HOME??c.join(p.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function kw(e,t,n){let r=[];for(let i of Dw(e,t,n)){let e=Tw(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 Aw(e,t,n){let r=kw(e,t,n);return r.kind===`default`?`${Ow()}.${ww[0]}`:r.path}function jw(e){return Mw(e).join(`
158
+ `)||null}function Mw(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 Nw(e,t){let n=Dw(e,t).filter(e=>Tw(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 Pw(e,t,n){return e===null?{...Iw,config:Bc(Iw.raw,t)}:Fw(e,r.readFileSync(e,`utf-8`),t,n)}function Fw(e,t,n,r){let i={source:t,...zw(e,t,r,Iu(n))};return{...i,config:Bc(i.raw,n)}}const Iw={raw:{},source:``,warnings:[]};function Lw({config:e,raw:t,source:n},r=`<config>`,i=new Set(qa())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(aw(o,e,t),Sw(o,e),a.length>0)throw new xs(r,a);let s=L_(e,a);if(a.length>0)throw new xs(r,a);return Mx(nC(s))}function Rw(e,t,n=new Set(qa()),r=Bw){return zw(e,t,n,r).raw}function zw(e,t,n,r){let i=Vw(e,t),a=ws(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(qa()),groups:[]};if(!rc(i))throw new xs(e,[{path:``,message:`Config root must be an object, got ${ic(i)}`}],o);let l=Hw(c,i,r);if(s.length>0)throw new xs(e,s,o);return{raw:l,warnings:o}}const Bw=new Set;function Vw(e,t){try{return Qe.default.parse(t)}catch(t){let n=t;throw new xs(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function Hw(e,t,n){for(let n of Object.keys(t))Uw.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...Uw].join(`, `)}`,line:W(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Sl(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Hl(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Lu(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=od(e,`root`,t.root)),t.actions!==void 0&&(r.actions=oC(e,t.actions)),t.looks!==void 0&&(r.looks=YC(e,t.looks)),t.presets!==void 0&&(r.presets=ZC(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Tl(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=QC(e,t.helpers)),md(e,r),F_(e,r),J_(e,r),bu(e,r,K,`the global settings menu`),r}const Hw=new Set([`globals`,`variables`,`segments`,`layout`,`root`,`actions`,`looks`,`presets`,`editGlobals`,`helpers`]);function Uw(e){let t=Jw(e.termCols),n=Jw(e.termRows),r=Yw(e.ssh),i=Kw(e.tmux),a=Gw(e.configEnv),o=Ww(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 Ww(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function Gw(e){return typeof e==`string`&&e!==``?Tw(e):void 0}function Kw(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 qw=1e4;function Jw(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>qw?qw:t}function Yw(e){return typeof e==`boolean`?e:void 0}var Xw=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function Zw(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function Qw(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 Xw(`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 Xw(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function $w(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=Qw(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(Zw(t))})}async function eT(e,t,n){let r=null;try{r=await aT(Fe(),t.connectMs);let i=await $w(r,{v:3,...e},t.budgetMs);return rT(e.kind,i,n)}catch(e){return iT(e)}finally{r&&r.destroy()}}function tT(e,t){return typeof e==`string`?e:t}function nT(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function rT(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=tT(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:nT(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 iT(e){if(e instanceof Xw||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 aT(e,t){return new Promise((n,r)=>{let i=y.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 oT(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 sT={connectMs:50,budgetMs:150},cT={connectMs:50,budgetMs:200};function lT(e){let t=e.output;return typeof t==`string`?t:void 0}function uT(e,t,n,r){return eT({kind:`render`,hookData:e,args:t,cwd:n,...r},sT,lT)}function dT(e,t){return eT({kind:`click`,verb:e,value:t},cT,lT)}let fT=null;function pT(e){if(fT!==null)return fT;r.mkdirSync(c.dirname(e),{recursive:!0});try{fT=r.statSync(e).size}catch{fT=0}return fT}function mT(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{}fT=0}function Q(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=qe(),t=pT(e);r.appendFileSync(e,n),fT=t+Buffer.byteLength(n,`utf8`),fT>=5242880&&mT(e)}catch(e){fT=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}function hT(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 gT(e,t){return e===`darwin`?[_T(`footprint`,[`-p`,String(t)]),_T(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[vT(`/proc/self/smaps_rollup`),vT(`/proc/self/status`)]:[]}function _T(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=Oe({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}`}${yT(n.stderr)}`}}}}function vT(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 yT(e){let t=e.split(`
163
- `).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const bT=`CC_CANDYBAR_RSS_LIMIT_MB`;function xT(e){let t=e[bT];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${bT} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function ST(e){return xT(e)*2}const CT=1024*1024;function wT(e){return xT(e)*CT}const TT={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function ET(e,t,n){let{prefix:r,suffix:i}=TT[t];return c.join(e,`${r}${n}${i}`)}function DT(e){for(let t of Object.keys(TT)){let{prefix:n,suffix:r}=TT[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function OT(e){let t=e.rssLimitBytes??512*CT,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 kT(e.log,`memory report`,()=>{let t=ET(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),kT(e.log,`heap snapshot`,()=>{let t=ET(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),kT(e.log,`artifact rotation`,()=>{jT(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 kT(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function AT(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=DT(t);if(n===null)return t;let{prefix:r,suffix:i}=TT[n];return t.slice(r.length,t.length-i.length)}function jT(e,t,n){let r=new Map;for(let t of e){let e=AT(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 MT(e,t,n={}){let i=Pe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Q,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>hT(gT(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>ne.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>DT(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function NT(e={}){if(YT()!==null)return;let n=e.spawn??XT,r=KT();if(r.kind===`contended`){let e=FT();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),PT(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),PT(n);return}try{PT(n)}finally{JT()}}function PT(e){HT()&&IT(e)}function FT(){try{let e=r.statSync(Ue());return Date.now()-e.mtimeMs}catch{return null}}function IT(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 LT(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function RT(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function zT(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 BT(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 VT(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function HT(){let e=We(),n=Ge(),r=zT(n),i=LT(UT(e),RT(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`),WT(e),BT(n,Math.min(r+1,5)),!0)}function UT(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function WT(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 GT=null;function KT(){let e=Ue();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 GT={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(!qT(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 qT(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function JT(){if(!GT)return;let{fd:e,path:t}=GT;GT=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function YT(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function XT(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${ST(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const ZT=`cc-candybar`,QT=`dispatch`,$T=`set-state`,eE=`step-state`,tE=`copy`,nE=`open-vscode`,rE=`toolbar-toggle`,iE=`show-config-error`,aE=`show-config-warning`,oE=`set-config`,sE=`step-config`,cE=`save`,lE=`save-preset`,uE=`delete-preset`,dE=`reset-config`,fE=`apply-layout-op`,pE=`undo`,mE=`redo`,hE=`apply-update`,gE=`doctor-run`,_E=`doctor-fix`,vE=`ceiling`,yE=`slash`;function bE(e){return e.map(encodeURIComponent).join(`/`)}function xE(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function SE(e){return`${ZT}://${QT}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${bE(e.args)}`)}`).join(`&`)}`}function CE(e){return new w(e).getAll(`e`).map(DE)}const wE=new Set([$T,dE]);function TE(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&EE(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function EE(e,t){if(e.verb!==t.verb||!wE.has(e.verb))return;let[n,r]=[DE(e.value),DE(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function DE(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const OE=`1.98.0`;function kE(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function AE(e){return e??c.join(p.homedir(),`.claude`)}function jE(e){return c.join(e,`settings.json`)}function ME(e){return c.join(e,`plugins`,`installed_plugins.json`)}function NE(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function PE(e){let t;try{let n=NE(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${FE(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const FE=e=>e instanceof Error?e.message:String(e),IE=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function LE(e){let t=IE.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 RE(e){return e.join(`.`)}function zE([e,t,n],[r,i,a]){return e-r||t-i||n-a}const BE=`@promptctl/cc-candybar`;async function VE(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`?LE(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function HE(e,t){let n=LE(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=zE(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 UE(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${RE(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${RE(t.installed)} is newer than the registry's latest release (${RE(t.latest)}): an unpublished build.\n`};case`stale`:{let n=RE(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${RE(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 WE=`CCCandybarURLHandler`,GE=[],KE={"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 qE(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function JE(e,t){return[e,...t].map(qE).join(` `)}function YE(){return c.join(p.homedir(),`Applications`,`${WE}.app`)}function XE(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function ZE(){if(process.platform===`darwin`)return c.join(p.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(p.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function QE(){return c.join(ZE(),`bin`,`cc-candybar`)}function $E(){return c.join(ZE(),`dist`,`index.mjs`)}function eD(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 tD(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 nD(t){let n=KE[`${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 rD(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function iD(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 ${BE}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function aD(){let e=tD(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=nD(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname($E()),{recursive:!0}),r.mkdirSync(c.dirname(QE()),{recursive:!0}),rD(e,$E()),rD(t.sourcePath,QE()),r.chmodSync(QE(),493),r.rmSync(c.join(ZE(),`url-handler.mjs`),{force:!0});let n=iD(QE());return process.stdout.write(`Staged cc-candybar v${OE} runtime at ${ZE()}\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:QE(),distPath:$E(),entryKind:n}}function oD(){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>${ZT}</string>`,` </array>`,` </dict>`,`</array>`].join(`
166
- `)}]}function sD(e){let t=YE();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=Oe({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,eD(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 oD())Oe({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of oD()){let n=Oe({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 ${ZT}:// with Launch Services\n`);let a=Oe({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(`✓ ${WE}.app installed and registered.\n`),process.stdout.write(` Test: open '${ZT}://hello-world' && pbpaste\n`)}function cD(){XE(),sD(aD().distPath)}function lD(e,t=ZT){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:tE,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function uD(e){e||(process.stderr.write(`url-handle: missing URL argument.
167
- `),process.exit(1));let t;try{t=lD(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await dT(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(NT(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(dD(n)+`
168
- `),process.exit(1)}function dD(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 fD(){return`✓ install complete.
161
+ Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=od(e,`root`,t.root)),t.actions!==void 0&&(r.actions=oC(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" — move the block under styles: { … } (and globals.look to globals.style)`,line:W(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=XC(e,t.styles)),t.presets!==void 0&&(r.presets=QC(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Tl(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=$C(e,t.helpers)),md(e,r),F_(e,r),J_(e,r),bu(e,r,K,`the global settings menu`),r}const Uw=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function Ww(e){let t=Yw(e.termCols),n=Yw(e.termRows),r=Xw(e.ssh),i=qw(e.tmux),a=Kw(e.configEnv),o=Gw(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 Gw(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function Kw(e){return typeof e==`string`&&e!==``?Ew(e):void 0}function qw(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 Jw=1e4;function Yw(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>Jw?Jw:t}function Xw(e){return typeof e==`boolean`?e:void 0}var Zw=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function Qw(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function $w(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 Zw(`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 Zw(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function eT(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=$w(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(Qw(t))})}async function tT(e,t,n){let r=null;try{r=await oT(Fe(),t.connectMs);let i=await eT(r,{v:3,...e},t.budgetMs);return iT(e.kind,i,n)}catch(e){return aT(e)}finally{r&&r.destroy()}}function nT(e,t){return typeof e==`string`?e:t}function rT(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function iT(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=nT(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:rT(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 aT(e){if(e instanceof Zw||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 oT(e,t){return new Promise((n,r)=>{let i=y.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 sT(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 cT={connectMs:50,budgetMs:150},lT={connectMs:50,budgetMs:200};function uT(e){let t=e.output;return typeof t==`string`?t:void 0}function dT(e,t,n,r){return tT({kind:`render`,hookData:e,args:t,cwd:n,...r},cT,uT)}function fT(e,t){return tT({kind:`click`,verb:e,value:t},lT,uT)}let pT=null;function mT(e){if(pT!==null)return pT;r.mkdirSync(c.dirname(e),{recursive:!0});try{pT=r.statSync(e).size}catch{pT=0}return pT}function hT(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{}pT=0}function Q(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=qe(),t=mT(e);r.appendFileSync(e,n),pT=t+Buffer.byteLength(n,`utf8`),pT>=5242880&&hT(e)}catch(e){pT=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}function gT(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 _T(e,t){return e===`darwin`?[vT(`footprint`,[`-p`,String(t)]),vT(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[yT(`/proc/self/smaps_rollup`),yT(`/proc/self/status`)]:[]}function vT(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=Oe({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}`}${bT(n.stderr)}`}}}}function yT(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 bT(e){let t=e.split(`
163
+ `).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const xT=`CC_CANDYBAR_RSS_LIMIT_MB`;function ST(e){let t=e[xT];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${xT} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function CT(e){return ST(e)*2}const wT=1024*1024;function TT(e){return ST(e)*wT}const ET={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function DT(e,t,n){let{prefix:r,suffix:i}=ET[t];return c.join(e,`${r}${n}${i}`)}function OT(e){for(let t of Object.keys(ET)){let{prefix:n,suffix:r}=ET[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function kT(e){let t=e.rssLimitBytes??512*wT,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 AT(e.log,`memory report`,()=>{let t=DT(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),AT(e.log,`heap snapshot`,()=>{let t=DT(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),AT(e.log,`artifact rotation`,()=>{MT(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 AT(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function jT(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=OT(t);if(n===null)return t;let{prefix:r,suffix:i}=ET[n];return t.slice(r.length,t.length-i.length)}function MT(e,t,n){let r=new Map;for(let t of e){let e=jT(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 NT(e,t,n={}){let i=Pe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Q,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>gT(_T(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>ne.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>OT(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function PT(e={}){if(XT()!==null)return;let n=e.spawn??ZT,r=qT();if(r.kind===`contended`){let e=IT();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),FT(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),FT(n);return}try{FT(n)}finally{YT()}}function FT(e){UT()&&LT(e)}function IT(){try{let e=r.statSync(Ue());return Date.now()-e.mtimeMs}catch{return null}}function LT(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 RT(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function zT(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function BT(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 VT(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 HT(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function UT(){let e=We(),n=Ge(),r=BT(n),i=RT(WT(e),zT(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`),GT(e),VT(n,Math.min(r+1,5)),!0)}function WT(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function GT(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 KT=null;function qT(){let e=Ue();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 KT={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(!JT(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 JT(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function YT(){if(!KT)return;let{fd:e,path:t}=KT;KT=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function XT(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function ZT(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${CT(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const QT=`cc-candybar`,$T=`dispatch`,eE=`set-state`,tE=`step-state`,nE=`copy`,rE=`open-vscode`,iE=`toolbar-toggle`,aE=`show-config-error`,oE=`show-config-warning`,sE=`set-config`,cE=`step-config`,lE=`save`,uE=`save-preset`,dE=`delete-preset`,fE=`reset-config`,pE=`apply-layout-op`,mE=`undo`,hE=`redo`,gE=`apply-update`,_E=`doctor-run`,vE=`doctor-fix`,yE=`ceiling`,bE=`slash`;function xE(e){return e.map(encodeURIComponent).join(`/`)}function SE(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function CE(e){return`${QT}://${$T}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${xE(e.args)}`)}`).join(`&`)}`}function wE(e){return new w(e).getAll(`e`).map(OE)}const TE=new Set([eE,fE]);function EE(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&DE(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function DE(e,t){if(e.verb!==t.verb||!TE.has(e.verb))return;let[n,r]=[OE(e.value),OE(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function OE(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const kE=`1.99.0`;function AE(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function jE(e){return e??c.join(p.homedir(),`.claude`)}function ME(e){return c.join(e,`settings.json`)}function NE(e){return c.join(e,`plugins`,`installed_plugins.json`)}function PE(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function FE(e){let t;try{let n=PE(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${IE(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const IE=e=>e instanceof Error?e.message:String(e),LE=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function RE(e){let t=LE.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 zE(e){return e.join(`.`)}function BE([e,t,n],[r,i,a]){return e-r||t-i||n-a}const VE=`@promptctl/cc-candybar`;async function HE(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`?RE(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function UE(e,t){let n=RE(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=BE(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 WE(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${zE(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${zE(t.installed)} is newer than the registry's latest release (${zE(t.latest)}): an unpublished build.\n`};case`stale`:{let n=zE(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${zE(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 GE=`CCCandybarURLHandler`,KE=[],qE={"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 JE(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function YE(e,t){return[e,...t].map(JE).join(` `)}function XE(){return c.join(p.homedir(),`Applications`,`${GE}.app`)}function ZE(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function QE(){if(process.platform===`darwin`)return c.join(p.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(p.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function $E(){return c.join(QE(),`bin`,`cc-candybar`)}function eD(){return c.join(QE(),`dist`,`index.mjs`)}function tD(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 nD(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 rD(t){let n=qE[`${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 iD(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function aD(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 ${VE}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function oD(){let e=nD(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=rD(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(eD()),{recursive:!0}),r.mkdirSync(c.dirname($E()),{recursive:!0}),iD(e,eD()),iD(t.sourcePath,$E()),r.chmodSync($E(),493),r.rmSync(c.join(QE(),`url-handler.mjs`),{force:!0});let n=aD($E());return process.stdout.write(`Staged cc-candybar v${kE} runtime at ${QE()}\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:$E(),distPath:eD(),entryKind:n}}function sD(){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>${QT}</string>`,` </array>`,` </dict>`,`</array>`].join(`
166
+ `)}]}function cD(e){let t=XE();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=Oe({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,tD(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 sD())Oe({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of sD()){let n=Oe({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 ${QT}:// with Launch Services\n`);let a=Oe({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(`✓ ${GE}.app installed and registered.\n`),process.stdout.write(` Test: open '${QT}://hello-world' && pbpaste\n`)}function lD(){ZE(),cD(oD().distPath)}function uD(e,t=QT){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:nE,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function dD(e){e||(process.stderr.write(`url-handle: missing URL argument.
167
+ `),process.exit(1));let t;try{t=uD(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await fT(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(PT(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(fD(n)+`
168
+ `),process.exit(1)}function fD(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 pD(){return`✓ install complete.
169
169
  Restart Claude Code to pick up the new statusline.
170
- Tip: every bar carries a settings menu — click it (${Gc} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/look/style/wrap/padding controls.\n`}async function pD(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...GE],i=aD();process.platform===`darwin`?sD(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
171
- `),mD(i.binPath,r,t),process.stdout.write(fD());let a=UE(BE,HE(OE,await VE(BE,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function mD(e,t,n,i){let a=i??jE(AE(kE(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,qE(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:JE(e,t)},k(a,JSON.stringify(o,null,2)),process.stdout.write(`Updated ${a}\n`)}function hD(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 gD(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 _D(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 vD(e,t){let n=gD(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function yD(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 bD(e,t,n,r){let i=xD(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 xD(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 SD(e){let t=!1;function n(){let n=bD(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 CD(e,t=Oe){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 wD(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 TD(e,t=CD){let n=t(e);return n.kind===`start`?n.token:null}const ED=`CC_CANDYBAR_PARENT_PID`;function DD(e){let t=e[ED];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${ED} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function OD(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 kD(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function AD(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function jD(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 MD(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>c.join(e,t))}catch{return[]}}function ND(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 PD(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 FD(e){if(!e.isolated)return{decision:jD(!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=jD(!0,PD(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 ID(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function LD(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:He(),ceiling:AD(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>wD(e,t,{readStartTime:CD,pidAlive:kD}),listFiles:MD,readEntry:ND,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?Ie:e=>{Ie(c.dirname(e)),Ie(e)},...t}}function RD(e){return e<32||e===127||e>=128&&e<=159}function zD(e){let t=``;for(let n of e)t+=RD(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function BD(e,t){let n=zD(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const VD=`\x1B[38;2;255;255;255m`,HD=`\x1B[48;2;200;40;40m`;function UD(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 WD={fg:UD(VD),bg:UD(HD)},GD={fg:UD(`\x1B[38;2;0;0;0m`),bg:UD(`\x1B[48;2;220;160;40m`)},KD={unicode:Ii,ascii:{glyph:`>`,divider:`|`,lead:`<`,tail:`>`}},qD={unicode:{},ascii:{left:`(`,right:`)`}};function JD(e,t,n){switch(e){case`capsule`:return new Hi(qD[t]);case`plain`:return new Ui(n===void 0?{}:{separator:n});case`powerline`:return new zi(KD[t]);default:return e}}const YD=new Map;function XD(e){let t=JSON.stringify([e.style,e.charset,e.separator??null]),n=YD.get(t);if(n!==void 0)return n;let r=JD(e.style,e.charset,e.separator),i=e=>new H(`x`,{end:``,overflow:`ignore`,style:new B({bgcolor:e})}),a=e=>new H(Ki(new ki(e,r),{colorSystem:null}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return YD.set(t,s),s}function ZD(e){return XD(e).chrome}function QD(e){return XD(e).seam}function $D(e,t){if(e.length===0)return``;let n=JD(t.style,t.charset,t.separator),r=t.colorCompatibility,i=t.wrap&&Number.isFinite(t.width)?Ki(new Qi([...e],{joiner:n}),{width:t.width,colorSystem:r}):Ki(new ki([...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 eO(e){return Math.min(20,e??20)}const tO={heading:`ERROR`,glyph:`⚠`,colors:WD},nO={heading:`WARNING`,glyph:`⚠`,colors:GD},rO={heading:`UPDATE`,glyph:`⬆`,colors:GD};function iO(e,t){return{text:zD(e),link:t}}function aO(e,t,n){let[r,...i]=[oO(e,tO,iE),t,oO(n,nO,aE)].flat();return r===void 0?null:{channels:[r,...i]}}function oO(e,t,n){let r=SE([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>iO(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function sO(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
173
- `)}function cO(e,t,n,r){if(t===null)return e;let i=lO(r),a=t.channels.flatMap(e=>uO(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[dO(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
174
- `);return e?`${l}\n${e}`:l}function lO(e){return{style:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function uO(e,t){let n=new B({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Rt(Math.max(2,t.width-1)),i=(e,t)=>new H(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>$D([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=>Ht(e,r)).map(e=>i(e,t))})],t).split(`
175
- `))}function dO(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:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(T(a.path).href)):c(`full text unavailable: ${zD(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(zD(o),s.withLink(T(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.overflow=`ignore`,$D([m],r)}const fO=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function pO(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function mO(e,t){return r.readdirSync(t).filter(fO).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?mO(e,i):[[c.relative(e,i).split(c.sep).join(`/`),pO(i,a)]]})}function hO(e){let t=E.createHash(`sha256`);for(let[n,r]of mO(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const gO=e=>e.slice(0,7);function _O(e){return c.dirname(c.dirname(e))}function vO(){return{version:OE,digest:`a691bd8de4ae3c3f3a2aaad1d33c96e97cb4f312761ee3ebd3042837d91a9270`}}function yO(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 bO(e,t){try{let n=_O(ie(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=hO(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:yO(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 xO(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function SO(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 CO(e,t,n){let r=As(e,new Set(n.map(ks).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const wO=/^-?\d+$/;function TO(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 EO(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!wO.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 DO(e,t,n){return r=>r?wO.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 OO(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=>!wO.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 kO(e){return e===`config`?`set-config`:`set-state`}function AO(e,t,n){return t.kind===`int`?EO(`menu page "${e}"`):t.kind===`range`?DO(t.min,t.max,`${n} stepper "${e}"`):TO(t.allowed,`${n} "${e}"`,kO(n))}function jO(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:OO(e,n,t)}))}function MO(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=OO(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=AO(e,n,t)}else{let r=OO(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:AO(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=OO(e,r.specs,t),r.validator=AO(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 NO=MO({},`config`);function PO(){return NO.listKeys()}function FO(e,t){return NO.validate(e,t)}function IO(e){return NO.rangeParamsFor(e)}function LO(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:Ub(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:[xO({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[xO({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ub(e.insertSegmentFrom,t).members.map(t=>xO({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function RO(e,t){let n=Al(e.globals).get(t);return n===void 0?null:String(n)}function zO(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?Qb(n.persist):null;e?.scope===`preset-root`&&t.add(Xb(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function BO(e){let t=new Map([...Vb(e),...gx(e)]);return[...zO(e),...Object.values(e.actions).flatMap(e=>LO(e,t))]}function VO(e){return jO(BO(e),`config`)}function HO(e,t){return NO.register(e,t)}const UO=Array.from({length:10},(e,t)=>(t+1)*1e5),WO=UO[0],GO=UO[UO.length-1];function KO(e){let t;try{t=PE(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>=WO&&n<=GO?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${WO}–${GO} tokens)`)}function qO(e,t){let n=Math.min(t??GO,GO),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:UO.filter(e=>e<r).at(-1)??0,higher:UO.find(e=>e>r&&e<=n)??0}}const JO=Qx(`commands.`),YO=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,XO=`{{ \$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 (${YO}) (basename .project_dir) (ne (${YO}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,ZO={min:0,max:100,step:5},QO={warnAt:{label:`warning at %`,domain:ZO,default:50},errorAt:{label:`error at %`,domain:{...ZO,atLeast:`warnAt`},default:80}};function $O(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:ZO,default:80}}}const ek={globals:{palette:`tokyo-night`},variables:{...JO.variables,...yb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"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:XO},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:Ux(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:JO.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" .settings.budget "warn" .settings.warnAt) }}`,settings:$O(0)},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" .settings.budget "warn" .settings.warnAt) }}`,settings:$O(50)},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) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:QO,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) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:QO,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" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{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) ${wa} }}`,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:{...Ux(``).actions,...JO.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:Yx(`/autocompact auto`)},...Object.fromEntries(UO.map(e=>[`autocompact.${e}`,{slash:Yx(`/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) ${wa}) .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 .)) }}`}},tk=new Set([ek.globals.palette,...Object.values(ek.segments).map(e=>e.palette)].filter(e=>e!==void 0)),nk=Bc(Lw(`<default>`,JSON.stringify(ek),tk),ek),rk=x_(nk.presets);function ik(e){return rk.includes(e)}function ak(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const ok=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 sk(e){return((...t)=>ok.run(()=>e(...t)))}const ck=sk(S),lk=sk(x),uk=sk(C);async function dk(e,t){return ok.run(async()=>{let n=null;try{n=await b(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=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function fk(e,t){return ok.run(async()=>{let n=null;try{n=await b(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=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const pk=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function mk(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 hk(e){let t=await gk(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function gk(e){for(let t of[65536,1048576]){let n=await fk(e,t);if(n.kind!==`ok`)return n;let r=_k(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function _k(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||!pk.test(t))continue;let r=mk(t);if(r!=null)return r}return null}function vk(e,t,n){let r=S_(t(`preset`),e.globals.preset,e.presets),i=T_(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:Fb(a.palette,t(`theme`),i.palette),look:ao(a.look,t(`look`),i.look,e.looks),style:co(a.style,t(`style`),i.style),progression:xo(a.progression,t(`progression`),i.progression),separator:a.default_separator??i.default_separator,autoWrap:Oo(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:Ao(a.padding,t(`padding`),i.padding),charset:po(a.charset,t(`charset`),i.charset),updateNotice:ko(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:_o(a.colorCompatibility,t(`colorCompatibility`),i.colorCompatibility)}}function yk(e,t){return{style:e.style,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function bk(e){return{theme:e.theme,look:e.look,preset:e.preset,progression:e.progression}}function xk(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:ik(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},updateNotice:{effective:e.updateNotice}}}const Sk=10*1e3;function Ck(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 wk(e,t){if(!(t<60))return e*3600/t}function Tk(e,t,n,r){let i=r-t;if(i<50||i>Sk)return;let a=n-e;if(!(a<=0))return a*1e3/i}function Ek(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Tk(t.input,t.atMs,n.input,n.atMs),i=Tk(t.output,t.atMs,n.output,n.atMs),a=Tk(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 Dk(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>Sk)continue;let o=Tk(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function Ok(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function kk(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`,()=>Ok(p.hostname())),i=n(`user`,()=>p.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function Ak(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=>sv(t,e.helpers).keys(),o=T_(e,t);for(let e of Qa){let t=o[e];if($a(t))for(let e of a(t))r.push(e)}for(let n of Ms(w_(e,t).node)){if(n.when)for(let e of a(n.when))r.push(e);if(n.kind!==`segment`)continue;let t=e.segments[n.name];if(t){for(let e of[t.template,t.when,t.bg,t.fg])if(e)for(let t of a(e))r.push(t)}}let s=new Set;for(;r.length>0;){let e=r.pop();for(let t of Mk(n,e)){if(i.has(t))continue;i.add(t);let e=n.get(t);if(e){if(e.kind===`input`)s.add(e.path);else if(e.kind===`template`)for(let t of a(e.template))r.push(t)}}}return s}function jk(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=Ak(e,n);return t.set(n,i),i}}function Mk(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 Nk(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function Pk(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 Fk(e,t,n,r,i,a,o){let s=e=>Nk(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,Pk(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`),()=>hk(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(jE(AE(a.claudeConfigDir)))))]),x=[],S=e=>{if(e.kind===`failed`){x.push(e.reason);return}return e.kind===`ok`?e.value:void 0},C=Uk(u);x.push(...C.failures);let ee=kk(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=Rk(y);y.kind===`failed`&&x.push(`memento: ${y.reason}`);let oe=Ik(b,re?.maxTokens);b.kind===`failed`&&x.push(`autocompact: ${b.reason}`);for(let e of x)t.log(`warn`,`provider fetch failed: ${e}`);let D=e.rate_limits?.five_hour,se=e.rate_limits?.seven_day,ce=D?Ck(D.used_percentage,D.resets_at,18e6,c):void 0,le=se?Ck(se.used_percentage,se.resets_at,6048e5,c):void 0,ue=te?.session.cost,de=w?.sessionDuration,fe=s(`burn`)&&ue!=null&&de!=null?wk(ue,de):void 0,pe=S(v),me=pe===void 0?void 0:Ek(pe),he=pe===void 0?void 0:Dk(pe),ge=me!==void 0||he!==void 0?{...me,...he!==void 0&&{history:he}}:void 0,O=Hk(process.env.HOME??process.env.USERPROFILE),_e=e.workspace?{...e.workspace,current_dir:Hk(e.workspace.current_dir)??``,project_dir:Hk(e.workspace.project_dir)??``}:e.workspace,ve=te===void 0?void 0:Vk({cost:te.session.cost,tokens:te.session.tokens}),ye=ne===void 0?void 0:{cost:ne.cost,tokens:ne.tokens},be=w===void 0?void 0:Vk({lastResponseTime:w.lastResponseTime,responseTime:w.responseTime,sessionDuration:w.sessionDuration,messageCount:w.messageCount,linesAdded:w.linesAdded,linesRemoved:w.linesRemoved}),xe=ie===void 0?void 0:zk(ie);return{...e,..._e!==void 0&&{workspace:_e},...O!==void 0&&{home:O},...C.git!==void 0&&{git:C.git},...T!==void 0&&{tmux:{session:T}},host:ee.host,...xk(i),history:t.history(e.session_id),...o,...ve!==void 0&&{session:ve},...ye!==void 0&&{today:ye},...fe!==void 0&&{burn:{costPerHour:fe}},...ge!==void 0&&{speed:ge},...s(`block`)&&D!==void 0&&{block:{nativeUtilization:D.used_percentage,resetsAt:D.resets_at,...ce!==void 0&&{etaMinutes:ce}}},...se!==void 0&&{weekly:{percentage:se.used_percentage,resetsAt:se.resets_at,...le!==void 0&&{etaMinutes:le}}},...E!==void 0&&{cache:{expiresAt:E}},...re!==void 0&&{context:{totalTokens:re.totalTokens,contextLeft:re.contextLeftPercentage}},...be!==void 0&&{metrics:be},...xe!==void 0&&{activity:xe},...ae!==void 0&&{memento:ae},...oe!==void 0&&{autocompact:oe}}}function Ik(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return qO(e.value,t)}}const Lk=e=>e.trim().split(`
177
- `).at(-1).trim();function Rk(e){switch(e.kind){case`absent`:return;case`failed`:return{error:Lk(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function zk(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=Bk(e.running),i=Bk(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 Bk(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function Vk(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 Hk(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function Uk(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 Wk={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?So:Co,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?So:Co},Gk=Object.entries(bb),Kk=new Set(xb.map(e=>e.sessionKey)),qk=()=>!1;function Jk(e,t){return vk(e,e=>Kk.has(e)?t(e):null,qk)}function Yk(e,t,n,r){return e.flatMap(([e,i])=>{let a=Wk[e](t);return a===null||a===Wk[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function Xk(e,t,n){return Wk[n](Jk(e,t))}function Zk(e,t){let n=Jk(e,t),r=vk(e,()=>null,qk),i=vk(e,e=>e===bb.preset.sessionKey?n.preset:null,qk),a=C_(e.presets,n.preset).globals??{};return Yk(Gk,n,e=>e===`preset`?r:i,e=>e.configKey in a?Zb(n.preset,e.configKey):e.configKey)}function Qk(e,t){let{preset:n}=Jk(e,t);return tA(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Js(a,s);return c===void 0||qs(c)===qs(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function $k(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return x_(e.presets).flatMap(n=>{let i=tA(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Gs(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:Js(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const eA=new WeakMap;function tA(e,t){let n=eA.get(e)??new Map;eA.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...Ms(w_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Us(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 nA(e,t){let n=Jk(e,t),r=vk(e,e=>e===bb.preset.sessionKey?n.preset:null,qk);return{from:n.preset,globals:C_(e.presets,n.preset).globals??{},picks:Yk(Gk.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:Qk(e,t)}}function rA(e){return{sessionKeys:xb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...bl(e)?rk.map(t=>Zb(t,e)):[]]}}function iA(e){return new Set(xb.map(e=>e.configKey).filter(t=>rA(t).fileKeys.some(t=>sA(e,oA(t)))))}function aA(e,t,n){let r=Zk(e,n);return{unsaved:r.length+Qk(e,n).length,resettable:new Set([...r.map(e=>e.configKey),...t]).size}}function oA(e){let t=Qb(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return $b(t)}function sA(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&sA(e[n],r)}const cA=qa(),lA=new Set(cA),uA=new Set(oo),dA=e=>e?lA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${cA.join(`, `)})`}:{ok:!1,reason:`theme name is required`},fA=e=>e?uA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown style "${e}" (have: ${oo.join(`, `)})`}:{ok:!1,reason:`style name is required`},pA=new Set([`1`,`true`]),mA=new Set([`0`,`false`]),hA=MO({style:fA,theme:dA,"toolbar-expanded":e=>pA.has(e)?{ok:!0,value:`1`}:mA.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function gA(){return hA.listKeys()}function _A(e,t){return hA.register(e,t)}function vA(e,t){return hA.validate(e,t)}function yA(e){return hA.rangeParamsFor(e)}function bA(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:Ub(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 xA(e){let t=new Set(hA.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function SA(e,t,n){let r=wb.get(n);if(r!==void 0)return Xk(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 CA(e){let t=Vb(e);return xA(Object.values(e.actions).flatMap(e=>bA(e,t)))}function wA(e){return jO(CA(e))}const TA=`update.dismissed`,EA=`updateNotice`,DA=bb.updateNotice.sessionKey;function OA(e){return e.kind===`source`?e.newer.digest:RE(e.newer)}const kA=e=>`${e.version} [${gO(e.digest)}]`;function AA(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:kA(e.newer),running:kA(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:RE(e.newer),running:RE(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${BE}@${RE(e.newer)}`,`install`]}}}}const jA={kind:`idle`},MA={kind:`running`};function NA(e,t,n){if(e===null)return[];let r=OA(e);if(!n.enabled||n.dismissed===r)return[];let i=AA(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=SE([{verb:aE,args:[s]}]),l=t.kind===`running`?iO(`[${i.busy}]`,c):iO(`[${i.act}]`,SE([{verb:hE,args:[n.sessionId]}]));return[{severity:rO,message:s,lines:[[iO(a,c),l,iO(`[dismiss]`,SE([{verb:$T,args:[n.sessionId,TA,r]}])),iO(`[disable]`,SE([{verb:oE,args:[n.sessionId,EA,`false`]},{verb:$T,args:[n.sessionId,DA,`false`]}]))],...o.map(e=>[iO(e,c)])]}]}function PA(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 FA(e){switch(e.kind){case`current`:return[`info`,`build: current ${kA(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${kA(e.source)}, running ${kA(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function IA(e){switch(e.kind){case`current`:return[`info`,`release: current ${RE(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${RE(e.latest)}, running ${RE(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${RE(e.installed)}, latest ${RE(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function LA(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const RA=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function zA(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=RA(e.stderr)??e.error??RA(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function BA(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=jA,d=null,f=LA(s),p=LA(s),m=()=>PA(c,l);function h(){let e=m(),t=e===null?null:OA(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:_A(TA,{kind:`allow-list`,allowed:[t]})})}function g(){c=bO(t,vO),f(FA(c)),h()}async function _(){l=HE(OE,await VE(BE,a,i)),p(IA(l)),h()}return{arm(){HO(EA,{kind:`allow-list`,allowed:[`false`]}),_A(DA,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>NA(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=AA(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=MA,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),De({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=jA,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=zA(n);u={kind:`failed`,identity:OA(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var VA=class{static CACHE_DIR=Ne();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 O(`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`?(O(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(O(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return O(`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`}),O(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await D(50);else throw e}return O(`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),O(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&O(`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){O(`Failed to create cache directories:`,e)}}static createProjectHash(e){return ae(`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)){O(`Cache for ${e} is locked, waiting...`),await D(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(O(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(O(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return O(`No shared ${e} usage cache found`),null;O(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await D(75)}}return O(`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)){O(`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`),O(`[CACHE-SET] ${e} disk cache stored`)}catch(t){O(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const HA={"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 UA=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 VA.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await VA.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new re(this.GITHUB_PRICING_URL),n=oe({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){O(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){O(`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)?(O(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),O(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(O(`Invalid pricing data structure`),e(null))}catch(t){O(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{O(`Response error:`,t),e(null)})});n.on(`error`,t=>{O(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{O(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return O(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return O(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),O(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(O(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(HA).length} models`),this.executionCache=HA,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(HA).length} models`),HA)}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 O(`[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),O(`[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 WA=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function GA(e){if(typeof e==`string`)return WA.exec(e)?.[1]}function KA(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 qA(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=KA(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?GA(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 JA(){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=m(),n=f(t,`.config`,`claude`),r=f(t,`.claude`);a(n)&&e.push(n),a(r)&&e.push(r)}return e}async function YA(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await ck(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=f(e,r.name);t.push(n)}}catch(t){O(`Failed to read projects directory ${e}:`,t)}}return t}async function XA(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await ck(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=f(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await lk(t,`utf-8`)).split(`
179
- `)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{O(`Failed to check agent file ${t}`)}}}catch(e){O(`Failed to read subagents directory ${i}:`,e)}return r}function ZA(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 QA=new Map;async function $A(e){try{let t=await uk(e),n=t.size,r=QA.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),QA.delete(e),QA.set(e,r),r.entries;let i;return n>1048576?(O(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await ij(e)):i=await nj(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(QA.delete(e),QA.size>=16&&QA.delete(QA.keys().next().value),QA.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return O(`Transcript not present yet: ${e}`),[];throw t}}function ej(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:qA(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 tj(e){let t=[];for(let n of e.split(`
180
- `))if(n.trim())try{let e=ej(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function nj(e){return tj(await lk(e,`utf-8`))}async function rj(e,t){let n=await dk(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:tj(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function ij(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=se({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=ej(JSON.parse(t));e&&r.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{O(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{O(`File stream error for ${e}:`,t),n(t)})})}var aj=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 oj(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 sj={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},cj={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function lj(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function uj(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function dj(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function fj(e,t,n,r){let i=lj(new Date(uj())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:dj(),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 UA.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=lj(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...sj};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 pj(e){let t=0,n=0,r=dj(),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)??{...sj};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:cj,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 mj(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 hj=class{entries=new Map;flight=new aj;seeded=new Map;speedRings=new Map;speedFlight=new aj;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:cj,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e){let t=lj(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={...sj},i=!1;for(let e of this.entries.values()){i||=e.days.has(t);let n=e.days.get(t)??sj;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=ak(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=oj(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??ak(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 XA(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 rj(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 fj(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...pj(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=uj(),n=await YA(JA()),r=[];for(let e of n){let n;try{n=await ck(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await uk(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await mj(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 gj(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function _j(e,t){let n=H.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function vj(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function yj({text:e,trail:t}){if(t===void 0)return e;let n=_j([e,t]);return n.style=e.style,n}function bj(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,trail:s=[]}=t;if(e.length===0)return[];let c=_j(e,a).pad(o),l=s.length===0?{}:{trail:_j([...s,new H(` `.repeat(o))],a)};if(n===`auto`)return[{text:c,...l}];let u={justify:r,truncate:i};return n===`fill`?[{text:c,fill:u,...l}]:(vj(c,n,u),[{text:c,...l}])}const xj=RegExp(`\\x1b\\[[0-9;]*m|${_i.source}`,`g`);function Sj(e){return Lt(e.replace(xj,``))}function Cj(e,t){let n=e.map(yj),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=$D(n,t).split(`
181
- `);if(i.length>1)return n;let a=Math.max(0,t.width-Sj(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];vj(l,l.cellLength+c,i),n[t]=yj(e[t])}),n}function wj(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=Tj(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(Dj(a.style).link){i();let e=Tj([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function Tj(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>Ej(e,t)):e,r=H.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function Ej(e,t){let n=e.copy();return n.style=t.add(Dj(e.style)),n}function Dj(e){return e instanceof B?e:B.parse(e)}var Oj=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function kj(e,t,n,r,i){let{palette:a,tint:o}=e,s=Aj(n,i),c=s===void 0?o:jj(a,s,`bg`);e.bg=c;let l=Aj(r,i),u=l===void 0?Ta(a,c,t):jj(a,l,`fg`);return new B({bgcolor:gn.fromRgba(c),color:gn.fromRgba(u)})}function Aj(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function jj(e,t,n){try{return Xn(e,t)}catch(e){throw e instanceof qn?new Oj(t,n,e.message):e}}function Mj(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,Nj(e,t,o,n,r,i));return i}function Nj(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=Ub(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=Sb.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=Ub(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=Ub(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:Fj(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:Fj(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:iC(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:Fj(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 Pj(e){return e.kind===`do`?Pj(e.head):e}function Fj(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function Ij(e,t){return e.has(t)?bv(e.read(t)):``}function Lj(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function Rj(e,t,n,r){let i=new H(e,{style:B.combine([r,new B({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function zj(e,t){return Math.max(e.members.indexOf(Ij(t,e.stateVar)),0)}function Bj(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=Ij(r,e.stateVar);return{effects:[{verb:$T,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=Ij(r,e.stateVar);return{effects:[{verb:$T,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=Ij(r,e.stateVar);return{effects:[{verb:$T,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(zj(e,r)+1)%e.members.length];return{effects:[{verb:$T,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:eE,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:tE,args:[Lj(e.text,fy(r))]}],active:!1};case`open`:return{effects:[{verb:nE,args:[Lj(e.target,fy(r))]}],active:!1};case`persist-literal`:{let t=Ij(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=Ij(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(zj(e,r)+1)%e.members.length];return{effects:[{verb:oE,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:sE,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:dE,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:pE,args:[i]}],active:!1};case`redo`:return{effects:[{verb:mE,args:[i]}],active:!1};case`save`:return{effects:[{verb:cE,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:lE,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:uE,args:[i,Lj(e.name,fy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:gE,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:_E,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:vE,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:yE,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:fE,args:[i,e.key,xO(e.op)]}],active:!1};case`do`:{let a=Bj(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>Bj(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:fE,args:[i,e.key,xO(r)]}],active:!1}}}}function Vj(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:qc(`action "${e}"`,n,t.members.length,zj(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 Hj(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}=Vj(e,Pj(r),t,i),{effects:s,active:c}=Bj(r,a,o,i,Ij(i,`session.id`));return Rj(a,SE(s),c)}function Uj(e){return{action:{fn:(t,...n)=>Hj(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function Wj(e,t){return Rj(`✕`,SE([{verb:$T,args:[Ij(e,`session.id`),t,Wc]}]),!1)}function Gj(e,t,n){return new B({bgcolor:gn.fromRgba(t),color:gn.fromRgba(Ta(e,t,n))})}function Kj(e,t,n){return Gj(e.palette,Ra(e.palette,e.disclosure,[t],n),n)}function qj(e,t,n,r,i){return r===void 0?n=>Kj(e,{...n,distribution:t},i):(e,t)=>Jj(r(t,n),i)}function Jj(e,t){let n=ha(e,`background`);return new B({bgcolor:gn.fromRgba(n),color:gn.fromRgba(ir(ha(e,`primary`),n,4.5,t))})}function Yj(e){return{current:null,drawnAt:e}}function Xj(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 Zj(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 Qj(e){return new H(e).cellLength}function $j(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function eM(e){return Math.max(1,$j(e)-(Qj(`✕`)+2*e.padding+e.seamCols))}function tM(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 nM(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.overflow=t?`ignore`:void 0,r.end=``,r}function rM(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 iM(e,t,n){let r=e.compiled.get(t),i=r&&Pj(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 aM(e,t,n,r,i,a,o){let s=iM(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=Ij(l,`session.id`),d=`stateVar`in s?Ij(l,s.stateVar):void 0,f=s.options.map(Qj),p=i?$j(a):1/0,m=Qj(`✕`)+1,h=Qj(`←`)+1+Qj(`→`)+1,g=tM(f,p,m),_=g.length>1?tM(f,p,m+h):g,v=parseInt(Ij(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>SE([{verb:$T,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=SE([{verb:$T,args:[u,...S]}]),ee=r?[{verb:$T,args:[u,...S]}]:[],te=e=>SE([...Bj(c,e,e,l,u).effects,...ee]),ne=[Rj(`✕`,C,!1)];y>0&&ne.push(Rj(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(Rj(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(Rj(`→`,x(y+1),!1)),nM(ne,i)}function oM(e,t){return{picker:{fn:(n,r,i,a,...o)=>{oy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=rM(e,r,`set-int`,`an int action ({ set, int: true })`);return aM(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,qj(Zj(t,`{{ picker }}`),la(void 0),e,iM(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function sM(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+Qj(e(-(s+1)))+1+Qj(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function cM(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=Ij(a,`session.id`),{options:c}=t,l=c.length,u=Ij(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=SE(Bj(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>Rj(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=sM(p,l,Qj(`◀`)+1+Qj(p(0))+1+Qj(`▶`),eM(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return nM([...v(-1).reverse(),Rj(`◀`,h(-1),!1),g(0),Rj(`▶`,h(1),!1),...v(1)],!0)}function lM(e,t){return{carousel:{fn:(n,r,...i)=>{if(oy(`carousel "${n}"`,[`neighbours`],i),r!==void 0&&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=iM(e,n,`carousel`);return cM(n,o,e,qj(Zj(t,`{{ carousel }}`),la(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const uM=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function dM(e,t,n){let r=ja(e,{hue:ta,depth:0},n);return[ra(t).map((t,n)=>({text:uM[n%uM.length],colour:ga(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ha(e,`warning`)},{text:`error`,colour:ha(e,`error`)}]]}function fM(e,t,n,r){let i=dM(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:Gj(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.overflow=`ignore`,s.end=``,s}function pM(e,t){return{themePreview:{fn:()=>fM(e.palette,e.progression,t.drawnAt(),eM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const mM=e=>e.slice(e.lastIndexOf(`.`)+1),hM=(e,t)=>{let n=new H(mM(e));return n.truncate(t,{marker:`…`}),n.plain};function gM(e,t){let n=e.map(e=>e.map(({name:e})=>Qj(mM(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 _M(e,t,n,r){let i=gM(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${hM(s,i)} `,{style:Gj(l,Ha(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.overflow=`ignore`,o.end=``,o}function vM(e,t){return{layoutPreview:{fn:()=>_M(e.layout(),e.progression,t.drawnAt(),eM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function yM(e,t,n,r){let i=Zj(r.activeSegment,`{{ menu }}`),a=r.action,o=d_(i.placementId,e,n.key),s=m_(o),c=u_(e),l=Ij(a.store,o)===c,u=Ij(a.store,`session.id`),d=l?Wc:c,f=Rj(qc(`{{ menu "${e}" }}`,t,2,+!!l),SE([{verb:$T,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?[aM(e,{key:s,stateVar:s},[[o,Wc],[s,`0`]],n.closeOnPick,n.paged,a,qj(i,n.distribution,a,iM(a,e,`menu`).paletteOf,r.activeSegment.drawnAt()))]:[]),f}const bM=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function xM(e,t){let n=t[t.length-1],r=bM(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:v_(r??{})}}function SM(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=xM(t,n);return yM(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function CM(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=wM(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.overflow=`ignore`,l}function wM(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 TM(e){let t={fn:(()=>{let t=Zj(e,`{{ bgOf }}`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],arity:{kind:`exact`},returnType:`string`},n={fn:(()=>Zj(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=Kv(()=>Zj(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...EM(s)];return CM({value:e,max:t,width:n,filled:i,empty:a,colourAt:c===void 0?void 0:e=>String(r.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function EM(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 DM(e){let t=[],n=[];for(let r of e){if(!r.contains(`
170
+ Tip: every bar carries a settings menu — click it (${Gc} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/endcaps/wrap/padding controls.\n`}async function mD(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...KE],i=oD();process.platform===`darwin`?cD(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
171
+ `),hD(i.binPath,r,t),process.stdout.write(pD());let a=WE(VE,UE(kE,await HE(VE,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function hD(e,t,n,i){let a=i??ME(jE(AE(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,JE(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:YE(e,t)},k(a,JSON.stringify(o,null,2)),process.stdout.write(`Updated ${a}\n`)}function gD(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 _D(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 vD(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 yD(e,t){let n=_D(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function bD(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 xD(e,t,n,r){let i=SD(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 SD(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 CD(e){let t=!1;function n(){let n=xD(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 wD(e,t=Oe){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 TD(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 ED(e,t=wD){let n=t(e);return n.kind===`start`?n.token:null}const DD=`CC_CANDYBAR_PARENT_PID`;function OD(e){let t=e[DD];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${DD} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function kD(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 AD(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function jD(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function MD(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 ND(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>c.join(e,t))}catch{return[]}}function PD(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 FD(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 ID(e){if(!e.isolated)return{decision:MD(!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=MD(!0,FD(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 LD(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function RD(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:He(),ceiling:jD(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>TD(e,t,{readStartTime:wD,pidAlive:AD}),listFiles:ND,readEntry:PD,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?Ie:e=>{Ie(c.dirname(e)),Ie(e)},...t}}function zD(e){return e<32||e===127||e>=128&&e<=159}function BD(e){let t=``;for(let n of e)t+=zD(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function VD(e,t){let n=BD(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const HD=`\x1B[38;2;255;255;255m`,UD=`\x1B[48;2;200;40;40m`;function WD(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 GD={fg:WD(HD),bg:WD(UD)},KD={fg:WD(`\x1B[38;2;0;0;0m`),bg:WD(`\x1B[48;2;220;160;40m`)},qD={unicode:Ii,ascii:{glyph:`>`,divider:`|`,lead:`<`,tail:`>`}},JD={unicode:{},ascii:{left:`(`,right:`)`}};function YD(e,t,n){switch(e){case`capsule`:return new Hi(JD[t]);case`plain`:return new Ui(n===void 0?{}:{separator:n});case`powerline`:return new zi(qD[t]);default:return e}}const XD=new Map;function ZD(e){let t=JSON.stringify([e.endcaps,e.charset,e.separator??null]),n=XD.get(t);if(n!==void 0)return n;let r=YD(e.endcaps,e.charset,e.separator),i=e=>new H(`x`,{end:``,overflow:`ignore`,style:new B({bgcolor:e})}),a=e=>new H(Ki(new ki(e,r),{colorSystem:null}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return XD.set(t,s),s}function QD(e){return ZD(e).chrome}function $D(e){return ZD(e).seam}function eO(e,t){if(e.length===0)return``;let n=YD(t.endcaps,t.charset,t.separator),r=t.colorCompatibility,i=t.wrap&&Number.isFinite(t.width)?Ki(new Qi([...e],{joiner:n}),{width:t.width,colorSystem:r}):Ki(new ki([...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 tO(e){return Math.min(20,e??20)}const nO={heading:`ERROR`,glyph:`⚠`,colors:GD},rO={heading:`WARNING`,glyph:`⚠`,colors:KD},iO={heading:`UPDATE`,glyph:`⬆`,colors:KD};function aO(e,t){return{text:BD(e),link:t}}function oO(e,t,n){let[r,...i]=[sO(e,nO,aE),t,sO(n,rO,oE)].flat();return r===void 0?null:{channels:[r,...i]}}function sO(e,t,n){let r=CE([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>aO(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function cO(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
173
+ `)}function lO(e,t,n,r){if(t===null)return e;let i=uO(r),a=t.channels.flatMap(e=>dO(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[fO(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
174
+ `);return e?`${l}\n${e}`:l}function uO(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function dO(e,t){let n=new B({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Rt(Math.max(2,t.width-1)),i=(e,t)=>new H(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>eO([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=>Ht(e,r)).map(e=>i(e,t))})],t).split(`
175
+ `))}function fO(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:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(T(a.path).href)):c(`full text unavailable: ${BD(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(BD(o),s.withLink(T(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.overflow=`ignore`,eO([m],r)}const pO=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function mO(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function hO(e,t){return r.readdirSync(t).filter(pO).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?hO(e,i):[[c.relative(e,i).split(c.sep).join(`/`),mO(i,a)]]})}function gO(e){let t=E.createHash(`sha256`);for(let[n,r]of hO(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const _O=e=>e.slice(0,7);function vO(e){return c.dirname(c.dirname(e))}function yO(){return{version:kE,digest:`23582997fd0093183262a185d1ea788e3303bea68ad25cf4d1cfdf441fbe823f`}}function bO(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 xO(e,t){try{let n=vO(ie(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=gO(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:bO(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 SO(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function CO(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 wO(e,t,n){let r=As(e,new Set(n.map(ks).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const TO=/^-?\d+$/;function EO(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 DO(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!TO.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 OO(e,t,n){return r=>r?TO.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 kO(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=>!TO.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 AO(e){return e===`config`?`set-config`:`set-state`}function jO(e,t,n){return t.kind===`int`?DO(`menu page "${e}"`):t.kind===`range`?OO(t.min,t.max,`${n} stepper "${e}"`):EO(t.allowed,`${n} "${e}"`,AO(n))}function MO(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:kO(e,n,t)}))}function NO(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=kO(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=jO(e,n,t)}else{let r=kO(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:jO(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=kO(e,r.specs,t),r.validator=jO(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 PO=NO({},`config`);function FO(){return PO.listKeys()}function IO(e,t){return PO.validate(e,t)}function LO(e){return PO.rangeParamsFor(e)}function RO(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:Ub(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:[SO({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[SO({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ub(e.insertSegmentFrom,t).members.map(t=>SO({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function zO(e,t){let n=Al(e).get(t);return n===void 0?null:String(n)}function BO(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?Qb(n.persist):null;e?.scope===`preset-root`&&t.add(Xb(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function VO(e){let t=new Map([...Vb(e),...gx(e)]);return[...BO(e),...Object.values(e.actions).flatMap(e=>RO(e,t))]}function HO(e){return MO(VO(e),`config`)}function UO(e,t){return PO.register(e,t)}const WO=Array.from({length:10},(e,t)=>(t+1)*1e5),GO=WO[0],KO=WO[WO.length-1];function qO(e){let t;try{t=FE(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>=GO&&n<=KO?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${GO}–${KO} tokens)`)}function JO(e,t){let n=Math.min(t??KO,KO),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:WO.filter(e=>e<r).at(-1)??0,higher:WO.find(e=>e>r&&e<=n)??0}}const YO=Qx(`commands.`),XO=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,ZO=`{{ \$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 (${XO}) (basename .project_dir) (ne (${XO}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,QO={min:0,max:100,step:5},$O={warnAt:{label:`warning at %`,domain:QO,default:50},errorAt:{label:`error at %`,domain:{...QO,atLeast:`warnAt`},default:80}};function ek(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:QO,default:80}}}const tk={globals:{palette:`tokyo-night`},variables:{...YO.variables,...yb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"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:ZO},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:Ux(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:YO.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" .settings.budget "warn" .settings.warnAt) }}`,settings:ek(0)},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" .settings.budget "warn" .settings.warnAt) }}`,settings:ek(50)},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) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:$O,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) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:$O,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" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{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) ${wa} }}`,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:{...Ux(``).actions,...YO.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:Yx(`/autocompact auto`)},...Object.fromEntries(WO.map(e=>[`autocompact.${e}`,{slash:Yx(`/autocompact ${e}`)}]))},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${wa}) .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 .)) }}`}},nk=new Set([tk.globals.palette,...Object.values(tk.segments).map(e=>e.palette)].filter(e=>e!==void 0)),rk=Bc(Rw(`<default>`,JSON.stringify(tk),nk),tk),ik=x_(rk.presets);function ak(e){return ik.includes(e)}function ok(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const sk=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 ck(e){return((...t)=>sk.run(()=>e(...t)))}const lk=ck(S),uk=ck(x),dk=ck(C);async function fk(e,t){return sk.run(async()=>{let n=null;try{n=await b(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=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function pk(e,t){return sk.run(async()=>{let n=null;try{n=await b(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=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const mk=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function hk(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 gk(e){let t=await _k(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function _k(e){for(let t of[65536,1048576]){let n=await pk(e,t);if(n.kind!==`ok`)return n;let r=vk(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function vk(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||!mk.test(t))continue;let r=hk(t);if(r!=null)return r}return null}function yk(e,t,n){let r=S_(t(`preset`),e.globals.preset,e.presets),i=T_(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:Fb(a.palette,t(`theme`),i.palette),style:ao(a.style,t(`style`),i.style,e.styles),endcaps:co(a.endcaps,t(`endcaps`),i.endcaps),variation:xo(a.variation,t(`variation`),i.variation),separator:a.default_separator??i.default_separator,autoWrap:Oo(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:Ao(a.padding,t(`padding`),i.padding),charset:po(a.charset,t(`charset`),i.charset),updateNotice:ko(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:_o(a.colorCompatibility,t(`colorCompatibility`),i.colorCompatibility)}}function bk(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function xk(e){return{theme:e.theme,style:e.style,preset:e.preset,variation:e.variation}}function Sk(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:ak(e.preset)},endcaps:{effective:e.endcaps},variation:{effective:e.variation},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding},updateNotice:{effective:e.updateNotice}}}const Ck=10*1e3;function wk(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 Tk(e,t){if(!(t<60))return e*3600/t}function Ek(e,t,n,r){let i=r-t;if(i<50||i>Ck)return;let a=n-e;if(!(a<=0))return a*1e3/i}function Dk(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Ek(t.input,t.atMs,n.input,n.atMs),i=Ek(t.output,t.atMs,n.output,n.atMs),a=Ek(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 Ok(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>Ck)continue;let o=Ek(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function kk(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function Ak(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`,()=>kk(p.hostname())),i=n(`user`,()=>p.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function jk(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=>sv(t,e.helpers).keys(),o=T_(e,t);for(let e of Qa){let t=o[e];if($a(t))for(let e of a(t))r.push(e)}for(let n of Ms(w_(e,t).node)){if(n.when)for(let e of a(n.when))r.push(e);if(n.kind!==`segment`)continue;let t=e.segments[n.name];if(t){for(let e of[t.template,t.when,t.bg,t.fg])if(e)for(let t of a(e))r.push(t)}}let s=new Set;for(;r.length>0;){let e=r.pop();for(let t of Nk(n,e)){if(i.has(t))continue;i.add(t);let e=n.get(t);if(e){if(e.kind===`input`)s.add(e.path);else if(e.kind===`template`)for(let t of a(e.template))r.push(t)}}}return s}function Mk(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=jk(e,n);return t.set(n,i),i}}function Nk(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 Pk(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function Fk(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 Ik(e,t,n,r,i,a,o){let s=e=>Pk(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,Fk(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`),()=>gk(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(ME(jE(a.claudeConfigDir)))))]),x=[],S=e=>{if(e.kind===`failed`){x.push(e.reason);return}return e.kind===`ok`?e.value:void 0},C=Wk(u);x.push(...C.failures);let ee=Ak(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=zk(y);y.kind===`failed`&&x.push(`memento: ${y.reason}`);let oe=Lk(b,re?.maxTokens);b.kind===`failed`&&x.push(`autocompact: ${b.reason}`);for(let e of x)t.log(`warn`,`provider fetch failed: ${e}`);let D=e.rate_limits?.five_hour,se=e.rate_limits?.seven_day,ce=D?wk(D.used_percentage,D.resets_at,18e6,c):void 0,le=se?wk(se.used_percentage,se.resets_at,6048e5,c):void 0,ue=te?.session.cost,de=w?.sessionDuration,fe=s(`burn`)&&ue!=null&&de!=null?Tk(ue,de):void 0,pe=S(v),me=pe===void 0?void 0:Dk(pe),he=pe===void 0?void 0:Ok(pe),ge=me!==void 0||he!==void 0?{...me,...he!==void 0&&{history:he}}:void 0,O=Uk(process.env.HOME??process.env.USERPROFILE),_e=e.workspace?{...e.workspace,current_dir:Uk(e.workspace.current_dir)??``,project_dir:Uk(e.workspace.project_dir)??``}:e.workspace,ve=te===void 0?void 0:Hk({cost:te.session.cost,tokens:te.session.tokens}),ye=ne===void 0?void 0:{cost:ne.cost,tokens:ne.tokens},be=w===void 0?void 0:Hk({lastResponseTime:w.lastResponseTime,responseTime:w.responseTime,sessionDuration:w.sessionDuration,messageCount:w.messageCount,linesAdded:w.linesAdded,linesRemoved:w.linesRemoved}),xe=ie===void 0?void 0:Bk(ie);return{...e,..._e!==void 0&&{workspace:_e},...O!==void 0&&{home:O},...C.git!==void 0&&{git:C.git},...T!==void 0&&{tmux:{session:T}},host:ee.host,...Sk(i),history:t.history(e.session_id),...o,...ve!==void 0&&{session:ve},...ye!==void 0&&{today:ye},...fe!==void 0&&{burn:{costPerHour:fe}},...ge!==void 0&&{speed:ge},...s(`block`)&&D!==void 0&&{block:{nativeUtilization:D.used_percentage,resetsAt:D.resets_at,...ce!==void 0&&{etaMinutes:ce}}},...se!==void 0&&{weekly:{percentage:se.used_percentage,resetsAt:se.resets_at,...le!==void 0&&{etaMinutes:le}}},...E!==void 0&&{cache:{expiresAt:E}},...re!==void 0&&{context:{totalTokens:re.totalTokens,contextLeft:re.contextLeftPercentage}},...be!==void 0&&{metrics:be},...xe!==void 0&&{activity:xe},...ae!==void 0&&{memento:ae},...oe!==void 0&&{autocompact:oe}}}function Lk(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return JO(e.value,t)}}const Rk=e=>e.trim().split(`
177
+ `).at(-1).trim();function zk(e){switch(e.kind){case`absent`:return;case`failed`:return{error:Rk(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function Bk(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=Vk(e.running),i=Vk(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 Vk(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function Hk(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 Uk(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function Wk(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 Gk={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,charset:e=>e.charset,colorCompatibility:e=>e.colorCompatibility,autoWrap:e=>e.autoWrap?So:Co,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?So:Co},Kk=Object.entries(bb),qk=new Set(xb.map(e=>e.sessionKey)),Jk=()=>!1;function Yk(e,t){return yk(e,e=>qk.has(e)?t(e):null,Jk)}function Xk(e,t,n,r){return e.flatMap(([e,i])=>{let a=Gk[e](t);return a===null||a===Gk[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function Zk(e,t,n){return Gk[n](Yk(e,t))}function Qk(e,t){let n=Yk(e,t),r=yk(e,()=>null,Jk),i=yk(e,e=>e===bb.preset.sessionKey?n.preset:null,Jk);return Xk(Kk,n,e=>e===`preset`?r:i,t=>$k(e,n.preset,t.configKey))}function $k(e,t,n){return n in(C_(e.presets,t).globals??{})?Zb(t,n):n}function eA(e,t,n){let r=S_(t(bb.preset.sessionKey),e.globals.preset,e.presets),i=Qb(n);return{key:i?.scope===`globals`?$k(e,r,i.field):n,globals:T_(e,r)}}function tA(e,t){let{preset:n}=Yk(e,t);return iA(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Js(a,s);return c===void 0||qs(c)===qs(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function nA(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return x_(e.presets).flatMap(n=>{let i=iA(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Gs(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:Js(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const rA=new WeakMap;function iA(e,t){let n=rA.get(e)??new Map;rA.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...Ms(w_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Us(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 aA(e,t){let n=Yk(e,t),r=yk(e,e=>e===bb.preset.sessionKey?n.preset:null,Jk);return{from:n.preset,globals:C_(e.presets,n.preset).globals??{},picks:Xk(Kk.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:tA(e,t)}}function oA(e){return{sessionKeys:xb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...bl(e)?ik.map(t=>Zb(t,e)):[]]}}function sA(e){return new Set(xb.map(e=>e.configKey).filter(t=>oA(t).fileKeys.some(t=>uA(e,lA(t)))))}function cA(e,t,n){let r=Qk(e,n);return{unsaved:r.length+tA(e,n).length,resettable:new Set([...r.map(e=>e.configKey),...t]).size}}function lA(e){let t=Qb(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return $b(t)}function uA(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&uA(e[n],r)}const dA=qa(),fA=new Set(dA),pA=new Set(oo),mA=e=>e?fA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${dA.join(`, `)})`}:{ok:!1,reason:`theme name is required`},hA=e=>e?pA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${oo.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},gA=new Set([`1`,`true`]),_A=new Set([`0`,`false`]),vA=NO({endcaps:hA,theme:mA,"toolbar-expanded":e=>gA.has(e)?{ok:!0,value:`1`}:_A.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function yA(){return vA.listKeys()}function bA(e,t){return vA.register(e,t)}function xA(e,t){return vA.validate(e,t)}function SA(e){return vA.rangeParamsFor(e)}function CA(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:Ub(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 wA(e){let t=new Set(vA.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function TA(e,t,n){let r=wb.get(n);if(r!==void 0)return Zk(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 EA(e){let t=Vb(e);return wA(Object.values(e.actions).flatMap(e=>CA(e,t)))}function DA(e){return MO(EA(e))}const OA=`update.dismissed`,kA=`updateNotice`,AA=bb.updateNotice.sessionKey;function jA(e){return e.kind===`source`?e.newer.digest:zE(e.newer)}const MA=e=>`${e.version} [${_O(e.digest)}]`;function NA(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:MA(e.newer),running:MA(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:zE(e.newer),running:zE(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${VE}@${zE(e.newer)}`,`install`]}}}}const PA={kind:`idle`},FA={kind:`running`};function IA(e,t,n){if(e===null)return[];let r=jA(e);if(!n.enabled||n.dismissed===r)return[];let i=NA(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=CE([{verb:oE,args:[s]}]),l=t.kind===`running`?aO(`[${i.busy}]`,c):aO(`[${i.act}]`,CE([{verb:gE,args:[n.sessionId]}]));return[{severity:iO,message:s,lines:[[aO(a,c),l,aO(`[dismiss]`,CE([{verb:eE,args:[n.sessionId,OA,r]}])),aO(`[disable]`,CE([{verb:sE,args:[n.sessionId,kA,`false`]},{verb:eE,args:[n.sessionId,AA,`false`]}]))],...o.map(e=>[aO(e,c)])]}]}function LA(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 RA(e){switch(e.kind){case`current`:return[`info`,`build: current ${MA(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${MA(e.source)}, running ${MA(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function zA(e){switch(e.kind){case`current`:return[`info`,`release: current ${zE(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${zE(e.latest)}, running ${zE(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${zE(e.installed)}, latest ${zE(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function BA(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const VA=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function HA(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=VA(e.stderr)??e.error??VA(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function UA(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=PA,d=null,f=BA(s),p=BA(s),m=()=>LA(c,l);function h(){let e=m(),t=e===null?null:jA(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:bA(OA,{kind:`allow-list`,allowed:[t]})})}function g(){c=xO(t,yO),f(RA(c)),h()}async function _(){l=UE(kE,await HE(VE,a,i)),p(zA(l)),h()}return{arm(){UO(kA,{kind:`allow-list`,allowed:[`false`]}),bA(AA,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>IA(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=NA(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=FA,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),De({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=PA,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=HA(n);u={kind:`failed`,identity:jA(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var WA=class{static CACHE_DIR=Ne();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 O(`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`?(O(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(O(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return O(`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`}),O(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await D(50);else throw e}return O(`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),O(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&O(`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){O(`Failed to create cache directories:`,e)}}static createProjectHash(e){return ae(`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)){O(`Cache for ${e} is locked, waiting...`),await D(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(O(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(O(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return O(`No shared ${e} usage cache found`),null;O(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await D(75)}}return O(`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)){O(`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`),O(`[CACHE-SET] ${e} disk cache stored`)}catch(t){O(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const GA={"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 KA=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 WA.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await WA.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new re(this.GITHUB_PRICING_URL),n=oe({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){O(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){O(`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)?(O(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),O(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(O(`Invalid pricing data structure`),e(null))}catch(t){O(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{O(`Response error:`,t),e(null)})});n.on(`error`,t=>{O(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{O(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return O(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return O(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),O(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(O(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(GA).length} models`),this.executionCache=GA,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(GA).length} models`),GA)}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 O(`[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),O(`[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 qA=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function JA(e){if(typeof e==`string`)return qA.exec(e)?.[1]}function YA(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 XA(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=YA(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?JA(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 ZA(){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=m(),n=f(t,`.config`,`claude`),r=f(t,`.claude`);a(n)&&e.push(n),a(r)&&e.push(r)}return e}async function QA(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await lk(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=f(e,r.name);t.push(n)}}catch(t){O(`Failed to read projects directory ${e}:`,t)}}return t}async function $A(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await lk(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=f(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await uk(t,`utf-8`)).split(`
179
+ `)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{O(`Failed to check agent file ${t}`)}}}catch(e){O(`Failed to read subagents directory ${i}:`,e)}return r}function ej(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 tj=new Map;async function nj(e){try{let t=await dk(e),n=t.size,r=tj.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),tj.delete(e),tj.set(e,r),r.entries;let i;return n>1048576?(O(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await sj(e)):i=await aj(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(tj.delete(e),tj.size>=16&&tj.delete(tj.keys().next().value),tj.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return O(`Transcript not present yet: ${e}`),[];throw t}}function rj(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:XA(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 ij(e){let t=[];for(let n of e.split(`
180
+ `))if(n.trim())try{let e=rj(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function aj(e){return ij(await uk(e,`utf-8`))}async function oj(e,t){let n=await fk(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:ij(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function sj(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=se({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=rj(JSON.parse(t));e&&r.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{O(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{O(`File stream error for ${e}:`,t),n(t)})})}var cj=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 lj(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 uj={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},dj={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function fj(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function pj(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function mj(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function hj(e,t,n,r){let i=fj(new Date(pj())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:mj(),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 KA.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=fj(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...uj};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 gj(e){let t=0,n=0,r=mj(),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)??{...uj};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:dj,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 _j(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 vj=class{entries=new Map;flight=new cj;seeded=new Map;speedRings=new Map;speedFlight=new cj;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:dj,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e){let t=fj(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={...uj},i=!1;for(let e of this.entries.values()){i||=e.days.has(t);let n=e.days.get(t)??uj;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=ok(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=lj(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??ok(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 $A(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 oj(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 hj(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...gj(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=pj(),n=await QA(ZA()),r=[];for(let e of n){let n;try{n=await lk(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await dk(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await _j(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 yj(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function bj(e,t){let n=H.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function xj(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function Sj({text:e,trail:t}){if(t===void 0)return e;let n=bj([e,t]);return n.style=e.style,n}function Cj(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,trail:s=[]}=t;if(e.length===0)return[];let c=bj(e,a).pad(o),l=s.length===0?{}:{trail:bj([...s,new H(` `.repeat(o))],a)};if(n===`auto`)return[{text:c,...l}];let u={justify:r,truncate:i};return n===`fill`?[{text:c,fill:u,...l}]:(xj(c,n,u),[{text:c,...l}])}const wj=RegExp(`\\x1b\\[[0-9;]*m|${_i.source}`,`g`);function Tj(e){return Lt(e.replace(wj,``))}function Ej(e,t){let n=e.map(Sj),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=eO(n,t).split(`
181
+ `);if(i.length>1)return n;let a=Math.max(0,t.width-Tj(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];xj(l,l.cellLength+c,i),n[t]=Sj(e[t])}),n}function Dj(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=Oj(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(Aj(a.style).link){i();let e=Oj([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function Oj(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>kj(e,t)):e,r=H.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function kj(e,t){let n=e.copy();return n.style=t.add(Aj(e.style)),n}function Aj(e){return e instanceof B?e:B.parse(e)}var jj=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Mj(e,t,n,r,i){let{palette:a,tint:o}=e,s=Nj(n,i),c=s===void 0?o:Pj(a,s,`bg`);e.bg=c;let l=Nj(r,i),u=l===void 0?Ta(a,c,t):Pj(a,l,`fg`);return new B({bgcolor:gn.fromRgba(c),color:gn.fromRgba(u)})}function Nj(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Pj(e,t,n){try{return Xn(e,t)}catch(e){throw e instanceof qn?new jj(t,n,e.message):e}}function Fj(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,Ij(e,t,o,n,r,i));return i}function Ij(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=Ub(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=Sb.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=Ub(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=Ub(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:Rj(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:Rj(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:iC(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:Rj(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 Lj(e){return e.kind===`do`?Lj(e.head):e}function Rj(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function zj(e,t){return e.has(t)?bv(e.read(t)):``}function Bj(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function Vj(e,t,n,r){let i=new H(e,{style:B.combine([r,new B({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function Hj(e,t){return Math.max(e.members.indexOf(zj(t,e.stateVar)),0)}function Uj(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=zj(r,e.stateVar);return{effects:[{verb:eE,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=zj(r,e.stateVar);return{effects:[{verb:eE,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=zj(r,e.stateVar);return{effects:[{verb:eE,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(Hj(e,r)+1)%e.members.length];return{effects:[{verb:eE,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:tE,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:nE,args:[Bj(e.text,fy(r))]}],active:!1};case`open`:return{effects:[{verb:rE,args:[Bj(e.target,fy(r))]}],active:!1};case`persist-literal`:{let t=zj(r,e.stateVar);return{effects:[{verb:sE,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=zj(r,e.stateVar);return{effects:[{verb:sE,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(Hj(e,r)+1)%e.members.length];return{effects:[{verb:sE,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:cE,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:fE,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:mE,args:[i]}],active:!1};case`redo`:return{effects:[{verb:hE,args:[i]}],active:!1};case`save`:return{effects:[{verb:lE,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:uE,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:dE,args:[i,Bj(e.name,fy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:_E,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:vE,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:yE,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:bE,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:pE,args:[i,e.key,SO(e.op)]}],active:!1};case`do`:{let a=Uj(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>Uj(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:pE,args:[i,e.key,SO(r)]}],active:!1}}}}function Wj(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:qc(`action "${e}"`,n,t.members.length,Hj(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 Gj(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}=Wj(e,Lj(r),t,i),{effects:s,active:c}=Uj(r,a,o,i,zj(i,`session.id`));return Vj(a,CE(s),c)}function Kj(e){return{action:{fn:(t,...n)=>Gj(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function qj(e,t){return Vj(`✕`,CE([{verb:eE,args:[zj(e,`session.id`),t,Wc]}]),!1)}function Jj(e,t,n){return new B({bgcolor:gn.fromRgba(t),color:gn.fromRgba(Ta(e,t,n))})}function Yj(e,t,n){return Jj(e.palette,Ra(e.palette,e.disclosure,[t],n),n)}function Xj(e,t,n,r,i){return r===void 0?n=>Yj(e,{...n,distribution:t},i):(e,t)=>Zj(r(t,n),i)}function Zj(e,t){let n=ha(e,`background`);return new B({bgcolor:gn.fromRgba(n),color:gn.fromRgba(ir(ha(e,`primary`),n,4.5,t))})}function Qj(e){return{current:null,drawnAt:e}}function $j(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 eM(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 tM(e){return new H(e).cellLength}function nM(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function rM(e){return Math.max(1,nM(e)-(tM(`✕`)+2*e.padding+e.seamCols))}function iM(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 aM(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.overflow=t?`ignore`:void 0,r.end=``,r}function oM(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 sM(e,t,n){let r=e.compiled.get(t),i=r&&Lj(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 cM(e,t,n,r,i,a,o){let s=sM(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=zj(l,`session.id`),d=`stateVar`in s?zj(l,s.stateVar):void 0,f=s.options.map(tM),p=i?nM(a):1/0,m=tM(`✕`)+1,h=tM(`←`)+1+tM(`→`)+1,g=iM(f,p,m),_=g.length>1?iM(f,p,m+h):g,v=parseInt(zj(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>CE([{verb:eE,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=CE([{verb:eE,args:[u,...S]}]),ee=r?[{verb:eE,args:[u,...S]}]:[],te=e=>CE([...Uj(c,e,e,l,u).effects,...ee]),ne=[Vj(`✕`,C,!1)];y>0&&ne.push(Vj(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(Vj(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(Vj(`→`,x(y+1),!1)),aM(ne,i)}function lM(e,t){return{picker:{fn:(n,r,i,a,...o)=>{oy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=oM(e,r,`set-int`,`an int action ({ set, int: true })`);return cM(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,Xj(eM(t,`{{ picker }}`),la(void 0),e,sM(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function uM(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+tM(e(-(s+1)))+1+tM(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function dM(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=zj(a,`session.id`),{options:c}=t,l=c.length,u=zj(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=CE(Uj(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>Vj(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=uM(p,l,tM(`◀`)+1+tM(p(0))+1+tM(`▶`),rM(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return aM([...v(-1).reverse(),Vj(`◀`,h(-1),!1),g(0),Vj(`▶`,h(1),!1),...v(1)],!0)}function fM(e,t){return{carousel:{fn:(n,r,...i)=>{if(oy(`carousel "${n}"`,[`neighbours`],i),r!==void 0&&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=sM(e,n,`carousel`);return dM(n,o,e,Xj(eM(t,`{{ carousel }}`),la(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const pM=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function mM(e,t,n){let r=ja(e,{hue:ta,depth:0},n);return[ra(t).map((t,n)=>({text:pM[n%pM.length],colour:ga(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ha(e,`warning`)},{text:`error`,colour:ha(e,`error`)}]]}function hM(e,t,n,r){let i=mM(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:Jj(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.overflow=`ignore`,s.end=``,s}function gM(e,t){return{themePreview:{fn:()=>hM(e.palette,e.variation,t.drawnAt(),rM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const _M=e=>e.slice(e.lastIndexOf(`.`)+1),vM=(e,t)=>{let n=new H(_M(e));return n.truncate(t,{marker:`…`}),n.plain};function yM(e,t){let n=e.map(e=>e.map(({name:e})=>tM(_M(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 bM(e,t,n,r){let i=yM(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${vM(s,i)} `,{style:Jj(l,Ha(l,{kind:`bar`,variation: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.overflow=`ignore`,o.end=``,o}function xM(e,t){return{layoutPreview:{fn:()=>bM(e.layout(),e.variation,t.drawnAt(),rM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function SM(e,t,n,r){let i=eM(r.activeSegment,`{{ menu }}`),a=r.action,o=d_(i.placementId,e,n.key),s=m_(o),c=u_(e),l=zj(a.store,o)===c,u=zj(a.store,`session.id`),d=l?Wc:c,f=Vj(qc(`{{ menu "${e}" }}`,t,2,+!!l),CE([{verb:eE,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?[cM(e,{key:s,stateVar:s},[[o,Wc],[s,`0`]],n.closeOnPick,n.paged,a,Xj(i,n.distribution,a,sM(a,e,`menu`).paletteOf,r.activeSegment.drawnAt()))]:[]),f}const CM=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function wM(e,t){let n=t[t.length-1],r=CM(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:v_(r??{})}}function TM(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=wM(t,n);return SM(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function EM(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=DM(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.overflow=`ignore`,l}function DM(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 OM(e){let t={fn:(()=>{let t=eM(e,`{{ bgOf }}`);if(t.bg===void 0)throw Error(`{{ bgOf }} is not available while segments.${t.segName}'s own "bg:" is being evaluated — the background is what that template computes. Reach for a palette color there instead, e.g. bg: '{{ darken (color "surface") 1 }}'.`);return t.bg.hex}),argTypes:[],arity:{kind:`exact`},returnType:`string`},n={fn:(()=>eM(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=Kv(()=>eM(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...kM(s)];return EM({value:e,max:t,width:n,filled:i,empty:a,colourAt:c===void 0?void 0:e=>String(r.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function kM(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 AM(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 OM=({text:e,trail:t})=>t===void 0?[e]:[e,t];function kM(e,t){let n=t.flatMap(e=>e.filter(e=>e.place===`above`)),r=t.map(e=>e.filter(e=>e.place===`flow`));return[...n,...AM(e,r)]}function AM(e,t){switch(e){case`vertical`:return t.flatMap(e=>e);case`horizontal`:return t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,place:`flow`},...t.flatMap(e=>e.slice(1))]}}function jM(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:kM(e.direction,e.children.map((t,i)=>n(t,[...r,MM(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function MM(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Ds[e.direction]}}const NM={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:la(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ns(t.path,n)))}},render(e,t){return kM(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,MM(e,r))))}},PM={drop:e=>e.place,above:()=>`above`},FM={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:Os(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Xc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Ps(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=my(t.scope,e.settings);try{if(!gj(i.when,a))return[];let n=Ab(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&&gj(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,m=p===void 0?[]:t.renderBody(p.body,u,o.disclosure).map(e=>({...e,place:PM[p.placement](e)})),h=e.opens!==void 0&&m.some(e=>e.band===`own`)?bj(wj([t.closeDisclosure(e.opens.key)],o.trigger),{...f,width:`auto`,baseStyle:o.trigger}):[],g=e=>e.band===`own`?h:[],_=m.map(e=>({cells:[...g(e),...e.cells],band:`deeper`,place:e.place})),v=DM(wj(s,d)).map((e,t)=>({cells:bj(e,{...f,trail:t===0?wj(c,d):[]}),band:`own`,place:`flow`})),y=l.map(e=>({cells:bj(wj([e],o.band),{...f,baseStyle:o.band}),band:`deeper`,place:`flow`})),b=[...v,...y];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...b.flatMap(e=>e.cells),...m.flatMap(g)].flatMap(OM)),[...b,..._]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:bj([new H(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,trail:IM(e,a,t)}),band:`own`,place:`flow`}]}}};function IM(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 LM={container:NM,segment:FM};function RM(e){return LM[e]}function zM(e){if(`ttl`in e)return{kind:`ttl`,durationMs:tb(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 BM(e,t){switch(Ls(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 VM(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:zM(n.cache),parse:BM(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:zM(n.cache),parse:BM(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?tb(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 HM(e,t){let n=Ud.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 UM=e=>xo(void 0,null,e.globals.progression);function WM(e,t,n){let r=n.cwd,i=Lb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:ZD({style:`powerline`,charset:uo}),width:80,basePalette:i,palette:i,progression:ea[UM(e)],padding:1,seamCols:QD({style:`powerline`,charset:uo}),layout:()=>[]},o=Yj(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.looks),l=x_(e.presets),u=new Map([...Vb(e),...gx(e)]),d=dy({...Uj(a),...oM(a,o),...lM(a,o),...pM(a,o),...vM(a,o),...SM(s),...TM(o),looks:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=HM(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 Cb)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=Mj(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{VM(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{VM(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=Us(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:()=>Js(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 RM(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=w_(e,t);C.set(t,S(n,r))}let ee=new Map(Qa.map(e=>[e,new Map])),te=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of te)for(let n of Qa){let r=t[n];if(!$a(r))continue;let i=`${e}.${n}`,a=ee.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:GM(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function GM(e,t,n){try{return e(n)}catch(e){throw Error(`${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function KM(e,t,n){let r=e.globalExpressions.get(t).get(n);if(r===void 0)throw Error(`the ${t} rule ${JSON.stringify(n)} reached the render but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r}function qM(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function JM(e,t){return e.kind===`decided`?e.name:t}function YM(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(vo(a.colorCompatibility));let{preset:d=y_}=s??{},f=T_(e,d),p=ea[s?.progression??xo(void 0,null,f.progression)];t.menuRuntime.action.progression=p;let m=s?.look??io(`none`,e.looks),h=s?.theme??Fb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},look:{effective:t}});r.applyInput(g(JM(h,Ga),JM(m,no))),t.menuRuntime.action.chromeCols=ZD(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=QD(a);let _=fy(n),v=to(h,e=>{let n=KM(t,`palette`,e);return Pb(qM(n,_),n.where,e=>u?.(e))}),y=to(m,n=>io(qM(KM(t,`look`,n),_),e.looks));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=Mb(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o)=>{try{let s=r.drawnAt(),{tint:c,disclosure:l}=Ha(i,a,s),u=Xj(t.activeSegment,e.name,e.id,i,l,c),d=kj(u,s,o.bg,o.fg,n),f=o.body.evaluate(n),p=o.trail?.evaluate(n)??[];return{styles:{closed:d,get trigger(){return Gj(i,ja(i,l,s).state,s)},get band(){return Gj(i,ja(i,l,s).plane,s)},disclosure:l},fragments:f,trail:p,drops:u.drops}}finally{t.activeSegment.current=null}},ee=(e,t,r)=>{let i=t&&gj(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>ee(e,t,Ba(r,n)),renderBody:(e,t,n)=>ee(e,i&&t,Va(n)),closeDisclosure:e=>Wj(n,e)};return RM(e.kind).render(e,o)},te=t.roots.get(d);if(te===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${y_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let ne=e=>{if(!gj(e.when,_))return!1;if(e.kind===`container`)return!0;if(Tx(e.name)===void 0)return!1;try{return gj(t.segments[e.name].when,my(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>jM(te,ne).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Tx(e);return r===void 0?[]:[{name:r,address:t,palette:Ab(n.theme,x)}]})),ee(te,!0,za(p)).map(e=>$D(Cj(e.cells,a),a)).join(`
185
- `)}var XM=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,nN(e,t,n,`initial value`),this.cell=_v.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){nN(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}},ZM=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,_v.computed)(()=>{let e=n();return nN(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},QM=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=_v.observable.box(tN(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=tN(e);eN(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function $M(e){return JSON.stringify(e)}function eN(e,t){return $M(e)===$M(t)}function tN(e){return e.kind===`ok`?{kind:`ok`,value:vv(e.value)}:e}function nN(e,t,n,r){let i=yv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var rN=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new XM(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new QM(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new ZM(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,_v.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,_v.runInAction)(()=>n.set(t))}runInAction(e){(0,_v.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 $M(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 iN(e,t,n){return e+`\0`+t+`\0`+(n??``)}function aN(e,t){return new Set(x_(e.presets).filter(n=>w_(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function oN(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 sN(e,t){let n=new Map;for(let t of Ew(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=oN(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 cN(e){return e.filter(Boolean).join(`
186
- `)||null}var lN=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=iN(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=Ow(e,t,n),i=r.kind===`file`?r.path:null,a=[Mw(e,t),Aw(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof xs&&a.push(...e.warnings),{resolvedPath:i,warning:cN(a),state:null,error:e instanceof xs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:cN(a),state:o,error:null}}buildState(e,t,n){let r=Nw(t,nk),{config:i,raw:a}=r;n.push(...r.warnings);let o=Iw(r,t??`<default>`),s=new rN,c=new vb(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=WM(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of wA(o))u.push(_A(e,t));for(let{key:e,spec:t}of VO(o))u.push(HO(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:jk(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:aN(i,a),fileHeldSettings:iA(a)}}refreshWatcher(e,t){e.configFilePath=t;let n=sN(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 uN=16384;var dN=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<uN){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%uN}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:OE,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 fN={load:()=>({}),save:()=>{},flush:()=>{}};function pN(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var mN=class{sessions;storage;atom=(0,_v.createAtom)(`SessionState`);constructor(e=fN,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=pN(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,_v.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,_v.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,_v.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 hN=(e,t)=>O(t);function gN(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 _N=class{timer=null;pending=null;constructor(e,t=500,n=hN){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 gN(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 vN={default_empty_value:`string`,default_separator:`string`,palette:`string`,look:`string`,preset:`string`,style:`string`,progression:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},yN=new Set([`1`,`true`]),bN=new Set([`0`,`false`,``]);function xN(e,t){let n=KN(e),r=n.scope===`segment-palette`?`string`:vN[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(yN.has(t))return`true`;if(bN.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function SN(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function CN(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),k(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function wN(e){return/^\s*$/.test(e)?null:Lo(e)}function TN(e,t){return e!==null&&zo(e,t)!==void 0}function EN(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(EN),...i}}return e}function DN(e){if(!Mc(e))return EN(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,EN(t)])),...n}}const ON=ek,kN=ON.segments,AN=ON.presets,jN=ON.root;function MN(e,t,n,r){if(!TN(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function NN(e,t){let n=$b(t);return t.scope===`segment-palette`&&MN(e,[`segments`,t.segment],kN[t.segment],n.join(`.`)),n}function PN(e){return Lo(qo(e))}function FN(){return Object.entries(jN.rows).map(([e,t])=>{let n=EN(t);return{path:[`root`],fragment:PN({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function IN(e,t){let n=e===null?void 0:zo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function LN(e,t){if(t===void 0)return null;let n=DN(t);return{path:e,fragment:PN(n),unit:{path:e,value:n}}}function RN(e,t){let n=[`presets`,t],r=[...n,`root`],i=AN[t];MN(e,n,i,r.join(`.`));let a=IN(e,r)??LN(r,i?.root);return a!==null&&ms(a.fragment)?a:null}function zN(e,t){let n=ps(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 BN(e,t){return[...FN(),IN(e,[`root`]),RN(e,t)].filter(e=>e!==null).reduce(zN,new Map)}function VN(e,t,n){for(let{node:r,...i}of BN(e,t).values())if(gs(r,n))return i;throw new $(`${HN(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 HN(e,t){return RN(e,t)?.path??[`root`]}function UN(e,t){return t.scope===`preset-root`?HN(e,t.preset):$b(t)}function WN(e,{unit:t}){return t===null?e:ss(e,t.path,qo(t.value),Go)}function GN(e){let t=Qb(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function KN(e){let t=GN(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function qN(e,t,n,r){JN(t,r),CN(t,r,e.logger),e.record(t,n,r)}function JN(e,t){try{return Iw(Pw(e,t,nk),e)}catch(e){throw e instanceof xs?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function YN(e,t){let n=KN(t),r=wN(SN(e)??``),i=r===null?void 0:zo(r,$b(n));return i!==void 0&&`value`in i?i.value:void 0}function XN(e,t,n){ZN(e,t,n,[])}function ZN(e,t,n,r){let i=SN(t);qN(e,t,i,QN(n.reduce((e,[t,n])=>ss(e,NN(wN(e),KN(t)),xN(t,n),Go),i??``),t,r,e=>e))}function QN(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=VN(wN(s),n,i),l=bs(WN(s,c),c.path,i,a,qo(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 $N(e,t,n){let r=wN(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of BN(r,t)){if(!gs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Vo(e,c):qo(s.value);if(a!==`#`)return ss(e,[...i,`rows`,a],l,Go);if(RN(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 ss(e,i,l,Go)}return e}function eP(e,t){return ls(e,t,t[0]===`presets`&&t.length>2&&!ik(t[1])?2:0)}function tP(e,t,n){let r=n.map(GN),i=SN(t);if(i===null)return;let a=r.reduce((e,t)=>eP(e,UN(wN(e),t)),i);a!==i&&qN(e,t,i,a)}function nP(e){let t=e===null?void 0:zo(e,[`presets`]),n=new Set([...rk,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(pu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(pu(e)))}function rP(e,t,n,r,i,a){let o=SN(t),s=wN(o??``),c=nP(s),l=[`presets`,c],u=RN(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Vo(o??``,u.fragment):qo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],qo(r)]]],f=i.map(([e,t])=>{let n=Zb(c,e);return[NN(s,KN(n)),xN(n,t)]});return qN(e,t,o,QN([...d,...f].reduce((e,[t,n])=>ss(e,t,n,Go),ss(o??``,l,`{}`,Go)),t,a.map(e=>({...e,preset:c})),$N)),c}function iP(e,t,n){if(ik(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=SN(t),a=wN(i??``);if(i===null||a===null||zo(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=zo(a,[`globals`,`preset`]);qN(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>eP(e,t),i))}function aP(e,t,n,r){let i=GN(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=SN(t),o=r.op===`remove`?r.target:r.anchor,s=VN(wN(a??``),i.preset,o),c=WN(a??``,s),{after:l,placed:u}=oP(c,s.path,r,()=>{let e=JN(t,c);return x_(e.presets).map(t=>w_(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 qN(e,t,a,l),u}function oP(e,t,n,r){switch(n.op){case`remove`:return{after:vs(e,t,n.target),placed:null};case`insert`:{let i=CO(n.segment,n.anchor,r());return{after:ys(e,t,i,n.anchor,n.relation),placed:i}}}}const sP={load:()=>({}),save:()=>{}},cP=new Set(xb.map(e=>e.sessionKey)),lP=e=>cP.has(e)||e.startsWith(H_),uP={past:[],future:[]},dP=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var fP=class{state=new Map;constructor(e,t,n=sP){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)??uP;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??uP}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(dP(n));r.set(dP(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=this.sessionState,r=(e,r,i)=>{let a=r.filter(lP).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:hP([...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:hP([...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:hP([...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(dP));throw this.put(e,{past:gP(this.history(e).past,t),future:gP(this.history(e).future,t)}),new $(`${r}: ${o.map(vP).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):SN(t.file)}write(e,t,n){t.kind===`file`?CN(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||pP(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,mP(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function pP(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 mP({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function hP(e){return e.slice(-50)}function gP(e,t){return e.map(e=>e.filter(e=>!t.has(dP(e)))).filter(e=>e.length>0)}function _P(e){return e.map(vP).join(`, `)}function vP(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function yP(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 bP(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(yP))}function xP(e){if(typeof e!=`object`||!e)return!1;let t=e;return bP(t.past)&&bP(t.future)}function SP(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(xP))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),k(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 CP(e,t,n,r){let i=Oe({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 wP(e){let t=CP(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 TP(){return{probeTmux:wP}}function EP(e){let t=PE(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 DP(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function OP(e,t){return{tmux:DP(e,t.tmux),claudeSettings:EP(jE(AE(t.claudeConfigDir)))}}function kP(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ss(NE(n),[`env`,e.name],JSON.stringify(e.value),Ko);return r.mkdirSync(c.dirname(n),{recursive:!0}),k(n,i),{...t,claudeSettings:EP(n)}}default:return e.kind}}const AP=/^─{20,}/,jP=/^❯(\s|$)/,MP=/›\s*stashed$/;function NP(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>AP.test(e)?[t]:[]).at(-2);return n===void 0||!jP.test(t[n+1]??``)?{kind:`no-prompt`}:MP.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const PP={"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 FP(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=NP(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:PP[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const IP=`cc-candybar-slash`;function LP(e,t,n,r){let i=CP(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function RP(e){let t=LP(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 zP(e,t){let n=LP(e,`claude-input.type`,[`load-buffer`,`-b`,IP,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,IP,`-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 BP(){return{read:RP,type:zP}}function VP(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function HP(e){return UP(()=>decodeURIComponent(e))}function UP(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function WP(e,t){let n=Oe({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 GP=(e,t)=>WP(HP(e),t),KP=(e,t)=>{let n=Oe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,HP(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`})`)}},qP=(e,t)=>WP(HP(e),t),JP=(e,t)=>WP(HP(e),t),YP=(e,t)=>{let n=VP(HP(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},XP=(e,t)=>{let[n=``,...r]=UP(()=>xE(e)),i=VP(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${gA().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: ${gA().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=vA(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}eF(t,i,`set-state`,a),t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},ZP=/^-?\d+$/;function QP(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const $P=(e,t)=>{let[n=``,r=``,i=``]=UP(()=>xE(e)),a=VP(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!ZP.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=yA(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${gA().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&ZP.test(c)?tF(s,parseInt(c,10)):nF(`step-state`,r,s,SA(t.configFor(oF(t,a)),e=>t.sessionState.get(a,e),r)),u=QP(l,o,s.min,s.max),d=vA(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);eF(t,a,`step-state`,[{key:r,value:d.value}]),t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function eF(e,t,n,r){let i=r.filter(e=>e.key.startsWith(H_));if(i.length===0)return;let a=$k(e.configFor(oF(e,t)),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function tF(e,t){return Math.max(e.min,Math.min(e.max,t))}function nF(e,t,n,r){if(r===null)return n.min;if(!ZP.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return tF(n,parseInt(r,10))}const rF=`render-origin`;function iF(e){return JSON.stringify(e)}function aF(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 oF(e,t){let n=e.sessionState.get(t,rF);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return aF(n)}function sF(e){return kw(e.projectDir,e.cwd,e.configFile??void 0)}function cF(e,t){return sF(oF(e,t))}function lF(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const uF=(e,t)=>{let[n=``,r=``,i=``]=UP(()=>xE(e)),a=VP(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${PO().join(`, `)})`);let o=FO(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=cF(t,a);XN(lF(t,a),s,[[r,o.value]]),t.dlog(`info`,`set-config: ${r}=${o.value} → ${s} (session=${a})`)},dF=(e,t)=>{let[n=``,r=``,i=``]=UP(()=>xE(e)),a=VP(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!ZP.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=IO(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${PO().join(`, `)})`);let c=oF(t,a),l=sF(c),u=YN(l,r),d=typeof u==`number`?tF(s,u):nF(`step-config`,r,s,RO(t.configFor(c),r)),f=QP(d,o,s.min,s.max),p=FO(r,String(f));if(!p.ok)throw new $(`step-config: ${p.reason}`);XN(lF(t,a),l,[[r,p.value]]),t.dlog(`info`,`step-config: ${r} ${d}→${p.value} (by ${o}) → ${l} (session=${a})`)},fF=(e,t)=>{let[n=``]=UP(()=>xE(e)),r=VP(n),i=oF(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=Zk(a,o),c=Qk(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=vA(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});mF(`save`,c);let u=sF(i);ZN(lF(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(pF)].join(` `)} → ${u} (session=${r})`)},pF=e=>`${e.preset}/${e.id}.settings.${e.setting}=${qs(e.value)}`;function mF(e,t){for(let n of t){let t=vA(n.key,qs(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const hF=(e,t)=>{let[n=``]=UP(()=>xE(e)),r=VP(n),i=oF(t,r),a=nA(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=vA(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});mF(`save-preset`,a.placements);let s=sF(i),c=rP(lF(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...xb.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,bb.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(pF)].join(` `)} → ${s} (session=${r})`)},gF=(e,t)=>{let[n=``,r=``]=UP(()=>xE(e)),i=VP(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=oF(t,i),o=sF(a);iP(lF(t,i),o,r),t.reloadConfig(a);let s=bb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},_F=(e,t)=>{let[n=``,...r]=UP(()=>xE(e)),i=VP(n),a=PO(),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=oF(t,i),c=sF(s),l=r.map(rA),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);tP(lF(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 vF(e,t){let n=(e,t)=>[...Ms(w_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(x_(t.presets).flatMap(e=>n(t,e).map(t=>`${e}\0${Os(t)}`)));return x_(e.presets).flatMap(t=>n(e,t).flatMap(e=>r.has(`${t}\0${Os(e)}`)?[]:Object.values(e.drafts??{}).map(e=>e.key)))}const yF=(e,t)=>{let[n=``,r=``,i=``]=UP(()=>xE(e)),a=VP(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${PO().join(`, `)})`);let o=FO(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=SO(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=oF(t,a),l=sF(c),u=t.configFor(c),d=aP(lF(t,a),l,r,s);t.reloadConfig(c);let f=vF(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})`)},bF=(e,t)=>{let[n=``]=UP(()=>xE(e)),r=VP(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${_P(i)} (session=${r})`)},xF=(e,t)=>{let[n=``]=UP(()=>xE(e)),r=VP(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${_P(i)} (session=${r})`)},SF=(e,t)=>{VP(HP(e)),t.applyUpdate()},CF=`client-hints`;function wF(e,t){let n=e.sessionState.get(t,CF);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 Uw(r)}function TF(e,t,n){let r=Lx(n);e.sessionState.setBatch(t,Vx(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const EF=(e,t)=>{let n=VP(HP(e));TF(t,n,OP(t.doctor,wF(t,n)))},DF=(e,t)=>{let[n=``,r=``]=UP(()=>xE(e)),i=VP(n),a=Rx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=OP(t.doctor,wF(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=kP(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),TF(t,i,c)},OF=(e,t)=>{let[n=``,...r]=UP(()=>xE(e)),i=VP(n),a=oF(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=iC(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})`)},kF=(e,t)=>{let[n=``,r=``]=UP(()=>xE(e)),i=VP(n),a=Object.values(t.configFor(oF(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=FP(t.claudeInput,wF(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})`)},AF=`config-override`,jF=new Map([[tE,GP],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=VP(UP(()=>decodeURIComponent(e.slice(0,n)))),i=UP(()=>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,AF),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,AF,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[nE,KP],[$T,XP],[eE,$P],[oE,uF],[sE,dF],[dE,_F],[cE,fF],[lE,hF],[uE,gF],[fE,yF],[pE,bF],[mE,xF],[iE,qP],[aE,JP],[rE,YP],[hE,SF],[gE,EF],[_E,DF],[vE,OF],[yE,kF]]),MF=new Set([$T,eE,oE,sE,dE,cE,lE,uE,fE,pE,mE,rE,hE,gE,_E,vE,yE]),NF=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of TE(CE(e))){if(!i&&MF.has(a)){let e=xE(o);e.length>0&&e[0]&&(i=e[0])}let e=jF.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 PF(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 FF=new Map([...jF,[QT,NF]].map(([e,t])=>[e,PF(t)]));Object.freeze([...FF.keys()]);const IF=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`]),LF=[[`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 RF(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of LF){let i=BF(n,e);if(i==null)t.missingRequired.push(e);else{let n=zF(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))IF.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function zF(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function BF(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 VF(e,t){switch(e){case`vars`:return{what:e,vars:HF(t)};case`segments`:return{what:e,segments:qF(t)};case`config`:return{what:e,config:ZF(t)}}}function HF(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=GF(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,...UF(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:WF(r.lastUpdatedMs())})}return o}function UF(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 WF(e){return e===null?null:Math.max(0,Date.now()-e)}function GF(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,KF(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}`,KF(i));return t}function KF(e){return e.kind}function qF(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=YF(n),o=JF(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:XF(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function JF(e){let t=new Map;for(let n of x_(e.presets))for(let r of Ms(w_(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=Os(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function YF(e){let t=[],n=new Set;for(let r of Ms(Fc(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 XF(e,t,n){let r=new Set;for(let i of sv(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 ZF(e){return e===null?null:e.config}const QF=[`vars`,`segments`,`config`];function $F(e){return typeof e==`string`&&QF.includes(e)}function eI(e){return Math.max(1,e-2)}var tI=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 O(`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);O(`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{O(`Calculating context tokens from transcript: ${e}`);let n=await $A(e);if(n.length===0)return O(`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,O(`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 O(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`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)}},nI=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=ak(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await rj(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 rI={messageCount:0,recent:[]};function iI(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!ZA(t),recent:n.length>20?n.slice(-20):n}}function aI(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(ZA(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 oI=class{fold=new nI(rI,iI);async getMetricsInfo(e,t){if(O(`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:aI(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 sI={command:null,todos:[],pending:[],done:[]};function cI(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 lI(e,t){if(t.isSidechain)return e;let n=ZA(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=cI(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 uI(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>cI(e,t.name),[]),done:e.done}}var dI=class{fold=new nI(sI,lI);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(uI(n.value))}};const fI=new Map;function pI(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var mI=class{async getSessionId(){if(!process.env.TMUX_PANE)return Y;let e=pI(process.env.TMUX),t=fI.get(e);if(t!==void 0)return t;O(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await De({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 fI.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};const hI=e=>`${e.sessionId}|${e.projectDir}|${e.cwd}`;var gI=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=hI(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=hI(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};const _I=c.join(`lib`,`ceiling_config.py`),vI=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function yI(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 bI(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 xI(e,t){if(!r.existsSync(e))return Y;let n;try{n=yI(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=bI([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=[_I,vI].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 SI(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 CI(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function wI(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 TI(e,t){let n=await De({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 jM=({text:e,trail:t})=>t===void 0?[e]:[e,t];function MM(e,t){let n=t.flatMap(e=>e.filter(e=>e.place===`above`)),r=t.map(e=>e.filter(e=>e.place===`flow`));return[...n,...NM(e,r)]}function NM(e,t){switch(e){case`vertical`:return t.flatMap(e=>e);case`horizontal`:return t.reduce((e,t)=>Math.max(e,t.length),0)===0?[]:[{cells:t.flatMap(e=>e[0]?.cells??[]),band:`own`,place:`flow`},...t.flatMap(e=>e.slice(1))]}}function PM(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:MM(e.direction,e.children.map((t,i)=>n(t,[...r,FM(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function FM(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Ds[e.direction]}}const IM={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:la(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ns(t.path,n)))}},render(e,t){return MM(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,FM(e,r))))}},LM={drop:e=>e.place,above:()=>`above`},RM={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:Os(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Xc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Ps(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=my(t.scope,e.settings);try{if(!yj(i.when,a))return[];let n=Ab(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&&yj(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,m=p===void 0?[]:t.renderBody(p.body,u,o.disclosure).map(e=>({...e,place:LM[p.placement](e)})),h=e.opens!==void 0&&m.some(e=>e.band===`own`)?Cj(Dj([t.closeDisclosure(e.opens.key)],o.trigger),{...f,width:`auto`,baseStyle:o.trigger}):[],g=e=>e.band===`own`?h:[],_=m.map(e=>({cells:[...g(e),...e.cells],band:`deeper`,place:e.place})),v=AM(Dj(s,d)).map((e,t)=>({cells:Cj(e,{...f,trail:t===0?Dj(c,d):[]}),band:`own`,place:`flow`})),y=l.map(e=>({cells:Cj(Dj([e],o.band),{...f,baseStyle:o.band}),band:`deeper`,place:`flow`})),b=[...v,...y];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...b.flatMap(e=>e.cells),...m.flatMap(g)].flatMap(jM)),[...b,..._]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:Cj([new H(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,trail:zM(e,a,t)}),band:`own`,place:`flow`}]}}};function zM(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 BM={container:IM,segment:RM};function VM(e){return BM[e]}function HM(e){if(`ttl`in e)return{kind:`ttl`,durationMs:tb(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 UM(e,t){switch(Ls(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 WM(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:HM(n.cache),parse:UM(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:HM(n.cache),parse:UM(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?tb(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 GM(e,t){let n=Ud.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 KM=e=>xo(void 0,null,e.globals.variation);function qM(e,t,n){let r=n.cwd,i=Lb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:QD({endcaps:`powerline`,charset:uo}),width:80,basePalette:i,palette:i,variation:ea[KM(e)],padding:1,seamCols:$D({endcaps:`powerline`,charset:uo}),layout:()=>[]},o=Qj(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=x_(e.presets),u=new Map([...Vb(e),...gx(e)]),d=dy({...Kj(a),...lM(a,o),...fM(a,o),...gM(a,o),...xM(a,o),...TM(s),...OM(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=GM(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 Cb)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=Fj(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{WM(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{WM(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=Us(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:()=>Js(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 VM(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=w_(e,t);C.set(t,S(n,r))}let ee=new Map(Qa.map(e=>[e,new Map])),te=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of te)for(let n of Qa){let r=t[n];if(!$a(r))continue;let i=`${e}.${n}`,a=ee.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:JM(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function JM(e,t,n){try{return e(n)}catch(e){throw Error(`${t} is not a valid template: ${e instanceof Error?e.message:String(e)}`)}}function YM(e,t,n){let r=e.globalExpressions.get(t).get(n);if(r===void 0)throw Error(`the ${t} rule ${JSON.stringify(n)} reached the render but no compiled template exists — registerDslConfig and the resolution disagree about isExpression`);return r}function XM(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function ZM(e,t){return e.kind===`decided`?e.name:t}function QM(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(vo(a.colorCompatibility));let{preset:d=y_}=s??{},f=T_(e,d),p=ea[s?.variation??xo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??io(`none`,e.styles),h=s?.theme??Fb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(ZM(h,Ga),ZM(m,no))),t.menuRuntime.action.chromeCols=QD(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=$D(a);let _=fy(n),v=to(h,e=>{let n=YM(t,`palette`,e);return Pb(XM(n,_),n.where,e=>u?.(e))}),y=to(m,n=>io(XM(YM(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=Mb(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o)=>{try{let s=r.drawnAt(),{tint:c,disclosure:l}=Ha(i,a,s),u=$j(t.activeSegment,e.name,e.id,i,l,c),d=Mj(u,s,o.bg,o.fg,n),f=o.body.evaluate(n),p=o.trail?.evaluate(n)??[];return{styles:{closed:d,get trigger(){return Jj(i,ja(i,l,s).state,s)},get band(){return Jj(i,ja(i,l,s).plane,s)},disclosure:l},fragments:f,trail:p,drops:u.drops}}finally{t.activeSegment.current=null}},ee=(e,t,r)=>{let i=t&&yj(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>ee(e,t,Ba(r,n)),renderBody:(e,t,n)=>ee(e,i&&t,Va(n)),closeDisclosure:e=>qj(n,e)};return VM(e.kind).render(e,o)},te=t.roots.get(d);if(te===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${y_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let ne=e=>{if(!yj(e.when,_))return!1;if(e.kind===`container`)return!0;if(Tx(e.name)===void 0)return!1;try{return yj(t.segments[e.name].when,my(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>PM(te,ne).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Tx(e);return r===void 0?[]:[{name:r,address:t,palette:Ab(n.theme,x)}]})),ee(te,!0,za(p)).map(e=>eO(Ej(e.cells,a),a)).join(`
185
+ `)}var $M=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,aN(e,t,n,`initial value`),this.cell=_v.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){aN(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}},eN=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,_v.computed)(()=>{let e=n();return aN(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},tN=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=_v.observable.box(iN(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=iN(e);rN(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function nN(e){return JSON.stringify(e)}function rN(e,t){return nN(e)===nN(t)}function iN(e){return e.kind===`ok`?{kind:`ok`,value:vv(e.value)}:e}function aN(e,t,n,r){let i=yv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var oN=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new $M(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new tN(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new eN(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,_v.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,_v.runInAction)(()=>n.set(t))}runInAction(e){(0,_v.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 nN(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 sN(e,t,n){return e+`\0`+t+`\0`+(n??``)}function cN(e,t){return new Set(x_(e.presets).filter(n=>w_(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function lN(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 uN(e,t){let n=new Map;for(let t of Dw(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=lN(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 dN(e){return e.filter(Boolean).join(`
186
+ `)||null}var fN=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=sN(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=kw(e,t,n),i=r.kind===`file`?r.path:null,a=[Nw(e,t),jw(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof xs&&a.push(...e.warnings),{resolvedPath:i,warning:dN(a),state:null,error:e instanceof xs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:dN(a),state:o,error:null}}buildState(e,t,n){let r=Pw(t,rk),{config:i,raw:a}=r;n.push(...r.warnings);let o=Lw(r,t??`<default>`),s=new oN,c=new vb(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=qM(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of DA(o))u.push(bA(e,t));for(let{key:e,spec:t}of HO(o))u.push(UO(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:Mk(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:cN(i,a),fileHeldSettings:sA(a)}}refreshWatcher(e,t){e.configFilePath=t;let n=uN(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 pN=16384;var mN=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<pN){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%pN}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:kE,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 hN={load:()=>({}),save:()=>{},flush:()=>{}};function gN(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var _N=class{sessions;storage;atom=(0,_v.createAtom)(`SessionState`);constructor(e=hN,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=gN(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,_v.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,_v.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,_v.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 vN=(e,t)=>O(t);function yN(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 bN=class{timer=null;pending=null;constructor(e,t=500,n=vN){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 yN(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 xN={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,preset:`string`,endcaps:`string`,variation:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},SN=new Set([`1`,`true`]),CN=new Set([`0`,`false`,``]);function wN(e,t){let n=YN(e),r=n.scope===`segment-palette`?`string`:xN[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(SN.has(t))return`true`;if(CN.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function TN(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function EN(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),k(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function DN(e){return/^\s*$/.test(e)?null:Lo(e)}function ON(e,t){return e!==null&&zo(e,t)!==void 0}function kN(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(kN),...i}}return e}function AN(e){if(!Mc(e))return kN(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,kN(t)])),...n}}const jN=tk,MN=jN.segments,NN=jN.presets,PN=jN.root;function FN(e,t,n,r){if(!ON(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function IN(e,t){let n=$b(t);return t.scope===`segment-palette`&&FN(e,[`segments`,t.segment],MN[t.segment],n.join(`.`)),n}function LN(e){return Lo(qo(e))}function RN(){return Object.entries(PN.rows).map(([e,t])=>{let n=kN(t);return{path:[`root`],fragment:LN({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function zN(e,t){let n=e===null?void 0:zo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function BN(e,t){if(t===void 0)return null;let n=AN(t);return{path:e,fragment:LN(n),unit:{path:e,value:n}}}function VN(e,t){let n=[`presets`,t],r=[...n,`root`],i=NN[t];FN(e,n,i,r.join(`.`));let a=zN(e,r)??BN(r,i?.root);return a!==null&&ms(a.fragment)?a:null}function HN(e,t){let n=ps(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 UN(e,t){return[...RN(),zN(e,[`root`]),VN(e,t)].filter(e=>e!==null).reduce(HN,new Map)}function WN(e,t,n){for(let{node:r,...i}of UN(e,t).values())if(gs(r,n))return i;throw new $(`${GN(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 GN(e,t){return VN(e,t)?.path??[`root`]}function KN(e,t){return t.scope===`preset-root`?GN(e,t.preset):$b(t)}function qN(e,{unit:t}){return t===null?e:ss(e,t.path,qo(t.value),Go)}function JN(e){let t=Qb(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function YN(e){let t=JN(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function XN(e,t,n,r){ZN(t,r),EN(t,r,e.logger),e.record(t,n,r)}function ZN(e,t){try{return Lw(Fw(e,t,rk),e)}catch(e){throw e instanceof xs?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function QN(e,t){let n=YN(t),r=DN(TN(e)??``),i=r===null?void 0:zo(r,$b(n));return i!==void 0&&`value`in i?i.value:void 0}function $N(e,t,n){eP(e,t,n,[])}function eP(e,t,n,r){let i=TN(t);XN(e,t,i,tP(n.reduce((e,[t,n])=>ss(e,IN(DN(e),YN(t)),wN(t,n),Go),i??``),t,r,e=>e))}function tP(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=WN(DN(s),n,i),l=bs(qN(s,c),c.path,i,a,qo(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 nP(e,t,n){let r=DN(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of UN(r,t)){if(!gs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Vo(e,c):qo(s.value);if(a!==`#`)return ss(e,[...i,`rows`,a],l,Go);if(VN(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 ss(e,i,l,Go)}return e}function rP(e,t){return ls(e,t,t[0]===`presets`&&t.length>2&&!ak(t[1])?2:0)}function iP(e,t,n){let r=n.map(JN),i=TN(t);if(i===null)return;let a=r.reduce((e,t)=>rP(e,KN(DN(e),t)),i);a!==i&&XN(e,t,i,a)}function aP(e){let t=e===null?void 0:zo(e,[`presets`]),n=new Set([...ik,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(pu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(pu(e)))}function oP(e,t,n,r,i,a){let o=TN(t),s=DN(o??``),c=aP(s),l=[`presets`,c],u=VN(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Vo(o??``,u.fragment):qo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],qo(r)]]],f=i.map(([e,t])=>{let n=Zb(c,e);return[IN(s,YN(n)),wN(n,t)]});return XN(e,t,o,tP([...d,...f].reduce((e,[t,n])=>ss(e,t,n,Go),ss(o??``,l,`{}`,Go)),t,a.map(e=>({...e,preset:c})),nP)),c}function sP(e,t,n){if(ak(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=TN(t),a=DN(i??``);if(i===null||a===null||zo(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=zo(a,[`globals`,`preset`]);XN(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>rP(e,t),i))}function cP(e,t,n,r){let i=JN(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=TN(t),o=r.op===`remove`?r.target:r.anchor,s=WN(DN(a??``),i.preset,o),c=qN(a??``,s),{after:l,placed:u}=lP(c,s.path,r,()=>{let e=ZN(t,c);return x_(e.presets).map(t=>w_(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 XN(e,t,a,l),u}function lP(e,t,n,r){switch(n.op){case`remove`:return{after:vs(e,t,n.target),placed:null};case`insert`:{let i=wO(n.segment,n.anchor,r());return{after:ys(e,t,i,n.anchor,n.relation),placed:i}}}}const uP={load:()=>({}),save:()=>{}},dP=new Set(xb.map(e=>e.sessionKey)),fP=e=>dP.has(e)||e.startsWith(H_),pP={past:[],future:[]},mP=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var hP=class{state=new Map;constructor(e,t,n=uP){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)??pP;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??pP}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(mP(n));r.set(mP(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=this.sessionState,r=(e,r,i)=>{let a=r.filter(fP).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:vP([...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:vP([...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:vP([...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(mP));throw this.put(e,{past:yP(this.history(e).past,t),future:yP(this.history(e).future,t)}),new $(`${r}: ${o.map(xP).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):TN(t.file)}write(e,t,n){t.kind===`file`?EN(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||gP(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,_P(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function gP(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 _P({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function vP(e){return e.slice(-50)}function yP(e,t){return e.map(e=>e.filter(e=>!t.has(mP(e)))).filter(e=>e.length>0)}function bP(e){return e.map(xP).join(`, `)}function xP(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function SP(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 CP(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(SP))}function wP(e){if(typeof e!=`object`||!e)return!1;let t=e;return CP(t.past)&&CP(t.future)}function TP(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(wP))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),k(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 EP(e,t,n,r){let i=Oe({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 DP(e){let t=EP(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 OP(){return{probeTmux:DP}}function kP(e){let t=FE(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 AP(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function jP(e,t){return{tmux:AP(e,t.tmux),claudeSettings:kP(ME(jE(t.claudeConfigDir)))}}function MP(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ss(PE(n),[`env`,e.name],JSON.stringify(e.value),Ko);return r.mkdirSync(c.dirname(n),{recursive:!0}),k(n,i),{...t,claudeSettings:kP(n)}}default:return e.kind}}const NP=/^─{20,}/,PP=/^❯(\s|$)/,FP=/›\s*stashed$/;function IP(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>NP.test(e)?[t]:[]).at(-2);return n===void 0||!PP.test(t[n+1]??``)?{kind:`no-prompt`}:FP.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const LP={"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 RP(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=IP(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:LP[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const zP=`cc-candybar-slash`;function BP(e,t,n,r){let i=EP(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function VP(e){let t=BP(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 HP(e,t){let n=BP(e,`claude-input.type`,[`load-buffer`,`-b`,zP,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,zP,`-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 UP(){return{read:VP,type:HP}}function WP(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function GP(e){return KP(()=>decodeURIComponent(e))}function KP(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function qP(e,t){let n=Oe({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 JP=(e,t)=>qP(GP(e),t),YP=(e,t)=>{let n=Oe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,GP(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`})`)}},XP=(e,t)=>qP(GP(e),t),ZP=(e,t)=>qP(GP(e),t),QP=(e,t)=>{let n=WP(GP(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},$P=(e,t)=>{let[n=``,...r]=KP(()=>SE(e)),i=WP(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${yA().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: ${yA().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=xA(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}rF(t,i,`set-state`,a),t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},eF=/^-?\d+$/;function tF(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const nF=(e,t)=>{let[n=``,r=``,i=``]=KP(()=>SE(e)),a=WP(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!eF.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=SA(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${yA().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&eF.test(c)?iF(s,parseInt(c,10)):aF(`step-state`,r,s,TA(t.configFor(lF(t,a)),e=>t.sessionState.get(a,e),r)),u=tF(l,o,s.min,s.max),d=xA(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);rF(t,a,`step-state`,[{key:r,value:d.value}]),t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function rF(e,t,n,r){let i=r.filter(e=>e.key.startsWith(H_));if(i.length===0)return;let a=nA(e.configFor(lF(e,t)),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function iF(e,t){return Math.max(e.min,Math.min(e.max,t))}function aF(e,t,n,r){if(r===null)return n.min;if(!eF.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return iF(n,parseInt(r,10))}const oF=`render-origin`;function sF(e){return JSON.stringify(e)}function cF(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 lF(e,t){let n=e.sessionState.get(t,oF);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return cF(n)}function uF(e){return Aw(e.projectDir,e.cwd,e.configFile??void 0)}function dF(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const fF=(e,t)=>{let[n=``,r=``,i=``]=KP(()=>SE(e)),a=WP(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${FO().join(`, `)})`);let o=IO(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=lF(t,a),c=uF(s),l=eA(t.configFor(s),e=>t.sessionState.get(a,e),r);$N(dF(t,a),c,[[l.key,o.value]]),t.dlog(`info`,`set-config: ${l.key}=${o.value} → ${c} (session=${a})`)},pF=(e,t)=>{let[n=``,r=``,i=``]=KP(()=>SE(e)),a=WP(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!eF.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=LO(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${FO().join(`, `)})`);let c=lF(t,a),l=uF(c),u=eA(t.configFor(c),e=>t.sessionState.get(a,e),r),d=QN(l,u.key),f=typeof d==`number`?iF(s,d):aF(`step-config`,r,s,zO(u.globals,r)),p=tF(f,o,s.min,s.max),m=IO(r,String(p));if(!m.ok)throw new $(`step-config: ${m.reason}`);$N(dF(t,a),l,[[u.key,m.value]]),t.dlog(`info`,`step-config: ${u.key} ${f}→${m.value} (by ${o}) → ${l} (session=${a})`)},mF=(e,t)=>{let[n=``]=KP(()=>SE(e)),r=WP(n),i=lF(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=Qk(a,o),c=tA(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=xA(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});gF(`save`,c);let u=uF(i);eP(dF(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(hF)].join(` `)} → ${u} (session=${r})`)},hF=e=>`${e.preset}/${e.id}.settings.${e.setting}=${qs(e.value)}`;function gF(e,t){for(let n of t){let t=xA(n.key,qs(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const _F=(e,t)=>{let[n=``]=KP(()=>SE(e)),r=WP(n),i=lF(t,r),a=aA(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=xA(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});gF(`save-preset`,a.placements);let s=uF(i),c=oP(dF(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...xb.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,bb.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(hF)].join(` `)} → ${s} (session=${r})`)},vF=(e,t)=>{let[n=``,r=``]=KP(()=>SE(e)),i=WP(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=lF(t,i),o=uF(a);sP(dF(t,i),o,r),t.reloadConfig(a);let s=bb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},yF=(e,t)=>{let[n=``,...r]=KP(()=>SE(e)),i=WP(n),a=FO(),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=lF(t,i),c=uF(s),l=r.map(oA),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);iP(dF(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 bF(e,t){let n=(e,t)=>[...Ms(w_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(x_(t.presets).flatMap(e=>n(t,e).map(t=>`${e}\0${Os(t)}`)));return x_(e.presets).flatMap(t=>n(e,t).flatMap(e=>r.has(`${t}\0${Os(e)}`)?[]:Object.values(e.drafts??{}).map(e=>e.key)))}const xF=(e,t)=>{let[n=``,r=``,i=``]=KP(()=>SE(e)),a=WP(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${FO().join(`, `)})`);let o=IO(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=CO(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=lF(t,a),l=uF(c),u=t.configFor(c),d=cP(dF(t,a),l,r,s);t.reloadConfig(c);let f=bF(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})`)},SF=(e,t)=>{let[n=``]=KP(()=>SE(e)),r=WP(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${bP(i)} (session=${r})`)},CF=(e,t)=>{let[n=``]=KP(()=>SE(e)),r=WP(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${bP(i)} (session=${r})`)},wF=(e,t)=>{WP(GP(e)),t.applyUpdate()},TF=`client-hints`;function EF(e,t){let n=e.sessionState.get(t,TF);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 Ww(r)}function DF(e,t,n){let r=Lx(n);e.sessionState.setBatch(t,Vx(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const OF=(e,t)=>{let n=WP(GP(e));DF(t,n,jP(t.doctor,EF(t,n)))},kF=(e,t)=>{let[n=``,r=``]=KP(()=>SE(e)),i=WP(n),a=Rx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=jP(t.doctor,EF(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=MP(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),DF(t,i,c)},AF=(e,t)=>{let[n=``,...r]=KP(()=>SE(e)),i=WP(n),a=lF(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=iC(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})`)},jF=(e,t)=>{let[n=``,r=``]=KP(()=>SE(e)),i=WP(n),a=Object.values(t.configFor(lF(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=RP(t.claudeInput,EF(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})`)},MF=`config-override`,NF=new Map([[nE,JP],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=WP(KP(()=>decodeURIComponent(e.slice(0,n)))),i=KP(()=>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,MF),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,MF,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[rE,YP],[eE,$P],[tE,nF],[sE,fF],[cE,pF],[fE,yF],[lE,mF],[uE,_F],[dE,vF],[pE,xF],[mE,SF],[hE,CF],[aE,XP],[oE,ZP],[iE,QP],[gE,wF],[_E,OF],[vE,kF],[yE,AF],[bE,jF]]),PF=new Set([eE,tE,sE,cE,fE,lE,uE,dE,pE,mE,hE,iE,gE,_E,vE,yE,bE]),FF=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of EE(wE(e))){if(!i&&PF.has(a)){let e=SE(o);e.length>0&&e[0]&&(i=e[0])}let e=NF.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 IF(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 LF=new Map([...NF,[$T,FF]].map(([e,t])=>[e,IF(t)]));Object.freeze([...LF.keys()]);const RF=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`]),zF=[[`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 BF(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of zF){let i=HF(n,e);if(i==null)t.missingRequired.push(e);else{let n=VF(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))RF.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function VF(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function HF(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 UF(e,t){switch(e){case`vars`:return{what:e,vars:WF(t)};case`segments`:return{what:e,segments:YF(t)};case`config`:return{what:e,config:$F(t)}}}function WF(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=qF(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,...GF(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:KF(r.lastUpdatedMs())})}return o}function GF(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 KF(e){return e===null?null:Math.max(0,Date.now()-e)}function qF(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,JF(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}`,JF(i));return t}function JF(e){return e.kind}function YF(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=ZF(n),o=XF(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:QF(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function XF(e){let t=new Map;for(let n of x_(e.presets))for(let r of Ms(w_(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=Os(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function ZF(e){let t=[],n=new Set;for(let r of Ms(Fc(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 QF(e,t,n){let r=new Set;for(let i of sv(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 $F(e){return e===null?null:e.config}const eI=[`vars`,`segments`,`config`];function tI(e){return typeof e==`string`&&eI.includes(e)}function nI(e){return Math.max(1,e-2)}var rI=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 O(`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);O(`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{O(`Calculating context tokens from transcript: ${e}`);let n=await nj(e);if(n.length===0)return O(`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,O(`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 O(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`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)}},iI=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=ok(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await oj(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 aI={messageCount:0,recent:[]};function oI(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!ej(t),recent:n.length>20?n.slice(-20):n}}function sI(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(ej(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 cI=class{fold=new iI(aI,oI);async getMetricsInfo(e,t){if(O(`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:sI(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 lI={command:null,todos:[],pending:[],done:[]};function uI(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 dI(e,t){if(t.isSidechain)return e;let n=ej(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=uI(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 fI(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>uI(e,t.name),[]),done:e.done}}var pI=class{fold=new iI(lI,dI);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(fI(n.value))}};const mI=new Map;function hI(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var gI=class{async getSessionId(){if(!process.env.TMUX_PANE)return Y;let e=hI(process.env.TMUX),t=mI.get(e);if(t!==void 0)return t;O(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await De({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 mI.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};const _I=e=>`${e.sessionId}|${e.projectDir}|${e.cwd}`;var vI=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=_I(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=_I(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};const yI=c.join(`lib`,`ceiling_config.py`),bI=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function xI(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 SI(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 CI(e,t){if(!r.existsSync(e))return Y;let n;try{n=xI(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=SI([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=[yI,bI].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 wI(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 TI(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function EI(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 DI(e,t){let n=await De({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:SI(t),timeoutMs:3e3,category:`memento.read`});return n.ok?wI(n.stdout):X(CI(n))}function EI(e,t,n){let r=Oe({bin:c.join(e,vI),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:SI(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(CI(r))}function DI(){let e=ME(AE(kE(process.env,process.cwd())));return{locate:t=>xI(e,t),read:TI,move:EI}}var OI=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 kI=new dN;Te(kI.launchStats);const AI=new Vy({counters:kI,logger:Q}),jI=new Yy({watchers:AI,logger:Q}),MI=new hj,NI=new mN,PI=new fP(NI,Q),FI=new OI(Ke()),II=new tI,LI=new oI,RI=new dI,zI=new mI,BI=new gI(DI()),VI=new lN({gitService:jI,sessionState:NI,watchers:AI},{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)}`)}}),HI=60*1e3;function UI(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(ie(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),aL(0);return}}catch(e){Q(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,HI),a.unref())},checkNow:o}}const WI=UI(),GI=BA({entryUrl:import.meta.url,intervalMs:HI,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>WI.checkNow(),log:Q});let KI=null,qI=null,JI=0;function YI(){t.on(`uncaughtException`,e=>{Q(`error`,`uncaughtException: ${e.stack||e.message}`),aL(1)}),t.on(`unhandledRejection`,e=>{Q(`error`,`unhandledRejection: ${String(e)}`),aL(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Q(`info`,`received ${e}, shutting down`),aL(0)});try{JI=wT(t.env)}catch(e){Q(`error`,`refusing to boot: ${e.message}`),aL(1);return}KI=TD(t.pid);let e=FD(LD(KI));if(!e.decision.allow){Q(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),aL(1);return}qI=e.registryPath,r.mkdirSync(Pe(),{recursive:!0}),Le(Fe()),NI.useStorage(new _N(Be(),500,Q)),PI.useStorage(SP(Ve(),Q)),OD({anchor:DD(t.env),isAlive:kD,onOrphaned:e=>{Q(`info`,`parent watchdog: ${e}; shutting down`),aL(0)}}),XI(y.createServer({allowHalfOpen:!1},e=>{oL(e)}),Fe(),!1)}function XI(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Q(`error`,`server error: ${i.message}`),aL(1);return}if(r){Q(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}ZI(e,n)}),e.listen(n,()=>QI(n))}function ZI(e,n){let i=hD(gD(Re(n)),(e,t)=>wD(e,t,{readStartTime:CD,pidAlive:kD}));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}`),aL(1);return}}XI(e,n,!0)}function QI(e){let n=yD(e);if(n.kind!==`present`){Q(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),aL(0);return}nL(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(ne.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(JI/1048576)}MB`),VT();let i=FI.reset();i!==null&&Q(`warn`,`diagnostic dump wipe failed: ${i}`),WI.arm(),GI.arm(),tL(),$I(e,n.identity)}function $I(e,n){SD({bound:n,myPid:t.pid,readIdentity:()=>yD(e),readLease:()=>gD(Re(e)),shutdown:e=>aL(e),log:Q}).arm()}let eL=null;function tL(){eL=OT(MT(kI.startedAt.getTime(),e=>aL(e),{rssLimitBytes:JI})),eL.arm()}function nL(e){let n=_D(Re(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:KI});n!==null&&Q(`warn`,`lease write failed: ${n}`)}let rL=0,iL=!1;function aL(e){if(!iL){iL=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{jI.close()}catch(e){Q(`warn`,`gitService close failed: ${e.message}`)}try{MI.close()}catch(e){Q(`warn`,`usageStore close failed: ${e.message}`)}try{AI.closeAll()}catch(e){Q(`warn`,`watcherRegistry close failed: ${e.message}`)}try{NI.flush()}catch(e){Q(`warn`,`sessionState flush failed: ${e.message}`)}vD(ze(),t.pid),qI!==null&&ID(qI,t.pid,ND,e=>r.unlinkSync(e)),t.exit(e)}}function oL(e){rL++,kI.inFlight=rL;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:()=>aL(r);try{e.end(Zw(n),i)}catch(e){Q(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{kI.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=Qw(e=>{cL(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),rL=Math.max(0,rL-1),kI.inFlight=rL})}const sL=e=>({resp:e,exitAfterFlush:null});async function cL(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return sL({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 sL({ok:!0,stats:kI.snapshot({gitCache:jI.getStats(),usageCache:MI.getStats(),renderCacheSize:VI.size,watchersActive:AI.size(),nextRestartReason:eL?.describeNextRestart()??null})});if(e.kind===`render`){kI.requestsTotal++;let t=Date.now();try{let{report:n}=RF(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 kI.requestsErrored++,Q(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),sL({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=lL(e.args),s=e.hookData.session_id,c=Uw(e),l=JSON.stringify(c);NI.get(s,`client-hints`)!==l&&NI.set(s,CF,l);let u=NI.get(s,`config-override`)??a??c.configEnv,d=VI.getOrCreate(i,e.cwd,u),f=iF({projectDir:i,cwd:e.cwd,configFile:u??null});NI.get(s,`render-origin`)!==f&&NI.set(s,rF,f);let p=c.termCols,m=eI(p??120),h=eO(c.termRows),{authoredRoots:g}=d.state,_=t=>NI.get(e.hookData.session_id,t),v=vk(d.state.config,_,e=>g.has(e)),y=await Fk(e.hookData,mL,e.cwd,d.state.neededInputPaths(v.preset),v,c,aA(d.state.config,d.state.fileHeldSettings,_)),b=[],x=yk(v,m),S=YM(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},bk(v)),C=NI.get(e.hookData.session_id,`click.error`);C&&NI.clear(e.hookData.session_id,`click.error`);let ee=[o,d.lastError,C].filter(Boolean).join(`
198
- `),te=GI.notice({sessionId:s,dismissed:NI.get(s,TA),enabled:v.updateNotice}),ne=d.lastError===null?null:d.configFilePath,re=aO(ee,te,[d.lastWarning??``,...b].filter(Boolean).join(`
199
- `)),w=FI.sync(s,re===null?null:sO(re));w!==null&&Q(`warn`,`diagnostic dump failed: ${w}`);let ie=cO(S,re,{fullText:w===null?{kind:`file`,path:FI.pathFor(s)}:{kind:`unavailable`,reason:w},failedConfigFile:ne},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=jI.getStats(),ae=MI.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`}`),sL({ok:!0,output:ie+`
200
- `})}catch(e){throw kI.requestsErrored++,e}}if(e.kind===`click`)return sL(await hL(e.verb,e.value));if(e.kind===`debug`){if(!$F(e.what))return sL({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${QF.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=VI.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?pL(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):fL};return sL({ok:!0,debug:VF(e.what,n)})}return sL({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function lL(e){let{values:t,tokens:n}=_({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:Gw(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const uL={sessionState:NI,dlog:Q,applyUpdate:()=>GI.act(),doctor:TP(),memento:BI,claudeInput:BP(),history:PI,configFor:e=>VI.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>VI.reload(e.projectDir,e.cwd,e.configFile??void 0)},dL={style:`powerline`,colorCompatibility:ho,wrap:!0,padding:1,charset:uo,width:1/0},fL=new Map;function pL(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,$D(a,{...dL,charset:t,colorCompatibility:n}));return r}const mL={gitProvider:jI,usageStore:MI,contextProvider:II,metricsProvider:LI,activityProvider:RI,tmuxService:zI,mementoProvider:BI,autoCompact:KO,log:Q,clock:()=>new Date,history:e=>PI.depth(e)};function hL(e,t){let n=FF.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,uL),{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 gL={connectMs:200,budgetMs:500};async function _L(e){let n=e.includes(`--json`),r=await vL();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${oT(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
201
- `);return}t.stdout.write(SL(r.value))}function vL(){return eT({kind:`stats`},gL,e=>`stats`in e?e.stats:void 0)}function yL(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function bL(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function xL(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 SL(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 ${xL(e.uptimeSec)}`),t.push(` rss ${yL(e.rssBytes)}`),t.push(` heapUsed ${yL(e.heapUsedBytes)}`),t.push(` heapTotal ${yL(e.heapTotalBytes)}`),t.push(` external ${yL(e.externalBytes)}`),t.push(` arrayBuffers ${yL(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 ${bL(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 ${bL(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(`
197
+ `,c.join(e,`lib`),t.sessionId,t.cwd],env:wI(t),timeoutMs:3e3,category:`memento.read`});return n.ok?EI(n.stdout):X(TI(n))}function OI(e,t,n){let r=Oe({bin:c.join(e,bI),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:wI(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(TI(r))}function kI(){let e=NE(jE(AE(process.env,process.cwd())));return{locate:t=>CI(e,t),read:DI,move:OI}}var AI=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 jI=new mN;Te(jI.launchStats);const MI=new Vy({counters:jI,logger:Q}),NI=new Yy({watchers:MI,logger:Q}),PI=new vj,FI=new _N,II=new hP(FI,Q),LI=new AI(Ke()),RI=new rI,zI=new cI,BI=new pI,VI=new gI,HI=new vI(kI()),UI=new fN({gitService:NI,sessionState:FI,watchers:MI},{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)}`)}}),WI=60*1e3;function GI(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(ie(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),sL(0);return}}catch(e){Q(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,WI),a.unref())},checkNow:o}}const KI=GI(),qI=UA({entryUrl:import.meta.url,intervalMs:WI,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>KI.checkNow(),log:Q});let JI=null,YI=null,XI=0;function ZI(){t.on(`uncaughtException`,e=>{Q(`error`,`uncaughtException: ${e.stack||e.message}`),sL(1)}),t.on(`unhandledRejection`,e=>{Q(`error`,`unhandledRejection: ${String(e)}`),sL(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Q(`info`,`received ${e}, shutting down`),sL(0)});try{XI=TT(t.env)}catch(e){Q(`error`,`refusing to boot: ${e.message}`),sL(1);return}JI=ED(t.pid);let e=ID(RD(JI));if(!e.decision.allow){Q(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),sL(1);return}YI=e.registryPath,r.mkdirSync(Pe(),{recursive:!0}),Le(Fe()),FI.useStorage(new bN(Be(),500,Q)),II.useStorage(TP(Ve(),Q)),kD({anchor:OD(t.env),isAlive:AD,onOrphaned:e=>{Q(`info`,`parent watchdog: ${e}; shutting down`),sL(0)}}),QI(y.createServer({allowHalfOpen:!1},e=>{cL(e)}),Fe(),!1)}function QI(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Q(`error`,`server error: ${i.message}`),sL(1);return}if(r){Q(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}$I(e,n)}),e.listen(n,()=>eL(n))}function $I(e,n){let i=gD(_D(Re(n)),(e,t)=>TD(e,t,{readStartTime:wD,pidAlive:AD}));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}`),sL(1);return}}QI(e,n,!0)}function eL(e){let n=bD(e);if(n.kind!==`present`){Q(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),sL(0);return}iL(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(ne.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(XI/1048576)}MB`),HT();let i=LI.reset();i!==null&&Q(`warn`,`diagnostic dump wipe failed: ${i}`),KI.arm(),qI.arm(),rL(),tL(e,n.identity)}function tL(e,n){CD({bound:n,myPid:t.pid,readIdentity:()=>bD(e),readLease:()=>_D(Re(e)),shutdown:e=>sL(e),log:Q}).arm()}let nL=null;function rL(){nL=kT(NT(jI.startedAt.getTime(),e=>sL(e),{rssLimitBytes:XI})),nL.arm()}function iL(e){let n=vD(Re(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:JI});n!==null&&Q(`warn`,`lease write failed: ${n}`)}let aL=0,oL=!1;function sL(e){if(!oL){oL=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{NI.close()}catch(e){Q(`warn`,`gitService close failed: ${e.message}`)}try{PI.close()}catch(e){Q(`warn`,`usageStore close failed: ${e.message}`)}try{MI.closeAll()}catch(e){Q(`warn`,`watcherRegistry close failed: ${e.message}`)}try{FI.flush()}catch(e){Q(`warn`,`sessionState flush failed: ${e.message}`)}yD(ze(),t.pid),YI!==null&&LD(YI,t.pid,PD,e=>r.unlinkSync(e)),t.exit(e)}}function cL(e){aL++,jI.inFlight=aL;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:()=>sL(r);try{e.end(Qw(n),i)}catch(e){Q(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{jI.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=$w(e=>{uL(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),aL=Math.max(0,aL-1),jI.inFlight=aL})}const lL=e=>({resp:e,exitAfterFlush:null});async function uL(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return lL({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 lL({ok:!0,stats:jI.snapshot({gitCache:NI.getStats(),usageCache:PI.getStats(),renderCacheSize:UI.size,watchersActive:MI.size(),nextRestartReason:nL?.describeNextRestart()??null})});if(e.kind===`render`){jI.requestsTotal++;let t=Date.now();try{let{report:n}=BF(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 jI.requestsErrored++,Q(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),lL({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=dL(e.args),s=e.hookData.session_id,c=Ww(e),l=JSON.stringify(c);FI.get(s,`client-hints`)!==l&&FI.set(s,TF,l);let u=FI.get(s,`config-override`)??a??c.configEnv,d=UI.getOrCreate(i,e.cwd,u),f=sF({projectDir:i,cwd:e.cwd,configFile:u??null});FI.get(s,`render-origin`)!==f&&FI.set(s,oF,f);let p=c.termCols,m=nI(p??120),h=tO(c.termRows),{authoredRoots:g}=d.state,_=t=>FI.get(e.hookData.session_id,t),v=yk(d.state.config,_,e=>g.has(e)),y=await Ik(e.hookData,gL,e.cwd,d.state.neededInputPaths(v.preset),v,c,cA(d.state.config,d.state.fileHeldSettings,_)),b=[],x=bk(v,m),S=QM(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},xk(v)),C=FI.get(e.hookData.session_id,`click.error`);C&&FI.clear(e.hookData.session_id,`click.error`);let ee=[o,d.lastError,C].filter(Boolean).join(`
198
+ `),te=qI.notice({sessionId:s,dismissed:FI.get(s,OA),enabled:v.updateNotice}),ne=d.lastError===null?null:d.configFilePath,re=oO(ee,te,[d.lastWarning??``,...b].filter(Boolean).join(`
199
+ `)),w=LI.sync(s,re===null?null:cO(re));w!==null&&Q(`warn`,`diagnostic dump failed: ${w}`);let ie=lO(S,re,{fullText:w===null?{kind:`file`,path:LI.pathFor(s)}:{kind:`unavailable`,reason:w},failedConfigFile:ne},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=NI.getStats(),ae=PI.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`}`),lL({ok:!0,output:ie+`
200
+ `})}catch(e){throw jI.requestsErrored++,e}}if(e.kind===`click`)return lL(await _L(e.verb,e.value));if(e.kind===`debug`){if(!tI(e.what))return lL({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${eI.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=UI.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?hL(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):mL};return lL({ok:!0,debug:UF(e.what,n)})}return lL({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function dL(e){let{values:t,tokens:n}=_({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:Kw(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const fL={sessionState:FI,dlog:Q,applyUpdate:()=>qI.act(),doctor:OP(),memento:HI,claudeInput:UP(),history:II,configFor:e=>UI.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>UI.reload(e.projectDir,e.cwd,e.configFile??void 0)},pL={endcaps:`powerline`,colorCompatibility:ho,wrap:!0,padding:1,charset:uo,width:1/0},mL=new Map;function hL(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,eO(a,{...pL,charset:t,colorCompatibility:n}));return r}const gL={gitProvider:NI,usageStore:PI,contextProvider:RI,metricsProvider:zI,activityProvider:BI,tmuxService:VI,mementoProvider:HI,autoCompact:qO,log:Q,clock:()=>new Date,history:e=>II.depth(e)};function _L(e,t){let n=LF.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,fL),{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 vL={connectMs:200,budgetMs:500};async function yL(e){let n=e.includes(`--json`),r=await bL();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${sT(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
201
+ `);return}t.stdout.write(wL(r.value))}function bL(){return tT({kind:`stats`},vL,e=>`stats`in e?e.stats:void 0)}function xL(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function SL(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function CL(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 wL(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 ${CL(e.uptimeSec)}`),t.push(` rss ${xL(e.rssBytes)}`),t.push(` heapUsed ${xL(e.heapUsedBytes)}`),t.push(` heapTotal ${xL(e.heapTotalBytes)}`),t.push(` external ${xL(e.externalBytes)}`),t.push(` arrayBuffers ${xL(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 ${SL(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 ${SL(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 CL={connectMs:200,budgetMs:500};async function wL(e,n){let r=n.includes(`--json`),i=await TL(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${oT(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
204
- `);return}t.stdout.write(EL(i.value))}function TL(e){return eT({kind:`debug`,what:e},CL,e=>`debug`in e?e.debug:void 0)}function EL(e){switch(e.what){case`vars`:return DL(e.vars);case`segments`:return OL(e.segments);case`config`:return kL(e.config);default:return e}}function DL(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?``:` ${jL(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${AL(a.value)}${e}${o}`)}return t.join(`
203
+ `}const TL={connectMs:200,budgetMs:500};async function EL(e,n){let r=n.includes(`--json`),i=await DL(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${sT(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
204
+ `);return}t.stdout.write(OL(i.value))}function DL(e){return tT({kind:`debug`,what:e},TL,e=>`debug`in e?e.debug:void 0)}function OL(e){switch(e.what){case`vars`:return kL(e.vars);case`segments`:return AL(e.segments);case`config`:return jL(e.config);default:return e}}function kL(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?``:` ${NL(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${ML(a.value)}${e}${o}`)}return t.join(`
206
206
  `)+`
207
- `}function OL(e){if(e.length===0)return`no segments (DSL not active)
207
+ `}function AL(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 kL(e){return e===null?`config: DSL not active
210
+ `}function jL(e){return e===null?`config: DSL not active
211
211
  `:JSON.stringify(e,null,2)+`
212
- `}function AL(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function jL(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function ML(){let e=PL();return e===null?null:r.readFileSync(e,`utf-8`)}function NL(){let e;try{e=ML()}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 PL(){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 FL(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const IL=5e3;function LL(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:qO(4e5,1e6),...xk(e),history:{undo:1,redo:1},unsaved:1,resettable:1}}function RL(e,t){let n=Ow(e,e),r=Aw(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function zL(e,n=t.cwd()){let i=[],a=e===void 0?RL(n,i):c.resolve(Tw(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=Mw(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await HL(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 xs&&i.push(...e.warnings),{kind:`fatal`,configPath:a,message:e instanceof xs||e instanceof Error?e.message:String(e),warnings:i})}}async function BL(e,t,n){let r=Nw(e,nk);n.push(...r.warnings);let i=Iw(r,e??`<default>`),a=new rN,o=new vb(a,i.globals.default_empty_value??``,void 0,new mN);try{let e=WM(i,o,{cwd:t});n.push(...e.loadWarnings);let r=await o.settled(IL);return r.length>0&&n.push(`source${r.length===1?``:`s`} still running after ${IL} ms, rendered with fallback values: ${r.join(`, `)}`),{config:i,compiled:e,store:a,registry:o}}catch(e){throw o.dispose(),e}}function VL({config:e,compiled:t,store:n,registry:r},i,a){let o=new Map;return{rendered:YM(e,t,n,r,LL(i),yk(i,a),{onSegmentError:(e,t)=>o.set(`segment "${e}"`,t),onRenderWarning:e=>o.set(`theme rule`,e)},bk(i)),failures:o}}async function HL(e,t,n){let r=await BL(e,t,n),{config:i}=r;try{wA(i);let e=vk(i,()=>null,()=>!1),t=e=>VL(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 UL(e){return e.map(e=>`warning: ${e}\n`).join(``)}function WL(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:UL(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:UL(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 GL=`--render`,KL=`Usage: cc-candybar check [${GL}] [config-file]\n`;function qL(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==GL);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${KL}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${KL}`}:{kind:`run`,target:n[0],render:t.includes(GL)}}async function JL(e){let n=qL(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:WL(await zL(n.target??FL(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const YL=`${HD}${VD}`;function XL(e){return`${YL}⚠ cc-candybar: ${ZL(e)}\n`}function ZL(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: ${BD(e.message,60)}`;case`render_failed`:return`render failed: ${BD(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${BD(e.message,60)}`}}function QL(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:XL(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function $L(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 eR=` (fix: click the settings menu (${Gc} by default) › 🧰 tools ▸ 🩺 doctor, then [fix] on the bar)`;function tR({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:eR}\n`}function nR(e,t,n){let r;try{r=OP(e,{tmux:Px(t),claudeConfigDir:kE(t,n)})}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let i=Lx(r);return{stdout:i.map(tR).join(``),stderr:``,code:+!i.every(e=>e.verdict.ok)}}function rR(e){e.length>0&&(t.stderr.write(`doctor: takes no arguments
212
+ `}function ML(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function NL(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function PL(){let e=IL();return e===null?null:r.readFileSync(e,`utf-8`)}function FL(){let e;try{e=PL()}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 IL(){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 LL(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const RL=5e3;function zL(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:JO(4e5,1e6),...Sk(e),history:{undo:1,redo:1},unsaved:1,resettable:1}}function BL(e,t){let n=kw(e,e),r=jw(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function VL(e,n=t.cwd()){let i=[],a=e===void 0?BL(n,i):c.resolve(Ew(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=Nw(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await WL(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 xs&&i.push(...e.warnings),{kind:`fatal`,configPath:a,message:e instanceof xs||e instanceof Error?e.message:String(e),warnings:i})}}async function HL(e,t,n){let r=Pw(e,rk);n.push(...r.warnings);let i=Lw(r,e??`<default>`),a=new oN,o=new vb(a,i.globals.default_empty_value??``,void 0,new _N);try{let e=qM(i,o,{cwd:t});n.push(...e.loadWarnings);let r=await o.settled(RL);return r.length>0&&n.push(`source${r.length===1?``:`s`} still running after ${RL} ms, rendered with fallback values: ${r.join(`, `)}`),{config:i,compiled:e,store:a,registry:o}}catch(e){throw o.dispose(),e}}function UL({config:e,compiled:t,store:n,registry:r},i,a){let o=new Map;return{rendered:QM(e,t,n,r,zL(i),bk(i,a),{onSegmentError:(e,t)=>o.set(`segment "${e}"`,t),onRenderWarning:e=>o.set(`theme rule`,e)},xk(i)),failures:o}}async function WL(e,t,n){let r=await HL(e,t,n),{config:i}=r;try{DA(i);let e=yk(i,()=>null,()=>!1),t=e=>UL(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 GL(e){return e.map(e=>`warning: ${e}\n`).join(``)}function KL(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:GL(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:GL(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 qL=`--render`,JL=`Usage: cc-candybar check [${qL}] [config-file]\n`;function YL(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==qL);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${JL}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${JL}`}:{kind:`run`,target:n[0],render:t.includes(qL)}}async function XL(e){let n=YL(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:KL(await VL(n.target??LL(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const ZL=`${UD}${HD}`;function QL(e){return`${ZL}⚠ cc-candybar: ${$L(e)}\n`}function $L(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: ${VD(e.message,60)}`;case`render_failed`:return`render failed: ${VD(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${VD(e.message,60)}`}}function eR(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:QL(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function tR(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 nR=` (fix: click the settings menu (${Gc} by default) › 🧰 tools ▸ 🩺 doctor, then [fix] on the bar)`;function rR({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:nR}\n`}function iR(e,t,n){let r;try{r=jP(e,{tmux:Px(t),claudeConfigDir:AE(t,n)})}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let i=Lx(r);return{stdout:i.map(rR).join(``),stderr:``,code:+!i.every(e=>e.verdict.ok)}}function aR(e){e.length>0&&(t.stderr.write(`doctor: takes no arguments
215
215
  Usage: cc-candybar doctor
216
- `),t.exit(2));let n=nR(TP(),t.env,t.cwd());t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}function iR(){return $L(t.env.COLUMNS,t.stderr.columns)}function aR(){return $L(t.env.LINES,t.stderr.rows)}const oR=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`],sR=e=>e.some(e=>t.argv.includes(e));function cR(){return oR.some(e=>(t.env[e]??``)!==``)}function lR(){console.log(ax)}async function uR(){try{sR(rx.help)&&(lR(),t.exit(0)),sR(rx.version)&&(console.log(`cc-candybar ${OE}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await pD(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(cD(),t.exit(0)),e===`url-handle`){await uD(t.argv[3]);return}if(e===`daemon`){YI();return}if(e===`daemon-stats`&&(await _L(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await JL(t.argv.slice(3));return}if(e===`schema`){NL();return}if(e===`doctor`){rR(t.argv.slice(3));return}$F(e)&&(await wL(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
216
+ `),t.exit(2));let n=iR(OP(),t.env,t.cwd());t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}function oR(){return tR(t.env.COLUMNS,t.stderr.columns)}function sR(){return tR(t.env.LINES,t.stderr.rows)}const cR=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`],lR=e=>e.some(e=>t.argv.includes(e));function uR(){return cR.some(e=>(t.env[e]??``)!==``)}function dR(){console.log(ax)}async function fR(){try{lR(rx.help)&&(dR(),t.exit(0)),lR(rx.version)&&(console.log(`cc-candybar ${kE}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await mD(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(lD(),t.exit(0)),e===`url-handle`){await dD(t.argv[3]);return}if(e===`daemon`){ZI();return}if(e===`daemon-stats`&&(await yL(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await XL(t.argv.slice(3));return}if(e===`schema`){FL();return}if(e===`doctor`){aR(t.argv.slice(3));return}tI(e)&&(await EL(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)),O(`Working directory: ${t.cwd()}`),O(`Process args:`,t.argv);let r=await n(t.stdin);O(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),lR(),t.exit(1));let i=QL(await uT(r,t.argv,t.cwd(),{termCols:iR(),termRows:aR(),ssh:cR(),tmux:Px(t.env),configEnv:FL(t.env),claudeConfigDir:kE(t.env,t.cwd())}));i.debug!==null&&O(i.debug),i.kick&&NT(),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)}}uR();export{};
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)),O(`Working directory: ${t.cwd()}`),O(`Process args:`,t.argv);let r=await n(t.stdin);O(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),dR(),t.exit(1));let i=eR(await dT(r,t.argv,t.cwd(),{termCols:oR(),termRows:sR(),ssh:uR(),tmux:Px(t.env),configEnv:LL(t.env),claudeConfigDir:AE(t.env,t.cwd())}));i.debug!==null&&O(i.debug),i.kick&&PT(),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)}}fR();export{};