@promptctl/cc-candybar 1.128.0 → 1.129.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/index.mjs +56 -56
- package/package.json +5 -5
- package/schema/cc-candybar.schema.json +0 -3
package/dist/index.mjs
CHANGED
|
@@ -39,7 +39,7 @@ import{createRequire as e}from"node:module";import t from"node:process";import{j
|
|
|
39
39
|
`).join(`${n}${t}`)}function Hl(e,t,n){let[r,...i]=e,a=i.length===0?t:`{\n ${Vl(Hl(i,t,n),` `,`
|
|
40
40
|
`)}${n.trailingComma}\n}`;return`${n.key(r)}: ${a}`}function Ul(e,t,n,r){return e.slice(0,t)+r+e.slice(n)}function Wl(e,t){return e.lastIndexOf(`
|
|
41
41
|
`,t-1)+1}function Gl(e){return/^[ \t]*$/.test(e)}function Kl(e,t){let n=Wl(e,t);return/^[ \t]*/.exec(e.slice(n))[0]}function ql(e,t){return Gl(e.slice(Wl(e,t),t))}const Jl=/(?:\/\/[^\n]*?)?(\r\n|\n|$)/y;function Yl(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++;Jl.lastIndex=n;let i=Jl.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 Xl(e,t){let{commaEnd:n,line:r}=Yl(e,t.end);if(ql(e,t.start)&&r!==null)return Ul(e,Wl(e,t.start),r.next,``);if(n!==-1){let r=n;for(;r<e.length&&e[r]===` `;)r++;return Ul(e,t.start,r,``)}let i=t.start;for(;i>0&&(e[i-1]===` `||e[i-1]===` `);)i--;return e[i-1]===`,`?Ul(e,i-1,t.end,``):Ul(e,t.start,t.end,``)}function Zl(e,t,n,r,i){let a=n.commaEnd!==-1,o=a?e:Ul(e,t.end,t.end,`,`),s=n.line.at+ +!a,c=Bl(e);return Ul(o,s,s,`${c}${i}${Vl(r,i,c)}${a?`,`:``}`)}function Ql(e,t,n,r){let i=t.kind===`object`?t.entries:t.elements,a=i[i.length-1],o=Kl(e,t.span.start);if(a===void 0){let i=o+` `,a=Bl(e);return Ul(e,t.span.start+1,t.span.end-1,`${a}${i}${Vl(n,i,a)}${r.trailingComma}${a}${o}`)}let{commaEnd:s,line:c}=Yl(e,a.span.end);if(ql(e,a.span.start)&&c!==null){let t=e.slice(Wl(e,a.span.start),a.span.start);return Zl(e,a.span,{commaEnd:s,line:c},n,t)}let l=s===-1?a.span.end:s;return Ul(e,l,l,`${s===-1?`, `:` `}${n}${s===-1?``:`,`}`)}function $l(e,t,n,r){if(t.length===0)throw new Cl(`setValue needs a non-empty path`,0);if(/^\s*$/.test(e)){let i=Bl(e);return`{${i} ${Vl(Hl(t,n,r),` `,i)}${r.trailingComma}${i}}${i}`}return eu(e,kl(e),t,n,r)}function eu(e,t,n,r,i){let a=t;for(let t=0;t<n.length;t++){if(a.kind!==`object`)throw new Cl(`cannot set ${n.join(`.`)}: ${n.slice(0,t).join(`.`)||`the document`} is not an object`,a.span.start);let o=Al(a,n[t]);if(o===void 0)return Ql(e,a,Hl(n.slice(t),r,i),i);if(t===n.length-1){let t=Kl(e,o.keySpan.start);return Ul(e,o.value.span.start,o.value.span.end,Vl(r,t,Bl(e)))}a=o.value}throw new Cl(`unreachable: path exhausted`,0)}function tu(e,t,n=0){if(t.length===0)throw new Cl(`deleteValue needs a non-empty path`,0);if(/^\s*$/.test(e))return e;let r=t.slice(0,-1),i=jl(kl(e),r),a=i===void 0?void 0:Al(i,t[t.length-1]);if(a===void 0||i?.kind!==`object`)return e;let o=Xl(e,a.span);return r.length>n&&i.entries.length===1?tu(o,r,n):o}const nu=[`h`,`v`,`children`];function ru(e){if(e.kind===`string`)return e.value;if(e.kind!==`object`)return;let t=Al(e,`seg`)?.value,n=Al(e,`kind`)?.value,r=Al(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=Al(e,`id`)?.value;return a?.kind===`string`?a.value:i}function iu(e){return e.kind===`object`?nu.map(t=>Al(e,t)?.value).filter(e=>e?.kind===`array`):[]}function au(e){let t=Al(e,`rows`)?.value;return t?.kind===`object`?t.entries:null}function ou(e){if(e.kind!==`object`)return!0;let t=au(e);return t===null||t.length>0||e.entries.some(e=>e.key!==`rows`)}function*su(e,t){yield{node:e,bareAt:t};for(let t of iu(e))for(let e of t.elements)yield*su(e,null);for(let n of au(e)??[])yield*su(n.value,t===null?null:[...t,`rows`,n.key])}function cu(e,t){for(let{node:n}of su(e,null))if(ru(n)===t)return!0;return!1}function lu(e,t,n){let r=jl(kl(e),t);if(r===void 0)return null;for(let{node:i,bareAt:a}of su(r,t))if(ru(i)===n)return a===null?{text:e,ref:i}:lu($l(e,a,`{ h: [${Ml(e,i)}] }`,Ll),t,n);return null}function uu(e,t,n){let r=lu(e,t,n);return r===null?null:Xl(r.text,r.ref.span)}function du(e,t,n,r,i){let a=lu(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}=Yl(o,s.span.end);if(ql(o,s.span.start)&&u!==null){let e=o.slice(Wl(o,s.span.start),s.span.start);return i===`after`?Zl(o,s.span,{commaEnd:l,line:u},c,e):Ul(o,s.span.start,s.span.start,`${c},${Bl(o)}${e}`)}let d=Ml(o,s),f=i===`before`?`${c}, ${d}`:`${d}, ${c}`;return Ul(o,s.span.start,s.span.end,f)}function fu(e,t,n,r,i){let a=lu(e,t,n);if(a===null)return null;let{text:o,ref:s}=a,c=`{ ${Il(r)}: ${i} }`;return s.kind===`string`?Ul(o,s.span.start,s.span.end,`{ seg: ${JSON.stringify(s.value)}, settings: ${c} }`):Al(s,`settings`)===void 0?eu(o,s,[`settings`],c,Ll):eu(o,s,[`settings`,r],i,Ll)}var pu=class extends Error{file;issues;warnings;constructor(e,t,n=[]){super(_u(e,t)),this.name=`ConfigError`,this.file=e,this.issues=t,this.warnings=n}};function G(e,t){let n=0,r;for(let i of t){if(i===``||/^\d+$/.test(i))continue;let t=mu(e,n,i);if(t===-1)return r===void 0?void 0:hu(e,r);n=t,r=t}return r===void 0?void 0:hu(e,r)}function mu(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 hu(e,t){let n=1;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}function gu(e,t){try{return kl(t),null}catch(n){if(!(n instanceof Cl))throw n;return`${e}:${hu(t,n.offset)}: ${n.reason} — the settings menu cannot edit this file until it is fixed`}}function _u(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(`
|
|
42
|
-
`)}const vu=[`vertical`,`horizontal`],yu={vertical:`row`,horizontal:`cell`};function bu(e){return e.id??e.name}function xu(e){return[...wu(e)].flatMap(e=>e.kind===`segment`?[bu(e)]:[])}function Su(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e}-${n}`);)n++;return`${e}-${n}`}function Cu(e,t){return e.opens===void 0?e:{...e,opens:{...e.opens,body:t(e.opens.body)}}}function*wu(e){yield e;for(let t of Ou(e))yield*wu(t)}const Tu=(e,t)=>`${e}.children[${t}]`,Eu=e=>`${e}.opens.body`;function*Du(e,t){if(yield[e,t],e.kind===`container`)for(let[n,r]of e.children.entries())yield*Du(r,Tu(t,n));else e.opens!==void 0&&(yield*Du(e.opens.body,Eu(t)))}function Ou(e){return e.kind===`container`?e.children:e.opens===void 0?[]:[e.opens.body]}const ku=[`shade`,`variation`,`style`];function Au(e){return e===void 0||`text`in e?`text`:`regex`in e?`regex`:`json`}const ju=[`ttl`,`watch_file`,`depends_on`,`key`,`never`];function Mu(e){return e.kind===`file`||e.kind===`shell`||e.kind===`template`}const Nu=[`branch`,`sha`,`dirty`,`ahead`,`behind`,`stash`],Pu=`theme`,Fu=`effect`,Iu=[Pu,Fu];function Lu(e){return{...e.settings,[Pu]:{label:Pu,domain:`theme`,default:e.palette??`bar`},[Fu]:{label:Fu,domain:Kc,default:`bar`}}}function Ru(e){let t=e?.domain;return typeof t==`object`&&`min`in t?t:void 0}function zu(e,t){return Object.entries(e).flatMap(([n,r])=>{let i=Ru(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 Bu(e,t){let{domain:n}=e;return n===`bool`?typeof t==`boolean`:n===`theme`?typeof t==`string`&&Pc(t):`min`in n?typeof t==`number`&&Number.isInteger(t)&&t>=n.min&&t<=n.max:typeof t==`string`&&n.includes(t)}function Vu(e){return String(e)}function Hu(e,t){let{domain:n}=e;if(typeof n==`object`&&`min`in n)return _l(t,n)??void 0;let r=n===`bool`?t===`true`?!0:t===`false`?!1:t:t;return Bu(e,r)?r:void 0}function Uu(e,t,n,r){let i=e.settings?.[t]??n.default,a=e.drafts?.[t],o=a===void 0?null:r(a);return(o===null?void 0:Hu(n,o))??i}function Wu(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 Gu=[`left`,`center`,`right`],Ku=[`right`,`left`,`middle`];function qu(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 ${$u(i)}`,line:G(e.source,[...t.split(`.`),r])}),null)}function Ju(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 ${$u(i)}`,line:G(e.source,[...t.split(`.`),`default`])});return}return i}}function Yu(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 ${$u(i)}`,line:G(e.source,[...t.split(`.`),r])});return}return i}}function Xu(e,t,n){let r=Yu(e,t,n,`palette`);if(r!==void 0){if(!e.allowedPalettes.has(r)){e.issues.push({path:`${t}.palette`,message:`Unknown palette "${r}"${Oc(r)}. Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:G(e.source,[...t.split(`.`),`palette`])});return}return r}}function Zu(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 ${K(a)}`,line:G(e.source,[...t.split(`.`),r])});return}return a}}function Qu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $u(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function K(e){return typeof e==`string`?JSON.stringify(e):e===void 0?`undefined`:String(e)}function ed(e,t,n,r){return Qu(r)?(id(e,n,r,t.noun,new Set(Object.keys(t.fields)),td(e,t.removed??{},n,r)),nd(e,t.fields,n,r)):(e.issues.push({path:n,message:`${n} must be an object, got ${$u(r)}`,line:G(e.source,n.split(`.`))}),null)}function td(e,t,n,r){let i=Object.entries(t).filter(([e])=>r[e]!==void 0);for(let[t,r]of i)ad(e,`${n}.${t}`,`${n}.${t} was removed: ${r}`);return new Set(i.map(([e])=>`${n}.${e}`))}function nd(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 rd=new Set;function id(e,t,n,r,i,a=rd){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:G(e.source,[...t.split(`.`),o])})}function ad(e,t,n){return e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))}),null}function od(e,t,n,r){if(!Qu(r))return e.issues.push({path:n,message:`${t.noun} must be an object, got ${$u(r)}`,line:G(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:G(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:G(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:G(e.source,n.split(`.`))}),null;let c=o[0];return i[c].parse(e,`${n}.${c}`,r[c])}function sd(e,t,n,r){if(!Qu(r))return e.issues.push({path:n,message:`${n} must be an object, got ${$u(r)}`,line:G(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 ${$u(i)}`,line:G(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:G(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 id(e,n,r,`${i} ${t.memberNoun} key`,o.keys,l),c}function cd(e,t,n){return{json:Sd(bd(n),e,t),keys:new Set([e,...Object.keys(n)])}}function ld(e){return(...t)=>e()(...t)}function ud(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:G(n.source,o.split(`.`))}),null}return a}}function dd(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>Yu(e,t,r,n)}}function fd(){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 ${$u(i)}`,line:G(e.source,[n])});return}return i}}}}function pd(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 ${K(o)}`,line:G(e.source,[i])});return}return o}}}}function md(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 ${K(a)}`,line:G(e.source,[r])});return}return a}}}}function hd(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>Xu(e,t,r)}}function gd(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>qu(e,t,r,n)??void 0}}function _d(e,t){return f(t)?null:`${e} must be an absolute path (\`~\` and relative paths are not expanded), got ${JSON.stringify(t)}`}function vd(){return{required:!0,json:{type:`string`,pattern:`^/`},parse:(e,t,n,r)=>{let i=qu(e,t,r,n);if(i===null)return;let a=_d(`${t}.${n}`,i);return a===null?i:ad(e,`${t}.${n}`,a)??void 0}}}function yd(e){return{required:!1,json:{enum:[...e]},parse:(t,n,r,i)=>Zu(t,n,i,r,e)}}function bd(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 xd(e){return bd(e.fields)}function Sd(e,t,n){let r=e,i={[t]:{const:n},...r.properties},a=[t,...r.required??[]];return{...r,properties:i,required:a}}function Cd(e){let t=e.arms;return{anyOf:Object.values(t).map(e=>e.json)}}function wd(e){let t=e.arms;return{anyOf:Object.entries(t).map(([e,t])=>({type:`object`,properties:{[e]:t.json},required:[e],additionalProperties:!1}))}}const Td=/^[A-Za-z_][A-Za-z0-9_]*$/;function Ed(e){return`#${e+1}`}const Dd={rows:{}};function Od(e){return`rows`in e}function kd(e){return Object.fromEntries(e.map((e,t)=>[Ed(t),e]))}function Ad(e){if(e.kind===`container`&&e.direction===`vertical`){let{kind:t,direction:n,children:r,...i}=e;return{...i,rows:kd(r)}}let{when:t,...n}=e;return{...t!==void 0&&{when:t},rows:kd([n])}}function jd(e){let{rows:t,...n}=e;return{kind:`container`,direction:`vertical`,children:Object.values(t),...n}}function Md(e){return Od(e)?jd(e):e}function*Nd(e,t){if(!Od(e)){yield*Du(e,t);return}yield[jd(e),t];for(let[n,r]of Object.entries(e.rows))yield*Du(r,`${t}.rows.${n}`)}function Pd(e,t){return Od(e)?{...t,...e,rows:{...t.rows,...e.rows}}:Ad(e)}function Fd(e){if(!Od(e))return!0;let{rows:t,...n}=e;return Object.values(n).some(e=>e!==void 0)||Object.keys(t).length>0}function Id(e,t){return{globals:{...t.globals,...e.globals??{}},variables:{...t.variables,...e.variables??{}},segments:zd(t.segments,Ld(t.segments,e.segments??{})),root:Pd(e.root??Dd,t.root),actions:{...t.actions,...e.actions??{}},styles:{...t.styles,...e.styles??{}},presets:zd(t.presets,Rd(t.presets,e.presets??{})),themeDefaults:zd(t.themeDefaults,e.themeDefaults??{}),editGlobals:{...t.editGlobals,...e.editGlobals??{}},helpers:{...t.helpers,...e.helpers??{}}}}function Ld(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 Rd(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 zd(e,t){return{...e,...Object.fromEntries(Object.entries(t).map(([t,n])=>[t,{...e[t],...n}]))}}const Bd=`closed`,Vd=`🍫`;function Hd(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 Ud(e,t,n,r){let i=Hd(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function Wd(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Gd(e,t,n,r,i){return{kind:`segment`,name:e,opens:{ref:t,body:n,placement:r},...i!==void 0&&{when:i}}}function Kd(e,...t){return`{{ and ${[e,...t].map(qd).join(` `)} }}`}function qd(e){return`(eq .${e.variable} "${Wd(e.member)}")`}function Jd(e,t,n){return`{{ ${Yd(e,Xd(t),Xd(n))} }}`}function Yd(e,t,n){return`action "${e}" ${t} ${n}`}function Xd(e){return`"${Wd(e)}"`}function Zd(e,t){return{kind:`state`,key:e,default:t}}function Qd(e,t){return{set:e,cycle:[Bd,t]}}const $d={required:!1,json:{enum:[...il]},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: ${il.join(`, `)}`,line:G(e.source,[...t.split(`.`),n])});return}return Zu(e,t,r,n,il)}},ef={required:!1,json:{type:`string`},parse:(e,t,n,r)=>{let i=Yu(e,t,r,n);return Lc(i)?i:Xu(e,t,r)}},tf={required:!1,json:{anyOf:[{enum:[...Gc]},{type:`string`,pattern:`\\{\\{`}]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&Lc(i)?i:Zu(e,t,r,n,Gc)}},nf=/^[^\r\n]*\S[^\r\n]*$/u,rf=RegExp(`^(?:✖|✕)[\\uFE0E\\uFE0F]?$`,`u`),af={required:!1,json:{type:`string`,pattern:nf.source,not:{pattern:rf.source}},parse:(e,t,n,r)=>{let i=Yu(e,t,r,n);if(i===void 0||nf.test(i)&&!rf.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:G(e.source,[...t.split(`.`),n])})}};function of(e){return{spec:yd(e),domain:{from:e}}}function sf(){return{spec:fd(),domain:`bool`}}function cf(e){return{spec:e,domain:`text`}}const lf={default_empty_value:cf(dd()),default_separator:cf(dd()),palette:{spec:ef,domain:{from:`themes`}},style:{spec:dd(),domain:{from:`styles`}},effect:{spec:tf,domain:{from:Gc}},preset:{spec:dd(),domain:{from:`presets`}},endcaps:of(Xc),variation:of(ol),shade:of(ll),autoWrap:sf(),padding:{spec:pd(hl),domain:{...hl,step:1}},charset:of(tl),updateNotice:sf(),transitions:sf(),colorCompatibility:{spec:$d,domain:{from:il}},menuGlyph:cf(af)},uf=Object.fromEntries(Object.entries(lf).map(([e,t])=>[e,t.spec]));function df(e){return lf[e].domain}function ff(e){let t=df(e);if(t===`text`)throw Error(`globals.${e} is free text, which no control can change — list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);return t}function pf(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:G(e.source,[...n.split(`.`),r])})}}}function mf(e){return pf(`${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 hf(e){return pf(`${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 gf(e,t,n){return{...e,json:{...e.json,not:{pattern:`\\{\\{`}},parse:(r,i,a,o)=>{let s=o[a];if(typeof s==`string`&&Lc(s)){r.issues.push({path:`${i}.${a}`,message:`${i}.${a}: a rule is not allowed here — ${t} ${n}, so it names a value. Write the rule in globals.${a} (or a preset's globals.${a}) instead.`,line:G(r.source,[...i.split(`.`),a])});return}return e.parse(r,i,a,o)}}}const _f={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)`},vf={noun:`globals key`,fields:uf,removed:_f},yf={preset:mf(`a preset`),menuGlyph:hf(`a preset`)},bf={noun:`preset globals key`,fields:{...uf,...yf},removed:_f};function xf(e){return jf(e)&&!(e in yf)}const Sf=`is decided later than any rule could be settled`,Cf={noun:`editGlobals key`,removed:_f,fields:{...uf,preset:mf(`the editGlobals fragment`),menuGlyph:hf(`the editGlobals fragment`),palette:gf(uf.palette,`the editGlobals fragment`,Sf),style:gf(uf.style,`the editGlobals fragment`,Sf),effect:gf(uf.effect,`the editGlobals fragment`,Sf)}},wf={noun:`theme default key`,fields:{...Object.fromEntries(ku.map(e=>[e,uf[e]])),style:gf(uf.style,`a theme's default`,`is the look that theme wears by name`)}};function Tf(e,t){if(!Qu(t))return e.issues.push({path:`themeDefaults`,message:`themeDefaults must be an object mapping theme names to { shade, variation, style }, got ${$u(t)}`,line:G(e.source,[`themeDefaults`])}),{};let n={};for(let[r,i]of Object.entries(t)){let t=`themeDefaults.${r}`;if(!e.allowedPalettes.has(r)){e.issues.push({path:t,message:`${t}: "${r}" is not an installed theme${Oc(r)}. Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:G(e.source,[`themeDefaults`,r])});continue}let a=ed(e,wf,t,i);a!==null&&(n[r]=a)}return n}function Ef(e,t,n){return n===void 0?{}:ed(e,vf,t,n)??{}}function Df(e,t,n){return ed(e,bf,t,n)??{}}function Of(){return xd(bf)}function kf(e,t,n){return ed(e,Cf,t,n)??{}}const Af=new Set(Object.keys(uf));function jf(e){return Af.has(e)}function Mf(){return[...Af]}const Nf={padding:1};function Pf(e){let t=new Map;for(let[n,r]of Object.entries(Nf)){let i=e[n];t.set(n,typeof i==`number`?i:r)}return t}function Ff(e,t,n,r){return n.cache===void 0?(e.issues.push({path:`${t}.cache`,message:`${r} variables must declare a cache policy (one of: ${ju.join(`, `)})`,line:G(e.source,t.split(`.`))}),null):Bf(e,`${t}.cache`,n.cache)}function If(e,t,n){if(n.cache!==void 0)return Bf(e,`${t}.cache`,n.cache)??void 0}function Lf(e){return{required:!0,json:Vf(),parse:(t,n,r,i)=>Ff(t,n,i,e)??void 0}}function Rf(){return{required:!1,json:Vf(),parse:(e,t,n,r)=>If(e,t,r)}}const zf={noun:`cache`,arms:{ttl:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&Uf(n)?{ttl:n}:ad(e,t,`cache.ttl must be a duration string like "5s", "100ms", "2m", "1h"; got ${K(n)}`)},watch_file:{json:{type:`string`,pattern:`^/`},parse:(e,t,n)=>{if(typeof n!=`string`)return ad(e,t,`cache.watch_file must be a path string, got ${K(n)}`);let r=_d(`cache.watch_file`,n);return r===null?{watch_file:n}:ad(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}:ad(e,t,`cache.depends_on must be an array of variable-name strings, got ${K(n)}`)},key:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&n!==``?{key:n}:ad(e,t,`cache.key must be a non-empty template string, got ${K(n)}`)},never:{json:{const:!0},parse:(e,t,n)=>n===!0?{never:!0}:ad(e,t,`cache.never must be the literal boolean true, got ${K(n)}`)}}};function Bf(e,t,n){return od(e,zf,t,n)}function Vf(){return wd(zf)}const Hf=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/;function Uf(e){return Hf.test(e)}function Wf(e,t,n){if(n===void 0)return{};if(!Qu(n))return e.issues.push({path:t,message:`${t} must be an object, got ${$u(n)}`,line:G(e.source,t.split(`.`))}),{};let r={};for(let[i,a]of Object.entries(n)){let n=sd(e,mp,`${t}.${i}`,a);n!==null&&(r[i]=n)}return r}function Gf(){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 ${$u(i)}`,line:G(e.source,t.split(`.`))});return}return i}}}function Kf(){return{required:!0,json:{enum:[...Nu]},parse:(e,t,n,r)=>{let i=r.field;if(typeof i!=`string`||!Nu.includes(i)){e.issues.push({path:`${t}.field`,message:`git field must be one of: ${Nu.join(`, `)}, got ${JSON.stringify(i)}`,line:G(e.source,[...t.split(`.`),`field`])});return}return i}}}function qf(){return{required:!1,json:{type:[`string`,`number`,`boolean`]},parse:(e,t,n,r)=>{let i=r.type;return Ju(e,t,r,i===`number`||i===`boolean`||i===`string`?i:`string`)}}}const Jf={noun:`parse`,arms:{text:{json:{const:!0},parse:(e,t,n)=>n===!0?{text:!0}:ad(e,t,`parse.text must be the literal boolean true, got ${K(n)}`)},regex:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`?Yf(e,t,n):ad(e,t,`parse.regex must be a pattern string, got ${K(n)}`)},json:{json:{const:!0},parse:(e,t,n)=>n===!0?{json:!0}:ad(e,t,`parse.json must be the literal boolean true, got ${K(n)}`)}}};function Yf(e,t,n){let r;try{new RegExp(n),r=RegExp(`${n}|`).exec(``).length-1}catch(n){return ad(e,t,`parse.regex is not a valid regular expression: ${n.message}`)}return r>=1?{regex:n}:ad(e,t,`parse.regex must contain a capture group — its group 1 is the value; got ${JSON.stringify(n)}`)}function Xf(){return{required:!1,json:wd(Jf),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:G(e.source,[...t.split(`.`),`regex`])}),r.parse===void 0?void 0:od(e,Jf,`${t}.parse`,r.parse)??void 0)}}function Zf(){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)=>Qu(r.parse)&&`json`in r.parse?Qf(e,t,r.default):Yu(e,t,r,`default`)}}function Qf(e,t,n){if(n!==void 0)return $f(n)?n:ad(e,`${t}.default`,`${t}.default must be a JSON value (a json-parsed source's document), got ${K(n)}`)??void 0}function $f(e){return e!==null&&ep(e)}function ep(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(ep);let t=Object.getPrototypeOf(e);return(t===Object.prototype||t===null)&&Object.values(e).every(ep)}default:return!1}}const tp={value:Gf(),default:dd()},np={path:gd(),type:yd([`string`,`number`,`boolean`]),default:qf()},rp={name:gd(),default:dd()},ip={path:vd(),readMode:yd([`whole`,`first-line`]),parse:Xf(),cache:Lf(`file`),default:Zf()},ap={command:gd(),parse:Xf(),cache:Lf(`shell`),default:Zf()},op={template:gd(),cache:Rf(),default:dd()},sp={layout:gd(),default:dd()},cp={cache:`a time variable reads the instant its render is drawn at, so it takes no cache policy — delete the key`},lp={field:Kf(),default:dd()},up={cache:`a git variable is refreshed by the daemon's own watch on the repository, so it takes no cache policy — delete the key`},dp={key:gd(),default:dd()},fp=`kind`;function pp(e,t,n={}){return{...cd(fp,e,t),parse:(r,i,a)=>{td(r,n,i,a);let o=nd(r,t,i,a);return o===null?null:{kind:e,...o}}}}const mp={tag:fp,noun:`source kind`,memberNoun:`variable`,arms:{literal:pp(`literal`,tp),input:pp(`input`,np),env:pp(`env`,rp),file:pp(`file`,ip),shell:pp(`shell`,ap),template:pp(`template`,op),time:pp(`time`,sp,cp),git:pp(`git`,lp,up),state:pp(`state`,dp)}};function hp(){return Cd(mp)}function gp(){return{type:`object`,additionalProperties:hp()}}const _p=[`location`,`git`,`model-context`,`cost-limits`,`activity`,`session-tools`],vp=[..._p,`other`],yp={location:`location`,git:`git`,"model-context":`model & context`,"cost-limits":`cost & limits`,activity:`activity`,"session-tools":`session tools`,other:`other`};function bp(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}const xp=`groups.`,Sp=`menus.`,Cp=`edit.`,wp=`candybar.`,Tp=[xp,Sp,Cp,wp];function Ep(e){return Tp.some(t=>e.startsWith(t))}function Dp(e){let t=bp(e);return Tp.find(e=>t.startsWith(bp(e)))}function Op(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:G(e.source,[`root`])})}const kp=new Map([[`gitTaculous`,`gitaculous`],[`git`,`gitaculous`],[`settings.menu`,`candybar.menu`]]);function Ap(e){let t=kp.get(e);return t===void 0?``:` (the built-in segment "${e}" was renamed to "${t}" — update this reference)`}const jp=/^[A-Za-z_][A-Za-z0-9_]*$/,Mp={pattern:jp.source},Np={anyOf:[{type:`boolean`},{type:`string`},{type:`integer`}]},Pp={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`,...Mp}}}]},default:Np}},Fp=[`label`,`domain`,`default`],Ip=[`min`,`max`,`step`,`atLeast`];function Lp(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function Rp(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 Lp(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 Lp(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?Lp(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(Qu(n)){let{min:r,max:i,step:a=1,atLeast:o}=n;return Object.keys(n).filter(e=>!Ip.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}}:Lp(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 Lp(e,t,`domain must be "bool", a list of words, or { min, max }, got ${K(n)}`)}function zp(e,t,n){if(!Qu(n))return Lp(e,t,`${t} must be { label, domain, default }, got ${$u(n)}`);for(let r of Object.keys(n))Fp.includes(r)||Lp(e,`${t}.${r}`,`Unknown setting key "${r}". Expected one of: ${Fp.join(`, `)}`);let{label:r}=n,i=typeof r==`string`&&r.length>0&&!/[\n\r]/.test(r);i||Lp(e,`${t}.label`,`a setting needs a one-line, non-empty "label" — the name its control shows, spliced into a synthesized template string — got ${K(r)}`);let a=Rp(e,`${t}.domain`,n.domain);if(!i||a===void 0)return;let o={label:r,domain:a,default:n.default};return!Bp(n.default)||!Bu(o,n.default)?Lp(e,`${t}.default`,`default must be ${Wu(o)}, got ${K(n.default)}`):o}function Bp(e){return typeof e==`boolean`||typeof e==`string`||typeof e==`number`}const Vp={theme:`its default for this segment is segments.<name>.palette, and a placement sets its own with settings: { ${Pu}: "<theme>" }`,effect:`a placement follows the bar's effect, or sets its own with settings: { effect: "<effect>" }`};function Hp(e){return Iu.includes(e)}function Up(){return{required:!1,json:{type:`object`,propertyNames:{...Mp,not:{enum:[...Iu]}},additionalProperties:Pp},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!Qu(i))return Lp(e,a,`${a} must be an object of name → { label, domain, default }, got ${$u(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i)){if(!jp.test(t)){Lp(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(Hp(t)){Lp(e,`${a}.${t}`,`setting "${t}" is one every placement already has — ${Vp[t]}`);continue}let r=zp(e,`${a}.${t}`,n);r!==void 0&&(o[t]=r)}return o}}}const Wp=Tp.map(e=>e.replace(/\./g,`\\.`)).join(`|`);function Gp(){return{required:!1,json:{type:`string`,minLength:1,pattern:`^(?!${Wp})[^:/]+$`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return typeof i==`string`&&i.length>0&&!/[:/]/.test(i)&&!Ep(i)?i:Lp(e,`${t}.${n}`,`a placement "id" must be a non-empty string without "/" or ":", outside the reserved ${Tp.map(e=>`"${e}"`).join(`, `)} namespaces, got ${K(i)}`)}}}function Kp(){return{required:!1,json:{type:`object`,propertyNames:Mp,additionalProperties:Np},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!Qu(i))return Lp(e,a,`a placement's "settings" must be an object of setting name → value, got ${$u(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i))Bp(n)?o[t]=n:Lp(e,`${a}.${t}`,`setting "${t}" must be a boolean, a word, or a number, got ${$u(n)}`);return o}}}function qp(e){return new Set(Object.keys(e.segments).filter(e=>!Ep(e)))}function Jp(e,t,n){if(t===void 0)return{};if(!Qu(t))return e.issues.push({path:`segments`,message:`segments must be an object, got ${$u(t)}`,line:G(e.source,[`segments`])}),{};let r={};for(let[i,a]of Object.entries(t)){let t=ed(e,n.has(i)?em:$p,`segments.${i}`,a);t!==null&&(r[i]=t)}return r}function Yp(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>r[n]===void 0?ad(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${Ap(t.slice(9))}`)??void 0:qu(e,t,r,n)??void 0}}function Xp(){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 ${K(i)}`,line:G(e.source,[...t.split(`.`),n])})}}}}function Zp(){return{required:!1,json:gp(),parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return Wf(e,`${t}.${n}`,i)}}}const Qp={template:Yp(),description:dd(),group:yd(_p),width:Xp(),justify:yd(Gu),truncate:yd(Ku),bg:dd(),fg:dd(),when:dd(),palette:hd(),vars:Zp(),settings:Up()},$p={noun:`segment key`,fields:Qp},em={noun:`segment key`,fields:{...Qp,template:dd()}},tm=`#/definitions/LayoutNode`,nm={kind:`container`,direction:`vertical`,children:[]};function rm(e){return{required:!0,json:{const:e},parse:()=>e}}function im(){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 ${K(i)}`,line:G(e.source,[`root`])}),``)}}}function am(){return{required:!0,json:{enum:[...vu]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&vu.includes(i)?i:(e.issues.push({path:`${t}.${n}`,message:`a container "direction" must be one of: ${vu.join(`, `)} (got ${JSON.stringify(i)})`,line:G(e.source,[`root`])}),`vertical`)}}}function om(e){return{required:!0,json:{type:`array`,items:{$ref:tm}},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 ${$u(a)}`,line:G(t.source,[`root`])}),[])}}}const sm={noun:`layout-node key`,fields:{kind:rm(`segment`),name:im(),when:dd(),id:Gp(),settings:Kp()}},cm=()=>yd(js),lm={noun:`layout-node key`,fields:{kind:rm(`container`),direction:am(),children:om(ld(()=>mm)),when:dd(),distribution:cm()}};function um(){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 ${K(i)}`,line:G(e.source,[`root`])}),``)}}}const dm={noun:`layout-node key`,fields:{seg:um(),when:dd(),id:Gp(),settings:Kp()}},fm={noun:`layout-node key`,fields:{h:om(ld(()=>mm)),when:dd(),distribution:cm()}},pm={noun:`layout-node key`,fields:{v:om(ld(()=>mm)),when:dd(),distribution:cm()}},mm=(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:G(e.source,[`root`])}),nm):{kind:`segment`,name:n};if(!Qu(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 ${$u(n)}`,line:G(e.source,[`root`])}),nm;if(n.kind===`container`)return ed(e,lm,t,n)??nm;if(n.kind===`segment`)return ed(e,sm,t,n)??nm;if(n.kind===`cells`)return e.issues.push({path:t,message:`kind: "cells" is no longer supported — use the h-arm spelling instead:
|
|
42
|
+
`)}const vu=[`vertical`,`horizontal`],yu={vertical:`row`,horizontal:`cell`};function bu(e){return e.id??e.name}function xu(e){return[...wu(e)].flatMap(e=>e.kind===`segment`?[bu(e)]:[])}function Su(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e}-${n}`);)n++;return`${e}-${n}`}function Cu(e,t){return e.opens===void 0?e:{...e,opens:{...e.opens,body:t(e.opens.body)}}}function*wu(e){yield e;for(let t of Ou(e))yield*wu(t)}const Tu=(e,t)=>`${e}.children[${t}]`,Eu=e=>`${e}.opens.body`;function*Du(e,t){if(yield[e,t],e.kind===`container`)for(let[n,r]of e.children.entries())yield*Du(r,Tu(t,n));else e.opens!==void 0&&(yield*Du(e.opens.body,Eu(t)))}function Ou(e){return e.kind===`container`?e.children:e.opens===void 0?[]:[e.opens.body]}const ku=[`shade`,`variation`,`style`];function Au(e){return e===void 0||`text`in e?`text`:`regex`in e?`regex`:`json`}const ju=[`ttl`,`watch_file`,`depends_on`,`key`,`never`];function Mu(e){return e.kind===`file`||e.kind===`shell`||e.kind===`template`}const Nu=[`branch`,`sha`,`dirty`,`ahead`,`behind`,`stash`],Pu=`theme`,Fu=`effect`,Iu=[Pu,Fu];function Lu(e){return{...e.settings,[Pu]:{label:Pu,domain:`theme`,default:e.palette??`bar`},[Fu]:{label:Fu,domain:Kc,default:`bar`}}}function Ru(e){let t=e?.domain;return typeof t==`object`&&`min`in t?t:void 0}function zu(e,t){return Object.entries(e).flatMap(([n,r])=>{let i=Ru(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 Bu(e,t){let{domain:n}=e;return n===`bool`?typeof t==`boolean`:n===`theme`?typeof t==`string`&&Pc(t):`min`in n?typeof t==`number`&&Number.isInteger(t)&&t>=n.min&&t<=n.max:typeof t==`string`&&n.includes(t)}function Vu(e){return String(e)}function Hu(e,t){let{domain:n}=e;if(typeof n==`object`&&`min`in n)return _l(t,n)??void 0;let r=n===`bool`?t===`true`?!0:t===`false`?!1:t:t;return Bu(e,r)?r:void 0}function Uu(e,t,n,r){let i=e.settings?.[t]??n.default,a=e.drafts?.[t],o=a===void 0?null:r(a);return(o===null?void 0:Hu(n,o))??i}function Wu(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 Gu=[`left`,`center`,`right`],Ku=[`right`,`left`,`middle`];function qu(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 ${$u(i)}`,line:G(e.source,[...t.split(`.`),r])}),null)}function Ju(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 ${$u(i)}`,line:G(e.source,[...t.split(`.`),`default`])});return}return i}}function Yu(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 ${$u(i)}`,line:G(e.source,[...t.split(`.`),r])});return}return i}}function Xu(e,t,n){let r=Yu(e,t,n,`palette`);if(r!==void 0){if(!e.allowedPalettes.has(r)){e.issues.push({path:`${t}.palette`,message:`Unknown palette "${r}"${Oc(r)}. Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:G(e.source,[...t.split(`.`),`palette`])});return}return r}}function Zu(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 ${K(a)}`,line:G(e.source,[...t.split(`.`),r])});return}return a}}function Qu(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $u(e){return e===null?`null`:Array.isArray(e)?`array`:typeof e}function K(e){return typeof e==`string`?JSON.stringify(e):e===void 0?`undefined`:String(e)}function ed(e,t,n,r){return Qu(r)?(id(e,n,r,t.noun,new Set(Object.keys(t.fields)),td(e,t.removed??{},n,r)),nd(e,t.fields,n,r)):(e.issues.push({path:n,message:`${n} must be an object, got ${$u(r)}`,line:G(e.source,n.split(`.`))}),null)}function td(e,t,n,r){let i=Object.entries(t).filter(([e])=>r[e]!==void 0);for(let[t,r]of i)ad(e,`${n}.${t}`,`${n}.${t} was removed: ${r}`);return new Set(i.map(([e])=>`${n}.${e}`))}function nd(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 rd=new Set;function id(e,t,n,r,i,a=rd){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:G(e.source,[...t.split(`.`),o])})}function ad(e,t,n){return e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))}),null}function od(e,t,n,r){if(!Qu(r))return e.issues.push({path:n,message:`${t.noun} must be an object, got ${$u(r)}`,line:G(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:G(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:G(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:G(e.source,n.split(`.`))}),null;let c=o[0];return i[c].parse(e,`${n}.${c}`,r[c])}function sd(e,t,n,r){if(!Qu(r))return e.issues.push({path:n,message:`${n} must be an object, got ${$u(r)}`,line:G(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 ${$u(i)}`,line:G(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:G(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 id(e,n,r,`${i} ${t.memberNoun} key`,o.keys,l),c}function cd(e,t,n){return{json:Sd(bd(n),e,t),keys:new Set([e,...Object.keys(n)])}}function ld(e){return(...t)=>e()(...t)}function ud(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:G(n.source,o.split(`.`))}),null}return a}}function dd(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>Yu(e,t,r,n)}}function fd(){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 ${$u(i)}`,line:G(e.source,[n])});return}return i}}}}function pd(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 ${K(o)}`,line:G(e.source,[i])});return}return o}}}}function md(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 ${K(a)}`,line:G(e.source,[r])});return}return a}}}}function hd(){return{required:!1,json:{type:`string`},parse:(e,t,n,r)=>Xu(e,t,r)}}function gd(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>qu(e,t,r,n)??void 0}}function _d(e,t){return f(t)?null:`${e} must be an absolute path (\`~\` and relative paths are not expanded), got ${JSON.stringify(t)}`}function vd(){return{required:!0,json:{type:`string`,pattern:`^/`},parse:(e,t,n,r)=>{let i=qu(e,t,r,n);if(i===null)return;let a=_d(`${t}.${n}`,i);return a===null?i:ad(e,`${t}.${n}`,a)??void 0}}}function yd(e){return{required:!1,json:{enum:[...e]},parse:(t,n,r,i)=>Zu(t,n,i,r,e)}}function bd(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 xd(e){return bd(e.fields)}function Sd(e,t,n){let r=e,i={[t]:{const:n},...r.properties},a=[t,...r.required??[]];return{...r,properties:i,required:a}}function Cd(e){let t=e.arms;return{anyOf:Object.values(t).map(e=>e.json)}}function wd(e){let t=e.arms;return{anyOf:Object.entries(t).map(([e,t])=>({type:`object`,properties:{[e]:t.json},required:[e],additionalProperties:!1}))}}const Td=/^[A-Za-z_][A-Za-z0-9_]*$/;function Ed(e){return`#${e+1}`}const Dd={rows:{}};function Od(e){return`rows`in e}function kd(e){return Object.fromEntries(e.map((e,t)=>[Ed(t),e]))}function Ad(e){if(e.kind===`container`&&e.direction===`vertical`){let{kind:t,direction:n,children:r,...i}=e;return{...i,rows:kd(r)}}let{when:t,...n}=e;return{...t!==void 0&&{when:t},rows:kd([n])}}function jd(e){let{rows:t,...n}=e;return{kind:`container`,direction:`vertical`,children:Object.values(t),...n}}function Md(e){return Od(e)?jd(e):e}function*Nd(e,t){if(!Od(e)){yield*Du(e,t);return}yield[jd(e),t];for(let[n,r]of Object.entries(e.rows))yield*Du(r,`${t}.rows.${n}`)}function Pd(e,t){return Od(e)?{...t,...e,rows:{...t.rows,...e.rows}}:Ad(e)}function Fd(e){if(!Od(e))return!0;let{rows:t,...n}=e;return Object.values(n).some(e=>e!==void 0)||Object.keys(t).length>0}function Id(e,t){return{globals:{...t.globals,...e.globals??{}},variables:{...t.variables,...e.variables??{}},segments:zd(t.segments,Ld(t.segments,e.segments??{})),root:Pd(e.root??Dd,t.root),actions:{...t.actions,...e.actions??{}},styles:{...t.styles,...e.styles??{}},presets:zd(t.presets,Rd(t.presets,e.presets??{})),themeDefaults:zd(t.themeDefaults,e.themeDefaults??{}),editGlobals:{...t.editGlobals,...e.editGlobals??{}},helpers:{...t.helpers,...e.helpers??{}}}}function Ld(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 Rd(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 zd(e,t){return{...e,...Object.fromEntries(Object.entries(t).map(([t,n])=>[t,{...e[t],...n}]))}}const Bd=`closed`,Vd=`🍫`;function Hd(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 Ud(e,t,n,r){let i=Hd(e,t.length,n);if(i!==void 0)throw Error(i);return t.length===1?t[0]:t[r]}function Wd(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}function Gd(e,t,n,r,i){return{kind:`segment`,name:e,opens:{ref:t,body:n,placement:r},...i!==void 0&&{when:i}}}function Kd(e,...t){return`{{ and ${[e,...t].map(qd).join(` `)} }}`}function qd(e){return`(eq .${e.variable} "${Wd(e.member)}")`}function Jd(e,t,n){return`{{ ${Yd(e,Xd(t),Xd(n))} }}`}function Yd(e,t,n){return`action "${e}" ${t} ${n}`}function Xd(e){return`"${Wd(e)}"`}function Zd(e,t){return{kind:`state`,key:e,default:t}}function Qd(e,t){return{set:e,cycle:[Bd,t]}}const $d={required:!1,json:{enum:[...il]},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: ${il.join(`, `)}`,line:G(e.source,[...t.split(`.`),n])});return}return Zu(e,t,r,n,il)}},ef={required:!1,json:{type:`string`},parse:(e,t,n,r)=>{let i=Yu(e,t,r,n);return Lc(i)?i:Xu(e,t,r)}},tf={required:!1,json:{anyOf:[{enum:[...Gc]},{type:`string`,pattern:`\\{\\{`}]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&Lc(i)?i:Zu(e,t,r,n,Gc)}},nf=/^[^\r\n]*\S[^\r\n]*$/u,rf=RegExp(`^(?:✖|✕)[\\uFE0E\\uFE0F]?$`,`u`),af={required:!1,json:{type:`string`,pattern:nf.source,not:{pattern:rf.source}},parse:(e,t,n,r)=>{let i=Yu(e,t,r,n);if(i===void 0||nf.test(i)&&!rf.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:G(e.source,[...t.split(`.`),n])})}};function of(e){return{spec:yd(e),domain:{from:e}}}function sf(){return{spec:fd(),domain:`bool`}}function cf(e){return{spec:e,domain:`text`}}const lf={default_empty_value:cf(dd()),default_separator:cf(dd()),palette:{spec:ef,domain:{from:`themes`}},style:{spec:dd(),domain:{from:`styles`}},effect:{spec:tf,domain:{from:Gc}},preset:{spec:dd(),domain:{from:`presets`}},endcaps:of(Xc),variation:of(ol),shade:of(ll),autoWrap:sf(),padding:{spec:pd(hl),domain:{...hl,step:1}},charset:of(tl),updateNotice:sf(),transitions:sf(),colorCompatibility:{spec:$d,domain:{from:il}},menuGlyph:cf(af)},uf=Object.fromEntries(Object.entries(lf).map(([e,t])=>[e,t.spec]));function df(e){return lf[e].domain}function ff(e){let t=df(e);if(t===`text`)throw Error(`globals.${e} is free text, which no control can change — list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);return t}function pf(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:G(e.source,[...n.split(`.`),r])})}}}function mf(e){return pf(`${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 hf(e){return pf(`${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 gf(e,t,n){return{...e,json:{...e.json,not:{pattern:`\\{\\{`}},parse:(r,i,a,o)=>{let s=o[a];if(typeof s==`string`&&Lc(s)){r.issues.push({path:`${i}.${a}`,message:`${i}.${a}: a rule is not allowed here — ${t} ${n}, so it names a value. Write the rule in globals.${a} (or a preset's globals.${a}) instead.`,line:G(r.source,[...i.split(`.`),a])});return}return e.parse(r,i,a,o)}}}const _f={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)`},vf={noun:`globals key`,fields:uf,removed:_f},yf={preset:mf(`a preset`),menuGlyph:hf(`a preset`)},bf={noun:`preset globals key`,fields:{...uf,...yf},removed:_f};function xf(e){return jf(e)&&!(e in yf)}const Sf=`is decided later than any rule could be settled`,Cf={noun:`editGlobals key`,removed:_f,fields:{...uf,preset:mf(`the editGlobals fragment`),menuGlyph:hf(`the editGlobals fragment`),palette:gf(uf.palette,`the editGlobals fragment`,Sf),style:gf(uf.style,`the editGlobals fragment`,Sf),effect:gf(uf.effect,`the editGlobals fragment`,Sf)}},wf={noun:`theme default key`,fields:{...Object.fromEntries(ku.map(e=>[e,uf[e]])),style:gf(uf.style,`a theme's default`,`is the look that theme wears by name`)}};function Tf(e,t){if(!Qu(t))return e.issues.push({path:`themeDefaults`,message:`themeDefaults must be an object mapping theme names to { shade, variation, style }, got ${$u(t)}`,line:G(e.source,[`themeDefaults`])}),{};let n={};for(let[r,i]of Object.entries(t)){let t=`themeDefaults.${r}`;if(!e.allowedPalettes.has(r)){e.issues.push({path:t,message:`${t}: "${r}" is not an installed theme${Oc(r)}. Expected one of: ${[...e.allowedPalettes].sort().join(`, `)}`,line:G(e.source,[`themeDefaults`,r])});continue}let a=ed(e,wf,t,i);a!==null&&(n[r]=a)}return n}function Ef(e,t,n){return n===void 0?{}:ed(e,vf,t,n)??{}}function Df(e,t,n){return ed(e,bf,t,n)??{}}function Of(){return xd(bf)}function kf(e,t,n){return ed(e,Cf,t,n)??{}}const Af=new Set(Object.keys(uf));function jf(e){return Af.has(e)}function Mf(){return[...Af]}const Nf={padding:1};function Pf(e){let t=new Map;for(let[n,r]of Object.entries(Nf)){let i=e[n];t.set(n,typeof i==`number`?i:r)}return t}function Ff(e,t,n,r){return n.cache===void 0?(e.issues.push({path:`${t}.cache`,message:`${r} variables must declare a cache policy (one of: ${ju.join(`, `)})`,line:G(e.source,t.split(`.`))}),null):Bf(e,`${t}.cache`,n.cache)}function If(e,t,n){if(n.cache!==void 0)return Bf(e,`${t}.cache`,n.cache)??void 0}function Lf(e){return{required:!0,json:Vf(),parse:(t,n,r,i)=>Ff(t,n,i,e)??void 0}}function Rf(){return{required:!1,json:Vf(),parse:(e,t,n,r)=>If(e,t,r)}}const zf={noun:`cache`,arms:{ttl:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&Uf(n)?{ttl:n}:ad(e,t,`cache.ttl must be a duration string like "5s", "100ms", "2m", "1h"; got ${K(n)}`)},watch_file:{json:{type:`string`,pattern:`^/`},parse:(e,t,n)=>{if(typeof n!=`string`)return ad(e,t,`cache.watch_file must be a path string, got ${K(n)}`);let r=_d(`cache.watch_file`,n);return r===null?{watch_file:n}:ad(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}:ad(e,t,`cache.depends_on must be an array of variable-name strings, got ${K(n)}`)},key:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`&&n!==``?{key:n}:ad(e,t,`cache.key must be a non-empty template string, got ${K(n)}`)},never:{json:{const:!0},parse:(e,t,n)=>n===!0?{never:!0}:ad(e,t,`cache.never must be the literal boolean true, got ${K(n)}`)}}};function Bf(e,t,n){return od(e,zf,t,n)}function Vf(){return wd(zf)}const Hf=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/;function Uf(e){return Hf.test(e)}function Wf(e,t,n){if(n===void 0)return{};if(!Qu(n))return e.issues.push({path:t,message:`${t} must be an object, got ${$u(n)}`,line:G(e.source,t.split(`.`))}),{};let r={};for(let[i,a]of Object.entries(n)){let n=sd(e,mp,`${t}.${i}`,a);n!==null&&(r[i]=n)}return r}function Gf(){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 ${$u(i)}`,line:G(e.source,t.split(`.`))});return}return i}}}function Kf(){return{required:!0,json:{enum:[...Nu]},parse:(e,t,n,r)=>{let i=r.field;if(typeof i!=`string`||!Nu.includes(i)){e.issues.push({path:`${t}.field`,message:`git field must be one of: ${Nu.join(`, `)}, got ${JSON.stringify(i)}`,line:G(e.source,[...t.split(`.`),`field`])});return}return i}}}function qf(){return{required:!1,json:{type:[`string`,`number`,`boolean`]},parse:(e,t,n,r)=>{let i=r.type;return Ju(e,t,r,i===`number`||i===`boolean`||i===`string`?i:`string`)}}}const Jf={noun:`parse`,arms:{text:{json:{const:!0},parse:(e,t,n)=>n===!0?{text:!0}:ad(e,t,`parse.text must be the literal boolean true, got ${K(n)}`)},regex:{json:{type:`string`},parse:(e,t,n)=>typeof n==`string`?Yf(e,t,n):ad(e,t,`parse.regex must be a pattern string, got ${K(n)}`)},json:{json:{const:!0},parse:(e,t,n)=>n===!0?{json:!0}:ad(e,t,`parse.json must be the literal boolean true, got ${K(n)}`)}}};function Yf(e,t,n){let r;try{new RegExp(n),r=RegExp(`${n}|`).exec(``).length-1}catch(n){return ad(e,t,`parse.regex is not a valid regular expression: ${n.message}`)}return r>=1?{regex:n}:ad(e,t,`parse.regex must contain a capture group — its group 1 is the value; got ${JSON.stringify(n)}`)}function Xf(){return{required:!1,json:wd(Jf),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:G(e.source,[...t.split(`.`),`regex`])}),r.parse===void 0?void 0:od(e,Jf,`${t}.parse`,r.parse)??void 0)}}function Zf(){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)=>Qu(r.parse)&&`json`in r.parse?Qf(e,t,r.default):Yu(e,t,r,`default`)}}function Qf(e,t,n){if(n!==void 0)return $f(n)?n:ad(e,`${t}.default`,`${t}.default must be a JSON value (a json-parsed source's document), got ${K(n)}`)??void 0}function $f(e){return e!==null&&ep(e)}function ep(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(ep);let t=Object.getPrototypeOf(e);return(t===Object.prototype||t===null)&&Object.values(e).every(ep)}default:return!1}}const tp={value:Gf(),default:dd()},np={path:gd(),type:yd([`string`,`number`,`boolean`]),default:qf()},rp={name:gd(),default:dd()},ip={path:vd(),readMode:yd([`whole`,`first-line`]),parse:Xf(),cache:Lf(`file`),default:Zf()},ap={command:gd(),parse:Xf(),cache:Lf(`shell`),default:Zf()},op={template:gd(),cache:Rf(),default:dd()},sp={layout:gd(),default:dd()},cp={cache:`a time variable reads the instant its render is drawn at, so it takes no cache policy — delete the key`},lp={field:Kf(),default:dd()},up={cache:`a git variable is refreshed by the daemon's own watch on the repository, so it takes no cache policy — delete the key`},dp={key:gd(),default:dd()},fp=`kind`;function pp(e,t,n={}){return{...cd(fp,e,t),parse:(r,i,a)=>{td(r,n,i,a);let o=nd(r,t,i,a);return o===null?null:{kind:e,...o}}}}const mp={tag:fp,noun:`source kind`,memberNoun:`variable`,arms:{literal:pp(`literal`,tp),input:pp(`input`,np),env:pp(`env`,rp),file:pp(`file`,ip),shell:pp(`shell`,ap),template:pp(`template`,op),time:pp(`time`,sp,cp),git:pp(`git`,lp,up),state:pp(`state`,dp)}};function hp(){return Cd(mp)}function gp(){return{type:`object`,additionalProperties:hp()}}const _p=[`location`,`git`,`model-context`,`cost-limits`,`activity`,`session-tools`],vp=[..._p,`other`],yp={location:`location`,git:`git`,"model-context":`model & context`,"cost-limits":`cost & limits`,activity:`activity`,"session-tools":`session tools`,other:`other`};function bp(e){return e.replace(/[^A-Za-z0-9]+/g,`_`)}const xp=`groups.`,Sp=`menus.`,Cp=`edit.`,wp=`candybar.`,Tp=[xp,Sp,Cp,wp];function Ep(e){return Tp.some(t=>e.startsWith(t))}function Dp(e){let t=bp(e);return Tp.find(e=>t.startsWith(bp(e)))}function Op(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:G(e.source,[`root`])})}const kp=new Map([[`gitTaculous`,{kind:`built-in`,to:`gitaculous`}],[`git`,{kind:`built-in`,to:`gitaculous`}],[`settings.menu`,{kind:`built-in`,to:`candybar.menu`}],[`ticket`,{kind:`plugin`,to:`plugins.lit.ticket`,folder:`examples/plugins/lit`}]]);function Ap(e){let t=kp.get(e);if(t===void 0)return``;switch(t.kind){case`built-in`:return` (the built-in segment "${e}" was renamed to "${t.to}" — update this reference)`;case`plugin`:return` (the built-in segment "${e}" became "${t.to}", a segment of the plugin in cc-candybar's ${t.folder} — install that folder in a plugin root (docs/segment-authoring.md, "Installing a plugin instead of listing it"), then update this reference)`}}const jp=/^[A-Za-z_][A-Za-z0-9_]*$/,Mp={pattern:jp.source},Np={anyOf:[{type:`boolean`},{type:`string`},{type:`integer`}]},Pp={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`,...Mp}}}]},default:Np}},Fp=[`label`,`domain`,`default`],Ip=[`min`,`max`,`step`,`atLeast`];function Lp(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function Rp(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 Lp(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 Lp(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?Lp(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(Qu(n)){let{min:r,max:i,step:a=1,atLeast:o}=n;return Object.keys(n).filter(e=>!Ip.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}}:Lp(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 Lp(e,t,`domain must be "bool", a list of words, or { min, max }, got ${K(n)}`)}function zp(e,t,n){if(!Qu(n))return Lp(e,t,`${t} must be { label, domain, default }, got ${$u(n)}`);for(let r of Object.keys(n))Fp.includes(r)||Lp(e,`${t}.${r}`,`Unknown setting key "${r}". Expected one of: ${Fp.join(`, `)}`);let{label:r}=n,i=typeof r==`string`&&r.length>0&&!/[\n\r]/.test(r);i||Lp(e,`${t}.label`,`a setting needs a one-line, non-empty "label" — the name its control shows, spliced into a synthesized template string — got ${K(r)}`);let a=Rp(e,`${t}.domain`,n.domain);if(!i||a===void 0)return;let o={label:r,domain:a,default:n.default};return!Bp(n.default)||!Bu(o,n.default)?Lp(e,`${t}.default`,`default must be ${Wu(o)}, got ${K(n.default)}`):o}function Bp(e){return typeof e==`boolean`||typeof e==`string`||typeof e==`number`}const Vp={theme:`its default for this segment is segments.<name>.palette, and a placement sets its own with settings: { ${Pu}: "<theme>" }`,effect:`a placement follows the bar's effect, or sets its own with settings: { effect: "<effect>" }`};function Hp(e){return Iu.includes(e)}function Up(){return{required:!1,json:{type:`object`,propertyNames:{...Mp,not:{enum:[...Iu]}},additionalProperties:Pp},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!Qu(i))return Lp(e,a,`${a} must be an object of name → { label, domain, default }, got ${$u(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i)){if(!jp.test(t)){Lp(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(Hp(t)){Lp(e,`${a}.${t}`,`setting "${t}" is one every placement already has — ${Vp[t]}`);continue}let r=zp(e,`${a}.${t}`,n);r!==void 0&&(o[t]=r)}return o}}}const Wp=Tp.map(e=>e.replace(/\./g,`\\.`)).join(`|`);function Gp(){return{required:!1,json:{type:`string`,minLength:1,pattern:`^(?!${Wp})[^:/]+$`},parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return typeof i==`string`&&i.length>0&&!/[:/]/.test(i)&&!Ep(i)?i:Lp(e,`${t}.${n}`,`a placement "id" must be a non-empty string without "/" or ":", outside the reserved ${Tp.map(e=>`"${e}"`).join(`, `)} namespaces, got ${K(i)}`)}}}function Kp(){return{required:!1,json:{type:`object`,propertyNames:Mp,additionalProperties:Np},parse:(e,t,n,r)=>{let i=r[n];if(i===void 0)return;let a=`${t}.${n}`;if(!Qu(i))return Lp(e,a,`a placement's "settings" must be an object of setting name → value, got ${$u(i)}`);let o=Object.create(null);for(let[t,n]of Object.entries(i))Bp(n)?o[t]=n:Lp(e,`${a}.${t}`,`setting "${t}" must be a boolean, a word, or a number, got ${$u(n)}`);return o}}}function qp(e){return new Set(Object.keys(e.segments).filter(e=>!Ep(e)))}function Jp(e,t,n){if(t===void 0)return{};if(!Qu(t))return e.issues.push({path:`segments`,message:`segments must be an object, got ${$u(t)}`,line:G(e.source,[`segments`])}),{};let r={};for(let[i,a]of Object.entries(t)){let t=ed(e,n.has(i)?em:$p,`segments.${i}`,a);t!==null&&(r[i]=t)}return r}function Yp(){return{required:!0,json:{type:`string`},parse:(e,t,n,r)=>r[n]===void 0?ad(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${Ap(t.slice(9))}`)??void 0:qu(e,t,r,n)??void 0}}function Xp(){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 ${K(i)}`,line:G(e.source,[...t.split(`.`),n])})}}}}function Zp(){return{required:!1,json:gp(),parse:(e,t,n,r)=>{let i=r[n];if(i!==void 0)return Wf(e,`${t}.${n}`,i)}}}const Qp={template:Yp(),description:dd(),group:yd(_p),width:Xp(),justify:yd(Gu),truncate:yd(Ku),bg:dd(),fg:dd(),when:dd(),palette:hd(),vars:Zp(),settings:Up()},$p={noun:`segment key`,fields:Qp},em={noun:`segment key`,fields:{...Qp,template:dd()}},tm=`#/definitions/LayoutNode`,nm={kind:`container`,direction:`vertical`,children:[]};function rm(e){return{required:!0,json:{const:e},parse:()=>e}}function im(){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 ${K(i)}`,line:G(e.source,[`root`])}),``)}}}function am(){return{required:!0,json:{enum:[...vu]},parse:(e,t,n,r)=>{let i=r[n];return typeof i==`string`&&vu.includes(i)?i:(e.issues.push({path:`${t}.${n}`,message:`a container "direction" must be one of: ${vu.join(`, `)} (got ${JSON.stringify(i)})`,line:G(e.source,[`root`])}),`vertical`)}}}function om(e){return{required:!0,json:{type:`array`,items:{$ref:tm}},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 ${$u(a)}`,line:G(t.source,[`root`])}),[])}}}const sm={noun:`layout-node key`,fields:{kind:rm(`segment`),name:im(),when:dd(),id:Gp(),settings:Kp()}},cm=()=>yd(js),lm={noun:`layout-node key`,fields:{kind:rm(`container`),direction:am(),children:om(ld(()=>mm)),when:dd(),distribution:cm()}};function um(){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 ${K(i)}`,line:G(e.source,[`root`])}),``)}}}const dm={noun:`layout-node key`,fields:{seg:um(),when:dd(),id:Gp(),settings:Kp()}},fm={noun:`layout-node key`,fields:{h:om(ld(()=>mm)),when:dd(),distribution:cm()}},pm={noun:`layout-node key`,fields:{v:om(ld(()=>mm)),when:dd(),distribution:cm()}},mm=(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:G(e.source,[`root`])}),nm):{kind:`segment`,name:n};if(!Qu(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 ${$u(n)}`,line:G(e.source,[`root`])}),nm;if(n.kind===`container`)return ed(e,lm,t,n)??nm;if(n.kind===`segment`)return ed(e,sm,t,n)??nm;if(n.kind===`cells`)return e.issues.push({path:t,message:`kind: "cells" is no longer supported — use the h-arm spelling instead:
|
|
43
43
|
Old: { kind: "cells", segments: ["seg1", "seg2"] }
|
|
44
44
|
New: { h: ["seg1", "seg2"] }`,line:G(e.source,[`root`])}),nm;if(n.kind===`group`){let r=ed(e,xm,t,n);return r===null?nm:(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}),Cm(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:G(e.source,[`root`])}),nm}if(a){let r=ed(e,dm,t,n);return r===null?nm:{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=ed(e,fm,t,n);return r===null?nm:{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=ed(e,pm,t,n);return r===null?nm:{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:G(e.source,[`root`])}),nm};function hm(){return{required:!0,json:{type:`object`,propertyNames:{pattern:Td.source},additionalProperties:{$ref:tm}},parse:(e,t,n,r)=>{let i=r[n];if(!Qu(i))return e.issues.push({path:`${t}.${n}`,message:`"rows" must be an object of row name → layout node, got ${$u(i)}`,line:G(e.source,[...t.split(`.`),n])}),{};let a={};for(let[r,o]of Object.entries(i)){if(!Td.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:G(e.source,[...t.split(`.`),n,r])});continue}a[r]=mm(e,`${t}.${n}.${r}`,o)}return a}}}const gm={noun:`root key`,fields:{rows:hm(),when:dd(),distribution:cm()}};function _m(e,t,n){return Qu(n)&&`rows`in n?ed(e,gm,t,n)??{rows:{}}:mm(e,t,n)}function vm(){return{required:!0,json:{type:`string`,pattern:Td.source},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`string`||!Td.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 "${Bd}", got ${K(i)}`,line:G(e.source,[`root`])});return}return i}}}function ym(){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 ${K(i)}`,line:G(e.source,[`root`])});return}return i}}}}function bm(){return{required:!0,json:{type:`string`,pattern:`^[^\\n\\r]*$`},parse:(e,t,n,r)=>{let i=qu(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:G(e.source,[...t.split(`.`),n])});return}return i}}}}const xm={noun:`layout-node key`,fields:{kind:rm(`group`),name:vm(),label:bm(),open:fd(),direction:yd(vu),key:ym(),bg:dd(),fg:dd(),when:dd(),distribution:cm(),children:om(ld(()=>mm))}};function Sm(e){return e.key??`groups.`+e.name}function Cm(e){let t=xp+e.name;return Gd(t,{variable:t,key:Sm(e),member:e.name},{kind:`container`,direction:e.direction??`vertical`,children:e.children,...e.distribution!==void 0&&{distribution:e.distribution}},`drop`,e.when)}function wm(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,[`root`])})}function Tm(e,t){Op(e,t,xp,`group nodes`);let n=e.groups;if(n.length===0)return;let r=new Set;for(let t of n)r.has(t.name)&&wm(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}.`)&&Sm(t)===Sm(r)&&wm(e,t.path,`group "${t.name}" shares key "${Sm(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=Sm(t);if(i.has(n)||i.set(n,Bd),t.open===!0){let r=i.get(n);r!==`closed`&&wm(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=xp+e.name,r=Sm(e),c=n.filter(t=>t!==e&&e.path.startsWith(t.path+`.`)).length,l=` `.repeat(c);a[t]=Zd(r,i.get(r)),o[t]=Qd(r,e.name),s[t]={template:Jd(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 Em=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?Fm(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}},Dm=class extends Em{name=`ParseError`;kind=`ParseError`;expected;found;constructor(e,t,n={}){super(e,t,n),this.expected=n.expected,this.found=n.found}},Om=class extends Em{name=`EvalError`;kind=`EvalError`},km=class extends Om{name=`FuncNotFoundError`;kind=`FuncNotFoundError`;funcName;suggestions;constructor(e,t,n={}){let r=Im(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}},Am=class extends Om{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}},jm=class extends Om{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}},Mm=class extends jm{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)}`}},Nm=class extends Om{name=`MissingFieldError`;kind=`MissingFieldError`;path;constructor(e,t,n={}){super(`field "${e.join(`.`)}" not found on receiver`,t,n),this.path=e}},Pm=class extends Om{name=`FailError`;kind=`FailError`;constructor(e,t={line:0,column:0,offset:0},n={}){super(e,t,n)}};function Fm(e,t){let n=e.split(`
|
|
45
45
|
`),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(`
|
|
@@ -85,18 +85,18 @@ The target is already observable of different type.
|
|
|
85
85
|
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,O,new Xi(e,new Map,String(r),It(t))),e}var Qi=w(`ObservableObjectAdministration`,Xi);function $i(e){return Ji[e]||(Ji[e]={get:function(){return this[O].getObservablePropValue_(e)},set:function(t){return this[O].setObservablePropValue_(e,t)}})}function ea(e){return b(e)?Qi(e[O]):!1}function ta(e,t,n){var r;e.appliedAnnotations_[n]=t,(r=e.target_[Te])==null||delete r[n]}function na(e,t,r){if(Ca(t)||n(`Cannot annotate '`+e.name_+`.`+r.toString()+`': Invalid annotation.`),!Ke(t)&&se(e.appliedAnnotations_,r)){var i=e.name_+`.`+r.toString(),a=e.appliedAnnotations_[r].annotationType_,o=t.annotationType_;n(`Cannot apply '`+o+`' to '`+i+`':`+(`
|
|
86
86
|
The field is already annotated with '`+a+`'.`)+`
|
|
87
87
|
Re-annotating fields is not allowed.
|
|
88
|
-
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,O,e),t&&t.length&&a.spliceWithArray(0,0,t),ia&&Object.defineProperty(a,`0`,ra)}),a}ve(t,e);var n=t.prototype;return n.concat=function(){this[O].atom_.reportObserved();var e=[...arguments];return Array.prototype.concat.apply(this.slice(),e.map(function(e){return Li(e)?e.slice():e}))},n[Symbol.iterator]=function(){var e=this,t=0;return W({next:function(){return t<e.length?{value:e[t++],done:!1}:{done:!0,value:void 0}}})},me(t,[{key:`length`,get:function(){return this[O].getArrayLength_()},set:function(e){this[O].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[O].get_(e)},set:function(t){this[O].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(Li(e))return t!==void 0&&n(23),e[O].atom_;if(Ki(e))return e.atom_;if(Hi(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[O].values_.get(t);return i||n(27,t,ha(e)),i}if(Ne(e)||an(e)||z(e))return e}else if(v(e)&&z(e[O]))return e[O];n(28)}function ma(e,t){if(e||n(29),t!==void 0)return ma(pa(e,t));if(Ne(e)||an(e)||z(e)||Hi(e)||Ki(e))return e;if(e[O])return e[O];n(24,e)}function ha(e,t){var n;if(t!==void 0)n=pa(e,t);else if(cr(e))return e.name;else n=ea(e)||Hi(e)||Ki(e)?ma(e):pa(e);return n.name_}function ga(e){var t=N(),n=Qt(!0);L();try{return e()}finally{jn(),$t(n),P(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(!(se(t,m)&&ya(e[m],t[m],n-1,r,i)))return!1}}return r.pop(),i.pop(),!0}function ba(e){return Li(e)?e.slice():te(e)||Hi(e)||re(e)||Ki(e)?Array.from(e.entries()):e}var xa=i().Iterator?.prototype||{};function W(e){return e[Symbol.iterator]=Sa,Object.assign(Object.create(xa),e)}function Sa(){return this}function Ca(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:Jn,extras:{getDebugName:ha},$mobx:O}),e.$mobx=O,e.FlowCancellationError=kr,e.ObservableMap=Vi,e.ObservableSet=Gi,e.Reaction=Ln,e._allowStateChanges=Zt,e._allowStateChangesInsideComputed=sr,e._allowStateReadsEnd=vn,e._allowStateReadsStart=_n,e._autoAction=or,e._endAction=Xt,e._getAdministration=ma,e._getGlobalState=wn,e._interceptReads=Lr,e._isComputingDerivation=un,e._resetGlobalState=Tn,e._startAction=Yt,e.action=ar,e.autorun=lr,e.comparer=ze,e.computed=Ut,e.configure=xr,e.createAtom=Pe,e.defineProperty=ei,e.entries=Yr,e.extendObservable=Sr,e.flow=Nr,e.flowResult=Fr,e.get=$r,e.getAtom=pa,e.getDebugName=ha,e.getDependencyTree=Cr,e.getObserverTree=Tr,e.has=Qr,e.intercept=Rr,e.isAction=cr,e.isBoxedObservable=nn,e.isComputed=Hr,e.isComputedProp=Ur,e.isFlow=Ir,e.isFlowCancellationError=Ar,e.isObservable=Gr,e.isObservableArray=Li,e.isObservableMap=Hi,e.isObservableObject=ea,e.isObservableProp=Kr,e.isObservableSet=Ki,e.keys=qr,e.makeAutoObservable=Ti,e.makeObservable=Ci,e.observable=k,e.observe=ni,e.onBecomeObserved=gr,e.onBecomeUnobserved=_r,e.onReactionError=Rn,e.override=Ge,e.ownKeys=ti,e.reaction=fr,e.remove=Zr,e.runInAction=sr,e.set=Xr,e.spy=Jn,e.toJS=si,e.trace=ci,e.transaction=ui,e.untracked=gn,e.values=Jr,e.when=di})),Lx=ve(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=Fx():t.exports=Ix()}))();function Rx(e){if(Array.isArray(e))return Object.freeze(e.map(Rx));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]=Rx(r);return Object.freeze(t)}return e}function zx(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 Bx(e){return typeof e==`string`?e:String(e)}function Vx(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 Hx(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 Ux(e,t){if(!(e instanceof W))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=ki(e.style,t),n}function Wx(e){return{fn:(t=>Ux(t,e)),argTypes:[`liftable`],arity:{kind:`exact`},returnType:`T`}}function Gx(e){return{fn:((t,n)=>Ux(n,new H({[e]:L.parse(t)}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`}}function Kx(e,t){return new H({[e]:t})}function qx(){let e={};for(let t of Si)e[t]=Wx(Kx(t,!0)),e[`not_${t}`]=Wx(Kx(t,!1));for(let[t,n]of Object.entries(wi))e[t]=Wx(Kx(n,!0));return e}const Jx={fn:((e,t)=>Ux(t,H.parse(e))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`},Yx={fn:((e,t)=>Ux(t,new H({link:e}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`};function Xx(){return{fg:Gx(`color`),bg:Gx(`bgcolor`),...qx(),link:Yx,style:Jx}}function Zx(e,t){let n;try{n=Un(e.trim())}catch(n){throw n instanceof kn?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)}) …`,{cause:n}):n}return Qx(n,t,JSON.stringify(e))}function Qx(e,t,n){if(e.alpha===0)throw RangeError(`${t} got ${n}, which is fully transparent: it draws no colour of its own, so there is nothing to compute with — use the colour of the surface it sits on, e.g. (color "background")`);return e}function $x(e,t){return{fn:t,argTypes:e,arity:{kind:`exact`},returnType:`string`}}function eS(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 tS=$x([`string`,`int`],((e,t)=>Tr(Zx(e,`darken`),t).hex)),nS=$x([`string`,`int`],((e,t)=>Tr(Zx(e,`lighten`),-t).hex)),rS={min:0,max:100,note:`0 = from, 100 = toward`},iS=$x([`string`,`string`,`float`],((e,t,n)=>B(Zx(e,`mix`),Zx(t,`mix`),eS(n,`mix`,`percentage`,rS)/100).hex)),aS={min:1,max:21,note:`4.5 = AA body text, 3 = AA large text`},oS=$x([`string`],(e=>Dr(Zx(e,`contrastOn`)).hex)),sS={depth:F.TRUECOLOR},cS=e=>$x([`string`,`string`,`float`],((t,n,r)=>{let{depth:i,terminal:a}=e();return Or(Zx(t,`readableOn`),Zx(n,`readableOn`),eS(r,`readableOn`,`ratio`,aS),i,void 0,a).hex})),lS={hueShift:`shiftHue`,chromaScale:`scaleChroma`,lightnessScale:`scaleLightness`,lightnessShift:`shiftLightness`};function uS(){let e={};for(let[t,n]of Object.entries(lS)){let r=t;e[n]=$x([`string`,`float`],((e,t)=>{let i={...sr,[r]:eS(t,n,`amount`)};return V.fromRgba(Zx(e,n)).applyKey(i).toRgba().hex}))}return e}function dS(e=()=>sS){return{darken:tS,lighten:nS,mix:iS,contrastOn:oS,readableOn:cS(e),...uS()}}function fS(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:Qx(yr(t,e[r+1]),`ramp`,JSON.stringify(e[r+1]))});return n}function pS(e){return{color:{fn:(t=>yr(e(),t).hex),argTypes:[`string`],arity:{kind:`exact`},returnType:`string`},ramp:{fn:((t,n,...r)=>new di(_i(n),fS(r,e())).at(t).hex),argTypes:[`float`,`string`],arity:{kind:`alternating`,minimum:4},returnType:`string`}}}function mS(e){return{...Xx(),...dS(e)}}new H({color:`red`,dim:!0});const hS=/^(?:(?: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,gS=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function _S(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(hS);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(gS);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 vS(e){let t=e.match(gS);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 yS(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 bS(e){return e.toLocaleString()}function xS(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 SS(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 CS=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],wS=CS.length;function TS(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*(wS-1));o+=CS[t]}return o}function ES(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 DS(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 OS=jc(),kS=[...Xc];function AS(){return{basename:{fn:e=>u(e),argTypes:[`string`],arity:{kind:`exact`}},dirname:{fn:e=>d(e),argTypes:[`string`],arity:{kind:`exact`}},abbreviatePath:{fn:e=>yS(e),argTypes:[`string`],arity:{kind:`exact`}},int:{fn:e=>Math.trunc(Vx(e)),argTypes:[`value`],arity:{kind:`exact`}},string:{fn:e=>Bx(e),argTypes:[`value`],arity:{kind:`exact`}},bool:{fn:e=>Hx(e),argTypes:[`value`],arity:{kind:`exact`}},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`],arity:{kind:`exact`}},themes:{fn:()=>OS,argTypes:[],arity:{kind:`exact`}},endcaps:{fn:()=>kS,argTypes:[],arity:{kind:`exact`}},sparkline:{fn:(e,t,...n)=>(DS(`sparkline`,[`width`],n),TS(ES(e),t)),argTypes:[`string`,`int`],arity:{kind:`variadic`}},cascade:{fn:(e,...t)=>SS(e,xS(t)),argTypes:[`float`,`string`],arity:{kind:`variadic`}}}}function jS(e){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`],arity:{kind:`exact`}},formatInteger:{fn:e=>bS(e),argTypes:[`int`],arity:{kind:`exact`}},round:{fn:e=>Math.round(e),argTypes:[`float`],arity:{kind:`exact`}},formatModelName:{fn:e=>_S(e),argTypes:[`string`],arity:{kind:`exact`}},shortenModelName:{fn:e=>vS(e),argTypes:[`string`],arity:{kind:`exact`}}}}function MS(e){let{clock:t,drawnAt:n,extraFuncs:r}=e;return vg({fromString:e=>new W(e),toString:e=>e.plain,isT:e=>e instanceof W,clock:t,missingKey:`error`,funcs:{...sv(),...xb(),...Yv(),..._y(),...$_(t),...Ug(),...Cv(),...xv(),...mS(n&&(()=>({depth:n()}))),...AS(),...jS(t),...r??{}}})}function NS(e){return PS(e,new Set(e.names()),``)}function PS(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`?IS(a,e.readDocument(a)):e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return PS(e,t,a)}})}function FS(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 IS(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 LS(e,t){return e?.kind===`ok`?e.value:t}function RS(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??zS(t.stderr)].filter(Boolean).join(`, `)}`)}function zS(e){return e.trim().split(`
|
|
89
|
-
`,1)[0]??``}function
|
|
90
|
-
`)){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
|
|
91
|
-
`)){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
|
|
92
|
-
`).length:0)}async getRemotesAsync(e){let t=aC(l.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=RS(`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`?KS(t.value):[])}repoNameFrom(e,t){let n=YS(e);return(n===null?null:ZS(n))??l.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=XS(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return je({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=GS(t);return n===`github`?eC(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,rC):n===`gitlab`?eC(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,iC):Y}isWorktree(e){try{let t=l.join(e,`.git`);return!!(r.existsSync(t)&&r.statSync(t).isFile())}catch{return!1}}async getCoreAsync(e){D(`[GIT-EXEC] Running git status --porcelain=v2 in ${e}`);let t=RS(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(nC(t.value)):t}};let sC=null;function cC(e){if(sC!==null)return sC;r.mkdirSync(l.dirname(e),{recursive:!0});try{sC=r.statSync(e).size}catch{sC=0}return sC}function lC(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{}sC=0}const uC=(e,t)=>D(t);function Z(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=Qe(),t=cC(e);r.appendFileSync(e,n),sC=t+Buffer.byteLength(n,`utf8`),sC>=5242880&&lC(e)}catch(e){sC=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}const dC=(e,t)=>D(t);var fC=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??dC}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()}},pC=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 mC={showSha:!0,showStashCount:!0};function hC(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function gC(e){let t=t=>{try{return r.statSync(l.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function _C(e,t){return e.head!==t.head||e.index!==t.index}function vC(e){let t=[],n=l.join(e,`refs/heads`);try{r.statSync(n).isDirectory()&&t.push({path:n})}catch{}return{files:[l.join(e,`HEAD`),l.join(e,`index`)],dirs:t}}var yC=class extends oC{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new pC;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new oC,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??uC,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new fC({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}|${hC(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=gC(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}`,vC(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}`,vC(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,{...mC});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,{...mC}),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=gC(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),_C(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 bC=/\r\n|\r|\n/g,xC=e=>J(e.replace(bC,` `).trim());function SC(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(bC,` `))}}const CC=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}},wC=e=>e.getTime()/1e3,TC=e=>new Date(e*1e3);function EC(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(D(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function DC(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 OC=`session.id`;function kC(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await je({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 AC(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await C(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 jC(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 MC=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],NC=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],PC=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],FC=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function IC(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>MC[e.getMonth()]],[`Monday`,e=>PC[e.getDay()]],[`Jan`,e=>NC[e.getMonth()]],[`Mon`,e=>FC[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 LC={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function RC(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=LC[t];try{return KC(r,e)}catch{return qC(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return LS(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return LS(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return LS(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return LS(e.stashCount,0)}}function zC(e){try{return o(e)}catch{return e}}function BC(e){try{return s(e).isDirectory()}catch{return!1}}function VC(e){let t=zC(e);return BC(t)?{dir:t,name:null,leaf:!0}:Nx(t)}const HC=e=>`${e.dir}\0${e.name??``}`;var UC=class{watchers=new Map;subscribe(e,t,n){let r=this.watchers.get(e)??this.arm(e);return r.subscribers.set(t,n),r.watcher===null&&n(r.failure),()=>this.unsubscribe(e,t)}arm(e){let t={watcher:null,failure:``,target:VC(e),subscribers:new Map};return t.watcher=this.open(e,t,t.target),this.watchers.set(e,t),t}rearm(e,t){let n=VC(e);if(t.watcher!==null&&HC(n)===HC(t.target))return;let r=this.open(e,t,n);r!==null&&(t.watcher?.close(),t.watcher=r,t.target=n)}open(e,t,n){let{dir:r,name:i}=n,a=l.basename(r);try{return c(r,(n,r)=>{if(!(r===null||i===null||r===i)&&r!==a)return;let o=t.target.leaf;if(this.rearm(e,t),!(!o&&!t.target.leaf))for(let e of t.subscribers.keys())e()})}catch(n){let i=`watch_file ${e}: cannot watch ${r} — ${n instanceof Error?n.message:String(n)}`;t.failure=i;for(let e of t.subscribers.values())e(i);return null}}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.subscribers.delete(t),n.subscribers.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}},WC=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:ne(()=>{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&&(te(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())te(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function GC(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function KC(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`?Bx(e):t===`number`?Vx(e):Hx(e)}function qC(e){return e===`number`?0:e===`boolean`?!1:``}var JC=class{inputMetas=new Map;lastErrors=new Map;watchFaults=new Map;watchMgr=new UC;ttlMgr=new WC;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new pC;abort=new AbortController;drawn=Lx.observable.box(F.TRUECOLOR);drawnAt=()=>this.drawn.get();instant=Lx.observable.box(null);now=()=>{let e=this.instant.get();if(e===null)throw Error(`the time was read before any render published its instant`);return TC(e)};engine=MS({clock:this.now,drawnAt: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 yC({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,zx(t),t)}declareFailedDocument(e,t){this.store.defineDocument(e,X(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,kC(t,n.cwd,this.abort.signal),EC(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,AC(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,xC,t.default,n);case`regex`:return this.scalarPublisher(e,SC(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=jC(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,LS(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);this.store.defineDocument(e,r);let i,a=!1;return this.cleanups.push(()=>clearTimeout(i)),o=>{clearTimeout(i);let s=o.kind===`ok`&&o.value.trim()===``?Y:o,c=jC(s,CC,n);this.noteOutcome(e,c);let l=c.kind===`ok`||s.kind===`ok`||t===void 0?c:r,u=a&&s.kind===`ok`&&c.kind!==`ok`,d=()=>{a=c.kind===`ok`,this.store.setDocument(e,l)};u?i=setTimeout(d,250):d()}}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.declareDerived(e,()=>r.evaluate(NS(this.store)).map(e=>e.plain).join(``),n.varDefault)}declareTime(e,t){this.declareDerived(e,()=>IC(t.format,this.now()),t.varDefault)}declareDerived(e,t,n){this.store.defineComputed(e,`string`,()=>{try{let n=t();return this.lastErrors.delete(e),n}catch(t){let r=t instanceof Error?t.message:String(t);if(this.recordError(e,r),n===void 0)throw Error(`variable "${e}": ${r}`);return n}})}declareGit(e,t){let n=LC[t.field],r=t.varDefault===void 0?qC(n):KC(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,RC(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(OC);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}stateRevision(){let e=this.store.has(`session.id`)?this.store.read(OC):``;return this.sessionState!==void 0&&typeof e==`string`&&e!==``?this.sessionState.revision(e):0}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=GC(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,KC(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))}renderAt(e){this.store.runInAction(()=>this.instant.set(e))}getLastError(e){let t=this.lastErrors.get(e),n=this.watchFaults.get(e);return n===void 0?t:t===void 0?n:{timestamp:t.timestamp,message:`${n.message}; ${t.message}`}}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 r=this.watchMgr.subscribe(t.path,n,t=>this.watchFaults.set(e,{timestamp:Date.now(),message:t}));this.cleanups.push(r);break}case`key`:{let e=this.engine.parse(t.template),r=(0,Lx.reaction)(()=>{let t=NS(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,Lx.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,KC(this.defaultEmptyValue,t))}catch{this.store.setBox(e,qC(t))}}defaultFor(e){try{return KC(this.defaultEmptyValue,e)}catch{return qC(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 YC={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[OC]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},resume_command:{kind:`input`,path:`resumeCommand`,default:``},config_path:{kind:`input`,path:`configPath`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"effect.effective":{kind:`input`,path:`effect.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:``},"shade.effective":{kind:`input`,path:`shade.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"transitions.effective":{kind:`input`,path:`transitions.effective`,type:`boolean`,default:!1},"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},"tmux.pane":{kind:`input`,path:`tmux.pane`,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:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},XC=`ne .tmux.pane ""`,ZC={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:`◐`},effect:{configKey:`effect`,sessionKey:`effect`,effectiveVar:`effect.effective`,label:`✨`},endcaps:{configKey:`endcaps`,sessionKey:`endcaps`,effectiveVar:`endcaps.effective`,label:`✦`},variation:{configKey:`variation`,sessionKey:`variation`,effectiveVar:`variation.effective`,label:`🎼`},shade:{configKey:`shade`,sessionKey:`shade`,effectiveVar:`shade.effective`,label:`🔆`},transitions:{configKey:`transitions`,sessionKey:`transitions`,effectiveVar:`transitions.effective`,label:`fade in/out`},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`}},QC=Object.values(ZC),$C=[{configKey:`charset`,effectiveVar:`charset.effective`},{configKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`}],ew=new Set($C.map(e=>e.configKey)),tw=new Map([...QC,...$C].map(e=>[e.configKey,e.effectiveVar])),nw=new Map(QC.map(e=>[e.sessionKey,e.effectiveVar]));function rw(e){return Object.fromEntries(Object.keys(ZC).map(t=>[t,e(t)]))}const iw=new Map(Object.keys(ZC).map(e=>[ZC[e].sessionKey,e]));function aw(e,t,n){let r=new Set,i=e=>{for(let t of Cx(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 wu(e))i(t.when),t.kind===`segment`&&(i(t.lead),i(t.trail));for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(OC);for(let t of Object.values(e.actions)){r.add(OC),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?nw.get(t.set):void 0,n=`persist`in t?tw.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function ow(e,t,n){let r=jx({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of aw(e,t,n.helpers)){if(Ax(a,r))continue;let e=YC[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 sw=new Map;function cw(e){let t=uw(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 lw(e,t){return e===`bar`?t:cw(e)}function uw(e){let t=sw.get(e);if(t!==void 0)return t;let n=Qr(e);return n===null?null:(sw.set(e,n),n)}function dw(e,t){return fw(e,`${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,()=>ui(e,t))}const fw=vs();function pw(e){let t=uw(e);return t===null?null:{kind:`decided`,name:e,value:t}}function mw(e,t,n){let r=pw(e);return r===null?(n(`${t} rendered "${kc}": "${e}" names no installed theme${Oc(e)}`),gw()):r}function hw(e,t,n){return Rc(e,t,n,gw(),pw)}function gw(){return{kind:`decided`,name:kc,value:cw(kc)}}const _w=new Map;function vw(e,t,n){_w.set(e,{permanent:!0,resolve:t,paletteOf:n})}vw(`themes`,()=>jc(),e=>cw(e));const yw=`placementThemes`;vw(yw,Mc,(e,t)=>lw(e,t.palette)),vw(`endcaps`,()=>Xc),vw(`variations`,()=>ol),vw(`shades`,()=>ll),vw(`charsets`,()=>tl),vw(`colorCompatibilities`,()=>il);function bw(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>dw(n.basePalette,e.styles[t])}],[`presets`,{members:Nb(e.presets)}]])}function xw(e){return[...new Set([..._w.keys(),...e.keys()])]}function Sw(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=_w.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(ww(e,t))}const Cw=new Map([[`looks`,`styles`],[`progressions`,`variations`]]);function ww(e,t){let n=Cw.get(e);return`unknown option domain "${e}"${n===void 0?``:` — it was renamed "${n}"; write from: "${n}"`} (have: ${xw(t).join(`, `)})`}function Tw(e,t,n){return e===`bool`?gl(t)!==null:`from`in e?Sw(e.from,n).members.includes(t):_l(t,e)!==null}function Ew(e,t){if(e===`bool`)return ml.join(` or `);if(`from`in e){let{members:n}=Sw(e.from,t),r=n.map(e=>JSON.stringify(e));if(n.length<=8)return`one of ${r.join(`, `)}`;let i=typeof e.from==`string`?` "${e.from}"`:``;return`one of the ${n.length}${i} names, such as ${r.slice(0,3).join(`, `)}`}return`an integer from ${e.min} to ${e.max}`}function Dw(e){return{label:e.label,domain:Ow(e.domain)}}function Ow(e){return e===`theme`?{from:yw}:e===`bool`||`min`in e?e:{from:e}}function kw(e,t,n,r,i){let a=Wd(e.label),{domain:o}=e;if(o===`bool`)return{kind:`inline`,template:`{{ action "${r}" "☑ ${a}" "☐ ${a}" }}`,actions:{[r]:{set:t,cycle:[...ml]}},variables:{}};if(`from`in o)return Aw(a,t,r,i,o.from);let s=e=>({set:t,min:o.min,max:o.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "◀" }} {{ "${a}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`,actions:{[`${r}.down`]:s(-o.step),[`${r}.up`]:s(o.step)},variables:{}}}function Aw(e,t,n,r,i){let a={variable:r,key:r,member:n},o=Tb(r,n),s=`${n}.open`,c=Eb(r),l=`${c}.first`;return{kind:`picker`,template:`{{ "${e}" }} {{ carousel "${n}" 0 "${s}" }}`,actions:{[n]:{set:t,from:i},[o]:Qd(r,n),[c]:{set:c,int:!0},[l]:{set:c,to:`0`},[s]:{do:[o,l]}},variables:{[r]:Zd(r,Bd),[c]:{kind:`state`,key:c,default:`0`}},list:{ref:a,template:`{{ picker "${n}" "${c}" false true true }}`}}}const jw=/^segments\.([^.]+)\.palette$/,Mw=/^presets\.(.+)\.root$/,Nw=/^presets\.(.+)\.globals\.([^.]+)$/,Pw=/^themeDefaults\.(.+)\.([^.]+)$/;function Fw(e){return`presets.${e}.root`}function Iw(e,t){return`themeDefaults.${e}.${t}`}const Lw=e=>ku.includes(e);function Rw(e,t){return`presets.${e}.globals.${t}`}function zw(e){if(jf(e))return{scope:`globals`,field:e};let t=jw.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=Nw.exec(e);if(n&&xf(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Pw.exec(e);if(r&&Lw(r[2]))return{scope:`theme-default`,theme:r[1],field:r[2]};let i=Mw.exec(e);return i?{scope:`preset-root`,preset:i[1]}:null}function Bw(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`];case`theme-default`:return[`themeDefaults`,e.theme,e.field]}}const Vw=`open`;function Hw(e,t,n,r){let i={variable:e,key:e,member:Vw};return r.variables[e]=Zd(e,Bd),r.actions[e]=Qd(e,Vw),r.segments[e]={template:Jd(e,`(?)`,`✕`),...Uw(n)},Gd(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 Uw(e){let[t,...n]=e;return t===void 0?{}:{when:Kd(t,...n)}}const Ww=`none`;function Gw(e){return yr(e,`background`)}var Kw=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function qw(e,t,n,r,i){let{palette:a,tint:o,text:s}=e,c=Jw(n,i),l=c!==Ww,u=l?c===void 0?o:Yw(a,c,`bg`):Gw(a);e.bg=u;let d=Jw(r,i),f=d===void 0?l?(e=>e.hex===o.hex?s:nc(a,e,t))(u):void 0:Yw(a,d,`fg`);return new H({...l&&{bgcolor:L.fromRgba(u)},...f!==void 0&&{color:L.fromRgba(f)}})}function Jw(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Yw(e,t,n){try{return yr(e,t)}catch(e){throw e instanceof vr?new Kw(t,n,e.message):e}}const Xw={help:[`-h`,`--help`],version:[`-V`,`--version`]},Zw=[`✚ inserts`,`✖ removes`,`⚙️ configures`,`↺ resets layout`],Qw=`
|
|
88
|
+
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,O,e),t&&t.length&&a.spliceWithArray(0,0,t),ia&&Object.defineProperty(a,`0`,ra)}),a}ve(t,e);var n=t.prototype;return n.concat=function(){this[O].atom_.reportObserved();var e=[...arguments];return Array.prototype.concat.apply(this.slice(),e.map(function(e){return Li(e)?e.slice():e}))},n[Symbol.iterator]=function(){var e=this,t=0;return W({next:function(){return t<e.length?{value:e[t++],done:!1}:{done:!0,value:void 0}}})},me(t,[{key:`length`,get:function(){return this[O].getArrayLength_()},set:function(e){this[O].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[O].get_(e)},set:function(t){this[O].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(Li(e))return t!==void 0&&n(23),e[O].atom_;if(Ki(e))return e.atom_;if(Hi(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[O].values_.get(t);return i||n(27,t,ha(e)),i}if(Ne(e)||an(e)||z(e))return e}else if(v(e)&&z(e[O]))return e[O];n(28)}function ma(e,t){if(e||n(29),t!==void 0)return ma(pa(e,t));if(Ne(e)||an(e)||z(e)||Hi(e)||Ki(e))return e;if(e[O])return e[O];n(24,e)}function ha(e,t){var n;if(t!==void 0)n=pa(e,t);else if(cr(e))return e.name;else n=ea(e)||Hi(e)||Ki(e)?ma(e):pa(e);return n.name_}function ga(e){var t=N(),n=Qt(!0);L();try{return e()}finally{jn(),$t(n),P(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(!(se(t,m)&&ya(e[m],t[m],n-1,r,i)))return!1}}return r.pop(),i.pop(),!0}function ba(e){return Li(e)?e.slice():te(e)||Hi(e)||re(e)||Ki(e)?Array.from(e.entries()):e}var xa=i().Iterator?.prototype||{};function W(e){return e[Symbol.iterator]=Sa,Object.assign(Object.create(xa),e)}function Sa(){return this}function Ca(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:Jn,extras:{getDebugName:ha},$mobx:O}),e.$mobx=O,e.FlowCancellationError=kr,e.ObservableMap=Vi,e.ObservableSet=Gi,e.Reaction=Ln,e._allowStateChanges=Zt,e._allowStateChangesInsideComputed=sr,e._allowStateReadsEnd=vn,e._allowStateReadsStart=_n,e._autoAction=or,e._endAction=Xt,e._getAdministration=ma,e._getGlobalState=wn,e._interceptReads=Lr,e._isComputingDerivation=un,e._resetGlobalState=Tn,e._startAction=Yt,e.action=ar,e.autorun=lr,e.comparer=ze,e.computed=Ut,e.configure=xr,e.createAtom=Pe,e.defineProperty=ei,e.entries=Yr,e.extendObservable=Sr,e.flow=Nr,e.flowResult=Fr,e.get=$r,e.getAtom=pa,e.getDebugName=ha,e.getDependencyTree=Cr,e.getObserverTree=Tr,e.has=Qr,e.intercept=Rr,e.isAction=cr,e.isBoxedObservable=nn,e.isComputed=Hr,e.isComputedProp=Ur,e.isFlow=Ir,e.isFlowCancellationError=Ar,e.isObservable=Gr,e.isObservableArray=Li,e.isObservableMap=Hi,e.isObservableObject=ea,e.isObservableProp=Kr,e.isObservableSet=Ki,e.keys=qr,e.makeAutoObservable=Ti,e.makeObservable=Ci,e.observable=k,e.observe=ni,e.onBecomeObserved=gr,e.onBecomeUnobserved=_r,e.onReactionError=Rn,e.override=Ge,e.ownKeys=ti,e.reaction=fr,e.remove=Zr,e.runInAction=sr,e.set=Xr,e.spy=Jn,e.toJS=si,e.trace=ci,e.transaction=ui,e.untracked=gn,e.values=Jr,e.when=di})),Lx=ve(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=Fx():t.exports=Ix()}))();function Rx(e){if(Array.isArray(e))return Object.freeze(e.map(Rx));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]=Rx(r);return Object.freeze(t)}return e}function zx(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 Bx(e){return typeof e==`string`?e:String(e)}function Vx(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 Hx(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 Ux(e,t){if(!(e instanceof W))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=ki(e.style,t),n}function Wx(e){return{fn:(t=>Ux(t,e)),argTypes:[`liftable`],arity:{kind:`exact`},returnType:`T`}}function Gx(e){return{fn:((t,n)=>Ux(n,new H({[e]:L.parse(t)}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`}}function Kx(e,t){return new H({[e]:t})}function qx(){let e={};for(let t of Si)e[t]=Wx(Kx(t,!0)),e[`not_${t}`]=Wx(Kx(t,!1));for(let[t,n]of Object.entries(wi))e[t]=Wx(Kx(n,!0));return e}const Jx={fn:((e,t)=>Ux(t,H.parse(e))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`},Yx={fn:((e,t)=>Ux(t,new H({link:e}))),argTypes:[`string`,`liftable`],arity:{kind:`exact`},returnType:`T`};function Xx(){return{fg:Gx(`color`),bg:Gx(`bgcolor`),...qx(),link:Yx,style:Jx}}function Zx(e,t){let n;try{n=Un(e.trim())}catch(n){throw n instanceof kn?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)}) …`,{cause:n}):n}return Qx(n,t,JSON.stringify(e))}function Qx(e,t,n){if(e.alpha===0)throw RangeError(`${t} got ${n}, which is fully transparent: it draws no colour of its own, so there is nothing to compute with — use the colour of the surface it sits on, e.g. (color "background")`);return e}function $x(e,t){return{fn:t,argTypes:e,arity:{kind:`exact`},returnType:`string`}}function eS(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 tS=$x([`string`,`int`],((e,t)=>Tr(Zx(e,`darken`),t).hex)),nS=$x([`string`,`int`],((e,t)=>Tr(Zx(e,`lighten`),-t).hex)),rS={min:0,max:100,note:`0 = from, 100 = toward`},iS=$x([`string`,`string`,`float`],((e,t,n)=>B(Zx(e,`mix`),Zx(t,`mix`),eS(n,`mix`,`percentage`,rS)/100).hex)),aS={min:1,max:21,note:`4.5 = AA body text, 3 = AA large text`},oS=$x([`string`],(e=>Dr(Zx(e,`contrastOn`)).hex)),sS={depth:F.TRUECOLOR},cS=e=>$x([`string`,`string`,`float`],((t,n,r)=>{let{depth:i,terminal:a}=e();return Or(Zx(t,`readableOn`),Zx(n,`readableOn`),eS(r,`readableOn`,`ratio`,aS),i,void 0,a).hex})),lS={hueShift:`shiftHue`,chromaScale:`scaleChroma`,lightnessScale:`scaleLightness`,lightnessShift:`shiftLightness`};function uS(){let e={};for(let[t,n]of Object.entries(lS)){let r=t;e[n]=$x([`string`,`float`],((e,t)=>{let i={...sr,[r]:eS(t,n,`amount`)};return V.fromRgba(Zx(e,n)).applyKey(i).toRgba().hex}))}return e}function dS(e=()=>sS){return{darken:tS,lighten:nS,mix:iS,contrastOn:oS,readableOn:cS(e),...uS()}}function fS(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:Qx(yr(t,e[r+1]),`ramp`,JSON.stringify(e[r+1]))});return n}function pS(e){return{color:{fn:(t=>yr(e(),t).hex),argTypes:[`string`],arity:{kind:`exact`},returnType:`string`},ramp:{fn:((t,n,...r)=>new di(_i(n),fS(r,e())).at(t).hex),argTypes:[`float`,`string`],arity:{kind:`alternating`,minimum:4},returnType:`string`}}}function mS(e){return{...Xx(),...dS(e)}}new H({color:`red`,dim:!0});const hS=/^(?:(?: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,gS=/^(?<family>opus|sonnet|haiku)\s+(?<major>\d+)(?:\.(?<minor>\d))?$/i;function _S(e){if(!e)return`Claude`;let t=e.trim().replace(/\s*\([^)]*\)\s*$/,``).replace(/\s*\[[^\]]*\]\s*$/,``).trim(),n=t.match(hS);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(gS);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 vS(e){let t=e.match(gS);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 yS(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 bS(e){return e.toLocaleString()}function xS(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 SS(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 CS=[`▁`,`▂`,`▃`,`▄`,`▅`,`▆`,`▇`,`█`],wS=CS.length;function TS(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*(wS-1));o+=CS[t]}return o}function ES(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 DS(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 OS=jc(),kS=[...Xc];function AS(){return{basename:{fn:e=>u(e),argTypes:[`string`],arity:{kind:`exact`}},dirname:{fn:e=>d(e),argTypes:[`string`],arity:{kind:`exact`}},abbreviatePath:{fn:e=>yS(e),argTypes:[`string`],arity:{kind:`exact`}},int:{fn:e=>Math.trunc(Vx(e)),argTypes:[`value`],arity:{kind:`exact`}},string:{fn:e=>Bx(e),argTypes:[`value`],arity:{kind:`exact`}},bool:{fn:e=>Hx(e),argTypes:[`value`],arity:{kind:`exact`}},urlEncode:{fn:e=>encodeURIComponent(e),argTypes:[`string`],arity:{kind:`exact`}},themes:{fn:()=>OS,argTypes:[],arity:{kind:`exact`}},endcaps:{fn:()=>kS,argTypes:[],arity:{kind:`exact`}},sparkline:{fn:(e,t,...n)=>(DS(`sparkline`,[`width`],n),TS(ES(e),t)),argTypes:[`string`,`int`],arity:{kind:`variadic`}},cascade:{fn:(e,...t)=>SS(e,xS(t)),argTypes:[`float`,`string`],arity:{kind:`variadic`}}}}function jS(e){return{minutesUntilReset:{fn:t=>Math.round(Math.max(0,t*1e3-e().getTime())/6e4),argTypes:[`int`],arity:{kind:`exact`}},formatInteger:{fn:e=>bS(e),argTypes:[`int`],arity:{kind:`exact`}},round:{fn:e=>Math.round(e),argTypes:[`float`],arity:{kind:`exact`}},formatModelName:{fn:e=>_S(e),argTypes:[`string`],arity:{kind:`exact`}},shortenModelName:{fn:e=>vS(e),argTypes:[`string`],arity:{kind:`exact`}}}}function MS(e){let{clock:t,drawnAt:n,extraFuncs:r}=e;return vg({fromString:e=>new W(e),toString:e=>e.plain,isT:e=>e instanceof W,clock:t,missingKey:`error`,funcs:{...sv(),...xb(),...Yv(),..._y(),...$_(t),...Ug(),...Cv(),...xv(),...mS(n&&(()=>({depth:n()}))),...AS(),...jS(t),...r??{}}})}function NS(e){return PS(e,new Set(e.names()),``)}function PS(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`?IS(a,e.readDocument(a)):e.read(a);let o=`${a}.`;for(let n of t)if(n.startsWith(o))return PS(e,t,a)}})}function FS(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 IS(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 LS(e,t){return e?.kind===`ok`?e.value:t}function RS(e){return r.existsSync(l.join(e,`.git`))}function zS(e){let t=l.resolve(e);for(;;){if(RS(t))return t;let e=l.dirname(t);if(e===t)return;t=e}}function BS(e){let t=zS(e);return t===void 0?{root:l.resolve(e),git:!1}:{root:t,git:!0}}function VS(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??HS(t.stderr)].filter(Boolean).join(`, `)}`)}function HS(e){return e.trim().split(`
|
|
89
|
+
`,1)[0]??``}function US(e,t){if(e.kind!==`ok`)return e;let n=t(e.value);return n===null?Y:J(n)}function WS(e){if(e.kind!==`ok`)return e;let t=e.value.trim();return t?J(t):Y}const GS=/^[A-Za-z]:[\\/]/;function KS(e){let t=e.trim();if(GS.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 qS(e){return KS(e)?.host||null}function JS(e){let t=qS(e);return t?t===`github.com`||t.endsWith(`.github.com`)?`github`:/(^|\.)gitlab\./.test(t)?`gitlab`:null:null}function YS(e){let t=new Map;for(let n of e.split(`
|
|
90
|
+
`)){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 XS(e){return e.urls.find(e=>tC(e)!==null)??e.urls[0]??null}function ZS(e){return e.find(e=>e.name===`origin`)??e[0]??null}function QS(e){let t=ZS(e);return t?XS(t):null}function $S(e){let t=ZS(e);return t?t.urls.find(e=>JS(e)!==null)??XS(t):null}function eC(e){let t=(KS(e)?.path??e.replace(/[\\/]+$/,``)).split(`/`);return(t[t.length-1]??``).replace(/\.git$/,``)||null}function tC(e){let t=KS(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 nC(e){let t=QS(e);return t===null?null:tC(t)}function rC(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??HS(t.stderr)].filter(Boolean).join(`, `)}`)}function iC(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function aC(e){let t=`detached`,n=Y,r=Y,i=Y,a=0,o=0,s=0,c=0;for(let l of e.split(`
|
|
91
|
+
`)){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 oC(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(!iC(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 sC(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(!iC(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 cC(e){try{let t=r.statSync(e);return{key:`${t.dev}:${t.ino}`,stamp:`${t.mtimeMs}:${t.size}`}}catch{return null}}var lC=class{isGitRepo(e){return RS(e)}async execGitAsync(e,t){return je({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=zS(e);return t===void 0?Y:J(t)}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=US(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.committedAt=await this.committedAt(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=US(s,e=>this.repoNameFrom(e,r)),o.isWorktree=i),s!==void 0&&t.showRepoUrl&&(o.repoUrl=US(s,nC)),t.showOperation&&(o.operation=this.getOngoingOperation(r)),J(o)}resolveGitDir(e){let t=l.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 l.resolve(e,n[1].trim())}}catch{}return t}getOngoingOperation(e){try{let t=this.resolveGitDir(e);return r.existsSync(l.join(t,`MERGE_HEAD`))?J(`MERGE`):r.existsSync(l.join(t,`CHERRY_PICK_HEAD`))?J(`CHERRY-PICK`):r.existsSync(l.join(t,`REVERT_HEAD`))?J(`REVERT`):r.existsSync(l.join(t,`BISECT_LOG`))?J(`BISECT`):r.existsSync(l.join(t,`rebase-merge`))||r.existsSync(l.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 WS(VS(`git describe --tags`,await this.execGitAsync([`describe`,`--tags`,`--abbrev=0`],{cwd:e,timeout:2e3}),`absent`))}async committedAt(e,t){return t.kind===`ok`?this.commitTimestampMs(e,t.value):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=WS(VS(`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(l.join(t,`commondir`),`utf-8`).trim();if(e)return l.resolve(t,e)}catch{}return t}getStashCount(e){let t=l.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(`
|
|
92
|
+
`).length:0)}async getRemotesAsync(e){let t=cC(l.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=VS(`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`?YS(t.value):[])}repoNameFrom(e,t){let n=QS(e);return(n===null?null:eC(n))??l.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=$S(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return je({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=JS(t);return n===`github`?rC(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,oC):n===`gitlab`?rC(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,sC):Y}isWorktree(e){try{let t=l.join(e,`.git`);return!!(r.existsSync(t)&&r.statSync(t).isFile())}catch{return!1}}async getCoreAsync(e){D(`[GIT-EXEC] Running git status --porcelain=v2 in ${e}`);let t=VS(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(aC(t.value)):t}};let uC=null;function dC(e){if(uC!==null)return uC;r.mkdirSync(l.dirname(e),{recursive:!0});try{uC=r.statSync(e).size}catch{uC=0}return uC}function fC(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{}uC=0}const pC=(e,t)=>D(t);function Z(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=Qe(),t=dC(e);r.appendFileSync(e,n),uC=t+Buffer.byteLength(n,`utf8`),uC>=5242880&&fC(e)}catch(e){uC=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}const mC=(e,t)=>D(t);var hC=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??mC}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()}},gC=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 _C={showSha:!0,showStashCount:!0};function vC(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function yC(e){let t=t=>{try{return r.statSync(l.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function bC(e,t){return e.head!==t.head||e.index!==t.index}function xC(e){let t=[],n=l.join(e,`refs/heads`);try{r.statSync(n).isDirectory()&&t.push({path:n})}catch{}return{files:[l.join(e,`HEAD`),l.join(e,`index`)],dirs:t}}var SC=class extends lC{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new gC;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new lC,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??pC,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new hC({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}|${vC(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=yC(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}`,xC(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}`,xC(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,{..._C});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,{..._C}),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=yC(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),bC(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 CC=/\r\n|\r|\n/g,wC=e=>J(e.replace(CC,` `).trim());function TC(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(CC,` `))}}const EC=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}},DC=e=>e.getTime()/1e3,OC=e=>new Date(e*1e3);function kC(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(D(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function AC(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 jC=`session.id`;function MC(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await je({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 NC(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await C(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 PC(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 FC=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],IC=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],LC=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],RC=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function zC(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>FC[e.getMonth()]],[`Monday`,e=>LC[e.getDay()]],[`Jan`,e=>IC[e.getMonth()]],[`Mon`,e=>RC[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 BC={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function VC(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=BC[t];try{return YC(r,e)}catch{return XC(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return LS(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return LS(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return LS(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return LS(e.stashCount,0)}}function HC(e){try{return o(e)}catch{return e}}function UC(e){try{return s(e).isDirectory()}catch{return!1}}function WC(e){let t=HC(e);return UC(t)?{dir:t,name:null,leaf:!0}:Nx(t)}const GC=e=>`${e.dir}\0${e.name??``}`;var KC=class{watchers=new Map;subscribe(e,t,n){let r=this.watchers.get(e)??this.arm(e);return r.subscribers.set(t,n),r.watcher===null&&n(r.failure),()=>this.unsubscribe(e,t)}arm(e){let t={watcher:null,failure:``,target:WC(e),subscribers:new Map};return t.watcher=this.open(e,t,t.target),this.watchers.set(e,t),t}rearm(e,t){let n=WC(e);if(t.watcher!==null&&GC(n)===GC(t.target))return;let r=this.open(e,t,n);r!==null&&(t.watcher?.close(),t.watcher=r,t.target=n)}open(e,t,n){let{dir:r,name:i}=n,a=l.basename(r);try{return c(r,(n,r)=>{if(!(r===null||i===null||r===i)&&r!==a)return;let o=t.target.leaf;if(this.rearm(e,t),!(!o&&!t.target.leaf))for(let e of t.subscribers.keys())e()})}catch(n){let i=`watch_file ${e}: cannot watch ${r} — ${n instanceof Error?n.message:String(n)}`;t.failure=i;for(let e of t.subscribers.values())e(i);return null}}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.subscribers.delete(t),n.subscribers.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}},qC=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:ne(()=>{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&&(te(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())te(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function JC(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function YC(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`?Bx(e):t===`number`?Vx(e):Hx(e)}function XC(e){return e===`number`?0:e===`boolean`?!1:``}var ZC=class{inputMetas=new Map;lastErrors=new Map;watchFaults=new Map;watchMgr=new KC;ttlMgr=new qC;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new gC;abort=new AbortController;drawn=Lx.observable.box(F.TRUECOLOR);drawnAt=()=>this.drawn.get();instant=Lx.observable.box(null);now=()=>{let e=this.instant.get();if(e===null)throw Error(`the time was read before any render published its instant`);return OC(e)};engine=MS({clock:this.now,drawnAt: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 SC({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,zx(t),t)}declareFailedDocument(e,t){this.store.defineDocument(e,X(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,MC(t,n.cwd,this.abort.signal),kC(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,NC(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,wC,t.default,n);case`regex`:return this.scalarPublisher(e,TC(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=PC(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,LS(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);this.store.defineDocument(e,r);let i,a=!1;return this.cleanups.push(()=>clearTimeout(i)),o=>{clearTimeout(i);let s=o.kind===`ok`&&o.value.trim()===``?Y:o,c=PC(s,EC,n);this.noteOutcome(e,c);let l=c.kind===`ok`||s.kind===`ok`||t===void 0?c:r,u=a&&s.kind===`ok`&&c.kind!==`ok`,d=()=>{a=c.kind===`ok`,this.store.setDocument(e,l)};u?i=setTimeout(d,250):d()}}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.declareDerived(e,()=>r.evaluate(NS(this.store)).map(e=>e.plain).join(``),n.varDefault)}declareTime(e,t){this.declareDerived(e,()=>zC(t.format,this.now()),t.varDefault)}declareDerived(e,t,n){this.store.defineComputed(e,`string`,()=>{try{let n=t();return this.lastErrors.delete(e),n}catch(t){let r=t instanceof Error?t.message:String(t);if(this.recordError(e,r),n===void 0)throw Error(`variable "${e}": ${r}`);return n}})}declareGit(e,t){let n=BC[t.field],r=t.varDefault===void 0?XC(n):YC(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,VC(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(jC);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}stateRevision(){let e=this.store.has(`session.id`)?this.store.read(jC):``;return this.sessionState!==void 0&&typeof e==`string`&&e!==``?this.sessionState.revision(e):0}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=JC(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,YC(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))}renderAt(e){this.store.runInAction(()=>this.instant.set(e))}getLastError(e){let t=this.lastErrors.get(e),n=this.watchFaults.get(e);return n===void 0?t:t===void 0?n:{timestamp:t.timestamp,message:`${n.message}; ${t.message}`}}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 r=this.watchMgr.subscribe(t.path,n,t=>this.watchFaults.set(e,{timestamp:Date.now(),message:t}));this.cleanups.push(r);break}case`key`:{let e=this.engine.parse(t.template),r=(0,Lx.reaction)(()=>{let t=NS(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,Lx.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,YC(this.defaultEmptyValue,t))}catch{this.store.setBox(e,XC(t))}}defaultFor(e){try{return YC(this.defaultEmptyValue,e)}catch{return XC(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 QC={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[jC]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},resume_command:{kind:`input`,path:`resumeCommand`,default:``},config_path:{kind:`input`,path:`configPath`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"effect.effective":{kind:`input`,path:`effect.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:``},"shade.effective":{kind:`input`,path:`shade.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"transitions.effective":{kind:`input`,path:`transitions.effective`,type:`boolean`,default:!1},"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},"tmux.pane":{kind:`input`,path:`tmux.pane`,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:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},$C=`ne .tmux.pane ""`,ew={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:`◐`},effect:{configKey:`effect`,sessionKey:`effect`,effectiveVar:`effect.effective`,label:`✨`},endcaps:{configKey:`endcaps`,sessionKey:`endcaps`,effectiveVar:`endcaps.effective`,label:`✦`},variation:{configKey:`variation`,sessionKey:`variation`,effectiveVar:`variation.effective`,label:`🎼`},shade:{configKey:`shade`,sessionKey:`shade`,effectiveVar:`shade.effective`,label:`🔆`},transitions:{configKey:`transitions`,sessionKey:`transitions`,effectiveVar:`transitions.effective`,label:`fade in/out`},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`}},tw=Object.values(ew),nw=[{configKey:`charset`,effectiveVar:`charset.effective`},{configKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`}],rw=new Set(nw.map(e=>e.configKey)),iw=new Map([...tw,...nw].map(e=>[e.configKey,e.effectiveVar])),aw=new Map(tw.map(e=>[e.sessionKey,e.effectiveVar]));function ow(e){return Object.fromEntries(Object.keys(ew).map(t=>[t,e(t)]))}const sw=new Map(Object.keys(ew).map(e=>[ew[e].sessionKey,e]));function cw(e,t,n){let r=new Set,i=e=>{for(let t of Cx(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 wu(e))i(t.when),t.kind===`segment`&&(i(t.lead),i(t.trail));for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(jC);for(let t of Object.values(e.actions)){r.add(jC),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?aw.get(t.set):void 0,n=`persist`in t?iw.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function lw(e,t,n){let r=jx({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of cw(e,t,n.helpers)){if(Ax(a,r))continue;let e=QC[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 uw=new Map;function dw(e){let t=pw(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 fw(e,t){return e===`bar`?t:dw(e)}function pw(e){let t=uw.get(e);if(t!==void 0)return t;let n=Qr(e);return n===null?null:(uw.set(e,n),n)}function mw(e,t){return hw(e,`${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,()=>ui(e,t))}const hw=vs();function gw(e){let t=pw(e);return t===null?null:{kind:`decided`,name:e,value:t}}function _w(e,t,n){let r=gw(e);return r===null?(n(`${t} rendered "${kc}": "${e}" names no installed theme${Oc(e)}`),yw()):r}function vw(e,t,n){return Rc(e,t,n,yw(),gw)}function yw(){return{kind:`decided`,name:kc,value:dw(kc)}}const bw=new Map;function xw(e,t,n){bw.set(e,{permanent:!0,resolve:t,paletteOf:n})}xw(`themes`,()=>jc(),e=>dw(e));const Sw=`placementThemes`;xw(Sw,Mc,(e,t)=>fw(e,t.palette)),xw(`endcaps`,()=>Xc),xw(`variations`,()=>ol),xw(`shades`,()=>ll),xw(`charsets`,()=>tl),xw(`colorCompatibilities`,()=>il);function Cw(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>mw(n.basePalette,e.styles[t])}],[`presets`,{members:Nb(e.presets)}]])}function ww(e){return[...new Set([...bw.keys(),...e.keys()])]}function Tw(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=bw.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(Dw(e,t))}const Ew=new Map([[`looks`,`styles`],[`progressions`,`variations`]]);function Dw(e,t){let n=Ew.get(e);return`unknown option domain "${e}"${n===void 0?``:` — it was renamed "${n}"; write from: "${n}"`} (have: ${ww(t).join(`, `)})`}function Ow(e,t,n){return e===`bool`?gl(t)!==null:`from`in e?Tw(e.from,n).members.includes(t):_l(t,e)!==null}function kw(e,t){if(e===`bool`)return ml.join(` or `);if(`from`in e){let{members:n}=Tw(e.from,t),r=n.map(e=>JSON.stringify(e));if(n.length<=8)return`one of ${r.join(`, `)}`;let i=typeof e.from==`string`?` "${e.from}"`:``;return`one of the ${n.length}${i} names, such as ${r.slice(0,3).join(`, `)}`}return`an integer from ${e.min} to ${e.max}`}function Aw(e){return{label:e.label,domain:jw(e.domain)}}function jw(e){return e===`theme`?{from:Sw}:e===`bool`||`min`in e?e:{from:e}}function Mw(e,t,n,r,i){let a=Wd(e.label),{domain:o}=e;if(o===`bool`)return{kind:`inline`,template:`{{ action "${r}" "☑ ${a}" "☐ ${a}" }}`,actions:{[r]:{set:t,cycle:[...ml]}},variables:{}};if(`from`in o)return Nw(a,t,r,i,o.from);let s=e=>({set:t,min:o.min,max:o.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "◀" }} {{ "${a}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`,actions:{[`${r}.down`]:s(-o.step),[`${r}.up`]:s(o.step)},variables:{}}}function Nw(e,t,n,r,i){let a={variable:r,key:r,member:n},o=Tb(r,n),s=`${n}.open`,c=Eb(r),l=`${c}.first`;return{kind:`picker`,template:`{{ "${e}" }} {{ carousel "${n}" 0 "${s}" }}`,actions:{[n]:{set:t,from:i},[o]:Qd(r,n),[c]:{set:c,int:!0},[l]:{set:c,to:`0`},[s]:{do:[o,l]}},variables:{[r]:Zd(r,Bd),[c]:{kind:`state`,key:c,default:`0`}},list:{ref:a,template:`{{ picker "${n}" "${c}" false true true }}`}}}const Pw=/^segments\.([^.]+)\.palette$/,Fw=/^presets\.(.+)\.root$/,Iw=/^presets\.(.+)\.globals\.([^.]+)$/,Lw=/^themeDefaults\.(.+)\.([^.]+)$/;function Rw(e){return`presets.${e}.root`}function zw(e,t){return`themeDefaults.${e}.${t}`}const Bw=e=>ku.includes(e);function Vw(e,t){return`presets.${e}.globals.${t}`}function Hw(e){if(jf(e))return{scope:`globals`,field:e};let t=Pw.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=Iw.exec(e);if(n&&xf(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Lw.exec(e);if(r&&Bw(r[2]))return{scope:`theme-default`,theme:r[1],field:r[2]};let i=Fw.exec(e);return i?{scope:`preset-root`,preset:i[1]}:null}function Uw(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`];case`theme-default`:return[`themeDefaults`,e.theme,e.field]}}const Ww=`open`;function Gw(e,t,n,r){let i={variable:e,key:e,member:Ww};return r.variables[e]=Zd(e,Bd),r.actions[e]=Qd(e,Ww),r.segments[e]={template:Jd(e,`(?)`,`✕`),...Kw(n)},Gd(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 Kw(e){let[t,...n]=e;return t===void 0?{}:{when:Kd(t,...n)}}const qw=`none`;function Jw(e){return yr(e,`background`)}var Yw=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Xw(e,t,n,r,i){let{palette:a,tint:o,text:s}=e,c=Zw(n,i),l=c!==qw,u=l?c===void 0?o:Qw(a,c,`bg`):Jw(a);e.bg=u;let d=Zw(r,i),f=d===void 0?l?(e=>e.hex===o.hex?s:nc(a,e,t))(u):void 0:Qw(a,d,`fg`);return new H({...l&&{bgcolor:L.fromRgba(u)},...f!==void 0&&{color:L.fromRgba(f)}})}function Zw(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Qw(e,t,n){try{return yr(e,t)}catch(e){throw e instanceof vr?new Yw(t,n,e.message):e}}const $w={help:[`-h`,`--help`],version:[`-V`,`--version`]},eT=[`✚ inserts`,`✖ removes`,`⚙️ configures`,`↺ resets layout`],tT=`
|
|
93
93
|
cc-candybar - Beautiful powerline statusline for Claude Code
|
|
94
94
|
|
|
95
95
|
Usage: cc-candybar [options]
|
|
96
96
|
|
|
97
97
|
Standalone Commands:
|
|
98
|
-
${
|
|
99
|
-
${
|
|
98
|
+
${$w.help.join(`, `).padEnd(25)}Show this help
|
|
99
|
+
${$w.version.join(`, `).padEnd(25)}Print the version of this runtime (cc-candybar <version>)
|
|
100
100
|
|
|
101
101
|
Debugging:
|
|
102
102
|
CC_CANDYBAR_DEBUG=1 Enable debug logging for troubleshooting
|
|
@@ -119,7 +119,7 @@ Configuration:
|
|
|
119
119
|
failed row's [fix] to repair it (the same checks \`cc-candybar doctor\` runs).
|
|
120
120
|
|
|
121
121
|
Anywhere the bar shows (?), clicking it reveals these same instructions
|
|
122
|
-
in place. In edit mode: ${
|
|
122
|
+
in place. In edit mode: ${eT.join(`, `)}.
|
|
123
123
|
|
|
124
124
|
Subcommands:
|
|
125
125
|
install One-shot setup: stages the runtime (native render
|
|
@@ -160,28 +160,28 @@ Config tooling:
|
|
|
160
160
|
config [--json] The effective merged config. (All three query the
|
|
161
161
|
running daemon; none spawn one.)
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
`).map(e=>e.trim()).filter(e=>e!==``),...e.warnings];return{ok:!1,reason:t,more:n}}case`loaded`:return nT([...e.warnings,...e.unused.map(({kind:e,name:t})=>`${e} "${t}" ${aT[e]}`)])}}},sT="re-run `cc-candybar install`";function cT(e){if(e.kind===`failed`)return[`Launch Services could not be asked which app opens cc-candybar:// — ${e.reason}`];if(e.value===null)return[`no app is registered for cc-candybar:// — ${sT}`];let{app:t,missing:n}=e.value;return n.kind===`failed`?[`${t} opens cc-candybar://, but ${n.reason} — ${sT}`]:n.value.map(e=>`${e} is missing, and ${t} runs it — ${sT}`)}const lT=[oT,{name:`urlHandler`,label:`URL handler`,probe:({urlHandler:e})=>{switch(e.kind){case`unsupported`:return{ok:!0};case`unprobed`:return{ok:!1,reason:e.reason};case`arrived`:return e.handler===e.bar?{ok:!0}:{ok:!1,reason:e.handler===null?`the URL handler does not report its version, so it is older than the bar (${e.bar}) — ${sT}`:`the URL handler runs cc-candybar ${e.handler}; the bar runs ${e.bar} — ${sT}`};case`lost`:return nT([...cT(e.opener),e.unopened===null?`a cc-candybar:// link was opened and did not arrive at the daemon`:`a cc-candybar:// link could not be opened — ${e.unopened}`])}}},iT,{name:`effectRefresh`,label:`effect refresh`,probe:({effect:e,placementEffects:t,transitions:n,claudeSettings:r})=>{let i=[...e.kind===`decided`?e.value===`none`?[]:[`the bar wears the ${e.name} effect`]:[`a globals.effect rule can give the bar an effect`],...t.map(({placement:e,effect:t})=>`${e} wears the ${t} effect`),...n?[`placements fade in and dissolve out as they come and go`]:[]];if(i.length===0)return{ok:!0};let a=i.join(` and `),{path:o,statusLine:s}=r;switch(s.kind){case`absent`:return{ok:!1,reason:`${a}, and ${o} sets no statusLine — set "refreshInterval": 1 beside the statusLine command that runs the bar`};case`not-an-object`:return{ok:!1,reason:`${a}, and ${o} sets statusLine to ${JSON.stringify(s.value)}, not a statusLine object — re-run \`cc-candybar install\` to write one`};case`present`:break}let c=s.refreshInterval;return c===1?{ok:!0}:{ok:!1,reason:c===void 0?`${a}, but Claude Code redraws it only on events`:typeof c==`number`&&c>1?`${a}, but Claude Code redraws it only every ${c} s`:`${a}, but statusLine.refreshInterval is ${JSON.stringify(c)}, not a number of seconds Claude Code accepts (its minimum is 1)`,fix:{kind:`claude-settings`,path:[`statusLine`,`refreshInterval`],value:1}}}}];function uT(e){return lT.map(t=>({check:t,verdict:t.probe(e)}))}function dT(e){return lT.find(t=>t.name===e)}const fT=`${wp}doctor.`;function pT(e){let t=`${fT}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function mT(e,t=[]){return t.length===0?e:`${e} (+${t.length} more — run \`cc-candybar doctor\`)`}function hT(e){return e.flatMap(({check:e,verdict:t})=>{let n=pT(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:pl}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:mT(t.reason,t.more)},{key:n.fixable,value:t.fix===void 0?pl:fl}]})}const gT={copySession:{copy:`{{ .session.id }}`},copyResume:{copy:`{{ .resume_command }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},openConfig:{open:`{{ .config_path }}`}};function _T(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }}{{ if ne .resume_command "" }} {{ action "${t(`copyResume`)}" "⎘ resume" }}{{ end }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}{{ if ne .config_path "" }} {{ action "${t(`openConfig`)}" "↗ config" }}{{ end }}`,actions:Object.fromEntries(Object.entries(gT).map(([t,n])=>[`${e}${t}`,n]))}}const vT=`armed`,yT=`disarmed`,bT=`.armed`,xT=e=>e.endsWith(bT);function ST(e,t,n){let r=`${e}${bT}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${vT}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "✕" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:vT},[a]:{set:r,to:yT},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:yT}},disarm:a}}const CT=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function wT(e){return typeof e==`string`&&CT.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 TT(e){let t=wT(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const ET=[`/compact`,`/model`],DT=`/clear`;function OT(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=ST(`${e}clear`,{arm:DT,confirm:`${DT} ✓ confirm`},[n]);return{template:ET.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,when:`{{ ${XC} }}`,actions:{...Object.fromEntries(ET.map(e=>[t(e),{slash:TT(e)}])),...r.actions,[n]:{slash:TT(DT)}},variables:r.variables,disarm:r.disarm}}function kT(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:l.resolve(t,n)}function AT(e){return e??l.join(h.homedir(),`.claude`)}function jT(e){return l.join(e,`settings.json`)}function MT(e){return l.join(e,`plugins`,`installed_plugins.json`)}function NT(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function PT(e){let t;try{let n=NT(e);if(/^\s*$/.test(n))return{};t=Rl.parse(n)}catch(t){throw Error(`cannot read ${e}: ${IT(t)}`,{cause:t})}if(!FT(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const FT=e=>typeof e==`object`&&!!e&&!Array.isArray(e),IT=e=>e instanceof Error?e.message:String(e),LT=Array.from({length:10},(e,t)=>(t+1)*1e5),RT=LT[0],zT=LT[LT.length-1];function BT(e){let t;try{t=PT(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>=RT&&n<=zT?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${RT}–${zT} tokens)`)}function VT(e,t){let n=Math.min(t??zT,zT),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:LT.filter(e=>e<r).at(-1)??0,higher:LT.find(e=>e>r&&e<=n)??0}}function HT(e,t){return{template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}${t(`.autocompact.applied`)}{{ end }}{{ if ${XC} }}{{ if gt .autocompact.lower 0 }} {{ action (printf "${e}%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "${e}%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "${e}auto" "↺" }}{{ end }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`,actions:{[`${e}auto`]:{slash:TT(`/autocompact auto`)},...Object.fromEntries(LT.map(t=>[`${e}${t}`,{slash:TT(`/autocompact ${t}`)}]))}}}const UT=e=>`{{ if ge ${e} 1000000 }}{{ printf "%.1f" (divf ${e} 1000000) }}M{{ else if ge ${e} 1000 }}{{ printf "%.1f" (divf ${e} 1000) }}K{{ else }}{{ ${e} }}{{ end }}`,WT=`${wp}menu`,GT=`open`,KT=`${wp}edit`,qT=`${wp}toolbar`,JT=_T(wp),YT=`${wp}commands`,XT=OT(`${YT}.`),ZT=`${wp}autocompact`,QT=HT(`${ZT}.`,UT),$T=e=>({kind:`segment`,name:e}),eE=`${wp}tab`,tE=[{member:`session`,label:`⚡ session`},{member:`look`,label:`🎨 look`},{member:`layout`,label:`📐 layout`},{member:`config`,label:`⚙ config`},{member:`tools`,label:`🧰 tools`}],nE=e=>`${eE}.${e}`,rE=e=>`${nE(e)}.toggle`,iE=e=>({variable:eE,key:eE,member:e}),aE=`${wp}save`,oE=`${wp}preset.save`,sE=`${wp}preset.delete`,cE=`${wp}themeDefault.save`,lE=`${wp}themeDefault.differs`,uE=`${wp}themeDefault.theme`,dE={when:`{{ .${lE} }}`,template:`{{ action "${cE}" (printf "⤓ default for %s" .${uE}) }}`},fE=`${wp}resetAll`,pE=`${WT}.toggle`,mE={variable:WT,key:WT,member:GT},hE=`${wp}undo`,gE=`${wp}back`,_E=`${gE}.step`,vE=`${wp}navigation.back`,yE=gE,bE={template:`{{ if gt .${vE} 0 }}{{ action "${gE}" "◁" }}{{ else }}{{ fg (${$w}) "◁" }}{{ end }}`},xE=`${wp}redo`,SE=`${wp}doctor`,CE=`${SE}.run`,wE=e=>`${SE}.fix.${e}`,TE=e=>`${SE}.${e}`,EE=wb(`${wp}pickers`),DE=[{template:`{{ themePreview }}`}],OE={template:`{{ layoutPreview }}`},kE={preset:[OE,{when:`{{ not .preset.bundled }}`,template:`{{ action "${sE}" (printf "🗑 delete %s" .${ZC.preset.effectiveVar}) }}`}],theme:DE,style:DE,variation:[OE],shade:[OE]},AE=e=>`${wp}${e}`,jE=e=>`${wp}apply.${e}`,ME=e=>`${wp}reset.${e}`,NE=e=>`${wp}list.${e}`,PE=(e,t)=>`${NE(e)}.${t}`,FE=e=>`${wp}resettable.${e}`,IE=e=>e.length===0?`false`:`(or ${e.map(e=>`.${FE(e)}`).join(` `)})`,LE=Object.keys(ZC).map(e=>{let t=ZC[e],n=ff(t.configKey),r=kw({label:t.label,domain:n},t.sessionKey,t.effectiveVar,jE(e),EE);return{...t,name:e,control:r,beneath:kE[e]??[]}}),RE={preset:`door`,theme:`look`,style:`look`,effect:`look`,variation:`look`,shade:`look`,endcaps:`look`,transitions:`look`,autoWrap:`layout`,padding:`layout`,updateNotice:`config`},zE=e=>LE.filter(t=>RE[t.name]===e),BE=e=>zE(e).map(QE);new Set(LE.flatMap(e=>[e.sessionKey,e.configKey]));const VE=ST(fE,{arm:`⟲`,confirm:`⟲ reset all?`},LE.map(e=>ME(e.name))),HE=[`unsaved`,`history.undo`,`history.redo`],UE=e=>`${wp}${e}`,WE=UE(`unsaved`),GE=(e,t)=>({body:t,shown:`(gt .${UE(e)} 0)`}),KE=[GE(`unsaved`,`{{ action "${aE}" (printf "💾 save %d" .${WE}) }}`),GE(`history.undo`,`{{ action "${hE}" "↶" }}`),GE(`history.redo`,`{{ action "${xE}" "↷" }}`),{body:VE.template,shown:`(or ${IE(LE.map(e=>e.name))} ${VE.armed})`}],qE={when:`{{ or ${KE.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+KE.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},JE=[{step:VE,place:`door`},{step:XT,place:`session`}],YE=e=>e.map(e=>e.step.disarm),XE=YE(JE),ZE=YE(JE.filter(e=>e.place!==`door`));function QE(e){let t=AE(e.name);return e.control.kind===`inline`?$T(t):Gd(t,e.control.list.ref,{kind:`container`,direction:`vertical`,children:[$T(NE(e.name)),...e.beneath.map((t,n)=>$T(PE(e.name,n)))]},`drop`)}function $E(e){return e===WT}function eD(e){let t=$T(WT);if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[eD(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 tD(e){return nD(e)>0?e:eD(e)}function nD(e){let t=0;for(let n of wu(e))n.kind===`segment`&&$E(n.name)&&(t+=1);return t}function rD(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&$E(e.name)||e.opens!==void 0&&rD(e.opens.body,!0):e.children.some(e=>rD(e,n))}const iD={session:{direction:`vertical`,content:[$T(qT),{kind:`container`,direction:`horizontal`,children:[$T(YT),$T(ZT)]}],after:[]},look:{direction:`horizontal`,content:[],after:[$T(cE)]},layout:{direction:`horizontal`,content:[$T(oE),$T(KT)],after:[]},config:{direction:`horizontal`,content:[],after:[]},tools:{direction:`vertical`,content:[$T(SE),...lT.map(e=>$T(TE(e.name)))],after:[]}},aD=e=>({kind:`container`,direction:iD[e].direction,children:[...iD[e].content,...BE(e),...iD[e].after]});function oD(e){return e.kind===`segment`?$E(e.name)?Gd(e.name,mE,cD,`above`):e:uD(e)}function sD(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[$T(yE),...BE(`door`),$T(aE)]},{kind:`container`,direction:`horizontal`,children:tE.map(({member:e})=>Gd(nE(e),iE(e),aD(e),`drop`))}]}}const cD=sD();function lD(e){let t=new Map;for(let e of wu(cD))e.kind===`segment`&&e.opens!==void 0&&t.set(e.opens.ref.key,e.opens.ref.variable);return[...t].map(([t,n])=>{let r=e.variables[n];if(r?.kind!==`state`||r.default===void 0)throw Error(`settings menu: the door folds "${t}", but "${n}" is not a state variable the menu declares with a default`);let i=`${WT}.fold.${bp(t)}`;return e.actions[i]={set:t,to:r.default},i})}function uD(e){return{...e,children:e.children.map(e=>oD(e))}}function dD(e){let t={variables:{[WT]:Zd(WT,Bd)},actions:{[pE]:Qd(WT,GT),[CE]:{doctor:`run`},[KT]:{do:[...tx]},...JT.actions,...XT.actions,...QT.actions,[aE]:{save:!0},[hE]:{undo:!0},[_E]:{back:!0},[gE]:{do:[_E,...XE]},[xE]:{redo:!0},[oE]:{preset:`save`},[cE]:{themeDefault:`save`},[sE]:{preset:`delete`,name:`{{ .${ZC.preset.effectiveVar} }}`}},segments:{[WT]:{template:`{{ $door := ${Yd(WT,Xd(e),Xd(`✖`))} }}{{ if ${qd(mE)} }}{{ fg (keptOn (color "error") (bgOf)) $door }}{{ else }}{{ $door }}{{ end }}`},[qT]:{template:JT.template},[YT]:{template:XT.template,when:XT.when},[ZT]:{template:QT.template,bg:QT.bg,when:QT.when},[yE]:bE,[aE]:qE,[cE]:dE,[oE]:{template:`{{ action "${oE}" "+ preset" }}`},[SE]:{template:`{{ action "${CE}" "🩺 doctor" }}`},[KT]:{template:`{{ action "${KT}" "✎ arrange" "✎ done" }}`}}};t.variables[lE]={kind:`input`,path:`themeDefault.differs`,type:`boolean`,default:!1},t.variables[uE]={kind:`input`,path:`themeDefault.theme`,type:`string`,default:``},t.variables[vE]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of HE)t.variables[UE(e)]={kind:`input`,path:e,type:`number`,default:0};t.variables[eE]=Zd(eE,`session`);for(let{member:e,label:n}of tE){t.actions[rE(e)]=Qd(eE,e),t.actions[nE(e)]={do:[rE(e),...ZE]};let r=IE(zE(e).map(e=>e.name)),i=`(ternary ${Xd(` •`)} "" ${r})`,a=e=>`(print ${Xd(e)} ${i})`;t.segments[nE(e)]={template:`{{ ${Yd(nE(e),a(n),a(`▾ ${n}`))} }}`}}return Object.assign(t.variables,XT.variables,VE.variables),pD(t),fD(t),t.actions[WT]={do:[pE,...XE,...lD(t)]},t}function fD(e){for(let t of lT){let n=pT(t.name),r=wE(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[TE(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${fl}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function pD(e){for(let t of LE){Object.assign(e.actions,t.control.actions);let n=ME(t.name);e.actions[n]={reset:t.configKey},e.variables[FE(t.name)]={kind:`input`,path:`resettable.${t.name}`,type:`boolean`,default:!1};let r=`{{ if .${FE(t.name)} }} {{ action "${n}" "↺" }}{{ end }}`;Object.assign(e.variables,t.control.variables),e.segments[AE(t.name)]={template:`${t.control.template}${r}`},t.control.kind===`picker`&&(e.segments[NE(t.name)]={template:t.control.list.template}),t.beneath.forEach((n,r)=>{e.segments[PE(t.name,r)]=n})}Object.assign(e.actions,VE.actions)}function mD(e){let{variables:t,actions:n}=ux();Object.assign(e.variables,t),Object.assign(e.actions,n)}function hD(e){let t=dD(e.globals.menuGlyph??`🍫`);mD(t);let n={...e.presets},r=[];for(let t of Nb(e.presets)){let{node:i}=Ib(e,t),a=oD(tD(i));r.push(a),n[t]={...Fb(e.presets,t),root:a}}let i=ow(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const gD=`${Cp}live`,_D=[`☐ live`,`☑ live`],vD=`${Cp}done`,yD=`${Cp}cancel`,bD=`${Cp}rewind`,xD=`${Cp}changes`,SD=`(gt .${xD} 0)`,CD=`(or ${SD} (gt .${WE} 0))`,wD={variable:gD,key:gD,member:`open`};function TD(e){return`${Cp}configuring.p${e}`}function ED(e){return`and ${qd(ax)} (not ${qd(wD)}) (ne .${TD(e)} "true")`}function DD(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${Qb} "${Wd(e)}")`).join(` `)} false }}`}}function OD(e,t,n){return`{{ if ${ED(e)} }}${t}{{ else }}${n}{{ end }}`}const kD=`{{ and ${qd(ax)} .preset.customized }}`,AD=Ep;function jD(e){return new Map([...bw(e),...ND(e)])}const MD=`${Cp}addable`;function ND(e){return new Map([[MD,{members:Object.keys(e.segments).filter(e=>!AD(e)),library:{groups:vp.map(e=>({id:e,label:yp[e]})),entry:t=>{let n=e.segments[t];return{group:n.group??`other`,...n.description!==void 0&&{description:n.description}}}}}]])}function PD(e,t,n){return n.segments[e]={template:t,when:ox,bg:Ww},{kind:`segment`,name:e}}function FD(e,t,n){let r=`${Cp}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${tc}`}) (action "${r}" "✖") }}`}function ID(e){return`{{ if ${qd(ax)} }}${e}{{ end }}`}function LD(e,t){return e.reduce((e,t)=>`{{ if and ${qd(ax)} ${qd(t)} }}true{{ else }}${e}{{ end }}`,t)}function RD(e){return e.flatMap(e=>[...wu(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function zD(e,t,n){return`${rx}${e}.${t}.${n}`}function BD(e,t,n,r){let i=bu(n),a=`${Cp}${e.presetIdent}`,o=ix(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`,c=wb(s),l=`${s}.fold`;e.artifacts.actions[l]={set:c,to:Bd},e.artifacts.actions[s]={do:[`${s}.open`,l]},e.artifacts.actions[`${s}.open`]={set:Qb,to:o};let u={},d=Object.entries(r).map(([r,o])=>{let s=zD(e.presetIdent,i,r),l=`${rx}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Vu(n.settings?.[r]??o.default)},u[r]={id:i,key:s,variable:l};let d=`${a}.setting.${t}.${r}`,f=kw(Dw(o),s,l,d,c);if(Object.assign(e.artifacts.actions,f.actions),Object.assign(e.artifacts.variables,f.variables),f.kind===`inline`)return e.artifacts.segments[d]={template:f.template},{kind:`segment`,name:d};let p=`${d}.list`;return e.artifacts.segments[d]={template:f.template},e.artifacts.segments[p]={template:f.list.template},Gd(d,f.list.ref,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:p}]},`drop`)});return{term:`{{ action "${s}" "⚙️" }}`,ref:{variable:Qb,key:Qb,member:o},body:{kind:`container`,direction:`vertical`,children:d},drafts:u}}const VD=`${Cp}label:`;function HD(e){if(e.startsWith(VD)){let t=e.slice(VD.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function UD(e,t,n,r){let{artifacts:i}=n,a=bu(e),o=`${VD}${a}:${e.name}`;i.segments[o]={template:`{{ "${Wd(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=Object.fromEntries(Iu.flatMap(t=>{let n=e.settings?.[t];return n===void 0?[]:[[t,n]]}));return{...Gd(o,r.ref,r.body,`drop`,LD([r.ref],`{{ ${ED(n.presetIdent)} }}`)),...Object.keys(s).length>0&&{settings:s},drafts:Object.fromEntries(Iu.map(e=>[e,r.drafts[e]]))}}function WD(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${Cp}${i}.insert.${t}`,s=`${Cp}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:MD,anchor:n,relation:r};let c=Sb(o),l=Cb(s,o,void 0),u=Eb(l),d=Tb(l,c);return a.variables[l]=Zd(l,Bd),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=Qd(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${qd({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${tc}`}) $m }}{{ end }}`}}function GD(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!AD(e.name)),i=e=>GD(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=Cu(o,i);if(AD(o.name)){n.push(s);continue}let c=bu(o),l=a===r?[WD(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=WD(t,u,c,`after`),f=FD(t,u,c),p=t.segments[o.name],m=BD(t,u,o,Lu(p)),h=ID(f),g=ID(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>PD(e.host,e.template,t.artifacts)),{...UD(o,p,t,m),lead:h,trail:g},{...s,when:OD(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},PD(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[_]}:_)}return{...e,children:n,...e.when!==void 0&&{when:LD(RD(n),OD(t.presetIdent,`true`,e.when))}}}function KD(e,t,n,r,i,a,o){let s=`${Cp}${t}.resetLayout`,c=`${Cp}${t}.customized`;return r.actions[s]={reset:n},r.segments[c]={template:`{{ action "${s}" "↺ reset layout" }}`,when:kD},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...i,{kind:`segment`,name:c},a]},qD(e,o)]}}function qD(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),qD(n,t)]}:{...e,children:[...e.children,t]}}function JD(e,t,n,r,i,a){let{node:o}=Ib(e,t),s={presetIdent:bp(t),rootKey:Fw(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},c=GD(o,s);return n.variables[TD(s.presetIdent)]=DD(s.configured),KD(c,s.presetIdent,s.rootKey,n,r,i,a)}function YD(e){let t={variables:{},actions:{},segments:{}},n=Hw(`${Cp}help`,Zw,[ax],t);t.variables[gD]=Zd(gD,Bd),t.actions[gD]=Qd(gD,wD.member),t.segments[gD]={template:Jd(gD,..._D),when:ox};let r={kind:`segment`,name:gD},i=n;t.variables[xD]={kind:`input`,path:`history.sinceEdit`,type:`number`,default:0},t.actions[vD]={do:[aE,...tx]},t.segments[vD]={template:`{{ if ${CD} }}{{ action "${vD}" "✓ save" }}{{ else }}{{ action "${vD}" "✓ done" }}{{ end }}`,when:ox},t.actions[bD]={rewind:!0},t.actions[yD]={do:[bD,...tx]},t.segments[yD]={template:`{{ action "${yD}" "↩ cancel" }}`,when:`{{ and ${qd(ax)} ${SD} }}`};let a=[{kind:`segment`,name:vD},{kind:`segment`,name:yD}],o={...e.presets},s=[];for(let n of Nb(e.presets)){let c=JD(e,n,t,a,r,i);s.push(c),o[n]={...Fb(e.presets,n),root:c}}let c=ow(t,s,e);return{...e,variables:{...c,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:o}}const XD=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`rewind`,`save`,`preset`,`themeDefault`,`doctor`,`ceiling`,`slash`,`do`];function ZD(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function QD(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function $D(e,t){if(t===void 0)return{};if(!Qu(t))return Q(e,`actions`,`actions must be an object, got ${$u(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=eO(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Q(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function eO(e,t,n){if(!Qu(n))return Q(e,t,`${t} must be an action object, got ${$u(n)}`),null;if(`persistWhen`in n)return Q(e,t,`${t}.persistWhen was removed: declare the \`set\` alone — a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=XD.filter(e=>e in n);return r.length===1?tO[r[0]](e,t,n):(Q(e,t,`action must declare exactly one of: ${XD.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const tO={set:(e,t,n)=>PO(e,t,n,`set`,AO),persist:(e,t,n)=>PO(e,t,n,`persist`,jO),copy:nO(`copy`),open:nO(`open`),reset:rO,undo:aO(`undo`),redo:aO(`redo`),back:aO(`back`),rewind:aO(`rewind`),save:aO(`save`),preset:oO,themeDefault:sO,doctor:cO,ceiling:lO,slash:uO,do:dO};function nO(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=qu(t,n,r,e);return i===null?null:{[e]:i}}}function rO(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=fO(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 iO={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,rewind:`it steps the session's settings history back to where edit mode opened`,save:`it saves the session's unsaved settings`};function aO(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Q(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${iO[e]}), got ${K(r[e])}`),null)}}function oO(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Q(e,`${t}.preset`,`preset must be "save" or "delete", got ${K(r)}`),null;if(r===`save`)return{preset:`save`};let a=qu(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function sO(e,t,n){for(let r of Object.keys(n))r!==`themeDefault`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a themeDefault action. Expected only: themeDefault`);return n.themeDefault===`save`?{themeDefault:`save`}:(Q(e,`${t}.themeDefault`,`themeDefault must be "save" (it saves the look the session draws as the active theme's default), got ${K(n.themeDefault)}`),null)}function cO(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Q(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${K(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||dT(a)===void 0?(Q(e,`${t}.check`,`doctor fix must name a check (have: ${lT.map(e=>e.name).join(`, `)}), got ${K(a)}`),null):{doctor:`fix`,check:a}}function lO(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Q(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${K(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Q(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${K(a)}`),null):{ceiling:`set`,to:a}}function uO(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=wT(n.slash);return r.kind===`refused`?(Q(e,`${t}.slash`,r.reason),null):{slash:r.line}}function dO(e,t,n){for(let r of Object.keys(n))r!==`do`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Q(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${K(r)}`),null):{do:r}}function fO(e,t,n,r,i,a){let o=qu(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Q(e,s,i),null):o.includes(`/`)?(Q(e,s,a(o)),null):o}const pO={set:`the SessionState key to write`,persist:`the config globals field to write`};function mO(e,t,n,r){let i=pO[r],a=fO(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 hO(e){return e===`set`?`set-state`:`set-config`}const gO={to:FO(`set`)},_O={to:FO(`persist`)},vO={from:IO(`set`)},yO={from:IO(`persist`)},bO={min:VO(),max:VO(),by:VO()},xO={int:RO()},SO={cycle:LO(`set`)},CO={cycle:LO(`persist`)},wO={removeSegment:zO(`removeSegment`)},TO={insertSegment:zO(`insertSegment`),anchor:zO(`anchor`),relation:BO()},EO={insertSegmentFrom:IO(`persist`),anchor:zO(`anchor`),relation:BO()},DO={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},OO={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function kO(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>nd(e,t,n,r),c=bd(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?ud(s,...n):s}}const AO=[kO(`set`,gO),kO(`set`,vO),kO(`set`,bO,[DO,OO]),kO(`set`,xO),kO(`set`,SO)],jO=[kO(`persist`,_O),kO(`persist`,yO),kO(`persist`,bO,[DO,OO]),kO(`persist`,CO),kO(`persist`,wO),kO(`persist`,TO,[],[`insertSegment`]),kO(`persist`,EO,[],[`insertSegmentFrom`])];function MO(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 NO(e){let t=MO(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 PO(e,t,n,r,i){let a=mO(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Q(e,t,`${NO(r)}${o.length>1?` — found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Q(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function FO(e){let t=hO(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>fO(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 IO(e){let t=hO(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Q(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Q(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Q(n,s,`${i} array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Q(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Q(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Q(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${K(o)}`)}}}function LO(e){let t=hO(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Q(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${$u(o)}`);return}let c=o;if(c.length<2){Q(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Q(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Q(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Q(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function RO(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Q(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${K(r[n])}`);return}return!0}}}function zO(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=qu(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Q(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Q(t,o,`${e} "${a}" contains "/" or ":" — segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function BO(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Q(e,`${t}.${n}`,`relation must be "before" or "after", got ${K(i)}`);return}return i}}}function VO(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Q(e,`${t}.${n}`,`${n} must be an integer, got ${K(i)}`);return}return i}}}function HO(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const UO={noun:`style key`,fields:{hueShift:md(),chromaScale:md({min:0}),lightnessScale:md(),lightnessShift:md()}};function WO(e,t){if(!Qu(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${$u(t)}`,line:G(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:G(e.source,[`styles`,r])});continue}if($c(r)){e.issues.push({path:`styles.${r}`,message:HO(`styles.${r}`,r,`globals.endcaps`),line:G(e.source,[`styles`,r])});continue}let t=ed(e,UO,`styles.${r}`,i);t!==null&&(n[r]={...sr,...t})}return n}const GO={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:_m(e,`${t}.${n}`,r[n])},globals:{required:!1,json:Of(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Df(e,`${t}.${n}`,r[n])}}};function KO(e,t){if(!Qu(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${$u(t)}`,line:G(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free — a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:G(e.source,[`presets`,r])});continue}let t=ed(e,GO,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function qO(e,t){if(t===void 0)return{};if(!Qu(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${$u(t)}`,line:G(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${K(i)}`,line:G(e.source,[`helpers`,r])});continue}n[r]=i}return n}const JO=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 YO(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 XO(e){let t=JO.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${YO(t)}`}function ZO(e){let t=JO.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${YO(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function QO(e,t){let n=new Map;for(let e of Object.keys(t)){let t=bp(e),r=n.get(t);r?r.push(e):n.set(t,[e])}for(let[t,r]of n)r.length<2||e.issues.push({path:`presets`,message:`preset names ${r.map(e=>JSON.stringify(e)).join(` and `)} both collapse to the same synthesis identifier "${t}" — edit mode's synthesized reset affordance would silently steal one preset's action for the other. Rename one.`,line:G(e.source,[`presets`])})}function $O(e,t,n){let r=[[[`globals`],t.globals.style,`globals.endcaps`],[[`editGlobals`],t.editGlobals.style,`editGlobals.endcaps`],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style,`presets.${e}.globals.endcaps`]),...Object.entries(t.themeDefaults).map(([e,t])=>[[`themeDefaults`,e],t.style,`globals.endcaps`])];for(let[n,i,a]of r){if(i===void 0||Lc(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:$c(i)?HO(r,i,a):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:G(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:G(e.source,[`globals`,`preset`])}),QO(e,t.presets),Sk(e,t);let i=jx(t);for(let t of i.names)t!==`settings`&&!t.startsWith(nk)||e.issues.push({path:`variables`,message:`variable "${t}" is named under "settings", which a segment's templates read as its placement's own settings (.settings.<name>) — rename it`,line:G(e.source,[`variables`,t])});let a=(t,n,r)=>{nD(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${WT}" ${nD(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}),rD(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${WT}" under a \`when\` or inside a disclosure body — the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),o(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell — everything inside a cell wears that cell's hue and shade, 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 wu(t)){if(e.kind!==`segment`)continue;let t=bu(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=Su(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" — an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function o(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>o(n,t||yu[e.direction]===`cell`))}let s=(n,r)=>{for(let[a,o]of Nd(n,r)){let n=G(e.source,o.split(`.`));if(a.when!==void 0&&(mk(e,`${o}.when`,a.when,i,{line:n}),pk(e,`${o}.when`,a.when,n)),a.kind===`segment`){if($E(a.name)){(a.id!==void 0||a.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${WT}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${WT}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,a.name)||e.issues.push({path:o,message:`${r} entry "${a.name}" does not match any declared segment${Ap(a.name)}`,line:n}),uk(e,t,a,o,n)}}};n.root!==void 0&&s(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&s(t.root,`presets.${e}.root`);let c=new Map([[`root`,jd(t.root)]]);for(let e of Nb(t.presets)){let{node:n,path:r}=Ib(t,e);c.set(r,n)}for(let[t,n]of c)a(n,t,G(e.source,t.split(`.`)));xk(e,t,i,()=>!0)}const ek=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function tk(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=G(e.source,[`actions`,n,r]);if(!Nb(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${Nb(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(`, `)})${Ap(i)}`,line:c})},p=new Set(xu(Ib(t,a).node)),m=(r,i)=>{!kp.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${Ap(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 nk=`settings.`;function rk(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>nk+e)])}}function ik(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:G(e.source,[`segments`,t,`settings`,n])})},a=sk(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of zu(n,ok(n)))i(e,`the defaults do not stand together: ${t}`)}function ak(e){return sk(e).length>0||zu(e,ok(e)).length>0}function ok(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function sk(e){let t=t=>Ru(ck(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Ru(ck(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${lk(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 ck(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function lk(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Ru(n)!==void 0).map(([e])=>e)}function uk(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=Lu(a),s=`${r}: placement "${bu(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(`, `)})`:Bu(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Oc(a):``}, but it must be ${Wu(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])=>Bu(o[e],t))||ak(o)))for(let{message:t}of zu(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function dk(e,t,n,r,i){n.kind===`template`&&mk(e,`${t}.template`,n.template,r,{segCtx:i}),Mu(n)&&n.cache&&`key`in n.cache&&mk(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function fk(e,t,n,r,i){if(Mu(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.names.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.names.has(s)?` (segment-local vars are namespaced — write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:G(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function pk(e,t,n,r){try{Xb.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function mk(e,t,n,r,i){for(let[a,o]of Cx(n,r.helpers)){if(Ax(a,r))continue;if(a.startsWith(nk)){let n=o===null?``:` through helper "${o}"`,r=a.slice(9),s=i?.segCtx===void 0||i.settings===void 0?`Template reads ".${a}"${n}, but only a segment's own templates have settings — call it from a segment that declares "${r}"`:`Template reads ".${a}"${n}, but segment "${i.segCtx}" has no setting "${r}" (it has: ${Object.keys(i.settings).join(`, `)}) — declare it under segments.${i.segCtx}.settings`;e.issues.push({path:t,message:s,line:i?.line??G(e.source,t.split(`.`))});continue}if(o!==null){hk(e,o,`Template references unknown variable ".${a}"${ZO(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&Ax(n,r)?` (segment-local vars are namespaced — write ".${n}")`:ZO(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??G(e.source,t.split(`.`))})}}function hk(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:G(e.source,[`helpers`,t])})}function gk(e,t,n,r,i){let a=n.set,o=ff(ZC[r].configKey),s=`${a} takes ${Ew(o,i)}`;if(`min`in n&&(o===`bool`||`from`in o)){e.issues.push({path:`actions.${t}.min`,message:`actions.${t}: a stepper writes the integers from ${n.min} to ${n.max}, and ${a} is not an integer range; ${s}`,line:G(e.source,[`actions`,t,`min`])});return}let c=yk(n,i);if(c===vk){e.issues.push({path:`actions.${t}.int`,message:`actions.${t}.int: an int cursor writes whatever integer the template binds, and a click outside the ${a} domain would change nothing; ${s}`,line:G(e.source,[`actions`,t,`int`])});return}let l=c.filter(e=>!Tw(o,e.value,i));if(l.length!==0){if(a===ZC.style.sessionKey&&(`from`in n&&n.from===`endcaps`||c.every(e=>$c(e.value)))){let r=ZC.endcaps.sessionKey;e.issues.push(`to`in n?{path:`actions.${t}.to`,message:HO(`actions.${t}.to`,n.to,`set: "${r}", to`),line:G(e.source,[`actions`,t,`to`])}:{path:`actions.${t}.set`,message:`actions.${t}.set: "${a}" here writes only endcaps shapes, not styles — endcaps were renamed from "style" to "endcaps"; write set: "${r}"`,line:G(e.source,[`actions`,t,`set`])});return}for(let n of new Set(l.map(e=>e.field))){let r=l.filter(e=>e.field===n).map(e=>JSON.stringify(e.value)),i=r.length<=_k?r.join(`, `):`${r.slice(0,_k).join(`, `)} and ${r.length-_k} more`,o=`actions.${t}.${n}`;e.issues.push({path:o,message:`${o}: ${i} ${r.length===1?`is`:`are`} outside the ${a} domain — a click would write it and nothing would change; ${s}`,line:G(e.source,[`actions`,t,n])})}}}const _k=3,vk=Symbol(`any integer`);function yk(e,t){return`to`in e?[{field:`to`,value:e.to}]:`cycle`in e?e.cycle.map(e=>({field:`cycle`,value:e})):`from`in e?Sw(e.from,t).members.map(e=>({field:`from`,value:e})):`min`in e?[{field:`min`,value:String(e.min)},{field:`max`,value:String(e.max)}]:vk}function bk(e,t){return Object.entries(e).filter(([e])=>t(e))}function xk(e,t,n,r){let i=jD(t),a=xw(i);for(let[n,o]of bk(t.actions,r)){let[t,r]=`from`in o?[`from`,o.from]:`insertSegmentFrom`in o?[`insertSegmentFrom`,o.insertSegmentFrom]:[null,null];if(t!==null&&typeof r==`string`&&!a.includes(r)){e.issues.push({path:`actions.${n}.${t}`,message:`actions.${n} ${t}: references ${ww(r,i)}`,line:G(e.source,[`actions`,n,t])});continue}if(!(`set`in o))continue;ew.has(o.set)&&e.issues.push({path:`actions.${n}.set`,message:`actions.${n} sets "${o.set}", which has no session pick — globals.${o.set} is set in the config file only, so a click would change nothing; write it with { persist: "${o.set}", … } instead`,line:G(e.source,[`actions`,n,`set`])});let s=iw.get(o.set);s!==void 0&&gk(e,n,o,s,i)}for(let[n,i]of bk(t.actions,r))`do`in i&&i.do.forEach((r,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,r)?t.actions[r]:void 0,s=o===void 0?`references unknown action "${r}"`:`do`in o?`"${r}" is itself a do action — list its members here instead`:i.do.indexOf(r)===a?a>0&&QD(o)?`"${r}" 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:`"${r}" is listed twice — each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:G(e.source,[`actions`,n,`do`])})});for(let[n,i]of bk(t.actions,r)){let r=`persist`in i?i.persist:`reset`in i?i.reset:null;if(r===null)continue;let a=`persist`in i?`persist`:`reset`,o=zw(r);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" is not a config globals field (have: ${Mf().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, a "themeDefaults.<theme>.<shade|variation|style>" target, or a "presets.<name>.root" target`,line:G(e.source,[`actions`,n,a])});continue}let s=ek.filter(e=>e in i);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" is not a "presets.<name>.root" target — ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){tk(e,t,n,a,r,o.preset,i);continue}if(o.scope===`preset-globals`&&!Nb(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" names preset "${o.preset}" which is not declared (have: ${Nb(t.presets).join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`theme-default`&&!e.allowedPalettes.has(o.theme)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" names theme "${o.theme}" which is not installed${Oc(o.theme)} (have: ${[...e.allowedPalettes].sort().join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${Ap(o.segment)}`,line:G(e.source,[`actions`,n,a])});continue}`min`in i&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:G(e.source,[`actions`,n,a])})}}for(let[i,a]of bk(t.variables,r)){dk(e,`variables.${i}`,a,n);let t=XO(i);t!==void 0&&e.issues.push({path:`variables.${i}`,message:t,line:G(e.source,[`variables`,i])})}for(let[i,a]of bk(t.segments,r)){if(a.vars)for(let[t,r]of Object.entries(a.vars))dk(e,`segments.${i}.vars.${t}`,r,n,i);let r=Lu(a);ik(e,i,r);let o=rk(n,r);for(let n of[`template`,`bg`,`fg`,`when`]){let s=a[n];if(typeof s==`string`){mk(e,`segments.${i}.${n}`,s,o,{segCtx:i,settings:r});for(let{name:r,site:a,via:o}of Dx(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=a===`options`?` (in a picker, menu or carousel)`:``;if(o!==null){hk(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${i}.${n}`,message:`${n} references unknown action "${r}"${s}`,line:G(e.source,[`segments`,i,n])})}}}}for(let[i,a]of bk(t.variables,r))fk(e,`variables.${i}`,a,n);for(let[i,a]of bk(t.segments,r))if(a.vars)for(let[t,r]of Object.entries(a.vars))fk(e,`segments.${i}.vars.${t}`,r,n,i)}function Sk(e,t){let n=new Set;for(let r of Nb(t.presets)){let i=Lb(t,r),a=[{},t.editGlobals];for(let o of a){let a=o.charset??i.charset??`unicode`,s=o.default_separator??i.default_separator;if(a!==`ascii`||nl(s??``))continue;let c=o.default_separator===void 0?Fb(t.presets,r).globals?.default_separator===void 0?[`globals`]:[`presets`,r,`globals`]:[`editGlobals`],l=[...c,`default_separator`].join(`.`);n.has(l)||(n.add(l),e.issues.push({path:l,message:`${l} ${JSON.stringify(s)} is not ASCII, but charset is "ascii" — under ascii a joiner draws only ASCII; write an ASCII separator or set charset: "unicode"`,line:G(e.source,[...c,`default_separator`])}))}}}function Ck(e,t,n=()=>!0){let{graph:r,nodeInfo:i}=wk(t),a=new Map,o=[];for(let e of r.keys())a.set(e,0);for(let e of r.keys())if(!(!n(e)||a.get(e)!==0)&&s(e))return;function s(t){a.set(t,1),o.push(t);for(let c of r.get(t)??[]){if(!n(c))continue;let t=a.get(c);if(t===1){let t=o.indexOf(c),n=[...o.slice(t),c],r=n[0],a=i.get(r);return e.issues.push({path:a?.declarationPath??`variables.${r}`,message:`Dependency cycle: ${n.join(` → `)}`,line:G(e.source,a?.linePathParts??[`variables`,r])}),!0}if(t===0&&s(c))return!0}return a.set(t,2),o.pop(),!1}}function wk(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 Cx(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),Mu(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 Tk=[`json5`,`json`];function Ek(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Dk(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?h.homedir()+e.slice(1):e}function Ok(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Tk.map(t=>l.join(e,`.cc-candybar.${t}`)):[],...Tk.map(e=>l.join(r,`.cc-candybar.${e}`)),...Tk.map(e=>`${kk()}.${e}`)])]}function kk(){let e=process.env.XDG_CONFIG_HOME??l.join(h.homedir(),`.config`);return l.join(e,`cc-candybar`,`config`)}function Ak(e,t,n){let i=[],a=new Map;for(let o of Ok(e,t,n)){let e=Ek(o);if(e===`absent`)continue;if(e!==`present`){i.push(e);continue}let t=l.join(r.realpathSync(l.dirname(o)),l.basename(o).replace(/\.(json5|json)$/,``));a.has(t)||a.set(t,o)}let o=[...a.values()].reverse();if(n===void 0)return{kind:`chain`,layers:o,home:jk(o),unchecked:i};let[s]=i,c=n;return o.length>0?{kind:`chain`,layers:o,home:c,unchecked:i}:s===void 0?{kind:`missing`,path:n,home:c}:{kind:`unreadable`,...s,home:c}}function jk(e){let t=kk();return e.find(e=>Tk.some(n=>e===`${t}.${n}`))??`${t}.${Tk[0]}`}function Mk(e,t,n){let r=Ak(e,t,n),i=r.kind===`chain`?r.layers:[];return{path:r.home,above:i.filter(e=>e!==r.home),projectDir:e??null}}function Nk(e){return Pk(e).join(`
|
|
165
|
-
`)||null}function Pk(e){switch(e.kind){case`chain`:return e.unchecked.map(e=>`Config location could not be checked: ${e.path} — ${e.error}`);case`missing`:return[`Config file not found: ${e.path} — rendering the bundled default until it appears`];case`unreadable`:return[`Config file could not be read: ${e.path} — ${e.error} — rendering the bundled default until it can be`]}}function Fk(e,t){let n=Ok(e,t).filter(e=>Ek(e)===`present`),r=new Map;for(let e of n){let t=l.dirname(e),n=l.basename(e).replace(/\.(json5|json)$/,``),i=l.join(t,n);r.has(i)||r.set(i,[]),r.get(i).push(e)}let i=[...r.values()].filter(e=>e.length>1);return i.length===0?null:`config-extension collision: ${i.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function Ik(e){return`plugin ${e.path} was not loaded: ${e.reason}`}const Lk=new Set([`data`,`segments`,`helpers`,`actions`]),Rk=`plugin.json5`,zk=/^[a-z][a-z0-9_]*$/;function Bk(e){let t=l.basename(l.dirname(e));return zk.test(t)?t:void 0}const Vk=`plugins.`;function Hk(e){return`${Vk}${e}.data`}function Uk(e){try{return{ok:!0,value:e()}}catch(e){return{ok:!1,reason:Wk(e)}}}function Wk(e){return e instanceof pu?e.issues.map(e=>e.path===``||e.message.includes(e.path)?e.message:`${e.path}: ${e.message}`).join(`; `):e instanceof Error?e.message:String(e)}function Gk(e,t){return e.map(e=>l.resolve(l.dirname(t),Dk(e)))}function Kk(e,t,n,i){let a=new Map;return e.reduce((e,n)=>{let o=Bk(n),s=(t,r)=>{let i=new Map(e.rendering);return o!==void 0&&r!==e.config&&i.delete(o),{...e,config:r,rendering:i,dropped:[...e.dropped,{path:n,plugin:o,reason:t}]}};if(l.basename(n)!==`plugin.json5`){let t=`a plugin is a folder holding its ${Rk}, and the folder's name is the plugin's: move this file to <dir>/<name>/${Rk} and list that`;return s(t,o===void 0?e.config:Yk(Jk(e.config,o),o,{path:n,plugin:o,reason:t}))}if(o===void 0)return s(`its folder "${l.basename(l.dirname(n))}" is not a plugin name (one matching ${zk}: it prefixes every name the plugin declares)`,e.config);let c=a.get(o);if(c!==void 0)return s(`plugin "${o}" is already listed, from ${c}`,e.config);a.set(o,n);let u=Jk(e.config,o),d=Uk(()=>{let a=r.readFileSync(n,`utf-8`),s=Id(tA(n,o,{source:a,json:at.default.parse(a)},t),u);return i(s,o,u!==e.config),s});if(d.ok)return{...e,config:d.value,loaded:[...e.loaded,n],rendering:new Map([...e.rendering,[o,n]])};let f={path:n,plugin:o,reason:d.reason};return s(d.reason,Yk(u,o,f))},{config:n.config,rendering:n.rendering,loaded:[],dropped:[]})}function qk(e){let t=`${Vk}${e}.`;return e=>e.startsWith(t)}function Jk(e,t){let n=qk(t),r=e=>Object.fromEntries(Object.entries(e).filter(([e])=>!n(e)));return[e.variables,e.segments,e.helpers,e.actions].some(e=>Object.keys(e).some(n))?{...e,variables:r(e.variables),segments:r(e.segments),helpers:r(e.helpers),actions:r(e.actions)}:e}function Yk(e,t,n){return{...e,variables:{...e.variables,[Hk(t)]:{kind:`dropped`,reason:Ik(n),definition:n.path}}}}function Xk(e){return e.startsWith(`plugins.`)?e.slice(8).split(`.`)[0]:void 0}function Zk(e,t){let n=new Set([...Object.keys(e.config.variables),...Object.keys(e.config.segments)].map(Xk)),r=[...t,...e.dropped].filter(e=>e.plugin===void 0).map(e=>({definition:e.path,notice:Ik(e)}));return t=>{let i=Xk(t);if(i===void 0)return[];let a=e.config.variables[Hk(i)];return a?.kind===`dropped`?[{definition:a.definition,notice:a.reason}]:n.has(i)?[]:r}}function Qk(e,t){let n=Nb(e.presets).flatMap(t=>[...wu(Ib(e,t).node)]).flatMap(e=>e.kind===`segment`?[e]:[]),r=[...new Set([...n.map(e=>e.name),...Object.keys(e.segments)])].map(e=>({name:e,cause:t(e)})).filter(({cause:e})=>e.length>0),i=Object.fromEntries(r.map(({name:e,cause:t})=>[e,$k(e,t.map(e=>e.notice),n.filter(t=>t.name===e))])),a=t=>{let n=Xk(t),r=n===void 0?void 0:e.variables[Hk(n)];return r?.kind===`dropped`?{definition:r.definition,notice:r.reason}:void 0},o=Object.values(e.variables).some(e=>e.kind===`dropped`),s=o?Object.values(e.segments).flatMap(e=>[`template`,`bg`,`fg`,`when`].flatMap(t=>e[t]===void 0?[]:[e[t]])):[],c=o?Object.values(e.actions).flatMap(e=>`do`in e?[...e.do]:[]):[],l=(e,t)=>[...new Set(e)].flatMap(e=>{let n=e in t?void 0:a(e);return n===void 0?[]:[[e,n]]}),u=l([...s.flatMap(t=>Dx(t,e.helpers).map(e=>e.name)),...c],e.actions),d=l(s.flatMap(t=>[...kx(t,e.helpers)]),e.helpers),f=new Set([...r.flatMap(({cause:e})=>e.map(e=>e.definition)),...[...u,...d].map(([,e])=>e.definition)]);return{config:{...e,segments:{...e.segments,...i},actions:{...e.actions,...Object.fromEntries(u.map(([e])=>[e,{copy:`{{ .${Hk(Xk(e)??``)} }}`}]))},helpers:{...e.helpers,...Object.fromEntries(d.map(([e,t])=>[e,`{{ fail ${JSON.stringify(t.notice)} }}`]))}},reached:f}}function $k(e,t,n){let r=`⚠ ${e}: ${t.join(`; `)}`,i=new Map;for(let e of n)for(let[t,n]of Object.entries(e.settings??{})){let e=i.get(t);i.set(t,e===void 0?[n]:[...e,n])}let a=Object.fromEntries([...i].map(([e,t])=>[e,eA(e,t)]));return{template:`{{ ${JSON.stringify(r)} }}`,bg:`error`,description:`stands in for a segment whose plugin did not load`,settings:a}}function eA(e,t){let[n]=t,r=t.filter(e=>typeof e==`number`);return typeof n==`boolean`?{label:e,domain:`bool`,default:n}:typeof n==`number`?{label:e,domain:{min:Math.min(...r),max:Math.max(...r),step:1},default:n}:{label:e,domain:[...new Set(t.map(String))],default:n}}function tA(e,t,{source:n,json:r},{projectDir:i}){let a=[],o=()=>{throw new pu(e,a)};if(!Qu(r))return a.push({path:``,message:`a plugin definition must be an object, got ${$u(r)}`}),o();for(let e of Object.keys(r))Lk.has(e)||a.push({path:e,message:e===`plugin`?`a plugin definition does not name itself: its name is its folder's ("${t}") — remove "plugin"`:`a plugin definition may not declare "${e}". Expected only: ${[...Lk].join(`, `)}`});let s=iA(r.data,e,i,a);if(Qu(r.segments)||a.push({path:`segments`,message:`"segments" must be an object naming the plugin's segments`}),a.length>0||s===void 0)return o();let c={source:n,issues:a,allowedPalettes:new Set(jc()),groups:[]},l=Wf(c,`data`,{[Hk(t)]:{kind:`file`,path:s,parse:{json:!0},cache:{watch_file:s},default:{}}});for(let[e,t]of Object.entries(r.segments))Qu(t)&&`vars`in t&&a.push({path:`segments.${e}.vars`,message:`a plugin segment may not declare "vars": a plugin's only source is its data file`});let u={variables:l,segments:rA(t,Jp(c,r.segments,new Set)),helpers:rA(t,qO(c,r.helpers)),actions:rA(t,$D(c,r.actions))};for(let[e,t]of nA(u))try{Xb.parse(t)}catch(t){a.push({path:e,message:`Template parse error in ${e}: ${t.message}`})}return a.length>0&&o(),u}function*nA(e){for(let[t,n]of Object.entries(e.segments??{}))for(let e of[`template`,`bg`,`fg`,`when`]){let r=n[e];r!==void 0&&(yield[`segments.${t}.${e}`,r])}for(let[t,n]of Object.entries(e.helpers??{}))yield[`helpers.${t}`,`{{ define "${t}" }}${n}{{ end }}`];for(let[t,n]of Object.entries(e.actions??{}))`copy`in n&&(yield[`actions.${t}.copy`,n.copy]),`open`in n&&(yield[`actions.${t}.open`,n.open]),`preset`in n&&n.preset===`delete`&&(yield[`actions.${t}.name`,n.name])}function rA(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[`${Vk}${e}.${t}`,n]))}function iA(e,t,n,r){if(typeof e==`string`&&e!==``)return l.resolve(l.dirname(t),Dk(e));if(Qu(e)&&Object.keys(e).length===1&&typeof e.project==`string`&&e.project!==``){let t=e.project;if(l.isAbsolute(t)||t.startsWith(`~`)||l.normalize(t).split(l.sep)[0]===`..`){r.push({path:`data.project`,message:`data.project "${t}" must be a path inside the project, relative to its root (like ".lit/candybar.json"): no absolute path, "~" or ".."`});return}if(n===null){r.push({path:`data.project`,message:`data is read from the session's project, and this load has none`});return}return l.resolve(n,t)}r.push({path:`data`,message:`"data" must be the path of the plugin's JSON data file relative to this definition, or { project: "<path>" } relative to the session's project`})}function aA(e){let t=(process.env.XDG_DATA_DIRS||oA()).split(`:`).filter(e=>e!==``),n=process.env.XDG_DATA_HOME||l.join(h.homedir(),`.local`,`share`),r=[...[...t].reverse().map(e=>l.join(e,`cc-candybar`,`plugins`)),l.join(n,`cc-candybar`,`plugins`),...e===null?[]:[l.join(e,`.cc-candybar`,`plugins`)]];return r.filter((e,t)=>r.lastIndexOf(e)===t)}function oA(){let e=`/usr/local/share:/usr/share`;return process.platform===`darwin`?`${l.join(process.env.HOMEBREW_PREFIX||`/opt/homebrew`,`share`)}:${e}`:e}function sA(e){let t=aA(e),n=new Map,r=[],i=[];for(let e of t){let t=cA(e);if(`error`in t){r.push(t);continue}for(let r of t.folders)n.delete(r),n.set(r,l.join(e,r,Rk));for(let n of t.files)i.push({path:l.join(e,n),plugin:void 0,reason:`a plugin is a folder holding its ${Rk}: move this file to ${l.join(e,`<name>`,Rk)}`})}return{roots:t,definitions:[...n.values()],unchecked:r,strays:i}}function cA(e){try{let t=r.readdirSync(e,{withFileTypes:!0}).filter(e=>!e.name.startsWith(`.`)).sort((e,t)=>e.name<t.name?-1:+(e.name>t.name)),n=t=>t.isDirectory()||lA(e,t);return{folders:t.filter(n).map(e=>e.name),files:t.filter(e=>!n(e)).map(e=>e.name)}}catch(t){return t.code===`ENOENT`?{folders:[],files:[]}:{path:e,error:t.message}}}function lA(e,t){if(!t.isSymbolicLink())return!1;try{return r.statSync(l.join(e,t.name)).isDirectory()}catch{return!0}}function uA(e,t,n,i){return e===null?{...yA,config:Id(yA.raw,t)}:fA(e,r.readFileSync(e,`utf-8`),t,n,i)}const dA={projectDir:null,beneath:{dropped:[],rendering:new Map}};function fA(e,t,n,r,i){let a=SA(e,t,i,(t,a)=>{let o=Kk(Gk(t,e),r,{config:n,rendering:r.beneath.rendering},(t,n,r)=>_A(t,n,r,e,i)),s=Zk(o,r.beneath.dropped);return{inherited:new Set([...qp(o.config),...a.filter(e=>s(e).length>0)]),layer:{plugins:o,owning:s}}}),{plugins:o,owning:s}=a.layer,c=Qk(Id(a.raw,o.config),s);return{source:t,raw:a.raw,warnings:[...a.warnings,...o.dropped.map(Ik)],plugins:{loaded:o.loaded,dropped:o.dropped,reached:c.reached,rendering:o.rendering},config:c.config}}const pA=new WeakMap;function mA(e,t,n,r){let i=JSON.stringify([[...r??[]].sort(),e.map(e=>[e,hA(e)])]),a=pA.get(n)??new Map;pA.set(n,a);let o=String(t.projectDir),s=a.get(o);if(s?.key===i)return s.layer;let c=Kk(e,t,{config:n,rendering:new Map},(e,t,n)=>_A(e,t,n,`<installed plugins>`,r));return a.set(o,{key:i,layer:c}),c}function hA(e){try{let t=r.statSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch(e){return e.code??`unreadable`}}function gA(e,t,n,i,a=e=>r.readFileSync(e,`utf-8`),o){let s=sA(i.projectDir),c=mA(s.definitions,i,t,o),l={...c,dropped:[...c.dropped,...s.strays]};n.warned(s.unchecked.map(e=>`Plugin folder could not be listed: ${e.path} — ${e.error}`));let u=l.config,d=[];for(let t of e){n.entered(t);let e=d.at(-1)?.plugins,r=fA(t,a(t),d.at(-1)?.config??u,{...i,beneath:{dropped:[...l.dropped,...d.flatMap(e=>e.plugins.dropped)],rendering:e?.rendering??l.rendering}},o);n.warned(r.warnings),d.push({...r,path:t})}let f=new Set(d.flatMap(e=>[...e.plugins.reached])),p=e=>f.has(e.path),m=l.dropped.filter(p),h=l.dropped.filter(e=>!p(e));n.warned(m.map(Ik));let g={roots:s.roots,loaded:l.loaded,dropped:m,unreached:h,reached:f,rendering:d.at(-1)?.plugins.rendering??l.rendering},_=d.at(-1);if(_===void 0)return{layers:d,base:u,installed:g,config:bA(uA(null,u,dA),`<default>`,o)};try{return{layers:d,base:u,installed:g,config:bA(_,_.path,o)}}catch(e){for(let e of d.slice(0,-1))n.entered(e.path),bA(e,e.path,o);throw n.entered(_.path),e}}function _A(e,t,n,r,i){if(n){bA(vA(e),r,i);return}let a=qk(t),o=[],s={source:``,issues:o,allowedPalettes:new Set,groups:[]};if(xk(s,e,jx(e),a),Ck(s,e,a),o.length>0)throw new pu(r,o)}function vA(e){return{config:e,raw:{root:e.root,presets:e.presets},source:``}}const yA={raw:{},source:``,warnings:[],plugins:{loaded:[],dropped:[],reached:new Set,rendering:new Map}};function bA({config:e,raw:t,source:n},r=`<config>`,i=new Set(jc())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if($O(o,e,t),Ck(o,e),a.length>0)throw new pu(r,a);let s=Yb(e,a);if(a.length>0)throw new pu(r,a);return YD(hD(s))}function xA(e,t,n=new Set(jc()),r=CA){return SA(e,t,n,()=>({inherited:r,layer:null})).raw}function SA(e,t,n,r){let i=wA(e,t),a=gu(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(jc()),groups:[]};if(!Qu(i))throw new pu(e,[{path:``,message:`Config root must be an object, got ${$u(i)}`}],o);let{inherited:l,layer:u}=r(i.plugins===void 0?[]:DA({...c,issues:[]},i.plugins)??[],Qu(i.segments)?Object.keys(i.segments):[]),d=TA(c,i,l);if(s.length>0)throw new pu(e,s,o);return{raw:d,warnings:o,layer:u}}const CA=new Set;function wA(e,t){try{return at.default.parse(t)}catch(t){let n=t;throw new pu(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function TA(e,t,n){for(let n of Object.keys(t))EA.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...EA].join(`, `)}`,line:G(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Ef(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Wf(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Jp(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.
|
|
163
|
+
`,nT=`readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3`,rT={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function iT(e){let t=e[rT.socket]??``,n=e[rT.pane]??``;if(t===``||n===``)return null;let r=e[rT.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}function aT(e){let[t,...n]=e;return t===void 0?{ok:!0}:{ok:!1,reason:t,more:n}}const oT=rT.truecolor,sT={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[oT];return typeof n==`string`&&n!==``?{ok:!1,reason:`${oT} 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`,path:[`env`,oT],value:`1`}}}}}},cT={variable:`is never read`,action:`is never clicked`,helper:`is never called`,segment:`is in no preset`},lT={name:`config`,label:`config`,probe:({config:e})=>{switch(e.kind){case`failed`:{let[t=`the config failed to load`,...n]=[...e.error.split(`
|
|
164
|
+
`).map(e=>e.trim()).filter(e=>e!==``),...e.warnings];return{ok:!1,reason:t,more:n}}case`loaded`:return aT([...e.warnings,...e.unused.map(({kind:e,name:t})=>`${e} "${t}" ${cT[e]}`)])}}},uT="re-run `cc-candybar install`";function dT(e){if(e.kind===`failed`)return[`Launch Services could not be asked which app opens cc-candybar:// — ${e.reason}`];if(e.value===null)return[`no app is registered for cc-candybar:// — ${uT}`];let{app:t,missing:n}=e.value;return n.kind===`failed`?[`${t} opens cc-candybar://, but ${n.reason} — ${uT}`]:n.value.map(e=>`${e} is missing, and ${t} runs it — ${uT}`)}const fT=[lT,{name:`urlHandler`,label:`URL handler`,probe:({urlHandler:e})=>{switch(e.kind){case`unsupported`:return{ok:!0};case`unprobed`:return{ok:!1,reason:e.reason};case`arrived`:return e.handler===e.bar?{ok:!0}:{ok:!1,reason:e.handler===null?`the URL handler does not report its version, so it is older than the bar (${e.bar}) — ${uT}`:`the URL handler runs cc-candybar ${e.handler}; the bar runs ${e.bar} — ${uT}`};case`lost`:return aT([...dT(e.opener),e.unopened===null?`a cc-candybar:// link was opened and did not arrive at the daemon`:`a cc-candybar:// link could not be opened — ${e.unopened}`])}}},sT,{name:`effectRefresh`,label:`effect refresh`,probe:({effect:e,placementEffects:t,transitions:n,claudeSettings:r})=>{let i=[...e.kind===`decided`?e.value===`none`?[]:[`the bar wears the ${e.name} effect`]:[`a globals.effect rule can give the bar an effect`],...t.map(({placement:e,effect:t})=>`${e} wears the ${t} effect`),...n?[`placements fade in and dissolve out as they come and go`]:[]];if(i.length===0)return{ok:!0};let a=i.join(` and `),{path:o,statusLine:s}=r;switch(s.kind){case`absent`:return{ok:!1,reason:`${a}, and ${o} sets no statusLine — set "refreshInterval": 1 beside the statusLine command that runs the bar`};case`not-an-object`:return{ok:!1,reason:`${a}, and ${o} sets statusLine to ${JSON.stringify(s.value)}, not a statusLine object — re-run \`cc-candybar install\` to write one`};case`present`:break}let c=s.refreshInterval;return c===1?{ok:!0}:{ok:!1,reason:c===void 0?`${a}, but Claude Code redraws it only on events`:typeof c==`number`&&c>1?`${a}, but Claude Code redraws it only every ${c} s`:`${a}, but statusLine.refreshInterval is ${JSON.stringify(c)}, not a number of seconds Claude Code accepts (its minimum is 1)`,fix:{kind:`claude-settings`,path:[`statusLine`,`refreshInterval`],value:1}}}}];function pT(e){return fT.map(t=>({check:t,verdict:t.probe(e)}))}function mT(e){return fT.find(t=>t.name===e)}const hT=`${wp}doctor.`;function gT(e){let t=`${hT}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function _T(e,t=[]){return t.length===0?e:`${e} (+${t.length} more — run \`cc-candybar doctor\`)`}function vT(e){return e.flatMap(({check:e,verdict:t})=>{let n=gT(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:pl}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:_T(t.reason,t.more)},{key:n.fixable,value:t.fix===void 0?pl:fl}]})}const yT={copySession:{copy:`{{ .session.id }}`},copyResume:{copy:`{{ .resume_command }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},openConfig:{open:`{{ .config_path }}`}};function bT(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }}{{ if ne .resume_command "" }} {{ action "${t(`copyResume`)}" "⎘ resume" }}{{ end }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}{{ if ne .config_path "" }} {{ action "${t(`openConfig`)}" "↗ config" }}{{ end }}`,actions:Object.fromEntries(Object.entries(yT).map(([t,n])=>[`${e}${t}`,n]))}}const xT=`armed`,ST=`disarmed`,CT=`.armed`,wT=e=>e.endsWith(CT);function TT(e,t,n){let r=`${e}${CT}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${xT}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "✕" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:xT},[a]:{set:r,to:ST},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:ST}},disarm:a}}const ET=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function DT(e){return typeof e==`string`&&ET.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 OT(e){let t=DT(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const kT=[`/compact`,`/model`],AT=`/clear`;function jT(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=TT(`${e}clear`,{arm:AT,confirm:`${AT} ✓ confirm`},[n]);return{template:kT.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,when:`{{ ${$C} }}`,actions:{...Object.fromEntries(kT.map(e=>[t(e),{slash:OT(e)}])),...r.actions,[n]:{slash:OT(AT)}},variables:r.variables,disarm:r.disarm}}function MT(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:l.resolve(t,n)}function NT(e){return e??l.join(h.homedir(),`.claude`)}function PT(e){return l.join(e,`settings.json`)}function FT(e){return l.join(e,`plugins`,`installed_plugins.json`)}function IT(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function LT(e){let t;try{let n=IT(e);if(/^\s*$/.test(n))return{};t=Rl.parse(n)}catch(t){throw Error(`cannot read ${e}: ${zT(t)}`,{cause:t})}if(!RT(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const RT=e=>typeof e==`object`&&!!e&&!Array.isArray(e),zT=e=>e instanceof Error?e.message:String(e),BT=Array.from({length:10},(e,t)=>(t+1)*1e5),VT=BT[0],HT=BT[BT.length-1];function UT(e){let t;try{t=LT(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>=VT&&n<=HT?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${VT}–${HT} tokens)`)}function WT(e,t){let n=Math.min(t??HT,HT),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:BT.filter(e=>e<r).at(-1)??0,higher:BT.find(e=>e>r&&e<=n)??0}}function GT(e,t){return{template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}${t(`.autocompact.applied`)}{{ end }}{{ if ${$C} }}{{ if gt .autocompact.lower 0 }} {{ action (printf "${e}%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "${e}%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "${e}auto" "↺" }}{{ end }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`,actions:{[`${e}auto`]:{slash:OT(`/autocompact auto`)},...Object.fromEntries(BT.map(t=>[`${e}${t}`,{slash:OT(`/autocompact ${t}`)}]))}}}const KT=e=>`{{ if ge ${e} 1000000 }}{{ printf "%.1f" (divf ${e} 1000000) }}M{{ else if ge ${e} 1000 }}{{ printf "%.1f" (divf ${e} 1000) }}K{{ else }}{{ ${e} }}{{ end }}`,qT=`${wp}menu`,JT=`open`,YT=`${wp}edit`,XT=`${wp}toolbar`,ZT=bT(wp),QT=`${wp}commands`,$T=jT(`${QT}.`),eE=`${wp}autocompact`,tE=GT(`${eE}.`,KT),nE=e=>({kind:`segment`,name:e}),rE=`${wp}tab`,iE=[{member:`session`,label:`⚡ session`},{member:`look`,label:`🎨 look`},{member:`layout`,label:`📐 layout`},{member:`config`,label:`⚙ config`},{member:`tools`,label:`🧰 tools`}],aE=e=>`${rE}.${e}`,oE=e=>`${aE(e)}.toggle`,sE=e=>({variable:rE,key:rE,member:e}),cE=`${wp}save`,lE=`${wp}preset.save`,uE=`${wp}preset.delete`,dE=`${wp}themeDefault.save`,fE=`${wp}themeDefault.differs`,pE=`${wp}themeDefault.theme`,mE={when:`{{ .${fE} }}`,template:`{{ action "${dE}" (printf "⤓ default for %s" .${pE}) }}`},hE=`${wp}resetAll`,gE=`${qT}.toggle`,_E={variable:qT,key:qT,member:JT},vE=`${wp}undo`,yE=`${wp}back`,bE=`${yE}.step`,xE=`${wp}navigation.back`,SE=yE,CE={template:`{{ if gt .${xE} 0 }}{{ action "${yE}" "◁" }}{{ else }}{{ fg (${nT}) "◁" }}{{ end }}`},wE=`${wp}redo`,TE=`${wp}doctor`,EE=`${TE}.run`,DE=e=>`${TE}.fix.${e}`,OE=e=>`${TE}.${e}`,kE=wb(`${wp}pickers`),AE=[{template:`{{ themePreview }}`}],jE={template:`{{ layoutPreview }}`},ME={preset:[jE,{when:`{{ not .preset.bundled }}`,template:`{{ action "${uE}" (printf "🗑 delete %s" .${ew.preset.effectiveVar}) }}`}],theme:AE,style:AE,variation:[jE],shade:[jE]},NE=e=>`${wp}${e}`,PE=e=>`${wp}apply.${e}`,FE=e=>`${wp}reset.${e}`,IE=e=>`${wp}list.${e}`,LE=(e,t)=>`${IE(e)}.${t}`,RE=e=>`${wp}resettable.${e}`,zE=e=>e.length===0?`false`:`(or ${e.map(e=>`.${RE(e)}`).join(` `)})`,BE=Object.keys(ew).map(e=>{let t=ew[e],n=ff(t.configKey),r=Mw({label:t.label,domain:n},t.sessionKey,t.effectiveVar,PE(e),kE);return{...t,name:e,control:r,beneath:ME[e]??[]}}),VE={preset:`door`,theme:`look`,style:`look`,effect:`look`,variation:`look`,shade:`look`,endcaps:`look`,transitions:`look`,autoWrap:`layout`,padding:`layout`,updateNotice:`config`},HE=e=>BE.filter(t=>VE[t.name]===e),UE=e=>HE(e).map(tD);new Set(BE.flatMap(e=>[e.sessionKey,e.configKey]));const WE=TT(hE,{arm:`⟲`,confirm:`⟲ reset all?`},BE.map(e=>FE(e.name))),GE=[`unsaved`,`history.undo`,`history.redo`],KE=e=>`${wp}${e}`,qE=KE(`unsaved`),JE=(e,t)=>({body:t,shown:`(gt .${KE(e)} 0)`}),YE=[JE(`unsaved`,`{{ action "${cE}" (printf "💾 save %d" .${qE}) }}`),JE(`history.undo`,`{{ action "${vE}" "↶" }}`),JE(`history.redo`,`{{ action "${wE}" "↷" }}`),{body:WE.template,shown:`(or ${zE(BE.map(e=>e.name))} ${WE.armed})`}],XE={when:`{{ or ${YE.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+YE.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},ZE=[{step:WE,place:`door`},{step:$T,place:`session`}],QE=e=>e.map(e=>e.step.disarm),$E=QE(ZE),eD=QE(ZE.filter(e=>e.place!==`door`));function tD(e){let t=NE(e.name);return e.control.kind===`inline`?nE(t):Gd(t,e.control.list.ref,{kind:`container`,direction:`vertical`,children:[nE(IE(e.name)),...e.beneath.map((t,n)=>nE(LE(e.name,n)))]},`drop`)}function nD(e){return e===qT}function rD(e){let t=nE(qT);if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[rD(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 iD(e){return aD(e)>0?e:rD(e)}function aD(e){let t=0;for(let n of wu(e))n.kind===`segment`&&nD(n.name)&&(t+=1);return t}function oD(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&nD(e.name)||e.opens!==void 0&&oD(e.opens.body,!0):e.children.some(e=>oD(e,n))}const sD={session:{direction:`vertical`,content:[nE(XT),{kind:`container`,direction:`horizontal`,children:[nE(QT),nE(eE)]}],after:[]},look:{direction:`horizontal`,content:[],after:[nE(dE)]},layout:{direction:`horizontal`,content:[nE(lE),nE(YT)],after:[]},config:{direction:`horizontal`,content:[],after:[]},tools:{direction:`vertical`,content:[nE(TE),...fT.map(e=>nE(OE(e.name)))],after:[]}},cD=e=>({kind:`container`,direction:sD[e].direction,children:[...sD[e].content,...UE(e),...sD[e].after]});function lD(e){return e.kind===`segment`?nD(e.name)?Gd(e.name,_E,dD,`above`):e:pD(e)}function uD(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[nE(SE),...UE(`door`),nE(cE)]},{kind:`container`,direction:`horizontal`,children:iE.map(({member:e})=>Gd(aE(e),sE(e),cD(e),`drop`))}]}}const dD=uD();function fD(e){let t=new Map;for(let e of wu(dD))e.kind===`segment`&&e.opens!==void 0&&t.set(e.opens.ref.key,e.opens.ref.variable);return[...t].map(([t,n])=>{let r=e.variables[n];if(r?.kind!==`state`||r.default===void 0)throw Error(`settings menu: the door folds "${t}", but "${n}" is not a state variable the menu declares with a default`);let i=`${qT}.fold.${bp(t)}`;return e.actions[i]={set:t,to:r.default},i})}function pD(e){return{...e,children:e.children.map(e=>lD(e))}}function mD(e){let t={variables:{[qT]:Zd(qT,Bd)},actions:{[gE]:Qd(qT,JT),[EE]:{doctor:`run`},[YT]:{do:[...tx]},...ZT.actions,...$T.actions,...tE.actions,[cE]:{save:!0},[vE]:{undo:!0},[bE]:{back:!0},[yE]:{do:[bE,...$E]},[wE]:{redo:!0},[lE]:{preset:`save`},[dE]:{themeDefault:`save`},[uE]:{preset:`delete`,name:`{{ .${ew.preset.effectiveVar} }}`}},segments:{[qT]:{template:`{{ $door := ${Yd(qT,Xd(e),Xd(`✖`))} }}{{ if ${qd(_E)} }}{{ fg (keptOn (color "error") (bgOf)) $door }}{{ else }}{{ $door }}{{ end }}`},[XT]:{template:ZT.template},[QT]:{template:$T.template,when:$T.when},[eE]:{template:tE.template,bg:tE.bg,when:tE.when},[SE]:CE,[cE]:XE,[dE]:mE,[lE]:{template:`{{ action "${lE}" "+ preset" }}`},[TE]:{template:`{{ action "${EE}" "🩺 doctor" }}`},[YT]:{template:`{{ action "${YT}" "✎ arrange" "✎ done" }}`}}};t.variables[fE]={kind:`input`,path:`themeDefault.differs`,type:`boolean`,default:!1},t.variables[pE]={kind:`input`,path:`themeDefault.theme`,type:`string`,default:``},t.variables[xE]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of GE)t.variables[KE(e)]={kind:`input`,path:e,type:`number`,default:0};t.variables[rE]=Zd(rE,`session`);for(let{member:e,label:n}of iE){t.actions[oE(e)]=Qd(rE,e),t.actions[aE(e)]={do:[oE(e),...eD]};let r=zE(HE(e).map(e=>e.name)),i=`(ternary ${Xd(` •`)} "" ${r})`,a=e=>`(print ${Xd(e)} ${i})`;t.segments[aE(e)]={template:`{{ ${Yd(aE(e),a(n),a(`▾ ${n}`))} }}`}}return Object.assign(t.variables,$T.variables,WE.variables),gD(t),hD(t),t.actions[qT]={do:[gE,...$E,...fD(t)]},t}function hD(e){for(let t of fT){let n=gT(t.name),r=DE(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[OE(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${fl}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function gD(e){for(let t of BE){Object.assign(e.actions,t.control.actions);let n=FE(t.name);e.actions[n]={reset:t.configKey},e.variables[RE(t.name)]={kind:`input`,path:`resettable.${t.name}`,type:`boolean`,default:!1};let r=`{{ if .${RE(t.name)} }} {{ action "${n}" "↺" }}{{ end }}`;Object.assign(e.variables,t.control.variables),e.segments[NE(t.name)]={template:`${t.control.template}${r}`},t.control.kind===`picker`&&(e.segments[IE(t.name)]={template:t.control.list.template}),t.beneath.forEach((n,r)=>{e.segments[LE(t.name,r)]=n})}Object.assign(e.actions,WE.actions)}function _D(e){let{variables:t,actions:n}=ux();Object.assign(e.variables,t),Object.assign(e.actions,n)}function vD(e){let t=mD(e.globals.menuGlyph??`🍫`);_D(t);let n={...e.presets},r=[];for(let t of Nb(e.presets)){let{node:i}=Ib(e,t),a=lD(iD(i));r.push(a),n[t]={...Fb(e.presets,t),root:a}}let i=lw(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const yD=`${Cp}live`,bD=[`☐ live`,`☑ live`],xD=`${Cp}done`,SD=`${Cp}cancel`,CD=`${Cp}rewind`,wD=`${Cp}changes`,TD=`(gt .${wD} 0)`,ED=`(or ${TD} (gt .${qE} 0))`,DD={variable:yD,key:yD,member:`open`};function OD(e){return`${Cp}configuring.p${e}`}function kD(e){return`and ${qd(ax)} (not ${qd(DD)}) (ne .${OD(e)} "true")`}function AD(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${Qb} "${Wd(e)}")`).join(` `)} false }}`}}function jD(e,t,n){return`{{ if ${kD(e)} }}${t}{{ else }}${n}{{ end }}`}const MD=`{{ and ${qd(ax)} .preset.customized }}`,ND=Ep;function PD(e){return new Map([...Cw(e),...ID(e)])}const FD=`${Cp}addable`;function ID(e){return new Map([[FD,{members:Object.keys(e.segments).filter(e=>!ND(e)),library:{groups:vp.map(e=>({id:e,label:yp[e]})),entry:t=>{let n=e.segments[t];return{group:n.group??`other`,...n.description!==void 0&&{description:n.description}}}}}]])}function LD(e,t,n){return n.segments[e]={template:t,when:ox,bg:qw},{kind:`segment`,name:e}}function RD(e,t,n){let r=`${Cp}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${tc}`}) (action "${r}" "✖") }}`}function zD(e){return`{{ if ${qd(ax)} }}${e}{{ end }}`}function BD(e,t){return e.reduce((e,t)=>`{{ if and ${qd(ax)} ${qd(t)} }}true{{ else }}${e}{{ end }}`,t)}function VD(e){return e.flatMap(e=>[...wu(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function HD(e,t,n){return`${rx}${e}.${t}.${n}`}function UD(e,t,n,r){let i=bu(n),a=`${Cp}${e.presetIdent}`,o=ix(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`,c=wb(s),l=`${s}.fold`;e.artifacts.actions[l]={set:c,to:Bd},e.artifacts.actions[s]={do:[`${s}.open`,l]},e.artifacts.actions[`${s}.open`]={set:Qb,to:o};let u={},d=Object.entries(r).map(([r,o])=>{let s=HD(e.presetIdent,i,r),l=`${rx}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Vu(n.settings?.[r]??o.default)},u[r]={id:i,key:s,variable:l};let d=`${a}.setting.${t}.${r}`,f=Mw(Aw(o),s,l,d,c);if(Object.assign(e.artifacts.actions,f.actions),Object.assign(e.artifacts.variables,f.variables),f.kind===`inline`)return e.artifacts.segments[d]={template:f.template},{kind:`segment`,name:d};let p=`${d}.list`;return e.artifacts.segments[d]={template:f.template},e.artifacts.segments[p]={template:f.list.template},Gd(d,f.list.ref,{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:p}]},`drop`)});return{term:`{{ action "${s}" "⚙️" }}`,ref:{variable:Qb,key:Qb,member:o},body:{kind:`container`,direction:`vertical`,children:d},drafts:u}}const WD=`${Cp}label:`;function GD(e){if(e.startsWith(WD)){let t=e.slice(WD.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function KD(e,t,n,r){let{artifacts:i}=n,a=bu(e),o=`${WD}${a}:${e.name}`;i.segments[o]={template:`{{ "${Wd(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=Object.fromEntries(Iu.flatMap(t=>{let n=e.settings?.[t];return n===void 0?[]:[[t,n]]}));return{...Gd(o,r.ref,r.body,`drop`,BD([r.ref],`{{ ${kD(n.presetIdent)} }}`)),...Object.keys(s).length>0&&{settings:s},drafts:Object.fromEntries(Iu.map(e=>[e,r.drafts[e]]))}}function qD(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${Cp}${i}.insert.${t}`,s=`${Cp}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:FD,anchor:n,relation:r};let c=Sb(o),l=Cb(s,o,void 0),u=Eb(l),d=Tb(l,c);return a.variables[l]=Zd(l,Bd),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=Qd(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${qd({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${tc}`}) $m }}{{ end }}`}}function JD(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!ND(e.name)),i=e=>JD(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=Cu(o,i);if(ND(o.name)){n.push(s);continue}let c=bu(o),l=a===r?[qD(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=qD(t,u,c,`after`),f=RD(t,u,c),p=t.segments[o.name],m=UD(t,u,o,Lu(p)),h=zD(f),g=zD(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>LD(e.host,e.template,t.artifacts)),{...KD(o,p,t,m),lead:h,trail:g},{...s,when:jD(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},LD(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[_]}:_)}return{...e,children:n,...e.when!==void 0&&{when:BD(VD(n),jD(t.presetIdent,`true`,e.when))}}}function YD(e,t,n,r,i,a,o){let s=`${Cp}${t}.resetLayout`,c=`${Cp}${t}.customized`;return r.actions[s]={reset:n},r.segments[c]={template:`{{ action "${s}" "↺ reset layout" }}`,when:MD},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...i,{kind:`segment`,name:c},a]},XD(e,o)]}}function XD(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),XD(n,t)]}:{...e,children:[...e.children,t]}}function ZD(e,t,n,r,i,a){let{node:o}=Ib(e,t),s={presetIdent:bp(t),rootKey:Rw(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},c=JD(o,s);return n.variables[OD(s.presetIdent)]=AD(s.configured),YD(c,s.presetIdent,s.rootKey,n,r,i,a)}function QD(e){let t={variables:{},actions:{},segments:{}},n=Gw(`${Cp}help`,eT,[ax],t);t.variables[yD]=Zd(yD,Bd),t.actions[yD]=Qd(yD,DD.member),t.segments[yD]={template:Jd(yD,...bD),when:ox};let r={kind:`segment`,name:yD},i=n;t.variables[wD]={kind:`input`,path:`history.sinceEdit`,type:`number`,default:0},t.actions[xD]={do:[cE,...tx]},t.segments[xD]={template:`{{ if ${ED} }}{{ action "${xD}" "✓ save" }}{{ else }}{{ action "${xD}" "✓ done" }}{{ end }}`,when:ox},t.actions[CD]={rewind:!0},t.actions[SD]={do:[CD,...tx]},t.segments[SD]={template:`{{ action "${SD}" "↩ cancel" }}`,when:`{{ and ${qd(ax)} ${TD} }}`};let a=[{kind:`segment`,name:xD},{kind:`segment`,name:SD}],o={...e.presets},s=[];for(let n of Nb(e.presets)){let c=ZD(e,n,t,a,r,i);s.push(c),o[n]={...Fb(e.presets,n),root:c}}let c=lw(t,s,e);return{...e,variables:{...c,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:o}}const $D=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`rewind`,`save`,`preset`,`themeDefault`,`doctor`,`ceiling`,`slash`,`do`];function eO(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function tO(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function nO(e,t){if(t===void 0)return{};if(!Qu(t))return Q(e,`actions`,`actions must be an object, got ${$u(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=rO(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Q(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function rO(e,t,n){if(!Qu(n))return Q(e,t,`${t} must be an action object, got ${$u(n)}`),null;if(`persistWhen`in n)return Q(e,t,`${t}.persistWhen was removed: declare the \`set\` alone — a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=$D.filter(e=>e in n);return r.length===1?iO[r[0]](e,t,n):(Q(e,t,`action must declare exactly one of: ${$D.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const iO={set:(e,t,n)=>LO(e,t,n,`set`,NO),persist:(e,t,n)=>LO(e,t,n,`persist`,PO),copy:aO(`copy`),open:aO(`open`),reset:oO,undo:cO(`undo`),redo:cO(`redo`),back:cO(`back`),rewind:cO(`rewind`),save:cO(`save`),preset:lO,themeDefault:uO,doctor:dO,ceiling:fO,slash:pO,do:mO};function aO(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=qu(t,n,r,e);return i===null?null:{[e]:i}}}function oO(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=hO(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 sO={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,rewind:`it steps the session's settings history back to where edit mode opened`,save:`it saves the session's unsaved settings`};function cO(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Q(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${sO[e]}), got ${K(r[e])}`),null)}}function lO(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Q(e,`${t}.preset`,`preset must be "save" or "delete", got ${K(r)}`),null;if(r===`save`)return{preset:`save`};let a=qu(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function uO(e,t,n){for(let r of Object.keys(n))r!==`themeDefault`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a themeDefault action. Expected only: themeDefault`);return n.themeDefault===`save`?{themeDefault:`save`}:(Q(e,`${t}.themeDefault`,`themeDefault must be "save" (it saves the look the session draws as the active theme's default), got ${K(n.themeDefault)}`),null)}function dO(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Q(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${K(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||mT(a)===void 0?(Q(e,`${t}.check`,`doctor fix must name a check (have: ${fT.map(e=>e.name).join(`, `)}), got ${K(a)}`),null):{doctor:`fix`,check:a}}function fO(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Q(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${K(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Q(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${K(a)}`),null):{ceiling:`set`,to:a}}function pO(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=DT(n.slash);return r.kind===`refused`?(Q(e,`${t}.slash`,r.reason),null):{slash:r.line}}function mO(e,t,n){for(let r of Object.keys(n))r!==`do`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Q(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${K(r)}`),null):{do:r}}function hO(e,t,n,r,i,a){let o=qu(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Q(e,s,i),null):o.includes(`/`)?(Q(e,s,a(o)),null):o}const gO={set:`the SessionState key to write`,persist:`the config globals field to write`};function _O(e,t,n,r){let i=gO[r],a=hO(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 vO(e){return e===`set`?`set-state`:`set-config`}const yO={to:RO(`set`)},bO={to:RO(`persist`)},xO={from:zO(`set`)},SO={from:zO(`persist`)},CO={min:WO(),max:WO(),by:WO()},wO={int:VO()},TO={cycle:BO(`set`)},EO={cycle:BO(`persist`)},DO={removeSegment:HO(`removeSegment`)},OO={insertSegment:HO(`insertSegment`),anchor:HO(`anchor`),relation:UO()},kO={insertSegmentFrom:zO(`persist`),anchor:HO(`anchor`),relation:UO()},AO={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},jO={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function MO(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>nd(e,t,n,r),c=bd(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?ud(s,...n):s}}const NO=[MO(`set`,yO),MO(`set`,xO),MO(`set`,CO,[AO,jO]),MO(`set`,wO),MO(`set`,TO)],PO=[MO(`persist`,bO),MO(`persist`,SO),MO(`persist`,CO,[AO,jO]),MO(`persist`,EO),MO(`persist`,DO),MO(`persist`,OO,[],[`insertSegment`]),MO(`persist`,kO,[],[`insertSegmentFrom`])];function FO(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 IO(e){let t=FO(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 LO(e,t,n,r,i){let a=_O(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Q(e,t,`${IO(r)}${o.length>1?` — found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Q(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function RO(e){let t=vO(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>hO(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 zO(e){let t=vO(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Q(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Q(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Q(n,s,`${i} array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Q(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Q(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Q(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${K(o)}`)}}}function BO(e){let t=vO(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Q(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${$u(o)}`);return}let c=o;if(c.length<2){Q(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Q(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Q(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Q(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function VO(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Q(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${K(r[n])}`);return}return!0}}}function HO(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=qu(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Q(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Q(t,o,`${e} "${a}" contains "/" or ":" — segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function UO(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Q(e,`${t}.${n}`,`relation must be "before" or "after", got ${K(i)}`);return}return i}}}function WO(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Q(e,`${t}.${n}`,`${n} must be an integer, got ${K(i)}`);return}return i}}}function GO(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const KO={noun:`style key`,fields:{hueShift:md(),chromaScale:md({min:0}),lightnessScale:md(),lightnessShift:md()}};function qO(e,t){if(!Qu(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${$u(t)}`,line:G(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:G(e.source,[`styles`,r])});continue}if($c(r)){e.issues.push({path:`styles.${r}`,message:GO(`styles.${r}`,r,`globals.endcaps`),line:G(e.source,[`styles`,r])});continue}let t=ed(e,KO,`styles.${r}`,i);t!==null&&(n[r]={...sr,...t})}return n}const JO={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:_m(e,`${t}.${n}`,r[n])},globals:{required:!1,json:Of(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Df(e,`${t}.${n}`,r[n])}}};function YO(e,t){if(!Qu(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${$u(t)}`,line:G(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free — a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:G(e.source,[`presets`,r])});continue}let t=ed(e,JO,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function XO(e,t){if(t===void 0)return{};if(!Qu(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${$u(t)}`,line:G(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${K(i)}`,line:G(e.source,[`helpers`,r])});continue}n[r]=i}return n}const ZO=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 QO(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 $O(e){let t=ZO.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${QO(t)}`}function ek(e){let t=ZO.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${QO(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function tk(e,t){let n=new Map;for(let e of Object.keys(t)){let t=bp(e),r=n.get(t);r?r.push(e):n.set(t,[e])}for(let[t,r]of n)r.length<2||e.issues.push({path:`presets`,message:`preset names ${r.map(e=>JSON.stringify(e)).join(` and `)} both collapse to the same synthesis identifier "${t}" — edit mode's synthesized reset affordance would silently steal one preset's action for the other. Rename one.`,line:G(e.source,[`presets`])})}function nk(e,t,n){let r=[[[`globals`],t.globals.style,`globals.endcaps`],[[`editGlobals`],t.editGlobals.style,`editGlobals.endcaps`],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style,`presets.${e}.globals.endcaps`]),...Object.entries(t.themeDefaults).map(([e,t])=>[[`themeDefaults`,e],t.style,`globals.endcaps`])];for(let[n,i,a]of r){if(i===void 0||Lc(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:$c(i)?GO(r,i,a):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:G(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:G(e.source,[`globals`,`preset`])}),tk(e,t.presets),Tk(e,t);let i=jx(t);for(let t of i.names)t!==`settings`&&!t.startsWith(ak)||e.issues.push({path:`variables`,message:`variable "${t}" is named under "settings", which a segment's templates read as its placement's own settings (.settings.<name>) — rename it`,line:G(e.source,[`variables`,t])});let a=(t,n,r)=>{aD(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${qT}" ${aD(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}),oD(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${qT}" under a \`when\` or inside a disclosure body — the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),o(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell — everything inside a cell wears that cell's hue and shade, 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 wu(t)){if(e.kind!==`segment`)continue;let t=bu(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=Su(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" — an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function o(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>o(n,t||yu[e.direction]===`cell`))}let s=(n,r)=>{for(let[a,o]of Nd(n,r)){let n=G(e.source,o.split(`.`));if(a.when!==void 0&&(_k(e,`${o}.when`,a.when,i,{line:n}),gk(e,`${o}.when`,a.when,n)),a.kind===`segment`){if(nD(a.name)){(a.id!==void 0||a.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${qT}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${qT}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,a.name)||e.issues.push({path:o,message:`${r} entry "${a.name}" does not match any declared segment${Ap(a.name)}`,line:n}),pk(e,t,a,o,n)}}};n.root!==void 0&&s(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&s(t.root,`presets.${e}.root`);let c=new Map([[`root`,jd(t.root)]]);for(let e of Nb(t.presets)){let{node:n,path:r}=Ib(t,e);c.set(r,n)}for(let[t,n]of c)a(n,t,G(e.source,t.split(`.`)));wk(e,t,i,()=>!0)}const rk=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function ik(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=G(e.source,[`actions`,n,r]);if(!Nb(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${Nb(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(`, `)})${Ap(i)}`,line:c})},p=new Set(xu(Ib(t,a).node)),m=(r,i)=>{!kp.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${Ap(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 ak=`settings.`;function ok(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>ak+e)])}}function sk(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:G(e.source,[`segments`,t,`settings`,n])})},a=uk(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of zu(n,lk(n)))i(e,`the defaults do not stand together: ${t}`)}function ck(e){return uk(e).length>0||zu(e,lk(e)).length>0}function lk(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function uk(e){let t=t=>Ru(dk(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Ru(dk(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${fk(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 dk(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function fk(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Ru(n)!==void 0).map(([e])=>e)}function pk(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=Lu(a),s=`${r}: placement "${bu(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(`, `)})`:Bu(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Oc(a):``}, but it must be ${Wu(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])=>Bu(o[e],t))||ck(o)))for(let{message:t}of zu(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function mk(e,t,n,r,i){n.kind===`template`&&_k(e,`${t}.template`,n.template,r,{segCtx:i}),Mu(n)&&n.cache&&`key`in n.cache&&_k(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function hk(e,t,n,r,i){if(Mu(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.names.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.names.has(s)?` (segment-local vars are namespaced — write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:G(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function gk(e,t,n,r){try{Xb.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function _k(e,t,n,r,i){for(let[a,o]of Cx(n,r.helpers)){if(Ax(a,r))continue;if(a.startsWith(ak)){let n=o===null?``:` through helper "${o}"`,r=a.slice(9),s=i?.segCtx===void 0||i.settings===void 0?`Template reads ".${a}"${n}, but only a segment's own templates have settings — call it from a segment that declares "${r}"`:`Template reads ".${a}"${n}, but segment "${i.segCtx}" has no setting "${r}" (it has: ${Object.keys(i.settings).join(`, `)}) — declare it under segments.${i.segCtx}.settings`;e.issues.push({path:t,message:s,line:i?.line??G(e.source,t.split(`.`))});continue}if(o!==null){vk(e,o,`Template references unknown variable ".${a}"${ek(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&Ax(n,r)?` (segment-local vars are namespaced — write ".${n}")`:ek(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??G(e.source,t.split(`.`))})}}function vk(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:G(e.source,[`helpers`,t])})}function yk(e,t,n,r,i){let a=n.set,o=ff(ew[r].configKey),s=`${a} takes ${kw(o,i)}`;if(`min`in n&&(o===`bool`||`from`in o)){e.issues.push({path:`actions.${t}.min`,message:`actions.${t}: a stepper writes the integers from ${n.min} to ${n.max}, and ${a} is not an integer range; ${s}`,line:G(e.source,[`actions`,t,`min`])});return}let c=Sk(n,i);if(c===xk){e.issues.push({path:`actions.${t}.int`,message:`actions.${t}.int: an int cursor writes whatever integer the template binds, and a click outside the ${a} domain would change nothing; ${s}`,line:G(e.source,[`actions`,t,`int`])});return}let l=c.filter(e=>!Ow(o,e.value,i));if(l.length!==0){if(a===ew.style.sessionKey&&(`from`in n&&n.from===`endcaps`||c.every(e=>$c(e.value)))){let r=ew.endcaps.sessionKey;e.issues.push(`to`in n?{path:`actions.${t}.to`,message:GO(`actions.${t}.to`,n.to,`set: "${r}", to`),line:G(e.source,[`actions`,t,`to`])}:{path:`actions.${t}.set`,message:`actions.${t}.set: "${a}" here writes only endcaps shapes, not styles — endcaps were renamed from "style" to "endcaps"; write set: "${r}"`,line:G(e.source,[`actions`,t,`set`])});return}for(let n of new Set(l.map(e=>e.field))){let r=l.filter(e=>e.field===n).map(e=>JSON.stringify(e.value)),i=r.length<=bk?r.join(`, `):`${r.slice(0,bk).join(`, `)} and ${r.length-bk} more`,o=`actions.${t}.${n}`;e.issues.push({path:o,message:`${o}: ${i} ${r.length===1?`is`:`are`} outside the ${a} domain — a click would write it and nothing would change; ${s}`,line:G(e.source,[`actions`,t,n])})}}}const bk=3,xk=Symbol(`any integer`);function Sk(e,t){return`to`in e?[{field:`to`,value:e.to}]:`cycle`in e?e.cycle.map(e=>({field:`cycle`,value:e})):`from`in e?Tw(e.from,t).members.map(e=>({field:`from`,value:e})):`min`in e?[{field:`min`,value:String(e.min)},{field:`max`,value:String(e.max)}]:xk}function Ck(e,t){return Object.entries(e).filter(([e])=>t(e))}function wk(e,t,n,r){let i=PD(t),a=ww(i);for(let[n,o]of Ck(t.actions,r)){let[t,r]=`from`in o?[`from`,o.from]:`insertSegmentFrom`in o?[`insertSegmentFrom`,o.insertSegmentFrom]:[null,null];if(t!==null&&typeof r==`string`&&!a.includes(r)){e.issues.push({path:`actions.${n}.${t}`,message:`actions.${n} ${t}: references ${Dw(r,i)}`,line:G(e.source,[`actions`,n,t])});continue}if(!(`set`in o))continue;rw.has(o.set)&&e.issues.push({path:`actions.${n}.set`,message:`actions.${n} sets "${o.set}", which has no session pick — globals.${o.set} is set in the config file only, so a click would change nothing; write it with { persist: "${o.set}", … } instead`,line:G(e.source,[`actions`,n,`set`])});let s=sw.get(o.set);s!==void 0&&yk(e,n,o,s,i)}for(let[n,i]of Ck(t.actions,r))`do`in i&&i.do.forEach((r,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,r)?t.actions[r]:void 0,s=o===void 0?`references unknown action "${r}"`:`do`in o?`"${r}" is itself a do action — list its members here instead`:i.do.indexOf(r)===a?a>0&&tO(o)?`"${r}" 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:`"${r}" is listed twice — each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:G(e.source,[`actions`,n,`do`])})});for(let[n,i]of Ck(t.actions,r)){let r=`persist`in i?i.persist:`reset`in i?i.reset:null;if(r===null)continue;let a=`persist`in i?`persist`:`reset`,o=Hw(r);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" is not a config globals field (have: ${Mf().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, a "themeDefaults.<theme>.<shade|variation|style>" target, or a "presets.<name>.root" target`,line:G(e.source,[`actions`,n,a])});continue}let s=rk.filter(e=>e in i);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" is not a "presets.<name>.root" target — ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){ik(e,t,n,a,r,o.preset,i);continue}if(o.scope===`preset-globals`&&!Nb(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" names preset "${o.preset}" which is not declared (have: ${Nb(t.presets).join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`theme-default`&&!e.allowedPalettes.has(o.theme)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" names theme "${o.theme}" which is not installed${Oc(o.theme)} (have: ${[...e.allowedPalettes].sort().join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${Ap(o.segment)}`,line:G(e.source,[`actions`,n,a])});continue}`min`in i&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${r}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:G(e.source,[`actions`,n,a])})}}for(let[i,a]of Ck(t.variables,r)){mk(e,`variables.${i}`,a,n);let t=$O(i);t!==void 0&&e.issues.push({path:`variables.${i}`,message:t,line:G(e.source,[`variables`,i])})}for(let[i,a]of Ck(t.segments,r)){if(a.vars)for(let[t,r]of Object.entries(a.vars))mk(e,`segments.${i}.vars.${t}`,r,n,i);let r=Lu(a);sk(e,i,r);let o=ok(n,r);for(let n of[`template`,`bg`,`fg`,`when`]){let s=a[n];if(typeof s==`string`){_k(e,`segments.${i}.${n}`,s,o,{segCtx:i,settings:r});for(let{name:r,site:a,via:o}of Dx(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=a===`options`?` (in a picker, menu or carousel)`:``;if(o!==null){vk(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${i}.${n}`,message:`${n} references unknown action "${r}"${s}`,line:G(e.source,[`segments`,i,n])})}}}}for(let[i,a]of Ck(t.variables,r))hk(e,`variables.${i}`,a,n);for(let[i,a]of Ck(t.segments,r))if(a.vars)for(let[t,r]of Object.entries(a.vars))hk(e,`segments.${i}.vars.${t}`,r,n,i)}function Tk(e,t){let n=new Set;for(let r of Nb(t.presets)){let i=Lb(t,r),a=[{},t.editGlobals];for(let o of a){let a=o.charset??i.charset??`unicode`,s=o.default_separator??i.default_separator;if(a!==`ascii`||nl(s??``))continue;let c=o.default_separator===void 0?Fb(t.presets,r).globals?.default_separator===void 0?[`globals`]:[`presets`,r,`globals`]:[`editGlobals`],l=[...c,`default_separator`].join(`.`);n.has(l)||(n.add(l),e.issues.push({path:l,message:`${l} ${JSON.stringify(s)} is not ASCII, but charset is "ascii" — under ascii a joiner draws only ASCII; write an ASCII separator or set charset: "unicode"`,line:G(e.source,[...c,`default_separator`])}))}}}function Ek(e,t,n=()=>!0){let{graph:r,nodeInfo:i}=Dk(t),a=new Map,o=[];for(let e of r.keys())a.set(e,0);for(let e of r.keys())if(!(!n(e)||a.get(e)!==0)&&s(e))return;function s(t){a.set(t,1),o.push(t);for(let c of r.get(t)??[]){if(!n(c))continue;let t=a.get(c);if(t===1){let t=o.indexOf(c),n=[...o.slice(t),c],r=n[0],a=i.get(r);return e.issues.push({path:a?.declarationPath??`variables.${r}`,message:`Dependency cycle: ${n.join(` → `)}`,line:G(e.source,a?.linePathParts??[`variables`,r])}),!0}if(t===0&&s(c))return!0}return a.set(t,2),o.pop(),!1}}function Dk(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 Cx(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),Mu(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 Ok=[`json5`,`json`];function kk(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Ak(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?h.homedir()+e.slice(1):e}function jk(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Ok.map(t=>l.join(e,`.cc-candybar.${t}`)):[],...Ok.map(e=>l.join(r,`.cc-candybar.${e}`)),...Ok.map(e=>`${Mk()}.${e}`)])]}function Mk(){let e=process.env.XDG_CONFIG_HOME??l.join(h.homedir(),`.config`);return l.join(e,`cc-candybar`,`config`)}function Nk(e,t,n){let i=[],a=new Map;for(let o of jk(e,t,n)){let e=kk(o);if(e===`absent`)continue;if(e!==`present`){i.push(e);continue}let t=l.join(r.realpathSync(l.dirname(o)),l.basename(o).replace(/\.(json5|json)$/,``));a.has(t)||a.set(t,o)}let o=[...a.values()].reverse();if(n===void 0)return{kind:`chain`,layers:o,home:Pk(o),unchecked:i};let[s]=i,c=n;return o.length>0?{kind:`chain`,layers:o,home:c,unchecked:i}:s===void 0?{kind:`missing`,path:n,home:c}:{kind:`unreadable`,...s,home:c}}function Pk(e){let t=Mk();return e.find(e=>Ok.some(n=>e===`${t}.${n}`))??`${t}.${Ok[0]}`}function Fk(e,t,n){let r=Nk(e,t,n),i=r.kind===`chain`?r.layers:[];return{path:r.home,above:i.filter(e=>e!==r.home),projectDir:e??null,cwd:t??null}}function Ik(e){return Lk(e).join(`
|
|
165
|
+
`)||null}function Lk(e){switch(e.kind){case`chain`:return e.unchecked.map(e=>`Config location could not be checked: ${e.path} — ${e.error}`);case`missing`:return[`Config file not found: ${e.path} — rendering the bundled default until it appears`];case`unreadable`:return[`Config file could not be read: ${e.path} — ${e.error} — rendering the bundled default until it can be`]}}function Rk(e,t){let n=jk(e,t).filter(e=>kk(e)===`present`),r=new Map;for(let e of n){let t=l.dirname(e),n=l.basename(e).replace(/\.(json5|json)$/,``),i=l.join(t,n);r.has(i)||r.set(i,[]),r.get(i).push(e)}let i=[...r.values()].filter(e=>e.length>1);return i.length===0?null:`config-extension collision: ${i.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function zk(e){return`plugin ${e.path} was not loaded: ${e.reason}`}const Bk=new Set([`data`,`segments`,`helpers`,`actions`]),Vk=`plugin.json5`,Hk=/^[a-z][a-z0-9_]*$/;function Uk(e){let t=l.basename(l.dirname(e));return Hk.test(t)?t:void 0}const Wk=`plugins.`;function Gk(e){return`${Wk}${e}.data`}function Kk(e){try{return{ok:!0,value:e()}}catch(e){return{ok:!1,reason:qk(e)}}}function qk(e){return e instanceof pu?e.issues.map(e=>e.path===``||e.message.includes(e.path)?e.message:`${e.path}: ${e.message}`).join(`; `):e instanceof Error?e.message:String(e)}function Jk(e,t){return e.map(e=>l.resolve(l.dirname(t),Ak(e)))}function Yk(e,t,n,i){let a=new Map;return e.reduce((e,n)=>{let o=Uk(n),s=(t,r)=>{let i=new Map(e.rendering);return o!==void 0&&r!==e.config&&i.delete(o),{...e,config:r,rendering:i,dropped:[...e.dropped,{path:n,plugin:o,reason:t}]}};if(l.basename(n)!==`plugin.json5`){let t=`a plugin is a folder holding its ${Vk}, and the folder's name is the plugin's: move this file to <dir>/<name>/${Vk} and list that`;return s(t,o===void 0?e.config:Qk(Zk(e.config,o),o,{path:n,plugin:o,reason:t}))}if(o===void 0)return s(`its folder "${l.basename(l.dirname(n))}" is not a plugin name (one matching ${Hk}: it prefixes every name the plugin declares)`,e.config);let c=a.get(o);if(c!==void 0)return s(`plugin "${o}" is already listed, from ${c}`,e.config);a.set(o,n);let u=Zk(e.config,o),d=Kk(()=>{let a=r.readFileSync(n,`utf-8`),s=Id(iA(n,o,{source:a,json:at.default.parse(a)},t),u);return i(s,o,u!==e.config),s});if(d.ok)return{...e,config:d.value,loaded:[...e.loaded,n],rendering:new Map([...e.rendering,[o,n]])};let f={path:n,plugin:o,reason:d.reason};return s(d.reason,Qk(u,o,f))},{config:n.config,rendering:n.rendering,loaded:[],dropped:[]})}function Xk(e){let t=`${Wk}${e}.`;return e=>e.startsWith(t)}function Zk(e,t){let n=Xk(t),r=e=>Object.fromEntries(Object.entries(e).filter(([e])=>!n(e)));return[e.variables,e.segments,e.helpers,e.actions].some(e=>Object.keys(e).some(n))?{...e,variables:r(e.variables),segments:r(e.segments),helpers:r(e.helpers),actions:r(e.actions)}:e}function Qk(e,t,n){return{...e,variables:{...e.variables,[Gk(t)]:{kind:`dropped`,reason:zk(n),definition:n.path}}}}function $k(e){return e.startsWith(`plugins.`)?e.slice(8).split(`.`)[0]:void 0}function eA(e,t){let n=new Set([...Object.keys(e.config.variables),...Object.keys(e.config.segments)].map($k)),r=[...t,...e.dropped].filter(e=>e.plugin===void 0).map(e=>({definition:e.path,notice:zk(e)}));return t=>{let i=$k(t);if(i===void 0)return[];let a=e.config.variables[Gk(i)];return a?.kind===`dropped`?[{definition:a.definition,notice:a.reason}]:n.has(i)?[]:r}}function tA(e,t){let n=Nb(e.presets).flatMap(t=>[...wu(Ib(e,t).node)]).flatMap(e=>e.kind===`segment`?[e]:[]),r=[...new Set([...n.map(e=>e.name),...Object.keys(e.segments)])].map(e=>({name:e,cause:t(e)})).filter(({cause:e})=>e.length>0),i=Object.fromEntries(r.map(({name:e,cause:t})=>[e,nA(e,t.map(e=>e.notice),n.filter(t=>t.name===e))])),a=t=>{let n=$k(t),r=n===void 0?void 0:e.variables[Gk(n)];return r?.kind===`dropped`?{definition:r.definition,notice:r.reason}:void 0},o=Object.values(e.variables).some(e=>e.kind===`dropped`),s=o?Object.values(e.segments).flatMap(e=>[`template`,`bg`,`fg`,`when`].flatMap(t=>e[t]===void 0?[]:[e[t]])):[],c=o?Object.values(e.actions).flatMap(e=>`do`in e?[...e.do]:[]):[],l=(e,t)=>[...new Set(e)].flatMap(e=>{let n=e in t?void 0:a(e);return n===void 0?[]:[[e,n]]}),u=l([...s.flatMap(t=>Dx(t,e.helpers).map(e=>e.name)),...c],e.actions),d=l(s.flatMap(t=>[...kx(t,e.helpers)]),e.helpers),f=new Set([...r.flatMap(({cause:e})=>e.map(e=>e.definition)),...[...u,...d].map(([,e])=>e.definition)]);return{config:{...e,segments:{...e.segments,...i},actions:{...e.actions,...Object.fromEntries(u.map(([e])=>[e,{copy:`{{ .${Gk($k(e)??``)} }}`}]))},helpers:{...e.helpers,...Object.fromEntries(d.map(([e,t])=>[e,`{{ fail ${JSON.stringify(t.notice)} }}`]))}},reached:f}}function nA(e,t,n){let r=`⚠ ${e}: ${t.join(`; `)}`,i=new Map;for(let e of n)for(let[t,n]of Object.entries(e.settings??{})){let e=i.get(t);i.set(t,e===void 0?[n]:[...e,n])}let a=Object.fromEntries([...i].map(([e,t])=>[e,rA(e,t)]));return{template:`{{ ${JSON.stringify(r)} }}`,bg:`error`,description:`stands in for a segment whose plugin did not load`,settings:a}}function rA(e,t){let[n]=t,r=t.filter(e=>typeof e==`number`);return typeof n==`boolean`?{label:e,domain:`bool`,default:n}:typeof n==`number`?{label:e,domain:{min:Math.min(...r),max:Math.max(...r),step:1},default:n}:{label:e,domain:[...new Set(t.map(String))],default:n}}function iA(e,t,{source:n,json:r},{checkout:i}){let a=[],o=()=>{throw new pu(e,a)};if(!Qu(r))return a.push({path:``,message:`a plugin definition must be an object, got ${$u(r)}`}),o();for(let e of Object.keys(r))Bk.has(e)||a.push({path:e,message:e===`plugin`?`a plugin definition does not name itself: its name is its folder's ("${t}") — remove "plugin"`:`a plugin definition may not declare "${e}". Expected only: ${[...Bk].join(`, `)}`});let s=sA(r.data,e,i,a);if(Qu(r.segments)||a.push({path:`segments`,message:`"segments" must be an object naming the plugin's segments`}),a.length>0||s===void 0)return o();let c={source:n,issues:a,allowedPalettes:new Set(jc()),groups:[]},l=Wf(c,`data`,{[Gk(t)]:{kind:`file`,path:s,parse:{json:!0},cache:{watch_file:s},default:{}}});for(let[e,t]of Object.entries(r.segments))Qu(t)&&`vars`in t&&a.push({path:`segments.${e}.vars`,message:`a plugin segment may not declare "vars": a plugin's only source is its data file`});let u={variables:l,segments:oA(t,Jp(c,r.segments,new Set)),helpers:oA(t,XO(c,r.helpers)),actions:oA(t,nO(c,r.actions))};for(let[e,t]of aA(u))try{Xb.parse(t)}catch(t){a.push({path:e,message:`Template parse error in ${e}: ${t.message}`})}return a.length>0&&o(),u}function*aA(e){for(let[t,n]of Object.entries(e.segments??{}))for(let e of[`template`,`bg`,`fg`,`when`]){let r=n[e];r!==void 0&&(yield[`segments.${t}.${e}`,r])}for(let[t,n]of Object.entries(e.helpers??{}))yield[`helpers.${t}`,`{{ define "${t}" }}${n}{{ end }}`];for(let[t,n]of Object.entries(e.actions??{}))`copy`in n&&(yield[`actions.${t}.copy`,n.copy]),`open`in n&&(yield[`actions.${t}.open`,n.open]),`preset`in n&&n.preset===`delete`&&(yield[`actions.${t}.name`,n.name])}function oA(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[`${Wk}${e}.${t}`,n]))}function sA(e,t,n,r){if(typeof e==`string`&&e!==``)return l.resolve(l.dirname(t),Ak(e));if(Qu(e)&&Object.keys(e).length===1&&typeof e.checkout==`string`&&e.checkout!==``){let t=e.checkout;if(l.isAbsolute(t)||t.startsWith(`~`)||l.normalize(t).split(l.sep)[0]===`..`){r.push({path:`data.checkout`,message:`data.checkout "${t}" must be a path inside the checkout, relative to its root (like ".lit/statusline.json"): no absolute path, "~" or ".."`});return}if(n===null){r.push({path:`data.checkout`,message:`data is read from the session's checkout, and this load has no session`});return}return l.resolve(n.root,t)}if(Qu(e)&&`project`in e){r.push({path:`data.project`,message:`data: { project } is now data: { checkout }: the same path, relative to the root of the git checkout the session works in (a linked worktree is its own checkout)`});return}r.push({path:`data`,message:`"data" must be the path of the plugin's JSON data file relative to this definition, or { checkout: "<path>" } relative to the root of the session's checkout`})}function cA(e){let t=(process.env.XDG_DATA_DIRS||lA()).split(`:`).filter(e=>e!==``),n=process.env.XDG_DATA_HOME||l.join(h.homedir(),`.local`,`share`),r=[...[...t].reverse().map(e=>l.join(e,`cc-candybar`,`plugins`)),l.join(n,`cc-candybar`,`plugins`),...e===null?[]:[l.join(e,`.cc-candybar`,`plugins`)]];return r.filter((e,t)=>r.lastIndexOf(e)===t)}function lA(){let e=`/usr/local/share:/usr/share`;return process.platform===`darwin`?`${l.join(process.env.HOMEBREW_PREFIX||`/opt/homebrew`,`share`)}:${e}`:e}function uA(e){let t=cA(e),n=new Map,r=[],i=[];for(let e of t){let t=dA(e);if(`error`in t){r.push(t);continue}for(let r of t.folders)n.delete(r),n.set(r,l.join(e,r,Vk));for(let n of t.files)i.push({path:l.join(e,n),plugin:void 0,reason:`a plugin is a folder holding its ${Vk}: move this file to ${l.join(e,`<name>`,Vk)}`})}return{roots:t,definitions:[...n.values()],unchecked:r,strays:i}}function dA(e){try{let t=r.readdirSync(e,{withFileTypes:!0}).filter(e=>!e.name.startsWith(`.`)).sort((e,t)=>e.name<t.name?-1:+(e.name>t.name)),n=t=>t.isDirectory()||fA(e,t);return{folders:t.filter(n).map(e=>e.name),files:t.filter(e=>!n(e)).map(e=>e.name)}}catch(t){return t.code===`ENOENT`?{folders:[],files:[]}:{path:e,error:t.message}}}function fA(e,t){if(!t.isSymbolicLink())return!1;try{return r.statSync(l.join(e,t.name)).isDirectory()}catch{return!0}}function pA(e,t,n,i){return e===null?{...SA,config:Id(SA.raw,t)}:hA(e,r.readFileSync(e,`utf-8`),t,n,i)}const mA={projectDir:null,checkout:null,beneath:{dropped:[],rendering:new Map}};function hA(e,t,n,r,i){let a=TA(e,t,i,(t,a)=>{let o=Yk(Jk(t,e),r,{config:n,rendering:r.beneath.rendering},(t,n,r)=>bA(t,n,r,e,i)),s=eA(o,r.beneath.dropped);return{inherited:new Set([...qp(o.config),...a.filter(e=>s(e).length>0)]),layer:{plugins:o,owning:s}}}),{plugins:o,owning:s}=a.layer,c=tA(Id(a.raw,o.config),s);return{source:t,raw:a.raw,warnings:[...a.warnings,...o.dropped.map(zk)],plugins:{loaded:o.loaded,dropped:o.dropped,reached:c.reached,rendering:o.rendering},config:c.config}}const gA=new WeakMap;function _A(e,t,n,r){let i=JSON.stringify([[...r??[]].sort(),e.map(e=>[e,vA(e)])]),a=gA.get(n)??new Map;gA.set(n,a);let o=JSON.stringify([t.projectDir,t.checkout?.root??null]),s=a.get(o);if(s?.key===i)return s.layer;let c=Yk(e,t,{config:n,rendering:new Map},(e,t,n)=>bA(e,t,n,`<installed plugins>`,r));return a.set(o,{key:i,layer:c}),c}function vA(e){try{let t=r.statSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch(e){return e.code??`unreadable`}}function yA(e,t,n,i,a=e=>r.readFileSync(e,`utf-8`),o){let s={projectDir:i.projectDir,checkout:i.cwd===null?null:BS(i.cwd)},c=uA(s.projectDir),l=_A(c.definitions,s,t,o),u={...l,dropped:[...l.dropped,...c.strays]};n.warned(c.unchecked.map(e=>`Plugin folder could not be listed: ${e.path} — ${e.error}`));let d=u.config,f=[];for(let t of e){n.entered(t);let e=f.at(-1)?.plugins,r=hA(t,a(t),f.at(-1)?.config??d,{...s,beneath:{dropped:[...u.dropped,...f.flatMap(e=>e.plugins.dropped)],rendering:e?.rendering??u.rendering}},o);n.warned(r.warnings),f.push({...r,path:t})}let p=new Set(f.flatMap(e=>[...e.plugins.reached])),m=e=>p.has(e.path),h=u.dropped.filter(m),g=u.dropped.filter(e=>!m(e));n.warned(h.map(zk));let _={checkout:s.checkout,roots:c.roots,loaded:u.loaded,dropped:h,unreached:g,reached:p,rendering:f.at(-1)?.plugins.rendering??u.rendering},v=f.at(-1);if(v===void 0)return{layers:f,base:d,installed:_,config:CA(pA(null,d,mA),`<default>`,o)};try{return{layers:f,base:d,installed:_,config:CA(v,v.path,o)}}catch(e){for(let e of f.slice(0,-1))n.entered(e.path),CA(e,e.path,o);throw n.entered(v.path),e}}function bA(e,t,n,r,i){if(n){CA(xA(e),r,i);return}let a=Xk(t),o=[],s={source:``,issues:o,allowedPalettes:new Set,groups:[]};if(wk(s,e,jx(e),a),Ek(s,e,a),o.length>0)throw new pu(r,o)}function xA(e){return{config:e,raw:{root:e.root,presets:e.presets},source:``}}const SA={raw:{},source:``,warnings:[],plugins:{loaded:[],dropped:[],reached:new Set,rendering:new Map}};function CA({config:e,raw:t,source:n},r=`<config>`,i=new Set(jc())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(nk(o,e,t),Ek(o,e),a.length>0)throw new pu(r,a);let s=Yb(e,a);if(a.length>0)throw new pu(r,a);return QD(vD(s))}function wA(e,t,n=new Set(jc()),r=EA){return TA(e,t,n,()=>({inherited:r,layer:null})).raw}function TA(e,t,n,r){let i=DA(e,t),a=gu(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(jc()),groups:[]};if(!Qu(i))throw new pu(e,[{path:``,message:`Config root must be an object, got ${$u(i)}`}],o);let{inherited:l,layer:u}=r(i.plugins===void 0?[]:AA({...c,issues:[]},i.plugins)??[],Qu(i.segments)?Object.keys(i.segments):[]),d=OA(c,i,l);if(s.length>0)throw new pu(e,s,o);return{raw:d,warnings:o,layer:u}}const EA=new Set;function DA(e,t){try{return at.default.parse(t)}catch(t){let n=t;throw new pu(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function OA(e,t,n){for(let n of Object.keys(t))kA.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...kA].join(`, `)}`,line:G(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Ef(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Wf(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Jp(e,t.segments,n)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported — use "root" with the A-grammar instead.
|
|
166
166
|
Replace: layout: [["seg1", "seg2"], ["seg3"]]
|
|
167
167
|
With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
|
|
168
|
-
Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=_m(e,`root`,t.root)),t.actions!==void 0&&(r.actions
|
|
169
|
-
`)}function
|
|
170
|
-
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const
|
|
171
|
-
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function
|
|
172
|
-
`)}function
|
|
173
|
-
`)}]}function
|
|
174
|
-
`),process.exit(1));let t;try{t=
|
|
175
|
-
`),process.exit(1)}function
|
|
168
|
+
Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=_m(e,`root`,t.root)),t.actions!==void 0&&(r.actions=nO(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" — move the block under styles: { … } (and globals.look to globals.style)`,line:G(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=qO(e,t.styles)),t.themeDefaults!==void 0&&(r.themeDefaults=Tf(e,t.themeDefaults)),t.presets!==void 0&&(r.presets=YO(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=kf(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=XO(e,t.helpers)),t.plugins!==void 0&&(r.plugins=AA(e,t.plugins)),Tm(e,r),qb(e,r),lx(e,r),Op(e,r,wp,`the global settings menu`),r}const kA=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`themeDefaults`,`presets`,`editGlobals`,`helpers`,`plugins`]);function AA(e,t){if(Array.isArray(t)&&t.every(e=>typeof e==`string`&&e!==``))return t;e.issues.push({path:`plugins`,message:`"plugins" must be a list of plugin definition paths, got ${$u(t)}`,line:G(e.source,[`plugins`])})}function jA(e){let t=LA(e.termCols),n=LA(e.termRows),r=RA(e.ssh),i=FA(e.tmux),a=PA(e.configEnv),o=NA(e.claudeConfigDir),s=MA(e.mementoEnv);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o},...s!==void 0&&{mementoEnv:s}}}function MA(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=$e.filter(e=>t[e]!==void 0);return n.every(e=>NA(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function NA(e){return typeof e==`string`&&l.isAbsolute(e)?e:void 0}function PA(e){return typeof e==`string`&&e!==``?Ak(e):void 0}function FA(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 IA=1e4;function LA(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>IA?IA:t}function RA(e){return typeof e==`boolean`?e:void 0}function zA(e){return typeof e==`string`&&e!==``&&e.length<=64?e:null}var BA=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function VA(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function HA(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 BA(`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 BA(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function UA(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=HA(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(VA(t))})}async function WA(e,t,n){let r=null;try{r=await YA(ze(),t.connectMs);let i=await UA(r,{v:3,...e},t.budgetMs);return qA(e.kind,i,n)}catch(e){return JA(e)}finally{r&&r.destroy()}}function GA(e,t){return typeof e==`string`?e:t}function KA(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function qA(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=GA(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:KA(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 JA(e){if(e instanceof BA||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 YA(e,t){return new Promise((n,r)=>{let i=x.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function XA(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 ZA=`1.129.0`,QA={connectMs:50,budgetMs:150},$A={connectMs:50,budgetMs:200};function ej(e){let t=e.output;return typeof t==`string`?t:void 0}function tj(e,t,n,r){return WA({kind:`render`,hookData:e,args:t,cwd:n,...r},QA,ej)}function nj(e,t){return WA({kind:`click`,verb:e,value:t,clientVersion:ZA},$A,ej)}function rj(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable — ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
|
|
169
|
+
`)}function ij(e,t){return e===`darwin`?[aj(`footprint`,[`-p`,String(t)]),aj(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[oj(`/proc/self/smaps_rollup`),oj(`/proc/self/status`)]:[]}function aj(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=O({bin:e,args:[...t],timeoutMs:5e3,category:`limits.memory-report`});return n.ok?n.stdout.trim().length>0?{kind:`text`,text:n.stdout}:{kind:`unavailable`,reason:`exited 0 but printed nothing`}:{kind:`unavailable`,reason:`${n.reason}${n.error===void 0?``:`: ${n.error}`}${sj(n.stderr)}`}}}}function oj(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 sj(e){let t=e.split(`
|
|
170
|
+
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const cj=`CC_CANDYBAR_RSS_LIMIT_MB`;function lj(e){let t=e[cj];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${cj} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function uj(e){return lj(e)*2}const dj=1024*1024;function fj(e){return lj(e)*dj}const pj={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function mj(e,t,n){let{prefix:r,suffix:i}=pj[t];return l.join(e,`${r}${n}${i}`)}function hj(e){for(let t of Object.keys(pj)){let{prefix:n,suffix:r}=pj[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function gj(e){let t=e.rssLimitBytes??512*dj,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 _j(e.log,`memory report`,()=>{let t=mj(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),_j(e.log,`heap snapshot`,()=>{let t=mj(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),_j(e.log,`artifact rotation`,()=>{yj(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 _j(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function vj(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=hj(t);if(n===null)return t;let{prefix:r,suffix:i}=pj[n];return t.slice(r.length,t.length-i.length)}function yj(e,t,n){let r=new Map;for(let t of e){let e=vj(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 bj(e,t,n={}){let i=Re();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Z,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>rj(ij(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>re.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>hj(e)!==null).map(e=>l.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function xj(e={}){if(Lj()!==null)return;let n=e.spawn??Rj,r=Pj();if(r.kind===`contended`){let e=Cj();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),Sj(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),Sj(n);return}try{Sj(n)}finally{Ij()}}function Sj(e){Aj()&&wj(e)}function Cj(){try{let e=r.statSync(Je());return Date.now()-e.mtimeMs}catch{return null}}function wj(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
|
|
171
|
+
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function Tj(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function Ej(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function Dj(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 Oj(e,n){try{r.mkdirSync(l.dirname(e),{recursive:!0}),r.writeFileSync(e,String(n),{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.backoff: ${e.message}\n`)}}function kj(){try{r.unlinkSync(Xe())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function Aj(){let e=Ye(),n=Xe(),r=Dj(n),i=Tj(jj(e),Ej(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`),Mj(e),Oj(n,Math.min(r+1,5)),!0)}function jj(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function Mj(e){try{r.mkdirSync(l.dirname(e),{recursive:!0}),r.writeFileSync(e,`${t.pid} ${Date.now()}\n`,{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.cooldown: ${e.message}\n`)}}let Nj=null;function Pj(){let e=Je();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return Nj={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(!Fj(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 Fj(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function Ij(){if(!Nj)return;let{fd:e,path:t}=Nj;Nj=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function Lj(){try{return r.mkdirSync(Re(),{recursive:!0}),null}catch(e){return`mkdir ${Re()}: ${e.message}`}}function Rj(){let e=t.execPath,n=t.argv[1];return n?Me({bin:e,args:[`--max-old-space-size=${uj(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const zj=`cc-candybar`,Bj=`dispatch`,Vj=`set-state`,Hj=`step-state`,Uj=`copy`,Wj=`open-vscode`,Gj=`toolbar-toggle`,Kj=`show-config-error`,qj=`show-config-warning`,Jj=`set-config`,Yj=`step-config`,Xj=`save`,Zj=`save-preset`,Qj=`save-theme-default`,$j=`delete-preset`,eM=`reset-config`,tM=`apply-layout-op`,nM=`undo`,rM=`redo`,iM=`back`,aM=`rewind`,oM=`apply-update`,sM=`doctor-run`,cM=`doctor-fix`,lM=`doctor-probe`,uM=`ceiling`,dM=`slash`;function fM(e){return e.map(encodeURIComponent).join(`/`)}function pM(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function mM(e){return`${zj}://${Bj}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${fM(e.args)}`)}`).join(`&`)}`}function hM(e){return new T(e).getAll(`e`).map(yM)}const gM=new Set([Vj,eM]);function _M(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&vM(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function vM(e,t){if(e.verb!==t.verb||!gM.has(e.verb))return;let[n,r]=[yM(e.value),yM(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function yM(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const bM=/^[A-Za-z0-9_./,:@%+-][A-Za-z0-9_./,:@%+=-]*$/;function xM(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function SM(e){return bM.test(e)?e:xM(e)}const CM=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function wM(e){let t=CM.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 TM(e){return e.join(`.`)}function EM([e,t,n],[r,i,a]){return e-r||t-i||n-a}const DM=`@promptctl/cc-candybar`;async function OM(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`?wM(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function kM(e,t){let n=wM(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=EM(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 AM(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${TM(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${TM(t.installed)} is newer than the registry's latest release (${TM(t.latest)}): an unpublished build.\n`};case`stale`:{let n=TM(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${TM(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 jM=`CCCandybarURLHandler`,MM=[],NM={"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 PM(e,t){return[e,...t].map(SM).join(` `)}function FM(){return l.join(h.homedir(),`Applications`,`${jM}.app`)}function IM(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function LM(){if(process.platform===`darwin`)return l.join(h.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??l.join(h.homedir(),`.local`,`share`);return l.join(e,`cc-candybar`)}function RM(){return l.join(LM(),`bin`,`cc-candybar`)}function zM(){return l.join(LM(),`dist`,`index.mjs`)}function BM(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(`
|
|
172
|
+
`)}function VM(e){let t=/do shell script "'([^']+)' '([^']+)' url-handle "/.exec(e);if(t===null)return null;let n=e=>e.replace(/\\"/g,`"`);return{node:n(t[1]),script:n(t[2])}}function HM(e){return l.join(e,`Contents`,`Resources`,`Scripts`,`main.scpt`)}function UM(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:l.resolve(l.dirname(e),`..`,`dist`,`index.mjs`)}function WM(t){let n=NM[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:l.resolve(l.dirname(t),`..`,`bin`,`cc-candybar`)}}function GM(e,t){l.resolve(e)!==l.resolve(t)&&r.copyFileSync(e,t)}function KM(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 ${DM}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function qM(){let e=UM(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=WM(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(l.dirname(zM()),{recursive:!0}),r.mkdirSync(l.dirname(RM()),{recursive:!0}),GM(e,zM()),GM(t.sourcePath,RM()),r.chmodSync(RM(),493),r.rmSync(l.join(LM(),`url-handler.mjs`),{force:!0});let n=KM(RM());return process.stdout.write(`Staged cc-candybar v${ZA} runtime at ${LM()}\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:RM(),distPath:zM(),entryKind:n}}function JM(){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>${zj}</string>`,` </array>`,` </dict>`,`</array>`].join(`
|
|
173
|
+
`)}]}function YM(e){let t=FM();r.mkdirSync(l.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=O({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,BM(process.execPath,e)],category:`install.osacompile`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`osacompile failed (${n.reason})`);let i=l.join(t,`Contents`,`Info.plist`);for(let{key:e}of JM())O({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of JM()){let n=O({bin:`/usr/bin/plutil`,args:[`-insert`,e,`-xml`,t,i],category:`install.plutil`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`plutil -insert ${e} failed (${n.reason})`)}process.stdout.write(`Registering ${zj}:// with Launch Services\n`);let a=O({bin:`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister`,args:[`-f`,t],category:`install.lsregister`});if(!a.ok)throw process.stderr.write(a.stderr),Error(`lsregister failed (${a.reason})`);process.stdout.write(`✓ ${jM}.app installed and registered.\n`),process.stdout.write(` Test: open '${zj}://hello-world' && pbpaste\n`)}function XM(){IM(),YM(qM().distPath)}function ZM(e,t=zj){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:Uj,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function QM(e){e||(process.stderr.write(`url-handle: missing URL argument.
|
|
174
|
+
`),process.exit(1));let t;try{t=ZM(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await nj(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(xj(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write($M(n)+`
|
|
175
|
+
`),process.exit(1)}function $M(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 eN(){return`✓ install complete.
|
|
176
176
|
Restart Claude Code to pick up the new statusline.
|
|
177
|
-
Tip: every bar carries a settings menu — click it (${Vd} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/shade/endcaps/wrap/padding controls.\n`}async function
|
|
178
|
-
`),$M(i.binPath,r,t),process.stdout.write(ZM());let a=DM(wM,EM(JA,await TM(wM,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function $M(e,t,n,i){let a=i??jT(AT(kT(process.env,process.cwd())));r.mkdirSync(l.dirname(a),{recursive:!0});let o=PT(a).statusLine,s=FT(o)?o.command:void 0,c=[e,yM(e),vM(e)],u=typeof s==`string`&&(s.startsWith(`pnpm dlx @promptctl/cc-candybar@`)||c.some(e=>s===e||s.startsWith(`${e} `)));if(s&&!u&&!n){process.stderr.write(`Skipping settings.json update: existing statusLine.command appears customized.\n Current: ${s}\n To overwrite, re-run with --force.\n`);return}let d=jM(e,t);Pe(a,(FT(o)?[[[`statusLine`,`type`],`command`],[[`statusLine`,`command`],d]]:[[[`statusLine`],{type:`command`,command:d}]]).reduce((e,[t,n])=>$l(e,t,JSON.stringify(n,null,2),Rl),NT(a))),process.stdout.write(`Updated ${a}\n`)}function eN(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 tN(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 nN(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 rN(e,t){let n=tN(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function iN(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 aN(e,t,n,r){let i=oN(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 oN(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 sN(e){let t=!1;function n(){let n=aN(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 cN(e,t=O){let n=t({bin:`ps`,args:[`-o`,`lstart=`,`-p`,String(e)],category:`process-fingerprint`,timeoutMs:2e3,env:{...process.env,LC_ALL:`C`,TZ:`UTC`}});if(n.ok){let e=n.stdout.trim();return e.length>0?{kind:`start`,token:e}:{kind:`unavailable`,detail:`ps produced no start-time`}}return{kind:`unavailable`,detail:n.reason===`spawn-error`?n.error??`ps spawn failed`:`ps ${n.reason} (exit ${n.exitCode})`}}function lN(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 uN(e,t=cN){let n=t(e);return n.kind===`start`?n.token:null}const dN=`CC_CANDYBAR_PARENT_PID`;function fN(e){let t=e[dN];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${dN} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function pN(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 mN(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function hN(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function gN(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 _N(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>l.join(e,t))}catch{return[]}}function vN(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 yN(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 bN(e){if(!e.isolated)return{decision:gN(!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=gN(!0,yN(t,e.isSameLiveProcess,e.removeFile),e.ceiling);if(!n.allow)return{decision:n,registryPath:null};let r=l.join(e.registryDir,`pid-${e.pid}.json`);return e.writeEntry(r,{pid:e.pid,startTime:e.startTime}),{decision:n,registryPath:r}}function xN(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function SN(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:qe(),ceiling:hN(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>lN(e,t,{readStartTime:cN,pidAlive:mN}),listFiles:_N,readEntry:vN,removeFile:e=>{try{r.unlinkSync(e)}catch{}},writeEntry:(e,t)=>{let n=`${e}.${t.pid}.tmp`;try{r.writeFileSync(n,JSON.stringify(t),{mode:384}),r.renameSync(n,e)}catch(e){try{r.unlinkSync(n)}catch(e){e.code}throw e}},ensureDirSafe:process.env.CC_CANDYBAR_DAEMON_REGISTRY_DIR?Ve:e=>{Ve(l.dirname(e)),Ve(e)},...t}}function CN(e){return e<32||e===127||e>=128&&e<=159}function wN(e){let t=``;for(let n of e)t+=CN(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function TN(e,t){let n=wN(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const EN=`\x1B[38;2;255;255;255m`,DN=`\x1B[48;2;200;40;40m`;function ON(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 kN={fg:ON(EN),bg:ON(DN)},AN={fg:ON(`\x1B[38;2;0;0;0m`),bg:ON(`\x1B[48;2;220;160;40m`)},jN=new Ai({"strip.separator":`default`,"strip.rail":`default`});function MN(e){return jN.resolve(e)}const NN=RegExp(`\\x1b\\[[0-9;]*m|${la.source}`,`g`),PN={kind:`still`},FN=Symbol(`bar`);function IN(e){return e.name!==Wc}function LN(e){return(t,n)=>{let r=e.map(({t:e,effect:t})=>t(e,n));return(e,t)=>r.reduce((e,n)=>n(e,t),e)}}const RN=oi;function zN(e,t){let n=new Wn(t,RN.foregroundColor,RN.ansiColors,RN.palette);return(t,r)=>e(t,{...r,theme:n})}function BN(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t/4294967296}const VN=4096;var HN=class{inForce=null;placements=new Map;made=new Map;drawn=null;frame={effect:Wc,t:0,made:0,reused:0,own:[],basis:`off`,revision:0,fades:[],leaves:[]};constructor(e){this.key=e}lastFrame(){return this.frame}get heldCount(){let e=[...this.drawn?.placements.values()??[]].filter(({passage:e})=>e!==null).length;return[...this.made.values()].reduce((e,t)=>e+t.size,e)}motion(e,t,n){let r=this.inForce?.name===e?this.inForce:{name:e,since:t},i={scope:FN,name:e,t:t-r.since},a=this.placements,o=new Map,s=this.made,c=new Map,l=[],u=this.drawn,d=n.transitions?u!==null&&u.source.config===n.source.config&&u.source.preset===n.source.preset&&u.source.revision===n.source.revision&&u.source.width===n.source.width?`compared`:`fresh`:`off`,f=d===`compared`?u.placements:null,p=new Map,m=[],h=[],g={effect:e,t:i.t,made:0,reused:0,own:l,basis:d,revision:n.source.revision,fades:m,leaves:h},_=(e,n,{ground:r})=>{let i=ds.transitions[e]({span:0,z:BN(`${this.key}@${n}`)*VN});return{name:e,since:t,transition:{effect:zN(i.effect,r),done:e=>i.done(e)}}},v=({since:e,transition:n})=>n.done(t-e),y=(e,t,n)=>({drawing:t,passage:f===null?null:n===void 0||n.passage?.name===`dissolve`?_(`fade`,e,t):n.passage!==null&&!v(n.passage)?n.passage:null}),b=(e,t)=>{if(t===void 0||t.drawing.own.length===0)return;if(t.passage?.name===`dissolve`)return v(t.passage)?void 0:t;let r={...t.drawing,own:t.drawing.own.map(n.hold)};return{drawing:r,passage:_(`dissolve`,e,r)}},x=(e,r)=>{if(p.has(e))throw Error(`placement "${e}" was reached twice in one frame`);let i=f?.get(e),{drawing:a,deeper:o}=n.returned(e,r),s=a===null?b(e,i):y(e,a,i);return s===void 0?r:(p.set(e,s),s.passage!==null&&(s.passage.name===`fade`?m:h).push({placement:e,t:t-s.passage.since}),a===null?[...s.drawing.own,...o]:r)},S=(e,n)=>{let r=o.get(e)??a.get(e),i=r?.name===n?r:{name:n,since:t},s=t-i.since;return o.has(e)||(o.set(e,i),l.push({placement:e,effect:n,t:s})),{scope:e,name:n,t:s}},C=(e,t,n)=>{let r=c.get(e)??new Map;c.set(e,r);let i=r.get(t.scope);if(i!==void 0)return i.effect;let a=s.get(e)?.get(t.scope),o=a?.name===t.name&&a.span===n,l=BN(t.scope===FN?e:`${e}@${t.scope}`),u=o?a.effect:ds.loops[t.name]({span:n,z:l*VN});return g[o?`reused`:`made`]++,r.set(t.scope,{name:t.name,span:n,effect:u}),u},ee=e=>{let t=new Map;for(let{owner:n,placement:r}of e){let e=r.effect===`bar`?i:S(r.id,r.effect),a=t.get(e.scope);a===void 0?t.set(e.scope,{...e,owners:[n]}):a.owners.push(n)}return[...t.values()]},w=e=>{let n=new Map;for(let{owner:t,placement:r}of e){let e=n.get(r.id);e===void 0?n.set(r.id,[t]):e.push(t)}return[...n].flatMap(([e,n])=>{let r=p.get(e)?.passage??null;return r===null?[]:[{t:t-r.since,effect:bo(r.transition.effect,...n)}]})};return{placed:d===`off`?(e,t)=>t:x,row:(e,t)=>{let n=(t.some(e=>e.placement.effect!==`bar`)?ee(t):[{...i,owners:void 0}]).filter(IN),r=w(t);if(n.length===0&&r.length===0)return PN;let a=`${this.key}#${e}`;return{kind:`moving`,wrap:(e,t)=>new go(e,LN([...n.map(e=>{let n=C(a,e,t);return{t:e.t,effect:e.owners===void 0?n:bo(n,...e.owners)}}),...r]),{t:i.t,key:a,theme:RN})}},drawn:()=>{this.inForce=r,this.placements=o,this.made=c,this.drawn=d===`off`?null:{source:n.source,placements:p},this.frame=g}}}},UN=class{sessions=new Map;constructor(e=256){this.maxSessions=e}of(e){let t=this.sessions.get(e)??new HN(e);this.sessions.delete(e),this.sessions.set(e,t);for(let e of this.sessions.keys()){if(this.sessions.size<=this.maxSessions)break;this.sessions.delete(e)}return t}getStats(){let e=0;for(let t of this.sessions.values())e+=t.heldCount;return{sessions:this.sessions.size,effects:e}}};function WN(e){return Math.max(0,...e.split(`
|
|
179
|
-
`).map(e=>A(e.replace(
|
|
180
|
-
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return s.slice(0,-1)}function
|
|
181
|
-
`)}function
|
|
182
|
-
`);return e?`${l}\n${e}`:l}function
|
|
183
|
-
`))}function fP(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new H({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new W(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(ae(a.path).href)):c(`full text unavailable: ${wN(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(wN(o),s.withLink(ae(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=W.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,eP([m],r)}const pP=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function mP(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function hP(e,t){return r.readdirSync(t).filter(pP).sort().flatMap(n=>{let i=l.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?hP(e,i):[[l.relative(e,i).split(l.sep).join(`/`),mP(i,a)]]})}function gP(e){let t=oe.createHash(`sha256`);for(let[n,r]of hP(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const _P=e=>e.slice(0,7);function vP(e){return l.dirname(l.dirname(e))}function yP(){return{version:JA,digest:`d13aa7096f19ba199b1857ad8bde06eb7b6808d063af2fb48127a51ab663b1a2`}}function bP(e){let t=JSON.parse(r.readFileSync(l.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${l.join(e,`package.json`)} has no version string`);return n}function xP(e,t){try{let n=vP(E(e)),i=l.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=gP(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:bP(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 SP(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function CP(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 wP(e,t,n){let r=Su(e,new Set(n.map(xu).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const TP=/^-?\d+$/;function EP(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 DP(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!TP.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 OP(e,t,n){return r=>r?TP.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 kP(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=>!TP.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 AP(e){return e===`config`?`set-config`:`set-state`}function jP(e,t,n){return t.kind===`int`?DP(`menu page "${e}"`):t.kind===`range`?OP(t.min,t.max,`${n} stepper "${e}"`):EP(t.allowed,`${n} "${e}"`,AP(n))}function MP(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:kP(e,n,t)}))}function NP(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of MP(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,jP(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function PP(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};NP(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=NP(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const FP=PP({},`config`,HP);function IP(e,t){return FP.register(e,t)}function LP(e){return FP.gateFor(e)}function RP(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:Sw(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:[SP({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[SP({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Sw(e.insertSegmentFrom,t).members.map(t=>SP({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function zP(e,t){let n=Pf(e).get(t);return n===void 0?null:String(n)}function BP(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?zw(n.persist):null;e?.scope===`preset-root`&&t.add(Fw(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function VP(e){let t=jD(e);return[...BP(e),...Object.values(e.actions).flatMap(e=>RP(e,t))]}function HP(e){return MP(VP(e),`config`)}const UP={},WP=OT(`commands.`),GP=HT(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),KP=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,qP=`{{ \$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 (${KP}) (basename .project_dir) (ne (${KP}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,JP=`{{ ${$w} }}`,YP={min:0,max:100,step:5},XP={warnAt:{label:`warning at %`,domain:YP,default:50},errorAt:{label:`error at %`,domain:{...YP,atLeast:`warnAt`},default:80}};function ZP(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:YP,default:80}}}const QP={globals:{palette:`tokyo-night`},variables:{...WP.variables,...YC,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``},"activity.ticket.id":{kind:`input`,path:`activity.ticket.id`,type:`string`,default:``},"activity.ticket.phase":{kind:`input`,path:`activity.ticket.phase`,type:`string`,default:``},"activity.ticket.epic.done":{kind:`input`,path:`activity.ticket.epic.done`,type:`number`,default:0},"activity.ticket.epic.total":{kind:`input`,path:`activity.ticket.epic.total`,type:`number`,default:0},"activity.ticket.unread":{kind:`input`,path:`activity.ticket.unread`,type:`string`,default:``},"ticket.detail":{kind:`state`,key:`ticket-detail`,default:`collapsed`}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project. Click to copy the full path.",template:qP},model:{group:`model-context`,description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:JP,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:_T(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:WP.template,when:WP.when},themeSwitcher:{group:`session-tools`,description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:ZP(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:ZP(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:XP,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:XP,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${tc} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:GP.template,bg:GP.bg,when:GP.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},ticket:{group:`activity`,description:`The lit ticket this session started; expands to its workflow phase and its epic's done/total.`,template:`🎫 {{ action "copyTicket" .activity.ticket.id }}{{ if eq .ticket.detail "expanded" }} · {{ .activity.ticket.phase }}{{ if .activity.ticket.epic.total }} · epic {{ .activity.ticket.epic.done }}/{{ .activity.ticket.epic.total }}{{ end }}{{ if .activity.ticket.unread }} · ⚠ unreadable {{ abbrev 40 .activity.ticket.unread }}{{ end }}{{ end }} {{ action "ticketDetail" "▸" "◂" }}`,when:`{{ ne .activity.ticket.id "" }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`ticket`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{..._T(``).actions,...WP.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},ticketDetail:{set:`ticket-detail`,cycle:[`collapsed`,`expanded`]},copyTicket:{copy:`{{ .activity.ticket.id }}`},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},...GP.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},themeDefaults:UP,presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${tc}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:UT(`.`),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 .)) }}`}},$P=new Set([QP.globals.palette,...Object.keys(QP.themeDefaults),...Object.values(QP.segments).map(e=>e.palette)].filter(e=>e!==void 0)),eF=Id(xA(`<default>`,JSON.stringify(QP),$P),QP),tF=Nb(eF.presets);function nF(e){return tF.includes(e)}const rF=Object.freeze({});function iF(e,t){return e.kind===`decided`?t[e.name]??rF:rF}function aF(e,t){return{...e,...Object.fromEntries(ku.map(n=>[n,e[n]??t[n]]))}}function oF(e){if(!e)return 0;try{return s(e).mtimeMs}catch{return 0}}const sF=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 cF(e){return((...t)=>sF.run(()=>e(...t)))}const lF=cF(ee),uF=cF(C),dF=cF(w);async function fF(e,t){return sF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function pF(e,t){return sF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const mF=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function hF(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 gF(e){let t=await _F(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function _F(e){for(let t of[65536,1048576]){let n=await pF(e,t);if(n.kind!==`ok`)return n;let r=vF(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function vF(e,t){let n=e.toString(`utf8`).split(`
|
|
184
|
-
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!
|
|
177
|
+
Tip: every bar carries a settings menu — click it (${Vd} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/shade/endcaps/wrap/padding controls.\n`}async function tN(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...MM],i=qM();process.platform===`darwin`?YM(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
|
|
178
|
+
`),nN(i.binPath,r,t),process.stdout.write(eN());let a=AM(DM,kM(ZA,await OM(DM,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function nN(e,t,n,i){let a=i??PT(NT(MT(process.env,process.cwd())));r.mkdirSync(l.dirname(a),{recursive:!0});let o=LT(a).statusLine,s=RT(o)?o.command:void 0,c=[e,SM(e),xM(e)],u=typeof s==`string`&&(s.startsWith(`pnpm dlx @promptctl/cc-candybar@`)||c.some(e=>s===e||s.startsWith(`${e} `)));if(s&&!u&&!n){process.stderr.write(`Skipping settings.json update: existing statusLine.command appears customized.\n Current: ${s}\n To overwrite, re-run with --force.\n`);return}let d=PM(e,t);Pe(a,(RT(o)?[[[`statusLine`,`type`],`command`],[[`statusLine`,`command`],d]]:[[[`statusLine`],{type:`command`,command:d}]]).reduce((e,[t,n])=>$l(e,t,JSON.stringify(n,null,2),Rl),IT(a))),process.stdout.write(`Updated ${a}\n`)}function rN(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 iN(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 aN(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 oN(e,t){let n=iN(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function sN(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 cN(e,t,n,r){let i=lN(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 lN(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 uN(e){let t=!1;function n(){let n=cN(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 dN(e,t=O){let n=t({bin:`ps`,args:[`-o`,`lstart=`,`-p`,String(e)],category:`process-fingerprint`,timeoutMs:2e3,env:{...process.env,LC_ALL:`C`,TZ:`UTC`}});if(n.ok){let e=n.stdout.trim();return e.length>0?{kind:`start`,token:e}:{kind:`unavailable`,detail:`ps produced no start-time`}}return{kind:`unavailable`,detail:n.reason===`spawn-error`?n.error??`ps spawn failed`:`ps ${n.reason} (exit ${n.exitCode})`}}function fN(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 pN(e,t=dN){let n=t(e);return n.kind===`start`?n.token:null}const mN=`CC_CANDYBAR_PARENT_PID`;function hN(e){let t=e[mN];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${mN} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function gN(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 _N(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function vN(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function yN(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 bN(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>l.join(e,t))}catch{return[]}}function xN(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 SN(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 CN(e){if(!e.isolated)return{decision:yN(!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=yN(!0,SN(t,e.isSameLiveProcess,e.removeFile),e.ceiling);if(!n.allow)return{decision:n,registryPath:null};let r=l.join(e.registryDir,`pid-${e.pid}.json`);return e.writeEntry(r,{pid:e.pid,startTime:e.startTime}),{decision:n,registryPath:r}}function wN(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function TN(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:qe(),ceiling:vN(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>fN(e,t,{readStartTime:dN,pidAlive:_N}),listFiles:bN,readEntry:xN,removeFile:e=>{try{r.unlinkSync(e)}catch{}},writeEntry:(e,t)=>{let n=`${e}.${t.pid}.tmp`;try{r.writeFileSync(n,JSON.stringify(t),{mode:384}),r.renameSync(n,e)}catch(e){try{r.unlinkSync(n)}catch(e){e.code}throw e}},ensureDirSafe:process.env.CC_CANDYBAR_DAEMON_REGISTRY_DIR?Ve:e=>{Ve(l.dirname(e)),Ve(e)},...t}}function EN(e){return e<32||e===127||e>=128&&e<=159}function DN(e){let t=``;for(let n of e)t+=EN(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function ON(e,t){let n=DN(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`…`);r+=e,i++}return r}const kN=`\x1B[38;2;255;255;255m`,AN=`\x1B[48;2;200;40;40m`;function jN(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 MN={fg:jN(kN),bg:jN(AN)},NN={fg:jN(`\x1B[38;2;0;0;0m`),bg:jN(`\x1B[48;2;220;160;40m`)},PN=new Ai({"strip.separator":`default`,"strip.rail":`default`});function FN(e){return PN.resolve(e)}const IN=RegExp(`\\x1b\\[[0-9;]*m|${la.source}`,`g`),LN={kind:`still`},RN=Symbol(`bar`);function zN(e){return e.name!==Wc}function BN(e){return(t,n)=>{let r=e.map(({t:e,effect:t})=>t(e,n));return(e,t)=>r.reduce((e,n)=>n(e,t),e)}}const VN=oi;function HN(e,t){let n=new Wn(t,VN.foregroundColor,VN.ansiColors,VN.palette);return(t,r)=>e(t,{...r,theme:n})}function UN(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t/4294967296}const WN=4096;var GN=class{inForce=null;placements=new Map;made=new Map;drawn=null;frame={effect:Wc,t:0,made:0,reused:0,own:[],basis:`off`,revision:0,fades:[],leaves:[]};constructor(e){this.key=e}lastFrame(){return this.frame}get heldCount(){let e=[...this.drawn?.placements.values()??[]].filter(({passage:e})=>e!==null).length;return[...this.made.values()].reduce((e,t)=>e+t.size,e)}motion(e,t,n){let r=this.inForce?.name===e?this.inForce:{name:e,since:t},i={scope:RN,name:e,t:t-r.since},a=this.placements,o=new Map,s=this.made,c=new Map,l=[],u=this.drawn,d=n.transitions?u!==null&&u.source.config===n.source.config&&u.source.preset===n.source.preset&&u.source.revision===n.source.revision&&u.source.width===n.source.width?`compared`:`fresh`:`off`,f=d===`compared`?u.placements:null,p=new Map,m=[],h=[],g={effect:e,t:i.t,made:0,reused:0,own:l,basis:d,revision:n.source.revision,fades:m,leaves:h},_=(e,n,{ground:r})=>{let i=ds.transitions[e]({span:0,z:UN(`${this.key}@${n}`)*WN});return{name:e,since:t,transition:{effect:HN(i.effect,r),done:e=>i.done(e)}}},v=({since:e,transition:n})=>n.done(t-e),y=(e,t,n)=>({drawing:t,passage:f===null?null:n===void 0||n.passage?.name===`dissolve`?_(`fade`,e,t):n.passage!==null&&!v(n.passage)?n.passage:null}),b=(e,t)=>{if(t===void 0||t.drawing.own.length===0)return;if(t.passage?.name===`dissolve`)return v(t.passage)?void 0:t;let r={...t.drawing,own:t.drawing.own.map(n.hold)};return{drawing:r,passage:_(`dissolve`,e,r)}},x=(e,r)=>{if(p.has(e))throw Error(`placement "${e}" was reached twice in one frame`);let i=f?.get(e),{drawing:a,deeper:o}=n.returned(e,r),s=a===null?b(e,i):y(e,a,i);return s===void 0?r:(p.set(e,s),s.passage!==null&&(s.passage.name===`fade`?m:h).push({placement:e,t:t-s.passage.since}),a===null?[...s.drawing.own,...o]:r)},S=(e,n)=>{let r=o.get(e)??a.get(e),i=r?.name===n?r:{name:n,since:t},s=t-i.since;return o.has(e)||(o.set(e,i),l.push({placement:e,effect:n,t:s})),{scope:e,name:n,t:s}},C=(e,t,n)=>{let r=c.get(e)??new Map;c.set(e,r);let i=r.get(t.scope);if(i!==void 0)return i.effect;let a=s.get(e)?.get(t.scope),o=a?.name===t.name&&a.span===n,l=UN(t.scope===RN?e:`${e}@${t.scope}`),u=o?a.effect:ds.loops[t.name]({span:n,z:l*WN});return g[o?`reused`:`made`]++,r.set(t.scope,{name:t.name,span:n,effect:u}),u},ee=e=>{let t=new Map;for(let{owner:n,placement:r}of e){let e=r.effect===`bar`?i:S(r.id,r.effect),a=t.get(e.scope);a===void 0?t.set(e.scope,{...e,owners:[n]}):a.owners.push(n)}return[...t.values()]},w=e=>{let n=new Map;for(let{owner:t,placement:r}of e){let e=n.get(r.id);e===void 0?n.set(r.id,[t]):e.push(t)}return[...n].flatMap(([e,n])=>{let r=p.get(e)?.passage??null;return r===null?[]:[{t:t-r.since,effect:bo(r.transition.effect,...n)}]})};return{placed:d===`off`?(e,t)=>t:x,row:(e,t)=>{let n=(t.some(e=>e.placement.effect!==`bar`)?ee(t):[{...i,owners:void 0}]).filter(zN),r=w(t);if(n.length===0&&r.length===0)return LN;let a=`${this.key}#${e}`;return{kind:`moving`,wrap:(e,t)=>new go(e,BN([...n.map(e=>{let n=C(a,e,t);return{t:e.t,effect:e.owners===void 0?n:bo(n,...e.owners)}}),...r]),{t:i.t,key:a,theme:VN})}},drawn:()=>{this.inForce=r,this.placements=o,this.made=c,this.drawn=d===`off`?null:{source:n.source,placements:p},this.frame=g}}}},KN=class{sessions=new Map;constructor(e=256){this.maxSessions=e}of(e){let t=this.sessions.get(e)??new GN(e);this.sessions.delete(e),this.sessions.set(e,t);for(let e of this.sessions.keys()){if(this.sessions.size<=this.maxSessions)break;this.sessions.delete(e)}return t}getStats(){let e=0;for(let t of this.sessions.values())e+=t.heldCount;return{sessions:this.sessions.size,effects:e}}};function qN(e){return Math.max(0,...e.split(`
|
|
179
|
+
`).map(e=>A(e.replace(IN,``))))}function JN(e,t){return ho(e,{...t,theme:PN,onStyleError:e=>{throw e}})}const YN=new Map;function XN(e){let t=YN.get(e);if(t!==void 0)return t;let n=t=>{let n=t.seam.map(t=>({...t,glyph:e}));return{...t,seam:n,divider:n}},{shape:r,ascii:i}=fo.plain,a=new Ya(n(r),nl(e)?n(i):i);return YN.set(e,a),a}function ZN(e,t){return e===`plain`&&t!==void 0?XN(t):fo[e]}const QN=e=>({asciiOnly:e===`ascii`}),$N=new Map;function eP(e){let t=JSON.stringify([e.endcaps,e.charset,e.separator??null]),n=$N.get(t);if(n!==void 0)return n;let r=ZN(e.endcaps,e.separator),i=e=>new W(`x`,{end:``,overflow:`ignore`,style:new H({bgcolor:e})}),a=t=>new W(JN(new ka(t,r),{colorSystem:null,...QN(e.charset)}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return $N.set(t,s),s}function tP(e){return eP(e).chrome}function nP(e){return eP(e).seam}function rP(e,t,n=LN){if(e.length===0)return``;let r=ZN(t.endcaps,t.separator),i=t.wrap&&Number.isFinite(t.width),a={colorSystem:t.colorCompatibility,...QN(t.charset),...i?{width:t.width}:{}},o=i?new _s([...e],{joiner:r}):new ka([...e],r),s=n.kind===`still`?JN(o,a):JN(n.wrap(o,qN(JN(o,a))),a);if(!s.endsWith(`
|
|
180
|
+
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return s.slice(0,-1)}function iP(e){return Math.min(20,e??20)}const aP={heading:`ERROR`,glyph:`⚠`,colors:MN},oP={heading:`WARNING`,glyph:`⚠`,colors:NN},sP={heading:`UPDATE`,glyph:`⬆`,colors:NN};function cP(e,t){return{text:DN(e),link:t}}function lP(e,t,n){let[r,...i]=[uP(e,aP,Kj),t,uP(n,oP,qj)].flat();return r===void 0?null:{channels:[r,...i]}}function uP(e,t,n){let r=mM([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>cP(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function dP(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
|
|
181
|
+
`)}function fP(e,t,n,r){if(t===null)return e;let i=pP(r),a=t.channels.flatMap(e=>mP(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[hP(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
|
|
182
|
+
`);return e?`${l}\n${e}`:l}function pP(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function mP(e,t){let n=new H({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Kt(Math.max(2,t.width-1)),i=(e,t)=>new W(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>rP([i(o===0?e.severity.glyph:` `,n.withLink(a[0].link)),...a.flatMap(e=>{let t=n.withLink(e.link);return e.text.split(` `).flatMap(e=>Zt(e,r)).map(e=>i(e,t))})],t).split(`
|
|
183
|
+
`))}function hP(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new H({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new W(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(ae(a.path).href)):c(`full text unavailable: ${DN(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(DN(o),s.withLink(ae(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=W.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,rP([m],r)}const gP=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function _P(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function vP(e,t){return r.readdirSync(t).filter(gP).sort().flatMap(n=>{let i=l.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?vP(e,i):[[l.relative(e,i).split(l.sep).join(`/`),_P(i,a)]]})}function yP(e){let t=oe.createHash(`sha256`);for(let[n,r]of vP(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const bP=e=>e.slice(0,7);function xP(e){return l.dirname(l.dirname(e))}function SP(){return{version:ZA,digest:`d2ae072fb0b93288bb99e7d67aaeb91ec81c6b7b308525be61f2282f4ec774bb`}}function CP(e){let t=JSON.parse(r.readFileSync(l.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${l.join(e,`package.json`)} has no version string`);return n}function wP(e,t){try{let n=xP(E(e)),i=l.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=yP(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:CP(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 TP(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function EP(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 DP(e,t,n){let r=Su(e,new Set(n.map(xu).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const OP=/^-?\d+$/;function kP(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 AP(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!OP.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 jP(e,t,n){return r=>r?OP.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 MP(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=>!OP.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 NP(e){return e===`config`?`set-config`:`set-state`}function PP(e,t,n){return t.kind===`int`?AP(`menu page "${e}"`):t.kind===`range`?jP(t.min,t.max,`${n} stepper "${e}"`):kP(t.allowed,`${n} "${e}"`,NP(n))}function FP(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:MP(e,n,t)}))}function IP(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of FP(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,PP(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function LP(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};IP(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=IP(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const RP=LP({},`config`,GP);function zP(e,t){return RP.register(e,t)}function BP(e){return RP.gateFor(e)}function VP(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:Tw(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:[TP({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[TP({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Tw(e.insertSegmentFrom,t).members.map(t=>TP({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function HP(e,t){let n=Pf(e).get(t);return n===void 0?null:String(n)}function UP(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?Hw(n.persist):null;e?.scope===`preset-root`&&t.add(Rw(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function WP(e){let t=PD(e);return[...UP(e),...Object.values(e.actions).flatMap(e=>VP(e,t))]}function GP(e){return FP(WP(e),`config`)}const KP={},qP=jT(`commands.`),JP=GT(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),YP=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,XP=`{{ \$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 (${YP}) (basename .project_dir) (ne (${YP}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,ZP=`{{ ${nT} }}`,QP={min:0,max:100,step:5},$P={warnAt:{label:`warning at %`,domain:QP,default:50},errorAt:{label:`error at %`,domain:{...QP,atLeast:`warnAt`},default:80}};function eF(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:QP,default:80}}}const tF={globals:{palette:`tokyo-night`},variables:{...qP.variables,...QC,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project. Click to copy the full path.",template:XP},model:{group:`model-context`,description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:ZP,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:bT(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:qP.template,when:qP.when},themeSwitcher:{group:`session-tools`,description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:eF(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:eF(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:$P,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:$P,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${tc} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:JP.template,bg:JP.bg,when:JP.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},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:{...bT(``).actions,...qP.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`},...JP.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},themeDefaults:KP,presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${tc}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:KT(`.`),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 .)) }}`}},nF=new Set([tF.globals.palette,...Object.keys(tF.themeDefaults),...Object.values(tF.segments).map(e=>e.palette)].filter(e=>e!==void 0)),rF=Id(wA(`<default>`,JSON.stringify(tF),nF),tF),iF=Nb(rF.presets);function aF(e){return iF.includes(e)}const oF=Object.freeze({});function sF(e,t){return e.kind===`decided`?t[e.name]??oF:oF}function cF(e,t){return{...e,...Object.fromEntries(ku.map(n=>[n,e[n]??t[n]]))}}function lF(e){if(!e)return 0;try{return s(e).mtimeMs}catch{return 0}}const uF=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 dF(e){return((...t)=>uF.run(()=>e(...t)))}const fF=dF(ee),pF=dF(C),mF=dF(w);async function hF(e,t){return uF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function gF(e,t){return uF.run(async()=>{let n=null;try{n=await S(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{D(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const _F=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function vF(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 yF(e){let t=await bF(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function bF(e){for(let t of[65536,1048576]){let n=await gF(e,t);if(n.kind!==`ok`)return n;let r=xF(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function xF(e,t){let n=e.toString(`utf8`).split(`
|
|
184
|
+
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!_F.test(t))continue;let r=vF(t);if(r!=null)return r}return null}function SF(e,t){return{...e,claudeConfigDir:NT(t.claudeConfigDir),env:t.mementoEnv}}const CF=l.join(`lib`,`ceiling_config.py`),wF=l.join(`skills`,`ceiling`,`bin`,`ceiling`);function TF(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 EF(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 DF(e,t){if(!r.existsSync(e))return Y;let n;try{n=TF(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=EF([l.join(l.dirname(l.dirname(e)),`settings.json`),l.join(t,`.claude`,`settings.json`),l.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[CF,wF].filter(e=>!r.existsSync(l.join(i.installPath,e)));return o.length===0?J(i.installPath):X(`memento at ${i.installPath} has no ${o.join(` or `)} — upgrade the plugin`)}function OF(e,t=process.env){let n=new Set([`CLAUDE_PROJECT_DIR`,`CLAUDE_CODE_SESSION_ID`,...e.env===void 0?[]:$e]);return{...Object.fromEntries(Object.entries(t).filter(([e])=>!n.has(e))),...e.env,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function kF(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function AF(e){let t;try{t=JSON.parse(e)}catch{return X(`memento read: not JSON: ${e.trim()}`)}let{ceiling:n,session:r}=t??{},i=n===`off`||typeof n==`number`&&n>=0?n:void 0;return i!==void 0&&(r===null||typeof r==`string`)?J({ceiling:i,session:r}):X(`memento read: unexpected answer: ${e.trim()}`)}async function jF(e,t){let n=await je({bin:`python3`,args:[`-c`,`
|
|
185
185
|
import json, math, sys
|
|
186
186
|
sys.path.insert(0, sys.argv[1])
|
|
187
187
|
from ceiling_config import CONFIG_NAME, anchored, ceiling_in, in_force, session_directory
|
|
@@ -190,41 +190,41 @@ ceiling = in_force(directory, anchored(sys.argv[3]))
|
|
|
190
190
|
layer = ceiling_in(directory / CONFIG_NAME)
|
|
191
191
|
print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
|
|
192
192
|
"session": layer.text if layer else None}))
|
|
193
|
-
`,l.join(e,`lib`),t.sessionId,t.cwd],env:
|
|
194
|
-
`).at(-1).trim();function
|
|
195
|
-
`),c=dM([{verb:Wj,args:[s]}]),l=t.kind===`running`?aP(`[${i.busy}]`,c):aP(`[${i.act}]`,dM([{verb:rM,args:[n.sessionId]}]));return[{severity:iP,message:s,lines:[[aP(a,c),l,aP(`[dismiss]`,dM([{verb:Rj,args:[n.sessionId,GI,r]}])),aP(`[disable]`,dM([{verb:Gj,args:[n.sessionId,KI,`false`]},{verb:Rj,args:[n.sessionId,qI,`false`]}]))],...o.map(e=>[aP(e,c)])]}]}function eL(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 tL(e){switch(e.kind){case`current`:return[`info`,`build: current ${YI(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${YI(e.source)}, running ${YI(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function nL(e){switch(e.kind){case`current`:return[`info`,`release: current ${SM(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${SM(e.latest)}, running ${SM(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${SM(e.installed)}, latest ${SM(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function rL(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const iL=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function aL(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=iL(e.stderr)??e.error??iL(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function oL(){let e=[IP(KI,[`false`]),RI(qI,[`false`]),RI(GI,[])];return()=>e.forEach(e=>e())}function sL(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=ZI,d=null,f=rL(s),p=rL(s),m=()=>eL(c,l);function h(){let e=m(),t=e===null?null:JI(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:RI(GI,[t])})}function g(){c=xP(t,yP),f(tL(c)),h()}async function _(){l=EM(JA,await TM(wM,a,i)),p(nL(l)),h()}return{arm(){oL(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>$I(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=XI(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=QI,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),je({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=ZI,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=aL(n);u={kind:`failed`,identity:JI(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var cL=class{static CACHE_DIR=Le();static USAGE_CACHE_DIR=l.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=l.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=l.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return D(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(D(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(D(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return D(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=l.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),D(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await ue(50);else throw e}return D(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=l.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),D(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&D(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){D(`Failed to create cache directories:`,e)}}static createProjectHash(e){return se(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=l.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){D(`Cache for ${e} is locked, waiting...`),await ue(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(D(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(D(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return D(`No shared ${e} usage cache found`),null;D(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await ue(75)}}return D(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){D(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=l.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),D(`[CACHE-SET] ${e} disk cache stored`)}catch(t){D(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const lL={"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 uL=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 cL.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await cL.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ie(this.GITHUB_PRICING_URL),n=le({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){D(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){D(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(D(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),D(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(D(`Invalid pricing data structure`),e(null))}catch(t){D(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{D(`Response error:`,t),e(null)})});n.on(`error`,t=>{D(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{D(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return D(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return D(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),D(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(D(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(lL).length} models`),this.executionCache=lL,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(lL).length} models`),lL)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return D(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),D(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const dL=String.raw`(?:^|[\s;&|(])`,fL=e=>RegExp(`(?:^|:)(?:${e})$`),pL=[{phase:`impl`,tool:`Edit`,match:/^/},{phase:`impl`,tool:`MultiEdit`,match:/^/},{phase:`impl`,tool:`Write`,match:/^/},{phase:`impl`,tool:`NotebookEdit`,match:/^/},{phase:`review`,tool:`Bash`,match:RegExp(`${dL}gh\\s+pr\\s+create\\b`)},{phase:`review`,tool:`Skill`,match:fL(`code-review|simplify`)},{phase:`groom`,tool:`Bash`,match:RegExp(`${dL}lit\\s+(done|close)\\b`)},{phase:`groom`,tool:`Skill`,match:fL(`groom-backlog`)},{phase:`handoff`,tool:`Skill`,match:fL(`message-in-a-bottle`)}],mL=e=>RegExp(`${dL}lit\\s+(?:${e})(?:\\s+(?:--?[\\w-]+(?:=\\S*)?|''))*\\s+([A-Za-z0-9][\\w.-]*)`),hL=[{verb:mL(`start`),to:`in_progress`},{verb:mL(`done|close`),to:`closed`}];function gL(e){return pL.find(t=>t.tool===e.tool&&t.match.test(e.subject))?.phase}function _L(e,t){if(t.tool===`Bash`)for(let{verb:n,to:r}of hL){let i=n.exec(t.subject)?.[1];if(i!==void 0)return{call:e,id:i,to:r}}}const vL=/^lit:state (.*)$/gm;function yL(e){return[...e.matchAll(vL)].map(([e,t])=>bL(t)??{kind:`unreadable`,line:e.trim()})}function bL(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!=`object`||!t)return;let{id:n,status:r,epic:i}=t;if(typeof n!=`string`||typeof r!=`string`)return;if(i===null)return{kind:`state`,id:n,status:r,epic:null};if(typeof i!=`object`||i===void 0)return;let a=i;if(!(typeof a.id!=`string`||typeof a.done!=`number`||typeof a.total!=`number`))return{kind:`state`,id:n,status:r,epic:{id:a.id,done:a.done,total:a.total}}}function xL(e,t){let n=t??{};return{tool:e,subject:e===`Bash`&&typeof n.command==`string`?wL(n.command):e===`Skill`&&typeof n.skill==`string`?n.skill:e}}const SL=/(<<-?\s*(['"]?)(\w+)\2[^\n]*\n)[\s\S]*?\n\s*\3(?=\n|$)/g,CL=/'[^']*'|"(?:[^"\\]|\\.)*"/g;function wL(e){return e.replace(SL,`$1`).replace(CL,`''`)}function TL(e){return typeof e==`string`?[e]:Array.isArray(e)?e.flatMap(e=>typeof e==`object`&&e&&typeof e.text==`string`?[e.text]:[]):[]}const EL=/^(\S+) \[(open|in_progress|closed)\//gm,DL=/^Ticket (\S+) has been closed\./gm,OL={sentinels:[],said:[]};function kL(e){let t;for(let n of TL(e)){let e=n.includes(`lit:state `),r=n.includes(` [`),i=n.includes(`has been closed.`);if(!(!e&&!r&&!i)){if(t??={sentinels:[],said:[]},e&&t.sentinels.push(...yL(n)),r)for(let[,e,r]of n.matchAll(EL))t.said.push({id:e,status:r});if(i)for(let[,e]of n.matchAll(DL))t.said.push({id:e,status:`closed`})}}if(t===void 0)return OL;for(let e of t.sentinels)e.kind===`state`&&t.said.push({id:e.id,status:e.status});return t}const AL=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function jL(e){if(typeof e==`string`)return AL.exec(e)?.[1]}function ML(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 NL(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o,s=[],c=[],l,u=[];if(typeof t==`string`)o=t;else if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;switch(t.type){case`tool_use`:{let{id:e,name:n}=t;if(typeof e!=`string`||typeof n!=`string`)break;r.push({id:e,name:n});let i=xL(n,t.input),o=_L(e,i);o!==void 0&&s.push(o),l=gL(i)??l,n===`TodoWrite`&&(a=ML(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id,n=kL(t.content);if(u.push(...n.sentinels),typeof e==`string`){i.push(e);for(let t of n.said)c.push({call:e,...t})}break}case`text`:o??=t.text;break;default:break}}let d=n?jL(o):void 0,f=s.length===0&&l===void 0&&u.length===0&&c.length===0?void 0:{...s.length>0&&{claims:s},...l!==void 0&&{phase:l},...u.length>0&&{sentinels:u},...c.length>0&&{said:c}};if(!(r.length===0&&i.length===0&&a===void 0&&d===void 0&&f===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...d!==void 0&&{command:d},...f!==void 0&&{lit:f}}}function PL(e){if(e!==void 0)return[e];let t=g();return[p(t,`.config`,`claude`),p(t,`.claude`)].filter(e=>a(e))}async function FL(e){let t=[];for(let n of e){let e=p(n,`projects`);if(a(e))try{let n=await lF(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=p(e,r.name);t.push(n)}}catch(t){D(`Failed to read projects directory ${e}:`,t)}}return t}async function IL(e,t,n){let r=[],i=p(t,e,`subagents`);try{let t=(await lF(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=p(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await uF(t,`utf-8`)).split(`
|
|
196
|
-
`)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{D(`Failed to check agent file ${t}`)}}}catch(e){D(`Failed to read subagents directory ${i}:`,e)}return r}function
|
|
197
|
-
`))if(n.trim())try{let e=BL(JSON.parse(n));e&&t.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`);continue}return t}async function HL(e){return VL(await uF(e,`utf-8`))}async function UL(e,t){let n=await fF(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:VL(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function WL(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=de({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=BL(JSON.parse(t));e&&r.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{D(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{D(`File stream error for ${e}:`,t),n(t)})})}var GL=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 KL(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 qL=new Map,JL={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},YL={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function XL(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function ZL(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function QL(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function $L(e,t,n,r){let i=XL(new Date(ZL())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:QL(),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 uL.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=XL(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...JL};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 eR(e){let t=0,n=0,r=QL(),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)??{...JL};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:YL,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 tR(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 nR=class{entries=new Map;flight=new GL;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new GL;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??uC,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:YL,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t,n){let r=XL(TC(n)),i=PL(t);try{await this.ensureSeeded(r,i)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let a=await this.ingest(e?.session_id??``,e?.transcript_path);if(a.kind===`failed`)return a;let o=i.map(e=>p(e,`projects`)+m),s={...JL},c=!1;for(let[t,n]of this.entries){let i=n.transcriptPath??``,a=t===e?.session_id||o.some(e=>i.startsWith(e))?n.days:qL;c||=a.has(r);let l=a.get(r)??JL;s.cost+=l.cost,s.input+=l.input,s.output+=l.output,s.cacheCreation+=l.cacheCreation,s.cacheRead+=l.cacheRead}return c?J({cost:s.cost,tokens:s.input+s.output+s.cacheCreation+s.cacheRead,tokenBreakdown:{input:s.input,output:s.output,cacheCreation:s.cacheCreation,cacheRead:s.cacheRead},date:r}):Y}async observeSpeed(e,t,n){let r=oF(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=KL(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??oF(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 IL(e,d(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await UL(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 $L(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...eR(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=ZL(),n=await FL(e),r=[];for(let e of n){let n;try{n=await lF(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=p(e,i),a;try{a=(await dF(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await tR(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},rR=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return D(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);D(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{D(`Calculating context tokens from transcript: ${e}`);let n=await zL(e);if(n.length===0)return D(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,D(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return D(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return D(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},iR=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=oF(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await UL(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 aR={messageCount:0,recent:[]};function oR(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!LL(t),recent:n.length>20?n.slice(-20):n}}function sR(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(LL(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 cR=class{fold=new iR(aR,oR);async getMetricsInfo(e,t){if(D(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:sR(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};function lR(e,t,n){return n.some(e=>e.call===t.call&&e.id===t.id&&e.status===t.to)?t.to===`closed`?e?.id===t.id?null:e:{id:t.id,phase:`prep`,epic:e?.id===t.id?e.epic:null,unread:null}:e}function uR(e,t,n){let r=[...e.claims,...t?.claims??[]],i=e=>n.includes(e.call),a=r.filter(i).reduce((e,n)=>lR(e,n,t?.said??[]),e.ticket),o=r.filter(e=>!i(e));if(a===null||t===void 0)return{claims:o,ticket:a};let s=t.sentinels??[],c=s.findLast(e=>e.kind===`state`&&e.id===a.id),l=s.findLast(e=>e.kind===`unreadable`);return{claims:o,ticket:{id:a.id,phase:t.phase??a.phase,epic:c?.kind===`state`?c.epic:a.epic,unread:l?.kind===`unreadable`?l.line:a.unread}}}const dR={ticket:null,claims:[],command:null,todos:[],pending:[],done:[]};function fR(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 pR(e,t){if(t.isSidechain)return e;let n=LL(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=fR(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos,...uR(n,r.lit,r.finished??[])}}function mR(e){return{ticket:e.ticket,command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>fR(e,t.name),[]),done:e.done}}var hR=class{fold=new iR(dR,pR);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(mR(n.value))}};function gR(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function _R(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function vR(e,t,n,r){return _R(O(gR(e,t,n,r)),n)}async function yR(e,t,n){return _R(await je(gR(e,t,n)),n)}const bR=e=>`${e.socket}\n${e.pane}`;var xR=class{names=new Map;asking=new GL;constructor(e=Date.now){this.now=e}getSessionName(e){let t=bR(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){D(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await yR(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const SR=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:$e.map(t=>e.env?.[t]??null)]);var CR=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=SR(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=SR(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function wR(e){return{gitProvider:new yC({watchers:e.watchers,logger:e.logger}),usageStore:new nR({logger:e.logger}),contextProvider:new rR,metricsProvider:new cR,activityProvider:new hR,tmuxService:new xR,mementoProvider:new CR(AF()),autoCompact:BT,log:e.logger}}function TR(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function ER(e,t){let n=W.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function DR(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function OR({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function kR({text:e,placement:t,lead:n,trail:r}){return{text:AR(e),placement:t,...n!==void 0&&{lead:AR(n)},...r!==void 0&&{trail:AR(r)}}}function AR(e){let t=e.blankCopy(e.plain);t.style=MN(e.style).clearMetaAndLinks();for(let{start:n,end:r,style:i}of e.spans)t.stylize(MN(i).clearMetaAndLinks(),n,r);return t}function jR(e){let t=OR(e);if(t.length===1)return e.text;let n=ER(t);return n.style=e.text.style,n}function MR(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,placement:s,lead:c=[],trail:l=[]}=t;if(e.length===0)return[];let u=ER(e,a).pad(o),d=new W(` `.repeat(o)),f={placement:s,...c.length>0&&{lead:ER([d,...c],a)},...l.length>0&&{trail:ER([...l,d],a)}};if(n===`auto`)return[{text:u,...f}];let p={justify:r,truncate:i};return n===`fill`?[{text:u,fill:p,...f}]:(DR(u,n,p),[{text:u,...f}])}function NR(e,t){let n=()=>e.map(e=>({owner:jR(e),placement:e.placement})),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=eP(e.map(jR),t).split(`
|
|
198
|
-
`);if(i.length>1)return n();let a=Math.max(0,t.width-WN(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:n},i)=>{let a=o+(i===r.length-1?s:0),{text:c}=e[t];DR(c,c.cellLength+a,n)}),n()}function PR(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=FR(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e){let e={frag:a,style:MN(a.style)};if(e.style.link){i();let r=FR([e],t);r.plain.length>0&&n.push(r)}else r.push(e)}return i(),n}function FR(e,t){let n=t!==void 0&&!t.isNull?t:void 0,r=e.map(e=>IR(e.frag,n?n.add(e.style):e.style)),i=W.fromFragments(r);return i.end=``,i.overflow=`ignore`,r.length===1?i.style=r[0].style:n!==void 0&&(i.style=n),i}function IR(e,t){let n=e.copy();return n.style=t,n}function LR(e,t){if(e.look===void 0)throw Error(`${t} read the render's look before any render resolved one`);return e.look}function RR(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,zR(e,t,o,n,r,i));return i}function zR(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=Sw(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=tw.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=Sw(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=Sw(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:HR(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:HR(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:ZD(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:HR(e,n.name,t)};if(`themeDefault`in n)return{kind:`theme-default-save`};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 BR(e){return e.kind===`do`?BR(e.head):e}function VR(e){switch(BR(e).kind){case`set-option`:case`set-int`:case`persist-option`:case`layout-op-option`:return!0;case`set-literal`:case`set-bounded`:case`set-cycle`:case`copy`:case`open`:case`persist-literal`:case`persist-bounded`:case`persist-cycle`:case`reset`:case`layout-op`:case`undo`:case`redo`:case`back`:case`rewind`:case`save`:case`preset-save`:case`preset-delete`:case`theme-default-save`:case`doctor-run`:case`doctor-fix`:case`ceiling`:case`slash`:case`do`:return!1}}function HR(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function UR(e,t){return e.has(t)?Bx(e.read(t)):``}function WR(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function GR(e,t,n,r){let i=new W(e,{style:H.combine([r,new H({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function KR(e,t){return Math.max(e.members.indexOf(UR(t,e.stateVar)),0)}function qR(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=UR(r,e.stateVar);return{effects:[{verb:Rj,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=UR(r,e.stateVar);return{effects:[{verb:Rj,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=UR(r,e.stateVar);return{effects:[{verb:Rj,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(KR(e,r)+1)%e.members.length];return{effects:[{verb:Rj,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:zj,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:Bj,args:[WR(e.text,NS(r))]}],active:!1};case`open`:return{effects:[{verb:Vj,args:[WR(e.target,NS(r))]}],active:!1};case`persist-literal`:{let t=UR(r,e.stateVar);return{effects:[{verb:Gj,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=UR(r,e.stateVar);return{effects:[{verb:Gj,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(KR(e,r)+1)%e.members.length];return{effects:[{verb:Gj,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:Kj,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:Zj,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:$j,args:[i]}],active:!1};case`redo`:return{effects:[{verb:eM,args:[i]}],active:!1};case`back`:return{effects:[{verb:tM,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:nM,args:[i]}],active:!1};case`save`:return{effects:[{verb:qj,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:Jj,args:[i]}],active:!1};case`theme-default-save`:return{effects:[{verb:Yj,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:Xj,args:[i,WR(e.name,NS(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:iM,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:aM,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:sM,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:cM,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:Qj,args:[i,e.key,SP(e.op)]}],active:!1};case`do`:{let a=qR(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>qR(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:Qj,args:[i,e.key,SP(r)]}],active:!1}}}}function JR(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:Ud(`action "${e}"`,n,t.members.length,KR(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 YR(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}=JR(e,BR(r),t,i),{effects:s,active:c}=qR(r,a,o,i,UR(i,`session.id`));return GR(a,dM(s),c)}function XR(e){return{action:{fn:(t,...n)=>YR(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function ZR(e,t){return GR(`✕`,dM([{verb:Rj,args:[UR(e,`session.id`),t,Bd]}]),!1)}function QR(e,t,n){return new H({bgcolor:L.fromRgba(t),color:L.fromRgba(nc(e,t,n))})}function $R({tint:e,text:t}){return new H({bgcolor:L.fromRgba(e),color:L.fromRgba(t)})}function ez(e,t,n){return new H({color:L.fromRgba(Or(Ks(e,`warning`),t,tc,n))})}function tz(e,t,n){return H.combine([QR(e,t,n),ez(e,t,n)])}function nz(e,t,n){return QR(e.palette,Sc(e.palette,e.disclosure,[t],n),n)}function rz(e,t,n,r,i,a){return r===void 0?n=>nz(e,{...n,distribution:t},i):(e,t)=>iz(r(t,n),a,i)}function iz(e,t,n){return new H({bgcolor:L.fromRgba(t),color:L.fromRgba(Or(Ks(e,`primary`),t,4.5,n))})}function az(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>oz(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function oz(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function sz(e,t){return new W(e).truncate(t,{marker:`…`}).plain}function cz(e){return{current:null,drawnAt:e}}function lz(e,t,n,r,i,a,o){let s={segName:t,placementId:n,palette:r,disclosure:i,tint:a,text:o,bg:void 0,drops:[]};return e.current=s,s}function uz(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 dz(e){return new W(e).cellLength}function fz(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function pz(e){return Math.max(1,fz(e)-(dz(`✕`)+2*e.padding+e.seamCols))}function mz(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 hz(e,t,n){let r=dz(`←`)+1+dz(`→`)+1,i=mz(e,t,n);return(i.length>1?mz(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function gz(e,t){let n=[];for(let t of e)n.length>0&&n.push(new W(` `)),n.push(t);let r=W.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function _z(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 vz(e,t,n){let r=e.compiled.get(t),i=r&&BR(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 yz(e,t,n,r,i,a,o){let s=vz(i,e,`picker`),c=i.compiled.get(e),l=i.store,u=UR(l,`session.id`),d=`stateVar`in s?UR(l,s.stateVar):void 0,f=r?n.kind===`led`?pz(i):fz(i):1/0,p=n.kind===`led`?0:dz(`✕`)+1,m=s.library&&{groups:s.library.groups,entries:s.options.map(s.library.entry)},h=m===void 0?hz(s.options.map(dz),f,p):az(m.entries,m.groups,r),g=parseInt(UR(l,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>dM([{verb:Rj,args:[u,t.key,String(e)]}]),b=n.kind===`led`?[]:[{verb:Rj,args:[u,...n.writes.flatMap(([e,t])=>[e,t])]}],x=n.kind===`own`&&n.onPick?b:[],S=e=>dM([...qR(c,e,e,l,u).effects,...x]),C=(e,t)=>{let n=s.options[e];return GR(t,S(n),n===d,a({index:e,count:s.options.length},n))},ee=n.kind===`led`?[]:[GR(`✕`,dM(b),!1,o)];_>0&&ee.push(GR(`←`,y(_-1),!1));let w=_<h.length-1?[GR(`→`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[gz([...ee,...e.map(e=>C(e,s.options[e])),...w],r)]}let te=new H({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new W(`${v[0].label}${ne}`,{style:te})]:[],ie=[gz([...ee,...re,...w],r)];for(let e of v){v.length>1&&ie.push(gz([new W(e.label,{style:te})],r));let t=Math.max(...e.indices.map(e=>dz(s.options[e])));for(let n of e.indices){let e=s.options[n],i=m.entries[n].description,a=i===void 0?void 0:wN(i),o=` `.repeat(t-dz(e)+2),c=a===void 0?e:`${e}${o}${a}`;ie.push(gz([C(n,sz(c,f))],r))}}return ie}function bz(e,t){return{picker:{fn:(n,r,i,a,o,...s)=>{DS(`picker "${n}"`,[`closeOnPick`,`paged`,`inBody`],s);let c=_z(e,r,`set-int`,`an int action ({ set, int: true })`);if(o===!0&&i===!0)throw Error(`{{ picker "${n}" … }} sets both closeOnPick and inBody; a picker in a body is closed by the body's ✕, so it has no close to fold into a pick`);let l=vz(e,n,`picker`);if(l.library!==void 0)throw Error(`{{ picker "${n}" … }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let u=uz(t,`{{ picker }}`);if(u.bg===void 0)throw Error(`{{ picker }} is not available while segments.${u.segName}'s own "bg:" is being evaluated — a picker is drawn on that background`);let[d]=yz(n,{key:c.key,stateVar:c.stateVar},o===!0?{kind:`led`}:{kind:`own`,writes:[[c.key,`-1`]],onPick:i===!0},a===!0,e,rz(u,Ps(void 0),LR(e,`{{ picker }}`),l.paletteOf,t.drawnAt(),u.bg),ez(u.palette,u.bg,t.drawnAt()));return d},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function xz(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+dz(e(-(s+1)))+1+dz(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function Sz(e,t,n,r,i,a){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let o=n.store;if(!o.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let s=n.compiled.get(e),c=UR(o,`session.id`),{options:l}=t,u=l.length;if(u===0)return gz([],!0);let d=UR(o,t.stateVar),f=Math.max(l.indexOf(d),0),p=e=>((f+e)%u+u)%u,m=e=>l[p(e)],h=new Map,g=e=>{let t=h.get(e);if(t!==void 0)return t;let n=dM(qR(s,m(e),m(e),o,c).effects);return h.set(e,n),n},_=e=>GR(m(e),g(e),m(e)===d,r({index:p(e),count:u},m(e))),v=a===void 0?_(0):GR(m(0),dM(qR(n.compiled.get(a),m(0),void 0,o,c).effects),!1),y=xz(m,u,dz(`◀`)+1+v.cellLength+1+dz(`▶`),pz(n),i),b=e=>Array.from({length:y},(t,n)=>_(e*(n+1)));return gz([...b(-1).reverse(),GR(`◀`,g(-1),!1),v,GR(`▶`,g(1),!1),...b(1)],!0)}function Cz(e,t){return{carousel:{fn:(n,...r)=>{let[i,a,...o]=r;if(DS(`carousel "${n}"`,[`neighbours`,`centre`],o),i!==void 0&&!(Number.isInteger(i)&&i>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(i)}`);if(a!==void 0&&!(typeof a==`string`&&e.compiled.has(a)))throw Error(`carousel "${n}": centre must name a declared action, got ${JSON.stringify(a)}`);if(a!==void 0&&VR(e.compiled.get(a)))throw Error(`carousel "${n}": centre "${a}" writes a value the template binds, and the centre binds none — name an action that writes a fixed value, a cycle, or a do of them`);let s=i??1/0,c=vz(e,n,`carousel`),l=uz(t,`{{ carousel }}`);if(l.bg===void 0)throw Error(`{{ carousel }} is not available while segments.${l.segName}'s own "bg:" is being evaluated — a carousel is drawn on that background`);return Sz(n,c,e,rz(l,Ps(void 0),LR(e,`{{ carousel }}`),c.paletteOf,t.drawnAt(),l.bg),s,a)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}const wz=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function Tz(e,t,n,r){let i=mc(e,n,r),a=(t,n)=>({text:t,colour:n,ink:nc(e,n,r)});return[ks(t).map((n,i)=>{let a=qs(e,n);return{text:wz[i%wz.length],colour:a,ink:t.shade.text(e,n.hue,a,r)}}),[a(`▾ open`,i.state),a(`menu`,i.plane)],[a(`warn`,Ks(e,`warning`)),a(`error`,Ks(e,`error`))]]}function Ez(e,t,n,r,i){let a=Tz(e,t,n,r).flatMap((e,t)=>e.map(({text:e,colour:n,ink:r},i)=>({gap:t>0&&i===0?` `:``,cell:new W(` ${e} `,{style:$R({tint:n,text:r})})}))),o=[],s=0;for(let{gap:e,cell:t}of a){if(s+=e.length+t.cellLength,s>i)break;e!==``&&o.push(new W(e)),o.push(t)}let c=W.fromFragments(o);return c.overflow=`ignore`,c.end=``,c}function Dz(e,t){return{themePreview:{fn:()=>{let{palette:n,decor:r}=LR(e,`{{ themePreview }}`);return Ez(n,r,{...uz(t,`{{ themePreview }}`).disclosure,depth:0},t.drawnAt(),pz(e))},argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const Oz=e=>e.slice(e.lastIndexOf(`.`)+1),kz=(e,t)=>{let n=new W(Oz(e));return n.truncate(t,{marker:`…`}),n.plain};function Az(e,t){let n=e.map(e=>e.map(({name:e})=>dz(Oz(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 jz(e,t,n,r){let i=Az(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new W(` ${kz(s,i)} `,{style:$R(Ec(l,{kind:`bar`,decor:t,address:c},n))});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=W.fromFragments(a.flatMap((e,t)=>t===0?e:[new W(`
|
|
199
|
-
`),...e]));return o.overflow=`ignore`,o.end=``,o}function
|
|
193
|
+
`,l.join(e,`lib`),t.sessionId,t.cwd],env:OF(t),timeoutMs:3e3,category:`memento.read`});return n.ok?AF(n.stdout):X(kF(n))}function MF(e,t,n){let r=O({bin:l.join(e,wF),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:OF(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(kF(r))}function NF(){return{locate:e=>DF(FT(e.claudeConfigDir),e.projectDir),read:jF,move:MF}}function PF(e,t,n){let r=n===void 0?``:`CLAUDE_CONFIG_DIR=${SM(n)} `,i=e.added_dirs.map(e=>` --add-dir ${SM(e)}`).join(``);return`cd ${SM(e.project_dir)} && ${r}claude --resume ${SM(t)}${i}`}function FF(e,t,n){let r=Pb(t(`preset`),e.globals.preset,e.presets),i=Lb(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{},o=vw(a.palette,t(`theme`),i.palette),s=cF(i,sF(o,e.themeDefaults));return{preset:r,presetCustomized:n(r),theme:o,style:Uc(a.style,t(`style`),s.style,e.styles),effect:Yc(a.effect,t(`effect`),s.effect),endcaps:el(a.endcaps,t(`endcaps`),s.endcaps),variation:cl(a.variation,t(`variation`),s.variation),shade:dl(a.shade,t(`shade`),s.shade),separator:a.default_separator??s.default_separator,autoWrap:yl(a.autoWrap,t(`autoWrap`),s.autoWrap),padding:Sl(a.padding,t(`padding`),s.padding),charset:a.charset??s.charset??`unicode`,updateNotice:bl(a.updateNotice,t(`updateNotice`),s.updateNotice),transitions:xl(a.transitions,t(`transitions`),s.transitions),colorCompatibility:a.colorCompatibility??s.colorCompatibility??`truecolor`}}function IF(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function LF(e){return{theme:e.theme,style:e.style,effect:e.effect,preset:e.preset,variation:e.variation,shade:e.shade,transitions:e.transitions}}function RF(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:aF(e.preset)},endcaps:{effective:e.endcaps},variation:{effective:e.variation},shade:{effective:e.shade},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding},updateNotice:{effective:e.updateNotice},transitions:{effective:e.transitions}}}const zF=10*1e3;function BF(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 VF(e,t){if(!(t<60))return e*3600/t}function HF(e,t,n,r){let i=r-t;if(i<50||i>zF)return;let a=n-e;if(!(a<=0))return a*1e3/i}function UF(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=HF(t.input,t.atMs,n.input,n.atMs),i=HF(t.output,t.atMs,n.output,n.atMs),a=HF(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 WF(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>zF)continue;let o=HF(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function GF(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function KF(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`,()=>GF(h.hostname())),i=n(`user`,()=>h.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function qF(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=>Cx(t,e.helpers).keys(),o=Lb(e,t);for(let e of Ic){let t=o[e];if(Lc(t))for(let e of a(t))r.push(e)}for(let n of wu(Ib(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 YF(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 JF(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=qF(e,n);return t.set(n,i),i}}function YF(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 XF(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function ZF(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 QF(e,t,n,r,i,a,o,{configPath:s,...c}){let l=e=>XF(i,e),u=OC(t).getTime(),d=o.tmux??null,f=(e,t,n)=>t?n().catch(t=>X(`${e}: ${String(t)}`)):Promise.resolve(Y),[p,m,h,g,_,v,y,b,x,S,C]=await Promise.all([f(`git`,l(`git`),()=>n.gitProvider.getGitInfo(r??e.workspace?.current_dir,ZF(i),e.workspace?.project_dir)),f(`session`,l(`session.cost`)||l(`session.tokens`)||l(`burn`),()=>n.usageStore.getUsageInfo(e.session_id,e)),f(`today`,l(`today`),()=>n.usageStore.getTodayInfo(e,o.claudeConfigDir,t)),f(`context`,l(`context`)||l(`autocompact`),()=>n.contextProvider.getContextInfo(e)),f(`metrics`,l(`metrics`)||l(`burn`),()=>n.metricsProvider.getMetricsInfo(e.session_id,e)),f(`activity`,l(`activity`),()=>n.activityProvider.getActivityInfo(e.session_id,e)),f(`tmux`,l(`tmux.session`),()=>d===null?Promise.resolve(Y):n.tmuxService.getSessionName(d)),f(`cache`,l(`cache`),()=>yF(e.transcript_path)),f(`speed`,l(`speed`),()=>n.usageStore.observeSpeed(e.session_id,e.transcript_path,u)),f(`memento`,l(`memento`),()=>n.mementoProvider.getCeiling(SF({sessionId:e.session_id,projectDir:e.workspace?.project_dir??``,cwd:r??e.workspace?.current_dir??``},o))),f(`autocompact`,l(`autocompact`),()=>Promise.resolve(n.autoCompact(PT(NT(o.claudeConfigDir)))))]),ee=[],w=e=>{if(e.kind===`failed`){ee.push(e.reason);return}return e.kind===`ok`?e.value:void 0},te=oI(p,u);ee.push(...te.failures);let ne=KF(o);ee.push(...ne.failures);let re=w(m),ie=w(h),T=w(g),E=w(_),ae=w(v),oe=w(y),se=w(b),ce=tI(S);S.kind===`failed`&&ee.push(`memento: ${S.reason}`);let le=$F(C,T?.maxTokens);C.kind===`failed`&&ee.push(`autocompact: ${C.reason}`);for(let e of ee)n.log(`warn`,`provider fetch failed: ${e}`);let ue=e.rate_limits?.five_hour,de=e.rate_limits?.seven_day,fe=ue?BF(ue.used_percentage,ue.resets_at,18e6,u):void 0,pe=de?BF(de.used_percentage,de.resets_at,6048e5,u):void 0,me=re?.session.cost,he=E?.sessionDuration,ge=l(`burn`)&&me!=null&&he!=null?VF(me,he):void 0,_e=w(x),ve=_e===void 0?void 0:UF(_e),ye=_e===void 0?void 0:WF(_e),be=ve!==void 0||ye!==void 0?{...ve,...ye!==void 0&&{history:ye}}:void 0,D=aI(process.env.HOME??process.env.USERPROFILE),xe=e.workspace?{...e.workspace,current_dir:aI(e.workspace.current_dir)??``,project_dir:aI(e.workspace.project_dir)??``,added_dirs:(e.workspace.added_dirs??[]).map(e=>aI(e)??e)}:e.workspace,Se=re===void 0?void 0:iI({cost:re.session.cost,tokens:re.session.tokens}),Ce=ie===void 0?void 0:{cost:ie.cost,tokens:ie.tokens},we=E===void 0?void 0:iI({lastResponseTime:E.lastResponseTime,responseTime:E.responseTime,sessionDuration:E.sessionDuration,messageCount:E.messageCount,nonPrompts:E.nonPrompts,linesAdded:E.linesAdded,linesRemoved:E.linesRemoved}),Te=ae===void 0?void 0:nI(ae);return{...e,...xe!==void 0&&{workspace:xe},...D!==void 0&&{home:D},...te.git!==void 0&&{git:te.git},...d!==null&&{tmux:{pane:d.pane,...oe!==void 0&&{session:oe}}},host:ne.host,...RF(a),history:n.history(e.session_id),navigation:{back:n.navigation(e.session_id)},...c,...s!==null&&{configPath:s},resumeCommand:PF(xe,e.session_id,o.claudeConfigDir),...Se!==void 0&&{session:Se},...Ce!==void 0&&{today:Ce},...ge!==void 0&&{burn:{costPerHour:ge}},...be!==void 0&&{speed:be},...l(`block`)&&ue!==void 0&&{block:{nativeUtilization:ue.used_percentage,resetsAt:ue.resets_at,...fe!==void 0&&{etaMinutes:fe}}},...de!==void 0&&{weekly:{percentage:de.used_percentage,resetsAt:de.resets_at,...pe!==void 0&&{etaMinutes:pe}}},...se!==void 0&&{cache:{expiresAt:se}},...T!==void 0&&{context:{totalTokens:T.totalTokens,contextLeft:T.contextLeftPercentage}},...we!==void 0&&{metrics:we},...Te!==void 0&&{activity:Te},...ce!==void 0&&{memento:ce},...le!==void 0&&{autocompact:le}}}function $F(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return WT(e.value,t)}}const eI=e=>e.trim().split(`
|
|
194
|
+
`).at(-1).trim();function tI(e){switch(e.kind){case`absent`:return;case`failed`:return{error:eI(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function nI(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=rI(e.running),i=rI(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 rI(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function iI(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 aI(e){return e===void 0||e.length===0||l.sep!==`\\`?e:e.replace(/\\/g,`/`)}function oI(e,t){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let n=e.value,r=[],i=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){r.push(`git.${e}: ${t.reason}`);return}return t.value}},a=i(`aheadBehind`,n.aheadBehind),o=i(`sha`,n.sha),s=i(`operation`,n.operation),c=i(`timeSinceCommit`,n.committedAt),l=c===void 0?void 0:Math.floor((t-c)/1e3),u=i(`stash`,n.stashCount),d=i(`upstream`,n.upstream),f=i(`repoName`,n.repoName),p=i(`repoUrl`,n.repoUrl),m=n.pullRequest,h={};return m?.kind===`ok`?(h.prNumber=m.value.number,h.prState=m.value.state,h.prUrl=m.value.url):m?.kind===`failed`&&(r.push(`git.pr: ${m.reason}`),h.prError=m.reason),{git:{branch:n.branch,status:n.status,...a!==void 0&&{ahead:a.ahead,behind:a.behind},...n.workingTree!==void 0&&{staged:n.workingTree.staged,unstaged:n.workingTree.unstaged,untracked:n.workingTree.untracked,conflicts:n.workingTree.conflicts},...o!==void 0&&{sha:o},...s!==void 0&&{operation:s},...l!==void 0&&{timeSinceCommit:l},...u!==void 0&&{stash:u},...d!==void 0&&{upstream:d},...f!==void 0&&{repoName:f},...p!==void 0&&{repoUrl:p},...h},failures:r}}const sI={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,effect:e=>e.effect.kind===`decided`?e.effect.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,shade:e=>e.shade,transitions:e=>e.transitions?fl:pl,autoWrap:e=>e.autoWrap?fl:pl,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?fl:pl},cI=Object.entries(ew),lI=new Set(tw.map(e=>e.sessionKey)),uI=()=>!1;function dI(e,t){return FF(e,e=>lI.has(e)?t(e):null,uI)}const fI=[`preset`,`theme`];function pI(e,t,n){let r=new Set(fI.slice(0,n).map(e=>ew[e].sessionKey));return FF(e,e=>r.has(e)?t(e):null,uI)}function mI(e,t){let n=Array.from({length:fI.length+1},(n,r)=>pI(e,t,r));return e=>{let t=fI.indexOf(e);return n[t===-1?fI.length:t]}}function hI(e,t,n,r){return e.flatMap(([e,i])=>{let a=sI[e](t);return a===null||a===sI[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function gI(e,t,n){return sI[n](dI(e,t))}function _I(e,t){let n=dI(e,t);return hI(cI,n,mI(e,t),t=>vI(e,n.preset,t.configKey))}function vI(e,t,n){return n in(Fb(e.presets,t).globals??{})?Vw(t,n):n}function yI(e,t,n){let r=Pb(t(ew.preset.sessionKey),e.globals.preset,e.presets),i=Hw(n);return{key:i?.scope===`globals`?vI(e,r,i.field):n,globals:Lb(e,r)}}function bI(e,t){let{preset:n}=dI(e,t);return CI(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Hu(a,s);return c===void 0||Vu(c)===Vu(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function xI(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return Nb(e.presets).flatMap(n=>{let i=CI(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 zu(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:Hu(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const SI=new WeakMap;function CI(e,t){let n=SI.get(e)??new Map;SI.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...wu(Ib(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Lu(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 wI(e,t){let n=dI(e,t);return{from:n.preset,globals:Fb(e.presets,n.preset).globals??{},picks:hI(cI.filter(([e])=>e!==`preset`),n,mI(e,t),e=>e.configKey),placements:bI(e,t)}}function TI(e,t){return FF({...e,globals:{palette:t},presets:{}},()=>null,uI)}function EI(e,t){let n=dI(e,t),r=sI.theme(n);if(r===null)return{kind:`rule`};let i=TI(e,r),a=Lb(e,n.preset),o=Object.fromEntries(ku.map(e=>[e,sI[e](a[e]===void 0?n:i)]));return{kind:`look`,theme:r,look:o,differs:ku.some(e=>o[e]!==sI[e](i))}}function DI(e){return{sessionKeys:tw.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...xf(e)?iF.map(t=>Vw(t,e)):[],...Bw(e)?jc().map(t=>zw(t,e)):[]]}}function OI(e){return new Set(tw.map(e=>e.configKey).filter(t=>DI(t).fileKeys.some(t=>jI(e,AI(t)))))}function kI(e,t,n){let r=_I(e,n),i=new Set(r.map(e=>e.configKey)),a=ow(e=>i.has(ew[e].configKey)||t.has(ew[e].configKey)),o=EI(e,n);return{unsaved:r.length+bI(e,n).length,resettable:a,themeDefault:o.kind===`look`&&o.differs?{differs:!0,theme:o.theme}:{differs:!1}}}function AI(e){let t=Hw(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return Uw(t)}function jI(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&jI(e[n],r)}const MI=jc(),NI=new Set(MI),PI=new Set(Xc),FI=e=>e?NI.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${MI.join(`, `)})`}:{ok:!1,reason:`theme name is required`},II=e=>e?PI.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${Xc.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},LI=new Set([`1`,`true`]),RI=new Set([`0`,`false`]),zI={endcaps:II,theme:FI,"toolbar-expanded":e=>LI.has(e)?{ok:!0,value:`1`}:RI.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}},BI=LP(zI,`state`,qI);function VI(e,t){return BI.register(e,t)}function HI(e){return BI.gateFor(e)}function UI(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:Tw(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 WI(e){return e.filter(e=>e.spec.kind!==`allow-list`||!Object.hasOwn(zI,e.key))}function GI(e,t,n){let r=sw.get(n);if(r!==void 0)return gI(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 KI(e){let t=PD(e);return WI(Object.values(e.actions).flatMap(e=>UI(e,t)))}function qI(e){return FP(KI(e))}const JI=`update.dismissed`,YI=`updateNotice`,XI=ew.updateNotice.sessionKey;function ZI(e){return e.kind===`source`?e.newer.digest:TM(e.newer)}const QI=e=>`${e.version} [${bP(e.digest)}]`;function $I(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:QI(e.newer),running:QI(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:TM(e.newer),running:TM(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${DM}@${TM(e.newer)}`,`install`]}}}}const eL={kind:`idle`},tL={kind:`running`};function nL(e,t,n){if(e===null)return[];let r=ZI(e);if(!n.enabled||n.dismissed===r)return[];let i=$I(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(`
|
|
195
|
+
`),c=mM([{verb:qj,args:[s]}]),l=t.kind===`running`?cP(`[${i.busy}]`,c):cP(`[${i.act}]`,mM([{verb:oM,args:[n.sessionId]}]));return[{severity:sP,message:s,lines:[[cP(a,c),l,cP(`[dismiss]`,mM([{verb:Vj,args:[n.sessionId,JI,r]}])),cP(`[disable]`,mM([{verb:Jj,args:[n.sessionId,YI,`false`]},{verb:Vj,args:[n.sessionId,XI,`false`]}]))],...o.map(e=>[cP(e,c)])]}]}function rL(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 iL(e){switch(e.kind){case`current`:return[`info`,`build: current ${QI(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${QI(e.source)}, running ${QI(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function aL(e){switch(e.kind){case`current`:return[`info`,`release: current ${TM(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${TM(e.latest)}, running ${TM(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${TM(e.installed)}, latest ${TM(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function oL(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const sL=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function cL(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=sL(e.stderr)??e.error??sL(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function lL(){let e=[zP(YI,[`false`]),VI(XI,[`false`]),VI(JI,[])];return()=>e.forEach(e=>e())}function uL(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=eL,d=null,f=oL(s),p=oL(s),m=()=>rL(c,l);function h(){let e=m(),t=e===null?null:ZI(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:VI(JI,[t])})}function g(){c=wP(t,SP),f(iL(c)),h()}async function _(){l=kM(ZA,await OM(DM,a,i)),p(aL(l)),h()}return{arm(){lL(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>nL(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=$I(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=tL,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),je({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=eL,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=cL(n);u={kind:`failed`,identity:ZI(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var dL=class{static CACHE_DIR=Le();static USAGE_CACHE_DIR=l.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=l.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=l.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return D(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(D(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(D(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return D(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=l.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),D(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await ue(50);else throw e}return D(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=l.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),D(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&D(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){D(`Failed to create cache directories:`,e)}}static createProjectHash(e){return se(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=l.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){D(`Cache for ${e} is locked, waiting...`),await ue(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(D(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(D(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return D(`No shared ${e} usage cache found`),null;D(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await ue(75)}}return D(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){D(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=l.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),D(`[CACHE-SET] ${e} disk cache stored`)}catch(t){D(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const fL={"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 pL=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 dL.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await dL.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ie(this.GITHUB_PRICING_URL),n=le({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){D(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){D(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(D(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),D(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(D(`Invalid pricing data structure`),e(null))}catch(t){D(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{D(`Response error:`,t),e(null)})});n.on(`error`,t=>{D(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{D(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return D(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return D(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),D(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(D(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(fL).length} models`),this.executionCache=fL,D(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(fL).length} models`),fL)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return D(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),D(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const mL=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function hL(e){if(typeof e==`string`)return mL.exec(e)?.[1]}function gL(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 _L(e){return typeof e==`string`?e:Array.isArray(e)?e.find(e=>typeof e==`object`&&!!e&&e.type===`text`&&typeof e.text==`string`)?.text??``:``}function vL(e,t){let n=e.message?.content,r=[],i=[],a;if(Array.isArray(n))for(let e of n){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=gL(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id;typeof e==`string`&&i.push(e);break}default:break}}let o=t===`prompt`?hL(_L(n)):void 0;if(!(r.length===0&&i.length===0&&a===void 0&&o===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...o!==void 0&&{command:o}}}function yL(e){if(e!==void 0)return[e];let t=g();return[p(t,`.config`,`claude`),p(t,`.claude`)].filter(e=>a(e))}async function bL(e){let t=[];for(let n of e){let e=p(n,`projects`);if(a(e))try{let n=await fF(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=p(e,r.name);t.push(n)}}catch(t){D(`Failed to read projects directory ${e}:`,t)}}return t}async function xL(e,t,n){let r=[],i=p(t,e,`subagents`);try{let t=(await fF(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=p(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await pF(t,`utf-8`)).split(`
|
|
196
|
+
`)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{D(`Failed to check agent file ${t}`)}}}catch(e){D(`Failed to read subagents directory ${i}:`,e)}return r}function SL(e){let t=e.message;if((e.type||t?.role||t?.type)!==`user`)return;if(wL(t)===`tool_result`)return`tool-result`;let n=typeof e.origin==`object`&&e.origin!==null?e.origin.kind:void 0;if(n!==void 0&&n!==`human`)return`turn`;let r=_L(t?.content).trimStart();return r.startsWith(`[Request interrupted by user`)?`interrupt`:e.isMeta===!0||e.isCompactSummary===!0||CL.test(r)?`claude-code`:`prompt`}const CL=/^<(?:command-name|local-command-std(?:out|err)|bash-(?:input|stdout|stderr))>/;function wL(e){let t=e?.content;return Array.isArray(t)&&typeof t[0]==`object`&&t[0]?t[0].type:void 0}const TL=new Map;async function EL(e){try{let t=await mF(e),n=t.size,r=TL.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return D(`[parse-cache] hit ${e}`),TL.delete(e),TL.set(e,r),r.entries;let i;return n>1048576?(D(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await jL(e)):i=await kL(e),D(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(TL.delete(e),TL.size>=16&&TL.delete(TL.keys().next().value),TL.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return D(`Transcript not present yet: ${e}`),[];throw t}}function DL(e){if(!e.timestamp)return null;let t=e.message,n=t?.usage,r=SL(e);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}:void 0,costUSD:typeof e.costUSD==`number`?e.costUSD:void 0,isSidechain:e.isSidechain===!0,userEntry:r,activity:vL(e,r),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 OL(e){let t=[];for(let n of e.split(`
|
|
197
|
+
`))if(n.trim())try{let e=DL(JSON.parse(n));e&&t.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`);continue}return t}async function kL(e){return OL(await pF(e,`utf-8`))}async function AL(e,t){let n=await hF(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:OL(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function jL(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=de({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=DL(JSON.parse(t));e&&r.push(e)}catch(e){D(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{D(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{D(`File stream error for ${e}:`,t),n(t)})})}var ML=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 NL(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 PL=new Map,FL={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},IL={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function LL(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function RL(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function zL(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function BL(e,t,n,r){let i=LL(new Date(RL())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:zL(),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 pL.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=LL(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...FL};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 VL(e){let t=0,n=0,r=zL(),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)??{...FL};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:IL,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 HL(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 UL=class{entries=new Map;flight=new ML;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new ML;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??pC,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:IL,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t,n){let r=LL(OC(n)),i=yL(t);try{await this.ensureSeeded(r,i)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let a=await this.ingest(e?.session_id??``,e?.transcript_path);if(a.kind===`failed`)return a;let o=i.map(e=>p(e,`projects`)+m),s={...FL},c=!1;for(let[t,n]of this.entries){let i=n.transcriptPath??``,a=t===e?.session_id||o.some(e=>i.startsWith(e))?n.days:PL;c||=a.has(r);let l=a.get(r)??FL;s.cost+=l.cost,s.input+=l.input,s.output+=l.output,s.cacheCreation+=l.cacheCreation,s.cacheRead+=l.cacheRead}return c?J({cost:s.cost,tokens:s.input+s.output+s.cacheCreation+s.cacheRead,tokenBreakdown:{input:s.input,output:s.output,cacheCreation:s.cacheCreation,cacheRead:s.cacheRead},date:r}):Y}async observeSpeed(e,t,n){let r=lF(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=NL(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??lF(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 xL(e,d(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await AL(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 BL(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...VL(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=RL(),n=await bL(e),r=[];for(let e of n){let n;try{n=await fF(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=p(e,i),a;try{a=(await mF(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await HL(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},WL=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return D(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);D(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{D(`Calculating context tokens from transcript: ${e}`);let n=await EL(e);if(n.length===0)return D(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,D(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return D(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return D(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},GL=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=lF(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await AL(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 KL={messageCount:0,nonPrompts:0,recent:[]},qL=new Set([`turn`,`interrupt`,`claude-code`]);function JL(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +(t.userEntry===`prompt`),nonPrompts:e.nonPrompts+ +!!qL.has(t.userEntry),recent:n.length>20?n.slice(-20):n}}function YL(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(r.userEntry===`prompt`||r.userEntry===`turn`)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 XL=class{fold=new GL(KL,JL);async getMetricsInfo(e,t){if(D(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:YL(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,nonPrompts:n.value.nonPrompts,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};const ZL={command:null,todos:[],pending:[],done:[]};function QL(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 $L(e,t){switch(t.userEntry){case`prompt`:return{...e,command:t.activity?.command??null,pending:[],done:[]};case`interrupt`:return{...e,pending:[]};case`turn`:case`tool-result`:case`claude-code`:case void 0:return e}}function eR(e,t){if(t.isSidechain)return e;let n=$L(e,t),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=QL(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 tR(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>QL(e,t.name),[]),done:e.done}}var nR=class{fold=new GL(ZL,eR);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(tR(n.value))}};function rR(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function iR(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function aR(e,t,n,r){return iR(O(rR(e,t,n,r)),n)}async function oR(e,t,n){return iR(await je(rR(e,t,n)),n)}const sR=e=>`${e.socket}\n${e.pane}`;var cR=class{names=new Map;asking=new ML;constructor(e=Date.now){this.now=e}getSessionName(e){let t=sR(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){D(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await oR(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const lR=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:$e.map(t=>e.env?.[t]??null)]);var uR=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=lR(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=lR(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function dR(e){return{gitProvider:new SC({watchers:e.watchers,logger:e.logger}),usageStore:new UL({logger:e.logger}),contextProvider:new WL,metricsProvider:new XL,activityProvider:new nR,tmuxService:new cR,mementoProvider:new uR(NF()),autoCompact:UT,log:e.logger}}function fR(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function pR(e,t){let n=W.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function mR(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function hR({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function gR({text:e,placement:t,lead:n,trail:r}){return{text:_R(e),placement:t,...n!==void 0&&{lead:_R(n)},...r!==void 0&&{trail:_R(r)}}}function _R(e){let t=e.blankCopy(e.plain);t.style=FN(e.style).clearMetaAndLinks();for(let{start:n,end:r,style:i}of e.spans)t.stylize(FN(i).clearMetaAndLinks(),n,r);return t}function vR(e){let t=hR(e);if(t.length===1)return e.text;let n=pR(t);return n.style=e.text.style,n}function yR(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,placement:s,lead:c=[],trail:l=[]}=t;if(e.length===0)return[];let u=pR(e,a).pad(o),d=new W(` `.repeat(o)),f={placement:s,...c.length>0&&{lead:pR([d,...c],a)},...l.length>0&&{trail:pR([...l,d],a)}};if(n===`auto`)return[{text:u,...f}];let p={justify:r,truncate:i};return n===`fill`?[{text:u,fill:p,...f}]:(mR(u,n,p),[{text:u,...f}])}function bR(e,t){let n=()=>e.map(e=>({owner:vR(e),placement:e.placement})),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=rP(e.map(vR),t).split(`
|
|
198
|
+
`);if(i.length>1)return n();let a=Math.max(0,t.width-qN(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:n},i)=>{let a=o+(i===r.length-1?s:0),{text:c}=e[t];mR(c,c.cellLength+a,n)}),n()}function xR(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=SR(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e){let e={frag:a,style:FN(a.style)};if(e.style.link){i();let r=SR([e],t);r.plain.length>0&&n.push(r)}else r.push(e)}return i(),n}function SR(e,t){let n=t!==void 0&&!t.isNull?t:void 0,r=e.map(e=>CR(e.frag,n?n.add(e.style):e.style)),i=W.fromFragments(r);return i.end=``,i.overflow=`ignore`,r.length===1?i.style=r[0].style:n!==void 0&&(i.style=n),i}function CR(e,t){let n=e.copy();return n.style=t,n}function wR(e,t){if(e.look===void 0)throw Error(`${t} read the render's look before any render resolved one`);return e.look}function TR(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,ER(e,t,o,n,r,i));return i}function ER(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=Tw(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=iw.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=Tw(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=Tw(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:kR(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:kR(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:eO(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:kR(e,n.name,t)};if(`themeDefault`in n)return{kind:`theme-default-save`};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 DR(e){return e.kind===`do`?DR(e.head):e}function OR(e){switch(DR(e).kind){case`set-option`:case`set-int`:case`persist-option`:case`layout-op-option`:return!0;case`set-literal`:case`set-bounded`:case`set-cycle`:case`copy`:case`open`:case`persist-literal`:case`persist-bounded`:case`persist-cycle`:case`reset`:case`layout-op`:case`undo`:case`redo`:case`back`:case`rewind`:case`save`:case`preset-save`:case`preset-delete`:case`theme-default-save`:case`doctor-run`:case`doctor-fix`:case`ceiling`:case`slash`:case`do`:return!1}}function kR(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function AR(e,t){return e.has(t)?Bx(e.read(t)):``}function jR(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function MR(e,t,n,r){let i=new W(e,{style:H.combine([r,new H({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function NR(e,t){return Math.max(e.members.indexOf(AR(t,e.stateVar)),0)}function PR(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=AR(r,e.stateVar);return{effects:[{verb:Vj,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=AR(r,e.stateVar);return{effects:[{verb:Vj,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=AR(r,e.stateVar);return{effects:[{verb:Vj,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(NR(e,r)+1)%e.members.length];return{effects:[{verb:Vj,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:Hj,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:Uj,args:[jR(e.text,NS(r))]}],active:!1};case`open`:return{effects:[{verb:Wj,args:[jR(e.target,NS(r))]}],active:!1};case`persist-literal`:{let t=AR(r,e.stateVar);return{effects:[{verb:Jj,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=AR(r,e.stateVar);return{effects:[{verb:Jj,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(NR(e,r)+1)%e.members.length];return{effects:[{verb:Jj,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:Yj,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:eM,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:nM,args:[i]}],active:!1};case`redo`:return{effects:[{verb:rM,args:[i]}],active:!1};case`back`:return{effects:[{verb:iM,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:aM,args:[i]}],active:!1};case`save`:return{effects:[{verb:Xj,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:Zj,args:[i]}],active:!1};case`theme-default-save`:return{effects:[{verb:Qj,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:$j,args:[i,jR(e.name,NS(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:sM,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:cM,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:uM,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:dM,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:tM,args:[i,e.key,TP(e.op)]}],active:!1};case`do`:{let a=PR(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>PR(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:tM,args:[i,e.key,TP(r)]}],active:!1}}}}function FR(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:Ud(`action "${e}"`,n,t.members.length,NR(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 IR(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}=FR(e,DR(r),t,i),{effects:s,active:c}=PR(r,a,o,i,AR(i,`session.id`));return MR(a,mM(s),c)}function LR(e){return{action:{fn:(t,...n)=>IR(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function RR(e,t){return MR(`✕`,mM([{verb:Vj,args:[AR(e,`session.id`),t,Bd]}]),!1)}function zR(e,t,n){return new H({bgcolor:L.fromRgba(t),color:L.fromRgba(nc(e,t,n))})}function BR({tint:e,text:t}){return new H({bgcolor:L.fromRgba(e),color:L.fromRgba(t)})}function VR(e,t,n){return new H({color:L.fromRgba(Or(Ks(e,`warning`),t,tc,n))})}function HR(e,t,n){return H.combine([zR(e,t,n),VR(e,t,n)])}function UR(e,t,n){return zR(e.palette,Sc(e.palette,e.disclosure,[t],n),n)}function WR(e,t,n,r,i,a){return r===void 0?n=>UR(e,{...n,distribution:t},i):(e,t)=>GR(r(t,n),a,i)}function GR(e,t,n){return new H({bgcolor:L.fromRgba(t),color:L.fromRgba(Or(Ks(e,`primary`),t,4.5,n))})}function KR(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>qR(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function qR(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function JR(e,t){return new W(e).truncate(t,{marker:`…`}).plain}function YR(e){return{current:null,drawnAt:e}}function XR(e,t,n,r,i,a,o){let s={segName:t,placementId:n,palette:r,disclosure:i,tint:a,text:o,bg:void 0,drops:[]};return e.current=s,s}function ZR(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 QR(e){return new W(e).cellLength}function $R(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function ez(e){return Math.max(1,$R(e)-(QR(`✕`)+2*e.padding+e.seamCols))}function tz(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 nz(e,t,n){let r=QR(`←`)+1+QR(`→`)+1,i=tz(e,t,n);return(i.length>1?tz(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function rz(e,t){let n=[];for(let t of e)n.length>0&&n.push(new W(` `)),n.push(t);let r=W.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function iz(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 az(e,t,n){let r=e.compiled.get(t),i=r&&DR(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 oz(e,t,n,r,i,a,o){let s=az(i,e,`picker`),c=i.compiled.get(e),l=i.store,u=AR(l,`session.id`),d=`stateVar`in s?AR(l,s.stateVar):void 0,f=r?n.kind===`led`?ez(i):$R(i):1/0,p=n.kind===`led`?0:QR(`✕`)+1,m=s.library&&{groups:s.library.groups,entries:s.options.map(s.library.entry)},h=m===void 0?nz(s.options.map(QR),f,p):KR(m.entries,m.groups,r),g=parseInt(AR(l,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>mM([{verb:Vj,args:[u,t.key,String(e)]}]),b=n.kind===`led`?[]:[{verb:Vj,args:[u,...n.writes.flatMap(([e,t])=>[e,t])]}],x=n.kind===`own`&&n.onPick?b:[],S=e=>mM([...PR(c,e,e,l,u).effects,...x]),C=(e,t)=>{let n=s.options[e];return MR(t,S(n),n===d,a({index:e,count:s.options.length},n))},ee=n.kind===`led`?[]:[MR(`✕`,mM(b),!1,o)];_>0&&ee.push(MR(`←`,y(_-1),!1));let w=_<h.length-1?[MR(`→`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[rz([...ee,...e.map(e=>C(e,s.options[e])),...w],r)]}let te=new H({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new W(`${v[0].label}${ne}`,{style:te})]:[],ie=[rz([...ee,...re,...w],r)];for(let e of v){v.length>1&&ie.push(rz([new W(e.label,{style:te})],r));let t=Math.max(...e.indices.map(e=>QR(s.options[e])));for(let n of e.indices){let e=s.options[n],i=m.entries[n].description,a=i===void 0?void 0:DN(i),o=` `.repeat(t-QR(e)+2),c=a===void 0?e:`${e}${o}${a}`;ie.push(rz([C(n,JR(c,f))],r))}}return ie}function sz(e,t){return{picker:{fn:(n,r,i,a,o,...s)=>{DS(`picker "${n}"`,[`closeOnPick`,`paged`,`inBody`],s);let c=iz(e,r,`set-int`,`an int action ({ set, int: true })`);if(o===!0&&i===!0)throw Error(`{{ picker "${n}" … }} sets both closeOnPick and inBody; a picker in a body is closed by the body's ✕, so it has no close to fold into a pick`);let l=az(e,n,`picker`);if(l.library!==void 0)throw Error(`{{ picker "${n}" … }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let u=ZR(t,`{{ picker }}`);if(u.bg===void 0)throw Error(`{{ picker }} is not available while segments.${u.segName}'s own "bg:" is being evaluated — a picker is drawn on that background`);let[d]=oz(n,{key:c.key,stateVar:c.stateVar},o===!0?{kind:`led`}:{kind:`own`,writes:[[c.key,`-1`]],onPick:i===!0},a===!0,e,WR(u,Ps(void 0),wR(e,`{{ picker }}`),l.paletteOf,t.drawnAt(),u.bg),VR(u.palette,u.bg,t.drawnAt()));return d},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function cz(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+QR(e(-(s+1)))+1+QR(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function lz(e,t,n,r,i,a){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let o=n.store;if(!o.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let s=n.compiled.get(e),c=AR(o,`session.id`),{options:l}=t,u=l.length;if(u===0)return rz([],!0);let d=AR(o,t.stateVar),f=Math.max(l.indexOf(d),0),p=e=>((f+e)%u+u)%u,m=e=>l[p(e)],h=new Map,g=e=>{let t=h.get(e);if(t!==void 0)return t;let n=mM(PR(s,m(e),m(e),o,c).effects);return h.set(e,n),n},_=e=>MR(m(e),g(e),m(e)===d,r({index:p(e),count:u},m(e))),v=a===void 0?_(0):MR(m(0),mM(PR(n.compiled.get(a),m(0),void 0,o,c).effects),!1),y=cz(m,u,QR(`◀`)+1+v.cellLength+1+QR(`▶`),ez(n),i),b=e=>Array.from({length:y},(t,n)=>_(e*(n+1)));return rz([...b(-1).reverse(),MR(`◀`,g(-1),!1),v,MR(`▶`,g(1),!1),...b(1)],!0)}function uz(e,t){return{carousel:{fn:(n,...r)=>{let[i,a,...o]=r;if(DS(`carousel "${n}"`,[`neighbours`,`centre`],o),i!==void 0&&!(Number.isInteger(i)&&i>=0))throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(i)}`);if(a!==void 0&&!(typeof a==`string`&&e.compiled.has(a)))throw Error(`carousel "${n}": centre must name a declared action, got ${JSON.stringify(a)}`);if(a!==void 0&&OR(e.compiled.get(a)))throw Error(`carousel "${n}": centre "${a}" writes a value the template binds, and the centre binds none — name an action that writes a fixed value, a cycle, or a do of them`);let s=i??1/0,c=az(e,n,`carousel`),l=ZR(t,`{{ carousel }}`);if(l.bg===void 0)throw Error(`{{ carousel }} is not available while segments.${l.segName}'s own "bg:" is being evaluated — a carousel is drawn on that background`);return lz(n,c,e,WR(l,Ps(void 0),wR(e,`{{ carousel }}`),c.paletteOf,t.drawnAt(),l.bg),s,a)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}const dz=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function fz(e,t,n,r){let i=mc(e,n,r),a=(t,n)=>({text:t,colour:n,ink:nc(e,n,r)});return[ks(t).map((n,i)=>{let a=qs(e,n);return{text:dz[i%dz.length],colour:a,ink:t.shade.text(e,n.hue,a,r)}}),[a(`▾ open`,i.state),a(`menu`,i.plane)],[a(`warn`,Ks(e,`warning`)),a(`error`,Ks(e,`error`))]]}function pz(e,t,n,r,i){let a=fz(e,t,n,r).flatMap((e,t)=>e.map(({text:e,colour:n,ink:r},i)=>({gap:t>0&&i===0?` `:``,cell:new W(` ${e} `,{style:BR({tint:n,text:r})})}))),o=[],s=0;for(let{gap:e,cell:t}of a){if(s+=e.length+t.cellLength,s>i)break;e!==``&&o.push(new W(e)),o.push(t)}let c=W.fromFragments(o);return c.overflow=`ignore`,c.end=``,c}function mz(e,t){return{themePreview:{fn:()=>{let{palette:n,decor:r}=wR(e,`{{ themePreview }}`);return pz(n,r,{...ZR(t,`{{ themePreview }}`).disclosure,depth:0},t.drawnAt(),ez(e))},argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const hz=e=>e.slice(e.lastIndexOf(`.`)+1),gz=(e,t)=>{let n=new W(hz(e));return n.truncate(t,{marker:`…`}),n.plain};function _z(e,t){let n=e.map(e=>e.map(({name:e})=>QR(hz(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 vz(e,t,n,r){let i=_z(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new W(` ${gz(s,i)} `,{style:BR(Ec(l,{kind:`bar`,decor:t,address:c},n))});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=W.fromFragments(a.flatMap((e,t)=>t===0?e:[new W(`
|
|
199
|
+
`),...e]));return o.overflow=`ignore`,o.end=``,o}function yz(e,t){return{layoutPreview:{fn:()=>vz(e.layout(),wR(e,`{{ layoutPreview }}`).decor,t.drawnAt(),ez(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function bz(e,t,n,r){let i=ZR(r.activeSegment,`{{ menu }}`),a=r.action,o=Cb(i.placementId,e,n.key),s=Eb(o),c=Sb(e),l=AR(a.store,o)===c,u=AR(a.store,`session.id`),d=l?Bd:c,f=MR(Ud(`{{ menu "${e}" }}`,t,2,+!!l),mM([{verb:Vj,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?(()=>{let t=r.activeSegment.drawnAt(),c=mc(i.palette,i.disclosure,t).plane;return oz(e,{key:s,stateVar:s},{kind:`own`,writes:[[o,Bd],[s,`0`]],onPick:n.closeOnPick},n.paged,a,WR(i,n.distribution,wR(a,`{{ menu }}`),az(a,e,`menu`).paletteOf,t,c),VR(i.palette,c,t))})():[]),f}const xz=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Sz(e,t){let n=t[t.length-1],r=xz(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:Ab(r??{})}}function Cz(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=Sz(t,n);return bz(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function wz(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=Tz(t,n,r),c=[];for(let e=0;e<r;e++){let t=e<s,l=t&&o!==void 0?o(e*n/r):void 0;c.push(new W(t?i:a,{style:l===void 0?void 0:new H({color:l})}))}let l=W.fromFragments(c);return l.end=``,l.overflow=`ignore`,l}function Tz(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 Ez(e){let t={fn:(()=>{let t=ZR(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:(()=>ZR(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r={fn:((t,n)=>{let{palette:r}=ZR(e,`{{ keptOn }}`),i=yr(r,t),a=yr(r,n),o=P(Ar(i,F.TRUECOLOR),Ar(a,F.TRUECOLOR)),s=Math.min(tc,Math.max(o,3));return(kr(i,e.drawnAt(),(e,t)=>P(e,t(a))>=s)??i).hex}),argTypes:[`string`,`string`],arity:{kind:`exact`},returnType:`string`},i=pS(()=>ZR(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),a={fn:((e,t,n,r,a,o,...s)=>{let c=o===void 0?void 0:[o,...Dz(s)];return wz({value:e,max:t,width:n,filled:r,empty:a,colourAt:c===void 0?void 0:e=>String(i.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...i,bgOf:t,tint:n,keptOn:r,gauge:a}}function Dz(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 Oz(e){let t=[],n=[];for(let r of e){if(!r.contains(`
|
|
200
200
|
`)){n.push(r);continue}let e=r.split(`
|
|
201
|
-
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function Hz(e){let t=new Map;return e.map(e=>{let n=`${e.place}.${e.band}`,r=t.get(n)??0;return t.set(n,r+1),{line:e,row:`${n}#${r}`}})}function Uz(e,t){let n=[],r=[],i;for(let a of t)(a.band===`own`?n:r).push(a),i??=a.cells.find(t=>t.placement.id===e)?.placement.ground;return{drawing:i===void 0?null:{own:r.length===0?n:[],ground:i},deeper:r}}function Wz(e){return{...e,cells:e.cells.map(kR)}}function Gz(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,...Kz(e,r)]}function Kz(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 qz(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:Gz(e.direction,e.children.map((t,i)=>n(t,[...r,Jz(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function Jz(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:yu[e.direction]}}const Yz={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:Ps(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Tu(t.path,n)))}},render(e,t){return Gz(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,Jz(e,r))))}},Xz={drop:e=>e.place,above:()=>`above`},Zz={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},Qz={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:bu(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Kd(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Eu(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render:(e,t)=>t.placed(e.id,$z(e,t))};function $z(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=FS(t.scope,e.settings);try{if(!TR(i.when,a))return[];let n=lw(e.settings.theme,t.palette),o={id:e.id,effect:e.settings.effect,ground:Gw(n)},s=e.opens!==void 0&&TR(e.opens.open,t.scope),{styles:c,fragments:l,lead:u,trail:d,drops:f,open:p}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},s),m=p?c.trigger:c.closed,h={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:m,padding:t.padding,placement:o},g=e.opens,_=g===void 0?[]:t.renderBody(g.body,s,c.disclosure).map(e=>({...e,place:Xz[g.placement](e)})),v=Vz(PR(l,m)).map((e,t)=>({cells:MR(e,{...h,lead:t===0?PR(u,m):[],trail:t===0?PR(d,m):[]}),band:`own`,place:`flow`})),y=f.map(e=>({cells:MR(PR([e],c.band),{...h,baseStyle:c.band}),band:`deeper`,place:`flow`})),b=(e,t,n)=>MR(PR([e],t),{...h,width:`auto`,baseStyle:t,padding:n}),x=_.findIndex(e=>e.band===`own`),{lead:S,stays:C}=g!==void 0&&x!==-1?Zz[g.placement](v,()=>b(t.closeDisclosure(g.key),c.close,t.padding)):{lead:[],stays:v},ee=S.flatMap(e=>b(new W(` `.repeat(OR(e).reduce((e,t)=>e+t.cellLength,0))),c.trigger,0)),w=(e,t)=>e.band===`own`?t===x?S:ee:[],te=_.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),ne=[...C,...y];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...ne.flatMap(e=>e.cells),..._.flatMap(w)].flatMap(OR)),[...ne,...te]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:MR([new W(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,placement:{id:e.id,effect:`bar`,ground:Gw(t.palette)},lead:eB(e.lead,e,a,t),trail:eB(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}function eB(e,t,n,r){if(e===void 0)return[];try{return r.evaluateSegment(t,n,r.palette,r.region,{bg:void 0,fg:void 0,body:e,lead:void 0,trail:void 0},!1).fragments}catch(e){return r.onSegmentError?.(t.id,e.message??String(e)),[]}}const tB={container:Yz,segment:Qz};function nB(e){return tB[e]}function rB(e){if(`ttl`in e)return{kind:`ttl`,durationMs:DC(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 iB(e,t){switch(Au(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 aB(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`dropped`:e.declareFailedDocument(t,n.reason);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:rB(n.cache),parse:iB(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:rB(n.cache),parse:iB(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,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 oB(e,t){let n=eh.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 sB=(e,t,n,r,i)=>{let a=aF(t,iF(n,e.themeDefaults));return{variation:Os[r??cl(void 0,null,a.variation)],shade:Es[i??dl(void 0,null,a.shade)]}};function cB(e,t,n){let r=n.cwd,i={store:t.variableStore,compiled:new Map,chromeCols:QN({endcaps:`powerline`,charset:rl}),width:80,padding:1,seamCols:$N({endcaps:`powerline`,charset:rl}),layout:()=>[],look:void 0},a=cz(t.drawnAt),o={action:i,activeSegment:a},s=Object.keys(e.styles),c=Nb(e.presets),l=jD(e),u=MS({extraFuncs:{...XR(i),...bz(i,a),...Cz(i,a),...Dz(i,a),...Mz(i,a),...Iz(o),...zz(a),styles:{fn:()=>s,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>c,argTypes:[],arity:{kind:`exact`}}},clock:t.now,drawnAt:t.drawnAt}),d=oB(u,e.helpers),f=e=>u.parse(e,d),p=new Map,m=e=>{let t=p.get(e);if(t!==void 0)return t;let n=f(e);return p.set(e,n),n},h=new Map;for(let[t,n]of nw)n in e.variables&&h.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!h.has(n.key)&&h.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`&&!h.has(r.key)&&h.set(r.key,`${t}.${e}`);i.compiled=RR(f,e.actions,h,l);let g=[];for(let[n,i]of Object.entries(e.variables))try{aB(t,n,i,r)}catch(e){g.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{aB(t,`${n}.${e}`,a,r)}catch(t){g.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let _=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=f)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};_[t]={when:n.when===void 0?void 0:e(n.when,`when`,m),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 v=(e,t,n)=>{try{return m(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},y=t.variableStore,b=t=>{let n=Lu(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n))Object.defineProperty(r,e,{enumerable:!0,get:()=>Uu(t,e,i,e=>String(y.read(e.variable)))});return Object.freeze(r)},x=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:v(e.when,t,`when`),parse:(e,n)=>v(e,t,n),compileChild:x,placementSettings:b};return nB(e.kind).compile(e,n)},S=new Map;for(let t of c){let{node:n,path:r}=Ib(e,t);S.set(t,x(n,r))}let C=new Map(Ic.map(e=>[e,new Map])),ee=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of ee)for(let n of Ic){let r=t[n];if(!Lc(r))continue;let i=`${e}.${n}`,a=C.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:lB(f,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:_,roots:S,activeSegment:a,menuRuntime:o,globalExpressions:C,loadWarnings:g}}function lB(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 uB(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 dB(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function fB(e,t){return e.kind===`decided`?e.name:t}function pB(e,t,n,r,i,a,o,s,c){let{perSegmentSink:l,onSegmentError:u,onRenderWarning:d}=s??{},f=new Set;r.renderAt(a),r.drawAt(al(o.colorCompatibility));let{preset:p=jb}=c??{},m=Lb(e,p),h=c?.style??Hc(`none`,e.styles),g=c?.theme??hw(void 0,null,m.palette),_=sB(e,m,g,c?.variation,c?.shade),v=c?.effect??Yc(void 0,null,m.effect),y=(e,t,n)=>({...i,term:{cols:o.width},theme:{effective:e},style:{effective:t},effect:{effective:n}});r.applyInput(y(fB(g,kc),fB(h,Bc),fB(v,Wc))),t.menuRuntime.action.chromeCols=QN(o),t.menuRuntime.action.padding=o.padding,t.menuRuntime.action.width=o.width,t.menuRuntime.action.seamCols=$N(o);let b=NS(n),x=zc(g,e=>{let n=uB(t,`palette`,e);return mw(dB(n,b),n.where,e=>d?.({kind:`theme-rule`,message:e}))}),S=zc(h,n=>Hc(dB(uB(t,`style`,n),b),e.styles)),C=zc(v,e=>Jc(dB(uB(t,`effect`,e),b)));(x!==g||S!==h||C!==v)&&r.applyInput(y(x.name,S.name,C.name));let ee=x.value,w=dw(ee,S.value);t.menuRuntime.action.look={basePalette:ee,palette:w,decor:_};let te=(c?.effects??new HN(``)).motion(C.value,a,{transitions:c?.transitions??xl(void 0,null,m.transitions),source:{config:t,preset:p,revision:r.stateRevision(),width:o.width},returned:Uz,hold:Wz});l?.clear();let ne=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},re=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,text:u,disclosure:d}=Ec(i,a,c),p=lz(t.activeSegment,e.name,e.id,i,d,l,u),m=qw(p,c,o.bg,o.fg,n),h=()=>mc(i,d,c);s&&(p.bg=h().state);let g=o.body.evaluate(n),_=p.drops.length>0||s;if(_){let e=h();p.bg=e.state;for(let t of e.shortfalls)f.add(t)}let v=o.lead?.evaluate(n)??[],y=o.trail?.evaluate(n)??[];return{styles:{closed:m,get trigger(){return QR(i,h().state,c)},get band(){return QR(i,h().plane,c)},get close(){return tz(i,h().state,c)},disclosure:d},fragments:g,lead:v,trail:y,drops:p.drops,open:_}}finally{t.activeSegment.current=null}},ie=(e,t,r)=>{let i=t&&TR(e.when,b),a={scope:b,palette:w,visible:i,padding:o.padding,region:r,perSegmentSink:l,onSegmentError:u,evaluateSegment:re,lookupSegment:ne,renderChild:(e,t,n)=>ie(e,t,wc(r,n)),renderBody:(e,t,n)=>ie(e,i&&t,Tc(n)),closeDisclosure:e=>ZR(n,e),placed:te.placed};return nB(e.kind).render(e,a)},T=t.roots.get(p);if(T===void 0)throw Error(`Preset "${p}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${jb}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let E=e=>{if(!TR(e.when,b))return!1;if(e.kind===`container`)return!0;if(HD(e.name)===void 0)return!1;try{return TR(t.segments[e.name].when,FS(b,e.settings))}catch{return!0}};t.menuRuntime.action.layout=()=>qz(T,E).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=HD(e);return r===void 0?[]:[{name:r,address:t,palette:lw(n.theme,w)}]}));let ae=Hz(ie(T,!0,Cc(_))).map(({line:e,row:t})=>{let n=NR(e.cells,o);return eP(n.map(e=>e.owner),o,te.row(t,n))}).join(`
|
|
202
|
-
`);te.drawn();for(let e of f)d?.({kind:`band-floor`,message:e});return ae}function*
|
|
203
|
-
`)||null}function jB(e,t,n,r,i=()=>{}){let{layers:a,config:o,installed:s}=gA(t.layers,eF,{entered:i,warned:e=>n.push(...e)},{projectDir:t.projectDir});i(a.length===1?a[0].path:null);let c=a.at(-1)?.config??eF,l=a.find(e=>e.path===t.home)?.raw??{},u=new TB,d=new JC(u,o.globals.default_empty_value??``,r.gitService,r.sessionState),f;try{f=cB(o,d,{cwd:e}),n.push(...f.loadWarnings),zI(o),LP(o)}catch(e){throw d.dispose(),e}return{config:o,store:u,registry:d,compiled:f,neededInputPaths:GF(o),lastRenderCellsBySegment:new Map,authoredRoots:OB(c,l),fileHeldSettings:TI(l),unused:[...new Map(a.flatMap(e=>_B(e.raw,c)).map(e=>[`${e.kind}:${e.name}`,e])).values()],plugins:{roots:s.roots,loaded:[...s.rendering.values()],dropped:[...s.dropped,...a.flatMap(e=>e.plugins.dropped)],unreached:s.unreached,reached:s.reached,rendering:s.rendering}}}function MB(e,t,n,r){let i=Ak(e,t,n),a={layers:i.kind===`chain`?i.layers:[],home:i.home,projectDir:e},o=[Fk(e,t),Nk(i)],s,c=null;try{s=jB(t,a,o,r,e=>{c=e})}catch(e){return e instanceof pu&&o.push(...e.warnings),{layers:a.layers,home:a.home,failedFile:c,warning:AB(o),state:null,error:e instanceof pu||e instanceof Error?e.message:String(e)}}return{layers:a.layers,home:a.home,warning:AB(o),state:s,error:null}}function NB(e,t,n){return jB(e,{layers:[],home:``,projectDir:t},[],n)}var PB=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=DB(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=MB(e,t,n,this.deps);a.state!==null&&EB(a.layers,a.state.plugins);let o={projectDir:e,cwd:t,configFile:n,configLayers:[],configHome:``,failedFile:null,lastError:a.error,lastWarning:a.warning,state:a.state??NB(t,e,this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=MB(e.projectDir,e.cwd,e.configFile,this.deps);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(EB(t.layers,t.state.plugins),e.state.registry.dispose(),e.state=t.state),this.refreshWatcher(e,t),this.observers.onReload?.(e)}refreshWatcher(e,t){e.configLayers=t.layers,e.configHome=t.home,e.failedFile=t.error===null?null:t.failedFile;let n=kB(e,t.layers),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const FB=16384;var IB=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<FB){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%FB}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:JA,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},effectCache:e.effectCache,watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null,handlerProbes:e.handlerProbes}}};function LB(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),revision:t=>e.revision(t),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const RB={load:()=>({}),save:()=>{},flush:()=>{}};var zB=class{sessions;storage;head=0;atom=(0,Lx.createAtom)(`SessionState`);constructor(e=RB,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=new Map(Object.entries(this.storage.load()).map(([e,t])=>[e,{values:new Map(Object.entries(t)),revision:++this.head}])),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.values.get(t)??null):null}revision(e){return this.atom.reportObserved(),this.sessions.get(e)?.revision??0}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,Lx.runInAction)(()=>{let n=this.sessions.get(e)??{values:new Map,revision:0};t.some(({key:e,value:t})=>n.values.get(e)!==t)&&(n.revision=++this.head);for(let{key:e,value:r}of t)n.values.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,Lx.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.values.delete(t)&&(n.revision=++this.head),n.values.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,Lx.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,{values:n}]of this.sessions)e[t]=Object.fromEntries(n);return e}};function BB(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 VB=class{timer=null;pending=null;constructor(e,t=500,n=uC){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 BB(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(l.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const HB={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,effect:`string`,preset:`string`,endcaps:`string`,variation:`string`,shade:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,transitions:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},UB=new Set([`1`,`true`]),WB=new Set([`0`,`false`,``]);function GB(e,t){let n=gV(e),r=n.scope===`segment-palette`?`string`:HB[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(UB.has(t))return`true`;if(WB.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function KB(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function qB(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function JB(e){return/^\s*$/.test(e)?null:kl(e)}function YB(e,t){return e!==null&&jl(e,t)!==void 0}function XB(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(XB),...i}}return e}function ZB(e){if(!Od(e))return XB(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,XB(t)])),...n}}const QB=QP,$B=QB.segments,eV=QB.presets,tV=QB.root;function nV(e,t,n,r){if(!YB(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function rV(e,t){let n=Bw(t);return t.scope===`segment-palette`&&nV(e,[`segments`,t.segment],$B[t.segment],n.join(`.`)),n}function iV(e){return kl(zl(e))}function aV(){return Object.entries(tV.rows).map(([e,t])=>{let n=XB(t);return{path:[`root`],fragment:iV({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function oV(e,t){let n=e===null?void 0:jl(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function sV(e,t){if(t===void 0)return null;let n=ZB(t);return{path:e,fragment:iV(n),unit:{path:e,value:n}}}function cV(e,t){let n=[`presets`,t],r=[...n,`root`],i=eV[t];nV(e,n,i,r.join(`.`));let a=oV(e,r)??sV(r,i?.root);return a!==null&&ou(a.fragment)?a:null}function lV(e,t){let n=au(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 uV(e,t){return[...aV(),oV(e,[`root`]),cV(e,t)].filter(e=>e!==null).reduce(lV,new Map)}function dV(e,t,n){for(let{node:r,...i}of uV(e,t).values())if(cu(r,n))return i;throw new $(`${fV(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 fV(e,t){return cV(e,t)?.path??[`root`]}function pV(e,t){return t.scope===`preset-root`?fV(e,t.preset):Bw(t)}function mV(e,{unit:t}){return t===null?e:$l(e,t.path,zl(t.value),Ll)}function hV(e){let t=zw(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function gV(e){let t=hV(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function _V(e,t,n,r,i){i(t,n,OV(t,r)),qB(t.path,r,e.logger),e.record(t.path,n,r)}function vV(e,t,n){let r=xV(e,t,n);if(r.length>0)throw new $(`refused: ${e.above.join(`, `)} sets ${r.join(`, `)} over ${e.path}, so this click would change nothing on the bar — edit it there`)}const yV=()=>{};function bV(e,t){try{return t()}catch(t){throw!(t instanceof $)||e.above.length===0?t:new $(`${t.message} — or it is declared by ${e.above.join(`, `)}, which the bar does not edit`)}}function xV(e,t,n){let r=SV(e,t);if(r===null)return[];let i=new Set(EV(TV(r),TV(n)));return EV(wV(e,r),wV(e,n)).filter(e=>!i.has(e))}function SV(e,t){try{return CV(e,t)}catch(e){if(e instanceof pu)return null;throw e}}function CV(e,t){return gA(t===null?e.above:[e.path,...e.above],eF,{entered:()=>{},warned:()=>{}},{projectDir:e.projectDir},n=>n===e.path&&t!==null?t:r.readFileSync(n,`utf8`))}function wV(e,t){let[n]=t.layers;return n?.path===e.path?n.config:t.base}function TV(e){return e.layers.at(-1)?.config??e.base}function EV(e,t,n=``){return!DV(e)||!DV(t)?JSON.stringify(e)===JSON.stringify(t)?[]:[n]:[...new Set([...Object.keys(e),...Object.keys(t)])].flatMap(r=>EV(e[r],t[r],n===``?r:`${n}.${r}`))}function DV(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function OV(e,t){try{return CV(e,t)}catch(e){throw e instanceof pu?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function kV(e,t){let n=gV(t),r=JB(KB(e)??``),i=r===null?void 0:jl(r,Bw(n));return i!==void 0&&`value`in i?i.value:void 0}function AV(e,t,n){jV(e,t,n,[])}function jV(e,t,n,r){let i=KB(t.path),a=n.reduce((e,[t,n])=>$l(e,rV(JB(e),gV(t)),GB(t,n),Ll),i??``);_V(e,t,i,bV(t,()=>MV(a,t.path,r,e=>e)),vV)}function MV(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=dV(JB(s),n,i),l=fu(mV(s,c),c.path,i,a,zl(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 NV(e,t,n){let r=JB(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of uV(r,t)){if(!cu(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Nl(e,c):zl(s.value);if(a!==`#`)return $l(e,[...i,`rows`,a],l,Ll);if(cV(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 $l(e,i,l,Ll)}return e}function PV(e,t){return tu(e,t,t[0]===`presets`&&t.length>2&&!nF(t[1])?2:0)}function FV(e,t,n){let r=n.map(hV),i=KB(t.path);if(i===null)return;let a=r.reduce((e,t)=>PV(e,pV(JB(e),t)),i);a!==i&&_V(e,t,i,a,yV)}function IV(e){let t=e===null?void 0:jl(e,[`presets`]);return t?.kind===`object`?t.entries.map(e=>e.key):[]}function LV(e,t){let n=new Set([...tF,...IV(e),...t.above.flatMap(e=>Object.keys(at.default.parse(r.readFileSync(e,`utf8`)).presets??{}))].map(bp));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(bp(e)))}function RV(e,t,n,r,i,a){let o=KB(t.path),s=JB(o??``),c=LV(s,t),l=[`presets`,c],u=bV(t,()=>cV(s,n)),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Nl(o??``,u.fragment):zl(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],zl(r)]]],f=i.map(([e,t])=>{let n=Rw(c,e);return[rV(s,gV(n)),GB(n,t)]}),p=[...d,...f].reduce((e,[t,n])=>$l(e,t,n,Ll),$l(o??``,l,`{}`,Ll));return _V(e,t,o,bV(t,()=>MV(p,t.path,a.map(e=>({...e,preset:c})),NV)),vV),c}function zV(e,t,n,r){let i=KB(t.path);_V(e,t,i,$l(i??``,[`themeDefaults`,n],zl(r),Ll),vV)}function BV(e,t,n){if(nF(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=KB(t.path),a=JB(i??``);if(i===null||a===null||jl(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t.path} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=jl(a,[`globals`,`preset`]);_V(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>PV(e,t),i),yV)}function VV(e,t,n,r){let i=hV(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=KB(t.path),o=r.op===`remove`?r.target:r.anchor,s=bV(t,()=>dV(JB(a??``),i.preset,o)),c=mV(a??``,s),{after:l,placed:u}=HV(c,s.path,r,()=>{let e=OV(t,c).config;return Nb(e.presets).map(t=>Ib(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t.path} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return _V(e,t,a,l,vV),u}function HV(e,t,n,r){switch(n.op){case`remove`:return{after:uu(e,t,n.target),placed:null};case`insert`:{let i=wP(n.segment,n.anchor,r());return{after:du(e,t,i,n.anchor,n.relation),placed:i}}}}const UV={load:()=>({}),save:()=>{}},WV=new Set(QC.map(e=>e.sessionKey)),GV=e=>WV.has(e)||e.startsWith(rx),KV=8*1024*1024,qV={past:[],future:[]},JV=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var YV=class{state=new Map;constructor(e,t,n=UV){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??qV;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??qV}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(JV(n));r.set(JV(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:LB(this.sessionState,e=>GV(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:rH(i,n),o=r.get(e),s=o===void 0?a:sH(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,aH(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint — nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(JV)),a=n.net.filter(e=>!i.has(JV(e))),o=QV(cH(oH(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(uH).join(`, `)} changed since edit mode opened — kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=QV(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...eH(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(JV)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:cH(n,t),future:cH(i,t),...a!==void 0&&{savepoint:{at:cH([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(JV(e))),below:cH(a.below,t)}}}),new $(`${r}: ${o.map(uH).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):KB(t.file)}write(e,t,n){t.kind===`file`?qB(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||XV(n)>KV;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,ZV(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${KV} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function XV(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function ZV({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...eH(n,1,[])}:{past:e,future:t.slice(1),...eH(n,0,[])}}function QV(e){return e.slice(-50)}const $V=e=>e===ax.member;function eH(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:tH(e.net,n),below:e.below}}}function tH(e,t){let n=new Map(e.map(e=>[JV(e),e]));for(let e of t){let t=n.get(JV(e));n.set(JV(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const nH=e=>e.map(e=>({...e,before:e.after,after:e.before}));function rH(e,t){let n=[...e.past,t],r=QV(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...eH(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...iH(e.future,a),...i.below]},n.length-r.length,t)}}function iH(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function aH(e,t){return{past:e.past.slice(0,-1),future:QV([...e.future,t]),...eH(e.savepoint,0,nH(t))}}function oH(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...iH(r,t.at-i.length),...t.below]}function sH(e,t){if($V(t.after)&&!$V(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!$V(t.after)&&$V(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function cH(e,t){return e.map(e=>e.filter(e=>!t.has(JV(e)))).filter(e=>e.length>0)}function lH(e){return e.map(uH).join(`, `)}function uH(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function dH(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 fH(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(dH))}function pH(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(dH)&&fH(t.below)}function mH(e){if(typeof e!=`object`||!e)return!1;let t=e;return fH(t.past)&&fH(t.future)&&(t.savepoint===void 0||pH(t.savepoint))}function hH(e,t){let n=e=>e.kind===`file`||GV(e.key)?!0:(t.add(e.key),!1),r=e=>e.map(e=>e.filter(n)).filter(e=>e.length>0),{savepoint:i}=e,a=r(e.past),o=r(e.future);return i===void 0?{past:a,future:o}:{past:a,future:o,savepoint:{at:r(e.past.slice(0,i.at)).length,net:i.net.filter(n),below:r(i.below)}}}function gH(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(mH)){let n=new Set,r=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,hH(t,n)]));return n.size>0&&t(`warn`,`settings-history load: dropped the changes to ${[...n].map(e=>`"${e}"`).join(`, `)}, no longer a setting`),r}}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}const _H=e=>!GV(e)&&!xT(e)&&e!==`update.dismissed`;var vH=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:LB(e,_H,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,Lx.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function yH(e){let t=vR(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 bH(e){return{probeTmux:yH,loadConfig:e}}function xH(e){let t={layers:e.layers,warnings:e.warning===null?[]:e.warning.split(`
|
|
204
|
-
`)};return e.error===null?{...t,kind:`loaded`,unused:e.unused}:{...t,kind:`failed`,error:e.error}}function
|
|
205
|
-
`);return}t.stdout.write(
|
|
201
|
+
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function kz(e){let t=new Map;return e.map(e=>{let n=`${e.place}.${e.band}`,r=t.get(n)??0;return t.set(n,r+1),{line:e,row:`${n}#${r}`}})}function Az(e,t){let n=[],r=[],i;for(let a of t)(a.band===`own`?n:r).push(a),i??=a.cells.find(t=>t.placement.id===e)?.placement.ground;return{drawing:i===void 0?null:{own:r.length===0?n:[],ground:i},deeper:r}}function jz(e){return{...e,cells:e.cells.map(gR)}}function Mz(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,...Nz(e,r)]}function Nz(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 Pz(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:Mz(e.direction,e.children.map((t,i)=>n(t,[...r,Fz(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function Fz(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:yu[e.direction]}}const Iz={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:Ps(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Tu(t.path,n)))}},render(e,t){return Mz(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,Fz(e,r))))}},Lz={drop:e=>e.place,above:()=>`above`},Rz={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},zz={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:bu(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Kd(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Eu(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render:(e,t)=>t.placed(e.id,Bz(e,t))};function Bz(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=FS(t.scope,e.settings);try{if(!fR(i.when,a))return[];let n=fw(e.settings.theme,t.palette),o={id:e.id,effect:e.settings.effect,ground:Jw(n)},s=e.opens!==void 0&&fR(e.opens.open,t.scope),{styles:c,fragments:l,lead:u,trail:d,drops:f,open:p}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},s),m=p?c.trigger:c.closed,h={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:m,padding:t.padding,placement:o},g=e.opens,_=g===void 0?[]:t.renderBody(g.body,s,c.disclosure).map(e=>({...e,place:Lz[g.placement](e)})),v=Oz(xR(l,m)).map((e,t)=>({cells:yR(e,{...h,lead:t===0?xR(u,m):[],trail:t===0?xR(d,m):[]}),band:`own`,place:`flow`})),y=f.map(e=>({cells:yR(xR([e],c.band),{...h,baseStyle:c.band}),band:`deeper`,place:`flow`})),b=(e,t,n)=>yR(xR([e],t),{...h,width:`auto`,baseStyle:t,padding:n}),x=_.findIndex(e=>e.band===`own`),{lead:S,stays:C}=g!==void 0&&x!==-1?Rz[g.placement](v,()=>b(t.closeDisclosure(g.key),c.close,t.padding)):{lead:[],stays:v},ee=S.flatMap(e=>b(new W(` `.repeat(hR(e).reduce((e,t)=>e+t.cellLength,0))),c.trigger,0)),w=(e,t)=>e.band===`own`?t===x?S:ee:[],te=_.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),ne=[...C,...y];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...ne.flatMap(e=>e.cells),..._.flatMap(w)].flatMap(hR)),[...ne,...te]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:yR([new W(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,placement:{id:e.id,effect:`bar`,ground:Jw(t.palette)},lead:Vz(e.lead,e,a,t),trail:Vz(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}function Vz(e,t,n,r){if(e===void 0)return[];try{return r.evaluateSegment(t,n,r.palette,r.region,{bg:void 0,fg:void 0,body:e,lead:void 0,trail:void 0},!1).fragments}catch(e){return r.onSegmentError?.(t.id,e.message??String(e)),[]}}const Hz={container:Iz,segment:zz};function Uz(e){return Hz[e]}function Wz(e){if(`ttl`in e)return{kind:`ttl`,durationMs:AC(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 Gz(e,t){switch(Au(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 Kz(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`dropped`:e.declareFailedDocument(t,n.reason);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:Wz(n.cache),parse:Gz(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:Wz(n.cache),parse:Gz(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,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 qz(e,t){let n=eh.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 Jz=(e,t,n,r,i)=>{let a=cF(t,sF(n,e.themeDefaults));return{variation:Os[r??cl(void 0,null,a.variation)],shade:Es[i??dl(void 0,null,a.shade)]}};function Yz(e,t,n){let r=n.cwd,i={store:t.variableStore,compiled:new Map,chromeCols:tP({endcaps:`powerline`,charset:rl}),width:80,padding:1,seamCols:nP({endcaps:`powerline`,charset:rl}),layout:()=>[],look:void 0},a=YR(t.drawnAt),o={action:i,activeSegment:a},s=Object.keys(e.styles),c=Nb(e.presets),l=PD(e),u=MS({extraFuncs:{...LR(i),...sz(i,a),...uz(i,a),...mz(i,a),...yz(i,a),...Cz(o),...Ez(a),styles:{fn:()=>s,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>c,argTypes:[],arity:{kind:`exact`}}},clock:t.now,drawnAt:t.drawnAt}),d=qz(u,e.helpers),f=e=>u.parse(e,d),p=new Map,m=e=>{let t=p.get(e);if(t!==void 0)return t;let n=f(e);return p.set(e,n),n},h=new Map;for(let[t,n]of aw)n in e.variables&&h.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!h.has(n.key)&&h.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`&&!h.has(r.key)&&h.set(r.key,`${t}.${e}`);i.compiled=TR(f,e.actions,h,l);let g=[];for(let[n,i]of Object.entries(e.variables))try{Kz(t,n,i,r)}catch(e){g.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{Kz(t,`${n}.${e}`,a,r)}catch(t){g.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let _=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=f)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};_[t]={when:n.when===void 0?void 0:e(n.when,`when`,m),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 v=(e,t,n)=>{try{return m(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},y=t.variableStore,b=t=>{let n=Lu(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n))Object.defineProperty(r,e,{enumerable:!0,get:()=>Uu(t,e,i,e=>String(y.read(e.variable)))});return Object.freeze(r)},x=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:v(e.when,t,`when`),parse:(e,n)=>v(e,t,n),compileChild:x,placementSettings:b};return Uz(e.kind).compile(e,n)},S=new Map;for(let t of c){let{node:n,path:r}=Ib(e,t);S.set(t,x(n,r))}let C=new Map(Ic.map(e=>[e,new Map])),ee=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of ee)for(let n of Ic){let r=t[n];if(!Lc(r))continue;let i=`${e}.${n}`,a=C.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:Xz(f,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:_,roots:S,activeSegment:a,menuRuntime:o,globalExpressions:C,loadWarnings:g}}function Xz(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 Zz(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 Qz(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function $z(e,t){return e.kind===`decided`?e.name:t}function eB(e,t,n,r,i,a,o,s,c){let{perSegmentSink:l,onSegmentError:u,onRenderWarning:d}=s??{},f=new Set;r.renderAt(a),r.drawAt(al(o.colorCompatibility));let{preset:p=jb}=c??{},m=Lb(e,p),h=c?.style??Hc(`none`,e.styles),g=c?.theme??vw(void 0,null,m.palette),_=Jz(e,m,g,c?.variation,c?.shade),v=c?.effect??Yc(void 0,null,m.effect),y=(e,t,n)=>({...i,term:{cols:o.width},theme:{effective:e},style:{effective:t},effect:{effective:n}});r.applyInput(y($z(g,kc),$z(h,Bc),$z(v,Wc))),t.menuRuntime.action.chromeCols=tP(o),t.menuRuntime.action.padding=o.padding,t.menuRuntime.action.width=o.width,t.menuRuntime.action.seamCols=nP(o);let b=NS(n),x=zc(g,e=>{let n=Zz(t,`palette`,e);return _w(Qz(n,b),n.where,e=>d?.({kind:`theme-rule`,message:e}))}),S=zc(h,n=>Hc(Qz(Zz(t,`style`,n),b),e.styles)),C=zc(v,e=>Jc(Qz(Zz(t,`effect`,e),b)));(x!==g||S!==h||C!==v)&&r.applyInput(y(x.name,S.name,C.name));let ee=x.value,w=mw(ee,S.value);t.menuRuntime.action.look={basePalette:ee,palette:w,decor:_};let te=(c?.effects??new GN(``)).motion(C.value,a,{transitions:c?.transitions??xl(void 0,null,m.transitions),source:{config:t,preset:p,revision:r.stateRevision(),width:o.width},returned:Az,hold:jz});l?.clear();let ne=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},re=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,text:u,disclosure:d}=Ec(i,a,c),p=XR(t.activeSegment,e.name,e.id,i,d,l,u),m=Xw(p,c,o.bg,o.fg,n),h=()=>mc(i,d,c);s&&(p.bg=h().state);let g=o.body.evaluate(n),_=p.drops.length>0||s;if(_){let e=h();p.bg=e.state;for(let t of e.shortfalls)f.add(t)}let v=o.lead?.evaluate(n)??[],y=o.trail?.evaluate(n)??[];return{styles:{closed:m,get trigger(){return zR(i,h().state,c)},get band(){return zR(i,h().plane,c)},get close(){return HR(i,h().state,c)},disclosure:d},fragments:g,lead:v,trail:y,drops:p.drops,open:_}}finally{t.activeSegment.current=null}},ie=(e,t,r)=>{let i=t&&fR(e.when,b),a={scope:b,palette:w,visible:i,padding:o.padding,region:r,perSegmentSink:l,onSegmentError:u,evaluateSegment:re,lookupSegment:ne,renderChild:(e,t,n)=>ie(e,t,wc(r,n)),renderBody:(e,t,n)=>ie(e,i&&t,Tc(n)),closeDisclosure:e=>RR(n,e),placed:te.placed};return Uz(e.kind).render(e,a)},T=t.roots.get(p);if(T===void 0)throw Error(`Preset "${p}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${jb}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let E=e=>{if(!fR(e.when,b))return!1;if(e.kind===`container`)return!0;if(GD(e.name)===void 0)return!1;try{return fR(t.segments[e.name].when,FS(b,e.settings))}catch{return!0}};t.menuRuntime.action.layout=()=>Pz(T,E).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=GD(e);return r===void 0?[]:[{name:r,address:t,palette:fw(n.theme,w)}]}));let ae=kz(ie(T,!0,Cc(_))).map(({line:e,row:t})=>{let n=bR(e.cells,o);return rP(n.map(e=>e.owner),o,te.row(t,n))}).join(`
|
|
202
|
+
`);te.drawn();for(let e of f)d?.({kind:`band-floor`,message:e});return ae}function*tB(e){yield*Object.entries(e.variables??{});for(let[t,n]of Object.entries(e.segments??{}))for(let[e,r]of Object.entries(n.vars??{}))yield[`${t}.${e}`,r]}function*nB(e){for(let t of Object.values(e.segments))for(let e of[t.template,t.bg,t.fg,t.when])e!==void 0&&(yield e);for(let t of Nb(e.presets)){for(let n of wu(Ib(e,t).node))n.when!==void 0&&(yield n.when);let n=Lb(e,t);for(let e of Ic){let t=n[e];Lc(t)&&(yield t)}}for(let[,t]of tB(e))t.kind===`template`&&(yield t.template),Mu(t)&&t.cache&&`key`in t.cache&&(yield t.cache.key);for(let t of Object.values(e.actions))`copy`in t&&(yield t.copy),`open`in t&&(yield t.open),`preset`in t&&t.preset===`delete`&&(yield t.name)}function rB(e,t){return e===t||t.startsWith(`${e}.`)||e.startsWith(`${t}.`)}function iB(e,t){let n=new Set,r=new Set,i=new Set;for(let e of nB(t)){for(let r of Cx(e,t.helpers).keys())n.add(r);for(let{name:n}of Dx(e,t.helpers))r.add(n);for(let n of Ox(e,t.helpers))i.add(n)}for(let[,e]of tB(t))if(Mu(e)&&e.cache&&`depends_on`in e.cache)for(let t of e.cache.depends_on)n.add(t);let a=new Set(r);for(let e of r){let n=t.actions[e];if(n!==void 0&&`do`in n)for(let e of n.do)a.add(e)}let o=new Set,s=new Set;for(let e of a){let n=t.actions[e];if(n!==void 0&&(`set`in n&&o.add(n.set),`insertSegment`in n&&s.add(n.insertSegment),`insertSegmentFrom`in n&&Array.isArray(n.insertSegmentFrom)))for(let e of n.insertSegmentFrom)s.add(e)}for(let e of Nb(t.presets))for(let n of wu(Ib(t,e).node))n.kind===`segment`&&s.add(n.name);let c=(e,t)=>[...n].some(t=>rB(t,e))||t.kind===`state`&&o.has(t.key),l=e=>[...e].filter(e=>!Ep(e)),u=(e,t,n)=>l(t).filter(e=>!n(e)).map(t=>({kind:e,name:t})),d=new Map(tB(e));return[...u(`variable`,d.keys(),e=>c(e,d.get(e))),...u(`action`,Object.keys(e.actions??{}),e=>a.has(e)),...u(`helper`,Object.keys(e.helpers??{}),e=>i.has(e)),...u(`segment`,Object.keys(e.segments??{}),e=>s.has(e))]}var aB=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,dB(e,t,n,`initial value`),this.cell=Lx.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){dB(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}},oB=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,Lx.computed)(()=>{let e=n();return dB(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},sB=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=Lx.observable.box(uB(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=uB(e);lB(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function cB(e){return JSON.stringify(e)}function lB(e,t){return cB(e)===cB(t)}function uB(e){return e.kind===`ok`?{kind:`ok`,value:Rx(e.value)}:e}function dB(e,t,n,r){let i=zx(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var fB=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new aB(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new sB(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new oB(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,Lx.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,Lx.runInAction)(()=>n.set(t))}runInAction(e){(0,Lx.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 cB(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 pB(e,{plugins:t,config:n}){let{checkout:r,loaded:i,dropped:a,unreached:o}=t,s=r===null?`-`:`${r.git?`git`:`dir`}:${r.root}`,c=e=>{let t=Uk(e),r=t===void 0?void 0:n.variables[Gk(t)];return r?.kind===`file`?r.path:`none`};return`config load ${e.join(` < `)||`<default>`}: plugins loaded=${i.length} dropped=${a.length} unplaced=${o.length} checkout=${s}`+i.map(e=>` +${e} data=${c(e)}`).join(``)+a.map(e=>` -${e.path} (${e.reason})`).join(``)+o.map(e=>` ~${e.path} (${e.reason})`).join(``)}function mB(e,t,n){return e+`\0`+t+`\0`+(n??``)}function hB(e,t){return new Set(Nb(e.presets).filter(n=>Ib(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function gB(e,t){let n=new Map,{roots:r,loaded:i,dropped:a,unreached:o}=e.state.plugins;for(let t of[...jk(e.projectDir,e.cwd,e.configFile),...r,...i,...[...a,...o].map(e=>e.path)]){let{dir:e,name:r}=Nx(t),i=n.has(e)?n.get(e):new Set;i?.add(r),n.set(e,i)}for(let e of r){let{dir:t,name:r,leaf:i}=Nx(l.join(e,`_`));i&&r===`_`&&n.set(t,null)}return{files:t,dirs:[...n.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>t===null?{path:e}:{path:e,filenames:[...t].sort()})}}function _B(e){return e.filter(Boolean).join(`
|
|
203
|
+
`)||null}function vB(e,t,n,r,i=()=>{}){let{layers:a,config:o,installed:s}=yA(t.layers,rF,{entered:i,warned:e=>n.push(...e)},{projectDir:t.projectDir,cwd:e});i(a.length===1?a[0].path:null);let c=a.at(-1)?.config??rF,l=a.find(e=>e.path===t.home)?.raw??{},u=new fB,d=new ZC(u,o.globals.default_empty_value??``,r.gitService,r.sessionState),f;try{f=Yz(o,d,{cwd:e}),n.push(...f.loadWarnings),HI(o),BP(o)}catch(e){throw d.dispose(),e}return{config:o,store:u,registry:d,compiled:f,neededInputPaths:JF(o),lastRenderCellsBySegment:new Map,authoredRoots:hB(c,l),fileHeldSettings:OI(l),unused:[...new Map(a.flatMap(e=>iB(e.raw,c)).map(e=>[`${e.kind}:${e.name}`,e])).values()],plugins:{checkout:s.checkout,roots:s.roots,loaded:[...s.rendering.values()],dropped:[...s.dropped,...a.flatMap(e=>e.plugins.dropped)],unreached:s.unreached,reached:s.reached,rendering:s.rendering}}}function yB(e,t,n,r){let i=Nk(e,t,n),a={layers:i.kind===`chain`?i.layers:[],home:i.home,projectDir:e},o=[Rk(e,t),Ik(i)],s,c=null;try{s=vB(t,a,o,r,e=>{c=e})}catch(e){return e instanceof pu&&o.push(...e.warnings),{layers:a.layers,home:a.home,failedFile:c,warning:_B(o),state:null,error:e instanceof pu||e instanceof Error?e.message:String(e)}}return{layers:a.layers,home:a.home,warning:_B(o),state:s,error:null}}function bB(e,t,n){return vB(e,{layers:[],home:``,projectDir:t},[],n)}var xB=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=mB(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=yB(e,t,n,this.deps);a.state!==null&&Z(`info`,pB(a.layers,a.state));let o={projectDir:e,cwd:t,configFile:n,configLayers:[],configHome:``,failedFile:null,lastError:a.error,lastWarning:a.warning,state:a.state??bB(t,e,this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=yB(e.projectDir,e.cwd,e.configFile,this.deps);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(Z(`info`,pB(t.layers,t.state)),e.state.registry.dispose(),e.state=t.state),this.refreshWatcher(e,t),this.observers.onReload?.(e)}refreshWatcher(e,t){e.configLayers=t.layers,e.configHome=t.home,e.failedFile=t.error===null?null:t.failedFile;let n=gB(e,t.layers),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const SB=16384;var CB=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<SB){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%SB}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:ZA,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},effectCache:e.effectCache,watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null,handlerProbes:e.handlerProbes}}};function wB(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),revision:t=>e.revision(t),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const TB={load:()=>({}),save:()=>{},flush:()=>{}};var EB=class{sessions;storage;head=0;atom=(0,Lx.createAtom)(`SessionState`);constructor(e=TB,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=new Map(Object.entries(this.storage.load()).map(([e,t])=>[e,{values:new Map(Object.entries(t)),revision:++this.head}])),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.values.get(t)??null):null}revision(e){return this.atom.reportObserved(),this.sessions.get(e)?.revision??0}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,Lx.runInAction)(()=>{let n=this.sessions.get(e)??{values:new Map,revision:0};t.some(({key:e,value:t})=>n.values.get(e)!==t)&&(n.revision=++this.head);for(let{key:e,value:r}of t)n.values.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,Lx.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.values.delete(t)&&(n.revision=++this.head),n.values.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,Lx.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,{values:n}]of this.sessions)e[t]=Object.fromEntries(n);return e}};function DB(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 OB=class{timer=null;pending=null;constructor(e,t=500,n=pC){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 DB(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(l.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const kB={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,effect:`string`,preset:`string`,endcaps:`string`,variation:`string`,shade:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,transitions:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},AB=new Set([`1`,`true`]),jB=new Set([`0`,`false`,``]);function MB(e,t){let n=rV(e),r=n.scope===`segment-palette`?`string`:kB[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(AB.has(t))return`true`;if(jB.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function NB(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function PB(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function FB(e){return/^\s*$/.test(e)?null:kl(e)}function IB(e,t){return e!==null&&jl(e,t)!==void 0}function LB(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(LB),...i}}return e}function RB(e){if(!Od(e))return LB(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,LB(t)])),...n}}const zB=tF,BB=zB.segments,VB=zB.presets,HB=zB.root;function UB(e,t,n,r){if(!IB(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function WB(e,t){let n=Uw(t);return t.scope===`segment-palette`&&UB(e,[`segments`,t.segment],BB[t.segment],n.join(`.`)),n}function GB(e){return kl(zl(e))}function KB(){return Object.entries(HB.rows).map(([e,t])=>{let n=LB(t);return{path:[`root`],fragment:GB({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function qB(e,t){let n=e===null?void 0:jl(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function JB(e,t){if(t===void 0)return null;let n=RB(t);return{path:e,fragment:GB(n),unit:{path:e,value:n}}}function YB(e,t){let n=[`presets`,t],r=[...n,`root`],i=VB[t];UB(e,n,i,r.join(`.`));let a=qB(e,r)??JB(r,i?.root);return a!==null&&ou(a.fragment)?a:null}function XB(e,t){let n=au(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 ZB(e,t){return[...KB(),qB(e,[`root`]),YB(e,t)].filter(e=>e!==null).reduce(XB,new Map)}function QB(e,t,n){for(let{node:r,...i}of ZB(e,t).values())if(cu(r,n))return i;throw new $(`${$B(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 $B(e,t){return YB(e,t)?.path??[`root`]}function eV(e,t){return t.scope===`preset-root`?$B(e,t.preset):Uw(t)}function tV(e,{unit:t}){return t===null?e:$l(e,t.path,zl(t.value),Ll)}function nV(e){let t=Hw(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function rV(e){let t=nV(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function iV(e,t,n,r,i){i(t,n,hV(t,r)),PB(t.path,r,e.logger),e.record(t.path,n,r)}function aV(e,t,n){let r=cV(e,t,n);if(r.length>0)throw new $(`refused: ${e.above.join(`, `)} sets ${r.join(`, `)} over ${e.path}, so this click would change nothing on the bar — edit it there`)}const oV=()=>{};function sV(e,t){try{return t()}catch(t){throw!(t instanceof $)||e.above.length===0?t:new $(`${t.message} — or it is declared by ${e.above.join(`, `)}, which the bar does not edit`)}}function cV(e,t,n){let r=lV(e,t);if(r===null)return[];let i=new Set(pV(fV(r),fV(n)));return pV(dV(e,r),dV(e,n)).filter(e=>!i.has(e))}function lV(e,t){try{return uV(e,t)}catch(e){if(e instanceof pu)return null;throw e}}function uV(e,t){return yA(t===null?e.above:[e.path,...e.above],rF,{entered:()=>{},warned:()=>{}},{projectDir:e.projectDir,cwd:e.cwd},n=>n===e.path&&t!==null?t:r.readFileSync(n,`utf8`))}function dV(e,t){let[n]=t.layers;return n?.path===e.path?n.config:t.base}function fV(e){return e.layers.at(-1)?.config??e.base}function pV(e,t,n=``){return!mV(e)||!mV(t)?JSON.stringify(e)===JSON.stringify(t)?[]:[n]:[...new Set([...Object.keys(e),...Object.keys(t)])].flatMap(r=>pV(e[r],t[r],n===``?r:`${n}.${r}`))}function mV(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hV(e,t){try{return uV(e,t)}catch(e){throw e instanceof pu?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function gV(e,t){let n=rV(t),r=FB(NB(e)??``),i=r===null?void 0:jl(r,Uw(n));return i!==void 0&&`value`in i?i.value:void 0}function _V(e,t,n){vV(e,t,n,[])}function vV(e,t,n,r){let i=NB(t.path),a=n.reduce((e,[t,n])=>$l(e,WB(FB(e),rV(t)),MB(t,n),Ll),i??``);iV(e,t,i,sV(t,()=>yV(a,t.path,r,e=>e)),aV)}function yV(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=QB(FB(s),n,i),l=fu(tV(s,c),c.path,i,a,zl(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 bV(e,t,n){let r=FB(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of ZB(r,t)){if(!cu(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Nl(e,c):zl(s.value);if(a!==`#`)return $l(e,[...i,`rows`,a],l,Ll);if(YB(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 $l(e,i,l,Ll)}return e}function xV(e,t){return tu(e,t,t[0]===`presets`&&t.length>2&&!aF(t[1])?2:0)}function SV(e,t,n){let r=n.map(nV),i=NB(t.path);if(i===null)return;let a=r.reduce((e,t)=>xV(e,eV(FB(e),t)),i);a!==i&&iV(e,t,i,a,oV)}function CV(e){let t=e===null?void 0:jl(e,[`presets`]);return t?.kind===`object`?t.entries.map(e=>e.key):[]}function wV(e,t){let n=new Set([...iF,...CV(e),...t.above.flatMap(e=>Object.keys(at.default.parse(r.readFileSync(e,`utf8`)).presets??{}))].map(bp));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(bp(e)))}function TV(e,t,n,r,i,a){let o=NB(t.path),s=FB(o??``),c=wV(s,t),l=[`presets`,c],u=sV(t,()=>YB(s,n)),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Nl(o??``,u.fragment):zl(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],zl(r)]]],f=i.map(([e,t])=>{let n=Vw(c,e);return[WB(s,rV(n)),MB(n,t)]}),p=[...d,...f].reduce((e,[t,n])=>$l(e,t,n,Ll),$l(o??``,l,`{}`,Ll));return iV(e,t,o,sV(t,()=>yV(p,t.path,a.map(e=>({...e,preset:c})),bV)),aV),c}function EV(e,t,n,r){let i=NB(t.path);iV(e,t,i,$l(i??``,[`themeDefaults`,n],zl(r),Ll),aV)}function DV(e,t,n){if(aF(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=NB(t.path),a=FB(i??``);if(i===null||a===null||jl(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t.path} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=jl(a,[`globals`,`preset`]);iV(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>xV(e,t),i),oV)}function OV(e,t,n,r){let i=nV(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=NB(t.path),o=r.op===`remove`?r.target:r.anchor,s=sV(t,()=>QB(FB(a??``),i.preset,o)),c=tV(a??``,s),{after:l,placed:u}=kV(c,s.path,r,()=>{let e=hV(t,c).config;return Nb(e.presets).map(t=>Ib(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t.path} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return iV(e,t,a,l,aV),u}function kV(e,t,n,r){switch(n.op){case`remove`:return{after:uu(e,t,n.target),placed:null};case`insert`:{let i=DP(n.segment,n.anchor,r());return{after:du(e,t,i,n.anchor,n.relation),placed:i}}}}const AV={load:()=>({}),save:()=>{}},jV=new Set(tw.map(e=>e.sessionKey)),MV=e=>jV.has(e)||e.startsWith(rx),NV=8*1024*1024,PV={past:[],future:[]},FV=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var IV=class{state=new Map;constructor(e,t,n=AV){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??PV;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??PV}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(FV(n));r.set(FV(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:wB(this.sessionState,e=>MV(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:WV(i,n),o=r.get(e),s=o===void 0?a:JV(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,KV(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint — nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(FV)),a=n.net.filter(e=>!i.has(FV(e))),o=zV(YV(qV(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(ZV).join(`, `)} changed since edit mode opened — kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=zV(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...VV(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(FV)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:YV(n,t),future:YV(i,t),...a!==void 0&&{savepoint:{at:YV([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(FV(e))),below:YV(a.below,t)}}}),new $(`${r}: ${o.map(ZV).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):NB(t.file)}write(e,t,n){t.kind===`file`?PB(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||LV(n)>NV;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,RV(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${NV} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function LV(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function RV({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...VV(n,1,[])}:{past:e,future:t.slice(1),...VV(n,0,[])}}function zV(e){return e.slice(-50)}const BV=e=>e===ax.member;function VV(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:HV(e.net,n),below:e.below}}}function HV(e,t){let n=new Map(e.map(e=>[FV(e),e]));for(let e of t){let t=n.get(FV(e));n.set(FV(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const UV=e=>e.map(e=>({...e,before:e.after,after:e.before}));function WV(e,t){let n=[...e.past,t],r=zV(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...VV(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...GV(e.future,a),...i.below]},n.length-r.length,t)}}function GV(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function KV(e,t){return{past:e.past.slice(0,-1),future:zV([...e.future,t]),...VV(e.savepoint,0,UV(t))}}function qV(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...GV(r,t.at-i.length),...t.below]}function JV(e,t){if(BV(t.after)&&!BV(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!BV(t.after)&&BV(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function YV(e,t){return e.map(e=>e.filter(e=>!t.has(FV(e)))).filter(e=>e.length>0)}function XV(e){return e.map(ZV).join(`, `)}function ZV(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function QV(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 $V(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(QV))}function eH(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(QV)&&$V(t.below)}function tH(e){if(typeof e!=`object`||!e)return!1;let t=e;return $V(t.past)&&$V(t.future)&&(t.savepoint===void 0||eH(t.savepoint))}function nH(e,t){let n=e=>e.kind===`file`||MV(e.key)?!0:(t.add(e.key),!1),r=e=>e.map(e=>e.filter(n)).filter(e=>e.length>0),{savepoint:i}=e,a=r(e.past),o=r(e.future);return i===void 0?{past:a,future:o}:{past:a,future:o,savepoint:{at:r(e.past.slice(0,i.at)).length,net:i.net.filter(n),below:r(i.below)}}}function rH(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(tH)){let n=new Set,r=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,nH(t,n)]));return n.size>0&&t(`warn`,`settings-history load: dropped the changes to ${[...n].map(e=>`"${e}"`).join(`, `)}, no longer a setting`),r}}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(l.dirname(e),{recursive:!0}),Pe(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}const iH=e=>!MV(e)&&!wT(e)&&e!==`update.dismissed`;var aH=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:wB(e,iH,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,Lx.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function oH(e){let t=aR(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 sH(e){return{probeTmux:oH,loadConfig:e}}function cH(e){let t={layers:e.layers,warnings:e.warning===null?[]:e.warning.split(`
|
|
204
|
+
`)};return e.error===null?{...t,kind:`loaded`,unused:e.unused}:{...t,kind:`failed`,error:e.error}}function lH(e){let{env:t,statusLine:n}=LT(e);if(t!==void 0&&!RT(t))throw Error(`cannot read ${e}: \`env\` is not an object`);return{path:e,env:t??{},statusLine:n===void 0?{kind:`absent`}:RT(n)?{kind:`present`,refreshInterval:n.refreshInterval}:{kind:`not-an-object`,value:n}}}function uH(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function dH(e){return{kind:`arrived`,handler:e,bar:ZA}}function fH(e,t,n){let r=new Map;for(let i of wu(Ib(e,t).node)){if(i.kind!==`segment`)continue;let t=Lu(e.segments[i.name])[Fu],a=Uu(i,Fu,t,e=>n(e.key));a===`bar`||a===`none`||r.set(i.drafts?.effect?.id??bu(i),a)}return[...r].map(([e,t])=>({placement:e,effect:t}))}function pH(e,t,n,r){let i=e.loadConfig(n),a=FF(i.config,r,()=>!1);return{tmux:uH(e,t.tmux),config:cH(i),effect:a.effect,placementEffects:fH(i.config,a.preset,r),transitions:a.transitions,claudeSettings:lH(PT(NT(t.claudeConfigDir)))}}function mH(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings`:{let i=$l(IT(n),e.path,JSON.stringify(e.value),Rl);return r.mkdirSync(l.dirname(n),{recursive:!0}),Pe(n,i),{...t,claudeSettings:lH(n)}}default:return e.kind}}const hH={connectMs:200,budgetMs:500};async function gH(e){let n=e.includes(`--json`),r=await _H();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${XA(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
|
|
205
|
+
`);return}t.stdout.write(xH(r.value))}function _H(){return WA({kind:`stats`},hH,e=>`stats`in e?e.stats:void 0)}function vH(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function yH(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function bH(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 xH(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 ${bH(e.uptimeSec)}`),t.push(` rss ${vH(e.rssBytes)}`),t.push(` heapUsed ${vH(e.heapUsedBytes)}`),t.push(` heapTotal ${vH(e.heapTotalBytes)}`),t.push(` external ${vH(e.externalBytes)}`),t.push(` arrayBuffers ${vH(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 ${yH(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 ${yH(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(``),t.push(`effectCache`),t.push(` sessions ${e.effectCache.sessions}`),t.push(` effects ${e.effectCache.effects}`),t.push(``),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(`
|
|
206
206
|
`)+`
|
|
207
|
-
`}const
|
|
208
|
-
`).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?
|
|
209
|
-
`);return{inMode:n!==`0`,screen:r}}function nU(e,t){let n=eU(e,`claude-input.type`,[`load-buffer`,`-b`,$H,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,$H,`-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 rU(){return{read:tU,type:nU}}function iU(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function aU(e){return oU(()=>decodeURIComponent(e))}function oU(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function sU(e,t){let n=O({bin:`/usr/bin/pbcopy`,stdinInput:e,category:`click.pbcopy`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.pbcopy rate-limited: ${n.error??``}`);return}throw Error(`pbcopy failed (${n.reason}, exit ${n.exitCode??`null`})`)}}const cU=(e,t)=>sU(aU(e),t),lU=(e,t)=>{let n=O({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,aU(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`})`)}},uU=(e,t)=>sU(aU(e),t),dU=(e,t)=>sU(aU(e),t),fU=(e,t)=>{let n=iU(aU(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},pU=(e,t)=>{let[n=``,...r]=oU(()=>uM(e)),i=iU(n),a=zI(TU(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}_U(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},mU=/^-?\d+$/;function hU(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const gU=(e,t)=>{let[n=``,r=``,i=``]=oU(()=>uM(e)),a=iU(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!mU.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=TU(t,a),c=zI(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&mU.test(u)?vU(l,parseInt(u,10)):yU(`step-state`,r,l,HI(s,e=>t.sessionState.get(a,e),r)),f=hU(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);_U(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}→${p.value} (by ${o}, session=${a})`)};function _U(e,t,n,r){let i=r.filter(e=>e.key.startsWith(rx));if(i.length===0)return;let a=vI(TU(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function vU(e,t){return Math.max(e.min,Math.min(e.max,t))}function yU(e,t,n,r){if(r===null)return n.min;if(!mU.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return vU(n,parseInt(r,10))}const bU=`render-origin`;function xU(e){return JSON.stringify(e)}function SU(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 CU(e,t){let n=e.sessionState.get(t,bU);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return SU(n)}function wU(e,t,n){let r=e.sessionState.get(t,bU);if(r===null)return;let i=SU(r),{path:a}=EU(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function TU(e,t){return e.configFor(CU(e,t))}function EU(e){return Mk(e.projectDir,e.cwd,e.configFile??void 0)}function DU(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const OU=(e,t)=>{let[n=``,r=``,i=``]=oU(()=>uM(e)),a=iU(n),o=CU(t,a),s=t.configFor(o),c=LP(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=EU(o),d=gI(s,e=>t.sessionState.get(a,e),r);AV(DU(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u.path} (session=${a})`)},kU=(e,t)=>{let[n=``,r=``,i=``]=oU(()=>uM(e)),a=iU(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!mU.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=CU(t,a),c=t.configFor(s),l=LP(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=EU(s),f=gI(c,e=>t.sessionState.get(a,e),r),p=kV(d.path,f.key),m=typeof p==`number`?vU(u,p):yU(`step-config`,r,u,zP(f.globals,r)),h=hU(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);AV(DU(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}→${g.value} (by ${o}) → ${d.path} (session=${a})`)},AU=(e,t)=>{let[n=``]=oU(()=>uM(e)),r=iU(n),i=CU(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=mI(a,o),c=_I(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=zI(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});MU(`save`,l,c);let d=EU(i);jV(DU(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map(jU)].join(` `)} → ${d.path} (session=${r})`)},jU=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Vu(e.value)}`;function MU(e,t,n){for(let r of n){let n=t.validate(r.key,Vu(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const NU=(e,t)=>{let[n=``]=oU(()=>uM(e)),r=iU(n),i=CU(t,r),a=t.configFor(i),o=xI(a,e=>t.sessionState.get(r,e)),s=zI(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});MU(`save-preset`,s,o.placements);let l=EU(i),u=RV(DU(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...QC.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,ZC.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(jU)].join(` `)} → ${l.path} (session=${r})`)},PU=(e,t)=>{let[n=``]=oU(()=>uM(e)),r=iU(n),i=CU(t,r),a=CI(t.configFor(i),e=>t.sessionState.get(r,e));if(a.kind===`rule`)throw new $(`save-theme-default: the theme is chosen by a rule (globals.palette), so there is no name to save as a theme's default — pick one in the menu first`);let o=EU(i);zV(DU(t,r),o,a.theme,a.look),t.reloadConfig(i);let s=new Set(mI(t.configFor(i),e=>t.sessionState.get(r,e)).map(e=>e.sessionKey)),c=ku.map(e=>ZC[e].sessionKey).filter(e=>!s.has(e));for(let e of c)t.sessionState.clear(r,e);t.dlog(`info`,`save-theme-default: ${a.theme} ${ku.map(e=>`${e}=${a.look[e]}`).join(` `)} → ${o.path} (session=${r})`)},FU=(e,t)=>{let[n=``,r=``]=oU(()=>uM(e)),i=iU(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=CU(t,i),o=EU(a);BV(DU(t,i),o,r),t.reloadConfig(a);let s=ZC.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o.path} (session=${i})`)},IU=(e,t)=>{let[n=``,...r]=oU(()=>uM(e)),i=iU(n),a=CU(t,i),o=LP(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=EU(a),l=r.map(wI),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);FV(DU(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} ← ${c.path} (session=${i})`)};function LU(e,t){let n=(e,t)=>[...wu(Ib(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(Nb(t.presets).flatMap(e=>n(t,e).map(t=>ix(bp(e),bu(t)))));return Nb(e.presets).flatMap(t=>n(e,t).map(e=>({member:ix(bp(t),bu(e)),node:e})).filter(({member:e})=>!r.has(e)))}function RU(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[Qb]:[]])}const zU=(e,t)=>{let[n=``,r=``,i=``]=oU(()=>uM(e)),a=iU(n),o=CU(t,a),s=t.configFor(o),c=LP(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=CP(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=EU(o),f=VV(DU(t,a),d,r,u);t.reloadConfig(o);let p=RU(LU(s,t.configFor(o)),t.sessionState.get(a,Qb)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} → ${d.path} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},BU=(e,t)=>{let[n=``]=oU(()=>uM(e)),r=iU(n);t.journal.commit();let i=t.history.undo(r);wU(t,r,i),t.dlog(`info`,`undo: restored ${lH(i)} (session=${r})`)},VU=(e,t)=>{let n=iU(aU(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,zI(TU(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},HU=(e,t)=>{let n=iU(aU(e));t.journal.commit();let r=t.history.rewind(n);wU(t,n,r),t.dlog(`info`,`rewind: put back ${lH(r)||`nothing`} as edit mode found it (session=${n})`)},UU=(e,t)=>{let[n=``]=oU(()=>uM(e)),r=iU(n);t.journal.commit();let i=t.history.redo(r);wU(t,r,i),t.dlog(`info`,`redo: re-applied ${lH(i)} (session=${r})`)},WU=(e,t)=>{iU(aU(e)),t.applyUpdate()},GU=`client-hints`;function KU(e,t){let n=e.sessionState.get(t,GU);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 OA(r)}function qU(e,t,n){let r=uT(n);e.sessionState.setBatch(t,hT(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed(${1+(e.verdict.more?.length??0)})`}`).join(` `)} (session=${t})`)}function JU(e,t){return{...EH(e.doctor,KU(e,t),CU(e,t),n=>e.sessionState.get(t,n)),urlHandler:wH(e.clientVersion)}}const YU=(e,t)=>{let n=iU(aU(e));qU(t,n,JU(t,n))},XU=(e,t)=>{let n=zH(aU(e));if(n===null)throw new $(`doctor-probe: the value is not a probe nonce`);t.probes.arrive({nonce:n,handler:t.clientVersion}),t.dlog(`info`,`doctor-probe: arrived nonce=${n} handler=${t.clientVersion??`unreported`}`)},ZU=(e,t)=>{let[n=``,r=``]=oU(()=>uM(e)),i=iU(n),a=dT(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=JU(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=DH(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.path.join(`.`)}=${JSON.stringify(s.fix.value)} (session=${i})`),qU(t,i,c)},QU=(e,t)=>{let[n=``,...r]=oU(()=>uM(e)),i=iU(n),a=CU(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=ZD(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=yF({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},KU(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},$U=(e,t)=>{let[n=``,r=``]=oU(()=>uM(e)),i=iU(n),a=Object.values(t.configFor(CU(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=QH(t.claudeInput,KU(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})`)},eW=`config-override`,tW=new Map([[Bj,cU],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=iU(oU(()=>decodeURIComponent(e.slice(0,n)))),i=oU(()=>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,eW),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,eW,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Vj,lU],[Rj,pU],[zj,gU],[Gj,OU],[Kj,kU],[Zj,IU],[qj,AU],[Jj,NU],[Yj,PU],[Xj,FU],[Qj,zU],[$j,BU],[eM,UU],[tM,VU],[nM,HU],[Uj,uU],[Wj,dU],[Hj,fU],[rM,WU],[iM,YU],[aM,ZU],[oM,XU],[sM,QU],[cM,$U]]),nW=new Set([Rj,zj,Gj,Kj,Zj,qj,Jj,Yj,Xj,Qj,$j,eM,tM,nM,Hj,rM,iM,aM,sM,cM]),rW=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of mM(fM(e))){if(!i&&nW.has(a)){let e=uM(o);e.length>0&&e[0]&&(i=e[0])}let e=tW.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof $||(r=!0),n.push(`${a}: ${e instanceof Error?e.message:String(e)}`)}}if(n.length>0){i&&t.sessionState.set(i,`click.error`,n.join(`
|
|
210
|
-
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function iW(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const aW=new Map([...tW,[Lj,rW]].map(([e,t])=>[e,iW(t)]));Object.freeze([...aW.keys()]);const oW=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`]),sW=[[`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`]],cW=[[`workspace.added_dirs`,`string-list`]];function lW(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of sW){let i=fW(n,e);if(i==null)t.missingRequired.push(e);else{let n=uW(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of cW){let i=fW(n,e),a=i===void 0?r:dW(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))oW.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function uW(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function dW(e){return Array.isArray(e)&&e.every(e=>uW(e)===`string`)?`string-list`:uW(e)}function fW(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 pW(e,t){switch(e){case`vars`:return{what:e,vars:mW(t)};case`segments`:return{what:e,segments:yW(t)};case`config`:return{what:e,config:CW(t)}}}function mW(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=_W(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=hW(r),s=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...a,lastError:s===void 0?null:{timestampMs:s.timestamp,message:s.message},ageMs:gW(r.lastUpdatedMs())})}return o}function hW(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 gW(e){return e===null?null:Math.max(0,Date.now()-e)}function _W(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,vW(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}`,vW(i));return t}function vW(e){return e.kind}function yW(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=xW(n),o=bW(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:SW(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function bW(e){let t=new Map;for(let n of Nb(e.presets))for(let r of wu(Ib(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=bu(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function xW(e){let t=[],n=new Set;for(let r of wu(jd(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function SW(e,t,n){let r=new Set;for(let i of Cx(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 CW(e){return e===null?null:e.config}const wW=[`vars`,`segments`,`config`];function TW(e){return typeof e==`string`&&wW.includes(e)}function EW(e){return Math.max(1,e-2)}var DW=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return l.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const OW=new IB,kW=new LH;ke(OW.launchStats);const AW=new fC({counters:OW,logger:Z}),jW=wR({watchers:AW,logger:Z}),{gitProvider:MW,usageStore:NW,mementoProvider:PW}=jW,FW=new zB,IW=new YV(FW,Z),LW=new vH,RW=new UN,zW=new DW(Ze()),BW=new PB({gitService:MW,sessionState:FW,watchers:AW},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} files=${e.configLayers.join(` < `)||`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),VW=60*1e3;function HW(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(E(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),iG(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,VW),a.unref())},checkNow:o}}const UW=HW(),WW=sL({entryUrl:import.meta.url,intervalMs:VW,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>UW.checkNow(),log:Z});let GW=null,KW=null,qW=0;function JW(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),iG(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),iG(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),iG(0)});try{qW=lj(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),iG(1);return}GW=uN(t.pid);let e=bN(SN(GW));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),iG(1);return}KW=e.registryPath,r.mkdirSync(Re(),{recursive:!0}),He(ze()),FW.useStorage(new VB(Ge(),500,Z)),IW.useStorage(gH(Ke(),Z)),pN({anchor:fN(t.env),isAlive:mN,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),iG(0)}}),YW(x.createServer({allowHalfOpen:!1},e=>{aG(e)}),ze(),!1)}function YW(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),iG(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}XW(e,n)}),e.listen(n,()=>ZW(n))}function XW(e,n){let i=eN(tN(Ue(n)),(e,t)=>lN(e,t,{readStartTime:cN,pidAlive:mN}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),iG(1);return}}YW(e,n,!0)}function ZW(e){let n=iN(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),iG(0);return}tG(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(re.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(qW/1048576)}MB`),Ej();let i=zW.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),UW.arm(),WW.arm(),eG(),QW(e,n.identity)}function QW(e,n){sN({bound:n,myPid:t.pid,readIdentity:()=>iN(e),readLease:()=>tN(Ue(e)),shutdown:e=>iG(e),log:Z}).arm()}let $W=null;function eG(){$W=pj(_j(OW.startedAt.getTime(),e=>iG(e),{rssLimitBytes:qW})),$W.arm()}function tG(e){let n=nN(Ue(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:GW});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let nG=0,rG=!1;function iG(e){if(!rG){rG=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{MW.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{NW.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{AW.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{FW.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}rN(We(),t.pid),KW!==null&&xN(KW,t.pid,vN,e=>r.unlinkSync(e)),t.exit(e)}}function aG(e){nG++,OW.inFlight=nG;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>iG(r);try{e.end(RA(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{OW.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=zA(e=>{sG(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),nG=Math.max(0,nG-1),OW.inFlight=nG})}const oG=e=>({resp:e,exitAfterFlush:null});async function sG(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return oG({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale — staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return oG({ok:!0,stats:OW.snapshot({gitCache:MW.getStats(),usageCache:NW.getStats(),renderCacheSize:BW.size,effectCache:RW.getStats(),watchersActive:AW.size(),nextRestartReason:$W?.describeNextRestart()??null,handlerProbes:kW.list()})});if(e.kind===`render`){OW.requestsTotal++;let t=new Date,n=wC(t),r=t.getTime();try{let{report:t}=lW(e.hookData);for(let e of t.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let i=[];for(let e of t.missingRequired)i.push(`missing required field '${e}'`);for(let{path:e,expected:n,got:r}of t.typeMismatches)i.push(`field '${e}' expected ${n}, got ${r}`);if(e.cwd===``&&i.push(`request 'cwd' is empty`),i.length>0)return OW.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${i.join(`; `)}`),oG({ok:!1,error:`malformed hookData: ${i.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let a=e.hookData.workspace.project_dir,{configFile:o,unknownFlagsError:s}=cG(e.args),c=e.hookData.session_id,l=OA(e),u=JSON.stringify(l);FW.get(c,`client-hints`)!==u&&FW.set(c,GU,u);let d=FW.get(c,`config-override`)??o??l.configEnv,f=BW.getOrCreate(a,e.cwd,d),p=xU({projectDir:a,cwd:e.cwd,configFile:d??null});FW.get(c,`render-origin`)!==p&&FW.set(c,bU,p);let m=l.termCols,h=EW(m??120),g=tP(l.termRows),{authoredRoots:_}=f.state,v=t=>FW.get(e.hookData.session_id,t),y=MF(f.state.config,v,e=>_.has(e)),b=await YF(e.hookData,n,{...pG,navigation:e=>LW.depth(e,FW,zI(f.state.config))},e.cwd,f.state.neededInputPaths(y.preset),y,l,{...EI(f.state.config,f.state.fileHeldSettings,v),configPath:f.configLayers.includes(f.configHome)?f.configHome:null}),x=[],S=NF(y,h),C=RW.of(c),ee=pB(f.state.config,f.state.compiled,f.state.store,f.state.registry,b,n,S,{perSegmentSink:f.state.lastRenderCellsBySegment,onRenderWarning:e=>x.push(e)},{...PF(y),effects:C}),w=FW.get(e.hookData.session_id,`click.error`);w&&FW.clear(e.hookData.session_id,`click.error`);let te=[s,f.lastError,w].filter(Boolean).join(`
|
|
211
|
-
`),ne=
|
|
212
|
-
`)),E=
|
|
213
|
-
`})}catch(e){throw
|
|
214
|
-
`);return}t.stdout.write(
|
|
215
|
-
`;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`—`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${
|
|
207
|
+
`}const SH=e=>({kind:`ok`,value:e}),CH=e=>({kind:`failed`,reason:e});var wH=class{arrivals=[];arrive(e){this.arrivals=[...this.arrivals,e].slice(-16)}list(){return this.arrivals}};const TH=/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;function EH(e){return TH.test(e)?e:null}function DH(e){let t=e.opener();if(t.kind===`failed`)return t;if(t.value===null)return SH(null);let n=t.value,r=e.script(n);if(r.kind===`failed`)return SH({app:n,missing:CH(`its script could not be read (${r.reason})`)});let i=VM(r.value);return SH({app:n,missing:i===null?CH("its script is not one `cc-candybar install` wrote"):SH([i.node,i.script].filter(t=>!e.exists(t)))})}async function OH(e,t){let n=e.now()+5e3;for(;e.now()<n;){await e.pause();let n=await e.daemon(),r=n.kind===`ok`?n.value.arrivals.find(e=>e.nonce===t):void 0;if(n.kind===`ok`&&r!==void 0)return{kind:`arrived`,handler:r.handler,bar:n.value.version}}return null}async function kH(e){if(e.platform!==`darwin`)return{kind:`unsupported`};if(e.sockets.own!==e.sockets.handler)return{kind:`unprobed`,reason:`this shell's daemon is at ${e.sockets.own} (CC_CANDYBAR_SOCKET); the URL handler delivers links to ${e.sockets.handler}`};let t=await e.daemon();if(t.kind===`failed`)return{kind:`unprobed`,reason:`the daemon could not be asked whether a link arrives: ${t.reason}`};let n=e.nonce(),r=e.open(`${zj}://${lM}/${n}`);return(r===null?await OH(e,n):null)??{kind:`lost`,unopened:r,opener:DH(e)}}function AH(e,t,n){let r=O({bin:t,args:[...n],category:e,timeoutMs:5e3});return r.ok?SH(r.stdout):CH(r.stderr.trim()||r.error||r.reason)}const jH=`ObjC.import("AppKit");var u = $.NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL($.NSURL.URLWithString("${zj}://probe"));u.isNil() ? "" : u.path.js`;async function MH(){let e=await _H();if(e.kind!==`ok`)return CH(XA(e).split(`
|
|
208
|
+
`).join(` — `));let{version:t,handlerProbes:n}=e.value;return Array.isArray(n)?SH({version:t,arrivals:n}):CH(`the running daemon (${t}) predates this check`)}function NH(){return{platform:process.platform,sockets:{own:ze(),handler:Be()},now:Date.now,nonce:ce,daemon:MH,open:e=>{let t=AH(`doctor.open`,`/usr/bin/open`,[`-g`,e]);return t.kind===`ok`?null:t.reason},pause:()=>new Promise(e=>setTimeout(e,100)),opener:()=>{let e=AH(`doctor.launch-services`,`/usr/bin/osascript`,[`-l`,`JavaScript`,`-e`,jH]);if(e.kind===`failed`)return e;let t=e.value.trim();return SH(t===``?null:t)},script:e=>AH(`doctor.osadecompile`,`/usr/bin/osadecompile`,[HM(e)]),exists:r.existsSync}}const PH=/^─{20,}/,FH=/^❯(\s|$)/,IH=/›\s*stashed$/;function LH(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>PH.test(e)?[t]:[]).at(-2);return n===void 0||!FH.test(t[n+1]??``)?{kind:`no-prompt`}:IH.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const RH={"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 zH(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=LH(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:RH[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const BH=`cc-candybar-slash`;function VH(e,t,n,r){let i=aR(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function HH(e){let t=VH(e,`claude-input.read`,[`display`,`-p`,`-t`,e.pane,`#{pane_in_mode}`,`;`,`capture-pane`,`-p`,`-t`,e.pane]);if(t.kind===`rate-limited`)throw Error(t.reason);let[n=``,...r]=t.stdout.split(`
|
|
209
|
+
`);return{inMode:n!==`0`,screen:r}}function UH(e,t){let n=VH(e,`claude-input.type`,[`load-buffer`,`-b`,BH,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,BH,`-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 WH(){return{read:HH,type:UH}}function GH(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function KH(e){return qH(()=>decodeURIComponent(e))}function qH(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function JH(e,t){let n=O({bin:`/usr/bin/pbcopy`,stdinInput:e,category:`click.pbcopy`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.pbcopy rate-limited: ${n.error??``}`);return}throw Error(`pbcopy failed (${n.reason}, exit ${n.exitCode??`null`})`)}}const YH=(e,t)=>JH(KH(e),t),XH=(e,t)=>{let n=O({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,KH(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`})`)}},ZH=(e,t)=>JH(KH(e),t),QH=(e,t)=>JH(KH(e),t),$H=(e,t)=>{let n=GH(KH(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},eU=(e,t)=>{let[n=``,...r]=qH(()=>pM(e)),i=GH(n),a=HI(fU(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}iU(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},tU=/^-?\d+$/;function nU(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const rU=(e,t)=>{let[n=``,r=``,i=``]=qH(()=>pM(e)),a=GH(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!tU.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=fU(t,a),c=HI(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&tU.test(u)?aU(l,parseInt(u,10)):oU(`step-state`,r,l,GI(s,e=>t.sessionState.get(a,e),r)),f=nU(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);iU(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}→${p.value} (by ${o}, session=${a})`)};function iU(e,t,n,r){let i=r.filter(e=>e.key.startsWith(rx));if(i.length===0)return;let a=xI(fU(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function aU(e,t){return Math.max(e.min,Math.min(e.max,t))}function oU(e,t,n,r){if(r===null)return n.min;if(!tU.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return aU(n,parseInt(r,10))}const sU=`render-origin`;function cU(e){return JSON.stringify(e)}function lU(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 uU(e,t){let n=e.sessionState.get(t,sU);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return lU(n)}function dU(e,t,n){let r=e.sessionState.get(t,sU);if(r===null)return;let i=lU(r),{path:a}=pU(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function fU(e,t){return e.configFor(uU(e,t))}function pU(e){return Fk(e.projectDir,e.cwd,e.configFile??void 0)}function mU(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const hU=(e,t)=>{let[n=``,r=``,i=``]=qH(()=>pM(e)),a=GH(n),o=uU(t,a),s=t.configFor(o),c=BP(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=pU(o),d=yI(s,e=>t.sessionState.get(a,e),r);_V(mU(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} → ${u.path} (session=${a})`)},gU=(e,t)=>{let[n=``,r=``,i=``]=qH(()=>pM(e)),a=GH(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!tU.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=uU(t,a),c=t.configFor(s),l=BP(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=pU(s),f=yI(c,e=>t.sessionState.get(a,e),r),p=gV(d.path,f.key),m=typeof p==`number`?aU(u,p):oU(`step-config`,r,u,HP(f.globals,r)),h=nU(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);_V(mU(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}→${g.value} (by ${o}) → ${d.path} (session=${a})`)},_U=(e,t)=>{let[n=``]=qH(()=>pM(e)),r=GH(n),i=uU(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=_I(a,o),c=bI(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=HI(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});yU(`save`,l,c);let d=pU(i);vV(mU(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map(vU)].join(` `)} → ${d.path} (session=${r})`)},vU=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Vu(e.value)}`;function yU(e,t,n){for(let r of n){let n=t.validate(r.key,Vu(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const bU=(e,t)=>{let[n=``]=qH(()=>pM(e)),r=GH(n),i=uU(t,r),a=t.configFor(i),o=wI(a,e=>t.sessionState.get(r,e)),s=HI(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});yU(`save-preset`,s,o.placements);let l=pU(i),u=TV(mU(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...tw.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,ew.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(vU)].join(` `)} → ${l.path} (session=${r})`)},xU=(e,t)=>{let[n=``]=qH(()=>pM(e)),r=GH(n),i=uU(t,r),a=EI(t.configFor(i),e=>t.sessionState.get(r,e));if(a.kind===`rule`)throw new $(`save-theme-default: the theme is chosen by a rule (globals.palette), so there is no name to save as a theme's default — pick one in the menu first`);let o=pU(i);EV(mU(t,r),o,a.theme,a.look),t.reloadConfig(i);let s=new Set(_I(t.configFor(i),e=>t.sessionState.get(r,e)).map(e=>e.sessionKey)),c=ku.map(e=>ew[e].sessionKey).filter(e=>!s.has(e));for(let e of c)t.sessionState.clear(r,e);t.dlog(`info`,`save-theme-default: ${a.theme} ${ku.map(e=>`${e}=${a.look[e]}`).join(` `)} → ${o.path} (session=${r})`)},SU=(e,t)=>{let[n=``,r=``]=qH(()=>pM(e)),i=GH(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=uU(t,i),o=pU(a);DV(mU(t,i),o,r),t.reloadConfig(a);let s=ew.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o.path} (session=${i})`)},CU=(e,t)=>{let[n=``,...r]=qH(()=>pM(e)),i=GH(n),a=uU(t,i),o=BP(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=pU(a),l=r.map(DI),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);SV(mU(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} ← ${c.path} (session=${i})`)};function wU(e,t){let n=(e,t)=>[...wu(Ib(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(Nb(t.presets).flatMap(e=>n(t,e).map(t=>ix(bp(e),bu(t)))));return Nb(e.presets).flatMap(t=>n(e,t).map(e=>({member:ix(bp(t),bu(e)),node:e})).filter(({member:e})=>!r.has(e)))}function TU(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[Qb]:[]])}const EU=(e,t)=>{let[n=``,r=``,i=``]=qH(()=>pM(e)),a=GH(n),o=uU(t,a),s=t.configFor(o),c=BP(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=EP(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=pU(o),f=OV(mU(t,a),d,r,u);t.reloadConfig(o);let p=TU(wU(s,t.configFor(o)),t.sessionState.get(a,Qb)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} → ${d.path} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},DU=(e,t)=>{let[n=``]=qH(()=>pM(e)),r=GH(n);t.journal.commit();let i=t.history.undo(r);dU(t,r,i),t.dlog(`info`,`undo: restored ${XV(i)} (session=${r})`)},OU=(e,t)=>{let n=GH(KH(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,HI(fU(t,n))),a=r.map(e=>`${e.key}=${e.before??`∅`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},kU=(e,t)=>{let n=GH(KH(e));t.journal.commit();let r=t.history.rewind(n);dU(t,n,r),t.dlog(`info`,`rewind: put back ${XV(r)||`nothing`} as edit mode found it (session=${n})`)},AU=(e,t)=>{let[n=``]=qH(()=>pM(e)),r=GH(n);t.journal.commit();let i=t.history.redo(r);dU(t,r,i),t.dlog(`info`,`redo: re-applied ${XV(i)} (session=${r})`)},jU=(e,t)=>{GH(KH(e)),t.applyUpdate()},MU=`client-hints`;function NU(e,t){let n=e.sessionState.get(t,MU);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 jA(r)}function PU(e,t,n){let r=pT(n);e.sessionState.setBatch(t,vT(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed(${1+(e.verdict.more?.length??0)})`}`).join(` `)} (session=${t})`)}function FU(e,t){return{...pH(e.doctor,NU(e,t),uU(e,t),n=>e.sessionState.get(t,n)),urlHandler:dH(e.clientVersion)}}const IU=(e,t)=>{let n=GH(KH(e));PU(t,n,FU(t,n))},LU=(e,t)=>{let n=EH(KH(e));if(n===null)throw new $(`doctor-probe: the value is not a probe nonce`);t.probes.arrive({nonce:n,handler:t.clientVersion}),t.dlog(`info`,`doctor-probe: arrived nonce=${n} handler=${t.clientVersion??`unreported`}`)},RU=(e,t)=>{let[n=``,r=``]=qH(()=>pM(e)),i=GH(n),a=mT(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=FU(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=mH(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.path.join(`.`)}=${JSON.stringify(s.fix.value)} (session=${i})`),PU(t,i,c)},zU=(e,t)=>{let[n=``,...r]=qH(()=>pM(e)),i=GH(n),a=uU(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=eO(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=SF({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},NU(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},BU=(e,t)=>{let[n=``,r=``]=qH(()=>pM(e)),i=GH(n),a=Object.values(t.configFor(uU(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=zH(t.claudeInput,NU(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})`)},VU=`config-override`,HU=new Map([[Uj,YH],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=GH(qH(()=>decodeURIComponent(e.slice(0,n)))),i=qH(()=>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,VU),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,VU,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[Wj,XH],[Vj,eU],[Hj,rU],[Jj,hU],[Yj,gU],[eM,CU],[Xj,_U],[Zj,bU],[Qj,xU],[$j,SU],[tM,EU],[nM,DU],[rM,AU],[iM,OU],[aM,kU],[Kj,ZH],[qj,QH],[Gj,$H],[oM,jU],[sM,IU],[cM,RU],[lM,LU],[uM,zU],[dM,BU]]),UU=new Set([Vj,Hj,Jj,Yj,eM,Xj,Zj,Qj,$j,tM,nM,rM,iM,aM,Gj,oM,sM,cM,uM,dM]),WU=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of _M(hM(e))){if(!i&&UU.has(a)){let e=pM(o);e.length>0&&e[0]&&(i=e[0])}let e=HU.get(a);if(!e){n.push(`unknown effect verb "${a}"`);continue}try{e(o,t)}catch(e){e instanceof $||(r=!0),n.push(`${a}: ${e instanceof Error?e.message:String(e)}`)}}if(n.length>0){i&&t.sessionState.set(i,`click.error`,n.join(`
|
|
210
|
+
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function GU(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const KU=new Map([...HU,[Bj,WU]].map(([e,t])=>[e,GU(t)]));Object.freeze([...KU.keys()]);const qU=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`]),JU=[[`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`]],YU=[[`workspace.added_dirs`,`string-list`]];function XU(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of JU){let i=$U(n,e);if(i==null)t.missingRequired.push(e);else{let n=ZU(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of YU){let i=$U(n,e),a=i===void 0?r:QU(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))qU.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function ZU(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function QU(e){return Array.isArray(e)&&e.every(e=>ZU(e)===`string`)?`string-list`:ZU(e)}function $U(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 eW(e,t){switch(e){case`vars`:return{what:e,vars:tW(t)};case`segments`:return{what:e,segments:oW(t)};case`config`:return{what:e,config:uW(t)}}}function tW(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=iW(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=nW(r),s=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...a,lastError:s===void 0?null:{timestampMs:s.timestamp,message:s.message},ageMs:rW(r.lastUpdatedMs())})}return o}function nW(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 rW(e){return e===null?null:Math.max(0,Date.now()-e)}function iW(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,aW(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}`,aW(i));return t}function aW(e){return e.kind}function oW(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=cW(n),o=sW(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:lW(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function sW(e){let t=new Map;for(let n of Nb(e.presets))for(let r of wu(Ib(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=bu(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function cW(e){let t=[],n=new Set;for(let r of wu(jd(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function lW(e,t,n){let r=new Set;for(let i of Cx(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 uW(e){return e===null?null:e.config}const dW=[`vars`,`segments`,`config`];function fW(e){return typeof e==`string`&&dW.includes(e)}function pW(e){return Math.max(1,e-2)}var mW=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return l.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const hW=new CB,gW=new wH;ke(hW.launchStats);const _W=new hC({counters:hW,logger:Z}),vW=dR({watchers:_W,logger:Z}),{gitProvider:yW,usageStore:bW,mementoProvider:xW}=vW,SW=new EB,CW=new IV(SW,Z),wW=new aH,TW=new KN,EW=new mW(Ze()),DW=new xB({gitService:yW,sessionState:SW,watchers:_W},{observers:{onReload:e=>Z(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} files=${e.configLayers.join(` < `)||`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),OW=60*1e3;function kW(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(E(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),GW(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,OW),a.unref())},checkNow:o}}const AW=kW(),jW=uL({entryUrl:import.meta.url,intervalMs:OW,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>AW.checkNow(),log:Z});let MW=null,NW=null,PW=0;function FW(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),GW(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),GW(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),GW(0)});try{PW=fj(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),GW(1);return}MW=pN(t.pid);let e=CN(TN(MW));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),GW(1);return}NW=e.registryPath,r.mkdirSync(Re(),{recursive:!0}),He(ze()),SW.useStorage(new OB(Ge(),500,Z)),CW.useStorage(rH(Ke(),Z)),gN({anchor:hN(t.env),isAlive:_N,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),GW(0)}}),IW(x.createServer({allowHalfOpen:!1},e=>{KW(e)}),ze(),!1)}function IW(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),GW(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive — exiting`),t.exit(0);return}LW(e,n)}),e.listen(n,()=>RW(n))}function LW(e,n){let i=rN(iN(Ue(n)),(e,t)=>fN(e,t,{readStartTime:dN,pidAlive:_N}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} — exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} — unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),GW(1);return}}IW(e,n,!0)}function RW(e){let n=sN(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),GW(0);return}HW(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(re.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(PW/1048576)}MB`),kj();let i=EW.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),AW.arm(),jW.arm(),VW(),zW(e,n.identity)}function zW(e,n){uN({bound:n,myPid:t.pid,readIdentity:()=>sN(e),readLease:()=>iN(Ue(e)),shutdown:e=>GW(e),log:Z}).arm()}let BW=null;function VW(){BW=gj(bj(hW.startedAt.getTime(),e=>GW(e),{rssLimitBytes:PW})),BW.arm()}function HW(e){let n=aN(Ue(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:MW});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let UW=0,WW=!1;function GW(e){if(!WW){WW=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{yW.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{bW.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{_W.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{SW.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}oN(We(),t.pid),NW!==null&&wN(NW,t.pid,xN,e=>r.unlinkSync(e)),t.exit(e)}}function KW(e){UW++,hW.inFlight=UW;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>GW(r);try{e.end(VA(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{hW.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=HA(e=>{JW(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),UW=Math.max(0,UW-1),hW.inFlight=UW})}const qW=e=>({resp:e,exitAfterFlush:null});async function JW(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return qW({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded — exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale — staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return qW({ok:!0,stats:hW.snapshot({gitCache:yW.getStats(),usageCache:bW.getStats(),renderCacheSize:DW.size,effectCache:TW.getStats(),watchersActive:_W.size(),nextRestartReason:BW?.describeNextRestart()??null,handlerProbes:gW.list()})});if(e.kind===`render`){hW.requestsTotal++;let t=new Date,n=DC(t),r=t.getTime();try{let{report:t}=XU(e.hookData);for(let e of t.unknownTopLevelFields)Z(`info`,`schema: unknown field '${e}' — Anthropic may have added it`);let i=[];for(let e of t.missingRequired)i.push(`missing required field '${e}'`);for(let{path:e,expected:n,got:r}of t.typeMismatches)i.push(`field '${e}' expected ${n}, got ${r}`);if(e.cwd===``&&i.push(`request 'cwd' is empty`),i.length>0)return hW.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${i.join(`; `)}`),qW({ok:!1,error:`malformed hookData: ${i.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let a=e.hookData.workspace.project_dir,{configFile:o,unknownFlagsError:s}=YW(e.args),c=e.hookData.session_id,l=jA(e),u=JSON.stringify(l);SW.get(c,`client-hints`)!==u&&SW.set(c,MU,u);let d=SW.get(c,`config-override`)??o??l.configEnv,f=DW.getOrCreate(a,e.cwd,d),p=cU({projectDir:a,cwd:e.cwd,configFile:d??null});SW.get(c,`render-origin`)!==p&&SW.set(c,sU,p);let m=l.termCols,h=pW(m??120),g=iP(l.termRows),{authoredRoots:_}=f.state,v=t=>SW.get(e.hookData.session_id,t),y=FF(f.state.config,v,e=>_.has(e)),b=await QF(e.hookData,n,{...eG,navigation:e=>wW.depth(e,SW,HI(f.state.config))},e.cwd,f.state.neededInputPaths(y.preset),y,l,{...kI(f.state.config,f.state.fileHeldSettings,v),configPath:f.configLayers.includes(f.configHome)?f.configHome:null}),x=[],S=IF(y,h),C=TW.of(c),ee=eB(f.state.config,f.state.compiled,f.state.store,f.state.registry,b,n,S,{perSegmentSink:f.state.lastRenderCellsBySegment,onRenderWarning:e=>x.push(e)},{...LF(y),effects:C}),w=SW.get(e.hookData.session_id,`click.error`);w&&SW.clear(e.hookData.session_id,`click.error`);let te=[s,f.lastError,w].filter(Boolean).join(`
|
|
211
|
+
`),ne=jW.notice({sessionId:c,dismissed:SW.get(c,JI),enabled:y.updateNotice}),re=f.lastError===null?null:f.failedFile,ie=[...f.lastWarning===null?[]:[{kind:`load`,message:f.lastWarning}],...x],T=lP(te,ne,ie.map(e=>e.message).join(`
|
|
212
|
+
`)),E=EW.sync(c,T===null?null:dP(T));E!==null&&Z(`warn`,`diagnostic dump failed: ${E}`);let ae=fP(ee,T,{fullText:E===null?{kind:`file`,path:EW.pathFor(c)}:{kind:`unavailable`,reason:E},failedConfigFile:re},{width:h,rowCap:g,colorCompatibility:y.colorCompatibility}),oe=Date.now()-r,se=yW.getStats(),ce=bW.getStats(),le=C.lastFrame(),ue=le.own.map(e=>`${e.placement}:${e.effect}@${e.t.toFixed(3)}`).join(`,`)||`-`,de=e=>e.map(e=>`${e.placement}@${e.t.toFixed(3)}`).join(`,`)||`-`,fe=ie.map(e=>e.kind).join(`,`)||`-`;return Z(`info`,`render sid=${e.hookData.session_id??`?`} at=${n.toFixed(3)} took=${oe}ms termCols=${m??`?`} termRows=${l.termRows??`?`} width=${h} git=${se.size}/${se.hits}h/${se.misses}m usage=${ce.size}/${ce.hits}h/${ce.misses}m effect=${le.effect} effectT=${le.t.toFixed(3)} effectRows=${le.made}made/${le.reused}reused effectOwn=${ue} fadeBasis=${le.basis} stateRev=${le.revision} fades=${de(le.fades)} leaves=${de(le.leaves)} prompts=${b.metrics?.messageCount??`-`} nonPrompts=${b.metrics?.nonPrompts??`-`} err=${te?`Y`:`N`} upd=${ne.length} warn=${fe}`),qW({ok:!0,output:ae+`
|
|
213
|
+
`})}catch(e){throw hW.requestsErrored++,e}}if(e.kind===`click`)return qW(tG(e.verb,e.value,zA(e.clientVersion)));if(e.kind===`debug`){if(!fW(e.what))return qW({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${dW.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=DW.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?$W(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):QW};return qW({ok:!0,debug:eW(e.what,n)})}return qW({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function YW(e){let{values:t,tokens:n}=y({args:e.slice(1),options:{config:{type:`string`}},strict:!1,tokens:!0,allowPositionals:!0}),r=[...new Set((n??[]).filter(e=>e.kind===`option`&&e.name!==`config`).map(e=>`--${e.name}`))];return{configFile:PA(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const XW={sessionState:SW,dlog:Z,applyUpdate:()=>jW.act(),doctor:sH(e=>{let t=[e.projectDir,e.cwd,e.configFile??void 0];DW.reload(...t);let n=DW.getOrCreate(...t);return{layers:n.configLayers,error:n.lastError,warning:n.lastWarning,unused:n.state.unused,config:n.state.config}}),probes:gW,memento:xW,claudeInput:WH(),history:CW,navigation:wW,configFor:e=>DW.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>DW.reload(e.projectDir,e.cwd,e.configFile??void 0)};XW.reloadConfig;const ZW={endcaps:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:rl,width:1/0},QW=new Map;function $W(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,rP(a,{...ZW,charset:t,colorCompatibility:n}));return r}const eG={...vW,history:e=>CW.depth(e)};function tG(e,t,n){let r=KU.get(e);if(!r)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return r(t,{...XW,clientVersion:n}),{ok:!0,output:``}}catch(e){let t=e instanceof $?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const nG={connectMs:200,budgetMs:500};async function rG(e,n){let r=n.includes(`--json`),i=await iG(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${XA(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
|
|
214
|
+
`);return}t.stdout.write(aG(i.value))}function iG(e){return WA({kind:`debug`,what:e},nG,e=>`debug`in e?e.debug:void 0)}function aG(e){switch(e.what){case`vars`:return oG(e.vars);case`segments`:return sG(e.segments);case`config`:return cG(e.config);default:return e}}function oG(e){if(e.length===0)return`no variables (DSL not active)
|
|
215
|
+
`;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`—`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${uG(a.ageMs)}`,o=a.lastError?` ✗ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`—`).padEnd(r)} ${a.type.padEnd(i)} ${lG(a.value)}${e}${o}`)}return t.join(`
|
|
216
216
|
`)+`
|
|
217
|
-
`}function
|
|
217
|
+
`}function sG(e){if(e.length===0)return`no segments (DSL not active)
|
|
218
218
|
`;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(`
|
|
219
219
|
`)+`
|
|
220
|
-
`}function
|
|
220
|
+
`}function cG(e){return e===null?`config: DSL not active
|
|
221
221
|
`:JSON.stringify(e,null,2)+`
|
|
222
|
-
`}function
|
|
222
|
+
`}function lG(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`…`:t}function uG(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function dG(){let e=pG();return e===null?null:r.readFileSync(e,`utf-8`)}function fG(){let e;try{e=dG()}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 pG(){let e=l.join(`schema`,`cc-candybar.schema.json`),n=t.argv[1];if(n===void 0)return null;let i=l.dirname(l.resolve(n));for(;;){let t=l.join(i,e);if(r.existsSync(t))return t;let n=l.dirname(i);if(n===i)return null;i=n}}function mG(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const hG=5e3;function gG(e,t,n){let r=`/home/tester`,i=Math.floor(n),a=`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,o={current_dir:`${r}/code/cc-candybar/src`,project_dir:`${r}/code/cc-candybar`,added_dirs:[]};return{hook_event_name:`Status`,session_id:a,version:`1.15.0`,home:r,cwd:`${r}/code/cc-candybar/src`,transcript_path:`${r}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:o,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:i+2*3600},weekly:{percentage:21,resetsAt:i+5*86400},cache:{expiresAt:i+900},tmux:{pane:`%0`,session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:WT(4e5,1e6),...RF(e),history:{undo:1,redo:1,sinceEdit:1},navigation:{back:1},unsaved:1,resettable:ow(()=>!0),themeDefault:{differs:!0,theme:`<theme>`},resumeCommand:PF(o,a,void 0),configPath:t??`${r}/.config/cc-candybar/config.json5`}}function _G(e,t){let n=Nk(e,e),r=Ik(n);return r!==null&&t.push(r),n.kind===`chain`?n.layers:[]}async function vG(e,n=t.cwd()){let i=[],a=e===void 0?null:l.resolve(Ak(e)),o=a===null?_G(n,i):[a];if(a!==null){let e;try{e=r.statSync(a,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:a,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:a,message:`not a file`}}let s=Rk(n,n);s!==null&&i.push(s);try{return{kind:`clean`,layers:o,warnings:i,rendered:await xG(o,n,i)}}catch(e){let t=e;return typeof t==`object`&&t&&typeof t.code==`string`&&typeof t.path==`string`&&o.includes(t.path)&&typeof t.message==`string`?{kind:`unreadable`,path:t.path,message:t.message}:(e instanceof pu&&i.push(...e.warnings),{kind:`fatal`,layers:o,message:e instanceof pu||e instanceof Error?e.message:String(e),warnings:i})}}async function yG(e,t,n){let r=yA(e,rF,{entered:()=>{},warned:e=>n.push(...e)},{projectDir:t,cwd:t}),{config:i}=r,a=new fB,o=new ZC(a,i.globals.default_empty_value??``,void 0,new EB);try{let s=Yz(i,o,{cwd:t});n.push(...s.loadWarnings);let c=await o.settled(hG);return c.length>0&&n.push(`source${c.length===1?``:`s`} still running after ${hG} ms, rendered with fallback values: ${c.join(`, `)}`),{layers:e,droppedPlugins:[...r.installed.dropped,...r.layers.flatMap(e=>e.plugins.dropped)],config:i,compiled:s,store:a,registry:o}}catch(e){throw o.dispose(),e}}function bG({layers:e,config:t,compiled:n,store:r,registry:i},a,o,s){let c=new Map,l=new Set,u={"theme-rule":e=>c.set(`theme rule`,e),"band-floor":e=>l.add(e)};return{rendered:eB(t,n,r,i,gG(a,e.at(-1)??null,s),s,IF(a,o),{onSegmentError:(e,t)=>c.set(`segment "${e}"`,t),onRenderWarning:({kind:e,message:t})=>u[e](t)},LF(a)),failures:c,advisories:l}}async function xG(e,t,n){let r=await yG(e,t,n),{config:i}=r,a=DC(new Date);try{let e=lL();try{HI(i),BP(i)}finally{e()}let t=Pb(null,i.globals.preset,i.presets),o=(e,t)=>{let n=FF(i,t=>t===`preset`?e:null,()=>t),o;try{o=bG(r,n,200,a)}catch(e){o={failures:new Map([[`render`,e instanceof Error?e.message:String(e)]]),advisories:new Set}}return{preset:e,customized:t,...o}},s=o(t,!1),c=[s,o(t,!0),...Nb(i.presets).filter(e=>e!==t).flatMap(e=>[o(e,!1),o(e,!0)])],l=e=>{let n=new Map;for(let t of c)for(let r of e(t)){let e=n.get(r)??new Map;e.set(t.preset,(e.get(t.preset)??new Set).add(t.customized)),n.set(r,e)}return[...n].map(([e,n])=>n.get(t)?.has(!1)?e:`${e} (under ${[...n].map(([e,n])=>[...e===t?[]:[`preset "${e}"`],...n.has(!1)?[]:[`.preset.customized = true`]].join(`, `)).join(`; `)})`)};n.push(...l(e=>e.advisories));let u=l(e=>[...e.failures].map(([e,t])=>`${e}: ${t}`)),d=s.rendered,f=r.droppedPlugins.length,p=[...f>0?[`${f} plugin${f===1?``:`s`} did not load (named in the warnings)`]:[],...u.length>0||d===void 0?[`config renders with ${u.length} render error${u.length===1?``:`s`} (the daemon would show them on the bar):\n`+u.map(e=>` ${e}`).join(`
|
|
223
223
|
`)]:[]];if(p.length>0||d===void 0)throw Error(p.join(`
|
|
224
|
-
`));return d}finally{r.registry.dispose()}}function
|
|
225
|
-
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:
|
|
224
|
+
`));return d}finally{r.registry.dispose()}}function SG(e){return e.map(e=>`warning: ${e}\n`).join(``)}function CG(e,t=!1){switch(e.kind){case`clean`:return{stdout:`✓ ${e.layers.join(` < `)||`bundled default (no config file found)`}: config OK${e.warnings.length>0?` (${e.warnings.length} warning${e.warnings.length===1?``:`s`})`:``}\n`+(t?`${e.rendered}\n`:``),stderr:SG(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:SG(e.warnings)+`✗ ${e.layers.join(` < `)||`<default>`}\n${e.message}\n`,code:1};case`unreadable`:return{stdout:``,stderr:`check: cannot read ${e.path}: ${e.message}\n`,code:2}}}const wG=`--render`,TG=`Usage: cc-candybar check [${wG}] [config-file]\n`;function EG(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==wG);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${TG}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${TG}`}:{kind:`run`,target:n[0],render:t.includes(wG)}}async function DG(e){let n=EG(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:CG(await vG(n.target??mG(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const OG=`${AN}${kN}`;function kG(e){return`${OG}⚠ cc-candybar: ${AG(e)}[0m\n`}function AG(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: ${ON(e.message,60)}`;case`render_failed`:return`render failed: ${ON(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${ON(e.message,60)}`}}function jG(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
|
|
225
|
+
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) — kicking daemon`};case`permanent`:return{output:kG(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) — not kicking`}}}function MG(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 NG=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`];function PG(e,t,n){return{termCols:MG(e.COLUMNS,n.columns),termRows:MG(e.LINES,n.rows),ssh:NG.some(t=>(e[t]??``)!==``),tmux:iT(e),configEnv:mG(e),claudeConfigDir:MT(e,t),mementoEnv:et(e,t)}}const FG=` (fix: click the settings menu (${Vd} by default) › 🧰 tools › 🩺 doctor, then [fix] on the bar)`;function IG({check:e,verdict:t}){return t.ok?`✓ ${e.label}\n`:`✗ ${e.label} — ${t.reason}${t.fix===void 0?``:FG}\n`+(t.more??[]).map(e=>` ${e}\n`).join(``)}function LG(e){let t={sessionState:new EB},n=yB(e.projectDir,e.cwd,e.configFile??void 0,t),r=n.state??bB(e.cwd,e.projectDir,t);return r.registry.dispose(),{layers:n.layers,error:n.error,warning:n.warning,unused:r.unused,config:r.config}}async function RG(e,t,n,r,i=void 0){let a;try{a={...pH(e,{tmux:iT(n),claudeConfigDir:MT(n,r)},{projectDir:r,cwd:r,configFile:PA(i??mG(n))??null},()=>null),urlHandler:await kH(t)}}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let o=pT(a);return{stdout:o.map(IG).join(``),stderr:``,code:+!o.every(e=>e.verdict.ok)}}async function zG(e){(e.length>1||e[0]===``||e[0]?.startsWith(`--`))&&(t.stderr.write(`doctor: expected at most one config file
|
|
226
226
|
Usage: cc-candybar doctor [config-file]
|
|
227
|
-
`),t.exit(2));let n=t.cwd(),r=await
|
|
227
|
+
`),t.exit(2));let n=t.cwd(),r=await RG(sH(LG),NH(),t.env,n,e[0]===void 0?void 0:l.resolve(n,Ak(e[0])));t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const BG=e=>e.some(e=>t.argv.includes(e));function VG(){console.log(tT)}async function HG(){try{BG($w.help)&&(VG(),t.exit(0)),BG($w.version)&&(console.log(`cc-candybar ${ZA}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await tN(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(XM(),t.exit(0)),e===`url-handle`){await QM(t.argv[3]);return}if(e===`daemon`){FW();return}if(e===`daemon-stats`&&(await gH(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await DG(t.argv.slice(3));return}if(e===`schema`){fG();return}if(e===`doctor`){await zG(t.argv.slice(3));return}fW(e)&&(await rG(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
|
|
228
228
|
|
|
229
229
|
cc-candybar is designed to be used as a Claude Code statusLine command.
|
|
230
230
|
It reads hook data from stdin and outputs formatted statusline.
|
|
@@ -240,4 +240,4 @@ Add to ~/.claude/settings.json:
|
|
|
240
240
|
Run with --help for more options.
|
|
241
241
|
|
|
242
242
|
To test output manually:
|
|
243
|
-
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar`),t.exit(1)),D(`Working directory: ${t.cwd()}`),D(`Process args:`,t.argv);let r=await n(t.stdin);D(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),
|
|
243
|
+
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar`),t.exit(1)),D(`Working directory: ${t.cwd()}`),D(`Process args:`,t.argv);let r=await n(t.stdin);D(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),VG(),t.exit(1));let i=jG(await tj(r,t.argv,t.cwd(),PG(t.env,t.cwd(),t.stderr)));i.debug!==null&&D(i.debug),i.kick&&xj(),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)}}HG();export{};
|