@promptctl/cc-candybar 1.100.0 → 1.100.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +8 -8
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -87,7 +87,7 @@ Use 'override' annotation for methods overridden by subclass.`)}}var na=ca(0),ra
|
|
|
87
87
|
`,1)[0]??``}function yy(e,t){if(e.kind!==`ok`)return e;let n=t(e.value);return n===null?Y:J(n)}function by(e){if(e.kind!==`ok`)return e;let t=e.value.trim();return t?J(t):Y}const xy=/^[A-Za-z]:[\\/]/;function Sy(e){let t=e.trim();if(xy.test(t))return null;let n=t.match(/^(?:[^@/]+@)?(\[[^\]]+\]):(.*)$/)??t.match(/^(?:[^@/:]+@)?([^/:]+):(?!\/\/)(.*)$/),r=n?`ssh://${n[1]}/${n[2].replace(/^\/+/,``)}`:t,i;try{i=new URL(r)}catch{return null}return{scheme:i.protocol.replace(/:$/,``),host:i.hostname.toLowerCase(),port:i.port,path:i.pathname.replace(/^\/+/,``).replace(/\/+$/,``)}}function Cy(e){return Sy(e)?.host||null}function wy(e){let t=Cy(e);return t?t===`github.com`||t.endsWith(`.github.com`)?`github`:/(^|\.)gitlab\./.test(t)?`gitlab`:null:null}function Ty(e){let t=new Map;for(let n of e.split(`
|
|
88
88
|
`)){let e=n.match(/^remote\.(.+)\.url\s+(\S.*)$/);if(!e)continue;let r=t.get(e[1])??[];r.push(e[2].trim()),t.set(e[1],r)}return[...t].map(([e,t])=>({name:e,urls:t}))}function Ey(e){return e.urls.find(e=>jy(e)!==null)??e.urls[0]??null}function Dy(e){return e.find(e=>e.name===`origin`)??e[0]??null}function Oy(e){let t=Dy(e);return t?Ey(t):null}function ky(e){let t=Dy(e);return t?t.urls.find(e=>wy(e)!==null)??Ey(t):null}function Ay(e){let t=(Sy(e)?.path??e.replace(/[\\/]+$/,``)).split(`/`);return(t[t.length-1]??``).replace(/\.git$/,``)||null}function jy(e){let t=Sy(e);if(!t)return null;let n=t.scheme===`https`?{scheme:`https`,port:t.port}:t.scheme===`http`?{scheme:`http`,port:t.port}:t.scheme===`ssh`||t.scheme===`git`?{scheme:`https`,port:``}:null;if(!n||!t.host)return null;let r=t.path.replace(/\.git$/,``);if(!r)return null;let i=n.port?`${t.host}:${n.port}`:t.host;return`${n.scheme}://${i}/${r}`}function My(e){let t=Oy(e);return t===null?null:jy(t)}function Ny(e,t,n,r){return t.ok?r(t.stdout):t.reason===`spawn-error`&&/ENOENT/i.test(t.error??``)||t.reason===`non-zero`&&n.test(t.stderr)?Y:X(`${e}: ${[t.reason,t.exitCode==null?null:`exit ${t.exitCode}`,t.error??vy(t.stderr)].filter(Boolean).join(`, `)}`)}function Py(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Fy(e){let t=`detached`,n=Y,r=Y,i=Y,a=0,o=0,s=0,c=0;for(let l of e.split(`
|
|
89
89
|
`)){if(!l)continue;if(l.startsWith(`# `)){let e=l.slice(2);if(e.startsWith(`branch.oid `)){let t=e.slice(11).trim();n=t===`(initial)`?Y:J(t)}else if(e.startsWith(`branch.head `)){let n=e.slice(12).trim();t=n===`(detached)`?`detached`:n}else if(e.startsWith(`branch.upstream `))r=J(e.slice(16).trim());else if(e.startsWith(`branch.ab `)){let t=e.slice(10).trim().match(/^\+(\d+)\s+-(\d+)$/);t&&(i=J({ahead:parseInt(t[1],10),behind:parseInt(t[2],10)}))}continue}let e=l[0];if(e===`1`||e===`2`){let e=l.slice(2,4);e[0]!==`.`&&a++,e[1]!==`.`&&o++}else e===`u`?c++:e===`?`&&s++}let l=`clean`;return c>0?l=`conflicts`:(a||o||s)&&(l=`dirty`),{branch:t,status:l,aheadBehind:i,oid:n,upstream:r,workingTree:{staged:a,unstaged:o,untracked:s,conflicts:c}}}function Iy(e){let t;try{t=JSON.parse(e)}catch(e){return X(`gh pr view: unparseable JSON (${e instanceof Error?e.message:String(e)})`)}if(!Py(t))return X(`gh pr view: JSON is not an object`);let{number:n,state:r,url:i}=t;return typeof n!=`number`||typeof r!=`string`||typeof i!=`string`?X(`gh pr view: missing number/state/url`):r.toUpperCase()===`OPEN`?J({number:n,state:r,url:i}):Y}function Ly(e){let t;try{t=JSON.parse(e)}catch(e){return X(`glab mr view: unparseable JSON (${e instanceof Error?e.message:String(e)})`)}if(!Py(t))return X(`glab mr view: JSON is not an object`);let n=t.iid,r=t.state,i=t.web_url;return typeof n!=`number`||typeof r!=`string`||typeof i!=`string`?X(`glab mr view: missing iid/state/web_url`):r.toLowerCase()===`opened`?J({number:n,state:r,url:i}):Y}function Ry(e){try{let t=r.statSync(e);return{key:`${t.dev}:${t.ino}`,stamp:`${t.mtimeMs}:${t.size}`}}catch{return null}}var zy=class{isGitRepo(e){try{return r.existsSync(c.join(e,`.git`))}catch{return!1}}async execGitAsync(e,t){return De({bin:`git`,args:[...e],cwd:t.cwd,env:{...process.env,GIT_OPTIONAL_LOCKS:`0`},timeoutMs:t.timeout,category:`git`})}async resolveEffectiveGitDir(e,t){return this.isWorktree(e)?J(e):t&&this.isGitRepo(t)?J(t):this.isGitRepo(e)?J(e):this.findGitRoot(e)}async findGitRoot(e){let t=c.resolve(e);for(;;){if(this.isGitRepo(t))return J(t);let e=c.dirname(t);if(e===t)return Y;t=e}}async getGitInfo(e,t={},n){try{return await this.computeGitInfo(e,t,n)}catch(e){return X(`git: ${e instanceof Error?e.message:String(e)}`)}}async computeGitInfo(e,t={},n){let r,i=this.isWorktree(e);if(i)r=e;else if(n&&this.isGitRepo(n))r=n;else if(this.isGitRepo(e))r=e;else{let t=await this.findGitRoot(e);if(t.kind!==`ok`)return t;r=t.value}let a=await this.getCoreAsync(r);if(a.kind!==`ok`)return a;let o={branch:a.value.branch,status:a.value.status,aheadBehind:a.value.aheadBehind};t.showWorkingTree&&(o.workingTree=a.value.workingTree),t.showSha&&(o.sha=yy(a.value.oid,e=>e.slice(0,7))),t.showUpstream&&(o.upstream=a.value.upstream),t.showTag&&(o.tag=await this.getNearestTagAsync(r)),t.showTimeSinceCommit&&(o.timeSinceCommit=await this.timeSinceCommit(r,a.value.oid)),t.showStashCount&&(o.stashCount=this.getStashCount(r));let s=t.showRepoName||t.showRepoUrl?await this.getRemotesAsync(r):void 0;return s!==void 0&&t.showRepoName&&(o.repoName=yy(s,e=>this.repoNameFrom(e,r)),o.isWorktree=i),s!==void 0&&t.showRepoUrl&&(o.repoUrl=yy(s,My)),t.showOperation&&(o.operation=this.getOngoingOperation(r)),J(o)}resolveGitDir(e){let t=c.join(e,`.git`);try{if(r.existsSync(t)&&r.statSync(t).isFile()){let n=r.readFileSync(t,`utf-8`).match(/^gitdir:\s*(.+)$/m);if(n?.[1])return c.resolve(e,n[1].trim())}}catch{}return t}getOngoingOperation(e){try{let t=this.resolveGitDir(e);return r.existsSync(c.join(t,`MERGE_HEAD`))?J(`MERGE`):r.existsSync(c.join(t,`CHERRY_PICK_HEAD`))?J(`CHERRY-PICK`):r.existsSync(c.join(t,`REVERT_HEAD`))?J(`REVERT`):r.existsSync(c.join(t,`BISECT_LOG`))?J(`BISECT`):r.existsSync(c.join(t,`rebase-merge`))||r.existsSync(c.join(t,`rebase-apply`))?J(`REBASE`):Y}catch(e){return X(`git operation probe: ${e instanceof Error?e.message:String(e)}`)}}async getNearestTagAsync(e){return by(_y(`git describe --tags`,await this.execGitAsync([`describe`,`--tags`,`--abbrev=0`],{cwd:e,timeout:2e3}),`absent`))}async timeSinceCommit(e,t){return t.kind===`ok`?yy(await this.commitTimestampMs(e,t.value),e=>Math.floor((Date.now()-e)/1e3)):t}commitTimes=new Map;async commitTimestampMs(e,t){let n=this.commitTimes.get(t);if(n!==void 0)return this.commitTimes.delete(t),this.commitTimes.set(t,n),n;let r=this.readCommitTimestampMs(e,t);for(this.commitTimes.set(t,r),r.then(e=>{e.kind!==`ok`&&this.commitTimes.get(t)===r&&this.commitTimes.delete(t)},()=>{this.commitTimes.get(t)===r&&this.commitTimes.delete(t)});this.commitTimes.size>256;){let e=this.commitTimes.keys().next().value;if(e===void 0)break;this.commitTimes.delete(e)}return r}async readCommitTimestampMs(e,t){let n=by(_y(`git log -1`,await this.execGitAsync([`log`,`-1`,`--format=%ct`,t,`--`],{cwd:e,timeout:2e3}),`absent`));if(n.kind!==`ok`)return n;let r=parseInt(n.value,10)*1e3;return Number.isNaN(r)?X(`git log -1: unparseable timestamp "${n.value}"`):J(r)}resolveCommonGitDir(e){let t=this.resolveGitDir(e);try{let e=r.readFileSync(c.join(t,`commondir`),`utf-8`).trim();if(e)return c.resolve(t,e)}catch{}return t}getStashCount(e){let t=c.join(this.resolveCommonGitDir(e),`logs`,`refs`,`stash`),n;try{n=r.readFileSync(t,`utf-8`)}catch(e){return e.code===`ENOENT`?J(0):X(`git stash reflog ${t}: ${e instanceof Error?e.message:String(e)}`)}let i=n.trim();return J(i?i.split(`
|
|
90
|
-
`).length:0)}async getRemotesAsync(e){let t=Ry(c.join(this.resolveCommonGitDir(e),`config`));if(t===null)return this.readRemotes(e);let{key:n,stamp:r}=t,i=this.remotesByConfig.get(n);if(i!==void 0&&i.stamp===r)return this.remotesByConfig.delete(n),this.remotesByConfig.set(n,i),i.remotes;let a=this.readRemotes(e);for(this.remotesByConfig.set(n,{stamp:r,remotes:a}),a.then(e=>{let t=this.remotesByConfig.get(n);e.kind!==`ok`&&t?.remotes===a&&this.remotesByConfig.delete(n)},()=>{this.remotesByConfig.get(n)?.remotes===a&&this.remotesByConfig.delete(n)});this.remotesByConfig.size>256;){let e=this.remotesByConfig.keys().next().value;if(e===void 0)break;this.remotesByConfig.delete(e)}return a}remotesByConfig=new Map;async readRemotes(e){let t=_y(`git config --get-regexp remote url`,await this.execGitAsync([`config`,`--local`,`--get-regexp`,`^remote\\..*\\.url$`],{cwd:e,timeout:2e3}),1);return t.kind===`failed`?t:J(t.kind===`ok`?Ty(t.value):[])}repoNameFrom(e,t){let n=Oy(e);return(n===null?null:Ay(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=ky(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return De({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=wy(t);return n===`github`?Ny(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,Iy):n===`gitlab`?Ny(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,Ly):Y}isWorktree(e){try{let t=c.join(e,`.git`);return!!(r.existsSync(t)&&r.statSync(t).isFile())}catch{return!1}}async getCoreAsync(e){O(`[GIT-EXEC] Running git status --porcelain=v2 in ${e}`);let t=_y(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(Fy(t.value)):t}};const By=(e,t)=>O(t);var Vy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??By}acquire(e,t,n){if(this.closed)return{release:()=>{}};let r=this.slots.get(e);if(r)return r.refcount++,r.onInvalidate=n,r.lastTouched=Date.now(),this.slots.delete(e),this.slots.set(e,r),this.makeHandle(e);let i={key:e,watchers:[],refcount:1,debounceTimer:null,onInvalidate:n,targets:t,lastTouched:Date.now()};return this.openWatchers(i),this.slots.set(e,i),this.counters&&this.counters.watchersOpened++,this.evictIfNeeded(),this.makeHandle(e)}makeHandle(e){let t=!1;return{release:()=>{if(t)return;t=!0;let n=this.slots.get(e);n&&(n.refcount=Math.max(0,n.refcount-1),n.refcount===0&&(this.closeSlot(n),this.slots.delete(e)))}}}openWatchers(e){let t=()=>{e.debounceTimer||(e.debounceTimer=setTimeout(()=>{e.debounceTimer=null;try{e.onInvalidate()}catch(e){this.logger(`warn`,`watcher invalidate threw: ${e.message}`)}},50),e.debounceTimer.unref())};for(let n of e.targets.files)try{let i=r.watch(n,{persistent:!1},t);i.on(`error`,e=>{this.logger(`warn`,`watcher error ${n}: ${e.message}`)}),e.watchers.push(i)}catch(e){this.logger(`warn`,`watch failed ${n}: ${e.message}`)}for(let n of e.targets.dirs)try{let i=n.filenames?new Set(n.filenames):null,a=r.watch(n.path,{persistent:!1},(e,n)=>{i&&(!n||!i.has(n))||t()});a.on(`error`,e=>{this.logger(`warn`,`watcher error ${n.path}: ${e.message}`)}),e.watchers.push(a)}catch(e){this.logger(`warn`,`watch failed ${n.path}: ${e.message}`)}}closeSlot(e){e.debounceTimer&&=(clearTimeout(e.debounceTimer),null);for(let t of e.watchers)try{t.close()}catch{}e.watchers=[],this.counters&&this.counters.watchersClosed++}evictIfNeeded(){for(;this.slots.size>this.maxWatchers;){let e=this.slots.keys().next().value;if(e===void 0)break;let t=this.slots.get(e);this.closeSlot(t),this.slots.delete(e),this.counters&&this.counters.watchersEvicted++;try{t.onInvalidate()}catch{}this.logger(`info`,`watcher LRU evict ${e}`)}}size(){return this.slots.size}closeAll(){this.closed=!0;for(let e of this.slots.values())this.closeSlot(e);this.slots.clear()}},Hy=class{running=new Set;again=new Set;run(e,t){return this.again.add(e),this.running.has(e)?{kind:`queued`}:(this.running.add(e),{kind:`started`,done:this.loop(e,t)})}async loop(e,t){try{do this.again.delete(e),await t();while(this.again.has(e))}finally{this.running.delete(e),this.again.delete(e)}}clear(){this.running.clear(),this.again.clear()}get size(){return this.running.size}};const Uy=(e,t)=>O(t),Wy={showSha:!0,showStashCount:!0};function Gy(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function Ky(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function qy(e,t){return e.head!==t.head||e.index!==t.index}function Jy(e){let t=[],n=c.join(e,`refs/heads`);try{r.statSync(n).isDirectory()&&t.push({path:n})}catch{}return{files:[c.join(e,`HEAD`),c.join(e,`index`)],dirs:t}}var Yy=class extends zy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Hy;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new zy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??Uy,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Vy({logger:this.logger}),this.ownsWatchers=!0);let t=e.sanityIntervalMs??3e5;t>0&&(this.sanityTimer=setInterval(()=>this.runSanityCheck(),t),this.sanityTimer.unref())}getWatcherRegistry(){return this.watchers}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,invalidations:this.invalidations,watchers:this.watchers.size()}}resolveEffectiveGitDir(e,t){let n=`${e}|${t??``}`,r=Date.now(),i=this.resolutions.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.resolutions.delete(n),this.resolutions.set(n,i),i.dir;let a=this.inner.resolveEffectiveGitDir(e,t);return this.resolutions.set(n,{dir:a,computedAt:r}),a.catch(()=>{this.resolutions.get(n)?.dir===a&&this.resolutions.delete(n)}),this.evictResolutionsIfNeeded(),a}evictResolutionsIfNeeded(){for(;this.resolutions.size>this.maxEntries;){let e=this.resolutions.keys().next().value;if(e===void 0)break;this.resolutions.delete(e)}}async getGitInfo(e,t={},n){let r=await this.resolveEffectiveGitDir(e,n);return r.kind===`ok`?this.getGitInfoForRoot(r.value,t):r}getGitInfoForRoot(e,t){let n=`${e}|${Gy(t)}`,r=Date.now(),i=this.entries.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.entries.delete(n),this.entries.set(n,i),this.hits++,Promise.resolve(J(i.info));let a=this.fetchInFlight.get(n);if(a)return a;let o=this.doFetch(e,n,t,r).finally(()=>{this.fetchInFlight.delete(n)});return this.fetchInFlight.set(n,o),o}async doFetch(e,t,n,r){this.misses++;let i=this.inner.resolveGitDir(e),a=Ky(i),o=await this.inner.getGitInfo(e,n);if(o.kind!==`ok`)return o;let s=o.value;n.showPullRequest&&(s.pullRequest=await this.getPullRequestCached(e,s.branch)),this.dropEntry(t);let c=this.watchers.acquire(`git:${e}`,Jy(i),()=>this.invalidateRepo(e));return this.entries.set(t,{info:s,computedAt:r,mtime:a,watcher:c,repoRoot:e}),this.evictIfNeeded(),o}async getPullRequestCached(e,t){let n=await this.inner.getRepoRemoteUrl(e);if(n.kind===`failed`)return n;if(n.kind===`absent`)return Y;let r=n.value,i=`${e}|${t}|${r}`,a=Date.now(),o=this.prCache.get(i);if(o){let e=o.pr.kind===`failed`?45e3:3e5;if(a-o.computedAt<e)return this.prCache.delete(i),this.prCache.set(i,o),o.pr}let s=this.prFetchInFlight.get(i);if(s)return s;let c=this.inner.resolvePullRequest(e,r).then(e=>(this.prCache.set(i,{pr:e,computedAt:Date.now()}),this.evictPrIfNeeded(),e)).finally(()=>{this.prFetchInFlight.delete(i)});return this.prFetchInFlight.set(i,c),c}evictPrIfNeeded(){for(;this.prCache.size>this.maxEntries;){let e=this.prCache.keys().next().value;if(e===void 0)break;this.prCache.delete(e)}}deliverable(e,t){return e.kind===`failed`?(this.logger(`warn`,`git fetch failed (${t}): ${e.reason}`),null):e.kind===`ok`?e.value:null}subscribe(e,t){let n=!1,r=null;return{firstDelivery:(async()=>{let i=await this.resolveEffectiveGitDir(e);if(n)return;if(i.kind!==`ok`){i.kind===`failed`&&this.logger(`warn`,`git resolve failed (subscribe ${e}): ${i.reason}`),this.safeInvoke(t,null);return}let a=i.value,o=this.subscribersByRepo.get(a);if(!o){let t=this.inner.resolveGitDir(a),n=this.watchers.acquire(`git:${a}`,Jy(t),()=>this.invalidateRepo(a));o={workingDir:e,repoRoot:a,callbacks:new Set,watcher:n},this.subscribersByRepo.set(a,o)}o.callbacks.add(t),r={repoRoot:a,entry:o};let s=await this.getGitInfoForRoot(a,{...Wy});n||this.safeInvoke(t,this.deliverable(s,a))})(),unsubscribe:()=>{if(n=!0,!r)return;let{repoRoot:e,entry:i}=r;i.callbacks.delete(t),i.callbacks.size===0&&(i.watcher.release(),this.subscribersByRepo.delete(e))}}}invalidateRepo(e){let t=0;for(let[n,r]of this.entries)r.repoRoot===e&&(r.watcher.release(),this.entries.delete(n),t++);t>0&&(this.invalidations+=t,this.logger(`info`,`gitCache invalidate ${e} dropped=${t}`)),this.refreshSubscribers(e)}refreshSubscribers(e){let t=this.subscribersByRepo.get(e);!t||t.callbacks.size===0||this.refreshes.run(e,()=>this.refreshOnce(e))}async refreshOnce(e){let t=this.subscribersByRepo.get(e);if(!t||t.callbacks.size===0)return;let n=await this.getGitInfoForRoot(e,{...Wy}),r=this.deliverable(n,e),i=this.subscribersByRepo.get(e);if(!(!i||i.callbacks.size===0))for(let e of[...i.callbacks])i.callbacks.has(e)&&this.safeInvoke(e,r)}safeInvoke(e,t){try{e(t)}catch(e){this.logger(`warn`,`git subscriber threw: ${e.message??String(e)}`)}}dropEntry(e){let t=this.entries.get(e);t&&(t.watcher.release(),this.entries.delete(e))}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.dropEntry(e),this.logger(`info`,`gitCache evict ${e}`)}}runSanityCheck(){let e=new Map;for(let t of this.entries.values()){let n=e.get(t.repoRoot);n||(n=Ky(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),qy(t.mtime,n)&&this.invalidateRepo(t.repoRoot)}}runSanityCheckNow(){this.runSanityCheck()}close(){this.sanityTimer&&=(clearInterval(this.sanityTimer),null);for(let e of this.entries.values())e.watcher.release();this.entries.clear();for(let e of this.subscribersByRepo.values())e.callbacks.clear(),e.watcher.release();this.subscribersByRepo.clear(),this.refreshes.clear(),this.fetchInFlight.clear(),this.prCache.clear(),this.prFetchInFlight.clear(),this.resolutions.clear(),this.ownsWatchers&&this.watchers.closeAll()}};const Xy=/\r\n|\r|\n/g,Zy=e=>J(e.replace(Xy,` `).trim());function Qy(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(Xy,` `))}}const $y=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function eb(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(O(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function tb(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}const nb=`session.id`;function rb(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await De({bin:`/bin/sh`,args:[`-c`,e],cwd:t,category:`user-shell`,signal:n});if(!r.ok&&r.reason===`aborted`)throw n.reason;return r.ok?J(r.stdout):X(`shell "${e}" ${r.exitCode===null?[r.reason,r.error].filter(e=>e!==void 0).join(`: `):`exited with code ${r.exitCode}`} in ${t}`)}}}function ib(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await x(e,{encoding:`utf8`,signal:n});return J(t===`first-line`?r.split(/\r?\n/)[0]??``:r)}catch{if(n.aborted)throw n.reason;return X(`file unreadable: ${e}`)}}}}function ab(e,t,n){if(e.kind!==`ok`)return e;let r=t(e.value);return r.kind===`failed`?X(`${r.reason} in ${n}`):r}const ob=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],sb=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],cb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],lb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function ub(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>ob[e.getMonth()]],[`Monday`,e=>cb[e.getDay()]],[`Jan`,e=>sb[e.getMonth()]],[`Mon`,e=>lb[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const db={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function fb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=db[t];try{return gb(r,e)}catch{return _b(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return gy(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return gy(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return gy(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return gy(e.stashCount,0)}}var pb=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},mb=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:te(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ee(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ee(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function hb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function gb(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?bv(e):t===`number`?xv(e):Sv(e)}function _b(e){return e===`number`?0:e===`boolean`?!1:``}var vb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new pb;ttlMgr=new mb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Hy;abort=new AbortController;drawn=_v.observable.box(F.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=dy(void 0,void 0,this.drawnAt);gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new Yy({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,yv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){this.declareSource(e,rb(t,n.cwd,this.abort.signal),eb(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,ib(t,n.readMode??`whole`,this.abort.signal),n.cache,n.parse)}declareSource(e,t,n,r){let i=this.publisherFor(e,r,t.where),a=()=>this.runSource(e,t,i);a(),this.registerCachePolicy(e,n,a)}publisherFor(e,t,n){switch(t.kind){case`text`:return this.scalarPublisher(e,Zy,t.default,n);case`regex`:return this.scalarPublisher(e,Qy(t.regex),t.default,n);case`json`:return this.documentPublisher(e,t.default,n)}}scalarPublisher(e,t,n,r){let i=this.stringInitial(n);return this.store.defineBox(e,`string`,i),n=>{let a=ab(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,gy(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=ab(i,$y,n);this.noteOutcome(e,a),this.store.setDocument(e,a.kind===`ok`||t===void 0?a:r)}}runSource(e,t,n){let r=this.reads.run(e,()=>t.read().then(n,e=>{if(e!==this.abort.signal.reason)throw e}));r.kind===`started`&&this.track(e,r.done)}track(e,t){let n=t.finally(()=>{this.inFlight.get(e)===n&&this.inFlight.delete(e)});this.inFlight.set(e,n)}async settled(e){let t=Date.now()+e;for(;this.inFlight.size>0;){let e=t-Date.now();if(e<=0)break;let n,r=await Promise.race([Promise.all(this.inFlight.values()).then(()=>`settled`),new Promise(t=>{n=setTimeout(()=>t(`deadline`),e)})]);if(clearTimeout(n),r===`deadline`)break}return[...this.inFlight.keys()]}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=fy(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){let r=t instanceof Error?t.message:String(t);if(this.recordError(e,r),n.varDefault===void 0)throw Error(`variable "${e}": ${r}`);return n.varDefault}});try{this.store.read(e)}catch{}}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return ub(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,ub(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=db[t.field],r=t.varDefault===void 0?_b(n):gb(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map,n=this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,fb(t,n,i,this.defaultEmptyValue))})});i={fieldSubs:e,firstDelivery:n.firstDelivery,unsubscribe:n.unsubscribe},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault}),this.track(e,i.firstDelivery)}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(nb);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=hb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,gb(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}drawAt(e){this.store.runInAction(()=>this.drawn.set(e))}getLastError(e){return this.lastErrors.get(e)}dispose(){this.abort.abort();for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.reads.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,_v.reaction)(()=>{let t=fy(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,_v.reaction)(()=>t.varNames.map(e=>this.store.changeKey(e)).join(`,`),n);this.cleanups.push(e);break}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,gb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,_b(t))}}defaultFor(e){try{return gb(this.defaultEmptyValue,e)}catch{return _b(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}noteOutcome(e,t){t.kind===`ok`?this.lastErrors.delete(e):this.recordError(e,t.kind===`failed`?t.reason:`no value`)}};const yb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[nb]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"preset.customized":{kind:`input`,path:`preset.customized`,type:`boolean`,default:!1},"preset.bundled":{kind:`input`,path:`preset.bundled`,type:`boolean`,default:!0},"endcaps.effective":{kind:`input`,path:`endcaps.effective`,default:``},"variation.effective":{kind:`input`,path:`variation.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"updateNotice.effective":{kind:`input`,path:`updateNotice.effective`,type:`boolean`,default:!0},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},bb={theme:{configKey:`palette`,sessionKey:`theme`,effectiveVar:`theme.effective`,label:`🎨`},preset:{configKey:`preset`,sessionKey:`preset`,effectiveVar:`preset.effective`,label:`▦`},style:{configKey:`style`,sessionKey:`style`,effectiveVar:`style.effective`,label:`◐`},endcaps:{configKey:`endcaps`,sessionKey:`endcaps`,effectiveVar:`endcaps.effective`,label:`✦`},variation:{configKey:`variation`,sessionKey:`variation`,effectiveVar:`variation.effective`,label:`🎼`},charset:{configKey:`charset`,sessionKey:`charset`,effectiveVar:`charset.effective`,label:`🔣`},colorCompatibility:{configKey:`colorCompatibility`,sessionKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`,label:`🌈`},autoWrap:{configKey:`autoWrap`,sessionKey:`autoWrap`,effectiveVar:`autoWrap.effective`,label:`wrap`},padding:{configKey:`padding`,sessionKey:`padding`,effectiveVar:`padding.effective`,label:`padding`},updateNotice:{configKey:`updateNotice`,sessionKey:`updateNotice`,effectiveVar:`updateNotice.effective`,label:`update notice`}},xb=Object.values(bb),Sb=new Map(xb.map(e=>[e.configKey,e.effectiveVar])),Cb=new Map(xb.map(e=>[e.sessionKey,e.effectiveVar])),wb=new Map(Object.keys(bb).map(e=>[bb[e].sessionKey,e]));function Tb(e,t,n){let r=new Set,i=e=>{for(let t of sv(e??``,n).keys())r.add(t)};for(let t of Object.values(e.segments))i(t.template),i(t.bg),i(t.fg),i(t.when);for(let e of t)for(let t of js(e))i(t.when);for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(nb);for(let t of Object.values(e.actions)){r.add(nb),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Cb.get(t.set):void 0,n=`persist`in t?Sb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Eb(e,t,n){let r=pv({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of Tb(e,t,n.helpers)){if(fv(a,r))continue;let e=yb[a];if(e===void 0)throw Error(`synthesized chrome reads ".${a}", which it does not declare and PAYLOAD_INPUTS does not supply`);i[a]=e}return i}const Db=new Map,Ob=new Map;function kb(e){let t=jb(e);if(t===null)throw Error(`Palette "${e}" did not resolve in the theme registry — allowed names and the registry are inconsistent`);return t}function Ab(e,t){return e===`bar`?t:kb(e)}function jb(e){let t=Db.get(e);if(t!==void 0)return t;let n=xr(e);return n===null?null:(Db.set(e,n),n)}function Mb(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Ob.get(n);if(r!==void 0)return r;let i=kr(e,t);return Ob.set(n,i),i}function Nb(e){let t=jb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Pb(e,t,n){let r=Nb(e);return r===null?(n(`${t} rendered "${Wa}": "${e}" names no installed theme${Ua(e)}`),Ib()):r}function Fb(e,t,n){return $a(e,t,n,Ib(),Nb)}function Ib(){return Nb(Wa)}function Lb(e){return eo(Fb(void 0,null,e),Ib).value}const Rb=new Map;function zb(e,t,n){Rb.set(e,{permanent:!0,resolve:t,paletteOf:n})}zb(`themes`,()=>Ka(),e=>kb(e));const Bb=`placementThemes`;zb(Bb,qa,(e,t)=>Ab(e,t.palette)),zb(`endcaps`,()=>ao),zb(`variations`,()=>vo),zb(`charsets`,()=>co),zb(`colorCompatibilities`,()=>po);function Vb(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Mb(n.basePalette,e.styles[t])}],[`presets`,{members:x_(e.presets)}]])}function Hb(e){return[...new Set([...Rb.keys(),...e.keys()])]}function Ub(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Rb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${Hb(t).join(`, `)})`)}function Wb(e){return{label:e.label,domain:Gb(e.domain)}}function Gb(e){return e===`theme`?{from:Bb}:e===`bool`||`min`in e?e:{from:e}}function Kb(e,t,n,r){let i=qc(e.label),{domain:a}=e;if(a===`bool`)return{kind:`inline`,template:`{{ action "${r}" "☑ ${i}" "☐ ${i}" }}`,actions:{[r]:{set:t,cycle:[...Co]}}};if(`from`in a)return{kind:`ring`,template:`{{ carousel "${r}" }}`,actions:{[r]:{set:t,from:a.from}}};let o=e=>({set:t,min:a.min,max:a.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "◀" }} {{ "${i}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`,actions:{[`${r}.down`]:o(-a.step),[`${r}.up`]:o(a.step)}}}const qb=/^segments\.([^.]+)\.palette$/,Jb=/^presets\.(.+)\.root$/,Yb=/^presets\.(.+)\.globals\.([^.]+)$/;function Xb(e){return`presets.${e}.root`}function Zb(e,t){return`presets.${e}.globals.${t}`}function Qb(e){if(El(e))return{scope:`globals`,field:e};let t=qb.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=Yb.exec(e);if(n&&yl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Jb.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function $b(e){switch(e.scope){case`globals`:return[`globals`,e.field];case`preset-globals`:return[`presets`,e.preset,`globals`,e.field];case`segment-palette`:return[`segments`,e.segment,`palette`]}}const ex=`open`;function tx(e,t,n,r){let i={variable:e,key:e,member:ex};return r.variables[e]=Qc(e,Uc),r.actions[e]=$c(e,ex),r.segments[e]={template:Zc(e,`(?)`,`✕`),...nx(n)},Jc(e,i,{kind:`container`,direction:`horizontal`,children:t.map((t,n)=>{let i=`${e}.${n}`;return r.segments[i]={template:t},{kind:`segment`,name:i}})},`drop`)}function nx(e){let[t,...n]=e;return t===void 0?{}:{when:Yc(t,...n)}}const rx={help:[`-h`,`--help`],version:[`-V`,`--version`]},ix=[`✚ inserts`,`🚫 removes`,`⚙ configures`,`↺ resets layout`],ax=`
|
|
90
|
+
`).length:0)}async getRemotesAsync(e){let t=Ry(c.join(this.resolveCommonGitDir(e),`config`));if(t===null)return this.readRemotes(e);let{key:n,stamp:r}=t,i=this.remotesByConfig.get(n);if(i!==void 0&&i.stamp===r)return this.remotesByConfig.delete(n),this.remotesByConfig.set(n,i),i.remotes;let a=this.readRemotes(e);for(this.remotesByConfig.set(n,{stamp:r,remotes:a}),a.then(e=>{let t=this.remotesByConfig.get(n);e.kind!==`ok`&&t?.remotes===a&&this.remotesByConfig.delete(n)},()=>{this.remotesByConfig.get(n)?.remotes===a&&this.remotesByConfig.delete(n)});this.remotesByConfig.size>256;){let e=this.remotesByConfig.keys().next().value;if(e===void 0)break;this.remotesByConfig.delete(e)}return a}remotesByConfig=new Map;async readRemotes(e){let t=_y(`git config --get-regexp remote url`,await this.execGitAsync([`config`,`--local`,`--get-regexp`,`^remote\\..*\\.url$`],{cwd:e,timeout:2e3}),1);return t.kind===`failed`?t:J(t.kind===`ok`?Ty(t.value):[])}repoNameFrom(e,t){let n=Oy(e);return(n===null?null:Ay(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=ky(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return De({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=wy(t);return n===`github`?Ny(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,Iy):n===`gitlab`?Ny(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,Ly):Y}isWorktree(e){try{let t=c.join(e,`.git`);return!!(r.existsSync(t)&&r.statSync(t).isFile())}catch{return!1}}async getCoreAsync(e){O(`[GIT-EXEC] Running git status --porcelain=v2 in ${e}`);let t=_y(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(Fy(t.value)):t}};const By=(e,t)=>O(t);var Vy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??By}acquire(e,t,n){if(this.closed)return{release:()=>{}};let r=this.slots.get(e);if(r)return r.refcount++,r.onInvalidate=n,r.lastTouched=Date.now(),this.slots.delete(e),this.slots.set(e,r),this.makeHandle(e);let i={key:e,watchers:[],refcount:1,debounceTimer:null,onInvalidate:n,targets:t,lastTouched:Date.now()};return this.openWatchers(i),this.slots.set(e,i),this.counters&&this.counters.watchersOpened++,this.evictIfNeeded(),this.makeHandle(e)}makeHandle(e){let t=!1;return{release:()=>{if(t)return;t=!0;let n=this.slots.get(e);n&&(n.refcount=Math.max(0,n.refcount-1),n.refcount===0&&(this.closeSlot(n),this.slots.delete(e)))}}}openWatchers(e){let t=()=>{e.debounceTimer||(e.debounceTimer=setTimeout(()=>{e.debounceTimer=null;try{e.onInvalidate()}catch(e){this.logger(`warn`,`watcher invalidate threw: ${e.message}`)}},50),e.debounceTimer.unref())};for(let n of e.targets.files)try{let i=r.watch(n,{persistent:!1},t);i.on(`error`,e=>{this.logger(`warn`,`watcher error ${n}: ${e.message}`)}),e.watchers.push(i)}catch(e){this.logger(`warn`,`watch failed ${n}: ${e.message}`)}for(let n of e.targets.dirs)try{let i=n.filenames?new Set(n.filenames):null,a=r.watch(n.path,{persistent:!1},(e,n)=>{i&&(!n||!i.has(n))||t()});a.on(`error`,e=>{this.logger(`warn`,`watcher error ${n.path}: ${e.message}`)}),e.watchers.push(a)}catch(e){this.logger(`warn`,`watch failed ${n.path}: ${e.message}`)}}closeSlot(e){e.debounceTimer&&=(clearTimeout(e.debounceTimer),null);for(let t of e.watchers)try{t.close()}catch{}e.watchers=[],this.counters&&this.counters.watchersClosed++}evictIfNeeded(){for(;this.slots.size>this.maxWatchers;){let e=this.slots.keys().next().value;if(e===void 0)break;let t=this.slots.get(e);this.closeSlot(t),this.slots.delete(e),this.counters&&this.counters.watchersEvicted++;try{t.onInvalidate()}catch{}this.logger(`info`,`watcher LRU evict ${e}`)}}size(){return this.slots.size}closeAll(){this.closed=!0;for(let e of this.slots.values())this.closeSlot(e);this.slots.clear()}},Hy=class{running=new Set;again=new Set;run(e,t){return this.again.add(e),this.running.has(e)?{kind:`queued`}:(this.running.add(e),{kind:`started`,done:this.loop(e,t)})}async loop(e,t){try{do this.again.delete(e),await t();while(this.again.has(e))}finally{this.running.delete(e),this.again.delete(e)}}clear(){this.running.clear(),this.again.clear()}get size(){return this.running.size}};const Uy=(e,t)=>O(t),Wy={showSha:!0,showStashCount:!0};function Gy(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function Ky(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function qy(e,t){return e.head!==t.head||e.index!==t.index}function Jy(e){let t=[],n=c.join(e,`refs/heads`);try{r.statSync(n).isDirectory()&&t.push({path:n})}catch{}return{files:[c.join(e,`HEAD`),c.join(e,`index`)],dirs:t}}var Yy=class extends zy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Hy;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new zy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??Uy,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Vy({logger:this.logger}),this.ownsWatchers=!0);let t=e.sanityIntervalMs??3e5;t>0&&(this.sanityTimer=setInterval(()=>this.runSanityCheck(),t),this.sanityTimer.unref())}getWatcherRegistry(){return this.watchers}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,invalidations:this.invalidations,watchers:this.watchers.size()}}resolveEffectiveGitDir(e,t){let n=`${e}|${t??``}`,r=Date.now(),i=this.resolutions.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.resolutions.delete(n),this.resolutions.set(n,i),i.dir;let a=this.inner.resolveEffectiveGitDir(e,t);return this.resolutions.set(n,{dir:a,computedAt:r}),a.catch(()=>{this.resolutions.get(n)?.dir===a&&this.resolutions.delete(n)}),this.evictResolutionsIfNeeded(),a}evictResolutionsIfNeeded(){for(;this.resolutions.size>this.maxEntries;){let e=this.resolutions.keys().next().value;if(e===void 0)break;this.resolutions.delete(e)}}async getGitInfo(e,t={},n){let r=await this.resolveEffectiveGitDir(e,n);return r.kind===`ok`?this.getGitInfoForRoot(r.value,t):r}getGitInfoForRoot(e,t){let n=`${e}|${Gy(t)}`,r=Date.now(),i=this.entries.get(n);if(i&&r-i.computedAt<this.ttlMs)return this.entries.delete(n),this.entries.set(n,i),this.hits++,Promise.resolve(J(i.info));let a=this.fetchInFlight.get(n);if(a)return a;let o=this.doFetch(e,n,t,r).finally(()=>{this.fetchInFlight.delete(n)});return this.fetchInFlight.set(n,o),o}async doFetch(e,t,n,r){this.misses++;let i=this.inner.resolveGitDir(e),a=Ky(i),o=await this.inner.getGitInfo(e,n);if(o.kind!==`ok`)return o;let s=o.value;n.showPullRequest&&(s.pullRequest=await this.getPullRequestCached(e,s.branch)),this.dropEntry(t);let c=this.watchers.acquire(`git:${e}`,Jy(i),()=>this.invalidateRepo(e));return this.entries.set(t,{info:s,computedAt:r,mtime:a,watcher:c,repoRoot:e}),this.evictIfNeeded(),o}async getPullRequestCached(e,t){let n=await this.inner.getRepoRemoteUrl(e);if(n.kind===`failed`)return n;if(n.kind===`absent`)return Y;let r=n.value,i=`${e}|${t}|${r}`,a=Date.now(),o=this.prCache.get(i);if(o){let e=o.pr.kind===`failed`?45e3:3e5;if(a-o.computedAt<e)return this.prCache.delete(i),this.prCache.set(i,o),o.pr}let s=this.prFetchInFlight.get(i);if(s)return s;let c=this.inner.resolvePullRequest(e,r).then(e=>(this.prCache.set(i,{pr:e,computedAt:Date.now()}),this.evictPrIfNeeded(),e)).finally(()=>{this.prFetchInFlight.delete(i)});return this.prFetchInFlight.set(i,c),c}evictPrIfNeeded(){for(;this.prCache.size>this.maxEntries;){let e=this.prCache.keys().next().value;if(e===void 0)break;this.prCache.delete(e)}}deliverable(e,t){return e.kind===`failed`?(this.logger(`warn`,`git fetch failed (${t}): ${e.reason}`),null):e.kind===`ok`?e.value:null}subscribe(e,t){let n=!1,r=null;return{firstDelivery:(async()=>{let i=await this.resolveEffectiveGitDir(e);if(n)return;if(i.kind!==`ok`){i.kind===`failed`&&this.logger(`warn`,`git resolve failed (subscribe ${e}): ${i.reason}`),this.safeInvoke(t,null);return}let a=i.value,o=this.subscribersByRepo.get(a);if(!o){let t=this.inner.resolveGitDir(a),n=this.watchers.acquire(`git:${a}`,Jy(t),()=>this.invalidateRepo(a));o={workingDir:e,repoRoot:a,callbacks:new Set,watcher:n},this.subscribersByRepo.set(a,o)}o.callbacks.add(t),r={repoRoot:a,entry:o};let s=await this.getGitInfoForRoot(a,{...Wy});n||this.safeInvoke(t,this.deliverable(s,a))})(),unsubscribe:()=>{if(n=!0,!r)return;let{repoRoot:e,entry:i}=r;i.callbacks.delete(t),i.callbacks.size===0&&(i.watcher.release(),this.subscribersByRepo.delete(e))}}}invalidateRepo(e){let t=0;for(let[n,r]of this.entries)r.repoRoot===e&&(r.watcher.release(),this.entries.delete(n),t++);t>0&&(this.invalidations+=t,this.logger(`info`,`gitCache invalidate ${e} dropped=${t}`)),this.refreshSubscribers(e)}refreshSubscribers(e){let t=this.subscribersByRepo.get(e);!t||t.callbacks.size===0||this.refreshes.run(e,()=>this.refreshOnce(e))}async refreshOnce(e){let t=this.subscribersByRepo.get(e);if(!t||t.callbacks.size===0)return;let n=await this.getGitInfoForRoot(e,{...Wy}),r=this.deliverable(n,e),i=this.subscribersByRepo.get(e);if(!(!i||i.callbacks.size===0))for(let e of[...i.callbacks])i.callbacks.has(e)&&this.safeInvoke(e,r)}safeInvoke(e,t){try{e(t)}catch(e){this.logger(`warn`,`git subscriber threw: ${e.message??String(e)}`)}}dropEntry(e){let t=this.entries.get(e);t&&(t.watcher.release(),this.entries.delete(e))}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.dropEntry(e),this.logger(`info`,`gitCache evict ${e}`)}}runSanityCheck(){let e=new Map;for(let t of this.entries.values()){let n=e.get(t.repoRoot);n||(n=Ky(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),qy(t.mtime,n)&&this.invalidateRepo(t.repoRoot)}}runSanityCheckNow(){this.runSanityCheck()}close(){this.sanityTimer&&=(clearInterval(this.sanityTimer),null);for(let e of this.entries.values())e.watcher.release();this.entries.clear();for(let e of this.subscribersByRepo.values())e.callbacks.clear(),e.watcher.release();this.subscribersByRepo.clear(),this.refreshes.clear(),this.fetchInFlight.clear(),this.prCache.clear(),this.prFetchInFlight.clear(),this.resolutions.clear(),this.ownsWatchers&&this.watchers.closeAll()}};const Xy=/\r\n|\r|\n/g,Zy=e=>J(e.replace(Xy,` `).trim());function Qy(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(Xy,` `))}}const $y=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function eb(e,t){return t.kind!==`ttl`||t.durationMs>=500?t:(O(`declareShell "${e}": ttl ${t.durationMs}ms below floor 500ms; clamping`),{kind:`ttl`,durationMs:500})}function tb(e){let t=/^(\d+(?:\.\d+)?)(ms|s|m|h)$/.exec(e);if(!t)throw RangeError(`Invalid duration: "${e}"`);let n=parseFloat(t[1]);switch(t[2]){case`ms`:return n;case`s`:return n*1e3;case`m`:return n*6e4;case`h`:return n*36e5;default:throw RangeError(`Unexpected duration unit: "${t[2]}"`)}}const nb=`session.id`;function rb(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await De({bin:`/bin/sh`,args:[`-c`,e],cwd:t,category:`user-shell`,signal:n});if(!r.ok&&r.reason===`aborted`)throw n.reason;return r.ok?J(r.stdout):X(`shell "${e}" ${r.exitCode===null?[r.reason,r.error].filter(e=>e!==void 0).join(`: `):`exited with code ${r.exitCode}`} in ${t}`)}}}function ib(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await x(e,{encoding:`utf8`,signal:n});return J(t===`first-line`?r.split(/\r?\n/)[0]??``:r)}catch{if(n.aborted)throw n.reason;return X(`file unreadable: ${e}`)}}}}function ab(e,t,n){if(e.kind!==`ok`)return e;let r=t(e.value);return r.kind===`failed`?X(`${r.reason} in ${n}`):r}const ob=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],sb=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],cb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],lb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function ub(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>ob[e.getMonth()]],[`Monday`,e=>cb[e.getDay()]],[`Jan`,e=>sb[e.getMonth()]],[`Mon`,e=>lb[e.getDay()]],[`15`,e=>String(e.getHours()).padStart(2,`0`)],[`06`,e=>String(e.getFullYear()%100).padStart(2,`0`)],[`01`,e=>String(e.getMonth()+1).padStart(2,`0`)],[`02`,e=>String(e.getDate()).padStart(2,`0`)],[`04`,e=>String(e.getMinutes()).padStart(2,`0`)],[`05`,e=>String(e.getSeconds()).padStart(2,`0`)],[`PM`,e=>e.getHours()<12?`AM`:`PM`],[`pm`,e=>e.getHours()<12?`am`:`pm`],[`1`,e=>String(e.getMonth()+1)],[`2`,e=>String(e.getDate())],[`3`,e=>String(e.getHours()%12||12)],[`4`,e=>String(e.getMinutes())],[`5`,e=>String(e.getSeconds())]],r=``,i=0;for(;i<e.length;){let a=!1;for(let[o,s]of n)if(e.startsWith(o,i)){r+=s(t),i+=o.length,a=!0;break}a||(r+=e[i],i++)}return r}const db={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function fb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=db[t];try{return gb(r,e)}catch{return _b(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return gy(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return gy(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return gy(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return gy(e.stashCount,0)}}var pb=class{watchers=new Map;subscribe(e,t){let n=this.watchers.get(e);if(!n){let t=new Set,r;try{r=s(e,()=>{for(let e of t)e()})}catch{return()=>{}}n={watcher:r,callbacks:t},this.watchers.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.watchers.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(n.watcher.close(),this.watchers.delete(e)))}dispose(){for(let{watcher:e}of this.watchers.values())e.close();this.watchers.clear()}size(){return this.watchers.size}},mb=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:te(()=>{for(let e of t)e()},e),callbacks:t},this.buckets.set(e,n)}return n.callbacks.add(t),()=>this.unsubscribe(e,t)}unsubscribe(e,t){let n=this.buckets.get(e);n&&(n.callbacks.delete(t),n.callbacks.size===0&&(ee(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())ee(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function hb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function gb(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`boolean`)throw TypeError(`Expected string|number|boolean from payload, got ${typeof e}`);return t===`string`?bv(e):t===`number`?xv(e):Sv(e)}function _b(e){return e===`number`?0:e===`boolean`?!1:``}var vb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new pb;ttlMgr=new mb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Hy;abort=new AbortController;drawn=_v.observable.box(F.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=dy(void 0,void 0,this.drawnAt);gitProvider;ownsGitProvider;sessionState;constructor(e,t=``,n,r){this.store=e,this.defaultEmptyValue=t,n?(this.gitProvider=n,this.ownsGitProvider=!1):(this.gitProvider=new Yy({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,yv(t),t)}declareInput(e,t,n,r){let i=r===void 0?this.defaultFor(n):r;this.store.defineBox(e,n,i),this.inputMetas.set(e,{path:t,varDefault:r})}declareEnv(e,t,n){let r=process.env[t];if(r!==void 0){this.store.defineBox(e,`string`,r);return}let i=n===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:n;this.store.defineBox(e,`string`,i),this.recordError(e,`env var "${t}" is not set`)}declareShell(e,t,n){this.declareSource(e,rb(t,n.cwd,this.abort.signal),eb(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,ib(t,n.readMode??`whole`,this.abort.signal),n.cache,n.parse)}declareSource(e,t,n,r){let i=this.publisherFor(e,r,t.where),a=()=>this.runSource(e,t,i);a(),this.registerCachePolicy(e,n,a)}publisherFor(e,t,n){switch(t.kind){case`text`:return this.scalarPublisher(e,Zy,t.default,n);case`regex`:return this.scalarPublisher(e,Qy(t.regex),t.default,n);case`json`:return this.documentPublisher(e,t.default,n)}}scalarPublisher(e,t,n,r){let i=this.stringInitial(n);return this.store.defineBox(e,`string`,i),n=>{let a=ab(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,gy(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=ab(i,$y,n);this.noteOutcome(e,a),this.store.setDocument(e,a.kind===`ok`||t===void 0?a:r)}}runSource(e,t,n){let r=this.reads.run(e,()=>t.read().then(n,e=>{if(e!==this.abort.signal.reason)throw e}));r.kind===`started`&&this.track(e,r.done)}track(e,t){let n=t.finally(()=>{this.inFlight.get(e)===n&&this.inFlight.delete(e)});this.inFlight.set(e,n)}async settled(e){let t=Date.now()+e;for(;this.inFlight.size>0;){let e=t-Date.now();if(e<=0)break;let n,r=await Promise.race([Promise.all(this.inFlight.values()).then(()=>`settled`),new Promise(t=>{n=setTimeout(()=>t(`deadline`),e)})]);if(clearTimeout(n),r===`deadline`)break}return[...this.inFlight.keys()]}declareTemplate(e,t,n={}){let r=this.engine.parse(t);this.store.defineComputed(e,`string`,t=>{let i=fy(this.store);try{let t=r.evaluate(i).map(e=>e.plain).join(``);return this.lastErrors.delete(e),t}catch(t){let r=t instanceof Error?t.message:String(t);if(this.recordError(e,r),n.varDefault===void 0)throw Error(`variable "${e}": ${r}`);return n.varDefault}});try{this.store.read(e)}catch{}}declareTime(e,t){let n=t.ttlMs??1e3;this.store.defineBox(e,`string`,(e=>{try{return ub(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,ub(t.format,new Date)),this.lastErrors.delete(e)}catch(n){this.applyFallback(e,`string`,t.varDefault,n instanceof Error?n.message:String(n))}});this.cleanups.push(r)}declareGit(e,t){let n=db[t.field],r=t.varDefault===void 0?_b(n):gb(t.varDefault,n);this.store.defineBox(e,n,r);let i=this.gitSubscriptions.get(t.cwd);if(!i){let e=new Map,n=this.gitProvider.subscribe(t.cwd,t=>{this.store.runInAction(()=>{for(let[n,r]of e)for(let{name:e,varDefault:i}of r)this.store.setBox(e,fb(t,n,i,this.defaultEmptyValue))})});i={fieldSubs:e,firstDelivery:n.firstDelivery,unsubscribe:n.unsubscribe},this.gitSubscriptions.set(t.cwd,i)}let a=i.fieldSubs.get(t.field);a||(a=[],i.fieldSubs.set(t.field,a)),a.push({name:e,varDefault:t.varDefault}),this.track(e,i.firstDelivery)}declareState(e,t){if(!this.sessionState)throw Error(`declareState("${e}"): SourceRegistry was constructed without a SessionState — state-kind variables require a SessionState (the daemon provides one; tests must supply one)`);let n=this.sessionState,r=t.varDefault??this.stringInitial(void 0);this.store.defineComputed(e,`string`,e=>{let i=e(nb);if(typeof i!=`string`||!i)return r;let a=n.get(i,t.key);return a===null?r:a})}applyInput(e){this.store.runInAction(()=>{for(let[t,n]of this.inputMetas){let r=hb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,gb(r,i)),this.lastErrors.delete(t)}catch(e){this.applyFallback(t,i,n.varDefault,e instanceof Error?e.message:String(e))}else this.applyFallback(t,i,n.varDefault,`input path "${n.path}" not found in payload`)}})}drawAt(e){this.store.runInAction(()=>this.drawn.set(e))}getLastError(e){return this.lastErrors.get(e)}dispose(){this.abort.abort();for(let e of this.cleanups)e();this.cleanups.length=0;for(let e of this.gitSubscriptions.values())e.unsubscribe();this.gitSubscriptions.clear(),this.reads.clear(),this.watchMgr.dispose(),this.ttlMgr.dispose(),this.ownsGitProvider&&this.gitProvider.close()}registerCachePolicy(e,t,n){switch(t.kind){case`never`:break;case`ttl`:{let e=this.ttlMgr.subscribe(t.durationMs,n);this.cleanups.push(e);break}case`watch_file`:{let e=this.watchMgr.subscribe(t.path,n);this.cleanups.push(e);break}case`key`:{let e=this.engine.parse(t.template),r=(0,_v.reaction)(()=>{let t=fy(this.store);try{return e.evaluate(t).map(e=>e.plain).join(``)}catch{return``}},n);this.cleanups.push(r);break}case`depends_on`:{let e=(0,_v.reaction)(()=>t.varNames.map(e=>this.store.changeKey(e)).join(`,`),n);this.cleanups.push(e);break}}}applyFallback(e,t,n,r){if(this.recordError(e,r),n!==void 0){this.store.setBox(e,n);return}try{this.store.setBox(e,gb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,_b(t))}}defaultFor(e){try{return gb(this.defaultEmptyValue,e)}catch{return _b(e)}}stringInitial(e){return e===void 0?typeof this.defaultEmptyValue==`string`?this.defaultEmptyValue:``:e}recordError(e,t){this.lastErrors.set(e,{timestamp:Date.now(),message:t})}noteOutcome(e,t){t.kind===`ok`?this.lastErrors.delete(e):this.recordError(e,t.kind===`failed`?t.reason:`no value`)}};const yb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[nb]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"preset.effective":{kind:`input`,path:`preset.effective`,default:``},"preset.customized":{kind:`input`,path:`preset.customized`,type:`boolean`,default:!1},"preset.bundled":{kind:`input`,path:`preset.bundled`,type:`boolean`,default:!0},"endcaps.effective":{kind:`input`,path:`endcaps.effective`,default:``},"variation.effective":{kind:`input`,path:`variation.effective`,default:``},"charset.effective":{kind:`input`,path:`charset.effective`,default:``},"colorCompatibility.effective":{kind:`input`,path:`colorCompatibility.effective`,default:``},"autoWrap.effective":{kind:`input`,path:`autoWrap.effective`,type:`boolean`,default:!0},"padding.effective":{kind:`input`,path:`padding.effective`,type:`number`,default:1},"updateNotice.effective":{kind:`input`,path:`updateNotice.effective`,type:`boolean`,default:!0},"term.cols":{kind:`input`,path:`term.cols`,type:`number`,default:80},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},bb={theme:{configKey:`palette`,sessionKey:`theme`,effectiveVar:`theme.effective`,label:`🎨`},preset:{configKey:`preset`,sessionKey:`preset`,effectiveVar:`preset.effective`,label:`▦`},style:{configKey:`style`,sessionKey:`style`,effectiveVar:`style.effective`,label:`◐`},endcaps:{configKey:`endcaps`,sessionKey:`endcaps`,effectiveVar:`endcaps.effective`,label:`✦`},variation:{configKey:`variation`,sessionKey:`variation`,effectiveVar:`variation.effective`,label:`🎼`},charset:{configKey:`charset`,sessionKey:`charset`,effectiveVar:`charset.effective`,label:`🔣`},colorCompatibility:{configKey:`colorCompatibility`,sessionKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`,label:`🌈`},autoWrap:{configKey:`autoWrap`,sessionKey:`autoWrap`,effectiveVar:`autoWrap.effective`,label:`wrap`},padding:{configKey:`padding`,sessionKey:`padding`,effectiveVar:`padding.effective`,label:`padding`},updateNotice:{configKey:`updateNotice`,sessionKey:`updateNotice`,effectiveVar:`updateNotice.effective`,label:`update notice`}},xb=Object.values(bb),Sb=new Map(xb.map(e=>[e.configKey,e.effectiveVar])),Cb=new Map(xb.map(e=>[e.sessionKey,e.effectiveVar])),wb=new Map(Object.keys(bb).map(e=>[bb[e].sessionKey,e]));function Tb(e,t,n){let r=new Set,i=e=>{for(let t of sv(e??``,n).keys())r.add(t)};for(let t of Object.values(e.segments))i(t.template),i(t.bg),i(t.fg),i(t.when);for(let e of t)for(let t of js(e))i(t.when);for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(nb);for(let t of Object.values(e.actions)){r.add(nb),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Cb.get(t.set):void 0,n=`persist`in t?Sb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Eb(e,t,n){let r=pv({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of Tb(e,t,n.helpers)){if(fv(a,r))continue;let e=yb[a];if(e===void 0)throw Error(`synthesized chrome reads ".${a}", which it does not declare and PAYLOAD_INPUTS does not supply`);i[a]=e}return i}const Db=new Map,Ob=new Map;function kb(e){let t=jb(e);if(t===null)throw Error(`Palette "${e}" did not resolve in the theme registry — allowed names and the registry are inconsistent`);return t}function Ab(e,t){return e===`bar`?t:kb(e)}function jb(e){let t=Db.get(e);if(t!==void 0)return t;let n=xr(e);return n===null?null:(Db.set(e,n),n)}function Mb(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Ob.get(n);if(r!==void 0)return r;let i=kr(e,t);return Ob.set(n,i),i}function Nb(e){let t=jb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Pb(e,t,n){let r=Nb(e);return r===null?(n(`${t} rendered "${Wa}": "${e}" names no installed theme${Ua(e)}`),Ib()):r}function Fb(e,t,n){return $a(e,t,n,Ib(),Nb)}function Ib(){return Nb(Wa)}function Lb(e){return eo(Fb(void 0,null,e),Ib).value}const Rb=new Map;function zb(e,t,n){Rb.set(e,{permanent:!0,resolve:t,paletteOf:n})}zb(`themes`,()=>Ka(),e=>kb(e));const Bb=`placementThemes`;zb(Bb,qa,(e,t)=>Ab(e,t.palette)),zb(`endcaps`,()=>ao),zb(`variations`,()=>vo),zb(`charsets`,()=>co),zb(`colorCompatibilities`,()=>po);function Vb(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Mb(n.basePalette,e.styles[t])}],[`presets`,{members:x_(e.presets)}]])}function Hb(e){return[...new Set([...Rb.keys(),...e.keys()])]}function Ub(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Rb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${Hb(t).join(`, `)})`)}function Wb(e){return{label:e.label,domain:Gb(e.domain)}}function Gb(e){return e===`theme`?{from:Bb}:e===`bool`||`min`in e?e:{from:e}}function Kb(e,t,n,r){let i=qc(e.label),{domain:a}=e;if(a===`bool`)return{kind:`inline`,template:`{{ action "${r}" "☑ ${i}" "☐ ${i}" }}`,actions:{[r]:{set:t,cycle:[...Co]}}};if(`from`in a)return{kind:`ring`,template:`{{ carousel "${r}" }}`,actions:{[r]:{set:t,from:a.from}}};let o=e=>({set:t,min:a.min,max:a.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "◀" }} {{ "${i}" }} {{ .${n} }} {{ action "${r}.up" "▶" }}`,actions:{[`${r}.down`]:o(-a.step),[`${r}.up`]:o(a.step)}}}const qb=/^segments\.([^.]+)\.palette$/,Jb=/^presets\.(.+)\.root$/,Yb=/^presets\.(.+)\.globals\.([^.]+)$/;function Xb(e){return`presets.${e}.root`}function Zb(e,t){return`presets.${e}.globals.${t}`}function Qb(e){if(El(e))return{scope:`globals`,field:e};let t=qb.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=Yb.exec(e);if(n&&yl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Jb.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function $b(e){switch(e.scope){case`globals`:return[`globals`,e.field];case`preset-globals`:return[`presets`,e.preset,`globals`,e.field];case`segment-palette`:return[`segments`,e.segment,`palette`]}}const ex=`open`;function tx(e,t,n,r){let i={variable:e,key:e,member:ex};return r.variables[e]=Qc(e,Uc),r.actions[e]=$c(e,ex),r.segments[e]={template:Zc(e,`(?)`,`✕`),...nx(n)},Jc(e,i,{kind:`container`,direction:`horizontal`,children:t.map((t,n)=>{let i=`${e}.${n}`;return r.segments[i]={template:t},{kind:`segment`,name:i}})},`drop`)}function nx(e){let[t,...n]=e;return t===void 0?{}:{when:Yc(t,...n)}}const rx={help:[`-h`,`--help`],version:[`-V`,`--version`]},ix=[`✚ inserts`,`✖ removes`,`⚙️ configures`,`↺ resets layout`],ax=`
|
|
91
91
|
cc-candybar - Beautiful powerline statusline for Claude Code
|
|
92
92
|
|
|
93
93
|
Usage: cc-candybar [options]
|
|
@@ -155,14 +155,14 @@ Config tooling:
|
|
|
155
155
|
config [--json] The effective merged config. (All three query the
|
|
156
156
|
running daemon; none spawn one.)
|
|
157
157
|
|
|
158
|
-
`,ox=`${hu}live`,sx=[`☐ live`,`☑ live`],cx=`${hu}done`,lx={variable:ox,key:ox,member:`open`},ux=`and ${Xc(W_)} (not ${Xc(lx)})`,dx=`{{ ${ux} }}`;function fx(e,t){return`{{ if ${ux} }}${e}{{ else }}${t}{{ end }}`}const px=`{{ and ${Xc(W_)} .preset.customized }}`,mx=vu,hx=`${hu}addable`;function gx(e){return new Map([[hx,{members:Object.keys(e.segments).filter(e=>!mx(e))}]])}function _x(e,t,n){return n.segments[e]={template:t,when:G_},{kind:`segment`,name:e}}function vx(e,t,n){let r=`${hu}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ action "${r}" "🚫" }}`}function yx(e){return`{{ if ${Xc(W_)} }}${e.join(``)}{{ end }}`}function bx(e,t){return e.reduce((e,t)=>`{{ if ${Xc(t)} }}true{{ else }}${e}{{ end }}`,t)}function xx(e){return e.flatMap(e=>[...js(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.mode`?[e.opens.ref]:[]))}function Sx(e,t,n){return`${H_}${e}.${t}.${n}`}function Cx(e,t,n,r){let i=Ds(n),a=`${hu}${e.presetIdent}`,o=U_(e.presetIdent,i),s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:z_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Sx(e.presetIdent,i,r),l=`${H_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Ks(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=Kb(Wb(o),s,l,u);return Object.assign(e.artifacts.actions,d.actions),e.artifacts.segments[u]={template:d.kind===`ring`?`{{ "${qc(o.label)}" }} ${d.template}`:d.template},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "⚙" }}`,ref:{variable:z_,key:z_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const wx=`${hu}label:`;function Tx(e){if(e.startsWith(wx)){let t=e.slice(wx.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Ex(e,t,n,r){let i=Ds(e),a=`${wx}${i}:${e.name}`;n.segments[a]={template:`{{ "${qc(i)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let o=e.settings?.[Vs];return{...Jc(a,r.ref,r.body,`drop`,bx([r.ref],dx)),...o!==void 0&&{settings:{theme:o}},drafts:{[Vs]:r.drafts[Vs]}}}function Dx(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${hu}${i}.insert.${t}`,s=`${hu}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:hx,anchor:n,relation:r};let c=u_(o),l=d_(s,o,void 0),u=m_(l),d=p_(l,c);return a.variables[l]=Qc(l,Uc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=$c(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${Xc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${Ca}`}) $m }}{{ end }}`}}function Ox(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!mx(e.name)),i=e=>Ox(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=As(o,i);if(mx(o.name)){n.push(s);continue}let c=Ds(o),l=a===r?[Dx(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Dx(t,u,c,`after`),f=vx(t,u,c),p=t.segments[o.name],m=Cx(t,u,o,Hs(p)),h=yx([m.term,f]),g={kind:`container`,direction:`horizontal`,children:[...l.map(e=>_x(e.host,e.template,t.artifacts)),{...Ex(o,p,t.artifacts,m),trail:h},{...s,when:fx(`false`,o.when??`true`),trail:h,drafts:m.drafts},_x(d.host,d.template,t.artifacts)]};n.push(e.direction===`vertical`?{kind:`container`,direction:`horizontal`,children:[g]}:g)}return{...e,children:n,...e.when!==void 0&&{when:bx(xx(n),fx(`true`,e.when))}}}function kx(e,t,n,r,i,a,o){let s=`${hu}${n}.resetLayout`,c=`${hu}${n}.customized`;i.actions[s]={reset:r};let l=qc(t);return i.segments[c]={template:`{{ action "${s}" "↺ ${l} customized" }}`,when:px},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},Ax(e,o)]}}function Ax(e,t){if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t]};let n=e.children.at(-1);return e.direction===`vertical`&&n!==void 0&&(n.kind===`segment`||n.when===void 0)?{...e,children:[...e.children.slice(0,-1),Ax(n,t)]}:{...e,children:[...e.children,t]}}function jx(e,t,n,r,i){let{node:a}=w_(e,t),o={presetIdent:fu(t),rootKey:Xb(t),segments:e.segments,artifacts:n,posCounter:{n:0}};return kx(Ox(a,o),t,o.presetIdent,o.rootKey,n,r,i)}function Mx(e){let t={variables:{},actions:{},segments:{}},n=tx(`${hu}help`,ix,[W_],t);t.variables[ox]=Qc(ox,Uc),t.actions[ox]=$c(ox,lx.member),t.segments[ox]={template:Zc(ox,...sx),when:G_};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ox},n]};t.segments[cx]={template:`{{ action "${B_}" "✎ done" }}`,when:G_};let i={kind:`segment`,name:cx},a={...e.presets},o=[];for(let n of x_(e.presets)){let s=jx(e,n,t,i,r);o.push(s),a[n]={...C_(e.presets,n),root:s}}let s=Eb(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Nx={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Px(e){let t=e[Nx.socket]??``,n=e[Nx.pane]??``;if(t===``||n===``)return null;let r=e[Nx.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Fx=Nx.truecolor,Ix=[{name:`tmuxTruecolor`,label:`tmux truecolor`,probe:({tmux:e,claudeSettings:t})=>{switch(e.kind){case`unreported`:return{ok:!1,reason:"the client reported no tmux facts — re-run `cc-candybar install` to stage a current client"};case`outside`:return{ok:!0};case`inside`:{if(e.termfeatures.kind===`failed`)return{ok:!1,reason:`tmux could not be asked: ${e.termfeatures.reason}`};if(!e.termfeatures.value.includes(`RGB`)||e.hint.truecolor!==null)return{ok:!0};let n=t.env[Fx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Fx} is set in ${t.path} — restart Claude Code to apply`}:{ok:!1,reason:`Claude Code renders the bar in 256 colours inside tmux`,fix:{kind:`claude-settings-env`,name:Fx,value:`1`}}}}}}];function Lx(e){return Ix.map(t=>({check:t,verdict:t.probe(e)}))}function Rx(e){return Ix.find(t=>t.name===e)}const zx=`${gu}doctor.`;function Bx(e){let t=`${zx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Vx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Bx(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:So}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?So:xo}]})}const Hx={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Ux(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,actions:Object.fromEntries(Object.entries(Hx).map(([t,n])=>[`${e}${t}`,n]))}}const Wx=`armed`,Gx=`disarmed`;function Kx(e,t,n){let r=`${e}.arm`,i=`${e}.disarm`,a=`(eq .${e} "${Wx}")`;return{template:`{{ if ${a} }}{{ action "${e}" "${t.confirm}" }} {{ action "${i}" "✕" }}{{ else }}{{ action "${r}" "${t.arm}" }}{{ end }}`,actions:{[r]:{set:e,to:Wx},[i]:{set:e,to:Gx},[e]:{do:[i,...n]}},armed:a,variables:{[e]:{kind:`state`,key:e,default:Gx}},disarm:i}}const qx=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Jx(e){return typeof e==`string`&&qx.test(e)?{kind:`line`,line:e}:{kind:`refused`,reason:`a slash command is "/" then its name, e.g. "/compact" or "/model opus", on one line with no control characters, got ${JSON.stringify(e)}`}}function Yx(e){let t=Jx(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Xx=[`/compact`,`/model`],Zx=`/clear`;function Qx(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=Kx(`${e}clear`,{arm:Zx,confirm:`${Zx} ✓ confirm`},[n]);return{template:Xx.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(Xx.map(e=>[t(e),{slash:Yx(e)}])),...r.actions,[n]:{slash:Yx(Zx)}},variables:r.variables,disarm:r.disarm}}const $x=`${gu}menu`,eS=`open`,tS=`${gu}edit`,nS=`${gu}close`,rS=`${gu}toolbar`,iS=Ux(gu),aS=`${gu}commands`,oS=Qx(`${aS}.`),sS=`${gu}tab`,cS=[{member:`session`,label:`⚡ session`},{member:`look`,label:`🎨 look`},{member:`layout`,label:`📐 layout`},{member:`config`,label:`⚙ config`},{member:`tools`,label:`🧰 tools`}],lS=e=>`${sS}.${e}`,uS=e=>`${lS(e)}.toggle`,dS=e=>({variable:sS,key:sS,member:e}),fS=`${gu}save`,pS=`${gu}unsaved`,mS=`${gu}preset.save`,hS=`${gu}preset.delete`,gS=`${gu}resetAll`,_S=`${$x}.toggle`,vS={variable:$x,key:$x,member:eS},yS=`${gu}undo`,bS=`${gu}redo`,xS=`${gu}resettable`,SS=`${gu}doctor`,CS=`${SS}.run`,wS=e=>`${SS}.fix.${e}`,TS=e=>`${SS}.${e}`,ES=`${gu}pickers`,DS=[{template:`{{ themePreview }}`}],OS={template:`{{ layoutPreview }}`},kS={preset:[OS,{when:`{{ not .preset.bundled }}`,template:`{{ action "${hS}" (printf "🗑 delete %s" .${bb.preset.effectiveVar}) }}`}],theme:DS,style:DS,variation:[OS]},AS=e=>`${gu}${e}`,jS=e=>`${gu}apply.${e}`,MS=e=>`${gu}reset.${e}`,NS=e=>`${gu}carousel.${e}`,PS=(e,t)=>`${NS(e)}.${t}`,FS=Object.keys(bb).map(e=>{let t=bb[e],n=ul(t.configKey);if(n===`text`)throw Error(`settings menu: globals.${t.configKey} is free text, which no control can change — list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);let r=Kb({label:t.label,domain:n},t.sessionKey,t.effectiveVar,jS(e));return{...t,name:e,control:r,beneath:kS[e]??[]}}),IS={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,charset:`config`,colorCompatibility:`config`,updateNotice:`config`},LS=e=>FS.filter(t=>IS[t.name]===e).map(JS);new Set(FS.flatMap(e=>[e.sessionKey,e.configKey]));const RS=Kx(gS,{arm:`⟲`,confirm:`⟲ reset all?`},FS.map(e=>MS(e.name))),zS=(e,t,n)=>({count:e,path:t,body:n,shown:`(gt .${e} 0)`}),BS=[zS(pS,`unsaved`,`{{ action "${fS}" (printf "💾 save %d" .${pS}) }}`),zS(`${gu}history.undo`,`history.undo`,`{{ action "${yS}" "↶" }}`),zS(`${gu}history.redo`,`history.redo`,`{{ action "${bS}" "↷" }}`),{count:xS,path:`resettable`,body:RS.template,shown:`(or (gt .${xS} 0) ${RS.armed})`}],VS={when:`{{ or ${BS.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+BS.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},HS=[{step:RS,place:`door`},{step:oS,place:`session`}],US=e=>e.map(e=>e.step.disarm),WS=US(HS),GS=US(HS.filter(e=>e.place!==`door`)),KS=f_(ES),qS=e=>({variable:KS,key:KS,member:u_(jS(e))});function JS(e){let t=AS(e.name);return e.control.kind===`inline`?{kind:`segment`,name:t}:Jc(t,qS(e.name),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:NS(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:PS(e.name,n)}))]},`drop`)}function YS(e){return e===$x}function XS(e){let t={kind:`segment`,name:$x};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[XS(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 ZS(e){return QS(e)>0?e:XS(e)}function QS(e){let t=0;for(let n of js(e))n.kind===`segment`&&YS(n.name)&&(t+=1);return t}function $S(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&YS(e.name)||e.opens!==void 0&&$S(e.opens.body,!0):e.children.some(e=>$S(e,n))}const eC={session:{direction:`vertical`,segments:[rS,aS]},look:{direction:`horizontal`,segments:[]},layout:{direction:`horizontal`,segments:[mS,tS]},config:{direction:`horizontal`,segments:[]},tools:{direction:`vertical`,segments:[SS,...Ix.map(e=>TS(e.name))]}},tC=e=>({kind:`container`,direction:eC[e].direction,children:[...eC[e].segments.map(e=>({kind:`segment`,name:e})),...LS(e)]});function nC(e){return e.kind===`segment`?YS(e.name)?Jc(e.name,vS,{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...LS(`door`),{kind:`segment`,name:fS}]},{kind:`container`,direction:`horizontal`,children:cS.map(({member:e})=>Jc(lS(e),dS(e),tC(e),`drop`))}]},`above`):e:rC(e)}function rC(e){return{...e,children:e.children.map(e=>nC(e))}}function iC(e){let t={variables:{[$x]:Qc($x,Uc)},actions:{[_S]:$c($x,eS),[$x]:{do:[_S,...WS]},[CS]:{doctor:`run`},[nS]:{set:vS.key,to:Uc},[tS]:{do:[B_,nS]},...iS.actions,...oS.actions,[fS]:{save:!0},[yS]:{undo:!0},[bS]:{redo:!0},[mS]:{preset:`save`},[hS]:{preset:`delete`,name:`{{ .${bb.preset.effectiveVar} }}`}},segments:{[$x]:{template:Zc($x,e,`❌`)},[rS]:{template:iS.template},[aS]:{template:oS.template},[fS]:VS,[mS]:{template:`{{ action "${mS}" "+ preset" }}`},[SS]:{template:`{{ action "${CS}" "🩺 doctor" }}`},[tS]:{template:`{{ action "${tS}" "✎ arrange" "✎ done" }}`}}};for(let e of BS)t.variables[e.count]={kind:`input`,path:e.path,type:`number`,default:0};t.variables[sS]=Qc(sS,`session`);for(let{member:e,label:n}of cS)t.actions[uS(e)]=$c(sS,e),t.actions[lS(e)]={do:[uS(e),...GS]},t.segments[lS(e)]={template:Zc(lS(e),n,`▾ ${n}`)};return Object.assign(t.variables,oS.variables,RS.variables),oC(t),aC(t),t}function aC(e){for(let t of Ix){let n=Bx(t.name),r=wS(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[TS(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${xo}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function oC(e){for(let t of FS){Object.assign(e.actions,t.control.actions);let n=MS(t.name);e.actions[n]={reset:t.configKey};let r=`{{ action "${n}" "↺" }}`;if(t.control.kind===`inline`){e.segments[AS(t.name)]={template:`${t.control.template} ${r}`};continue}let i=qS(t.name),a=p_(i.key,i.member);e.variables[i.key]=Qc(i.key,Uc),e.actions[a]=$c(i.key,i.member),e.segments[AS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} ${Zc(a,`▸`,`▾`)} `+r},e.segments[NS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[PS(t.name,r)]=n})}Object.assign(e.actions,RS.actions)}function sC(e){e.variables[z_]=Qc(z_,Uc),e.actions[B_]=$c(z_,V_)}function cC(e){let t=iC(e.globals.menuGlyph??`🍫`);sC(t);let n={...e.presets},r=[];for(let t of x_(e.presets)){let{node:i}=w_(e,t),a=nC(ZS(i));r.push(a),n[t]={...C_(e.presets,t),root:a}}let i=Eb(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const lC=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function uC(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function dC(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function fC(e,t){if(t===void 0)return{};if(!nc(t))return Z(e,`actions`,`actions must be an object, got ${rc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=pC(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Z(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function pC(e,t,n){if(!nc(n))return Z(e,t,`${t} must be an action object, got ${rc(n)}`),null;if(`persistWhen`in n)return Z(e,t,`${t}.persistWhen was removed: declare the \`set\` alone — a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=lC.filter(e=>e in n);return r.length===1?mC[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${lC.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const mC={set:(e,t,n)=>KC(e,t,n,`set`,HC),persist:(e,t,n)=>KC(e,t,n,`persist`,UC),copy:hC(`copy`),open:hC(`open`),reset:gC,undo:vC(`undo`),redo:vC(`redo`),save:vC(`save`),preset:yC,doctor:bC,ceiling:xC,slash:SC,do:CC};function hC(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Zs(t,n,r,e);return i===null?null:{[e]:i}}}function gC(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=wC(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 _C={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,save:`it saves the session's unsaved settings`};function vC(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Z(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${_C[e]}), got ${K(r[e])}`),null)}}function yC(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Z(e,`${t}.preset`,`preset must be "save" or "delete", got ${K(r)}`),null;if(r===`save`)return{preset:`save`};let a=Zs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function bC(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Z(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${K(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||Rx(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Ix.map(e=>e.name).join(`, `)}), got ${K(a)}`),null):{doctor:`fix`,check:a}}function xC(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Z(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${K(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Z(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${K(a)}`),null):{ceiling:`set`,to:a}}function SC(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=Jx(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function CC(e,t,n){for(let r of Object.keys(n))r!==`do`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Z(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${K(r)}`),null):{do:r}}function wC(e,t,n,r,i,a){let o=Zs(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const TC={set:`the SessionState key to write`,persist:`the config globals field to write`};function EC(e,t,n,r){let i=TC[r],a=wC(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 DC(e){return e===`set`?`set-state`:`set-config`}const OC={to:qC(`set`)},kC={to:qC(`persist`)},AC={from:JC(`set`)},jC={from:JC(`persist`)},MC={min:$C(),max:$C(),by:$C()},NC={int:XC()},PC={cycle:YC(`set`)},FC={cycle:YC(`persist`)},IC={removeSegment:ZC(`removeSegment`)},LC={insertSegment:ZC(`insertSegment`),anchor:ZC(`anchor`),relation:QC()},RC={insertSegmentFrom:JC(`persist`),anchor:ZC(`anchor`),relation:QC()},zC={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},BC={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function VC(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>ac(e,t,n,r),c=Cc(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?pc(s,...n):s}}const HC=[VC(`set`,OC),VC(`set`,AC),VC(`set`,MC,[zC,BC]),VC(`set`,NC),VC(`set`,PC)],UC=[VC(`persist`,kC),VC(`persist`,jC),VC(`persist`,MC,[zC,BC]),VC(`persist`,FC),VC(`persist`,IC),VC(`persist`,LC,[],[`insertSegment`]),VC(`persist`,RC,[],[`insertSegmentFrom`])];function WC(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 GC(e){let t=WC(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 KC(e,t,n,r,i){let a=EC(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${GC(r)}${o.length>1?` — found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Z(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function qC(e){let t=DC(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>wC(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 JC(e){let t=DC(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Z(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Z(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Z(n,s,`${i} array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Z(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Z(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Z(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${K(o)}`)}}}function YC(e){let t=DC(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${rc(o)}`);return}let c=o;if(c.length<2){Z(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Z(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Z(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function XC(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Z(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${K(r[n])}`);return}return!0}}}function ZC(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Zs(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(t,o,`${e} "${a}" contains "/" or ":" — segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function QC(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Z(e,`${t}.${n}`,`relation must be "before" or "after", got ${K(i)}`);return}return i}}}function $C(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Z(e,`${t}.${n}`,`${n} must be an integer, got ${K(i)}`);return}return i}}}function ew(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const tw={noun:`style key`,fields:{hueShift:_c(),chromaScale:_c({min:0}),lightnessScale:_c(),lightnessShift:_c()}};function nw(e,t){if(!nc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${rc(t)}`,line:G(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:G(e.source,[`styles`,r])});continue}if(oo(r)){e.issues.push({path:`styles.${r}`,message:ew(`styles.${r}`,r,`globals.endcaps`),line:G(e.source,[`styles`,r])});continue}let t=ic(e,tw,`styles.${r}`,i);t!==null&&(n[r]={...In,...t})}return n}const rw={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:od(e,`${t}.${n}`,r[n])},globals:{required:!1,json:Cl(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Sl(e,`${t}.${n}`,r[n])}}};function iw(e,t){if(!nc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${rc(t)}`,line:G(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free — a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:G(e.source,[`presets`,r])});continue}let t=ic(e,rw,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function aw(e,t){if(t===void 0)return{};if(!nc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${rc(t)}`,line:G(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${K(i)}`,line:G(e.source,[`helpers`,r])});continue}n[r]=i}return n}const ow=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 sw(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 cw(e){let t=ow.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${sw(t)}`}function lw(e){let t=ow.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${sw(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function uw(e,t){let n=new Map;for(let e of Object.keys(t)){let t=fu(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 dw(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||Qa(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:oo(i)?ew(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:G(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:G(e.source,[`globals`,`preset`])}),uw(e,t.presets);let i=Vb(t);for(let[n,r]of Object.entries(t.actions))!(`set`in r)||!(`from`in r)||typeof r.from!=`string`||Hb(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${Hb(i).join(`, `)})`,line:G(e.source,[`actions`,n,`from`])});for(let[n,r]of Object.entries(t.actions))`do`in r&&r.do.forEach((i,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,i)?t.actions[i]:void 0,s=o===void 0?`references unknown action "${i}"`:`do`in o?`"${i}" is itself a do action — list its members here instead`:r.do.indexOf(i)===a?a>0&&dC(o)?`"${i}" takes its value from the template (from/int/insertSegmentFrom), so it can only be the first member — only the first is bound the region's display`:void 0:`"${i}" is listed twice — each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:G(e.source,[`actions`,n,`do`])})});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=Qb(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Dl().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:G(e.source,[`actions`,n,a])});continue}let s=fw.filter(e=>e in r);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a "presets.<name>.root" target — ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){pw(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!x_(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names preset "${o.preset}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${Su(o.segment)}`,line:G(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:G(e.source,[`actions`,n,a])})}}let a=pv(t);for(let t of a.names)t!==`settings`&&!t.startsWith(mw)||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 o=(t,n,r)=>{QS(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" ${QS(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}),$S(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" under a \`when\` or inside a disclosure body — the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),s(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell — everything inside a cell wears that cell's hue and tone, so it would place nothing. Set it on the row whose children are the cells (the horizontal container) or on the root, which places the rows.`,line:r});let i=new Map;for(let e of js(t)){if(e.kind!==`segment`)continue;let t=Ds(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=ks(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" — an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function s(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>s(n,t||Es[e.direction]===`cell`))}let c=(n,r)=>{for(let[i,o]of Ic(n,r)){let n=G(e.source,o.split(`.`));if(i.when!==void 0&&(Ew(e,`${o}.when`,i.when,a,{line:n}),Tw(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(YS(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${$x}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${$x}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:o,message:`${r} entry "${i.name}" does not match any declared segment${Su(i.name)}`,line:n}),Sw(e,t,i,o,n)}}};n.root!==void 0&&c(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&c(t.root,`presets.${e}.root`);let l=new Map([[`root`,Pc(t.root)]]);for(let e of x_(t.presets)){let{node:n,path:r}=w_(t,e);l.set(r,n)}for(let[t,n]of l)o(n,t,G(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){Cw(e,`variables.${n}`,r,a);let t=cw(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:G(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))Cw(e,`segments.${n}.vars.${t}`,i,a,n);let i=Hs(r);gw(e,n,i);let o=hw(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){Ew(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of dv(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=i===`options`?` (in a picker, menu or carousel)`:``;if(o!==null){Dw(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"${s}`,line:G(e.source,[`segments`,n,a])})}}}}for(let[n,r]of Object.entries(t.variables))ww(e,`variables.${n}`,r,a);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,i]of Object.entries(r.vars))ww(e,`segments.${n}.vars.${t}`,i,a,n)}const fw=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function pw(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=G(e.source,[`actions`,n,r]);if(!x_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:c});return}if(r===`reset`)return;let l=`removeSegment`in o,u=`insertSegment`in o,d=`insertSegmentFrom`in o;if(!l&&!u&&!d){e.issues.push({path:s,message:`actions.${n}: "${i}" is a "presets.<name>.root" target and can only be paired with "removeSegment", "insertSegment", or "insertSegmentFrom" (not "to"/"from"/"cycle"/bounded — those have no meaning as a tree op)`,line:c});return}let f=(r,i)=>{Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" is not a declared segment (have: ${Object.keys(t.segments).join(`, `)})${Su(i)}`,line:c})},p=new Set(Os(w_(t,a).node)),m=(r,i)=>{!xu.has(i)||p.has(i)||Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" names no placement${Su(i)}`,line:c})};`removeSegment`in o&&m(`removeSegment`,o.removeSegment),`insertSegment`in o&&f(`insertSegment`,o.insertSegment),(`insertSegment`in o||`insertSegmentFrom`in o)&&m(`anchor`,o.anchor)}const mw=`settings.`;function hw(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>mw+e)])}}function gw(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=yw(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Ws(n,vw(n)))i(e,`the defaults do not stand together: ${t}`)}function _w(e){return yw(e).length>0||Ws(e,vw(e)).length>0}function vw(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function yw(e){let t=t=>Us(bw(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Us(bw(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${xw(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 bw(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function xw(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Us(n)!==void 0).map(([e])=>e)}function Sw(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=Hs(a),s=`${r}: placement "${Ds(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(`, `)})`:Gs(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Ua(a):``}, but it must be ${Js(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])=>Gs(o[e],t))||_w(o)))for(let{message:t}of Ws(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function Cw(e,t,n,r,i){n.kind===`template`&&Ew(e,`${t}.template`,n.template,r,{segCtx:i}),Rs(n)&&n.cache&&`key`in n.cache&&Ew(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function ww(e,t,n,r,i){if(Rs(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 Tw(e,t,n,r){try{R_.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function Ew(e,t,n,r,i){for(let[a,o]of sv(n,r.helpers)){if(fv(a,r))continue;if(a.startsWith(mw)){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){Dw(e,o,`Template references unknown variable ".${a}"${lw(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&fv(n,r)?` (segment-local vars are namespaced — write ".${n}")`:lw(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??G(e.source,t.split(`.`))})}}function Dw(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 Ow(e,t){let{graph:n,nodeInfo:r}=kw(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` → `)}`,line:G(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function kw(e){let t=new Set(Object.keys(e.variables)),n=new Map;for(let t of Object.keys(e.variables))n.set(t,{declarationPath:`variables.${t}`,linePathParts:[`variables`,t]});for(let[r,i]of Object.entries(e.segments))if(i.vars)for(let e of Object.keys(i.vars)){let i=`${r}.${e}`;t.add(i),n.set(i,{declarationPath:`segments.${r}.vars.${e}`,linePathParts:[`segments`,r,`vars`,e]})}let r=new Map;for(let e of t)r.set(e,new Set);let i=(n,i)=>{for(let a of sv(i,e.helpers).keys()){if(t.has(a)){r.get(n).add(a);continue}let e=a.split(`.`)[0];e!==a&&t.has(e)&&r.get(n).add(e)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),Rs(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 Aw=[`json5`,`json`];function jw(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Mw(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?p.homedir()+e.slice(1):e}function Nw(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Aw.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...Aw.map(e=>c.join(r,`.cc-candybar.${e}`)),...Aw.map(e=>`${Pw()}.${e}`)])]}function Pw(){let e=process.env.XDG_CONFIG_HOME??c.join(p.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function Fw(e,t,n){let r=[];for(let i of Nw(e,t,n)){let e=jw(i);if(e===`present`)return{kind:`file`,path:i,unchecked:r};e!==`absent`&&r.push(e)}if(n===void 0)return{kind:`default`,unchecked:r};let[i]=r;return i===void 0?{kind:`missing`,path:n}:{kind:`unreadable`,...i}}function Iw(e,t,n){let r=Fw(e,t,n);return r.kind===`default`?`${Pw()}.${Aw[0]}`:r.path}function Lw(e){return Rw(e).join(`
|
|
158
|
+
`,ox=`${hu}live`,sx=[`☐ live`,`☑ live`],cx=`${hu}done`,lx={variable:ox,key:ox,member:`open`},ux=`and ${Xc(W_)} (not ${Xc(lx)})`,dx=`{{ ${ux} }}`;function fx(e,t){return`{{ if ${ux} }}${e}{{ else }}${t}{{ end }}`}const px=`{{ and ${Xc(W_)} .preset.customized }}`,mx=vu,hx=`${hu}addable`;function gx(e){return new Map([[hx,{members:Object.keys(e.segments).filter(e=>!mx(e))}]])}function _x(e,t,n){return n.segments[e]={template:t,when:G_},{kind:`segment`,name:e}}function vx(e,t,n){let r=`${hu}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${Ca}`}) (action "${r}" "✖") }}`}function yx(e){return`{{ if ${Xc(W_)} }}${e}{{ end }}`}function bx(e,t){return e.reduce((e,t)=>`{{ if ${Xc(t)} }}true{{ else }}${e}{{ end }}`,t)}function xx(e){return e.flatMap(e=>[...js(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.mode`?[e.opens.ref]:[]))}function Sx(e,t,n){return`${H_}${e}.${t}.${n}`}function Cx(e,t,n,r){let i=Ds(n),a=`${hu}${e.presetIdent}`,o=U_(e.presetIdent,i),s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:z_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Sx(e.presetIdent,i,r),l=`${H_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Ks(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=Kb(Wb(o),s,l,u);return Object.assign(e.artifacts.actions,d.actions),e.artifacts.segments[u]={template:d.kind===`ring`?`{{ "${qc(o.label)}" }} ${d.template}`:d.template},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "⚙️" }}`,ref:{variable:z_,key:z_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const wx=`${hu}label:`;function Tx(e){if(e.startsWith(wx)){let t=e.slice(wx.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Ex(e,t,n,r){let i=Ds(e),a=`${wx}${i}:${e.name}`;n.segments[a]={template:`{{ "${qc(i)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let o=e.settings?.[Vs];return{...Jc(a,r.ref,r.body,`drop`,bx([r.ref],dx)),...o!==void 0&&{settings:{theme:o}},drafts:{[Vs]:r.drafts[Vs]}}}function Dx(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${hu}${i}.insert.${t}`,s=`${hu}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:hx,anchor:n,relation:r};let c=u_(o),l=d_(s,o,void 0),u=m_(l),d=p_(l,c);return a.variables[l]=Qc(l,Uc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=$c(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "✚" "✕" }}{{ if ${Xc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${Ca}`}) $m }}{{ end }}`}}function Ox(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!mx(e.name)),i=e=>Ox(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=As(o,i);if(mx(o.name)){n.push(s);continue}let c=Ds(o),l=a===r?[Dx(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Dx(t,u,c,`after`),f=vx(t,u,c),p=t.segments[o.name],m=Cx(t,u,o,Hs(p)),h=yx(f),g=yx(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>_x(e.host,e.template,t.artifacts)),{...Ex(o,p,t.artifacts,m),lead:h,trail:g},{...s,when:fx(`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},_x(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:bx(xx(n),fx(`true`,e.when))}}}function kx(e,t,n,r,i,a,o){let s=`${hu}${n}.resetLayout`,c=`${hu}${n}.customized`;i.actions[s]={reset:r};let l=qc(t);return i.segments[c]={template:`{{ action "${s}" "↺ ${l} customized" }}`,when:px},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},Ax(e,o)]}}function Ax(e,t){if(e.kind===`segment`)return{kind:`container`,direction:`horizontal`,children:[e,t]};let n=e.children.at(-1);return e.direction===`vertical`&&n!==void 0&&(n.kind===`segment`||n.when===void 0)?{...e,children:[...e.children.slice(0,-1),Ax(n,t)]}:{...e,children:[...e.children,t]}}function jx(e,t,n,r,i){let{node:a}=w_(e,t),o={presetIdent:fu(t),rootKey:Xb(t),segments:e.segments,artifacts:n,posCounter:{n:0}};return kx(Ox(a,o),t,o.presetIdent,o.rootKey,n,r,i)}function Mx(e){let t={variables:{},actions:{},segments:{}},n=tx(`${hu}help`,ix,[W_],t);t.variables[ox]=Qc(ox,Uc),t.actions[ox]=$c(ox,lx.member),t.segments[ox]={template:Zc(ox,...sx),when:G_};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ox},n]};t.segments[cx]={template:`{{ action "${B_}" "✎ done" }}`,when:G_};let i={kind:`segment`,name:cx},a={...e.presets},o=[];for(let n of x_(e.presets)){let s=jx(e,n,t,i,r);o.push(s),a[n]={...C_(e.presets,n),root:s}}let s=Eb(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Nx={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Px(e){let t=e[Nx.socket]??``,n=e[Nx.pane]??``;if(t===``||n===``)return null;let r=e[Nx.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Fx=Nx.truecolor,Ix=[{name:`tmuxTruecolor`,label:`tmux truecolor`,probe:({tmux:e,claudeSettings:t})=>{switch(e.kind){case`unreported`:return{ok:!1,reason:"the client reported no tmux facts — re-run `cc-candybar install` to stage a current client"};case`outside`:return{ok:!0};case`inside`:{if(e.termfeatures.kind===`failed`)return{ok:!1,reason:`tmux could not be asked: ${e.termfeatures.reason}`};if(!e.termfeatures.value.includes(`RGB`)||e.hint.truecolor!==null)return{ok:!0};let n=t.env[Fx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Fx} is set in ${t.path} — restart Claude Code to apply`}:{ok:!1,reason:`Claude Code renders the bar in 256 colours inside tmux`,fix:{kind:`claude-settings-env`,name:Fx,value:`1`}}}}}}];function Lx(e){return Ix.map(t=>({check:t,verdict:t.probe(e)}))}function Rx(e){return Ix.find(t=>t.name===e)}const zx=`${gu}doctor.`;function Bx(e){let t=`${zx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Vx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Bx(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:So}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?So:xo}]})}const Hx={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Ux(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "⎘ id" }} {{ action "${t(`openProject`)}" "↗ proj" }} {{ action "${t(`openTranscript`)}" "↗ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "↗ repo" }}{{ end }}`,actions:Object.fromEntries(Object.entries(Hx).map(([t,n])=>[`${e}${t}`,n]))}}const Wx=`armed`,Gx=`disarmed`;function Kx(e,t,n){let r=`${e}.arm`,i=`${e}.disarm`,a=`(eq .${e} "${Wx}")`;return{template:`{{ if ${a} }}{{ action "${e}" "${t.confirm}" }} {{ action "${i}" "✕" }}{{ else }}{{ action "${r}" "${t.arm}" }}{{ end }}`,actions:{[r]:{set:e,to:Wx},[i]:{set:e,to:Gx},[e]:{do:[i,...n]}},armed:a,variables:{[e]:{kind:`state`,key:e,default:Gx}},disarm:i}}const qx=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Jx(e){return typeof e==`string`&&qx.test(e)?{kind:`line`,line:e}:{kind:`refused`,reason:`a slash command is "/" then its name, e.g. "/compact" or "/model opus", on one line with no control characters, got ${JSON.stringify(e)}`}}function Yx(e){let t=Jx(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Xx=[`/compact`,`/model`],Zx=`/clear`;function Qx(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=Kx(`${e}clear`,{arm:Zx,confirm:`${Zx} ✓ confirm`},[n]);return{template:Xx.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(Xx.map(e=>[t(e),{slash:Yx(e)}])),...r.actions,[n]:{slash:Yx(Zx)}},variables:r.variables,disarm:r.disarm}}const $x=`${gu}menu`,eS=`open`,tS=`${gu}edit`,nS=`${gu}close`,rS=`${gu}toolbar`,iS=Ux(gu),aS=`${gu}commands`,oS=Qx(`${aS}.`),sS=`${gu}tab`,cS=[{member:`session`,label:`⚡ session`},{member:`look`,label:`🎨 look`},{member:`layout`,label:`📐 layout`},{member:`config`,label:`⚙ config`},{member:`tools`,label:`🧰 tools`}],lS=e=>`${sS}.${e}`,uS=e=>`${lS(e)}.toggle`,dS=e=>({variable:sS,key:sS,member:e}),fS=`${gu}save`,pS=`${gu}unsaved`,mS=`${gu}preset.save`,hS=`${gu}preset.delete`,gS=`${gu}resetAll`,_S=`${$x}.toggle`,vS={variable:$x,key:$x,member:eS},yS=`${gu}undo`,bS=`${gu}redo`,xS=`${gu}resettable`,SS=`${gu}doctor`,CS=`${SS}.run`,wS=e=>`${SS}.fix.${e}`,TS=e=>`${SS}.${e}`,ES=`${gu}pickers`,DS=[{template:`{{ themePreview }}`}],OS={template:`{{ layoutPreview }}`},kS={preset:[OS,{when:`{{ not .preset.bundled }}`,template:`{{ action "${hS}" (printf "🗑 delete %s" .${bb.preset.effectiveVar}) }}`}],theme:DS,style:DS,variation:[OS]},AS=e=>`${gu}${e}`,jS=e=>`${gu}apply.${e}`,MS=e=>`${gu}reset.${e}`,NS=e=>`${gu}carousel.${e}`,PS=(e,t)=>`${NS(e)}.${t}`,FS=Object.keys(bb).map(e=>{let t=bb[e],n=ul(t.configKey);if(n===`text`)throw Error(`settings menu: globals.${t.configKey} is free text, which no control can change — list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);let r=Kb({label:t.label,domain:n},t.sessionKey,t.effectiveVar,jS(e));return{...t,name:e,control:r,beneath:kS[e]??[]}}),IS={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,charset:`config`,colorCompatibility:`config`,updateNotice:`config`},LS=e=>FS.filter(t=>IS[t.name]===e).map(JS);new Set(FS.flatMap(e=>[e.sessionKey,e.configKey]));const RS=Kx(gS,{arm:`⟲`,confirm:`⟲ reset all?`},FS.map(e=>MS(e.name))),zS=(e,t,n)=>({count:e,path:t,body:n,shown:`(gt .${e} 0)`}),BS=[zS(pS,`unsaved`,`{{ action "${fS}" (printf "💾 save %d" .${pS}) }}`),zS(`${gu}history.undo`,`history.undo`,`{{ action "${yS}" "↶" }}`),zS(`${gu}history.redo`,`history.redo`,`{{ action "${bS}" "↷" }}`),{count:xS,path:`resettable`,body:RS.template,shown:`(or (gt .${xS} 0) ${RS.armed})`}],VS={when:`{{ or ${BS.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+BS.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},HS=[{step:RS,place:`door`},{step:oS,place:`session`}],US=e=>e.map(e=>e.step.disarm),WS=US(HS),GS=US(HS.filter(e=>e.place!==`door`)),KS=f_(ES),qS=e=>({variable:KS,key:KS,member:u_(jS(e))});function JS(e){let t=AS(e.name);return e.control.kind===`inline`?{kind:`segment`,name:t}:Jc(t,qS(e.name),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:NS(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:PS(e.name,n)}))]},`drop`)}function YS(e){return e===$x}function XS(e){let t={kind:`segment`,name:$x};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[XS(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 ZS(e){return QS(e)>0?e:XS(e)}function QS(e){let t=0;for(let n of js(e))n.kind===`segment`&&YS(n.name)&&(t+=1);return t}function $S(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&YS(e.name)||e.opens!==void 0&&$S(e.opens.body,!0):e.children.some(e=>$S(e,n))}const eC={session:{direction:`vertical`,segments:[rS,aS]},look:{direction:`horizontal`,segments:[]},layout:{direction:`horizontal`,segments:[mS,tS]},config:{direction:`horizontal`,segments:[]},tools:{direction:`vertical`,segments:[SS,...Ix.map(e=>TS(e.name))]}},tC=e=>({kind:`container`,direction:eC[e].direction,children:[...eC[e].segments.map(e=>({kind:`segment`,name:e})),...LS(e)]});function nC(e){return e.kind===`segment`?YS(e.name)?Jc(e.name,vS,{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...LS(`door`),{kind:`segment`,name:fS}]},{kind:`container`,direction:`horizontal`,children:cS.map(({member:e})=>Jc(lS(e),dS(e),tC(e),`drop`))}]},`above`):e:rC(e)}function rC(e){return{...e,children:e.children.map(e=>nC(e))}}function iC(e){let t={variables:{[$x]:Qc($x,Uc)},actions:{[_S]:$c($x,eS),[$x]:{do:[_S,...WS]},[CS]:{doctor:`run`},[nS]:{set:vS.key,to:Uc},[tS]:{do:[B_,nS]},...iS.actions,...oS.actions,[fS]:{save:!0},[yS]:{undo:!0},[bS]:{redo:!0},[mS]:{preset:`save`},[hS]:{preset:`delete`,name:`{{ .${bb.preset.effectiveVar} }}`}},segments:{[$x]:{template:Zc($x,e,`❌`)},[rS]:{template:iS.template},[aS]:{template:oS.template},[fS]:VS,[mS]:{template:`{{ action "${mS}" "+ preset" }}`},[SS]:{template:`{{ action "${CS}" "🩺 doctor" }}`},[tS]:{template:`{{ action "${tS}" "✎ arrange" "✎ done" }}`}}};for(let e of BS)t.variables[e.count]={kind:`input`,path:e.path,type:`number`,default:0};t.variables[sS]=Qc(sS,`session`);for(let{member:e,label:n}of cS)t.actions[uS(e)]=$c(sS,e),t.actions[lS(e)]={do:[uS(e),...GS]},t.segments[lS(e)]={template:Zc(lS(e),n,`▾ ${n}`)};return Object.assign(t.variables,oS.variables,RS.variables),oC(t),aC(t),t}function aC(e){for(let t of Ix){let n=Bx(t.name),r=wS(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[TS(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}✓ ${t.label}{{ else }}✗ ${t.label} — {{ .${n.reason} }}{{ if eq .${n.fixable} "${xo}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function oC(e){for(let t of FS){Object.assign(e.actions,t.control.actions);let n=MS(t.name);e.actions[n]={reset:t.configKey};let r=`{{ action "${n}" "↺" }}`;if(t.control.kind===`inline`){e.segments[AS(t.name)]={template:`${t.control.template} ${r}`};continue}let i=qS(t.name),a=p_(i.key,i.member);e.variables[i.key]=Qc(i.key,Uc),e.actions[a]=$c(i.key,i.member),e.segments[AS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} ${Zc(a,`▸`,`▾`)} `+r},e.segments[NS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[PS(t.name,r)]=n})}Object.assign(e.actions,RS.actions)}function sC(e){e.variables[z_]=Qc(z_,Uc),e.actions[B_]=$c(z_,V_)}function cC(e){let t=iC(e.globals.menuGlyph??`🍫`);sC(t);let n={...e.presets},r=[];for(let t of x_(e.presets)){let{node:i}=w_(e,t),a=nC(ZS(i));r.push(a),n[t]={...C_(e.presets,t),root:a}}let i=Eb(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const lC=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function uC(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function dC(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function fC(e,t){if(t===void 0)return{};if(!nc(t))return Z(e,`actions`,`actions must be an object, got ${rc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=pC(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Z(e,t,n){e.issues.push({path:t,message:n,line:G(e.source,t.split(`.`))})}function pC(e,t,n){if(!nc(n))return Z(e,t,`${t} must be an action object, got ${rc(n)}`),null;if(`persistWhen`in n)return Z(e,t,`${t}.persistWhen was removed: declare the \`set\` alone — a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=lC.filter(e=>e in n);return r.length===1?mC[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${lC.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const mC={set:(e,t,n)=>KC(e,t,n,`set`,HC),persist:(e,t,n)=>KC(e,t,n,`persist`,UC),copy:hC(`copy`),open:hC(`open`),reset:gC,undo:vC(`undo`),redo:vC(`redo`),save:vC(`save`),preset:yC,doctor:bC,ceiling:xC,slash:SC,do:CC};function hC(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Zs(t,n,r,e);return i===null?null:{[e]:i}}}function gC(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=wC(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 _C={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,save:`it saves the session's unsaved settings`};function vC(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Z(t,`${n}.${e}`,`${e} must be the literal true (it takes no key — ${_C[e]}), got ${K(r[e])}`),null)}}function yC(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Z(e,`${t}.preset`,`preset must be "save" or "delete", got ${K(r)}`),null;if(r===`save`)return{preset:`save`};let a=Zs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function bC(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Z(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${K(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||Rx(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Ix.map(e=>e.name).join(`, `)}), got ${K(a)}`),null):{doctor:`fix`,check:a}}function xC(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Z(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${K(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Z(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${K(a)}`),null):{ceiling:`set`,to:a}}function SC(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=Jx(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function CC(e,t,n){for(let r of Object.keys(n))r!==`do`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Z(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${K(r)}`),null):{do:r}}function wC(e,t,n,r,i,a){let o=Zs(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const TC={set:`the SessionState key to write`,persist:`the config globals field to write`};function EC(e,t,n,r){let i=TC[r],a=wC(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 DC(e){return e===`set`?`set-state`:`set-config`}const OC={to:qC(`set`)},kC={to:qC(`persist`)},AC={from:JC(`set`)},jC={from:JC(`persist`)},MC={min:$C(),max:$C(),by:$C()},NC={int:XC()},PC={cycle:YC(`set`)},FC={cycle:YC(`persist`)},IC={removeSegment:ZC(`removeSegment`)},LC={insertSegment:ZC(`insertSegment`),anchor:ZC(`anchor`),relation:QC()},RC={insertSegmentFrom:JC(`persist`),anchor:ZC(`anchor`),relation:QC()},zC={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},BC={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function VC(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>ac(e,t,n,r),c=Cc(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?pc(s,...n):s}}const HC=[VC(`set`,OC),VC(`set`,AC),VC(`set`,MC,[zC,BC]),VC(`set`,NC),VC(`set`,PC)],UC=[VC(`persist`,kC),VC(`persist`,jC),VC(`persist`,MC,[zC,BC]),VC(`persist`,FC),VC(`persist`,IC),VC(`persist`,LC,[],[`insertSegment`]),VC(`persist`,RC,[],[`insertSegmentFrom`])];function WC(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 GC(e){let t=WC(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 KC(e,t,n,r,i){let a=EC(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${GC(r)}${o.length>1?` — found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Z(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function qC(e){let t=DC(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>wC(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 JC(e){let t=DC(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Z(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Z(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Z(n,s,`${i} array members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Z(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Z(n,s,`${i} array members must be unique — a duplicated value would render the same picker option twice`);return}return r}Z(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${K(o)}`)}}}function YC(e){let t=DC(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${rc(o)}`);return}let c=o;if(c.length<2){Z(n,s,`cycle needs at least two members (one member has no successor — use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Z(n,s,`cycle members must be non-empty — an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" — ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Z(n,s,`cycle members must be unique — the successor of a duplicated member is ambiguous`);return}return c}}}function XC(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Z(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor — a paged picker's page key), got ${K(r[n])}`);return}return!0}}}function ZC(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Zs(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(t,o,`${e} "${a}" contains "/" or ":" — segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function QC(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Z(e,`${t}.${n}`,`relation must be "before" or "after", got ${K(i)}`);return}return i}}}function $C(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Z(e,`${t}.${n}`,`${n} must be an integer, got ${K(i)}`);return}return i}}}function ew(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style — endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const tw={noun:`style key`,fields:{hueShift:_c(),chromaScale:_c({min:0}),lightnessScale:_c(),lightnessShift:_c()}};function nw(e,t){if(!nc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${rc(t)}`,line:G(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free — a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:G(e.source,[`styles`,r])});continue}if(oo(r)){e.issues.push({path:`styles.${r}`,message:ew(`styles.${r}`,r,`globals.endcaps`),line:G(e.source,[`styles`,r])});continue}let t=ic(e,tw,`styles.${r}`,i);t!==null&&(n[r]={...In,...t})}return n}const rw={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:od(e,`${t}.${n}`,r[n])},globals:{required:!1,json:Cl(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Sl(e,`${t}.${n}`,r[n])}}};function iw(e,t){if(!nc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${rc(t)}`,line:G(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free — a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:G(e.source,[`presets`,r])});continue}let t=ic(e,rw,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function aw(e,t){if(t===void 0)return{};if(!nc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${rc(t)}`,line:G(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${K(i)}`,line:G(e.source,[`helpers`,r])});continue}n[r]=i}return n}const ow=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 sw(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 cw(e){let t=ow.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${sw(t)}`}function lw(e){let t=ow.get(e);return t===void 0?``:` — ".${e}" is no longer a variable: ${sw(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function uw(e,t){let n=new Map;for(let e of Object.keys(t)){let t=fu(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 dw(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||Qa(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:oo(i)?ew(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:G(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:G(e.source,[`globals`,`preset`])}),uw(e,t.presets);let i=Vb(t);for(let[n,r]of Object.entries(t.actions))!(`set`in r)||!(`from`in r)||typeof r.from!=`string`||Hb(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${Hb(i).join(`, `)})`,line:G(e.source,[`actions`,n,`from`])});for(let[n,r]of Object.entries(t.actions))`do`in r&&r.do.forEach((i,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,i)?t.actions[i]:void 0,s=o===void 0?`references unknown action "${i}"`:`do`in o?`"${i}" is itself a do action — list its members here instead`:r.do.indexOf(i)===a?a>0&&dC(o)?`"${i}" takes its value from the template (from/int/insertSegmentFrom), so it can only be the first member — only the first is bound the region's display`:void 0:`"${i}" is listed twice — each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:G(e.source,[`actions`,n,`do`])})});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=Qb(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Dl().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:G(e.source,[`actions`,n,a])});continue}let s=fw.filter(e=>e in r);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a "presets.<name>.root" target — ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){pw(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!x_(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names preset "${o.preset}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:G(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${Su(o.segment)}`,line:G(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) — use "to", "from", or "cycle" instead`,line:G(e.source,[`actions`,n,a])})}}let a=pv(t);for(let t of a.names)t!==`settings`&&!t.startsWith(mw)||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 o=(t,n,r)=>{QS(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" ${QS(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}),$S(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${$x}" under a \`when\` or inside a disclosure body — the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),s(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell — everything inside a cell wears that cell's hue and tone, so it would place nothing. Set it on the row whose children are the cells (the horizontal container) or on the root, which places the rows.`,line:r});let i=new Map;for(let e of js(t)){if(e.kind!==`segment`)continue;let t=Ds(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=ks(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" — an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function s(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>s(n,t||Es[e.direction]===`cell`))}let c=(n,r)=>{for(let[i,o]of Ic(n,r)){let n=G(e.source,o.split(`.`));if(i.when!==void 0&&(Ew(e,`${o}.when`,i.when,a,{line:n}),Tw(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(YS(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${$x}" an id or settings — the anchor only marks where the menu goes, so place it as the bare name "${$x}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:o,message:`${r} entry "${i.name}" does not match any declared segment${Su(i.name)}`,line:n}),Sw(e,t,i,o,n)}}};n.root!==void 0&&c(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&c(t.root,`presets.${e}.root`);let l=new Map([[`root`,Pc(t.root)]]);for(let e of x_(t.presets)){let{node:n,path:r}=w_(t,e);l.set(r,n)}for(let[t,n]of l)o(n,t,G(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){Cw(e,`variables.${n}`,r,a);let t=cw(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:G(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))Cw(e,`segments.${n}.vars.${t}`,i,a,n);let i=Hs(r);gw(e,n,i);let o=hw(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){Ew(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of dv(s,t.helpers)){if(Object.prototype.hasOwnProperty.call(t.actions,r))continue;let s=i===`options`?` (in a picker, menu or carousel)`:``;if(o!==null){Dw(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"${s}`,line:G(e.source,[`segments`,n,a])})}}}}for(let[n,r]of Object.entries(t.variables))ww(e,`variables.${n}`,r,a);for(let[n,r]of Object.entries(t.segments))if(r.vars)for(let[t,i]of Object.entries(r.vars))ww(e,`segments.${n}.vars.${t}`,i,a,n)}const fw=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function pw(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=G(e.source,[`actions`,n,r]);if(!x_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:c});return}if(r===`reset`)return;let l=`removeSegment`in o,u=`insertSegment`in o,d=`insertSegmentFrom`in o;if(!l&&!u&&!d){e.issues.push({path:s,message:`actions.${n}: "${i}" is a "presets.<name>.root" target and can only be paired with "removeSegment", "insertSegment", or "insertSegmentFrom" (not "to"/"from"/"cycle"/bounded — those have no meaning as a tree op)`,line:c});return}let f=(r,i)=>{Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" is not a declared segment (have: ${Object.keys(t.segments).join(`, `)})${Su(i)}`,line:c})},p=new Set(Os(w_(t,a).node)),m=(r,i)=>{!xu.has(i)||p.has(i)||Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" names no placement${Su(i)}`,line:c})};`removeSegment`in o&&m(`removeSegment`,o.removeSegment),`insertSegment`in o&&f(`insertSegment`,o.insertSegment),(`insertSegment`in o||`insertSegmentFrom`in o)&&m(`anchor`,o.anchor)}const mw=`settings.`;function hw(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>mw+e)])}}function gw(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=yw(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Ws(n,vw(n)))i(e,`the defaults do not stand together: ${t}`)}function _w(e){return yw(e).length>0||Ws(e,vw(e)).length>0}function vw(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function yw(e){let t=t=>Us(bw(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Us(bw(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${xw(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 bw(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function xw(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Us(n)!==void 0).map(([e])=>e)}function Sw(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=Hs(a),s=`${r}: placement "${Ds(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(`, `)})`:Gs(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Ua(a):``}, but it must be ${Js(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])=>Gs(o[e],t))||_w(o)))for(let{message:t}of Ws(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function Cw(e,t,n,r,i){n.kind===`template`&&Ew(e,`${t}.template`,n.template,r,{segCtx:i}),Rs(n)&&n.cache&&`key`in n.cache&&Ew(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function ww(e,t,n,r,i){if(Rs(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 Tw(e,t,n,r){try{R_.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function Ew(e,t,n,r,i){for(let[a,o]of sv(n,r.helpers)){if(fv(a,r))continue;if(a.startsWith(mw)){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){Dw(e,o,`Template references unknown variable ".${a}"${lw(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&fv(n,r)?` (segment-local vars are namespaced — write ".${n}")`:lw(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??G(e.source,t.split(`.`))})}}function Dw(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 Ow(e,t){let{graph:n,nodeInfo:r}=kw(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` → `)}`,line:G(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function kw(e){let t=new Set(Object.keys(e.variables)),n=new Map;for(let t of Object.keys(e.variables))n.set(t,{declarationPath:`variables.${t}`,linePathParts:[`variables`,t]});for(let[r,i]of Object.entries(e.segments))if(i.vars)for(let e of Object.keys(i.vars)){let i=`${r}.${e}`;t.add(i),n.set(i,{declarationPath:`segments.${r}.vars.${e}`,linePathParts:[`segments`,r,`vars`,e]})}let r=new Map;for(let e of t)r.set(e,new Set);let i=(n,i)=>{for(let a of sv(i,e.helpers).keys()){if(t.has(a)){r.get(n).add(a);continue}let e=a.split(`.`)[0];e!==a&&t.has(e)&&r.get(n).add(e)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),Rs(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 Aw=[`json5`,`json`];function jw(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Mw(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?p.homedir()+e.slice(1):e}function Nw(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Aw.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...Aw.map(e=>c.join(r,`.cc-candybar.${e}`)),...Aw.map(e=>`${Pw()}.${e}`)])]}function Pw(){let e=process.env.XDG_CONFIG_HOME??c.join(p.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function Fw(e,t,n){let r=[];for(let i of Nw(e,t,n)){let e=jw(i);if(e===`present`)return{kind:`file`,path:i,unchecked:r};e!==`absent`&&r.push(e)}if(n===void 0)return{kind:`default`,unchecked:r};let[i]=r;return i===void 0?{kind:`missing`,path:n}:{kind:`unreadable`,...i}}function Iw(e,t,n){let r=Fw(e,t,n);return r.kind===`default`?`${Pw()}.${Aw[0]}`:r.path}function Lw(e){return Rw(e).join(`
|
|
159
159
|
`)||null}function Rw(e){switch(e.kind){case`file`:case`default`:return e.unchecked.map(e=>`Config location could not be checked: ${e.path} — ${e.error}`);case`missing`:return[`Config file not found: ${e.path} — rendering the bundled default until it appears`];case`unreadable`:return[`Config file could not be read: ${e.path} — ${e.error} — rendering the bundled default until it can be`]}}function zw(e,t){let n=Nw(e,t).filter(e=>jw(e)===`present`),r=new Map;for(let e of n){let t=c.dirname(e),n=c.basename(e).replace(/\.(json5|json)$/,``),i=c.join(t,n);r.has(i)||r.set(i,[]),r.get(i).push(e)}let i=[...r.values()].filter(e=>e.length>1);return i.length===0?null:`config-extension collision: ${i.map(e=>{let[t,...n]=e;return`${t} shadows ${n.join(`, `)}`}).join(`; `)} — remove the duplicate`}function Bw(e,t,n){return e===null?{...Hw,config:zc(Hw.raw,t)}:Vw(e,r.readFileSync(e,`utf-8`),t,n)}function Vw(e,t,n,r){let i={source:t,...Gw(e,t,r,Iu(n))};return{...i,config:zc(i.raw,n)}}const Hw={raw:{},source:``,warnings:[]};function Uw({config:e,raw:t,source:n},r=`<config>`,i=new Set(Ka())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(dw(o,e,t),Ow(o,e),a.length>0)throw new bs(r,a);let s=L_(e,a);if(a.length>0)throw new bs(r,a);return Mx(cC(s))}function Ww(e,t,n=new Set(Ka()),r=Kw){return Gw(e,t,n,r).raw}function Gw(e,t,n,r){let i=qw(e,t),a=Cs(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(Ka()),groups:[]};if(!nc(i))throw new bs(e,[{path:``,message:`Config root must be an object, got ${rc(i)}`}],o);let l=Jw(c,i,r);if(s.length>0)throw new bs(e,s,o);return{raw:l,warnings:o}}const Kw=new Set;function qw(e,t){try{return Qe.default.parse(t)}catch(t){let n=t;throw new bs(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function Jw(e,t,n){for(let n of Object.keys(t))Yw.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...Yw].join(`, `)}`,line:G(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=xl(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Vl(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Lu(e,t.segments,n)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported — use "root" with the A-grammar instead.
|
|
160
160
|
Replace: layout: [["seg1", "seg2"], ["seg3"]]
|
|
161
161
|
With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
|
|
162
162
|
Single-row example: root: { h: ["seg1", "seg2"] }`,line:G(e.source,[`layout`])}),t.root!==void 0&&(r.root=od(e,`root`,t.root)),t.actions!==void 0&&(r.actions=fC(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=nw(e,t.styles)),t.presets!==void 0&&(r.presets=iw(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=wl(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=aw(e,t.helpers)),md(e,r),F_(e,r),J_(e,r),bu(e,r,gu,`the global settings menu`),r}const Yw=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function Xw(e){let t=tT(e.termCols),n=tT(e.termRows),r=nT(e.ssh),i=$w(e.tmux),a=Qw(e.configEnv),o=Zw(e.claudeConfigDir);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o}}}function Zw(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function Qw(e){return typeof e==`string`&&e!==``?Mw(e):void 0}function $w(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 eT=1e4;function tT(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>eT?eT:t}function nT(e){return typeof e==`boolean`?e:void 0}var rT=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function iT(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function aT(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 rT(`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 rT(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function oT(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=aT(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(iT(t))})}async function sT(e,t,n){let r=null;try{r=await fT(Fe(),t.connectMs);let i=await oT(r,{v:3,...e},t.budgetMs);return uT(e.kind,i,n)}catch(e){return dT(e)}finally{r&&r.destroy()}}function cT(e,t){return typeof e==`string`?e:t}function lT(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function uT(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=cT(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:lT(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 dT(e){if(e instanceof rT||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 fT(e,t){return new Promise((n,r)=>{let i=y.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function pT(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 mT={connectMs:50,budgetMs:150},hT={connectMs:50,budgetMs:200};function gT(e){let t=e.output;return typeof t==`string`?t:void 0}function _T(e,t,n,r){return sT({kind:`render`,hookData:e,args:t,cwd:n,...r},mT,gT)}function vT(e,t){return sT({kind:`click`,verb:e,value:t},hT,gT)}let yT=null;function bT(e){if(yT!==null)return yT;r.mkdirSync(c.dirname(e),{recursive:!0});try{yT=r.statSync(e).size}catch{yT=0}return yT}function xT(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{}yT=0}function Q(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=qe(),t=bT(e);r.appendFileSync(e,n),yT=t+Buffer.byteLength(n,`utf8`),yT>=5242880&&xT(e)}catch(e){yT=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}function ST(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(`
|
|
163
163
|
`)}function CT(e,t){return e===`darwin`?[wT(`footprint`,[`-p`,String(t)]),wT(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[TT(`/proc/self/smaps_rollup`),TT(`/proc/self/status`)]:[]}function wT(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=Oe({bin:e,args:[...t],timeoutMs:5e3,category:`limits.memory-report`});return n.ok?n.stdout.trim().length>0?{kind:`text`,text:n.stdout}:{kind:`unavailable`,reason:`exited 0 but printed nothing`}:{kind:`unavailable`,reason:`${n.reason}${n.error===void 0?``:`: ${n.error}`}${ET(n.stderr)}`}}}}function TT(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 ET(e){let t=e.split(`
|
|
164
164
|
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const DT=`CC_CANDYBAR_RSS_LIMIT_MB`;function OT(e){let t=e[DT];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${DT} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function kT(e){return OT(e)*2}const AT=1024*1024;function jT(e){return OT(e)*AT}const MT={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function NT(e,t,n){let{prefix:r,suffix:i}=MT[t];return c.join(e,`${r}${n}${i}`)}function PT(e){for(let t of Object.keys(MT)){let{prefix:n,suffix:r}=MT[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function FT(e){let t=e.rssLimitBytes??512*AT,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 IT(e.log,`memory report`,()=>{let t=NT(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),IT(e.log,`heap snapshot`,()=>{let t=NT(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),IT(e.log,`artifact rotation`,()=>{RT(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 IT(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function LT(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=PT(t);if(n===null)return t;let{prefix:r,suffix:i}=MT[n];return t.slice(r.length,t.length-i.length)}function RT(e,t,n){let r=new Map;for(let t of e){let e=LT(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 zT(e,t,n={}){let i=Pe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Q,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>ST(CT(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>ne.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>PT(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function BT(e={}){if(nE()!==null)return;let n=e.spawn??rE,r=$T();if(r.kind===`contended`){let e=HT();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),VT(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),VT(n);return}try{VT(n)}finally{tE()}}function VT(e){YT()&&UT(e)}function HT(){try{let e=r.statSync(Ue());return Date.now()-e.mtimeMs}catch{return null}}function UT(e){try{e()||t.stderr.write(`cc-candybar: daemon spawn returned false (unable to resolve script path?)
|
|
165
|
-
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function WT(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function GT(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function KT(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 qT(e,n){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,String(n),{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.backoff: ${e.message}\n`)}}function JT(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function YT(){let e=We(),n=Ge(),r=KT(n),i=WT(XT(e),GT(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`),ZT(e),qT(n,Math.min(r+1,5)),!0)}function XT(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function ZT(e){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,`${t.pid} ${Date.now()}\n`,{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.cooldown: ${e.message}\n`)}}let QT=null;function $T(){let e=Ue();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return QT={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(!eE(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 eE(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function tE(){if(!QT)return;let{fd:e,path:t}=QT;QT=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function nE(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function rE(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${kT(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const iE=`cc-candybar`,aE=`dispatch`,oE=`set-state`,sE=`step-state`,cE=`copy`,lE=`open-vscode`,uE=`toolbar-toggle`,dE=`show-config-error`,fE=`show-config-warning`,pE=`set-config`,mE=`step-config`,hE=`save`,gE=`save-preset`,_E=`delete-preset`,vE=`reset-config`,yE=`apply-layout-op`,bE=`undo`,xE=`redo`,SE=`apply-update`,CE=`doctor-run`,wE=`doctor-fix`,TE=`ceiling`,EE=`slash`;function DE(e){return e.map(encodeURIComponent).join(`/`)}function OE(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function kE(e){return`${iE}://${aE}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${DE(e.args)}`)}`).join(`&`)}`}function AE(e){return new w(e).getAll(`e`).map(PE)}const jE=new Set([oE,vE]);function ME(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&NE(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function NE(e,t){if(e.verb!==t.verb||!jE.has(e.verb))return;let[n,r]=[PE(e.value),PE(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function PE(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const FE=`1.100.
|
|
165
|
+
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function WT(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function GT(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function KT(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 qT(e,n){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,String(n),{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.backoff: ${e.message}\n`)}}function JT(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function YT(){let e=We(),n=Ge(),r=KT(n),i=WT(XT(e),GT(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`),ZT(e),qT(n,Math.min(r+1,5)),!0)}function XT(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function ZT(e){try{r.mkdirSync(c.dirname(e),{recursive:!0}),r.writeFileSync(e,`${t.pid} ${Date.now()}\n`,{mode:384})}catch(e){t.stderr.write(`cc-candybar: could not record spawn.cooldown: ${e.message}\n`)}}let QT=null;function $T(){let e=Ue();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return QT={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(!eE(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 eE(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function tE(){if(!QT)return;let{fd:e,path:t}=QT;QT=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function nE(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function rE(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${kT(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const iE=`cc-candybar`,aE=`dispatch`,oE=`set-state`,sE=`step-state`,cE=`copy`,lE=`open-vscode`,uE=`toolbar-toggle`,dE=`show-config-error`,fE=`show-config-warning`,pE=`set-config`,mE=`step-config`,hE=`save`,gE=`save-preset`,_E=`delete-preset`,vE=`reset-config`,yE=`apply-layout-op`,bE=`undo`,xE=`redo`,SE=`apply-update`,CE=`doctor-run`,wE=`doctor-fix`,TE=`ceiling`,EE=`slash`;function DE(e){return e.map(encodeURIComponent).join(`/`)}function OE(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function kE(e){return`${iE}://${aE}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${DE(e.args)}`)}`).join(`&`)}`}function AE(e){return new w(e).getAll(`e`).map(PE)}const jE=new Set([oE,vE]);function ME(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&NE(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function NE(e,t){if(e.verb!==t.verb||!jE.has(e.verb))return;let[n,r]=[PE(e.value),PE(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function PE(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const FE=`1.100.1`;function IE(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function LE(e){return e??c.join(p.homedir(),`.claude`)}function RE(e){return c.join(e,`settings.json`)}function zE(e){return c.join(e,`plugins`,`installed_plugins.json`)}function BE(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function VE(e){let t;try{let n=BE(e);if(/^\s*$/.test(n))return{};t=Go.parse(n)}catch(t){throw Error(`cannot read ${e}: ${HE(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const HE=e=>e instanceof Error?e.message:String(e),UE=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function WE(e){let t=UE.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 GE(e){return e.join(`.`)}function KE([e,t,n],[r,i,a]){return e-r||t-i||n-a}const qE=`@promptctl/cc-candybar`;async function JE(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`?WE(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function YE(e,t){let n=WE(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=KE(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 XE(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${GE(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${GE(t.installed)} is newer than the registry's latest release (${GE(t.latest)}): an unpublished build.\n`};case`stale`:{let n=GE(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${GE(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 ZE=`CCCandybarURLHandler`,QE=[],$E={"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 eD(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function tD(e,t){return[e,...t].map(eD).join(` `)}function nD(){return c.join(p.homedir(),`Applications`,`${ZE}.app`)}function rD(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function iD(){if(process.platform===`darwin`)return c.join(p.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(p.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function aD(){return c.join(iD(),`bin`,`cc-candybar`)}function oD(){return c.join(iD(),`dist`,`index.mjs`)}function sD(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(`
|
|
166
166
|
`)}function cD(e){if(!e)throw Error(`install: process.argv[1] not set`);return e.endsWith(`.mjs`)||e.endsWith(`.js`)?e:c.resolve(c.dirname(e),`..`,`dist`,`index.mjs`)}function lD(t){let n=$E[`${process.platform}-${process.arch}`];if(n){let r=e(t);try{return{kind:`native`,sourcePath:r.resolve(`${n}/bin/cc-candybar`)}}catch{}}return{kind:`node-shim`,sourcePath:c.resolve(c.dirname(t),`..`,`bin`,`cc-candybar`)}}function uD(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function dD(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 ${qE}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function fD(){let e=cD(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=lD(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(oD()),{recursive:!0}),r.mkdirSync(c.dirname(aD()),{recursive:!0}),uD(e,oD()),uD(t.sourcePath,aD()),r.chmodSync(aD(),493),r.rmSync(c.join(iD(),`url-handler.mjs`),{force:!0});let n=dD(aD());return process.stdout.write(`Staged cc-candybar v${FE} runtime at ${iD()}\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:aD(),distPath:oD(),entryKind:n}}function pD(){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>${iE}</string>`,` </array>`,` </dict>`,`</array>`].join(`
|
|
167
167
|
`)}]}function mD(e){let t=nD();r.mkdirSync(c.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=Oe({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,sD(process.execPath,e)],category:`install.osacompile`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`osacompile failed (${n.reason})`);let i=c.join(t,`Contents`,`Info.plist`);for(let{key:e}of pD())Oe({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of pD()){let n=Oe({bin:`/usr/bin/plutil`,args:[`-insert`,e,`-xml`,t,i],category:`install.plutil`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`plutil -insert ${e} failed (${n.reason})`)}process.stdout.write(`Registering ${iE}:// with Launch Services\n`);let a=Oe({bin:`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister`,args:[`-f`,t],category:`install.lsregister`});if(!a.ok)throw process.stderr.write(a.stderr),Error(`lsregister failed (${a.reason})`);process.stdout.write(`✓ ${ZE}.app installed and registered.\n`),process.stdout.write(` Test: open '${iE}://hello-world' && pbpaste\n`)}function hD(){rD(),mD(fD().distPath)}function gD(e,t=iE){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:cE,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function _D(e){e||(process.stderr.write(`url-handle: missing URL argument.
|
|
168
168
|
`),process.exit(1));let t;try{t=gD(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await vT(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(BT(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(vD(n)+`
|
|
@@ -173,16 +173,16 @@ Config tooling:
|
|
|
173
173
|
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function sO(e){return Math.min(20,e??20)}const cO={heading:`ERROR`,glyph:`⚠`,colors:ZD},lO={heading:`WARNING`,glyph:`⚠`,colors:QD},uO={heading:`UPDATE`,glyph:`⬆`,colors:QD};function dO(e,t){return{text:KD(e),link:t}}function fO(e,t,n){let[r,...i]=[pO(e,cO,dE),t,pO(n,lO,fE)].flat();return r===void 0?null:{channels:[r,...i]}}function pO(e,t,n){let r=kE([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>dO(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function mO(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
|
|
174
174
|
`)}function hO(e,t,n,r){if(t===null)return e;let i=gO(r),a=t.channels.flatMap(e=>_O(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[vO(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
|
|
175
175
|
`);return e?`${l}\n${e}`:l}function gO(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function _O(e,t){let n=new V({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Lt(Math.max(2,t.width-1)),i=(e,t)=>new U(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>oO([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=>Vt(e,r)).map(e=>i(e,t))})],t).split(`
|
|
176
|
-
`))}function vO(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new V({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new U(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(T(a.path).href)):c(`full text unavailable: ${KD(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(KD(o),s.withLink(T(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=U.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,oO([m],r)}const yO=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function bO(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function xO(e,t){return r.readdirSync(t).filter(yO).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?xO(e,i):[[c.relative(e,i).split(c.sep).join(`/`),bO(i,a)]]})}function SO(e){let t=E.createHash(`sha256`);for(let[n,r]of xO(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const CO=e=>e.slice(0,7);function wO(e){return c.dirname(c.dirname(e))}function TO(){return{version:FE,digest:`b724557c09563412b118a19f5e225a143a74abc7f32444397e9ff211fce324da`}}function EO(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function DO(e,t){try{let n=wO(ie(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=SO(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:EO(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 OO(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function kO(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 AO(e,t,n){let r=ks(e,new Set(n.map(Os).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const jO=/^-?\d+$/;function MO(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 NO(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!jO.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 PO(e,t,n){return r=>r?jO.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 FO(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=>!jO.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 IO(e){return e===`config`?`set-config`:`set-state`}function LO(e,t,n){return t.kind===`int`?NO(`menu page "${e}"`):t.kind===`range`?PO(t.min,t.max,`${n} stepper "${e}"`):MO(t.allowed,`${n} "${e}"`,IO(n))}function RO(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:FO(e,n,t)}))}function zO(e,t=`state`){let n=new Map(Object.entries(e).map(([e,t])=>[e,{validator:t,permanent:!0}]));function r(){let e=[];for(let[t,r]of n)r.permanent&&e.push(t);return e}return{register(e,i){if(!e)throw Error(`register: key is required`);if(e.includes(`/`))throw Error(`register: key "${e}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);let a=n.get(e);if(a){if(a.permanent)throw Error(`register: key "${e}" is a built-in ${t} key and cannot be re-claimed (built-in keys: ${[...r()].join(`, `)})`);let n=FO(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=LO(e,n,t)}else{let r=FO(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:LO(e,r,t)})}let o=!0;return()=>{if(!o)return;o=!1;let r=n.get(e);if(!r||r.permanent)return;let a=r.specs.indexOf(i);a>=0&&r.specs.splice(a,1),r.specs.length===0?n.delete(e):(r.merged=FO(e,r.specs,t),r.validator=LO(e,r.merged,t))}},validate(e,r){let i=n.get(e);return i?i.validator(r):{ok:!1,reason:`unknown ${t} key "${e}" (have: ${[...n.keys()].join(`, `)})`}},listKeys(){return[...n.keys()]},listBaselineKeys(){return r()},rangeParamsFor(e){let t=n.get(e);if(!t||t.permanent||t.merged.kind!==`range`)return null;let{min:r,max:i}=t.merged;return{min:r,max:i}}}}const BO=zO({},`config`);function VO(){return BO.listKeys()}function HO(e,t){return BO.validate(e,t)}function UO(e){return BO.rangeParamsFor(e)}function WO(e,t){return`persist`in e?`to`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ub(e.from,t).members}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[OO({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[OO({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ub(e.insertSegmentFrom,t).members.map(t=>OO({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function GO(e,t){let n=kl(e).get(t);return n===void 0?null:String(n)}function KO(e){let t=new Set;for(let n of Object.values(e.actions)){`reset`in n&&t.add(n.reset);let e=`persist`in n?Qb(n.persist):null;e?.scope===`preset-root`&&t.add(Xb(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function qO(e){let t=new Map([...Vb(e),...gx(e)]);return[...KO(e),...Object.values(e.actions).flatMap(e=>WO(e,t))]}function JO(e){return RO(qO(e),`config`)}function YO(e,t){return BO.register(e,t)}const XO=Array.from({length:10},(e,t)=>(t+1)*1e5),ZO=XO[0],QO=XO[XO.length-1];function $O(e){let t;try{t=VE(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>=ZO&&n<=QO?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${ZO}–${QO} tokens)`)}function ek(e,t){let n=Math.min(t??QO,QO),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:XO.filter(e=>e<r).at(-1)??0,higher:XO.find(e=>e>r&&e<=n)??0}}const tk=Qx(`commands.`),nk=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,rk=`{{ \$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 (${nk}) (basename .project_dir) (ne (${nk}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,ik={min:0,max:100,step:5},ak={warnAt:{label:`warning at %`,domain:ik,default:50},errorAt:{label:`error at %`,domain:{...ik,atLeast:`warnAt`},default:80}};function ok(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:ik,default:80}}}const sk={globals:{palette:`tokyo-night`},variables:{...tk.variables,...yb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"autocompact.window":{kind:`input`,path:`autocompact.window`,type:`number`,default:-1},...Object.fromEntries([`applied`,`lower`,`higher`].map(e=>[`autocompact.${e}`,{kind:`input`,path:`autocompact.${e}`,type:`number`,default:0}])),"autocompact.error":{kind:`input`,path:`autocompact.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``}},segments:{directory:{description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project.",template:rk},model:{description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:Ux(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:tk.template},themeSwitcher:{description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:ok(0)},today:{description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:ok(50)},block:{description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:ak,when:`{{ gt .block.resetsAt 0 }}`},weekly:{description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:ak,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${Ca} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session.`,template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}{{ template "formatTokenCount" .autocompact.applied }}{{ end }}{{ if gt .autocompact.lower 0 }} {{ action (printf "autocompact.%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "autocompact.%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "autocompact.auto" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`},metrics:{description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...Ux(``).actions,...tk.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},"autocompact.auto":{slash:Yx(`/autocompact auto`)},...Object.fromEntries(XO.map(e=>[`autocompact.${e}`,{slash:Yx(`/autocompact ${e}`)}]))},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${Ca}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}×{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},ck=new Set([sk.globals.palette,...Object.values(sk.segments).map(e=>e.palette)].filter(e=>e!==void 0)),lk=zc(Ww(`<default>`,JSON.stringify(sk),ck),sk),uk=x_(lk.presets);function dk(e){return uk.includes(e)}function fk(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const pk=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 mk(e){return((...t)=>pk.run(()=>e(...t)))}const hk=mk(S),gk=mk(x),_k=mk(C);async function vk(e,t){return pk.run(async()=>{let n=null;try{n=await b(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function yk(e,t){return pk.run(async()=>{let n=null;try{n=await b(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const bk=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function xk(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 Sk(e){let t=await Ck(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function Ck(e){for(let t of[65536,1048576]){let n=await yk(e,t);if(n.kind!==`ok`)return n;let r=wk(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function wk(e,t){let n=e.toString(`utf8`).split(`
|
|
176
|
+
`))}function vO(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new V({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new U(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows · `,s),a.kind===`file`?c(`open full text`,s.withLink(T(a.path).href)):c(`full text unavailable: ${KD(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` · `:``}open `,s),c(KD(o),s.withLink(T(o).href))],d=[c(`↳ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=U.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,oO([m],r)}const yO=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function bO(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function xO(e,t){return r.readdirSync(t).filter(yO).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?xO(e,i):[[c.relative(e,i).split(c.sep).join(`/`),bO(i,a)]]})}function SO(e){let t=E.createHash(`sha256`);for(let[n,r]of xO(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const CO=e=>e.slice(0,7);function wO(e){return c.dirname(c.dirname(e))}function TO(){return{version:FE,digest:`551bea986503b6d9a29d8cb645da96d360cda8b7a8922430bcd3b7de40464101`}}function EO(e){let t=JSON.parse(r.readFileSync(c.join(e,`package.json`),`utf8`)),n=typeof t==`object`&&t?t.version:void 0;if(typeof n!=`string`)throw Error(`${c.join(e,`package.json`)} has no version string`);return n}function DO(e,t){try{let n=wO(ie(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=SO(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:EO(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 OO(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function kO(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 AO(e,t,n){let r=ks(e,new Set(n.map(Os).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const jO=/^-?\d+$/;function MO(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 NO(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!jO.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 PO(e,t,n){return r=>r?jO.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 FO(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=>!jO.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 IO(e){return e===`config`?`set-config`:`set-state`}function LO(e,t,n){return t.kind===`int`?NO(`menu page "${e}"`):t.kind===`range`?PO(t.min,t.max,`${n} stepper "${e}"`):MO(t.allowed,`${n} "${e}"`,IO(n))}function RO(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:FO(e,n,t)}))}function zO(e,t=`state`){let n=new Map(Object.entries(e).map(([e,t])=>[e,{validator:t,permanent:!0}]));function r(){let e=[];for(let[t,r]of n)r.permanent&&e.push(t);return e}return{register(e,i){if(!e)throw Error(`register: key is required`);if(e.includes(`/`))throw Error(`register: key "${e}" contains "/" — the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);let a=n.get(e);if(a){if(a.permanent)throw Error(`register: key "${e}" is a built-in ${t} key and cannot be re-claimed (built-in keys: ${[...r()].join(`, `)})`);let n=FO(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=LO(e,n,t)}else{let r=FO(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:LO(e,r,t)})}let o=!0;return()=>{if(!o)return;o=!1;let r=n.get(e);if(!r||r.permanent)return;let a=r.specs.indexOf(i);a>=0&&r.specs.splice(a,1),r.specs.length===0?n.delete(e):(r.merged=FO(e,r.specs,t),r.validator=LO(e,r.merged,t))}},validate(e,r){let i=n.get(e);return i?i.validator(r):{ok:!1,reason:`unknown ${t} key "${e}" (have: ${[...n.keys()].join(`, `)})`}},listKeys(){return[...n.keys()]},listBaselineKeys(){return r()},rangeParamsFor(e){let t=n.get(e);if(!t||t.permanent||t.merged.kind!==`range`)return null;let{min:r,max:i}=t.merged;return{min:r,max:i}}}}const BO=zO({},`config`);function VO(){return BO.listKeys()}function HO(e,t){return BO.validate(e,t)}function UO(e){return BO.rangeParamsFor(e)}function WO(e,t){return`persist`in e?`to`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ub(e.from,t).members}}]:`cycle`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:e.cycle}}]:`removeSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[OO({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[OO({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:Ub(e.insertSegmentFrom,t).members.map(t=>OO({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function GO(e,t){let n=kl(e).get(t);return n===void 0?null:String(n)}function KO(e){let t=new Set;for(let n of Object.values(e.actions)){`reset`in n&&t.add(n.reset);let e=`persist`in n?Qb(n.persist):null;e?.scope===`preset-root`&&t.add(Xb(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function qO(e){let t=new Map([...Vb(e),...gx(e)]);return[...KO(e),...Object.values(e.actions).flatMap(e=>WO(e,t))]}function JO(e){return RO(qO(e),`config`)}function YO(e,t){return BO.register(e,t)}const XO=Array.from({length:10},(e,t)=>(t+1)*1e5),ZO=XO[0],QO=XO[XO.length-1];function $O(e){let t;try{t=VE(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>=ZO&&n<=QO?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${ZO}–${QO} tokens)`)}function ek(e,t){let n=Math.min(t??QO,QO),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:XO.filter(e=>e<r).at(-1)??0,higher:XO.find(e=>e>r&&e<=n)??0}}const tk=Qx(`commands.`),nk=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,rk=`{{ \$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 (${nk}) (basename .project_dir) (ne (${nk}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,ik={min:0,max:100,step:5},ak={warnAt:{label:`warning at %`,domain:ik,default:50},errorAt:{label:`error at %`,domain:{...ik,atLeast:`warnAt`},default:80}};function ok(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:ik,default:80}}}const sk={globals:{palette:`tokyo-night`},variables:{...tk.variables,...yb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"autocompact.window":{kind:`input`,path:`autocompact.window`,type:`number`,default:-1},...Object.fromEntries([`applied`,`lower`,`higher`].map(e=>[`autocompact.${e}`,{kind:`input`,path:`autocompact.${e}`,type:`number`,default:0}])),"autocompact.error":{kind:`input`,path:`autocompact.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``}},segments:{directory:{description:"The current directory, shortened fish-style — `~` under home, project-relative inside the project.",template:rk},model:{description:`The active model's display name.`,template:`✱ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{description:`The session id, truncated to 8 characters.`,template:`⌗{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{description:`The Claude Code version reported in the hook payload.`,template:`◈ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{description:`user@host on a warning background, shown only over SSH.`,template:`⇄ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact — repo, in-progress operation, sha, upstream ±, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "▸" "◂" }}`,fg:`{{ readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3 }}`,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{description:"The pull request open for this branch, as a link; `⚠ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "⇆ #%v" .git.prNumber) }}{{ else }}⚠ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:Ux(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:tk.template},themeSwitcher:{description:"`◀ <theme> ▶`: the theme the bar is wearing; ◀ and ▶ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`§ {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:ok(0)},today:{description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`☉ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:ok(50)},block:{description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`◱ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:ak,when:`{{ gt .block.resetsAt 0 }}`},weekly:{description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`◑ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:ak,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`⚡ {{ template "formatRate" .burn.costPerHour }} · {{ template "formatEta" .block.etaMinutes }} to 5h · {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{description:`Token throughput for the latest exchange: output, input, and total.`,template:`⇅ out {{ template "formatSpeed" .speed.output }} · in {{ template "formatSpeed" .speed.input }} · tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{description:`A sparkline of recent token throughput.`,template:`⚡ {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`◴ {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${Ca} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`◔ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{description:`The memento plugin's context ceiling for this session: − and + move it by 100K, ∞ lifts it, ↺ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}⌈ ⚠ {{ .memento.error }} {{ action "ceiling.clear" "↺" }}{{ else }}⌈ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "−" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "∞" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{description:`Claude Code's auto-compact window: − and + move it by 100K, ↺ returns it to auto. Clicks type /autocompact into this session.`,template:`{{ if ne .autocompact.error "" }}⇲ ⚠ {{ .autocompact.error }}{{ else }}⇲ {{ if eq .autocompact.window 0 }}auto{{ else }}{{ template "formatTokenCount" .autocompact.applied }}{{ end }}{{ if gt .autocompact.lower 0 }} {{ action (printf "autocompact.%d" .autocompact.lower) "−" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "autocompact.%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "autocompact.auto" "↺" }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`},metrics:{description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} Δ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} ⧖ {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} ⧗ {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} ◆ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} ⌘ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} ☐ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} ☑ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} ⟳ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} ✓ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...Ux(``).actions,...tk.actions,copyDir:{copy:`{{ .current_dir }}`},stepTheme:{set:`theme`,from:`themes`},gitDetail:{set:`git-detail`,cycle:[`collapsed`,`expanded`]},"ceiling.raise":{ceiling:`set`,to:`+100_000`},"ceiling.lower":{ceiling:`set`,to:`-100_000`},"ceiling.off":{ceiling:`set`,to:`off`},"ceiling.clear":{ceiling:`clear`},"autocompact.auto":{slash:Yx(`/autocompact auto`)},...Object.fromEntries(XO.map(e=>[`autocompact.${e}`,{slash:Yx(`/autocompact ${e}`)}]))},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${Ca}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`⎇ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} ◷ {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}×{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}—/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}—{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}—{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},ck=new Set([sk.globals.palette,...Object.values(sk.segments).map(e=>e.palette)].filter(e=>e!==void 0)),lk=zc(Ww(`<default>`,JSON.stringify(sk),ck),sk),uk=x_(lk.presets);function dk(e){return uk.includes(e)}function fk(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const pk=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 mk(e){return((...t)=>pk.run(()=>e(...t)))}const hk=mk(S),gk=mk(x),_k=mk(C);async function vk(e,t){return pk.run(async()=>{let n=null;try{n=await b(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function yk(e,t){return pk.run(async()=>{let n=null;try{n=await b(e,`r`);let{size:r}=await n.stat(),i=Math.max(0,r-t),a=Buffer.alloc(r-i),o=0;for(;o<a.length;){let{bytesRead:e}=await n.read(a,o,a.length-o,i+o);if(e===0)break;o+=e}return J({buf:o===a.length?a:a.subarray(0,o),fromStart:i===0})}catch(t){return t.code===`ENOENT`?Y:X(`readTail ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}const bk=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function xk(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 Sk(e){let t=await Ck(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function Ck(e){for(let t of[65536,1048576]){let n=await yk(e,t);if(n.kind!==`ok`)return n;let r=wk(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function wk(e,t){let n=e.toString(`utf8`).split(`
|
|
177
177
|
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!bk.test(t))continue;let r=xk(t);if(r!=null)return r}return null}function Tk(e,t,n){let r=S_(t(`preset`),e.globals.preset,e.presets),i=T_(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:Fb(a.palette,t(`theme`),i.palette),style:io(a.style,t(`style`),i.style,e.styles),endcaps:so(a.endcaps,t(`endcaps`),i.endcaps),variation:bo(a.variation,t(`variation`),i.variation),separator:a.default_separator??i.default_separator,autoWrap:Do(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:ko(a.padding,t(`padding`),i.padding),charset:fo(a.charset,t(`charset`),i.charset),updateNotice:Oo(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:go(a.colorCompatibility,t(`colorCompatibility`),i.colorCompatibility)}}function Ek(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function Dk(e){return{theme:e.theme,style:e.style,preset:e.preset,variation:e.variation}}function Ok(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:dk(e.preset)},endcaps:{effective:e.endcaps},variation:{effective:e.variation},charset:{effective:e.charset},colorCompatibility:{effective:e.colorCompatibility},autoWrap:{effective:e.autoWrap},padding:{effective:e.padding},updateNotice:{effective:e.updateNotice}}}const kk=10*1e3;function Ak(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 jk(e,t){if(!(t<60))return e*3600/t}function Mk(e,t,n,r){let i=r-t;if(i<50||i>kk)return;let a=n-e;if(!(a<=0))return a*1e3/i}function Nk(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=Mk(t.input,t.atMs,n.input,n.atMs),i=Mk(t.output,t.atMs,n.output,n.atMs),a=Mk(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 Pk(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>kk)continue;let o=Mk(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function Fk(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function Ik(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`,()=>Fk(p.hostname())),i=n(`user`,()=>p.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function Lk(e,t){let n=new Map;for(let[t,r]of Object.entries(e.variables))n.set(t,r);for(let[t,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))n.set(`${t}.${e}`,i);let r=[],i=new Set,a=t=>sv(t,e.helpers).keys(),o=T_(e,t);for(let e of Za){let t=o[e];if(Qa(t))for(let e of a(t))r.push(e)}for(let n of js(w_(e,t).node)){if(n.when)for(let e of a(n.when))r.push(e);if(n.kind!==`segment`)continue;let t=e.segments[n.name];if(t){for(let e of[t.template,t.when,t.bg,t.fg])if(e)for(let t of a(e))r.push(t)}}let s=new Set;for(;r.length>0;){let e=r.pop();for(let t of zk(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 Rk(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=Lk(e,n);return t.set(n,i),i}}function zk(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 Bk(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function Vk(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 Hk(e,t,n,r,i,a,o){let s=e=>Bk(r,e),c=(t.clock??(()=>new Date))().getTime(),l=(e,t,n)=>t?n().catch(t=>X(`${e}: ${String(t)}`)):Promise.resolve(Y),[u,d,f,p,m,h,g,_,v,y,b]=await Promise.all([l(`git`,s(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,Vk(r),e.workspace?.project_dir)),l(`session`,s(`session.cost`)||s(`session.tokens`)||s(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),l(`today`,s(`today`),()=>t.usageStore.getTodayInfo(e)),l(`context`,s(`context`)||s(`autocompact`),()=>t.contextProvider.getContextInfo(e)),l(`metrics`,s(`metrics`)||s(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),l(`activity`,s(`activity`),()=>t.activityProvider.getActivityInfo(e.session_id,e)),l(`tmux`,s(`tmux`),()=>t.tmuxService.getSessionId()),l(`cache`,s(`cache`),()=>Sk(e.transcript_path)),l(`speed`,s(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,c)),l(`memento`,s(`memento`),()=>t.mementoProvider.getCeiling({sessionId:e.session_id,projectDir:e.workspace?.project_dir??``,cwd:n??e.workspace?.current_dir??``})),l(`autocompact`,s(`autocompact`),()=>Promise.resolve(t.autoCompact(RE(LE(a.claudeConfigDir)))))]),x=[],S=e=>{if(e.kind===`failed`){x.push(e.reason);return}return e.kind===`ok`?e.value:void 0},C=Xk(u);x.push(...C.failures);let ee=Ik(a);x.push(...ee.failures);let te=S(d),ne=S(f),re=S(p),w=S(m),ie=S(h),T=S(g),E=S(_),ae=Gk(y);y.kind===`failed`&&x.push(`memento: ${y.reason}`);let oe=Uk(b,re?.maxTokens);b.kind===`failed`&&x.push(`autocompact: ${b.reason}`);for(let e of x)t.log(`warn`,`provider fetch failed: ${e}`);let D=e.rate_limits?.five_hour,se=e.rate_limits?.seven_day,ce=D?Ak(D.used_percentage,D.resets_at,18e6,c):void 0,le=se?Ak(se.used_percentage,se.resets_at,6048e5,c):void 0,ue=te?.session.cost,de=w?.sessionDuration,fe=s(`burn`)&&ue!=null&&de!=null?jk(ue,de):void 0,pe=S(v),me=pe===void 0?void 0:Nk(pe),he=pe===void 0?void 0:Pk(pe),ge=me!==void 0||he!==void 0?{...me,...he!==void 0&&{history:he}}:void 0,O=Yk(process.env.HOME??process.env.USERPROFILE),_e=e.workspace?{...e.workspace,current_dir:Yk(e.workspace.current_dir)??``,project_dir:Yk(e.workspace.project_dir)??``}:e.workspace,ve=te===void 0?void 0:Jk({cost:te.session.cost,tokens:te.session.tokens}),ye=ne===void 0?void 0:{cost:ne.cost,tokens:ne.tokens},be=w===void 0?void 0:Jk({lastResponseTime:w.lastResponseTime,responseTime:w.responseTime,sessionDuration:w.sessionDuration,messageCount:w.messageCount,linesAdded:w.linesAdded,linesRemoved:w.linesRemoved}),xe=ie===void 0?void 0:Kk(ie);return{...e,..._e!==void 0&&{workspace:_e},...O!==void 0&&{home:O},...C.git!==void 0&&{git:C.git},...T!==void 0&&{tmux:{session:T}},host:ee.host,...Ok(i),history:t.history(e.session_id),...o,...ve!==void 0&&{session:ve},...ye!==void 0&&{today:ye},...fe!==void 0&&{burn:{costPerHour:fe}},...ge!==void 0&&{speed:ge},...s(`block`)&&D!==void 0&&{block:{nativeUtilization:D.used_percentage,resetsAt:D.resets_at,...ce!==void 0&&{etaMinutes:ce}}},...se!==void 0&&{weekly:{percentage:se.used_percentage,resetsAt:se.resets_at,...le!==void 0&&{etaMinutes:le}}},...E!==void 0&&{cache:{expiresAt:E}},...re!==void 0&&{context:{totalTokens:re.totalTokens,contextLeft:re.contextLeftPercentage}},...be!==void 0&&{metrics:be},...xe!==void 0&&{activity:xe},...ae!==void 0&&{memento:ae},...oe!==void 0&&{autocompact:oe}}}function Uk(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return ek(e.value,t)}}const Wk=e=>e.trim().split(`
|
|
178
178
|
`).at(-1).trim();function Gk(e){switch(e.kind){case`absent`:return;case`failed`:return{error:Wk(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function Kk(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=qk(e.running),i=qk(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 qk(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function Jk(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 Yk(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function Xk(e){if(e.kind===`absent`)return{failures:[]};if(e.kind===`failed`)return{failures:[e.reason]};let t=e.value,n=[],r=(e,t)=>{if(!(t===void 0||t.kind===`absent`)){if(t.kind===`failed`){n.push(`git.${e}: ${t.reason}`);return}return t.value}},i=r(`aheadBehind`,t.aheadBehind),a=r(`sha`,t.sha),o=r(`operation`,t.operation),s=r(`timeSinceCommit`,t.timeSinceCommit),c=r(`stash`,t.stashCount),l=r(`upstream`,t.upstream),u=r(`repoName`,t.repoName),d=r(`repoUrl`,t.repoUrl),f=t.pullRequest,p={};return f?.kind===`ok`?(p.prNumber=f.value.number,p.prState=f.value.state,p.prUrl=f.value.url):f?.kind===`failed`&&(n.push(`git.pr: ${f.reason}`),p.prError=f.reason),{git:{branch:t.branch,status:t.status,...i!==void 0&&{ahead:i.ahead,behind:i.behind},...t.workingTree!==void 0&&{staged:t.workingTree.staged,unstaged:t.workingTree.unstaged,untracked:t.workingTree.untracked,conflicts:t.workingTree.conflicts},...a!==void 0&&{sha:a},...o!==void 0&&{operation:o},...s!==void 0&&{timeSinceCommit:s},...c!==void 0&&{stash:c},...l!==void 0&&{upstream:l},...u!==void 0&&{repoName:u},...d!==void 0&&{repoUrl:d},...p},failures:n}}const Zk={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,charset:e=>e.charset,colorCompatibility:e=>e.colorCompatibility,autoWrap:e=>e.autoWrap?xo:So,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?xo:So},Qk=Object.entries(bb),$k=new Set(xb.map(e=>e.sessionKey)),eA=()=>!1;function tA(e,t){return Tk(e,e=>$k.has(e)?t(e):null,eA)}function nA(e,t,n,r){return e.flatMap(([e,i])=>{let a=Zk[e](t);return a===null||a===Zk[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function rA(e,t,n){return Zk[n](tA(e,t))}function iA(e,t){let n=tA(e,t),r=Tk(e,()=>null,eA),i=Tk(e,e=>e===bb.preset.sessionKey?n.preset:null,eA);return nA(Qk,n,e=>e===`preset`?r:i,t=>aA(e,n.preset,t.configKey))}function aA(e,t,n){return n in(C_(e.presets,t).globals??{})?Zb(t,n):n}function oA(e,t,n){let r=S_(t(bb.preset.sessionKey),e.globals.preset,e.presets),i=Qb(n);return{key:i?.scope===`globals`?aA(e,r,i.field):n,globals:T_(e,r)}}function sA(e,t){let{preset:n}=tA(e,t);return uA(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:qs(a,s);return c===void 0||Ks(c)===Ks(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function cA(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return x_(e.presets).flatMap(n=>{let i=uA(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 Ws(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:qs(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const lA=new WeakMap;function uA(e,t){let n=lA.get(e)??new Map;lA.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...js(w_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Hs(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 dA(e,t){let n=tA(e,t),r=Tk(e,e=>e===bb.preset.sessionKey?n.preset:null,eA);return{from:n.preset,globals:C_(e.presets,n.preset).globals??{},picks:nA(Qk.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:sA(e,t)}}function fA(e){return{sessionKeys:xb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...yl(e)?uk.map(t=>Zb(t,e)):[]]}}function pA(e){return new Set(xb.map(e=>e.configKey).filter(t=>fA(t).fileKeys.some(t=>gA(e,hA(t)))))}function mA(e,t,n){let r=iA(e,n);return{unsaved:r.length+sA(e,n).length,resettable:new Set([...r.map(e=>e.configKey),...t]).size}}function hA(e){let t=Qb(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return $b(t)}function gA(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&gA(e[n],r)}const _A=Ka(),vA=new Set(_A),yA=new Set(ao),bA=e=>e?vA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${_A.join(`, `)})`}:{ok:!1,reason:`theme name is required`},xA=e=>e?yA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${ao.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},SA=new Set([`1`,`true`]),CA=new Set([`0`,`false`]),wA=zO({endcaps:xA,theme:bA,"toolbar-expanded":e=>SA.has(e)?{ok:!0,value:`1`}:CA.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function TA(){return wA.listKeys()}function EA(e,t){return wA.register(e,t)}function DA(e,t){return wA.validate(e,t)}function OA(e){return wA.rangeParamsFor(e)}function kA(e,t){return`set`in e?`to`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:[e.to]}}]:`from`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:Ub(e.from,t).members}}]:`int`in e?[{key:e.set,spec:{kind:`int`}}]:`cycle`in e?[{key:e.set,spec:{kind:`allow-list`,allowed:e.cycle}}]:[{key:e.set,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function AA(e){let t=new Set(wA.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function jA(e,t,n){let r=wb.get(n);if(r!==void 0)return rA(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 MA(e){let t=Vb(e);return AA(Object.values(e.actions).flatMap(e=>kA(e,t)))}function NA(e){return RO(MA(e))}const PA=`update.dismissed`,FA=`updateNotice`,IA=bb.updateNotice.sessionKey;function LA(e){return e.kind===`source`?e.newer.digest:GE(e.newer)}const RA=e=>`${e.version} [${CO(e.digest)}]`;function zA(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:RA(e.newer),running:RA(e.running),act:`rebuild`,busy:`rebuilding…`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:GE(e.newer),running:GE(e.running),act:`upgrade`,busy:`upgrading…`,command:{bin:`pnpm`,args:[`dlx`,`${qE}@${GE(e.newer)}`,`install`]}}}}const BA={kind:`idle`},VA={kind:`running`};function HA(e,t,n){if(e===null)return[];let r=LA(e);if(!n.enabled||n.dismissed===r)return[];let i=zA(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(`
|
|
179
179
|
`),c=kE([{verb:fE,args:[s]}]),l=t.kind===`running`?dO(`[${i.busy}]`,c):dO(`[${i.act}]`,kE([{verb:SE,args:[n.sessionId]}]));return[{severity:uO,message:s,lines:[[dO(a,c),l,dO(`[dismiss]`,kE([{verb:oE,args:[n.sessionId,PA,r]}])),dO(`[disable]`,kE([{verb:pE,args:[n.sessionId,FA,`false`]},{verb:oE,args:[n.sessionId,IA,`false`]}]))],...o.map(e=>[dO(e,c)])]}]}function UA(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 WA(e){switch(e.kind){case`current`:return[`info`,`build: current ${RA(e.stamp)}`];case`stale`:return[`info`,`build: stale — source ${RA(e.source)}, running ${RA(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function GA(e){switch(e.kind){case`current`:return[`info`,`release: current ${GE(e.installed)}`];case`stale`:return[`info`,`release: stale — latest ${GE(e.latest)}, running ${GE(e.installed)}`];case`ahead`:return[`info`,`release: ahead — running ${GE(e.installed)}, latest ${GE(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function KA(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const qA=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function JA(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=qA(e.stderr)??e.error??qA(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function YA(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=BA,d=null,f=KA(s),p=KA(s),m=()=>UA(c,l);function h(){let e=m(),t=e===null?null:LA(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:EA(PA,{kind:`allow-list`,allowed:[t]})})}function g(){c=DO(t,TO),f(WA(c)),h()}async function _(){l=YE(FE,await JE(qE,a,i)),p(GA(l)),h()}return{arm(){YO(FA,{kind:`allow-list`,allowed:[`false`]}),EA(IA,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>HA(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=zA(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=VA,s(`info`,`apply-update: ${t.act} — ${t.command.bin} ${t.command.args?.join(` `)??``}`),De({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=BA,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=JA(n);u={kind:`failed`,identity:LA(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var XA=class{static CACHE_DIR=Ne();static USAGE_CACHE_DIR=c.join(this.CACHE_DIR,`usage`);static LOCKS_DIR=c.join(this.CACHE_DIR,`locks`);static isLocked(e){let t=c.join(this.LOCKS_DIR,e);if(!r.existsSync(t))return!1;try{let n=r.readFileSync(t,`utf-8`),i=parseInt(n.trim(),10);if(isNaN(i))return O(`Invalid PID in lock file ${e}, removing stale lock`),r.unlinkSync(t),!1;try{return process.kill(i,0),!0}catch(n){return n.code===`ESRCH`?(O(`Removing stale lock file ${e} for dead process ${i}`),r.unlinkSync(t),!1):(O(`Error checking process ${i} for lock ${e}:`,n),!0)}}catch(t){return O(`Error reading lock file ${e}:`,t),!0}}static async acquireLock(e,t=5e3){await this.ensureCacheDirectories();let n=c.join(this.LOCKS_DIR,e),i=Date.now(),a=String(process.pid);for(;Date.now()-i<t;)try{return await r.promises.writeFile(n,a,{flag:`wx`}),O(`Lock acquired for ${e}`),!0}catch(e){if(e.code===`EEXIST`)await D(50);else throw e}return O(`Failed to acquire lock for ${e} within ${t}ms`),!1}static async releaseLock(e){let t=c.join(this.LOCKS_DIR,e);try{await r.promises.unlink(t),O(`Lock released for ${e}`)}catch(t){t.code!==`ENOENT`&&O(`Error releasing lock for ${e}:`,t)}}static async ensureCacheDirectories(){try{await Promise.all([r.promises.mkdir(this.CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.USAGE_CACHE_DIR,{recursive:!0}),r.promises.mkdir(this.LOCKS_DIR,{recursive:!0})])}catch(e){O(`Failed to create cache directories:`,e)}}static createProjectHash(e){return ae(`md5`).update(e).digest(`hex`).substring(0,8)}static async getUsageCache(e,t){await this.ensureCacheDirectories();let n=c.join(this.USAGE_CACHE_DIR,`${e}.json`),i=`${e}.usage.lock`;for(let a=0;a<3;a++){if(this.isLocked(i)){O(`Cache for ${e} is locked, waiting...`),await D(75);continue}try{let i=await r.promises.readFile(n,`utf-8`),a=JSON.parse(i);return!t||a.timestamp>=t?(O(`[CACHE-HIT] ${e} disk cache: found`),this.deserializeDates(a.data)):(O(`${e} cache outdated: cache=${a.timestamp}, latest=${t}`),null)}catch(t){if(t.code===`ENOENT`)return O(`No shared ${e} usage cache found`),null;O(`Attempt ${a+1} failed to read ${e} cache: ${t.message}. Retrying...`),await D(75)}}return O(`Failed to read ${e} cache after 3 attempts.`),null}static deserializeDates(e){return Array.isArray(e)?e.map(e=>({...e,timestamp:new Date(e.timestamp)})):e}static async setUsageCache(e,t,n){let i=`${e}.usage.lock`;if(!await this.acquireLock(i)){O(`Could not acquire lock to set usage cache for ${e}`);return}try{await this.ensureCacheDirectories();let i=c.join(this.USAGE_CACHE_DIR,`${e}.json`),a=JSON.stringify({data:t,timestamp:n||Date.now()});await r.promises.writeFile(i,a,`utf-8`),O(`[CACHE-SET] ${e} disk cache stored`)}catch(t){O(`Failed to save ${e} usage cache:`,t)}finally{await this.releaseLock(i)}}};const ZA={"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 QA=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 XA.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await XA.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new re(this.GITHUB_PRICING_URL),n=oe({hostname:t.hostname,path:t.pathname,headers:{"User-Agent":`cc-candybar`,"Cache-Control":`no-cache`},timeout:5e3},t=>{if(t.statusCode!==200){O(`HTTP ${t.statusCode}: ${t.statusMessage}`),e(null);return}let r=``,i=0;t.on(`data`,t=>{if(i+=t.length,i>1048576){O(`Response too large`),n.destroy(),e(null);return}r+=t}),t.on(`end`,()=>{try{let t=JSON.parse(r),n=t._meta,i={};for(let[e,n]of Object.entries(t))e!==`_meta`&&(i[e]=n);this.validatePricingData(i)?(O(`Fetched fresh pricing from GitHub for ${Object.keys(i).length} models`),O(`Pricing last updated: ${n?.updated||`unknown`}`),e(i)):(O(`Invalid pricing data structure`),e(null))}catch(t){O(`Failed to parse JSON:`,t),e(null)}}),t.on(`error`,t=>{O(`Response error:`,t),e(null)})});n.on(`error`,t=>{O(`Request error:`,t),e(null)}),n.on(`timeout`,()=>{O(`Request timeout`),n.destroy(),e(null)}),n.end()})}static async getCurrentPricing(){if(this.executionCache!==null)return O(`[CACHE-HIT] Pricing execution cache: ${Object.keys(this.executionCache).length} models`),this.executionCache;let e=await this.loadDiskCache();if(e)return O(`[CACHE-HIT] Pricing disk cache: ${Object.keys(e).length} models`),this.executionCache=e,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(e).length} models`),e;let t=await this.fetchPricingData();return t?(await this.saveDiskCache(t),O(`[CACHE-SET] Pricing disk cache stored: ${Object.keys(t).length} models`),this.executionCache=t,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(t).length} models`),t):(O(`[CACHE-FALLBACK] Using offline pricing data: ${Object.keys(ZA).length} models`),this.executionCache=ZA,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(ZA).length} models`),ZA)}static validatePricingData(e){if(!e||typeof e!=`object`)return!1;for(let[,t]of Object.entries(e)){if(!t||typeof t!=`object`)return!1;let e=t;if(typeof e.input!=`number`||typeof e.output!=`number`||typeof e.cache_read!=`number`)return!1}return!0}static async getModelPricing(e){if(this.modelPricingCache.has(e))return O(`[CACHE-HIT] Model pricing cache: ${e}`),this.modelPricingCache.get(e);let t=await this.getCurrentPricing(),n;return n=t[e]?t[e]:this.fuzzyMatchModel(e,t),this.modelPricingCache.set(e,n),O(`[CACHE-SET] Model pricing cache: ${e}`),n}static fuzzyMatchModel(e,t){let n=e.toLowerCase();for(let[e,r]of Object.entries(t))if(e.toLowerCase()===n)return r;for(let{pattern:e,fallback:r}of[{pattern:[`opus-4-6`,`claude-opus-4-6`],fallback:`claude-opus-4-6-20260205`},{pattern:[`opus-4-5`,`claude-opus-4-5`],fallback:`claude-opus-4-5-20251101`},{pattern:[`opus-4-1`,`claude-opus-4-1`],fallback:`claude-opus-4-1-20250805`},{pattern:[`opus-4`,`claude-opus-4`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet-4-6`,`sonnet-4.6`,`claude-sonnet-4-6`],fallback:`claude-sonnet-4-6`},{pattern:[`sonnet-4.5`,`4-5-sonnet`,`sonnet-4-5`],fallback:`claude-sonnet-4-5-20250929`},{pattern:[`sonnet-4`,`claude-sonnet-4`],fallback:`claude-sonnet-4-20250514`},{pattern:[`haiku-4.5`,`4-5-haiku`,`haiku-4-5`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`haiku`],fallback:`claude-haiku-4-5-20251001`},{pattern:[`opus`],fallback:`claude-opus-4-20250514`},{pattern:[`sonnet`],fallback:`claude-sonnet-4-5-20250929`}])if(e.some(e=>n.includes(e))&&t[r])return t[r];return t[`claude-sonnet-4-5-20250929`]||{name:`${e} (Unknown Model)`,input:3,cache_write_5m:3.75,cache_write_1h:6,cache_read:.3,output:15}}static async calculateCostForEntry(e){let t=e.message?.usage;if(!t)return 0;let n=this.extractModelId(e),r=await this.getModelPricing(n),i=t.input_tokens||0,a=t.output_tokens||0,o=t.cache_creation_input_tokens||0,s=t.cache_read_input_tokens||0,c=i/1e6*r.input,l=a/1e6*r.output,u=s/1e6*r.cache_read,d=o/1e6*r.cache_write_5m;return c+l+d+u}static extractModelId(e){if(e.model&&typeof e.model==`string`)return e.model;let t=e.message;if(t?.model){let e=t.model;if(typeof e==`string`)return e;let n=e;return(typeof n?.id==`string`?n.id:null)||`claude-sonnet-4-5-20250929`}return e.model_id&&typeof e.model_id==`string`?e.model_id:`claude-sonnet-4-5-20250929`}};const $A=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function ej(e){if(typeof e==`string`)return $A.exec(e)?.[1]}function tj(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 nj(e){let t=e.message?.content,n=e.type===`user`,r=[],i=[],a,o;if(typeof t==`string`)o=t;else if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;switch(t.type){case`tool_use`:{let{id:e,name:n}=t;if(typeof e!=`string`||typeof n!=`string`)break;r.push({id:e,name:n}),n===`TodoWrite`&&(a=tj(t.input)??a);break}case`tool_result`:{let e=t.tool_use_id;typeof e==`string`&&i.push(e);break}case`text`:o??=t.text;break;default:break}}let s=n?ej(o):void 0;if(!(r.length===0&&i.length===0&&a===void 0&&s===void 0))return{...r.length>0&&{started:r},...i.length>0&&{finished:i},...a!==void 0&&{todos:a},...s!==void 0&&{command:s}}}function rj(){let e=[],t=process.env.CLAUDE_CONFIG_DIR;if(t&&t.split(`,`).forEach(t=>{let n=t.trim();a(n)&&e.push(n)}),e.length===0){let t=m(),n=f(t,`.config`,`claude`),r=f(t,`.claude`);a(n)&&e.push(n),a(r)&&e.push(r)}return e}async function ij(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await hk(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=f(e,r.name);t.push(n)}}catch(t){O(`Failed to read projects directory ${e}:`,t)}}return t}async function aj(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await hk(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=f(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await gk(t,`utf-8`)).split(`
|
|
180
180
|
`)[0];n&&JSON.parse(n).sessionId===e&&r.push(t)}catch{O(`Failed to check agent file ${t}`)}}}catch(e){O(`Failed to read subagents directory ${i}:`,e)}return r}function oj(e){let t=e.type||e.message?.role||e.message?.type,n=e.type===`user`&&e.message?.firstContentType===`tool_result`;return t===`user`&&!n}const sj=new Map;async function cj(e){try{let t=await _k(e),n=t.size,r=sj.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),sj.delete(e),sj.set(e,r),r.entries;let i;return n>1048576?(O(`Using streaming parser for large file ${e} (${Math.round(n/1024)}KB)`),i=await pj(e)):i=await dj(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(sj.delete(e),sj.size>=16&&sj.delete(sj.keys().next().value),sj.set(e,{mtime:t.mtimeMs,size:n,entries:i}),i)}catch(t){if(t.code===`ENOENT`)return O(`Transcript not present yet: ${e}`),[];throw t}}function lj(e){if(!e.timestamp)return null;let t=e.message,n=t?.usage,r=t?.content,i=Array.isArray(r)&&typeof r[0]==`object`&&r[0]?r[0]:void 0;return{timestamp:new Date(e.timestamp),type:typeof e.type==`string`?e.type:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n,role:typeof t.role==`string`?t.role:void 0,type:typeof t.type==`string`?t.type:void 0,firstContentType:typeof i?.type==`string`?i.type:void 0}:void 0,costUSD:typeof e.costUSD==`number`?e.costUSD:void 0,isSidechain:e.isSidechain===!0,activity:nj(e),raw:{model:typeof e.model==`string`?e.model:void 0,message:t?{id:typeof t.id==`string`?t.id:void 0,model:typeof t.model==`string`?t.model:void 0,usage:n}:void 0,requestId:typeof e.requestId==`string`?e.requestId:void 0}}}function uj(e){let t=[];for(let n of e.split(`
|
|
181
|
-
`))if(n.trim())try{let e=lj(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function dj(e){return uj(await gk(e,`utf-8`))}async function fj(e,t){let n=await vk(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:uj(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function pj(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=se({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=lj(JSON.parse(t));e&&r.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{O(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{O(`File stream error for ${e}:`,t),n(t)})})}var mj=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 hj(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 gj={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},_j={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function vj(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function yj(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function bj(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function xj(e,t,n,r){let i=vj(new Date(yj())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:bj(),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 QA.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=vj(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...gj};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 Sj(e){let t=0,n=0,r=bj(),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)??{...gj};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:_j,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 Cj(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 wj=class{entries=new Map;flight=new mj;seeded=new Map;speedRings=new Map;speedFlight=new mj;maxEntries;staleAgeMs;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.maxEntries=e.maxEntries??256,this.staleAgeMs=e.staleAgeMs??864e5;let t=e.sweepIntervalMs??3e5;t>0&&(this.sweepTimer=setInterval(()=>this.sweepStale(),t),this.sweepTimer.unref())}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,sweeps:this.sweeps,seeds:this.seeds}}async getUsageInfo(e,t){let n=await this.ingest(e,t?.transcript_path);if(n.kind===`failed`)return n;let r=n.kind===`ok`?n.value.sessionInfo:_j,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e){let t=vj(new Date);try{await this.ensureSeeded(t)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let n=await this.ingest(e?.session_id??``,e?.transcript_path);if(n.kind===`failed`)return n;let r={...gj},i=!1;for(let e of this.entries.values()){i||=e.days.has(t);let n=e.days.get(t)??gj;r.cost+=n.cost,r.input+=n.input,r.output+=n.output,r.cacheCreation+=n.cacheCreation,r.cacheRead+=n.cacheRead}return i?J({cost:r.cost,tokens:r.input+r.output+r.cacheCreation+r.cacheRead,tokenBreakdown:{input:r.input,output:r.output,cacheCreation:r.cacheCreation,cacheRead:r.cacheRead},date:t}):Y}async observeSpeed(e,t,n){let r=fk(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=hj(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??fk(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 aj(e,u(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await fj(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 xj(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...Sj(i),mainMtime:a})}ensureSeeded(e){let t=this.seeded.get(e);if(t)return t;this.seeded.clear();let n=this.seed(e);return this.seeded.set(e,n),n.catch(()=>{this.seeded.get(e)===n&&this.seeded.delete(e)}),n}async seed(e){let t=yj(),n=await ij(rj()),r=[];for(let e of n){let n;try{n=await hk(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await _k(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await Cj(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&Q(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,Q(`info`,`usageStore seed sessions=${r.length}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,Q(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),Q(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}};function Tj(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function Ej(e,t){let n=U.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function Dj(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function Oj({
|
|
182
|
-
`);if(i.length>1)return n;let a=Math.max(0,t.width-jj(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:i},a)=>{let c=o+(a===r.length-1?s:0),{text:l}=e[t];Dj(l,l.cellLength+c,i),n[t]=Oj(e[t])}),n}function Nj(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=Pj(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(Ij(a.style).link){i();let e=Pj([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function Pj(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>Fj(e,t)):e,r=U.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function Fj(e,t){let n=e.copy();return n.style=t.add(Ij(e.style)),n}function Ij(e){return e instanceof V?e:V.parse(e)}var Lj=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Rj(e,t,n,r,i){let{palette:a,tint:o}=e,s=zj(n,i),c=s===void 0?o:Bj(a,s,`bg`);e.bg=c;let l=zj(r,i),u=l===void 0?wa(a,c,t):Bj(a,l,`fg`);return new V({bgcolor:hn.fromRgba(c),color:hn.fromRgba(u)})}function zj(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Bj(e,t,n){try{return Yn(e,t)}catch(e){throw e instanceof Kn?new Lj(t,n,e.message):e}}function Vj(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,Hj(e,t,o,n,r,i));return i}function Hj(e,t,n,r,i,a){if(`set`in n){let e=r.get(n.set)??n.set;if(`to`in n)return{kind:`set-literal`,key:n.set,value:n.to,stateVar:e};if(`from`in n){let t=Ub(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Sb.get(n.persist)??n.persist;if(`to`in n)return{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e};if(`from`in n){let t=Ub(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=Ub(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:Wj(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:Wj(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:uC(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:Wj(e,n.name,t)};let[o,...s]=n.do.map(e=>{let n=a.get(e);if(n===void 0)throw Error(`action "${t}" fires "${e}", which is not declared in this config`);return n});return{kind:`do`,head:o,rest:s}}function Uj(e){return e.kind===`do`?Uj(e.head):e}function Wj(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function Gj(e,t){return e.has(t)?bv(e.read(t)):``}function Kj(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function qj(e,t,n,r){let i=new U(e,{style:V.combine([r,new V({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function Jj(e,t){return Math.max(e.members.indexOf(Gj(t,e.stateVar)),0)}function Yj(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=Gj(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=Gj(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=Gj(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(Jj(e,r)+1)%e.members.length];return{effects:[{verb:oE,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:sE,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:cE,args:[Kj(e.text,fy(r))]}],active:!1};case`open`:return{effects:[{verb:lE,args:[Kj(e.target,fy(r))]}],active:!1};case`persist-literal`:{let t=Gj(r,e.stateVar);return{effects:[{verb:pE,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=Gj(r,e.stateVar);return{effects:[{verb:pE,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(Jj(e,r)+1)%e.members.length];return{effects:[{verb:pE,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:mE,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:vE,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:bE,args:[i]}],active:!1};case`redo`:return{effects:[{verb:xE,args:[i]}],active:!1};case`save`:return{effects:[{verb:hE,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:gE,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:_E,args:[i,Kj(e.name,fy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:CE,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:wE,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:TE,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:EE,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:yE,args:[i,e.key,OO(e.op)]}],active:!1};case`do`:{let a=Yj(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>Yj(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:yE,args:[i,e.key,OO(r)]}],active:!1}}}}function Xj(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:Kc(`action "${e}"`,n,t.members.length,Jj(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 Zj(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}=Xj(e,Uj(r),t,i),{effects:s,active:c}=Yj(r,a,o,i,Gj(i,`session.id`));return qj(a,kE(s),c)}function Qj(e){return{action:{fn:(t,...n)=>Zj(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function $j(e,t){return qj(`✕`,kE([{verb:oE,args:[Gj(e,`session.id`),t,Uc]}]),!1)}function eM(e,t,n){return new V({bgcolor:hn.fromRgba(t),color:hn.fromRgba(wa(e,t,n))})}function tM(e,t,n){return eM(e.palette,La(e.palette,e.disclosure,[t],n),n)}function nM(e,t,n,r,i){return r===void 0?n=>tM(e,{...n,distribution:t},i):(e,t)=>rM(r(t,n),i)}function rM(e,t){let n=ma(e,`background`);return new V({bgcolor:hn.fromRgba(n),color:hn.fromRgba(rr(ma(e,`primary`),n,4.5,t))})}function iM(e){return{current:null,drawnAt:e}}function aM(e,t,n,r,i,a){let o={segName:t,placementId:n,palette:r,disclosure:i,tint:a,bg:void 0,drops:[]};return e.current=o,o}function oM(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 sM(e){return new U(e).cellLength}function cM(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function lM(e){return Math.max(1,cM(e)-(sM(`✕`)+2*e.padding+e.seamCols))}function uM(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 dM(e,t){let n=[];for(let t of e)n.length>0&&n.push(new U(` `)),n.push(t);let r=U.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function fM(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 pM(e,t,n){let r=e.compiled.get(t),i=r&&Uj(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 mM(e,t,n,r,i,a,o){let s=pM(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=Gj(l,`session.id`),d=`stateVar`in s?Gj(l,s.stateVar):void 0,f=s.options.map(sM),p=i?cM(a):1/0,m=sM(`✕`)+1,h=sM(`←`)+1+sM(`→`)+1,g=uM(f,p,m),_=g.length>1?uM(f,p,m+h):g,v=parseInt(Gj(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>kE([{verb:oE,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=kE([{verb:oE,args:[u,...S]}]),ee=r?[{verb:oE,args:[u,...S]}]:[],te=e=>kE([...Yj(c,e,e,l,u).effects,...ee]),ne=[qj(`✕`,C,!1)];y>0&&ne.push(qj(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(qj(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(qj(`→`,x(y+1),!1)),dM(ne,i)}function hM(e,t){return{picker:{fn:(n,r,i,a,...o)=>{oy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=fM(e,r,`set-int`,`an int action ({ set, int: true })`);return mM(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,nM(oM(t,`{{ picker }}`),ca(void 0),e,pM(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function gM(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+sM(e(-(s+1)))+1+sM(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function _M(e,t,n,r,i){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let a=n.store;if(!a.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let o=n.compiled.get(e),s=Gj(a,`session.id`),{options:c}=t,l=c.length,u=Gj(a,t.stateVar),d=Math.max(c.indexOf(u),0),f=e=>((d+e)%l+l)%l,p=e=>c[f(e)],m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=kE(Yj(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>qj(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=gM(p,l,sM(`◀`)+1+sM(p(0))+1+sM(`▶`),lM(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return dM([...v(-1).reverse(),qj(`◀`,h(-1),!1),g(0),qj(`▶`,h(1),!1),...v(1)],!0)}function vM(e,t){return{carousel:{fn:(n,r,...i)=>{if(oy(`carousel "${n}"`,[`neighbours`],i),r!==void 0&&r<0)throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(r)}`);let a=r??1/0,o=pM(e,n,`carousel`);return _M(n,o,e,nM(oM(t,`{{ carousel }}`),ca(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const yM=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function bM(e,t,n){let r=Aa(e,{hue:ea,depth:0},n);return[na(t).map((t,n)=>({text:yM[n%yM.length],colour:ha(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ma(e,`warning`)},{text:`error`,colour:ma(e,`error`)}]]}function xM(e,t,n,r){let i=bM(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new U(` ${t} `,{style:eM(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new U(e)),a.push(t)}let s=U.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function SM(e,t){return{themePreview:{fn:()=>xM(e.palette,e.variation,t.drawnAt(),lM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const CM=e=>e.slice(e.lastIndexOf(`.`)+1),wM=(e,t)=>{let n=new U(CM(e));return n.truncate(t,{marker:`…`}),n.plain};function TM(e,t){let n=e.map(e=>e.map(({name:e})=>sM(CM(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 EM(e,t,n,r){let i=TM(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new U(` ${wM(s,i)} `,{style:eM(l,Va(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=U.fromFragments(a.flatMap((e,t)=>t===0?e:[new U(`
|
|
183
|
-
`),...e]));return o.overflow=`ignore`,o.end=``,o}function
|
|
181
|
+
`))if(n.trim())try{let e=lj(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function dj(e){return uj(await gk(e,`utf-8`))}async function fj(e,t){let n=await vk(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:uj(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function pj(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=se({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=lj(JSON.parse(t));e&&r.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`)}}),o.on(`close`,()=>{t(r)}),o.on(`error`,t=>{O(`Streaming parser error for ${e}:`,t),n(t)}),a.on(`error`,t=>{O(`File stream error for ${e}:`,t),n(t)})})}var mj=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 hj(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 gj={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},_j={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function vj(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function yj(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function bj(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function xj(e,t,n,r){let i=vj(new Date(yj())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:bj(),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 QA.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=vj(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...gj};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 Sj(e){let t=0,n=0,r=bj(),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)??{...gj};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:_j,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 Cj(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 wj=class{entries=new Map;flight=new mj;seeded=new Map;speedRings=new Map;speedFlight=new mj;maxEntries;staleAgeMs;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.maxEntries=e.maxEntries??256,this.staleAgeMs=e.staleAgeMs??864e5;let t=e.sweepIntervalMs??3e5;t>0&&(this.sweepTimer=setInterval(()=>this.sweepStale(),t),this.sweepTimer.unref())}getStats(){return{size:this.entries.size,hits:this.hits,misses:this.misses,sweeps:this.sweeps,seeds:this.seeds}}async getUsageInfo(e,t){let n=await this.ingest(e,t?.transcript_path);if(n.kind===`failed`)return n;let r=n.kind===`ok`?n.value.sessionInfo:_j,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e){let t=vj(new Date);try{await this.ensureSeeded(t)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let n=await this.ingest(e?.session_id??``,e?.transcript_path);if(n.kind===`failed`)return n;let r={...gj},i=!1;for(let e of this.entries.values()){i||=e.days.has(t);let n=e.days.get(t)??gj;r.cost+=n.cost,r.input+=n.input,r.output+=n.output,r.cacheCreation+=n.cacheCreation,r.cacheRead+=n.cacheRead}return i?J({cost:r.cost,tokens:r.input+r.output+r.cacheCreation+r.cacheRead,tokenBreakdown:{input:r.input,output:r.output,cacheCreation:r.cacheCreation,cacheRead:r.cacheRead},date:t}):Y}async observeSpeed(e,t,n){let r=fk(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=hj(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??fk(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 aj(e,u(t),n===void 0?void 0:new Set(n.files.keys())),i=new Map,a=0;for(let e of[t,...r]){let r=n?.files.get(e),o=await fj(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 xj(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...Sj(i),mainMtime:a})}ensureSeeded(e){let t=this.seeded.get(e);if(t)return t;this.seeded.clear();let n=this.seed(e);return this.seeded.set(e,n),n.catch(()=>{this.seeded.get(e)===n&&this.seeded.delete(e)}),n}async seed(e){let t=yj(),n=await ij(rj()),r=[];for(let e of n){let n;try{n=await hk(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await _k(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await Cj(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&Q(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,Q(`info`,`usageStore seed sessions=${r.length}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,Q(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),Q(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}};function Tj(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function Ej(e,t){let n=U.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function Dj(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`…`}):e.cellLength<t&&e.align(n.justify,t)}function Oj({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function kj(e){let t=Oj(e);if(t.length===1)return e.text;let n=Ej(t);return n.style=e.text.style,n}function Aj(e,t){let{width:n,justify:r,truncate:i,baseStyle:a,padding:o,lead:s=[],trail:c=[]}=t;if(e.length===0)return[];let l=Ej(e,a).pad(o),u=new U(` `.repeat(o)),d={...s.length>0&&{lead:Ej([u,...s],a)},...c.length>0&&{trail:Ej([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(Dj(l,n,f),[{text:l,...d}])}const jj=RegExp(`\\x1b\\[[0-9;]*m|${gi.source}`,`g`);function Mj(e){return M(e.replace(jj,``))}function Nj(e,t){let n=e.map(kj),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=oO(n,t).split(`
|
|
182
|
+
`);if(i.length>1)return n;let a=Math.max(0,t.width-Mj(i[0]??``)),o=Math.floor(a/r.length),s=a-o*r.length;return r.forEach(({at:t,how:i},a)=>{let c=o+(a===r.length-1?s:0),{text:l}=e[t];Dj(l,l.cellLength+c,i),n[t]=kj(e[t])}),n}function Pj(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=Fj(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(Lj(a.style).link){i();let e=Fj([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function Fj(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>Ij(e,t)):e,r=U.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function Ij(e,t){let n=e.copy();return n.style=t.add(Lj(e.style)),n}function Lj(e){return e instanceof V?e:V.parse(e)}var Rj=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function zj(e,t,n,r,i){let{palette:a,tint:o}=e,s=Bj(n,i),c=s===void 0?o:Vj(a,s,`bg`);e.bg=c;let l=Bj(r,i),u=l===void 0?wa(a,c,t):Vj(a,l,`fg`);return new V({bgcolor:hn.fromRgba(c),color:hn.fromRgba(u)})}function Bj(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function Vj(e,t,n){try{return Yn(e,t)}catch(e){throw e instanceof Kn?new Rj(t,n,e.message):e}}function Hj(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,Uj(e,t,o,n,r,i));return i}function Uj(e,t,n,r,i,a){if(`set`in n){let e=r.get(n.set)??n.set;if(`to`in n)return{kind:`set-literal`,key:n.set,value:n.to,stateVar:e};if(`from`in n){let t=Ub(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Sb.get(n.persist)??n.persist;if(`to`in n)return{kind:`persist-literal`,key:n.persist,value:n.to,stateVar:e};if(`from`in n){let t=Ub(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=Ub(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:Gj(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:Gj(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:uC(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:Gj(e,n.name,t)};let[o,...s]=n.do.map(e=>{let n=a.get(e);if(n===void 0)throw Error(`action "${t}" fires "${e}", which is not declared in this config`);return n});return{kind:`do`,head:o,rest:s}}function Wj(e){return e.kind===`do`?Wj(e.head):e}function Gj(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function Kj(e,t){return e.has(t)?bv(e.read(t)):``}function qj(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function Jj(e,t,n,r){let i=new U(e,{style:V.combine([r,new V({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function Yj(e,t){return Math.max(e.members.indexOf(Kj(t,e.stateVar)),0)}function Xj(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=Kj(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=Kj(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=Kj(r,e.stateVar);return{effects:[{verb:oE,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(Yj(e,r)+1)%e.members.length];return{effects:[{verb:oE,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:sE,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:cE,args:[qj(e.text,fy(r))]}],active:!1};case`open`:return{effects:[{verb:lE,args:[qj(e.target,fy(r))]}],active:!1};case`persist-literal`:{let t=Kj(r,e.stateVar);return{effects:[{verb:pE,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=Kj(r,e.stateVar);return{effects:[{verb:pE,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(Yj(e,r)+1)%e.members.length];return{effects:[{verb:pE,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:mE,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:vE,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:bE,args:[i]}],active:!1};case`redo`:return{effects:[{verb:xE,args:[i]}],active:!1};case`save`:return{effects:[{verb:hE,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:gE,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:_E,args:[i,qj(e.name,fy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:CE,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:wE,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:TE,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:EE,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:yE,args:[i,e.key,OO(e.op)]}],active:!1};case`do`:{let a=Xj(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>Xj(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:yE,args:[i,e.key,OO(r)]}],active:!1}}}}function Zj(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:Kc(`action "${e}"`,n,t.members.length,Yj(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 Qj(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}=Zj(e,Wj(r),t,i),{effects:s,active:c}=Xj(r,a,o,i,Kj(i,`session.id`));return Jj(a,kE(s),c)}function $j(e){return{action:{fn:(t,...n)=>Qj(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function eM(e,t){return Jj(`✕`,kE([{verb:oE,args:[Kj(e,`session.id`),t,Uc]}]),!1)}function tM(e,t,n){return new V({bgcolor:hn.fromRgba(t),color:hn.fromRgba(wa(e,t,n))})}function nM(e,t,n){return tM(e.palette,La(e.palette,e.disclosure,[t],n),n)}function rM(e,t,n,r,i){return r===void 0?n=>nM(e,{...n,distribution:t},i):(e,t)=>iM(r(t,n),i)}function iM(e,t){let n=ma(e,`background`);return new V({bgcolor:hn.fromRgba(n),color:hn.fromRgba(rr(ma(e,`primary`),n,4.5,t))})}function aM(e){return{current:null,drawnAt:e}}function oM(e,t,n,r,i,a){let o={segName:t,placementId:n,palette:r,disclosure:i,tint:a,bg:void 0,drops:[]};return e.current=o,o}function sM(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 cM(e){return new U(e).cellLength}function lM(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function uM(e){return Math.max(1,lM(e)-(cM(`✕`)+2*e.padding+e.seamCols))}function dM(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 fM(e,t){let n=[];for(let t of e)n.length>0&&n.push(new U(` `)),n.push(t);let r=U.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function pM(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 mM(e,t,n){let r=e.compiled.get(t),i=r&&Wj(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 hM(e,t,n,r,i,a,o){let s=mM(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=Kj(l,`session.id`),d=`stateVar`in s?Kj(l,s.stateVar):void 0,f=s.options.map(cM),p=i?lM(a):1/0,m=cM(`✕`)+1,h=cM(`←`)+1+cM(`→`)+1,g=dM(f,p,m),_=g.length>1?dM(f,p,m+h):g,v=parseInt(Kj(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>kE([{verb:oE,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=kE([{verb:oE,args:[u,...S]}]),ee=r?[{verb:oE,args:[u,...S]}]:[],te=e=>kE([...Xj(c,e,e,l,u).effects,...ee]),ne=[Jj(`✕`,C,!1)];y>0&&ne.push(Jj(`←`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(Jj(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(Jj(`→`,x(y+1),!1)),fM(ne,i)}function gM(e,t){return{picker:{fn:(n,r,i,a,...o)=>{oy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=pM(e,r,`set-int`,`an int action ({ set, int: true })`);return hM(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,rM(sM(t,`{{ picker }}`),ca(void 0),e,mM(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function _M(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+cM(e(-(s+1)))+1+cM(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function vM(e,t,n,r,i){if(!(`stateVar`in t))throw Error(`carousel references action "${e}", which inserts a segment and holds no current value to centre on — a carousel needs a { set, from } or { persist, from } action`);let a=n.store;if(!a.has(t.stateVar))throw Error(`carousel references action "${e}", whose key "${t.stateVar}" no variable reads back, so there is no current value to centre on — declare { kind: "state", key: "${t.stateVar}" } among the variables`);let o=n.compiled.get(e),s=Kj(a,`session.id`),{options:c}=t,l=c.length,u=Kj(a,t.stateVar),d=Math.max(c.indexOf(u),0),f=e=>((d+e)%l+l)%l,p=e=>c[f(e)],m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=kE(Xj(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>Jj(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=_M(p,l,cM(`◀`)+1+cM(p(0))+1+cM(`▶`),uM(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return fM([...v(-1).reverse(),Jj(`◀`,h(-1),!1),g(0),Jj(`▶`,h(1),!1),...v(1)],!0)}function yM(e,t){return{carousel:{fn:(n,r,...i)=>{if(oy(`carousel "${n}"`,[`neighbours`],i),r!==void 0&&r<0)throw Error(`carousel "${n}": neighbours must be a whole number ≥ 0 (0 shows only ◀ CURRENT ▶), got ${String(r)}`);let a=r??1/0,o=mM(e,n,`carousel`);return vM(n,o,e,rM(sM(t,`{{ carousel }}`),ca(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const bM=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function xM(e,t,n){let r=Aa(e,{hue:ea,depth:0},n);return[na(t).map((t,n)=>({text:bM[n%bM.length],colour:ha(e,t)})),[{text:`▾ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ma(e,`warning`)},{text:`error`,colour:ma(e,`error`)}]]}function SM(e,t,n,r){let i=xM(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new U(` ${t} `,{style:tM(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new U(e)),a.push(t)}let s=U.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function CM(e,t){return{themePreview:{fn:()=>SM(e.palette,e.variation,t.drawnAt(),uM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const wM=e=>e.slice(e.lastIndexOf(`.`)+1),TM=(e,t)=>{let n=new U(wM(e));return n.truncate(t,{marker:`…`}),n.plain};function EM(e,t){let n=e.map(e=>e.map(({name:e})=>cM(wM(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 DM(e,t,n,r){let i=EM(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new U(` ${TM(s,i)} `,{style:tM(l,Va(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=U.fromFragments(a.flatMap((e,t)=>t===0?e:[new U(`
|
|
183
|
+
`),...e]));return o.overflow=`ignore`,o.end=``,o}function OM(e,t){return{layoutPreview:{fn:()=>DM(e.layout(),e.variation,t.drawnAt(),uM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function kM(e,t,n,r){let i=sM(r.activeSegment,`{{ menu }}`),a=r.action,o=d_(i.placementId,e,n.key),s=m_(o),c=u_(e),l=Kj(a.store,o)===c,u=Kj(a.store,`session.id`),d=l?Uc:c,f=Jj(Kc(`{{ menu "${e}" }}`,t,2,+!!l),kE([{verb:oE,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?[hM(e,{key:s,stateVar:s},[[o,Uc],[s,`0`]],n.closeOnPick,n.paged,a,rM(i,n.distribution,a,mM(a,e,`menu`).paletteOf,r.activeSegment.drawnAt()))]:[]),f}const AM=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function jM(e,t){let n=t[t.length-1],r=AM(n)?n:void 0,i=r===void 0?t:t.slice(0,-1),a=i.findIndex(e=>typeof e!=`string`);if(a!==-1)throw Error(`{{ menu "${e}" }} display #${a+1} is not text (${JSON.stringify(i[a])}) — a menu binds its trigger text, then an optional trailing (dict …) of options`);return{displays:i,options:v_(r??{})}}function MM(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=jM(t,n);return kM(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function NM(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=PM(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 U(t?i:a,{style:l===void 0?void 0:new V({color:l})}))}let l=U.fromFragments(c);return l.end=``,l.overflow=`ignore`,l}function PM(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 FM(e){let t={fn:(()=>{let t=sM(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:(()=>sM(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=Kv(()=>sM(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...IM(s)];return NM({value:e,max:t,width:n,filled:i,empty:a,colourAt:c===void 0?void 0:e=>String(r.ramp.fn(e,...c))})}),argTypes:[`float`,`float`,`int`,`string`,`string`,`string`],arity:{kind:`variadic`},returnType:`T`};return{...r,bgOf:t,tint:n,gauge:i}}function IM(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 LM(e){let t=[],n=[];for(let r of e){if(!r.contains(`
|
|
184
184
|
`)){n.push(r);continue}let e=r.split(`
|
|
185
|
-
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}const LM=({text:e,trail:t})=>t===void 0?[e]:[e,t];function RM(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,...zM(e,r)]}function zM(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 BM(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:RM(e.direction,e.children.map((t,i)=>n(t,[...r,VM(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function VM(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Es[e.direction]}}const HM={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:ca(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ms(t.path,n)))}},render(e,t){return RM(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,VM(e,r))))}},UM={drop:e=>e.place,above:()=>`above`},WM={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:Ds(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Yc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Ns(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render(e,t){let n=t.lookupSegment(e.name);if(!n)throw Error(`Layout segment "${e.name}" has no matching segment`);let{seg:r,compiled:i}=n;if(!t.visible)return[];let a=my(t.scope,e.settings);try{if(!Tj(i.when,a))return[];let n=Ab(e.settings.theme,t.palette),{styles:o,fragments:s,trail:c,drops:l}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,trail:e.trail}),u=e.opens!==void 0&&Tj(e.opens.open,t.scope),d=l.length>0||u?o.trigger:o.closed,f={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:d,padding:t.padding},p=e.opens,m=p===void 0?[]:t.renderBody(p.body,u,o.disclosure).map(e=>({...e,place:UM[p.placement](e)})),h=e.opens!==void 0&&m.some(e=>e.band===`own`)?kj(Nj([t.closeDisclosure(e.opens.key)],o.trigger),{...f,width:`auto`,baseStyle:o.trigger}):[],g=e=>e.band===`own`?h:[],_=m.map(e=>({cells:[...g(e),...e.cells],band:`deeper`,place:e.place})),v=IM(Nj(s,d)).map((e,t)=>({cells:kj(e,{...f,trail:t===0?Nj(c,d):[]}),band:`own`,place:`flow`})),y=l.map(e=>({cells:kj(Nj([e],o.band),{...f,baseStyle:o.band}),band:`deeper`,place:`flow`})),b=[...v,...y];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...b.flatMap(e=>e.cells),...m.flatMap(g)].flatMap(LM)),[...b,..._]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:kj([new U(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,trail:GM(e,a,t)}),band:`own`,place:`flow`}]}}};function GM(e,t,n){if(e.trail===void 0)return[];try{return n.evaluateSegment(e,t,n.palette,n.region,{bg:void 0,fg:void 0,body:e.trail,trail:void 0}).fragments}catch(t){return n.onSegmentError?.(e.id,t.message??String(t)),[]}}const KM={container:HM,segment:WM};function qM(e){return KM[e]}function JM(e){if(`ttl`in e)return{kind:`ttl`,durationMs:tb(e.ttl)};if(`watch_file`in e)return{kind:`watch_file`,path:e.watch_file};if(`depends_on`in e)return{kind:`depends_on`,varNames:e.depends_on};if(`key`in e)return{kind:`key`,template:e.key};if(`never`in e)return{kind:`never`};throw Error(`Unknown CacheDecl discriminator — loader invariant violated: ${JSON.stringify(e)}`)}function YM(e,t){switch(Is(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 XM(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`input`:e.declareInput(t,n.path,n.type??`string`,n.default);break;case`env`:e.declareEnv(t,n.name,n.default);break;case`file`:e.declareFile(t,n.path,{readMode:n.readMode,cache:JM(n.cache),parse:YM(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:JM(n.cache),parse:YM(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,ttlMs:n.cache?tb(n.cache.ttl):void 0,varDefault:n.default});break;case`git`:e.declareGit(t,{field:n.field,cwd:r,varDefault:n.default});break;case`state`:e.declareState(t,{key:n.key,...n.default!==void 0&&{varDefault:n.default}});break}}function ZM(e,t){let n=Ud.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}const QM=e=>bo(void 0,null,e.globals.variation);function $M(e,t,n){let r=n.cwd,i=Lb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:iO({endcaps:`powerline`,charset:lo}),width:80,basePalette:i,palette:i,variation:$i[QM(e)],padding:1,seamCols:aO({endcaps:`powerline`,charset:lo}),layout:()=>[]},o=iM(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=x_(e.presets),u=new Map([...Vb(e),...gx(e)]),d=dy({...Qj(a),...hM(a,o),...vM(a,o),...SM(a,o),...DM(a,o),...jM(s),...PM(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=ZM(d,e.helpers),p=e=>d.parse(e,f),m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=p(e);return m.set(e,n),n},g=new Map;for(let[t,n]of Cb)n in e.variables&&g.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!g.has(n.key)&&g.set(n.key,t);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))r.kind===`state`&&!g.has(r.key)&&g.set(r.key,`${t}.${e}`);a.compiled=Vj(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{XM(t,n,i,r)}catch(e){_.push(`Variable "${n}": ${e.message??String(e)}`)}for(let[n,i]of Object.entries(e.segments))if(i.vars)for(let[e,a]of Object.entries(i.vars))try{XM(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Hs(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>qs(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return qM(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=w_(e,t);C.set(t,S(n,r))}let ee=new Map(Za.map(e=>[e,new Map])),te=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of te)for(let n of Za){let r=t[n];if(!Qa(r))continue;let i=`${e}.${n}`,a=ee.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:eN(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function eN(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 tN(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 nN(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function rN(e,t){return e.kind===`decided`?e.name:t}function iN(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(_o(a.colorCompatibility));let{preset:d=y_}=s??{},f=T_(e,d),p=$i[s?.variation??bo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??ro(`none`,e.styles),h=s?.theme??Fb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(rN(h,Wa),rN(m,to))),t.menuRuntime.action.chromeCols=iO(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=aO(a);let _=fy(n),v=eo(h,e=>{let n=tN(t,`palette`,e);return Pb(nN(n,_),n.where,e=>u?.(e))}),y=eo(m,n=>ro(nN(tN(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=Mb(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o)=>{try{let s=r.drawnAt(),{tint:c,disclosure:l}=Va(i,a,s),u=aM(t.activeSegment,e.name,e.id,i,l,c),d=Rj(u,s,o.bg,o.fg,n),f=o.body.evaluate(n),p=o.trail?.evaluate(n)??[];return{styles:{closed:d,get trigger(){return eM(i,Aa(i,l,s).state,s)},get band(){return eM(i,Aa(i,l,s).plane,s)},disclosure:l},fragments:f,trail:p,drops:u.drops}}finally{t.activeSegment.current=null}},ee=(e,t,r)=>{let i=t&&Tj(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>ee(e,t,za(r,n)),renderBody:(e,t,n)=>ee(e,i&&t,Ba(n)),closeDisclosure:e=>$j(n,e)};return qM(e.kind).render(e,o)},te=t.roots.get(d);if(te===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${y_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let ne=e=>{if(!Tj(e.when,_))return!1;if(e.kind===`container`)return!0;if(Tx(e.name)===void 0)return!1;try{return Tj(t.segments[e.name].when,my(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>BM(te,ne).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Tx(e);return r===void 0?[]:[{name:r,address:t,palette:Ab(n.theme,x)}]})),ee(te,!0,Ra(p)).map(e=>oO(Mj(e.cells,a),a)).join(`
|
|
185
|
+
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function RM(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,...zM(e,r)]}function zM(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 BM(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:RM(e.direction,e.children.map((t,i)=>n(t,[...r,VM(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function VM(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Es[e.direction]}}const HM={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:ca(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ms(t.path,n)))}},render(e,t){return RM(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,VM(e,r))))}},UM={drop:e=>e.place,above:()=>`above`},WM={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:Ds(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Yc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Ns(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.lead!==void 0&&{lead:t.parse(e.lead,`lead`)},...e.trail!==void 0&&{trail:t.parse(e.trail,`trail`)}}},render(e,t){let n=t.lookupSegment(e.name);if(!n)throw Error(`Layout segment "${e.name}" has no matching segment`);let{seg:r,compiled:i}=n;if(!t.visible)return[];let a=my(t.scope,e.settings);try{if(!Tj(i.when,a))return[];let n=Ab(e.settings.theme,t.palette),o=e.opens!==void 0&&Tj(e.opens.open,t.scope),{styles:s,fragments:c,lead:l,trail:u,drops:d,open:f}=t.evaluateSegment(e,a,n,t.region,{bg:i.bg,fg:i.fg,body:i.template,lead:e.lead,trail:e.trail},o),p=f?s.trigger:s.closed,m={width:r.width??`auto`,justify:r.justify??`left`,truncate:r.truncate??`right`,baseStyle:p,padding:t.padding},h=e.opens,g=h===void 0?[]:t.renderBody(h.body,o,s.disclosure).map(e=>({...e,place:UM[h.placement](e)})),_=e.opens!==void 0&&g.some(e=>e.band===`own`)?Aj(Pj([t.closeDisclosure(e.opens.key)],s.trigger),{...m,width:`auto`,baseStyle:s.trigger}):[],v=e=>e.band===`own`?_:[],y=g.map(e=>({cells:[...v(e),...e.cells],band:`deeper`,place:e.place})),b=LM(Pj(c,p)).map((e,t)=>({cells:Aj(e,{...m,lead:t===0?Pj(l,p):[],trail:t===0?Pj(u,p):[]}),band:`own`,place:`flow`})),x=d.map(e=>({cells:Aj(Pj([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),S=[...b,...x];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...S.flatMap(e=>e.cells),...g.flatMap(v)].flatMap(Oj)),[...S,...y]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:Aj([new U(`⚠ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:GM(e.lead,e,a,t),trail:GM(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function GM(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 KM={container:HM,segment:WM};function qM(e){return KM[e]}function JM(e){if(`ttl`in e)return{kind:`ttl`,durationMs:tb(e.ttl)};if(`watch_file`in e)return{kind:`watch_file`,path:e.watch_file};if(`depends_on`in e)return{kind:`depends_on`,varNames:e.depends_on};if(`key`in e)return{kind:`key`,template:e.key};if(`never`in e)return{kind:`never`};throw Error(`Unknown CacheDecl discriminator — loader invariant violated: ${JSON.stringify(e)}`)}function YM(e,t){switch(Is(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 XM(e,t,n,r){switch(n.kind){case`literal`:e.declareLiteral(t,n.value);break;case`input`:e.declareInput(t,n.path,n.type??`string`,n.default);break;case`env`:e.declareEnv(t,n.name,n.default);break;case`file`:e.declareFile(t,n.path,{readMode:n.readMode,cache:JM(n.cache),parse:YM(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:JM(n.cache),parse:YM(n.parse,n.default)});break;case`template`:e.declareTemplate(t,n.template,{varDefault:n.default});break;case`time`:e.declareTime(t,{format:n.layout,ttlMs:n.cache?tb(n.cache.ttl):void 0,varDefault:n.default});break;case`git`:e.declareGit(t,{field:n.field,cwd:r,varDefault:n.default});break;case`state`:e.declareState(t,{key:n.key,...n.default!==void 0&&{varDefault:n.default}});break}}function ZM(e,t){let n=Ud.EMPTY;for(let[r,i]of Object.entries(t))try{n=e.parse(`{{ define "${r}" }}${i}{{ end }}`,n).defines()}catch(e){throw Error(`Template parse error in helpers.${r}: ${e.message}`,{cause:e})}return n}const QM=e=>bo(void 0,null,e.globals.variation);function $M(e,t,n){let r=n.cwd,i=Lb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:iO({endcaps:`powerline`,charset:lo}),width:80,basePalette:i,palette:i,variation:$i[QM(e)],padding:1,seamCols:aO({endcaps:`powerline`,charset:lo}),layout:()=>[]},o=aM(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=x_(e.presets),u=new Map([...Vb(e),...gx(e)]),d=dy({...$j(a),...gM(a,o),...yM(a,o),...CM(a,o),...OM(a,o),...MM(s),...FM(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=ZM(d,e.helpers),p=e=>d.parse(e,f),m=new Map,h=e=>{let t=m.get(e);if(t!==void 0)return t;let n=p(e);return m.set(e,n),n},g=new Map;for(let[t,n]of Cb)n in e.variables&&g.set(t,n);for(let[t,n]of Object.entries(e.variables))n.kind===`state`&&!g.has(n.key)&&g.set(n.key,t);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))r.kind===`state`&&!g.has(r.key)&&g.set(r.key,`${t}.${e}`);a.compiled=Hj(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{XM(t,n,i,r)}catch(e){_.push(`Variable "${n}": ${e.message??String(e)}`)}for(let[n,i]of Object.entries(e.segments))if(i.vars)for(let[e,a]of Object.entries(i.vars))try{XM(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Hs(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>qs(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return qM(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=w_(e,t);C.set(t,S(n,r))}let ee=new Map(Za.map(e=>[e,new Map])),te=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of te)for(let n of Za){let r=t[n];if(!Qa(r))continue;let i=`${e}.${n}`,a=ee.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:eN(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function eN(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 tN(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 nN(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function rN(e,t){return e.kind===`decided`?e.name:t}function iN(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(_o(a.colorCompatibility));let{preset:d=y_}=s??{},f=T_(e,d),p=$i[s?.variation??bo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??ro(`none`,e.styles),h=s?.theme??Fb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(rN(h,Wa),rN(m,to))),t.menuRuntime.action.chromeCols=iO(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=aO(a);let _=fy(n),v=eo(h,e=>{let n=tN(t,`palette`,e);return Pb(nN(n,_),n.where,e=>u?.(e))}),y=eo(m,n=>ro(nN(tN(t,`style`,n),_),e.styles));(v!==h||y!==m)&&r.applyInput(g(v.name,y.name));let b=v.value;t.menuRuntime.action.basePalette=b;let x=Mb(b,y.value);t.menuRuntime.action.palette=x,c?.clear();let S=n=>{let r=e.segments[n],i=t.segments[n];return r!==void 0&&i!==void 0?{seg:r,compiled:i}:void 0},C=(e,n,i,a,o,s)=>{try{let c=r.drawnAt(),{tint:l,disclosure:u}=Va(i,a,c),d=oM(t.activeSegment,e.name,e.id,i,u,l),f=zj(d,c,o.bg,o.fg,n),p=o.body.evaluate(n),m=d.drops.length>0||s;m&&(d.bg=Aa(i,u,c).state);let h=o.lead?.evaluate(n)??[],g=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return tM(i,Aa(i,u,c).state,c)},get band(){return tM(i,Aa(i,u,c).plane,c)},disclosure:u},fragments:p,lead:h,trail:g,drops:d.drops,open:m}}finally{t.activeSegment.current=null}},ee=(e,t,r)=>{let i=t&&Tj(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>ee(e,t,za(r,n)),renderBody:(e,t,n)=>ee(e,i&&t,Ba(n)),closeDisclosure:e=>eM(n,e)};return qM(e.kind).render(e,o)},te=t.roots.get(d);if(te===void 0)throw Error(`Preset "${d}" has no compiled layout — registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${y_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let ne=e=>{if(!Tj(e.when,_))return!1;if(e.kind===`container`)return!0;if(Tx(e.name)===void 0)return!1;try{return Tj(t.segments[e.name].when,my(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>BM(te,ne).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Tx(e);return r===void 0?[]:[{name:r,address:t,palette:Ab(n.theme,x)}]})),ee(te,!0,Ra(p)).map(e=>oO(Nj(e.cells,a),a)).join(`
|
|
186
186
|
`)}var aN=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,dN(e,t,n,`initial value`),this.cell=_v.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){dN(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}},oN=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,_v.computed)(()=>{let e=n();return dN(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},sN=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=_v.observable.box(uN(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=uN(e);lN(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function cN(e){return JSON.stringify(e)}function lN(e,t){return cN(e)===cN(t)}function uN(e){return e.kind===`ok`?{kind:`ok`,value:vv(e.value)}:e}function dN(e,t,n,r){let i=yv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var fN=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new aN(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new sN(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new oN(e,t,()=>n(r)))}read(e){return this.requireVar(e).read()}readDocument(e){let t=this.requireNode(e);if(t.kind!==`document`)throw TypeError(`Variable "${e}" is a ${t.kind}, not a document`);return t.read()}setDocument(e,t){let n=this.requireNode(e);if(n.kind!==`document`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a document (use defineDocument to create one)`);(0,_v.runInAction)(()=>n.set(t))}setBox(e,t){let n=this.requireNode(e);if(n.kind!==`box`)throw TypeError(`Variable "${e}" is a ${n.kind}, not a box (use defineBox to create a settable variable)`);(0,_v.runInAction)(()=>n.set(t))}runInAction(e){(0,_v.runInAction)(e)}has(e){return this.nodes.has(e)}getType(e){return this.requireVar(e).type}getKind(e){return this.requireNode(e).kind}changeKey(e){let t=this.requireNode(e);if(t.kind===`document`)return cN(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 pN(e,t,n){return e+`\0`+t+`\0`+(n??``)}function mN(e,t){return new Set(x_(e.presets).filter(n=>w_(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function hN(e){let t=c.basename(e),n=c.dirname(e);for(;!r.existsSync(n);)t=c.basename(n),n=c.dirname(n);return{dir:n,name:t}}function gN(e,t){let n=new Map;for(let t of Nw(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=hN(t);n.has(e)||n.set(e,new Set),n.get(e).add(r)}return{files:t===null?[]:[t],dirs:[...n.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({path:e,filenames:[...t].sort()}))}}function _N(e){return e.filter(Boolean).join(`
|
|
187
187
|
`)||null}var vN=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=pN(e,t,n),i=this.entries.get(r);if(i)return this.entries.delete(r),this.entries.set(r,i),i;let a=this.loadFromDisk(e,t,n),o={projectDir:e,cwd:t,configFile:n,configFilePath:null,lastError:a.error,lastWarning:a.warning,state:a.state??this.buildState(t,null,[]),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.state.validatorDisposers.forEach(e=>e()),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a.resolvedPath),this.observers.onReload?.(o),o}reload(e,t,n){this.reloadInto(this.getOrCreate(e,t,n))}reloadInto(e){let t=this.loadFromDisk(e.projectDir,e.cwd,e.configFile);e.lastWarning=t.warning,e.lastError=t.error,t.state!==null&&(e.state.registry.dispose(),e.state.validatorDisposers.forEach(e=>e()),e.state=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}loadFromDisk(e,t,n){let r=Fw(e,t,n),i=r.kind===`file`?r.path:null,a=[zw(e,t),Lw(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof bs&&a.push(...e.warnings),{resolvedPath:i,warning:_N(a),state:null,error:e instanceof bs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:_N(a),state:o,error:null}}buildState(e,t,n){let r=Bw(t,lk),{config:i,raw:a}=r;n.push(...r.warnings);let o=Uw(r,t??`<default>`),s=new fN,c=new vb(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=$M(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of NA(o))u.push(EA(e,t));for(let{key:e,spec:t}of JO(o))u.push(YO(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:Rk(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:mN(i,a),fileHeldSettings:pA(a)}}refreshWatcher(e,t){e.configFilePath=t;let n=gN(e,t),r=`config:${e.projectDir}:${e.cwd}:${e.configFile??``}:${JSON.stringify(n)}`;e.watcher!==null&&e.watcherKey===r||(e.watcher?.release(),e.watcherKey=r,e.watcher=this.deps.watchers.acquire(r,n,()=>this.onConfigChanged(e)))}onConfigChanged(e){Q(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const yN=16384;var bN=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<yN){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%yN}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:FE,protocolVersion:3,startedAt:this.startedAt.toISOString(),uptimeSec:Math.floor((Date.now()-this.startedAt.getTime())/1e3),rssBytes:t.rss,heapUsedBytes:t.heapUsed,heapTotalBytes:t.heapTotal,externalBytes:t.external,arrayBuffersBytes:t.arrayBuffers,requests:{total:this.requestsTotal,errored:this.requestsErrored,timedOut:this.requestsTimedOut,inFlight:this.inFlight},gitCache:e.gitCache,usageCache:e.usageCache,renderCache:{size:e.renderCacheSize},watchers:{active:e.watchersActive,opened:this.watchersOpened,closed:this.watchersClosed,evicted:this.watchersEvicted},subprocesses:this.snapshotSubprocesses(),nextRestartReason:e.nextRestartReason??null}}};const xN={load:()=>({}),save:()=>{},flush:()=>{}};function SN(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var CN=class{sessions;storage;atom=(0,_v.createAtom)(`SessionState`);constructor(e=xN,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=SN(this.storage.load()),this.evictOldest(),this.persist()}get(e,t){this.atom.reportObserved();let n=this.sessions.get(e);return n?(this.touch(e,n),n.get(t)??null):null}set(e,t,n){this.setBatch(e,[{key:t,value:n}])}setBatch(e,t){t.length!==0&&(0,_v.runInAction)(()=>{let n=this.sessions.get(e)??new Map;for(let{key:e,value:r}of t)n.set(e,r);this.touch(e,n),this.evictOldest(),this.persist(),this.atom.reportChanged()})}clear(e,t){(0,_v.runInAction)(()=>{let n=this.sessions.get(e);n&&(n.delete(t),n.size===0?this.sessions.delete(e):this.touch(e,n)),this.persist(),this.atom.reportChanged()})}prune(e){(0,_v.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};const wN=(e,t)=>O(t);function TN(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 EN=class{timer=null;pending=null;constructor(e,t=500,n=wN){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 TN(t)?t:(this.logger(`warn`,`session-state load: unexpected shape, starting empty`),{})}catch{return this.logger(`warn`,`session-state load: corrupt JSON, starting empty`),{}}}save(e){this.pending=e,!this.timer&&(this.timer=setTimeout(()=>this.flush(),this.debounceMs),this.timer.unref())}flush(){if(this.timer&&=(clearTimeout(this.timer),null),this.pending===null)return;let e=this.pending;try{r.mkdirSync(c.dirname(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp`;r.writeFileSync(t,JSON.stringify(e),{mode:384}),r.chmodSync(t,384),r.renameSync(t,this.filePath),this.pending=null}catch(e){this.logger(`warn`,`session-state save failed: ${e.message}`)}}};const DN={default_empty_value:`string`,default_separator:`string`,palette:`string`,style:`string`,preset:`string`,endcaps:`string`,variation:`string`,autoWrap:`boolean`,padding:`number`,charset:`string`,updateNotice:`boolean`,colorCompatibility:`string`,menuGlyph:`string`},ON=new Set([`1`,`true`]),kN=new Set([`0`,`false`,``]);function AN(e,t){let n=tP(e),r=n.scope===`segment-palette`?`string`:DN[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(ON.has(t))return`true`;if(kN.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function jN(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function MN(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),k(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function NN(e){return/^\s*$/.test(e)?null:Io(e)}function PN(e,t){return e!==null&&Ro(e,t)!==void 0}function FN(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(FN),...i}}return e}function IN(e){if(!jc(e))return FN(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,FN(t)])),...n}}const LN=sk,RN=LN.segments,zN=LN.presets,BN=LN.root;function VN(e,t,n,r){if(!PN(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function HN(e,t){let n=$b(t);return t.scope===`segment-palette`&&VN(e,[`segments`,t.segment],RN[t.segment],n.join(`.`)),n}function UN(e){return Io(Ko(e))}function WN(){return Object.entries(BN.rows).map(([e,t])=>{let n=FN(t);return{path:[`root`],fragment:UN({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function GN(e,t){let n=e===null?void 0:Ro(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function KN(e,t){if(t===void 0)return null;let n=IN(t);return{path:e,fragment:UN(n),unit:{path:e,value:n}}}function qN(e,t){let n=[`presets`,t],r=[...n,`root`],i=zN[t];VN(e,n,i,r.join(`.`));let a=GN(e,r)??KN(r,i?.root);return a!==null&&ps(a.fragment)?a:null}function JN(e,t){let n=fs(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 YN(e,t){return[...WN(),GN(e,[`root`]),qN(e,t)].filter(e=>e!==null).reduce(JN,new Map)}function XN(e,t,n){for(let{node:r,...i}of YN(e,t).values())if(hs(r,n))return i;throw new $(`${ZN(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 ZN(e,t){return qN(e,t)?.path??[`root`]}function QN(e,t){return t.scope===`preset-root`?ZN(e,t.preset):$b(t)}function $N(e,{unit:t}){return t===null?e:os(e,t.path,Ko(t.value),Wo)}function eP(e){let t=Qb(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function tP(e){let t=eP(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function nP(e,t,n,r){rP(t,r),MN(t,r,e.logger),e.record(t,n,r)}function rP(e,t){try{return Uw(Vw(e,t,lk),e)}catch(e){throw e instanceof bs?new $(`refused: the config file would not load after this click — ${e.message}`):e}}function iP(e,t){let n=tP(t),r=NN(jN(e)??``),i=r===null?void 0:Ro(r,$b(n));return i!==void 0&&`value`in i?i.value:void 0}function aP(e,t,n){oP(e,t,n,[])}function oP(e,t,n,r){let i=jN(t);nP(e,t,i,sP(n.reduce((e,[t,n])=>os(e,HN(NN(e),tP(t)),AN(t,n),Wo),i??``),t,r,e=>e))}function sP(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=XN(NN(s),n,i),l=ys($N(s,c),c.path,i,a,Ko(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 cP(e,t,n){let r=NN(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of YN(r,t)){if(!hs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Bo(e,c):Ko(s.value);if(a!==`#`)return os(e,[...i,`rows`,a],l,Wo);if(qN(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 os(e,i,l,Wo)}return e}function lP(e,t){return cs(e,t,t[0]===`presets`&&t.length>2&&!dk(t[1])?2:0)}function uP(e,t,n){let r=n.map(eP),i=jN(t);if(i===null)return;let a=r.reduce((e,t)=>lP(e,QN(NN(e),t)),i);a!==i&&nP(e,t,i,a)}function dP(e){let t=e===null?void 0:Ro(e,[`presets`]),n=new Set([...uk,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(fu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(fu(e)))}function fP(e,t,n,r,i,a){let o=jN(t),s=NN(o??``),c=dP(s),l=[`presets`,c],u=qN(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Bo(o??``,u.fragment):Ko(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],Ko(r)]]],f=i.map(([e,t])=>{let n=Zb(c,e);return[HN(s,tP(n)),AN(n,t)]});return nP(e,t,o,sP([...d,...f].reduce((e,[t,n])=>os(e,t,n,Wo),os(o??``,l,`{}`,Wo)),t,a.map(e=>({...e,preset:c})),cP)),c}function pP(e,t,n){if(dk(n))throw new $(`cannot delete preset "${n}": it is bundled — reset its settings instead`);let r=[`presets`,n],i=jN(t),a=NN(i??``);if(i===null||a===null||Ro(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t} declares no ${r.join(`.`)} — the bar you clicked is stale; it reloads on the next render`);let o=Ro(a,[`globals`,`preset`]);nP(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>lP(e,t),i))}function mP(e,t,n,r){let i=eP(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=jN(t),o=r.op===`remove`?r.target:r.anchor,s=XN(NN(a??``),i.preset,o),c=$N(a??``,s),{after:l,placed:u}=hP(c,s.path,r,()=>{let e=rP(t,c);return x_(e.presets).map(t=>w_(e,t).node)});if(l===null)throw new $(`${s.path.join(`.`)} in ${t} has no placement "${o}" — the bar you clicked is stale (it reloads on the next render), or the action names a placement the layout never held`);return nP(e,t,a,l),u}function hP(e,t,n,r){switch(n.op){case`remove`:return{after:_s(e,t,n.target),placed:null};case`insert`:{let i=AO(n.segment,n.anchor,r());return{after:vs(e,t,i,n.anchor,n.relation),placed:i}}}}const gP={load:()=>({}),save:()=>{}},_P=new Set(xb.map(e=>e.sessionKey)),vP=e=>_P.has(e)||e.startsWith(H_),yP={past:[],future:[]},bP=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var xP=class{state=new Map;constructor(e,t,n=gP){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n}=this.state.get(e)??yP;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??yP}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(bP(n));r.set(bP(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=this.sessionState,r=(e,r,i)=>{let a=r.filter(vP).map(t=>({key:t,before:n.get(e,t)}));i();for(let{key:r,before:i}of a)t(e,{kind:`session`,key:r,before:i,after:n.get(e,r)})};return{sessionState:{get:(e,t)=>n.get(e,t),set:(e,t,i)=>r(e,[t],()=>n.set(e,t,i)),setBatch:(e,t)=>r(e,t.map(e=>e.key),()=>n.setBatch(e,t)),clear:(e,t)=>r(e,[t],()=>n.clear(e,t))},file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=[...e];e.clear();for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length!==0&&this.put(e,{past:wP([...this.history(e).past,t]),future:[]})}}}}undo(e){let{past:t,future:n}=this.history(e),r=t.at(-1);if(r===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,r,`before`,`undo`,{past:t.slice(0,-1),future:wP([...n,r])}),r}redo(e){let{past:t,future:n}=this.history(e),r=n.at(-1);if(r===void 0)throw new $(`redo: nothing to redo`);return this.apply(e,r,`after`,`redo`,{past:wP([...t,r]),future:n.slice(0,-1)}),r}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(bP));throw this.put(e,{past:TP(this.history(e).past,t),future:TP(this.history(e).future,t)}),new $(`${r}: ${o.map(DP).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):jN(t.file)}write(e,t,n){t.kind===`file`?MN(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0)&&n.set(e,t);n.size>32||SP(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,CP(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function SP(e){let t=0;for(let{past:n,future:r}of e.values())for(let e of[...n,...r])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function CP({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function wP(e){return e.slice(-50)}function TP(e,t){return e.map(e=>e.filter(e=>!t.has(bP(e)))).filter(e=>e.length>0)}function EP(e){return e.map(DP).join(`, `)}function DP(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function OP(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 kP(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(OP))}function AP(e){if(typeof e!=`object`||!e)return!1;let t=e;return kP(t.past)&&kP(t.future)}function jP(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(AP))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),k(e,JSON.stringify(n),384)}catch(e){let n=`settings-history write failed — the change landed but is not undoable: ${e.message}`;throw t(`error`,n),Error(n)}}}}function MP(e,t,n,r){let i=Oe({bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r});if(i.ok)return{kind:`ok`,stdout:i.stdout};if(i.reason===`rate-limited`)return{kind:`rate-limited`,reason:i.error??`rate-limited`};let a=i.error??[i.reason,i.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${n[0]} failed (${a})`}}function NP(e){let t=MP(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 PP(){return{probeTmux:NP}}function FP(e){let t=VE(e).env;if(t===void 0)return{path:e,env:{}};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: \`env\` is not an object`);return{path:e,env:t}}function IP(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function LP(e,t){return{tmux:IP(e,t.tmux),claudeSettings:FP(RE(LE(t.claudeConfigDir)))}}function RP(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=os(BE(n),[`env`,e.name],JSON.stringify(e.value),Go);return r.mkdirSync(c.dirname(n),{recursive:!0}),k(n,i),{...t,claudeSettings:FP(n)}}default:return e.kind}}const zP=/^─{20,}/,BP=/^❯(\s|$)/,VP=/›\s*stashed$/;function HP(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>zP.test(e)?[t]:[]).at(-2);return n===void 0||!BP.test(t[n+1]??``)?{kind:`no-prompt`}:VP.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const UP={"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 WP(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=HP(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:UP[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const GP=`cc-candybar-slash`;function KP(e,t,n,r){let i=MP(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function qP(e){let t=KP(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(`
|
|
188
188
|
`);return{inMode:n!==`0`,screen:r}}function JP(e,t){let n=KP(e,`claude-input.type`,[`load-buffer`,`-b`,GP,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,GP,`-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 YP(){return{read:qP,type:JP}}function XP(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function ZP(e){return QP(()=>decodeURIComponent(e))}function QP(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function $P(e,t){let n=Oe({bin:`/usr/bin/pbcopy`,stdinInput:e,category:`click.pbcopy`});if(!n.ok){if(n.reason===`rate-limited`){t.dlog(`warn`,`click.pbcopy rate-limited: ${n.error??``}`);return}throw Error(`pbcopy failed (${n.reason}, exit ${n.exitCode??`null`})`)}}const eF=(e,t)=>$P(ZP(e),t),tF=(e,t)=>{let n=Oe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,ZP(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`})`)}},nF=(e,t)=>$P(ZP(e),t),rF=(e,t)=>$P(ZP(e),t),iF=(e,t)=>{let n=XP(ZP(e));t.sessionState.get(n,`toolbar-expanded`)?t.sessionState.clear(n,`toolbar-expanded`):t.sessionState.set(n,`toolbar-expanded`,`1`)},aF=(e,t)=>{let[n=``,...r]=QP(()=>OE(e)),i=XP(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${TA().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: ${TA().join(`, `)})`);let a=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=DA(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}lF(t,i,`set-state`,a),t.sessionState.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},oF=/^-?\d+$/;function sF(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const cF=(e,t)=>{let[n=``,r=``,i=``]=QP(()=>OE(e)),a=XP(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!oF.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=OA(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${TA().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&oF.test(c)?uF(s,parseInt(c,10)):dF(`step-state`,r,s,jA(t.configFor(hF(t,a)),e=>t.sessionState.get(a,e),r)),u=sF(l,o,s.min,s.max),d=DA(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);lF(t,a,`step-state`,[{key:r,value:d.value}]),t.sessionState.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}→${d.value} (by ${o}, session=${a})`)};function lF(e,t,n,r){let i=r.filter(e=>e.key.startsWith(H_));if(i.length===0)return;let a=cA(e.configFor(hF(e,t)),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused — ${a.join(`; `)}`)}function uF(e,t){return Math.max(e.min,Math.min(e.max,t))}function dF(e,t,n,r){if(r===null)return n.min;if(!oF.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return uF(n,parseInt(r,10))}const fF=`render-origin`;function pF(e){return JSON.stringify(e)}function mF(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 hF(e,t){let n=e.sessionState.get(t,fF);if(n===null)throw new $(`session ${t} has not rendered yet — no config to act on`);return mF(n)}function gF(e){return Iw(e.projectDir,e.cwd,e.configFile??void 0)}function _F(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const vF=(e,t)=>{let[n=``,r=``,i=``]=QP(()=>OE(e)),a=XP(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${VO().join(`, `)})`);let o=HO(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=hF(t,a),c=gF(s),l=oA(t.configFor(s),e=>t.sessionState.get(a,e),r);aP(_F(t,a),c,[[l.key,o.value]]),t.dlog(`info`,`set-config: ${l.key}=${o.value} → ${c} (session=${a})`)},yF=(e,t)=>{let[n=``,r=``,i=``]=QP(()=>OE(e)),a=XP(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!oF.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=UO(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${VO().join(`, `)})`);let c=hF(t,a),l=gF(c),u=oA(t.configFor(c),e=>t.sessionState.get(a,e),r),d=iP(l,u.key),f=typeof d==`number`?uF(s,d):dF(`step-config`,r,s,GO(u.globals,r)),p=sF(f,o,s.min,s.max),m=HO(r,String(p));if(!m.ok)throw new $(`step-config: ${m.reason}`);aP(_F(t,a),l,[[u.key,m.value]]),t.dlog(`info`,`step-config: ${u.key} ${f}→${m.value} (by ${o}) → ${l} (session=${a})`)},bF=(e,t)=>{let[n=``]=QP(()=>OE(e)),r=XP(n),i=hF(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=iA(a,o),c=sA(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=DA(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});SF(`save`,c);let u=gF(i);oP(_F(t,r),u,l,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...l.map(([e,t])=>`${e}=${t}`),...c.map(xF)].join(` `)} → ${u} (session=${r})`)},xF=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Ks(e.value)}`;function SF(e,t){for(let n of t){let t=DA(n.key,Ks(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const CF=(e,t)=>{let[n=``]=QP(()=>OE(e)),r=XP(n),i=hF(t,r),a=dA(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=DA(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});SF(`save-preset`,a.placements);let s=gF(i),c=fP(_F(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...xb.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,bb.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(xF)].join(` `)} → ${s} (session=${r})`)},wF=(e,t)=>{let[n=``,r=``]=QP(()=>OE(e)),i=XP(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=hF(t,i),o=gF(a);pP(_F(t,i),o,r),t.reloadConfig(a);let s=bb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} ← ${o} (session=${i})`)},TF=(e,t)=>{let[n=``,...r]=QP(()=>OE(e)),i=XP(n),a=VO(),o=r.length===0?[``]:r.filter(e=>!a.includes(e));if(o.length>0)throw new $(`reset-config: unknown config key "${o.join(`", "`)}" (have: ${a.join(`, `)})`);let s=hF(t,i),c=gF(s),l=r.map(fA),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);uP(_F(t,i),c,u),t.reloadConfig(s);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} ← ${c} (session=${i})`)};function EF(e,t){let n=(e,t)=>[...js(w_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(x_(t.presets).flatMap(e=>n(t,e).map(t=>`${e}\0${Ds(t)}`)));return x_(e.presets).flatMap(t=>n(e,t).flatMap(e=>r.has(`${t}\0${Ds(e)}`)?[]:Object.values(e.drafts??{}).map(e=>e.key)))}const DF=(e,t)=>{let[n=``,r=``,i=``]=QP(()=>OE(e)),a=XP(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${VO().join(`, `)})`);let o=HO(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=kO(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=hF(t,a),l=gF(c),u=t.configFor(c),d=mP(_F(t,a),l,r,s);t.reloadConfig(c);let f=EF(u,t.configFor(c)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of f)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${o.value} → ${l} placed=${JSON.stringify(d)} released=${JSON.stringify(f)} (session=${a})`)},OF=(e,t)=>{let[n=``]=QP(()=>OE(e)),r=XP(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${EP(i)} (session=${r})`)},kF=(e,t)=>{let[n=``]=QP(()=>OE(e)),r=XP(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${EP(i)} (session=${r})`)},AF=(e,t)=>{XP(ZP(e)),t.applyUpdate()},jF=`client-hints`;function MF(e,t){let n=e.sessionState.get(t,jF);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 Xw(r)}function NF(e,t,n){let r=Lx(n);e.sessionState.setBatch(t,Vx(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const PF=(e,t)=>{let n=XP(ZP(e));NF(t,n,LP(t.doctor,MF(t,n)))},FF=(e,t)=>{let[n=``,r=``]=QP(()=>OE(e)),i=XP(n),a=Rx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=LP(t.doctor,MF(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=RP(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} → ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),NF(t,i,c)},IF=(e,t)=>{let[n=``,...r]=QP(()=>OE(e)),i=XP(n),a=hF(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=uC(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`};t.memento.move({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i})`)},LF=(e,t)=>{let[n=``,r=``]=QP(()=>OE(e)),i=XP(n),a=Object.values(t.configFor(hF(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=WP(t.claudeInput,MF(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})`)},RF=`config-override`,zF=new Map([[cE,eF],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=XP(QP(()=>decodeURIComponent(e.slice(0,n)))),i=QP(()=>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,RF),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,RF,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[lE,tF],[oE,aF],[sE,cF],[pE,vF],[mE,yF],[vE,TF],[hE,bF],[gE,CF],[_E,wF],[yE,DF],[bE,OF],[xE,kF],[dE,nF],[fE,rF],[uE,iF],[SE,AF],[CE,PF],[wE,FF],[TE,IF],[EE,LF]]),BF=new Set([oE,sE,pE,mE,vE,hE,gE,_E,yE,bE,xE,uE,SE,CE,wE,TE,EE]),VF=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of ME(AE(e))){if(!i&&BF.has(a)){let e=OE(o);e.length>0&&e[0]&&(i=e[0])}let e=zF.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(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@promptctl/cc-candybar",
|
|
3
|
-
"version": "1.100.
|
|
3
|
+
"version": "1.100.1",
|
|
4
4
|
"description": "Statusline renderer for Claude Code — a JSON5-configurable DSL with daemon-cached data sources, byte-clean palette-aware composition, and OSC8 click verbs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.mjs",
|
|
@@ -91,9 +91,9 @@
|
|
|
91
91
|
"mobx": "^6.15.0"
|
|
92
92
|
},
|
|
93
93
|
"optionalDependencies": {
|
|
94
|
-
"@promptctl/cc-candybar-darwin-arm64": "1.100.
|
|
95
|
-
"@promptctl/cc-candybar-darwin-x64": "1.100.
|
|
96
|
-
"@promptctl/cc-candybar-linux-x64": "1.100.
|
|
97
|
-
"@promptctl/cc-candybar-linux-arm64": "1.100.
|
|
94
|
+
"@promptctl/cc-candybar-darwin-arm64": "1.100.1",
|
|
95
|
+
"@promptctl/cc-candybar-darwin-x64": "1.100.1",
|
|
96
|
+
"@promptctl/cc-candybar-linux-x64": "1.100.1",
|
|
97
|
+
"@promptctl/cc-candybar-linux-arm64": "1.100.1"
|
|
98
98
|
}
|
|
99
99
|
}
|