@promptctl/cc-candybar 1.101.0 โ 1.102.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +47 -47
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -87,14 +87,14 @@ Use 'override' annotation for methods overridden by subclass.`)}}var ra=la(0),ia
|
|
|
87
87
|
`,1)[0]??``}function Cy(e,t){if(e.kind!==`ok`)return e;let n=t(e.value);return n===null?Y:J(n)}function wy(e){if(e.kind!==`ok`)return e;let t=e.value.trim();return t?J(t):Y}const Ty=/^[A-Za-z]:[\\/]/;function Ey(e){let t=e.trim();if(Ty.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 Dy(e){return Ey(e)?.host||null}function Oy(e){let t=Dy(e);return t?t===`github.com`||t.endsWith(`.github.com`)?`github`:/(^|\.)gitlab\./.test(t)?`gitlab`:null:null}function ky(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 Ay(e){return e.urls.find(e=>Fy(e)!==null)??e.urls[0]??null}function jy(e){return e.find(e=>e.name===`origin`)??e[0]??null}function My(e){let t=jy(e);return t?Ay(t):null}function Ny(e){let t=jy(e);return t?t.urls.find(e=>Oy(e)!==null)??Ay(t):null}function Py(e){let t=(Ey(e)?.path??e.replace(/[\\/]+$/,``)).split(`/`);return(t[t.length-1]??``).replace(/\.git$/,``)||null}function Fy(e){let t=Ey(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 Iy(e){let t=My(e);return t===null?null:Fy(t)}function Ly(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??Sy(t.stderr)].filter(Boolean).join(`, `)}`)}function Ry(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function zy(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 By(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(!Ry(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 Vy(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(!Ry(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 Hy(e){try{let t=r.statSync(e);return{key:`${t.dev}:${t.ino}`,stamp:`${t.mtimeMs}:${t.size}`}}catch{return null}}var Uy=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=Cy(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=Cy(s,e=>this.repoNameFrom(e,r)),o.isWorktree=i),s!==void 0&&t.showRepoUrl&&(o.repoUrl=Cy(s,Iy)),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 wy(xy(`git describe --tags`,await this.execGitAsync([`describe`,`--tags`,`--abbrev=0`],{cwd:e,timeout:2e3}),`absent`))}async timeSinceCommit(e,t){return t.kind===`ok`?Cy(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=wy(xy(`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=Hy(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=xy(`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`?ky(t.value):[])}repoNameFrom(e,t){let n=My(e);return(n===null?null:Py(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=Ny(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=Oy(t);return n===`github`?Ly(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,By):n===`gitlab`?Ly(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,Vy):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=xy(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(zy(t.value)):t}};const Wy=(e,t)=>O(t);var Gy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??Wy}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()}},Ky=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 qy=(e,t)=>O(t),Jy={showSha:!0,showStashCount:!0};function Yy(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function Xy(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function Zy(e,t){return e.head!==t.head||e.index!==t.index}function Qy(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 $y=class extends Uy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Ky;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new Uy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??qy,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Gy({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}|${Yy(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=Xy(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}`,Qy(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}`,Qy(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,{...Jy});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,{...Jy}),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=Xy(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),Zy(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 eb=/\r\n|\r|\n/g,tb=e=>J(e.replace(eb,` `).trim());function nb(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(eb,` `))}}const rb=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function ib(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 ab(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 ob=`session.id`;function sb(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 cb(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 lb(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 ub=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],db=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],fb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],pb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function mb(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>ub[e.getMonth()]],[`Monday`,e=>fb[e.getDay()]],[`Jan`,e=>db[e.getMonth()]],[`Mon`,e=>pb[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 hb={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function gb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=hb[t];try{return bb(r,e)}catch{return xb(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return by(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return by(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return by(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return by(e.stashCount,0)}}var _b=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}},vb=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 yb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function bb(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`?wv(e):t===`number`?Tv(e):Ev(e)}function xb(e){return e===`number`?0:e===`boolean`?!1:``}var Sb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new _b;ttlMgr=new vb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Ky;abort=new AbortController;drawn=xv.observable.box(P.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=hy(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 $y({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,Cv(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,sb(t,n.cwd,this.abort.signal),ib(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,cb(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,tb,t.default,n);case`regex`:return this.scalarPublisher(e,nb(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=lb(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,by(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=lb(i,rb,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=gy(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 mb(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,mb(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=hb[t.field],r=t.varDefault===void 0?xb(n):bb(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,gb(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(ob);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=yb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,bb(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,xv.reaction)(()=>{let t=gy(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,xv.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,bb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,xb(t))}}defaultFor(e){try{return bb(this.defaultEmptyValue,e)}catch{return xb(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 Cb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[ob]:{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:``}},wb={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`}},Tb=Object.values(wb),Eb=new Map(Tb.map(e=>[e.configKey,e.effectiveVar])),Db=new Map(Tb.map(e=>[e.sessionKey,e.effectiveVar])),Ob=new Map(Object.keys(wb).map(e=>[wb[e].sessionKey,e]));function kb(e,t,n){let r=new Set,i=e=>{for(let t of dv(e??``,n).keys())r.add(t)};for(let t of Object.values(e.segments))i(t.template),i(t.bg),i(t.fg),i(t.when);for(let e of t)for(let t of Ms(e))i(t.when),t.kind===`segment`&&(i(t.lead),i(t.trail));for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(ob);for(let t of Object.values(e.actions)){r.add(ob),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Db.get(t.set):void 0,n=`persist`in t?Eb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Ab(e,t,n){let r=_v({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of kb(e,t,n.helpers)){if(gv(a,r))continue;let e=Cb[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 jb=new Map,Mb=new Map;function Nb(e){let t=Fb(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 Pb(e,t){return e===`bar`?t:Nb(e)}function Fb(e){let t=jb.get(e);if(t!==void 0)return t;let n=Sr(e);return n===null?null:(jb.set(e,n),n)}function Ib(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Mb.get(n);if(r!==void 0)return r;let i=Ar(e,t);return Mb.set(n,i),i}function Lb(e){let t=Fb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Rb(e,t,n){let r=Lb(e);return r===null?(n(`${t} rendered "${Ga}": "${e}" names no installed theme${Wa(e)}`),Bb()):r}function zb(e,t,n){return eo(e,t,n,Bb(),Lb)}function Bb(){return Lb(Ga)}function Vb(e){return to(zb(void 0,null,e),Bb).value}const Hb=new Map;function Ub(e,t,n){Hb.set(e,{permanent:!0,resolve:t,paletteOf:n})}Ub(`themes`,()=>qa(),e=>Nb(e));const Wb=`placementThemes`;Ub(Wb,Ja,(e,t)=>Pb(e,t.palette)),Ub(`endcaps`,()=>oo),Ub(`variations`,()=>yo),Ub(`charsets`,()=>lo),Ub(`colorCompatibilities`,()=>mo);function Gb(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Ib(n.basePalette,e.styles[t])}],[`presets`,{members:x_(e.presets)}]])}function Kb(e){return[...new Set([...Hb.keys(),...e.keys()])]}function qb(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Hb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${Kb(t).join(`, `)})`)}function Jb(e){return{label:e.label,domain:Yb(e.domain)}}function Yb(e){return e===`theme`?{from:Wb}:e===`bool`||`min`in e?e:{from:e}}function Xb(e,t,n,r){let i=Jc(e.label),{domain:a}=e;if(a===`bool`)return{kind:`inline`,template:`{{ action "${r}" "โ ${i}" "โ ${i}" }}`,actions:{[r]:{set:t,cycle:[...wo]}}};if(`from`in a)return{kind:`ring`,template:`{{ carousel "${r}" }}`,actions:{[r]:{set:t,from:a.from}}};let o=e=>({set:t,min:a.min,max:a.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "โ" }} {{ "${i}" }} {{ .${n} }} {{ action "${r}.up" "โถ" }}`,actions:{[`${r}.down`]:o(-a.step),[`${r}.up`]:o(a.step)}}}const Zb=/^segments\.([^.]+)\.palette$/,Qb=/^presets\.(.+)\.root$/,$b=/^presets\.(.+)\.globals\.([^.]+)$/;function ex(e){return`presets.${e}.root`}function tx(e,t){return`presets.${e}.globals.${t}`}function nx(e){if(Dl(e))return{scope:`globals`,field:e};let t=Zb.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=$b.exec(e);if(n&&bl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Qb.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function rx(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 ix=`open`;function ax(e,t,n,r){let i={variable:e,key:e,member:ix};return r.variables[e]=$c(e,Wc),r.actions[e]=el(e,ix),r.segments[e]={template:Qc(e,`(?)`,`โ`),...ox(n)},Yc(e,i,{kind:`container`,direction:`horizontal`,children:t.map((t,n)=>{let i=`${e}.${n}`;return r.segments[i]={template:t},{kind:`segment`,name:i}})},`drop`)}function ox(e){let[t,...n]=e;return t===void 0?{}:{when:Xc(t,...n)}}const sx={help:[`-h`,`--help`],version:[`-V`,`--version`]},cx=[`โ inserts`,`โ removes`,`โ๏ธ configures`,`โบ resets layout`],lx=`
|
|
90
|
+
`).length:0)}async getRemotesAsync(e){let t=Hy(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=xy(`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`?ky(t.value):[])}repoNameFrom(e,t){let n=My(e);return(n===null?null:Py(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=Ny(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=Oy(t);return n===`github`?Ly(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,By):n===`gitlab`?Ly(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,Vy):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=xy(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(zy(t.value)):t}};const Wy=(e,t)=>O(t);var Gy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??Wy}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()}},Ky=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 qy=(e,t)=>O(t),Jy={showSha:!0,showStashCount:!0};function Yy(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function Xy(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function Zy(e,t){return e.head!==t.head||e.index!==t.index}function Qy(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 $y=class extends Uy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Ky;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new Uy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??qy,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Gy({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}|${Yy(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=Xy(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}`,Qy(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}`,Qy(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,{...Jy});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,{...Jy}),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=Xy(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),Zy(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 eb=/\r\n|\r|\n/g,tb=e=>J(e.replace(eb,` `).trim());function nb(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(eb,` `))}}const rb=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function ib(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 ab(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 ob=`session.id`;function sb(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 cb(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 lb(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 ub=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],db=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],fb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],pb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function mb(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>ub[e.getMonth()]],[`Monday`,e=>fb[e.getDay()]],[`Jan`,e=>db[e.getMonth()]],[`Mon`,e=>pb[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 hb={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function gb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=hb[t];try{return bb(r,e)}catch{return xb(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return by(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return by(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return by(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return by(e.stashCount,0)}}var _b=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}},vb=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 yb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function bb(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`?wv(e):t===`number`?Tv(e):Ev(e)}function xb(e){return e===`number`?0:e===`boolean`?!1:``}var Sb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new _b;ttlMgr=new vb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Ky;abort=new AbortController;drawn=xv.observable.box(P.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=hy(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 $y({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,Cv(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,sb(t,n.cwd,this.abort.signal),ib(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,cb(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,tb,t.default,n);case`regex`:return this.scalarPublisher(e,nb(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=lb(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,by(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=lb(i,rb,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=gy(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 mb(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,mb(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=hb[t.field],r=t.varDefault===void 0?xb(n):bb(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,gb(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(ob);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=yb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,bb(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,xv.reaction)(()=>{let t=gy(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,xv.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,bb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,xb(t))}}defaultFor(e){try{return bb(this.defaultEmptyValue,e)}catch{return xb(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 Cb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[ob]:{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:``}},wb={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`}},Tb=Object.values(wb),Eb=new Map(Tb.map(e=>[e.configKey,e.effectiveVar])),Db=new Map(Tb.map(e=>[e.sessionKey,e.effectiveVar])),Ob=new Map(Object.keys(wb).map(e=>[wb[e].sessionKey,e]));function kb(e,t,n){let r=new Set,i=e=>{for(let t of dv(e??``,n).keys())r.add(t)};for(let t of Object.values(e.segments))i(t.template),i(t.bg),i(t.fg),i(t.when);for(let e of t)for(let t of Ms(e))i(t.when),t.kind===`segment`&&(i(t.lead),i(t.trail));for(let t of Object.values(e.variables))t.kind===`template`&&i(t.template),t.kind===`state`&&r.add(ob);for(let t of Object.values(e.actions)){r.add(ob),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Db.get(t.set):void 0,n=`persist`in t?Eb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Ab(e,t,n){let r=_v({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of kb(e,t,n.helpers)){if(gv(a,r))continue;let e=Cb[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 jb=new Map,Mb=new Map;function Nb(e){let t=Fb(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 Pb(e,t){return e===`bar`?t:Nb(e)}function Fb(e){let t=jb.get(e);if(t!==void 0)return t;let n=Sr(e);return n===null?null:(jb.set(e,n),n)}function Ib(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Mb.get(n);if(r!==void 0)return r;let i=Ar(e,t);return Mb.set(n,i),i}function Lb(e){let t=Fb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Rb(e,t,n){let r=Lb(e);return r===null?(n(`${t} rendered "${Ga}": "${e}" names no installed theme${Wa(e)}`),Bb()):r}function zb(e,t,n){return eo(e,t,n,Bb(),Lb)}function Bb(){return Lb(Ga)}function Vb(e){return to(zb(void 0,null,e),Bb).value}const Hb=new Map;function Ub(e,t,n){Hb.set(e,{permanent:!0,resolve:t,paletteOf:n})}Ub(`themes`,()=>qa(),e=>Nb(e));const Wb=`placementThemes`;Ub(Wb,Ja,(e,t)=>Pb(e,t.palette)),Ub(`endcaps`,()=>oo),Ub(`variations`,()=>yo),Ub(`charsets`,()=>lo),Ub(`colorCompatibilities`,()=>mo);function Gb(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Ib(n.basePalette,e.styles[t])}],[`presets`,{members:x_(e.presets)}]])}function Kb(e){return[...new Set([...Hb.keys(),...e.keys()])]}function qb(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Hb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${Kb(t).join(`, `)})`)}function Jb(e){return{label:e.label,domain:Yb(e.domain)}}function Yb(e){return e===`theme`?{from:Wb}:e===`bool`||`min`in e?e:{from:e}}function Xb(e,t,n,r){let i=Jc(e.label),{domain:a}=e;if(a===`bool`)return{kind:`inline`,template:`{{ action "${r}" "โ ${i}" "โ ${i}" }}`,actions:{[r]:{set:t,cycle:[...wo]}}};if(`from`in a)return{kind:`ring`,template:`{{ carousel "${r}" }}`,actions:{[r]:{set:t,from:a.from}}};let o=e=>({set:t,min:a.min,max:a.max,by:e});return{kind:`inline`,template:`{{ action "${r}.down" "โ" }} {{ "${i}" }} {{ .${n} }} {{ action "${r}.up" "โถ" }}`,actions:{[`${r}.down`]:o(-a.step),[`${r}.up`]:o(a.step)}}}const Zb=/^segments\.([^.]+)\.palette$/,Qb=/^presets\.(.+)\.root$/,$b=/^presets\.(.+)\.globals\.([^.]+)$/;function ex(e){return`presets.${e}.root`}function tx(e,t){return`presets.${e}.globals.${t}`}function nx(e){if(Dl(e))return{scope:`globals`,field:e};let t=Zb.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=$b.exec(e);if(n&&bl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=Qb.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function rx(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 ix=`open`;function ax(e,t,n,r){let i={variable:e,key:e,member:ix};return r.variables[e]=$c(e,Wc),r.actions[e]=el(e,ix),r.segments[e]={template:Qc(e,`(?)`,`โ`),...ox(n)},Yc(e,i,{kind:`container`,direction:`horizontal`,children:t.map((t,n)=>{let i=`${e}.${n}`;return r.segments[i]={template:t},{kind:`segment`,name:i}})},`drop`)}function ox(e){let[t,...n]=e;return t===void 0?{}:{when:Xc(t,...n)}}const sx=`none`;var cx=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function lx(e,t,n,r,i){let{palette:a,tint:o}=e,s=ux(n,i),c=s!==sx,l=c?s===void 0?o:dx(a,s,`bg`):dx(a,`background`,`bg`);e.bg=l;let u=ux(r,i),d=u===void 0?c?Ta(a,l,t):void 0:dx(a,u,`fg`);return new B({...c&&{bgcolor:gn.fromRgba(l)},...d!==void 0&&{color:gn.fromRgba(d)}})}function ux(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function dx(e,t,n){try{return Xn(e,t)}catch(e){throw e instanceof qn?new cx(t,n,e.message):e}}const fx={help:[`-h`,`--help`],version:[`-V`,`--version`]},px=[`โ inserts`,`โ removes`,`โ๏ธ configures`,`โบ resets layout`],mx=`
|
|
91
91
|
cc-candybar - Beautiful powerline statusline for Claude Code
|
|
92
92
|
|
|
93
93
|
Usage: cc-candybar [options]
|
|
94
94
|
|
|
95
95
|
Standalone Commands:
|
|
96
|
-
${
|
|
97
|
-
${
|
|
96
|
+
${fx.help.join(`, `).padEnd(25)}Show this help
|
|
97
|
+
${fx.version.join(`, `).padEnd(25)}Print the version of this runtime (cc-candybar <version>)
|
|
98
98
|
|
|
99
99
|
Debugging:
|
|
100
100
|
CC_CANDYBAR_DEBUG=1 Enable debug logging for troubleshooting
|
|
@@ -117,7 +117,7 @@ Configuration:
|
|
|
117
117
|
failed row's [fix] to repair it (the same checks \`cc-candybar doctor\` runs).
|
|
118
118
|
|
|
119
119
|
Anywhere the bar shows (?), clicking it reveals these same instructions
|
|
120
|
-
in place. In edit mode: ${
|
|
120
|
+
in place. In edit mode: ${px.join(`, `)}.
|
|
121
121
|
|
|
122
122
|
Subcommands:
|
|
123
123
|
install One-shot setup: stages the runtime (native render
|
|
@@ -155,38 +155,38 @@ Config tooling:
|
|
|
155
155
|
config [--json] The effective merged config. (All three query the
|
|
156
156
|
running daemon; none spawn one.)
|
|
157
157
|
|
|
158
|
-
`,ux=`${gu}live`,dx=[`โ live`,`โ live`],fx=`${gu}done`,px={variable:ux,key:ux,member:`open`};function mx(e){return`${gu}configuring.p${e}`}function hx(e){return`and ${Zc(q_)} (not ${Zc(px)}) (ne .${mx(e)} "true")`}function gx(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${B_} "${Jc(e)}")`).join(` `)} false }}`}}function _x(e,t,n){return`{{ if ${hx(e)} }}${t}{{ else }}${n}{{ end }}`}const vx=`{{ and ${Zc(q_)} .preset.customized }}`,yx=vu,bx=`${gu}addable`;function xx(e){return new Map([[bx,{members:Object.keys(e.segments).filter(e=>!yx(e))}]])}function Sx(e,t,n){return n.segments[e]={template:t,when:J_},{kind:`segment`,name:e}}function Cx(e,t,n){let r=`${gu}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${wa}`}) (action "${r}" "โ") }}`}function wx(e){return`{{ if ${Zc(q_)} }}${e}{{ end }}`}function Tx(e,t){return e.reduce((e,t)=>`{{ if and ${Zc(q_)} ${Zc(t)} }}true{{ else }}${e}{{ end }}`,t)}function Ex(e){return e.flatMap(e=>[...Ms(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function Dx(e,t,n){return`${G_}${e}.${t}.${n}`}function Ox(e,t,n,r){let i=Os(n),a=`${gu}${e.presetIdent}`,o=K_(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:B_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Dx(e.presetIdent,i,r),l=`${G_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:qs(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=Xb(Jb(o),s,l,u);return Object.assign(e.artifacts.actions,d.actions),e.artifacts.segments[u]={template:d.kind===`ring`?`{{ "${Jc(o.label)}" }} ${d.template}`:d.template},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "โ๏ธ" }}`,ref:{variable:B_,key:B_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const kx=`${gu}label:`;function Ax(e){if(e.startsWith(kx)){let t=e.slice(kx.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function jx(e,t,n,r){let{artifacts:i}=n,a=Os(e),o=`${kx}${a}:${e.name}`;i.segments[o]={template:`{{ "${Jc(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=e.settings?.[Hs];return{...Yc(o,r.ref,r.body,`drop`,Tx([r.ref],`{{ ${hx(n.presetIdent)} }}`)),...s!==void 0&&{settings:{theme:s}},drafts:{[Hs]:r.drafts[Hs]}}}function Mx(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${gu}${i}.insert.${t}`,s=`${gu}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:bx,anchor:n,relation:r};let c=u_(o),l=d_(s,o,void 0),u=m_(l),d=p_(l,c);return a.variables[l]=$c(l,Wc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=el(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "โ" "โ" }}{{ if ${Zc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${wa}`}) $m }}{{ end }}`}}function Nx(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!yx(e.name)),i=e=>Nx(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=js(o,i);if(yx(o.name)){n.push(s);continue}let c=Os(o),l=a===r?[Mx(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Mx(t,u,c,`after`),f=Cx(t,u,c),p=t.segments[o.name],m=Ox(t,u,o,Us(p)),h=wx(f),g=wx(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>Sx(e.host,e.template,t.artifacts)),{...jx(o,p,t,m),lead:h,trail:g},{...s,when:_x(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},Sx(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:Tx(Ex(n),_x(t.presetIdent,`true`,e.when))}}}function Px(e,t,n,r,i,a,o){let s=`${gu}${n}.resetLayout`,c=`${gu}${n}.customized`;i.actions[s]={reset:r};let l=Jc(t);return i.segments[c]={template:`{{ action "${s}" "โบ ${l} customized" }}`,when:vx},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},Fx(e,o)]}}function Fx(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),Fx(n,t)]}:{...e,children:[...e.children,t]}}function Ix(e,t,n,r,i){let{node:a}=w_(e,t),o={presetIdent:pu(t),rootKey:ex(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},s=Nx(a,o);return n.variables[mx(o.presetIdent)]=gx(o.configured),Px(s,t,o.presetIdent,o.rootKey,n,r,i)}function Lx(e){let t={variables:{},actions:{},segments:{}},n=ax(`${gu}help`,cx,[q_],t);t.variables[ux]=$c(ux,Wc),t.actions[ux]=el(ux,px.member),t.segments[ux]={template:Qc(ux,...dx),when:J_};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:ux},n]};t.actions[fx]={do:[...U_]},t.segments[fx]={template:`{{ action "${fx}" "โ done" }}`,when:J_};let i={kind:`segment`,name:fx},a={...e.presets},o=[];for(let n of x_(e.presets)){let s=Ix(e,n,t,i,r);o.push(s),a[n]={...C_(e.presets,n),root:s}}let s=Ab(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Rx={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function zx(e){let t=e[Rx.socket]??``,n=e[Rx.pane]??``;if(t===``||n===``)return null;let r=e[Rx.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Bx=Rx.truecolor,Vx=[{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[Bx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Bx} 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:Bx,value:`1`}}}}}}];function Hx(e){return Vx.map(t=>({check:t,verdict:t.probe(e)}))}function Ux(e){return Vx.find(t=>t.name===e)}const Wx=`${K}doctor.`;function Gx(e){let t=`${Wx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Kx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Gx(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:Co}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?Co:So}]})}const qx={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function Jx(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(qx).map(([t,n])=>[`${e}${t}`,n]))}}const Yx=`armed`,Xx=`disarmed`,Zx=`.armed`,Qx=e=>e.endsWith(Zx);function $x(e,t,n){let r=`${e}${Zx}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${Yx}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "โ" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:Yx},[a]:{set:r,to:Xx},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:Xx}},disarm:a}}const eS=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function tS(e){return typeof e==`string`&&eS.test(e)?{kind:`line`,line:e}:{kind:`refused`,reason:`a slash command is "/" then its name, e.g. "/compact" or "/model opus", on one line with no control characters, got ${JSON.stringify(e)}`}}function nS(e){let t=tS(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const rS=[`/compact`,`/model`],iS=`/clear`;function aS(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=$x(`${e}clear`,{arm:iS,confirm:`${iS} โ confirm`},[n]);return{template:rS.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(rS.map(e=>[t(e),{slash:nS(e)}])),...r.actions,[n]:{slash:nS(iS)}},variables:r.variables,disarm:r.disarm}}const oS=`${K}menu`,sS=`open`,cS=`${K}edit`,lS=`${K}close`,uS=`${K}toolbar`,dS=Jx(K),fS=`${K}commands`,pS=aS(`${fS}.`),mS=`${K}tab`,hS=[{member:`session`,label:`โก session`},{member:`look`,label:`๐จ look`},{member:`layout`,label:`๐ layout`},{member:`config`,label:`โ config`},{member:`tools`,label:`๐งฐ tools`}],gS=e=>`${mS}.${e}`,_S=e=>`${gS(e)}.toggle`,vS=e=>({variable:mS,key:mS,member:e}),yS=`${K}save`,bS=`${K}unsaved`,xS=`${K}preset.save`,SS=`${K}preset.delete`,CS=`${K}resetAll`,wS=`${oS}.toggle`,TS={variable:oS,key:oS,member:sS},ES=`${K}undo`,DS=`${K}back`,OS=`${DS}.step`,kS=`${K}navigation.back`,AS=`{{ if gt .${kS} 0 }}{{ action "${DS}" "โ" }}{{ else }}${` `.repeat(Lt(`โ`))}{{ end }}`,jS=`${K}redo`,MS=`${K}resettable`,NS=`${K}doctor`,PS=`${NS}.run`,FS=e=>`${NS}.fix.${e}`,IS=e=>`${NS}.${e}`,LS=`${K}pickers`,RS=[{template:`{{ themePreview }}`}],zS={template:`{{ layoutPreview }}`},BS={preset:[zS,{when:`{{ not .preset.bundled }}`,template:`{{ action "${SS}" (printf "๐ delete %s" .${wb.preset.effectiveVar}) }}`}],theme:RS,style:RS,variation:[zS]},VS=e=>`${K}${e}`,HS=e=>`${K}apply.${e}`,US=e=>`${K}reset.${e}`,WS=e=>`${K}carousel.${e}`,GS=(e,t)=>`${WS(e)}.${t}`,KS=Object.keys(wb).map(e=>{let t=wb[e],n=dl(t.configKey);if(n===`text`)throw Error(`settings menu: globals.${t.configKey} is free text, which no control can change โ list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);let r=Xb({label:t.label,domain:n},t.sessionKey,t.effectiveVar,HS(e));return{...t,name:e,control:r,beneath:BS[e]??[]}}),qS={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,charset:`config`,colorCompatibility:`config`,updateNotice:`config`},JS=e=>KS.filter(t=>qS[t.name]===e).map(aC);new Set(KS.flatMap(e=>[e.sessionKey,e.configKey]));const YS=$x(CS,{arm:`โฒ`,confirm:`โฒ reset all?`},KS.map(e=>US(e.name))),XS=(e,t,n)=>({count:e,path:t,body:n,shown:`(gt .${e} 0)`}),ZS=[XS(bS,`unsaved`,`{{ action "${yS}" (printf "๐พ save %d" .${bS}) }}`),XS(`${K}history.undo`,`history.undo`,`{{ action "${ES}" "โถ" }}`),XS(`${K}history.redo`,`history.redo`,`{{ action "${jS}" "โท" }}`),{count:MS,path:`resettable`,body:YS.template,shown:`(or (gt .${MS} 0) ${YS.armed})`}],QS={when:`{{ or ${ZS.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+ZS.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},$S=[{step:YS,place:`door`},{step:pS,place:`session`}],eC=e=>e.map(e=>e.step.disarm),tC=eC($S),nC=eC($S.filter(e=>e.place!==`door`)),rC=f_(LS),iC=e=>({variable:rC,key:rC,member:u_(HS(e))});function aC(e){let t=VS(e.name);return e.control.kind===`inline`?{kind:`segment`,name:t}:Yc(t,iC(e.name),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:WS(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:GS(e.name,n)}))]},`drop`)}function oC(e){return e===oS}function sC(e){let t={kind:`segment`,name:oS};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[sC(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 cC(e){return lC(e)>0?e:sC(e)}function lC(e){let t=0;for(let n of Ms(e))n.kind===`segment`&&oC(n.name)&&(t+=1);return t}function uC(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&oC(e.name)||e.opens!==void 0&&uC(e.opens.body,!0):e.children.some(e=>uC(e,n))}const dC={session:{direction:`vertical`,segments:[uS,fS]},look:{direction:`horizontal`,segments:[]},layout:{direction:`horizontal`,segments:[xS,cS]},config:{direction:`horizontal`,segments:[]},tools:{direction:`vertical`,segments:[NS,...Vx.map(e=>IS(e.name))]}},fC=e=>({kind:`container`,direction:dC[e].direction,children:[...dC[e].segments.map(e=>({kind:`segment`,name:e})),...JS(e)]});function pC(e){return e.kind===`segment`?oC(e.name)?_C(Yc(e.name,TS,hC,`above`)):e:vC(e)}function mC(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...JS(`door`),{kind:`segment`,name:yS}]},{kind:`container`,direction:`horizontal`,children:hS.map(({member:e})=>Yc(gS(e),vS(e),fC(e),`drop`))}]}}const hC=mC();function gC(e){let t=new Map;for(let e of Ms(hC))e.kind===`segment`&&e.opens!==void 0&&t.set(e.opens.ref.key,e.opens.ref.variable);return[...t].map(([t,n])=>{let r=e.variables[n];if(r?.kind!==`state`||r.default===void 0)throw Error(`settings menu: the door folds "${t}", but "${n}" is not a state variable the menu declares with a default`);let i=`${oS}.fold.${pu(t)}`;return e.actions[i]={set:t,to:r.default},i})}function _C(e){return{...e,lead:AS}}function vC(e){return{...e,children:e.children.map(e=>pC(e))}}function yC(e){let t={variables:{[oS]:$c(oS,Wc)},actions:{[wS]:el(oS,sS),[PS]:{doctor:`run`},[lS]:{set:TS.key,to:Wc},[cS]:{do:[...U_,lS]},...dS.actions,...pS.actions,[yS]:{save:!0},[ES]:{undo:!0},[OS]:{back:!0},[DS]:{do:[OS,...tC]},[jS]:{redo:!0},[xS]:{preset:`save`},[SS]:{preset:`delete`,name:`{{ .${wb.preset.effectiveVar} }}`}},segments:{[oS]:{template:Qc(oS,e,`โ`)},[uS]:{template:dS.template},[fS]:{template:pS.template},[yS]:QS,[xS]:{template:`{{ action "${xS}" "+ preset" }}`},[NS]:{template:`{{ action "${PS}" "๐ฉบ doctor" }}`},[cS]:{template:`{{ action "${cS}" "โ arrange" "โ done" }}`}}};t.variables[kS]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of ZS)t.variables[e.count]={kind:`input`,path:e.path,type:`number`,default:0};t.variables[mS]=$c(mS,`session`);for(let{member:e,label:n}of hS)t.actions[_S(e)]=el(mS,e),t.actions[gS(e)]={do:[_S(e),...nC]},t.segments[gS(e)]={template:Qc(gS(e),n,`โพ ${n}`)};return Object.assign(t.variables,pS.variables,YS.variables),xC(t),bC(t),t.actions[oS]={do:[wS,...tC,...gC(t)]},t}function bC(e){for(let t of Vx){let n=Gx(t.name),r=FS(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[IS(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}โ ${t.label}{{ else }}โ ${t.label} โ {{ .${n.reason} }}{{ if eq .${n.fixable} "${So}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function xC(e){for(let t of KS){Object.assign(e.actions,t.control.actions);let n=US(t.name);e.actions[n]={reset:t.configKey};let r=`{{ action "${n}" "โบ" }}`;if(t.control.kind===`inline`){e.segments[VS(t.name)]={template:`${t.control.template} ${r}`};continue}let i=iC(t.name),a=p_(i.key,i.member);e.variables[i.key]=$c(i.key,Wc),e.actions[a]=el(i.key,i.member),e.segments[VS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} ${Qc(a,`โธ`,`โพ`)} `+r},e.segments[WS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[GS(t.name,r)]=n})}Object.assign(e.actions,YS.actions)}function SC(e){let{variables:t,actions:n}=Q_();Object.assign(e.variables,t),Object.assign(e.actions,n)}function CC(e){let t=yC(e.globals.menuGlyph??`๐ซ`);SC(t);let n={...e.presets},r=[];for(let t of x_(e.presets)){let{node:i}=w_(e,t),a=pC(cC(i));r.push(a),n[t]={...C_(e.presets,t),root:a}}let i=Ab(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const wC=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function TC(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function EC(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function DC(e,t){if(t===void 0)return{};if(!rc(t))return Z(e,`actions`,`actions must be an object, got ${ic(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=OC(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Z(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function OC(e,t,n){if(!rc(n))return Z(e,t,`${t} must be an action object, got ${ic(n)}`),null;if(`persistWhen`in n)return Z(e,t,`${t}.persistWhen was removed: declare the \`set\` alone โ a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=wC.filter(e=>e in n);return r.length===1?kC[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${wC.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const kC={set:(e,t,n)=>sw(e,t,n,`set`,rw),persist:(e,t,n)=>sw(e,t,n,`persist`,iw),copy:AC(`copy`),open:AC(`open`),reset:jC,undo:NC(`undo`),redo:NC(`redo`),back:NC(`back`),save:NC(`save`),preset:PC,doctor:FC,ceiling:IC,slash:LC,do:RC};function AC(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Qs(t,n,r,e);return i===null?null:{[e]:i}}}function jC(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=zC(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 MC={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,save:`it saves the session's unsaved settings`};function NC(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 โ ${MC[e]}), got ${G(r[e])}`),null)}}function PC(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Z(e,`${t}.preset`,`preset must be "save" or "delete", got ${G(r)}`),null;if(r===`save`)return{preset:`save`};let a=Qs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function FC(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Z(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${G(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||Ux(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Vx.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function IC(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Z(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${G(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Z(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${G(a)}`),null):{ceiling:`set`,to:a}}function LC(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=tS(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function RC(e,t,n){for(let r of Object.keys(n))r!==`do`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Z(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${G(r)}`),null):{do:r}}function zC(e,t,n,r,i,a){let o=Qs(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const BC={set:`the SessionState key to write`,persist:`the config globals field to write`};function VC(e,t,n,r){let i=BC[r],a=zC(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 HC(e){return e===`set`?`set-state`:`set-config`}const UC={to:cw(`set`)},WC={to:cw(`persist`)},GC={from:lw(`set`)},KC={from:lw(`persist`)},qC={min:mw(),max:mw(),by:mw()},JC={int:dw()},YC={cycle:uw(`set`)},XC={cycle:uw(`persist`)},ZC={removeSegment:fw(`removeSegment`)},QC={insertSegment:fw(`insertSegment`),anchor:fw(`anchor`),relation:pw()},$C={insertSegmentFrom:lw(`persist`),anchor:fw(`anchor`),relation:pw()},ew={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},tw={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function nw(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>oc(e,t,n,r),c=wc(t);return{detect:a,allowed:[...o,...i],label:i.join(`/`),json:{type:`object`,properties:{...Object.fromEntries(o.map(e=>[e,{type:`string`}])),...c.properties},required:[...o,...c.required??[]],additionalProperties:!1},parse:n.length?mc(s,...n):s}}const rw=[nw(`set`,UC),nw(`set`,GC),nw(`set`,qC,[ew,tw]),nw(`set`,JC),nw(`set`,YC)],iw=[nw(`persist`,WC),nw(`persist`,KC),nw(`persist`,qC,[ew,tw]),nw(`persist`,XC),nw(`persist`,ZC),nw(`persist`,QC,[],[`insertSegment`]),nw(`persist`,$C,[],[`insertSegmentFrom`])];function aw(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 ow(e){let t=aw(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 sw(e,t,n,r,i){let a=VC(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${ow(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 cw(e){let t=HC(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>zC(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 lw(e){let t=HC(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Z(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Z(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Z(n,s,`${i} array members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Z(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Z(n,s,`${i} array members must be unique โ a duplicated value would render the same picker option twice`);return}return r}Z(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${G(o)}`)}}}function uw(e){let t=HC(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${ic(o)}`);return}let c=o;if(c.length<2){Z(n,s,`cycle needs at least two members (one member has no successor โ use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Z(n,s,`cycle members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Z(n,s,`cycle members must be unique โ the successor of a duplicated member is ambiguous`);return}return c}}}function dw(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Z(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor โ a paged picker's page key), got ${G(r[n])}`);return}return!0}}}function fw(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Qs(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(t,o,`${e} "${a}" contains "/" or ":" โ segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function pw(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Z(e,`${t}.${n}`,`relation must be "before" or "after", got ${G(i)}`);return}return i}}}function mw(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Z(e,`${t}.${n}`,`${n} must be an integer, got ${G(i)}`);return}return i}}}function hw(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style โ endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const gw={noun:`style key`,fields:{hueShift:vc(),chromaScale:vc({min:0}),lightnessScale:vc(),lightnessShift:vc()}};function _w(e,t){if(!rc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${ic(t)}`,line:W(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free โ a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:W(e.source,[`styles`,r])});continue}if(so(r)){e.issues.push({path:`styles.${r}`,message:hw(`styles.${r}`,r,`globals.endcaps`),line:W(e.source,[`styles`,r])});continue}let t=ac(e,gw,`styles.${r}`,i);t!==null&&(n[r]={...Ln,...t})}return n}const vw={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:od(e,`${t}.${n}`,r[n])},globals:{required:!1,json:wl(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Cl(e,`${t}.${n}`,r[n])}}};function yw(e,t){if(!rc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${ic(t)}`,line:W(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free โ a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:W(e.source,[`presets`,r])});continue}let t=ac(e,vw,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function bw(e,t){if(t===void 0)return{};if(!rc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${ic(t)}`,line:W(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${G(i)}`,line:W(e.source,[`helpers`,r])});continue}n[r]=i}return n}const xw=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=xw.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${Sw(t)}`}function ww(e){let t=xw.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 Tw(e,t){let n=new Map;for(let e of Object.keys(t)){let t=pu(e),r=n.get(t);r?r.push(e):n.set(t,[e])}for(let[t,r]of n)r.length<2||e.issues.push({path:`presets`,message:`preset names ${r.map(e=>JSON.stringify(e)).join(` and `)} both collapse to the same synthesis identifier "${t}" โ edit mode's synthesized reset affordance would silently steal one preset's action for the other. Rename one.`,line:W(e.source,[`presets`])})}function Ew(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||$a(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:so(i)?hw(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:W(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:W(e.source,[`globals`,`preset`])}),Tw(e,t.presets);let i=Gb(t);for(let[n,r]of Object.entries(t.actions))!(`set`in r)||!(`from`in r)||typeof r.from!=`string`||Kb(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${Kb(i).join(`, `)})`,line:W(e.source,[`actions`,n,`from`])});for(let[n,r]of Object.entries(t.actions))`do`in r&&r.do.forEach((i,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,i)?t.actions[i]:void 0,s=o===void 0?`references unknown action "${i}"`:`do`in o?`"${i}" is itself a do action โ list its members here instead`:r.do.indexOf(i)===a?a>0&&EC(o)?`"${i}" takes its value from the template (from/int/insertSegmentFrom), so it can only be the first member โ only the first is bound the region's display`:void 0:`"${i}" is listed twice โ each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:W(e.source,[`actions`,n,`do`])})});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=nx(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Ol().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:W(e.source,[`actions`,n,a])});continue}let s=Dw.filter(e=>e in r);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a "presets.<name>.root" target โ ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:W(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){Ow(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!x_(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names preset "${o.preset}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:W(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${Su(o.segment)}`,line:W(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) โ use "to", "from", or "cycle" instead`,line:W(e.source,[`actions`,n,a])})}}let a=_v(t);for(let t of a.names)t!==`settings`&&!t.startsWith(kw)||e.issues.push({path:`variables`,message:`variable "${t}" is named under "settings", which a segment's templates read as its placement's own settings (.settings.<name>) โ rename it`,line:W(e.source,[`variables`,t])});let o=(t,n,r)=>{lC(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${oS}" ${lC(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}),uC(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${oS}" under a \`when\` or inside a disclosure body โ the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),s(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell โ everything inside a cell wears that cell's hue and tone, so it would place nothing. Set it on the row whose children are the cells (the horizontal container) or on the root, which places the rows.`,line:r});let i=new Map;for(let e of Ms(t)){if(e.kind!==`segment`)continue;let t=Os(e);i.set(t,[...i.get(t)??[],e])}for(let[t,a]of i){if(a.length<2)continue;let o=a[1].name,s=As(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" โ an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function s(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>s(n,t||Ds[e.direction]===`cell`))}let c=(n,r)=>{for(let[i,o]of Lc(n,r)){let n=W(e.source,o.split(`.`));if(i.when!==void 0&&(Vw(e,`${o}.when`,i.when,a,{line:n}),Bw(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(oC(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${oS}" an id or settings โ the anchor only marks where the menu goes, so place it as the bare name "${oS}"`,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}),Lw(e,t,i,o,n)}}};n.root!==void 0&&c(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&c(t.root,`presets.${e}.root`);let l=new Map([[`root`,Fc(t.root)]]);for(let e of x_(t.presets)){let{node:n,path:r}=w_(t,e);l.set(r,n)}for(let[t,n]of l)o(n,t,W(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){Rw(e,`variables.${n}`,r,a);let t=Cw(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:W(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))Rw(e,`segments.${n}.vars.${t}`,i,a,n);let i=Us(r);jw(e,n,i);let o=Aw(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){Vw(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of hv(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){Hw(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"${s}`,line:W(e.source,[`segments`,n,a])})}}}}for(let[n,r]of Object.entries(t.variables))zw(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))zw(e,`segments.${n}.vars.${t}`,i,a,n)}const Dw=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function Ow(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!x_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:c});return}if(r===`reset`)return;let l=`removeSegment`in o,u=`insertSegment`in o,d=`insertSegmentFrom`in o;if(!l&&!u&&!d){e.issues.push({path:s,message:`actions.${n}: "${i}" is a "presets.<name>.root" target and can only be paired with "removeSegment", "insertSegment", or "insertSegmentFrom" (not "to"/"from"/"cycle"/bounded โ those have no meaning as a tree op)`,line:c});return}let f=(r,i)=>{Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" is not a declared segment (have: ${Object.keys(t.segments).join(`, `)})${Su(i)}`,line:c})},p=new Set(ks(w_(t,a).node)),m=(r,i)=>{!xu.has(i)||p.has(i)||Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" names no placement${Su(i)}`,line:c})};`removeSegment`in o&&m(`removeSegment`,o.removeSegment),`insertSegment`in o&&f(`insertSegment`,o.insertSegment),(`insertSegment`in o||`insertSegmentFrom`in o)&&m(`anchor`,o.anchor)}const kw=`settings.`;function Aw(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>kw+e)])}}function jw(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:W(e.source,[`segments`,t,`settings`,n])})},a=Pw(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Gs(n,Nw(n)))i(e,`the defaults do not stand together: ${t}`)}function Mw(e){return Pw(e).length>0||Gs(e,Nw(e)).length>0}function Nw(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function Pw(e){let t=t=>Ws(Fw(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Ws(Fw(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${Iw(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 Fw(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function Iw(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Ws(n)!==void 0).map(([e])=>e)}function Lw(e,t,n,r,i){let a=Object.prototype.hasOwnProperty.call(t.segments,n.name)?t.segments[n.name]:void 0;if(a===void 0)return;let o=Us(a),s=`${r}: placement "${Os(n)}" of segment "${n.name}"`;for(let[t,a]of Object.entries(n.settings??{})){let c=Object.prototype.hasOwnProperty.call(o,t)?o[t]:void 0,l=c===void 0?`sets "${t}", which segment "${n.name}" does not declare (it has: ${Object.keys(o).join(`, `)})`:Ks(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Wa(a):``}, but it must be ${Ys(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Ks(o[e],t))||Mw(o)))for(let{message:t}of Gs(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function Rw(e,t,n,r,i){n.kind===`template`&&Vw(e,`${t}.template`,n.template,r,{segCtx:i}),zs(n)&&n.cache&&`key`in n.cache&&Vw(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function zw(e,t,n,r,i){if(zs(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.names.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.names.has(s)?` (segment-local vars are namespaced โ write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:W(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function Bw(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 Vw(e,t,n,r,i){for(let[a,o]of dv(n,r.helpers)){if(gv(a,r))continue;if(a.startsWith(kw)){let n=o===null?``:` through helper "${o}"`,r=a.slice(9),s=i?.segCtx===void 0||i.settings===void 0?`Template reads ".${a}"${n}, but only a segment's own templates have settings โ call it from a segment that declares "${r}"`:`Template reads ".${a}"${n}, but segment "${i.segCtx}" has no setting "${r}" (it has: ${Object.keys(i.settings).join(`, `)}) โ declare it under segments.${i.segCtx}.settings`;e.issues.push({path:t,message:s,line:i?.line??W(e.source,t.split(`.`))});continue}if(o!==null){Hw(e,o,`Template references unknown variable ".${a}"${ww(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&gv(n,r)?` (segment-local vars are namespaced โ write ".${n}")`:ww(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function Hw(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:W(e.source,[`helpers`,t])})}function Uw(e,t){let{graph:n,nodeInfo:r}=Ww(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` โ `)}`,line:W(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function Ww(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 dv(i,e.helpers).keys()){if(t.has(a)){r.get(n).add(a);continue}let e=a.split(`.`)[0];e!==a&&t.has(e)&&r.get(n).add(e)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),zs(n)&&(n.cache&&`key`in n.cache&&i(e,n.cache.key),n.cache&&`depends_on`in n.cache))for(let i of n.cache.depends_on)t.has(i)&&r.get(e).add(i)};for(let[t,n]of Object.entries(e.variables))a(t,n);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))a(`${t}.${e}`,r);return{graph:r,nodeInfo:n}}const Gw=[`json5`,`json`];function Kw(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function qw(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?p.homedir()+e.slice(1):e}function Jw(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Gw.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...Gw.map(e=>c.join(r,`.cc-candybar.${e}`)),...Gw.map(e=>`${Yw()}.${e}`)])]}function Yw(){let e=process.env.XDG_CONFIG_HOME??c.join(p.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function Xw(e,t,n){let r=[];for(let i of Jw(e,t,n)){let e=Kw(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 Zw(e,t,n){let r=Xw(e,t,n);return r.kind===`default`?`${Yw()}.${Gw[0]}`:r.path}function Qw(e){return $w(e).join(`
|
|
159
|
-
`)||null}function
|
|
158
|
+
`,hx=`${gu}live`,gx=[`โ live`,`โ live`],_x=`${gu}done`,vx={variable:hx,key:hx,member:`open`};function yx(e){return`${gu}configuring.p${e}`}function bx(e){return`and ${Zc(q_)} (not ${Zc(vx)}) (ne .${yx(e)} "true")`}function xx(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${B_} "${Jc(e)}")`).join(` `)} false }}`}}function Sx(e,t,n){return`{{ if ${bx(e)} }}${t}{{ else }}${n}{{ end }}`}const Cx=`{{ and ${Zc(q_)} .preset.customized }}`,wx=vu,Tx=`${gu}addable`;function Ex(e){return new Map([[Tx,{members:Object.keys(e.segments).filter(e=>!wx(e))}]])}function Dx(e,t,n){return n.segments[e]={template:t,when:J_,bg:sx},{kind:`segment`,name:e}}function Ox(e,t,n){let r=`${gu}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${wa}`}) (action "${r}" "โ") }}`}function kx(e){return`{{ if ${Zc(q_)} }}${e}{{ end }}`}function Ax(e,t){return e.reduce((e,t)=>`{{ if and ${Zc(q_)} ${Zc(t)} }}true{{ else }}${e}{{ end }}`,t)}function jx(e){return e.flatMap(e=>[...Ms(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function Mx(e,t,n){return`${G_}${e}.${t}.${n}`}function Nx(e,t,n,r){let i=Os(n),a=`${gu}${e.presetIdent}`,o=K_(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:B_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=Mx(e.presetIdent,i,r),l=`${G_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:qs(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=Xb(Jb(o),s,l,u);return Object.assign(e.artifacts.actions,d.actions),e.artifacts.segments[u]={template:d.kind===`ring`?`{{ "${Jc(o.label)}" }} ${d.template}`:d.template},{kind:`segment`,name:u}});return{term:`{{ action "${s}" "โ๏ธ" }}`,ref:{variable:B_,key:B_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const Px=`${gu}label:`;function Fx(e){if(e.startsWith(Px)){let t=e.slice(Px.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function Ix(e,t,n,r){let{artifacts:i}=n,a=Os(e),o=`${Px}${a}:${e.name}`;i.segments[o]={template:`{{ "${Jc(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=e.settings?.[Hs];return{...Yc(o,r.ref,r.body,`drop`,Ax([r.ref],`{{ ${bx(n.presetIdent)} }}`)),...s!==void 0&&{settings:{theme:s}},drafts:{[Hs]:r.drafts[Hs]}}}function Lx(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${gu}${i}.insert.${t}`,s=`${gu}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:Tx,anchor:n,relation:r};let c=u_(o),l=d_(s,o,void 0),u=m_(l),d=p_(l,c);return a.variables[l]=$c(l,Wc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=el(l,c),a.actions[u]={set:u,int:!0},{host:s,template:`{{ $m := menu "${o}" "โ" "โ" }}{{ if ${Zc({variable:l,key:l,member:c})} }}{{ $m }}{{ else }}{{ fg (${`readableOn (color "success") (bgOf) ${wa}`}) $m }}{{ end }}`}}function Rx(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!wx(e.name)),i=e=>Rx(e,t);for(let[a,o]of e.children.entries()){if(o.kind===`container`){n.push(i(o));continue}let s=js(o,i);if(wx(o.name)){n.push(s);continue}let c=Os(o),l=a===r?[Lx(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=Lx(t,u,c,`after`),f=Ox(t,u,c),p=t.segments[o.name],m=Nx(t,u,o,Us(p)),h=kx(f),g=kx(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>Dx(e.host,e.template,t.artifacts)),{...Ix(o,p,t,m),lead:h,trail:g},{...s,when:Sx(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},Dx(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:Ax(jx(n),Sx(t.presetIdent,`true`,e.when))}}}function zx(e,t,n,r,i,a,o){let s=`${gu}${n}.resetLayout`,c=`${gu}${n}.customized`;i.actions[s]={reset:r};let l=Jc(t);return i.segments[c]={template:`{{ action "${s}" "โบ ${l} customized" }}`,when:Cx},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[a,{kind:`segment`,name:c}]},Bx(e,o)]}}function Bx(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),Bx(n,t)]}:{...e,children:[...e.children,t]}}function Vx(e,t,n,r,i){let{node:a}=w_(e,t),o={presetIdent:pu(t),rootKey:ex(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},s=Rx(a,o);return n.variables[yx(o.presetIdent)]=xx(o.configured),zx(s,t,o.presetIdent,o.rootKey,n,r,i)}function Hx(e){let t={variables:{},actions:{},segments:{}},n=ax(`${gu}help`,px,[q_],t);t.variables[hx]=$c(hx,Wc),t.actions[hx]=el(hx,vx.member),t.segments[hx]={template:Qc(hx,...gx),when:J_};let r={kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:hx},n]};t.actions[_x]={do:[...U_]},t.segments[_x]={template:`{{ action "${_x}" "โ done" }}`,when:J_};let i={kind:`segment`,name:_x},a={...e.presets},o=[];for(let n of x_(e.presets)){let s=Vx(e,n,t,i,r);o.push(s),a[n]={...C_(e.presets,n),root:s}}let s=Ab(t,o,e);return{...e,variables:{...s,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:a}}const Ux={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Wx(e){let t=e[Ux.socket]??``,n=e[Ux.pane]??``;if(t===``||n===``)return null;let r=e[Ux.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Gx=Ux.truecolor,Kx=[{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[Gx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Gx} 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:Gx,value:`1`}}}}}}];function qx(e){return Kx.map(t=>({check:t,verdict:t.probe(e)}))}function Jx(e){return Kx.find(t=>t.name===e)}const Yx=`${K}doctor.`;function Xx(e){let t=`${Yx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Zx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Xx(e.name);return t.ok?[{key:n.verdict,value:`ok`},{key:n.reason,value:``},{key:n.fixable,value:Co}]:[{key:n.verdict,value:`failed`},{key:n.reason,value:t.reason},{key:n.fixable,value:t.fix===void 0?Co:So}]})}const Qx={copySession:{copy:`{{ .session.id }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`}};function $x(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(Qx).map(([t,n])=>[`${e}${t}`,n]))}}const eS=`armed`,tS=`disarmed`,nS=`.armed`,rS=e=>e.endsWith(nS);function iS(e,t,n){let r=`${e}${nS}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${eS}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "โ" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:eS},[a]:{set:r,to:tS},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:tS}},disarm:a}}const aS=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function oS(e){return typeof e==`string`&&aS.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 sS(e){let t=oS(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const cS=[`/compact`,`/model`],lS=`/clear`;function uS(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=iS(`${e}clear`,{arm:lS,confirm:`${lS} โ confirm`},[n]);return{template:cS.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,actions:{...Object.fromEntries(cS.map(e=>[t(e),{slash:sS(e)}])),...r.actions,[n]:{slash:sS(lS)}},variables:r.variables,disarm:r.disarm}}const dS=`${K}menu`,fS=`open`,pS=`${K}edit`,mS=`${K}close`,hS=`${K}toolbar`,gS=$x(K),_S=`${K}commands`,vS=uS(`${_S}.`),yS=`${K}tab`,bS=[{member:`session`,label:`โก session`},{member:`look`,label:`๐จ look`},{member:`layout`,label:`๐ layout`},{member:`config`,label:`โ config`},{member:`tools`,label:`๐งฐ tools`}],xS=e=>`${yS}.${e}`,SS=e=>`${xS(e)}.toggle`,CS=e=>({variable:yS,key:yS,member:e}),wS=`${K}save`,TS=`${K}unsaved`,ES=`${K}preset.save`,DS=`${K}preset.delete`,OS=`${K}resetAll`,kS=`${dS}.toggle`,AS={variable:dS,key:dS,member:fS},jS=`${K}undo`,MS=`${K}back`,NS=`${MS}.step`,PS=`${K}navigation.back`,FS=`{{ if gt .${PS} 0 }}{{ action "${MS}" "โ" }}{{ else }}${` `.repeat(Lt(`โ`))}{{ end }}`,IS=`${K}redo`,LS=`${K}resettable`,RS=`${K}doctor`,zS=`${RS}.run`,BS=e=>`${RS}.fix.${e}`,VS=e=>`${RS}.${e}`,HS=`${K}pickers`,US=[{template:`{{ themePreview }}`}],WS={template:`{{ layoutPreview }}`},GS={preset:[WS,{when:`{{ not .preset.bundled }}`,template:`{{ action "${DS}" (printf "๐ delete %s" .${wb.preset.effectiveVar}) }}`}],theme:US,style:US,variation:[WS]},KS=e=>`${K}${e}`,qS=e=>`${K}apply.${e}`,JS=e=>`${K}reset.${e}`,YS=e=>`${K}carousel.${e}`,XS=(e,t)=>`${YS(e)}.${t}`,ZS=Object.keys(wb).map(e=>{let t=wb[e],n=dl(t.configKey);if(n===`text`)throw Error(`settings menu: globals.${t.configKey} is free text, which no control can change โ list it in UNCONTROLLED_GLOBALS instead of SETTINGS`);let r=Xb({label:t.label,domain:n},t.sessionKey,t.effectiveVar,qS(e));return{...t,name:e,control:r,beneath:GS[e]??[]}}),QS={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,charset:`config`,colorCompatibility:`config`,updateNotice:`config`},$S=e=>ZS.filter(t=>QS[t.name]===e).map(uC);new Set(ZS.flatMap(e=>[e.sessionKey,e.configKey]));const eC=iS(OS,{arm:`โฒ`,confirm:`โฒ reset all?`},ZS.map(e=>JS(e.name))),tC=(e,t,n)=>({count:e,path:t,body:n,shown:`(gt .${e} 0)`}),nC=[tC(TS,`unsaved`,`{{ action "${wS}" (printf "๐พ save %d" .${TS}) }}`),tC(`${K}history.undo`,`history.undo`,`{{ action "${jS}" "โถ" }}`),tC(`${K}history.redo`,`history.redo`,`{{ action "${IS}" "โท" }}`),{count:LS,path:`resettable`,body:eC.template,shown:`(or (gt .${LS} 0) ${eC.armed})`}],rC={when:`{{ or ${nC.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+nC.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},iC=[{step:eC,place:`door`},{step:vS,place:`session`}],aC=e=>e.map(e=>e.step.disarm),oC=aC(iC),sC=aC(iC.filter(e=>e.place!==`door`)),cC=f_(HS),lC=e=>({variable:cC,key:cC,member:u_(qS(e))});function uC(e){let t=KS(e.name);return e.control.kind===`inline`?{kind:`segment`,name:t}:Yc(t,lC(e.name),{kind:`container`,direction:`vertical`,children:[{kind:`segment`,name:YS(e.name)},...e.beneath.map((t,n)=>({kind:`segment`,name:XS(e.name,n)}))]},`drop`)}function dC(e){return e===dS}function fC(e){let t={kind:`segment`,name:dS};if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[fC(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 pC(e){return mC(e)>0?e:fC(e)}function mC(e){let t=0;for(let n of Ms(e))n.kind===`segment`&&dC(n.name)&&(t+=1);return t}function hC(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&dC(e.name)||e.opens!==void 0&&hC(e.opens.body,!0):e.children.some(e=>hC(e,n))}const gC={session:{direction:`vertical`,segments:[hS,_S]},look:{direction:`horizontal`,segments:[]},layout:{direction:`horizontal`,segments:[ES,pS]},config:{direction:`horizontal`,segments:[]},tools:{direction:`vertical`,segments:[RS,...Kx.map(e=>VS(e.name))]}},_C=e=>({kind:`container`,direction:gC[e].direction,children:[...gC[e].segments.map(e=>({kind:`segment`,name:e})),...$S(e)]});function vC(e){return e.kind===`segment`?dC(e.name)?SC(Yc(e.name,AS,bC,`above`)):e:CC(e)}function yC(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...$S(`door`),{kind:`segment`,name:wS}]},{kind:`container`,direction:`horizontal`,children:bS.map(({member:e})=>Yc(xS(e),CS(e),_C(e),`drop`))}]}}const bC=yC();function xC(e){let t=new Map;for(let e of Ms(bC))e.kind===`segment`&&e.opens!==void 0&&t.set(e.opens.ref.key,e.opens.ref.variable);return[...t].map(([t,n])=>{let r=e.variables[n];if(r?.kind!==`state`||r.default===void 0)throw Error(`settings menu: the door folds "${t}", but "${n}" is not a state variable the menu declares with a default`);let i=`${dS}.fold.${pu(t)}`;return e.actions[i]={set:t,to:r.default},i})}function SC(e){return{...e,lead:FS}}function CC(e){return{...e,children:e.children.map(e=>vC(e))}}function wC(e){let t={variables:{[dS]:$c(dS,Wc)},actions:{[kS]:el(dS,fS),[zS]:{doctor:`run`},[mS]:{set:AS.key,to:Wc},[pS]:{do:[...U_,mS]},...gS.actions,...vS.actions,[wS]:{save:!0},[jS]:{undo:!0},[NS]:{back:!0},[MS]:{do:[NS,...oC]},[IS]:{redo:!0},[ES]:{preset:`save`},[DS]:{preset:`delete`,name:`{{ .${wb.preset.effectiveVar} }}`}},segments:{[dS]:{template:Qc(dS,e,`โ`)},[hS]:{template:gS.template},[_S]:{template:vS.template},[wS]:rC,[ES]:{template:`{{ action "${ES}" "+ preset" }}`},[RS]:{template:`{{ action "${zS}" "๐ฉบ doctor" }}`},[pS]:{template:`{{ action "${pS}" "โ arrange" "โ done" }}`}}};t.variables[PS]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of nC)t.variables[e.count]={kind:`input`,path:e.path,type:`number`,default:0};t.variables[yS]=$c(yS,`session`);for(let{member:e,label:n}of bS)t.actions[SS(e)]=el(yS,e),t.actions[xS(e)]={do:[SS(e),...sC]},t.segments[xS(e)]={template:Qc(xS(e),n,`โพ ${n}`)};return Object.assign(t.variables,vS.variables,eC.variables),EC(t),TC(t),t.actions[dS]={do:[kS,...oC,...xC(t)]},t}function TC(e){for(let t of Kx){let n=Xx(t.name),r=BS(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[VS(t.name)]={when:`{{ ne .${n.verdict} "" }}`,template:`{{ if eq .${n.verdict} "ok" }}โ ${t.label}{{ else }}โ ${t.label} โ {{ .${n.reason} }}{{ if eq .${n.fixable} "${So}" }} {{ action "${r}" "[fix]" }}{{ end }}{{ end }}`}}}function EC(e){for(let t of ZS){Object.assign(e.actions,t.control.actions);let n=JS(t.name);e.actions[n]={reset:t.configKey};let r=`{{ action "${n}" "โบ" }}`;if(t.control.kind===`inline`){e.segments[KS(t.name)]={template:`${t.control.template} ${r}`};continue}let i=lC(t.name),a=p_(i.key,i.member);e.variables[i.key]=$c(i.key,Wc),e.actions[a]=el(i.key,i.member),e.segments[KS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} ${Qc(a,`โธ`,`โพ`)} `+r},e.segments[YS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[XS(t.name,r)]=n})}Object.assign(e.actions,eC.actions)}function DC(e){let{variables:t,actions:n}=Q_();Object.assign(e.variables,t),Object.assign(e.actions,n)}function OC(e){let t=wC(e.globals.menuGlyph??`๐ซ`);DC(t);let n={...e.presets},r=[];for(let t of x_(e.presets)){let{node:i}=w_(e,t),a=vC(pC(i));r.push(a),n[t]={...C_(e.presets,t),root:a}}let i=Ab(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const kC=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function AC(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function jC(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function MC(e,t){if(t===void 0)return{};if(!rc(t))return Z(e,`actions`,`actions must be an object, got ${ic(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=NC(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Z(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function NC(e,t,n){if(!rc(n))return Z(e,t,`${t} must be an action object, got ${ic(n)}`),null;if(`persistWhen`in n)return Z(e,t,`${t}.persistWhen was removed: declare the \`set\` alone โ a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=kC.filter(e=>e in n);return r.length===1?PC[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${kC.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const PC={set:(e,t,n)=>fw(e,t,n,`set`,cw),persist:(e,t,n)=>fw(e,t,n,`persist`,lw),copy:FC(`copy`),open:FC(`open`),reset:IC,undo:RC(`undo`),redo:RC(`redo`),back:RC(`back`),save:RC(`save`),preset:zC,doctor:BC,ceiling:VC,slash:HC,do:UC};function FC(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Qs(t,n,r,e);return i===null?null:{[e]:i}}}function IC(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 LC={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,save:`it saves the session's unsaved settings`};function RC(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 โ ${LC[e]}), got ${G(r[e])}`),null)}}function zC(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Z(e,`${t}.preset`,`preset must be "save" or "delete", got ${G(r)}`),null;if(r===`save`)return{preset:`save`};let a=Qs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function 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 ${G(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||Jx(a)===void 0?(Z(e,`${t}.check`,`doctor fix must name a check (have: ${Kx.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function VC(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Z(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Z(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${G(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Z(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${G(a)}`),null):{ceiling:`set`,to:a}}function HC(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=oS(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function UC(e,t,n){for(let r of Object.keys(n))r!==`do`&&Z(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Z(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${G(r)}`),null):{do:r}}function WC(e,t,n,r,i,a){let o=Qs(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const GC={set:`the SessionState key to write`,persist:`the config globals field to write`};function KC(e,t,n,r){let i=GC[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 qC(e){return e===`set`?`set-state`:`set-config`}const JC={to:pw(`set`)},YC={to:pw(`persist`)},XC={from:mw(`set`)},ZC={from:mw(`persist`)},QC={min:yw(),max:yw(),by:yw()},$C={int:gw()},ew={cycle:hw(`set`)},tw={cycle:hw(`persist`)},nw={removeSegment:_w(`removeSegment`)},rw={insertSegment:_w(`insertSegment`),anchor:_w(`anchor`),relation:vw()},iw={insertSegmentFrom:mw(`persist`),anchor:_w(`anchor`),relation:vw()},aw={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},ow={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function sw(e,t,n=[],r){let i=Object.keys(t),a=r??i,o=[e],s=(e,n,r)=>oc(e,t,n,r),c=wc(t);return{detect:a,allowed:[...o,...i],label:i.join(`/`),json:{type:`object`,properties:{...Object.fromEntries(o.map(e=>[e,{type:`string`}])),...c.properties},required:[...o,...c.required??[]],additionalProperties:!1},parse:n.length?mc(s,...n):s}}const cw=[sw(`set`,JC),sw(`set`,XC),sw(`set`,QC,[aw,ow]),sw(`set`,$C),sw(`set`,ew)],lw=[sw(`persist`,YC),sw(`persist`,ZC),sw(`persist`,QC,[aw,ow]),sw(`persist`,tw),sw(`persist`,nw),sw(`persist`,rw,[],[`insertSegment`]),sw(`persist`,iw,[],[`insertSegmentFrom`])];function uw(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 dw(e){let t=uw(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 fw(e,t,n,r,i){let a=KC(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${dw(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 pw(e){let t=qC(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 mw(e){let t=qC(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Z(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Z(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Z(n,s,`${i} array members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Z(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Z(n,s,`${i} array members must be unique โ a duplicated value would render the same picker option twice`);return}return r}Z(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${G(o)}`)}}}function hw(e){let t=qC(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${ic(o)}`);return}let c=o;if(c.length<2){Z(n,s,`cycle needs at least two members (one member has no successor โ use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Z(n,s,`cycle members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Z(n,s,`cycle members must be unique โ the successor of a duplicated member is ambiguous`);return}return c}}}function gw(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Z(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor โ a paged picker's page key), got ${G(r[n])}`);return}return!0}}}function _w(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Qs(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(t,o,`${e} "${a}" contains "/" or ":" โ segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function vw(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Z(e,`${t}.${n}`,`relation must be "before" or "after", got ${G(i)}`);return}return i}}}function yw(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Z(e,`${t}.${n}`,`${n} must be an integer, got ${G(i)}`);return}return i}}}function bw(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style โ endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const xw={noun:`style key`,fields:{hueShift:vc(),chromaScale:vc({min:0}),lightnessScale:vc(),lightnessShift:vc()}};function Sw(e,t){if(!rc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${ic(t)}`,line:W(e.source,[`styles`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)){e.issues.push({path:`styles.${r}`,message:`style name ${JSON.stringify(r)} must be non-empty and slash-free โ a style picker writes the name on the set-state wire, which rejects empty values and splits on "/"`,line:W(e.source,[`styles`,r])});continue}if(so(r)){e.issues.push({path:`styles.${r}`,message:bw(`styles.${r}`,r,`globals.endcaps`),line:W(e.source,[`styles`,r])});continue}let t=ac(e,xw,`styles.${r}`,i);t!==null&&(n[r]={...Ln,...t})}return n}const Cw={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:od(e,`${t}.${n}`,r[n])},globals:{required:!1,json:wl(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Cl(e,`${t}.${n}`,r[n])}}};function ww(e,t){if(!rc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${ic(t)}`,line:W(e.source,[`presets`])}),{};let n={};for(let[r,i]of Object.entries(t)){if(r===``||r.includes(`/`)||/[\n\r]/.test(r)){e.issues.push({path:`presets.${r}`,message:`preset name ${JSON.stringify(r)} must be non-empty, slash-free, and newline-free โ a preset picker writes the name on the set-state wire (which rejects empty values and splits on "/"), and edit mode splices it into a synthesized template string`,line:W(e.source,[`presets`,r])});continue}let t=ac(e,Cw,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function Tw(e,t){if(t===void 0)return{};if(!rc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${ic(t)}`,line:W(e.source,[`helpers`])}),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){if(typeof i!=`string`){e.issues.push({path:`helpers.${r}`,message:`helpers.${r} must be a string template body, got ${G(i)}`,line:W(e.source,[`helpers`,r])});continue}n[r]=i}return n}const Ew=new Map([[`session.budget.amount`,{segment:`session`,setting:`budget`}],[`session.budget.warningThreshold`,{segment:`session`,setting:`warnAt`}],[`today.budget.amount`,{segment:`today`,setting:`budget`}],[`today.budget.warningThreshold`,{segment:`today`,setting:`warnAt`}],[`block.budget.heatThreshold`,{segment:`block`,setting:`warnAt`}],[`block.budget.warningThreshold`,{segment:`block`,setting:`errorAt`}],[`weekly.budget.heatThreshold`,{segment:`weekly`,setting:`warnAt`}],[`weekly.budget.warningThreshold`,{segment:`weekly`,setting:`errorAt`}],[`burn.eta.errorMinutes`,{segment:`burnrate`,setting:`errorWithin`}],[`burn.eta.warnMinutes`,{segment:`burnrate`,setting:`warnWithin`}]]);function Dw(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 Ow(e){let t=Ew.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${Dw(t)}`}function kw(e){let t=Ew.get(e);return t===void 0?``:` โ ".${e}" is no longer a variable: ${Dw(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function Aw(e,t){let n=new Map;for(let e of Object.keys(t)){let t=pu(e),r=n.get(t);r?r.push(e):n.set(t,[e])}for(let[t,r]of n)r.length<2||e.issues.push({path:`presets`,message:`preset names ${r.map(e=>JSON.stringify(e)).join(` and `)} both collapse to the same synthesis identifier "${t}" โ edit mode's synthesized reset affordance would silently steal one preset's action for the other. Rename one.`,line:W(e.source,[`presets`])})}function jw(e,t,n){let r=[[[`globals`],t.globals.style],[[`editGlobals`],t.editGlobals.style],...Object.entries(t.presets).map(([e,t])=>[[`presets`,e,`globals`],t.globals?.style])];for(let[n,i]of r){if(i===void 0||$a(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:so(i)?bw(r,i,`${n.join(`.`)}.endcaps`):`${r} "${i}" does not match any declared style (have: ${Object.keys(t.styles).join(`, `)})`,line:W(e.source,[...n,`style`])})}t.globals.preset!==void 0&&!Object.prototype.hasOwnProperty.call(t.presets,t.globals.preset)&&e.issues.push({path:`globals.preset`,message:`globals.preset "${t.globals.preset}" does not match any declared preset (have: ${Object.keys(t.presets).join(`, `)})`,line:W(e.source,[`globals`,`preset`])}),Aw(e,t.presets);let i=Gb(t);for(let[n,r]of Object.entries(t.actions))!(`set`in r)||!(`from`in r)||typeof r.from!=`string`||Kb(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${Kb(i).join(`, `)})`,line:W(e.source,[`actions`,n,`from`])});for(let[n,r]of Object.entries(t.actions))`do`in r&&r.do.forEach((i,a)=>{let o=Object.prototype.hasOwnProperty.call(t.actions,i)?t.actions[i]:void 0,s=o===void 0?`references unknown action "${i}"`:`do`in o?`"${i}" is itself a do action โ list its members here instead`:r.do.indexOf(i)===a?a>0&&jC(o)?`"${i}" takes its value from the template (from/int/insertSegmentFrom), so it can only be the first member โ only the first is bound the region's display`:void 0:`"${i}" is listed twice โ each member fires once per click`;s!==void 0&&e.issues.push({path:`actions.${n}.do`,message:`actions.${n} do: ${s}`,line:W(e.source,[`actions`,n,`do`])})});for(let[n,r]of Object.entries(t.actions)){let i=`persist`in r?r.persist:`reset`in r?r.reset:null;if(i===null)continue;let a=`persist`in r?`persist`:`reset`,o=nx(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Ol().join(`, `)}), a "segments.<name>.palette" target, a "presets.<name>.globals.<field>" target, or a "presets.<name>.root" target`,line:W(e.source,[`actions`,n,a])});continue}let s=Mw.filter(e=>e in r);if(o.scope!==`preset-root`&&s.length>0){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a "presets.<name>.root" target โ ${s.map(e=>`"${e}"`).join(`/`)} is a tree op and applies only to one`,line:W(e.source,[`actions`,n,a])});continue}if(o.scope===`preset-root`){Nw(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!x_(t.presets).includes(o.preset)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names preset "${o.preset}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:W(e.source,[`actions`,n,a])});continue}if(o.scope===`segment-palette`){if(!Object.prototype.hasOwnProperty.call(t.segments,o.segment)){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" names segment "${o.segment}" which is not declared (have segments: ${Object.keys(t.segments).join(`, `)})${Su(o.segment)}`,line:W(e.source,[`actions`,n,a])});continue}`min`in r&&e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is a segment palette target and cannot use a bounded stepper (min/max/by) โ use "to", "from", or "cycle" instead`,line:W(e.source,[`actions`,n,a])})}}let a=_v(t);for(let t of a.names)t!==`settings`&&!t.startsWith(Pw)||e.issues.push({path:`variables`,message:`variable "${t}" is named under "settings", which a segment's templates read as its placement's own settings (.settings.<name>) โ rename it`,line:W(e.source,[`variables`,t])});let o=(t,n,r)=>{mC(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${dS}" ${mC(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}),hC(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${dS}" under a \`when\` or inside a disclosure body โ the menu is visible under every condition, so its placement may not be gated. Move it to an ungated position, or remove it to put the menu at its default position.`,line:r}),s(t)&&e.issues.push({path:n,message:`${n} sets "distribution" on a container inside a bar cell โ everything inside a cell wears that cell's hue and tone, so it would place nothing. Set it on the row whose children are the cells (the horizontal container) or on the root, which places the rows.`,line:r});let i=new Map;for(let e of Ms(t)){if(e.kind!==`segment`)continue;let t=Os(e);i.set(t,[...i.get(t)??[],e])}for(let[t,a]of i){if(a.length<2)continue;let o=a[1].name,s=As(o,new Set(i.keys()));e.issues.push({path:n,message:`${n} has ${a.length} placements with the id "${t}" โ an id names one placement (its settings, its menus' open state, and edit mode all address it), so give each its own: { seg: "${o}", id: "${s}" }. A placement without an "id" takes its segment's name.`,line:r})}};function s(e,t=!1){return e.kind===`segment`?!1:t&&e.distribution!==void 0||e.children.some(n=>s(n,t||Ds[e.direction]===`cell`))}let c=(n,r)=>{for(let[i,o]of Lc(n,r)){let n=W(e.source,o.split(`.`));if(i.when!==void 0&&(Kw(e,`${o}.when`,i.when,a,{line:n}),Gw(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(dC(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${dS}" an id or settings โ the anchor only marks where the menu goes, so place it as the bare name "${dS}"`,line:n});continue}Object.prototype.hasOwnProperty.call(t.segments,i.name)||e.issues.push({path:o,message:`${r} entry "${i.name}" does not match any declared segment${Su(i.name)}`,line:n}),Hw(e,t,i,o,n)}}};n.root!==void 0&&c(n.root,`root`);for(let[e,t]of Object.entries(n.presets??{}))t.root!==void 0&&c(t.root,`presets.${e}.root`);let l=new Map([[`root`,Fc(t.root)]]);for(let e of x_(t.presets)){let{node:n,path:r}=w_(t,e);l.set(r,n)}for(let[t,n]of l)o(n,t,W(e.source,t.split(`.`)));for(let[n,r]of Object.entries(t.variables)){Uw(e,`variables.${n}`,r,a);let t=Ow(n);t!==void 0&&e.issues.push({path:`variables.${n}`,message:t,line:W(e.source,[`variables`,n])})}for(let[n,r]of Object.entries(t.segments)){if(r.vars)for(let[t,i]of Object.entries(r.vars))Uw(e,`segments.${n}.vars.${t}`,i,a,n);let i=Us(r);Iw(e,n,i);let o=Fw(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){Kw(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of hv(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){qw(e,o,`Template references unknown action "${r}"${s}`);continue}e.issues.push({path:`segments.${n}.${a}`,message:`${a} references unknown action "${r}"${s}`,line:W(e.source,[`segments`,n,a])})}}}}for(let[n,r]of Object.entries(t.variables))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 Mw=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function Nw(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!x_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${x_(t.presets).join(`, `)})`,line:c});return}if(r===`reset`)return;let l=`removeSegment`in o,u=`insertSegment`in o,d=`insertSegmentFrom`in o;if(!l&&!u&&!d){e.issues.push({path:s,message:`actions.${n}: "${i}" is a "presets.<name>.root" target and can only be paired with "removeSegment", "insertSegment", or "insertSegmentFrom" (not "to"/"from"/"cycle"/bounded โ those have no meaning as a tree op)`,line:c});return}let f=(r,i)=>{Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" is not a declared segment (have: ${Object.keys(t.segments).join(`, `)})${Su(i)}`,line:c})},p=new Set(ks(w_(t,a).node)),m=(r,i)=>{!xu.has(i)||p.has(i)||Object.prototype.hasOwnProperty.call(t.segments,i)||e.issues.push({path:s,message:`actions.${n}: ${r} "${i}" names no placement${Su(i)}`,line:c})};`removeSegment`in o&&m(`removeSegment`,o.removeSegment),`insertSegment`in o&&f(`insertSegment`,o.insertSegment),(`insertSegment`in o||`insertSegmentFrom`in o)&&m(`anchor`,o.anchor)}const Pw=`settings.`;function Fw(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>Pw+e)])}}function Iw(e,t,n){let r=e=>`segments.${t}.settings.${e}`,i=(n,i)=>{e.issues.push({path:r(n),message:`${r(n)}: ${i}`,line:W(e.source,[`segments`,t,`settings`,n])})},a=zw(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Gs(n,Rw(n)))i(e,`the defaults do not stand together: ${t}`)}function Lw(e){return zw(e).length>0||Gs(e,Rw(e)).length>0}function Rw(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function zw(e){let t=t=>Ws(Bw(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Ws(Bw(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${Vw(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 Vw(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Ws(n)!==void 0).map(([e])=>e)}function Hw(e,t,n,r,i){let a=Object.prototype.hasOwnProperty.call(t.segments,n.name)?t.segments[n.name]:void 0;if(a===void 0)return;let o=Us(a),s=`${r}: placement "${Os(n)}" of segment "${n.name}"`;for(let[t,a]of Object.entries(n.settings??{})){let c=Object.prototype.hasOwnProperty.call(o,t)?o[t]:void 0,l=c===void 0?`sets "${t}", which segment "${n.name}" does not declare (it has: ${Object.keys(o).join(`, `)})`:Ks(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Wa(a):``}, but it must be ${Ys(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Ks(o[e],t))||Lw(o)))for(let{message:t}of Gs(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function Uw(e,t,n,r,i){n.kind===`template`&&Kw(e,`${t}.template`,n.template,r,{segCtx:i}),zs(n)&&n.cache&&`key`in n.cache&&Kw(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function Ww(e,t,n,r,i){if(zs(n)&&n.cache&&`depends_on`in n.cache)for(let a=0;a<n.cache.depends_on.length;a++){let o=n.cache.depends_on[a];if(r.names.has(o))continue;let s=i===void 0?void 0:`${i}.${o}`,c=s!==void 0&&r.names.has(s)?` (segment-local vars are namespaced โ write "${s}")`:``;e.issues.push({path:`${t}.cache.depends_on[${a}]`,message:`cache.depends_on references unknown variable "${o}"${c}`,line:W(e.source,[...t.split(`.`),`cache`,`depends_on`])})}}function Gw(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 Kw(e,t,n,r,i){for(let[a,o]of dv(n,r.helpers)){if(gv(a,r))continue;if(a.startsWith(Pw)){let n=o===null?``:` through helper "${o}"`,r=a.slice(9),s=i?.segCtx===void 0||i.settings===void 0?`Template reads ".${a}"${n}, but only a segment's own templates have settings โ call it from a segment that declares "${r}"`:`Template reads ".${a}"${n}, but segment "${i.segCtx}" has no setting "${r}" (it has: ${Object.keys(i.settings).join(`, `)}) โ declare it under segments.${i.segCtx}.settings`;e.issues.push({path:t,message:s,line:i?.line??W(e.source,t.split(`.`))});continue}if(o!==null){qw(e,o,`Template references unknown variable ".${a}"${kw(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&gv(n,r)?` (segment-local vars are namespaced โ write ".${n}")`:kw(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function qw(e,t,n){let r=`helpers.${t}`;e.issues.some(e=>e.path===r&&e.message===n)||e.issues.push({path:r,message:n,line:W(e.source,[`helpers`,t])})}function Jw(e,t){let{graph:n,nodeInfo:r}=Yw(t),i=new Map,a=[];for(let e of n.keys())i.set(e,0);for(let e of n.keys())if(i.get(e)===0&&o(e))return;function o(t){i.set(t,1),a.push(t);for(let s of n.get(t)??[]){let t=i.get(s);if(t===1){let t=a.indexOf(s),n=[...a.slice(t),s],i=n[0],o=r.get(i);return e.issues.push({path:o?.declarationPath??`variables.${i}`,message:`Dependency cycle: ${n.join(` โ `)}`,line:W(e.source,o?.linePathParts??[`variables`,i])}),!0}if(t===0&&o(s))return!0}return i.set(t,2),a.pop(),!1}}function Yw(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 dv(i,e.helpers).keys()){if(t.has(a)){r.get(n).add(a);continue}let e=a.split(`.`)[0];e!==a&&t.has(e)&&r.get(n).add(e)}},a=(e,n)=>{if(n.kind===`template`&&i(e,n.template),zs(n)&&(n.cache&&`key`in n.cache&&i(e,n.cache.key),n.cache&&`depends_on`in n.cache))for(let i of n.cache.depends_on)t.has(i)&&r.get(e).add(i)};for(let[t,n]of Object.entries(e.variables))a(t,n);for(let[t,n]of Object.entries(e.segments))if(n.vars)for(let[e,r]of Object.entries(n.vars))a(`${t}.${e}`,r);return{graph:r,nodeInfo:n}}const Xw=[`json5`,`json`];function Zw(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function Qw(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?p.homedir()+e.slice(1):e}function $w(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?Xw.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...Xw.map(e=>c.join(r,`.cc-candybar.${e}`)),...Xw.map(e=>`${eT()}.${e}`)])]}function eT(){let e=process.env.XDG_CONFIG_HOME??c.join(p.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function tT(e,t,n){let r=[];for(let i of $w(e,t,n)){let e=Zw(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 nT(e,t,n){let r=tT(e,t,n);return r.kind===`default`?`${eT()}.${Xw[0]}`:r.path}function rT(e){return iT(e).join(`
|
|
159
|
+
`)||null}function iT(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 aT(e,t){let n=$w(e,t).filter(e=>Zw(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 oT(e,t,n){return e===null?{...cT,config:Bc(cT.raw,t)}:sT(e,r.readFileSync(e,`utf-8`),t,n)}function sT(e,t,n,r){let i={source:t,...dT(e,t,r,Iu(n))};return{...i,config:Bc(i.raw,n)}}const cT={raw:{},source:``,warnings:[]};function lT({config:e,raw:t,source:n},r=`<config>`,i=new Set(qa())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(jw(o,e,t),Jw(o,e),a.length>0)throw new xs(r,a);let s=L_(e,a);if(a.length>0)throw new xs(r,a);return Hx(OC(s))}function uT(e,t,n=new Set(qa()),r=fT){return dT(e,t,n,r).raw}function dT(e,t,n,r){let i=pT(e,t),a=ws(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(qa()),groups:[]};if(!rc(i))throw new xs(e,[{path:``,message:`Config root must be an object, got ${ic(i)}`}],o);let l=mT(c,i,r);if(s.length>0)throw new xs(e,s,o);return{raw:l,warnings:o}}const fT=new Set;function pT(e,t){try{return Qe.default.parse(t)}catch(t){let n=t;throw new xs(e,[{path:``,message:`JSON5 syntax error: ${n.message}`,line:n.lineNumber,col:n.columnNumber}])}}function mT(e,t,n){for(let n of Object.keys(t))hT.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...hT].join(`, `)}`,line:W(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=Sl(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Hl(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Lu(e,t.segments,n)),t.layout!==void 0&&e.issues.push({path:`layout`,message:`"layout" is no longer supported โ use "root" with the A-grammar instead.
|
|
160
160
|
Replace: layout: [["seg1", "seg2"], ["seg3"]]
|
|
161
161
|
With: root: { v: [{ h: ["seg1", "seg2"] }, "seg3"] }
|
|
162
|
-
Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=od(e,`root`,t.root)),t.actions!==void 0&&(r.actions=
|
|
163
|
-
`)}function
|
|
164
|
-
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const
|
|
165
|
-
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function
|
|
166
|
-
`)}function
|
|
167
|
-
`)}]}function
|
|
168
|
-
`),process.exit(1));let t;try{t=
|
|
169
|
-
`),process.exit(1)}function
|
|
162
|
+
Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=od(e,`root`,t.root)),t.actions!==void 0&&(r.actions=MC(e,t.actions)),t.looks!==void 0&&e.issues.push({path:`looks`,message:`"looks" was renamed "styles" โ move the block under styles: { โฆ } (and globals.look to globals.style)`,line:W(e.source,[`looks`])}),t.styles!==void 0&&(r.styles=Sw(e,t.styles)),t.presets!==void 0&&(r.presets=ww(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Tl(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=Tw(e,t.helpers)),md(e,r),F_(e,r),Z_(e,r),bu(e,r,K,`the global settings menu`),r}const hT=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function gT(e){let t=xT(e.termCols),n=xT(e.termRows),r=ST(e.ssh),i=yT(e.tmux),a=vT(e.configEnv),o=_T(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 _T(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function vT(e){return typeof e==`string`&&e!==``?Qw(e):void 0}function yT(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 bT=1e4;function xT(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>bT?bT:t}function ST(e){return typeof e==`boolean`?e:void 0}var CT=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function wT(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function TT(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 CT(`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 CT(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function ET(e,t,n){return new Promise((r,i)=>{let a=!1,o=t=>{if(!a){a=!0,clearTimeout(s),e.removeAllListeners();try{t()}catch{}}},s=setTimeout(()=>{o(()=>{e.destroy(),i(Error(`TIMEOUT`))})},n),c=TT(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(wT(t))})}async function DT(e,t,n){let r=null;try{r=await MT(Fe(),t.connectMs);let i=await ET(r,{v:3,...e},t.budgetMs);return AT(e.kind,i,n)}catch(e){return jT(e)}finally{r&&r.destroy()}}function OT(e,t){return typeof e==`string`?e:t}function kT(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function AT(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=OT(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:kT(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 jT(e){if(e instanceof CT||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 MT(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 NT(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 PT={connectMs:50,budgetMs:150},FT={connectMs:50,budgetMs:200};function IT(e){let t=e.output;return typeof t==`string`?t:void 0}function LT(e,t,n,r){return DT({kind:`render`,hookData:e,args:t,cwd:n,...r},PT,IT)}function RT(e,t){return DT({kind:`click`,verb:e,value:t},FT,IT)}let zT=null;function BT(e){if(zT!==null)return zT;r.mkdirSync(c.dirname(e),{recursive:!0});try{zT=r.statSync(e).size}catch{zT=0}return zT}function VT(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{}zT=0}function Q(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=qe(),t=BT(e);r.appendFileSync(e,n),zT=t+Buffer.byteLength(n,`utf8`),zT>=5242880&&VT(e)}catch(e){zT=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}function HT(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable โ ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
|
|
163
|
+
`)}function UT(e,t){return e===`darwin`?[WT(`footprint`,[`-p`,String(t)]),WT(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[GT(`/proc/self/smaps_rollup`),GT(`/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}`}${KT(n.stderr)}`}}}}function GT(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 KT(e){let t=e.split(`
|
|
164
|
+
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const qT=`CC_CANDYBAR_RSS_LIMIT_MB`;function JT(e){let t=e[qT];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${qT} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function YT(e){return JT(e)*2}const XT=1024*1024;function ZT(e){return JT(e)*XT}const QT={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function $T(e,t,n){let{prefix:r,suffix:i}=QT[t];return c.join(e,`${r}${n}${i}`)}function eE(e){for(let t of Object.keys(QT)){let{prefix:n,suffix:r}=QT[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function tE(e){let t=e.rssLimitBytes??512*XT,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 nE(e.log,`memory report`,()=>{let t=$T(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),nE(e.log,`heap snapshot`,()=>{let t=$T(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),nE(e.log,`artifact rotation`,()=>{iE(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 nE(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function rE(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=eE(t);if(n===null)return t;let{prefix:r,suffix:i}=QT[n];return t.slice(r.length,t.length-i.length)}function iE(e,t,n){let r=new Map;for(let t of e){let e=rE(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 aE(e,t,n={}){let i=Pe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Q,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>HT(UT(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=>eE(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function oE(e={}){if(SE()!==null)return;let n=e.spawn??CE,r=yE();if(r.kind===`contended`){let e=cE();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) โ spawning unlocked\n`),sE(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) โ spawning unlocked\n`),sE(n);return}try{sE(n)}finally{xE()}}function sE(e){hE()&&lE(e)}function cE(){try{let e=r.statSync(Ue());return Date.now()-e.mtimeMs}catch{return null}}function lE(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 uE(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function dE(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function fE(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 pE(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 mE(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function hE(){let e=We(),n=Ge(),r=fE(n),i=uE(gE(e),dE(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`),_E(e),pE(n,Math.min(r+1,5)),!0)}function gE(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function _E(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 vE=null;function yE(){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 vE={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(!bE(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 bE(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function xE(){if(!vE)return;let{fd:e,path:t}=vE;vE=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function SE(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function CE(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${YT(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const wE=`cc-candybar`,TE=`dispatch`,EE=`set-state`,DE=`step-state`,OE=`copy`,kE=`open-vscode`,AE=`toolbar-toggle`,jE=`show-config-error`,ME=`show-config-warning`,NE=`set-config`,PE=`step-config`,FE=`save`,IE=`save-preset`,LE=`delete-preset`,RE=`reset-config`,zE=`apply-layout-op`,BE=`undo`,VE=`redo`,HE=`back`,UE=`apply-update`,WE=`doctor-run`,GE=`doctor-fix`,KE=`ceiling`,qE=`slash`;function JE(e){return e.map(encodeURIComponent).join(`/`)}function YE(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function XE(e){return`${wE}://${TE}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${JE(e.args)}`)}`).join(`&`)}`}function ZE(e){return new w(e).getAll(`e`).map(tD)}const QE=new Set([EE,RE]);function $E(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&eD(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function eD(e,t){if(e.verb!==t.verb||!QE.has(e.verb))return;let[n,r]=[tD(e.value),tD(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function tD(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const nD=`1.102.0`;function rD(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function iD(e){return e??c.join(p.homedir(),`.claude`)}function aD(e){return c.join(e,`settings.json`)}function oD(e){return c.join(e,`plugins`,`installed_plugins.json`)}function sD(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function cD(e){let t;try{let n=sD(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${lD(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const lD=e=>e instanceof Error?e.message:String(e),uD=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function dD(e){let t=uD.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 fD(e){return e.join(`.`)}function pD([e,t,n],[r,i,a]){return e-r||t-i||n-a}const mD=`@promptctl/cc-candybar`;async function hD(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`?dD(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function gD(e,t){let n=dD(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=pD(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 _D(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`โ cc-candybar ${fD(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${fD(t.installed)} is newer than the registry's latest release (${fD(t.latest)}): an unpublished build.\n`};case`stale`:{let n=fD(t.latest);return{stream:`stderr`,text:`โ cc-candybar ${fD(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 vD=`CCCandybarURLHandler`,yD=[],bD={"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 xD(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function SD(e,t){return[e,...t].map(xD).join(` `)}function CD(){return c.join(p.homedir(),`Applications`,`${vD}.app`)}function wD(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function TD(){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 ED(){return c.join(TD(),`bin`,`cc-candybar`)}function DD(){return c.join(TD(),`dist`,`index.mjs`)}function OD(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
|
+
`)}function kD(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 AD(t){let n=bD[`${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 jD(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function MD(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 ${mD}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function ND(){let e=kD(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=AD(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(DD()),{recursive:!0}),r.mkdirSync(c.dirname(ED()),{recursive:!0}),jD(e,DD()),jD(t.sourcePath,ED()),r.chmodSync(ED(),493),r.rmSync(c.join(TD(),`url-handler.mjs`),{force:!0});let n=MD(ED());return process.stdout.write(`Staged cc-candybar v${nD} runtime at ${TD()}\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:ED(),distPath:DD(),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>${wE}</string>`,` </array>`,` </dict>`,`</array>`].join(`
|
|
167
|
+
`)}]}function FD(e){let t=CD();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`,OD(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 ${wE}:// 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(`โ ${vD}.app installed and registered.\n`),process.stdout.write(` Test: open '${wE}://hello-world' && pbpaste\n`)}function ID(){wD(),FD(ND().distPath)}function LD(e,t=wE){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:OE,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function RD(e){e||(process.stderr.write(`url-handle: missing URL argument.
|
|
168
|
+
`),process.exit(1));let t;try{t=LD(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await RT(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(oE(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(zD(n)+`
|
|
169
|
+
`),process.exit(1)}function zD(e){switch(e.cause){case`version_mismatch`:return`url-handle: daemon rejected click (version mismatch: client v${e.clientV} โ daemon v${e.daemonV})`;case`bad_request`:return`url-handle: daemon rejected click (bad request: ${e.message})`;case`render_failed`:return`url-handle: daemon rejected click (handler failed: ${e.message})`;case`malformed_response`:return`url-handle: daemon rejected click (malformed response: ${e.message})`}}function BD(){return`โ install complete.
|
|
170
170
|
Restart Claude Code to pick up the new statusline.
|
|
171
|
-
Tip: every bar carries a settings menu โ click it (${Gc} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/endcaps/wrap/padding controls.\n`}async function
|
|
172
|
-
`),
|
|
173
|
-
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function
|
|
174
|
-
`)}function
|
|
175
|
-
`);return e?`${l}\n${e}`:l}function
|
|
176
|
-
`))}function PO(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new B({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new H(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows ยท `,s),a.kind===`file`?c(`open full text`,s.withLink(T(a.path).href)):c(`full text unavailable: ${cO(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` ยท `:``}open `,s),c(cO(o),s.withLink(T(o).href))],d=[c(`โณ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=H.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,SO([m],r)}const FO=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function IO(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function LO(e,t){return r.readdirSync(t).filter(FO).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?LO(e,i):[[c.relative(e,i).split(c.sep).join(`/`),IO(i,a)]]})}function RO(e){let t=E.createHash(`sha256`);for(let[n,r]of LO(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const zO=e=>e.slice(0,7);function BO(e){return c.dirname(c.dirname(e))}function VO(){return{version:ZE,digest:`f84d40dc2eee85e757af14b10f576caf9e29bd084c51103599396d3f0d906023`}}function HO(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 UO(e,t){try{let n=BO(ie(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=RO(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:HO(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 WO(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function GO(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 KO(e,t,n){let r=As(e,new Set(n.map(ks).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const qO=/^-?\d+$/;function JO(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 YO(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!qO.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 XO(e,t,n){return r=>r?qO.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 ZO(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=>!qO.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 QO(e){return e===`config`?`set-config`:`set-state`}function $O(e,t,n){return t.kind===`int`?YO(`menu page "${e}"`):t.kind===`range`?XO(t.min,t.max,`${n} stepper "${e}"`):JO(t.allowed,`${n} "${e}"`,QO(n))}function ek(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:ZO(e,n,t)}))}function tk(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=ZO(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=$O(e,n,t)}else{let r=ZO(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:$O(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=ZO(e,r.specs,t),r.validator=$O(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 nk=tk({},`config`);function rk(){return nk.listKeys()}function ik(e,t){return nk.validate(e,t)}function ak(e){return nk.rangeParamsFor(e)}function ok(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:qb(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:[WO({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[WO({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:qb(e.insertSegmentFrom,t).members.map(t=>WO({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function sk(e,t){let n=Al(e).get(t);return n===void 0?null:String(n)}function ck(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?nx(n.persist):null;e?.scope===`preset-root`&&t.add(ex(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function lk(e){let t=new Map([...Gb(e),...xx(e)]);return[...ck(e),...Object.values(e.actions).flatMap(e=>ok(e,t))]}function uk(e){return ek(lk(e),`config`)}function dk(e,t){return nk.register(e,t)}const fk=Array.from({length:10},(e,t)=>(t+1)*1e5),pk=fk[0],mk=fk[fk.length-1];function hk(e){let t;try{t=rD(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>=pk&&n<=mk?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${pk}โ${mk} tokens)`)}function gk(e,t){let n=Math.min(t??mk,mk),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:fk.filter(e=>e<r).at(-1)??0,higher:fk.find(e=>e>r&&e<=n)??0}}const _k=aS(`commands.`),vk=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,yk=`{{ \$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 (${vk}) (basename .project_dir) (ne (${vk}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,bk={min:0,max:100,step:5},xk={warnAt:{label:`warning at %`,domain:bk,default:50},errorAt:{label:`error at %`,domain:{...bk,atLeast:`warnAt`},default:80}};function Sk(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:bk,default:80}}}const Ck={globals:{palette:`tokyo-night`},variables:{..._k.variables,...Cb,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:yk},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:Jx(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:_k.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:Sk(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:Sk(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:xk,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:xk,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`โก {{ template "formatRate" .burn.costPerHour }} ยท {{ template "formatEta" .block.etaMinutes }} to 5h ยท {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{description:`Token throughput for the latest exchange: output, input, and total.`,template:`โ
out {{ template "formatSpeed" .speed.output }} ยท in {{ template "formatSpeed" .speed.input }} ยท tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{description:`A sparkline of recent token throughput.`,template:`โก {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`โด {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${wa} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`โ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{description:`The memento plugin's context ceiling for this session: โ and + move it by 100K, โ lifts it, โบ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}โ โ {{ .memento.error }} {{ action "ceiling.clear" "โบ" }}{{ else }}โ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "โ" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "โ" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "โบ" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{description:`Claude Code's auto-compact window: โ and + move it by 100K, โบ returns it to auto. Clicks type /autocompact into this session.`,template:`{{ if ne .autocompact.error "" }}โฒ โ {{ .autocompact.error }}{{ else }}โฒ {{ if eq .autocompact.window 0 }}auto{{ else }}{{ template "formatTokenCount" .autocompact.applied }}{{ end }}{{ if gt .autocompact.lower 0 }} {{ action (printf "autocompact.%d" .autocompact.lower) "โ" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "autocompact.%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "autocompact.auto" "โบ" }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`},metrics:{description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} ฮ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} โง {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} โง {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} โ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} โ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} โ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} โ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} โณ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} โ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...Jx(``).actions,..._k.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:nS(`/autocompact auto`)},...Object.fromEntries(fk.map(e=>[`autocompact.${e}`,{slash:nS(`/autocompact ${e}`)}]))},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${wa}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`โ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} โท {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}ร{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}โ/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}โ{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}โ{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},wk=new Set([Ck.globals.palette,...Object.values(Ck.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Tk=Bc(aT(`<default>`,JSON.stringify(Ck),wk),Ck),Ek=x_(Tk.presets);function Dk(e){return Ek.includes(e)}function Ok(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const kk=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 Ak(e){return((...t)=>kk.run(()=>e(...t)))}const jk=Ak(S),Mk=Ak(x),Nk=Ak(C);async function Pk(e,t){return kk.run(async()=>{let n=null;try{n=await b(e,`r`);let{size:r,mtimeMs:i,ino:a}=await n.stat(),o=t!==void 0&&(a!==t.ino||r<t.offset),s=o||t===void 0?0:t.offset;if(s>=r)return J({buf:Buffer.alloc(0),start:s,size:r,mtimeMs:i,ino:a,reset:o});let c=Buffer.alloc(r-s),l=0;for(;l<c.length;){let{bytesRead:e}=await n.read(c,l,c.length-l,s+l);if(e===0)break;l+=e}return J({buf:l===c.length?c:c.subarray(0,l),start:s,size:r,mtimeMs:i,ino:a,reset:o})}catch(t){return t.code===`ENOENT`?Y:X(`readAppended ${e}: ${t instanceof Error?t.message:String(t)}`)}finally{await n?.close().catch(e=>{O(`transcript-fs: close failed: ${e instanceof Error?e.message:String(e)}`)})}})}async function Fk(e,t){return kk.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 Ik=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function Lk(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 Rk(e){let t=await zk(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function zk(e){for(let t of[65536,1048576]){let n=await Fk(e,t);if(n.kind!==`ok`)return n;let r=Bk(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function Bk(e,t){let n=e.toString(`utf8`).split(`
|
|
177
|
-
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!
|
|
178
|
-
`).at(-1).trim();function
|
|
179
|
-
`),c=GE([{verb:DE,args:[s]}]),l=t.kind===`running`?DO(`[${i.busy}]`,c):DO(`[${i.act}]`,GE([{verb:RE,args:[n.sessionId]}]));return[{severity:EO,message:s,lines:[[DO(a,c),l,DO(`[dismiss]`,GE([{verb:xE,args:[n.sessionId,XA,r]}])),DO(`[disable]`,GE([{verb:OE,args:[n.sessionId,ZA,`false`]},{verb:xE,args:[n.sessionId,QA,`false`]}]))],...o.map(e=>[DO(e,c)])]}]}function aj(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 oj(e){switch(e.kind){case`current`:return[`info`,`build: current ${ej(e.stamp)}`];case`stale`:return[`info`,`build: stale โ source ${ej(e.source)}, running ${ej(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function sj(e){switch(e.kind){case`current`:return[`info`,`release: current ${sD(e.installed)}`];case`stale`:return[`info`,`release: stale โ latest ${sD(e.latest)}, running ${sD(e.installed)}`];case`ahead`:return[`info`,`release: ahead โ running ${sD(e.installed)}, latest ${sD(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function cj(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const lj=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function uj(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=lj(e.stderr)??e.error??lj(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function dj(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=nj,d=null,f=cj(s),p=cj(s),m=()=>aj(c,l);function h(){let e=m(),t=e===null?null:$A(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:HA(XA,{kind:`allow-list`,allowed:[t]})})}function g(){c=UO(t,VO),f(oj(c)),h()}async function _(){l=dD(ZE,await uD(lD,a,i)),p(sj(l)),h()}return{arm(){dk(ZA,{kind:`allow-list`,allowed:[`false`]}),HA(QA,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>ij(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=tj(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=rj,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=nj,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=uj(n);u={kind:`failed`,identity:$A(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var fj=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 pj={"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 mj=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 fj.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await fj.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(pj).length} models`),this.executionCache=pj,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(pj).length} models`),pj)}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 hj=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function gj(e){if(typeof e==`string`)return hj.exec(e)?.[1]}function _j(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 vj(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=_j(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?gj(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 yj(){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 bj(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await jk(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 xj(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await jk(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 Mk(t,`utf-8`)).split(`
|
|
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
|
|
181
|
-
`))if(n.trim())try{let e=
|
|
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];Uj(l,l.cellLength+c,i),n[t]=Gj(e[t])}),n}function Xj(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=Zj(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if($j(a.style).link){i();let e=Zj([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function Zj(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>Qj(e,t)):e,r=H.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function Qj(e,t){let n=e.copy();return n.style=t.add($j(e.style)),n}function $j(e){return e instanceof B?e:B.parse(e)}var eM=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function tM(e,t,n,r,i){let{palette:a,tint:o}=e,s=nM(n,i),c=s===void 0?o:rM(a,s,`bg`);e.bg=c;let l=nM(r,i),u=l===void 0?Ta(a,c,t):rM(a,l,`fg`);return new B({bgcolor:gn.fromRgba(c),color:gn.fromRgba(u)})}function nM(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function rM(e,t,n){try{return Xn(e,t)}catch(e){throw e instanceof qn?new eM(t,n,e.message):e}}function iM(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,aM(e,t,o,n,r,i));return i}function aM(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=qb(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=Eb.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=qb(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=qb(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:sM(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:sM(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:TC(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:sM(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 oM(e){return e.kind===`do`?oM(e.head):e}function sM(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function cM(e,t){return e.has(t)?wv(e.read(t)):``}function lM(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function uM(e,t,n,r){let i=new H(e,{style:B.combine([r,new B({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function dM(e,t){return Math.max(e.members.indexOf(cM(t,e.stateVar)),0)}function fM(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=cM(r,e.stateVar);return{effects:[{verb:xE,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=cM(r,e.stateVar);return{effects:[{verb:xE,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=cM(r,e.stateVar);return{effects:[{verb:xE,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(dM(e,r)+1)%e.members.length];return{effects:[{verb:xE,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:[lM(e.text,gy(r))]}],active:!1};case`open`:return{effects:[{verb:wE,args:[lM(e.target,gy(r))]}],active:!1};case`persist-literal`:{let t=cM(r,e.stateVar);return{effects:[{verb:OE,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=cM(r,e.stateVar);return{effects:[{verb:OE,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(dM(e,r)+1)%e.members.length];return{effects:[{verb:OE,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:kE,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:NE,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:FE,args:[i]}],active:!1};case`redo`:return{effects:[{verb:IE,args:[i]}],active:!1};case`back`:return{effects:[{verb:LE,args:[i]}],active:!1};case`save`:return{effects:[{verb:AE,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:jE,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:ME,args:[i,lM(e.name,gy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:zE,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:BE,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:VE,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:HE,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:PE,args:[i,e.key,WO(e.op)]}],active:!1};case`do`:{let a=fM(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>fM(e,t,void 0,r,i).effects)],active:a.active}}case`layout-op-option`:{let r={op:`insert`,segment:n??t,anchor:e.anchor,relation:e.relation};return{effects:[{verb:PE,args:[i,e.key,WO(r)]}],active:!1}}}}function pM(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:qc(`action "${e}"`,n,t.members.length,dM(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 mM(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}=pM(e,oM(r),t,i),{effects:s,active:c}=fM(r,a,o,i,cM(i,`session.id`));return uM(a,GE(s),c)}function hM(e){return{action:{fn:(t,...n)=>mM(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function gM(e,t){return uM(`โ`,GE([{verb:xE,args:[cM(e,`session.id`),t,Wc]}]),!1)}function _M(e,t,n){return new B({bgcolor:gn.fromRgba(t),color:gn.fromRgba(Ta(e,t,n))})}function vM(e,t,n){return _M(e.palette,Ra(e.palette,e.disclosure,[t],n),n)}function yM(e,t,n,r,i){return r===void 0?n=>vM(e,{...n,distribution:t},i):(e,t)=>bM(r(t,n),i)}function bM(e,t){let n=ha(e,`background`);return new B({bgcolor:gn.fromRgba(n),color:gn.fromRgba(ir(ha(e,`primary`),n,4.5,t))})}function xM(e){return{current:null,drawnAt:e}}function SM(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 CM(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 wM(e){return new H(e).cellLength}function TM(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function EM(e){return Math.max(1,TM(e)-(wM(`โ`)+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 OM(e,t){let n=[];for(let t of e)n.length>0&&n.push(new H(` `)),n.push(t);let r=H.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function kM(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 AM(e,t,n){let r=e.compiled.get(t),i=r&&oM(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 jM(e,t,n,r,i,a,o){let s=AM(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=cM(l,`session.id`),d=`stateVar`in s?cM(l,s.stateVar):void 0,f=s.options.map(wM),p=i?TM(a):1/0,m=wM(`โ`)+1,h=wM(`โ`)+1+wM(`โ`)+1,g=DM(f,p,m),_=g.length>1?DM(f,p,m+h):g,v=parseInt(cM(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>GE([{verb:xE,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=GE([{verb:xE,args:[u,...S]}]),ee=r?[{verb:xE,args:[u,...S]}]:[],te=e=>GE([...fM(c,e,e,l,u).effects,...ee]),ne=[uM(`โ`,C,!1)];y>0&&ne.push(uM(`โ`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(uM(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(uM(`โ`,x(y+1),!1)),OM(ne,i)}function MM(e,t){return{picker:{fn:(n,r,i,a,...o)=>{uy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=kM(e,r,`set-int`,`an int action ({ set, int: true })`);return jM(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,yM(CM(t,`{{ picker }}`),la(void 0),e,AM(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function NM(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+wM(e(-(s+1)))+1+wM(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function PM(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=cM(a,`session.id`),{options:c}=t,l=c.length,u=cM(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=GE(fM(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>uM(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=NM(p,l,wM(`โ`)+1+wM(p(0))+1+wM(`โถ`),EM(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return OM([...v(-1).reverse(),uM(`โ`,h(-1),!1),g(0),uM(`โถ`,h(1),!1),...v(1)],!0)}function FM(e,t){return{carousel:{fn:(n,r,...i)=>{if(uy(`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=AM(e,n,`carousel`);return PM(n,o,e,yM(CM(t,`{{ carousel }}`),la(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const IM=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function LM(e,t,n){let r=ja(e,{hue:ta,depth:0},n);return[ra(t).map((t,n)=>({text:IM[n%IM.length],colour:ga(e,t)})),[{text:`โพ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ha(e,`warning`)},{text:`error`,colour:ha(e,`error`)}]]}function RM(e,t,n,r){let i=LM(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:_M(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new H(e)),a.push(t)}let s=H.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function zM(e,t){return{themePreview:{fn:()=>RM(e.palette,e.variation,t.drawnAt(),EM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const BM=e=>e.slice(e.lastIndexOf(`.`)+1),VM=(e,t)=>{let n=new H(BM(e));return n.truncate(t,{marker:`โฆ`}),n.plain};function HM(e,t){let n=e.map(e=>e.map(({name:e})=>wM(BM(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 UM(e,t,n,r){let i=HM(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${VM(s,i)} `,{style:_M(l,Ha(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=H.fromFragments(a.flatMap((e,t)=>t===0?e:[new H(`
|
|
183
|
-
`),...e]));return o.overflow=`ignore`,o.end=``,o}function
|
|
171
|
+
Tip: every bar carries a settings menu โ click it (${Gc} by\n default) for quick actions, preset switching, edit mode, and clickable\n theme/style/variation/endcaps/wrap/padding controls.\n`}async function VD(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...yD],i=ND();process.platform===`darwin`?FD(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
|
|
172
|
+
`),HD(i.binPath,r,t),process.stdout.write(BD());let a=_D(mD,gD(nD,await hD(mD,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function HD(e,t,n,i){let a=i??aD(iD(rD(process.env,process.cwd())));r.mkdirSync(c.dirname(a),{recursive:!0});let o={};if(r.existsSync(a))try{o=JSON.parse(r.readFileSync(a,`utf-8`))}catch(e){throw Error(`Could not parse ${a}: ${e instanceof Error?e.message:String(e)}`)}let s=o.statusLine?.command,l=[e,xD(e)],u=typeof s==`string`&&(s.startsWith(`pnpm dlx @promptctl/cc-candybar@`)||l.some(e=>s===e||s.startsWith(`${e} `)));if(s&&!u&&!n){process.stderr.write(`Skipping settings.json update: existing statusLine.command appears customized.\n Current: ${s}\n To overwrite, re-run with --force.\n`);return}o.statusLine={type:`command`,command:SD(e,t)},k(a,JSON.stringify(o,null,2)),process.stdout.write(`Updated ${a}\n`)}function UD(e,t){return e.kind===`owned`?t(e.pid,e.startTime)?{kind:`attach-and-exit`,reason:`live owner pid=${e.pid} holds the socket`}:{kind:`reclaim`,reason:`owner pid=${e.pid} is gone or recycled`}:e.kind===`absent`?{kind:`reclaim`,reason:`no lease โ stale socket, no live owner`}:{kind:`reclaim`,reason:`unreadable lease (${e.detail}) โ cannot prove a live owner`}}function WD(e){let t;try{t=r.readFileSync(e,`utf8`)}catch(e){return e.code===`ENOENT`?{kind:`absent`}:{kind:`unreadable`,detail:`read failed: ${e.message}`}}let n;try{n=JSON.parse(t)}catch(e){return{kind:`unreadable`,detail:`bad JSON: ${e.message}`}}let i=n,a=i?.pid;if(typeof a!=`number`||!Number.isInteger(a)||a<=0)return{kind:`unreadable`,detail:`no valid pid (got ${JSON.stringify(a)})`};let o=i?.startTime;return o!=null&&typeof o!=`string`?{kind:`unreadable`,detail:`invalid startTime (got ${JSON.stringify(o)})`}:{kind:`owned`,pid:a,startTime:o??null}}function GD(e,n){let i=`${e}.${t.pid}.tmp`;try{return r.writeFileSync(i,JSON.stringify(n),{mode:384}),r.renameSync(i,e),null}catch(e){let t=e.message;try{r.unlinkSync(i)}catch(e){if(e.code!==`ENOENT`)return`${t}; also failed to remove temp ${i}: ${e.message}`}return t}}function KD(e,t){let n=WD(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function qD(e){try{let t=r.statSync(e);return{kind:`present`,identity:{dev:t.dev,ino:t.ino}}}catch(e){return e.code===`ENOENT`?{kind:`absent`}:{kind:`unreadable`,detail:e.message}}}function JD(e,t,n,r){let i=YD(e,t);return i===null?r.kind===`owned`?r.pid===n?{kind:`owned`}:{kind:`displaced`,reason:`lease reassigned (names pid=${r.pid}, we are pid=${n}) โ a reclaimer overwrote it`}:{kind:`displaced`,reason:`lease not held (${r.kind}) โ no longer the socket owner`}:{kind:`displaced`,reason:i}}function YD(e,t){return t.kind===`present`?t.identity.dev===e.dev&&t.identity.ino===e.ino?null:`socket replaced (bound dev=${e.dev} ino=${e.ino}, now dev=${t.identity.dev} ino=${t.identity.ino})`:t.kind===`absent`?`socket path gone (ENOENT) โ unlinked by a reclaimer`:`socket path unreadable (${t.detail}) โ cannot prove ownership`}function XD(e){let t=!1;function n(){let n=JD(e.bound,e.readIdentity(),e.myPid,e.readLease());return n.kind===`displaced`&&!t&&(t=!0,e.log(`warn`,`ownership self-check: ${n.reason}; shutting down`),e.shutdown(0)),n}function r(t=e.intervalMs??5e3){let r=setInterval(()=>{n().kind===`displaced`&&clearInterval(r)},t);return r.unref(),{disarm:()=>clearInterval(r)}}return{check:n,arm:r}}function ZD(e,t=Oe){let n=t({bin:`ps`,args:[`-o`,`lstart=`,`-p`,String(e)],category:`process-fingerprint`,timeoutMs:2e3,env:{...process.env,LC_ALL:`C`,TZ:`UTC`}});if(n.ok){let e=n.stdout.trim();return e.length>0?{kind:`start`,token:e}:{kind:`unavailable`,detail:`ps produced no start-time`}}return{kind:`unavailable`,detail:n.reason===`spawn-error`?n.error??`ps spawn failed`:`ps ${n.reason} (exit ${n.exitCode})`}}function QD(e,t,n){if(t===null)return n.pidAlive(e);let r=n.readStartTime(e);switch(r.kind){case`start`:return r.token===t;case`unavailable`:return n.pidAlive(e)}}function $D(e,t=ZD){let n=t(e);return n.kind===`start`?n.token:null}const eO=`CC_CANDYBAR_PARENT_PID`;function tO(e){let t=e[eO];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${eO} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function nO(e){if(e.anchor.kind===`outlives-nobody`)return{disarm:()=>{}};let{pid:t}=e.anchor,n=setInterval(()=>{e.isAlive(t)||e.onOrphaned(`spawner pid ${t} gone`)},e.intervalMs??250);return n.unref(),{disarm:()=>clearInterval(n)}}function rO(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function iO(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function aO(e,t,n){return e?t>=n?{allow:!1,reason:`${t} live isolated daemons registered >= ceiling ${n}`}:{allow:!0,reason:`${t} live isolated daemons registered < ceiling ${n}`}:{allow:!0,reason:`canonical production socket โ exempt (bind() already caps it to one)`}}function oO(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>c.join(e,t))}catch{return[]}}function sO(e){let t;try{t=r.readFileSync(e,`utf8`)}catch{return null}try{let e=JSON.parse(t),n=e?.pid;return typeof n!=`number`||!Number.isInteger(n)||n<=0?null:{pid:n,startTime:typeof e?.startTime==`string`?e.startTime:null}}catch{return null}}function cO(e,t,n){let r=0;for(let i of e)t(i.identity.pid,i.identity.startTime)?r++:n(i.path);return r}function lO(e){if(!e.isolated)return{decision:aO(!1,0,e.ceiling),registryPath:null};e.ensureDirSafe(e.registryDir);let t=[];for(let n of e.listFiles(e.registryDir)){let r=e.readEntry(n);r!==null&&r.pid!==e.pid&&t.push({path:n,identity:r})}let n=aO(!0,cO(t,e.isSameLiveProcess,e.removeFile),e.ceiling);if(!n.allow)return{decision:n,registryPath:null};let r=c.join(e.registryDir,`pid-${e.pid}.json`);return e.writeEntry(r,{pid:e.pid,startTime:e.startTime}),{decision:n,registryPath:r}}function uO(e,t,n,r){let i=n(e);if(i!==null&&i.pid===t)try{r(e)}catch{}}function dO(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:He(),ceiling:iO(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>QD(e,t,{readStartTime:ZD,pidAlive:rO}),listFiles:oO,readEntry:sO,removeFile:e=>{try{r.unlinkSync(e)}catch{}},writeEntry:(e,t)=>{let n=`${e}.${t.pid}.tmp`;try{r.writeFileSync(n,JSON.stringify(t),{mode:384}),r.renameSync(n,e)}catch(e){try{r.unlinkSync(n)}catch(e){e.code}throw e}},ensureDirSafe:process.env.CC_CANDYBAR_DAEMON_REGISTRY_DIR?Ie:e=>{Ie(c.dirname(e)),Ie(e)},...t}}function fO(e){return e<32||e===127||e>=128&&e<=159}function pO(e){let t=``;for(let n of e)t+=fO(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function mO(e,t){let n=pO(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`โฆ`);r+=e,i++}return r}const hO=`\x1B[38;2;255;255;255m`,gO=`\x1B[48;2;200;40;40m`;function _O(e){let t=/;2;(\d+);(\d+);(\d+)m$/.exec(e);if(t===null)throw Error(`diagnostic-style: not a 24-bit SGR: ${e}`);return`#`+t.slice(1,4).map(e=>Number(e).toString(16).padStart(2,`0`)).join(``)}const vO={fg:_O(hO),bg:_O(gO)},yO={fg:_O(`\x1B[38;2;0;0;0m`),bg:_O(`\x1B[48;2;220;160;40m`)},bO={unicode:Ii,ascii:{glyph:`>`,divider:`|`,lead:`<`,tail:`>`}},xO={unicode:{},ascii:{left:`(`,right:`)`}};function SO(e,t,n){switch(e){case`capsule`:return new Hi(xO[t]);case`plain`:return new Ui(n===void 0?{}:{separator:n});case`powerline`:return new zi(bO[t]);default:return e}}const CO=new Map;function wO(e){let t=JSON.stringify([e.endcaps,e.charset,e.separator??null]),n=CO.get(t);if(n!==void 0)return n;let r=SO(e.endcaps,e.charset,e.separator),i=e=>new H(`x`,{end:``,overflow:`ignore`,style:new B({bgcolor:e})}),a=e=>new H(Ki(new ki(e,r),{colorSystem:null}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return CO.set(t,s),s}function TO(e){return wO(e).chrome}function EO(e){return wO(e).seam}function DO(e,t){if(e.length===0)return``;let n=SO(t.endcaps,t.charset,t.separator),r=t.colorCompatibility,i=t.wrap&&Number.isFinite(t.width)?Ki(new Qi([...e],{joiner:n}),{width:t.width,colorSystem:r}):Ki(new ki([...e],n),{colorSystem:r});if(!i.endsWith(`
|
|
173
|
+
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function OO(e){return Math.min(20,e??20)}const kO={heading:`ERROR`,glyph:`โ `,colors:vO},AO={heading:`WARNING`,glyph:`โ `,colors:yO},jO={heading:`UPDATE`,glyph:`โฌ`,colors:yO};function MO(e,t){return{text:pO(e),link:t}}function NO(e,t,n){let[r,...i]=[PO(e,kO,jE),t,PO(n,AO,ME)].flat();return r===void 0?null:{channels:[r,...i]}}function PO(e,t,n){let r=XE([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>MO(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function FO(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
|
|
174
|
+
`)}function IO(e,t,n,r){if(t===null)return e;let i=LO(r),a=t.channels.flatMap(e=>RO(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[zO(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
|
|
175
|
+
`);return e?`${l}\n${e}`:l}function LO(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function RO(e,t){let n=new B({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Rt(Math.max(2,t.width-1)),i=(e,t)=>new H(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>DO([i(o===0?e.severity.glyph:` `,n.withLink(a[0].link)),...a.flatMap(e=>{let t=n.withLink(e.link);return e.text.split(` `).flatMap(e=>Ht(e,r)).map(e=>i(e,t))})],t).split(`
|
|
176
|
+
`))}function zO(e,t,n,r){let{colors:i}=e.channels[0].severity,{fullText:a,failedConfigFile:o}=t,s=new B({bgcolor:i.bg,color:i.fg}),c=(e,t)=>new H(e,{style:t,end:``,overflow:`ignore`}),l=n>0?[c(`${n} more rows ยท `,s),a.kind===`file`?c(`open full text`,s.withLink(T(a.path).href)):c(`full text unavailable: ${pO(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` ยท `:``}open `,s),c(pO(o),s.withLink(T(o).href))],d=[c(`โณ `,s),...l,...u.slice(0,-1)],f=d.reduce((e,t)=>e+t.cellLength,0),p=u.slice(-1).map(e=>e.truncate(Math.max(1,r.width-f),{mode:`middle`})),m=H.fromFragments([...d,...p]).truncate(r.width);return m.overflow=`ignore`,DO([m],r)}const BO=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function VO(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function HO(e,t){return r.readdirSync(t).filter(BO).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?HO(e,i):[[c.relative(e,i).split(c.sep).join(`/`),VO(i,a)]]})}function UO(e){let t=E.createHash(`sha256`);for(let[n,r]of HO(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const WO=e=>e.slice(0,7);function GO(e){return c.dirname(c.dirname(e))}function KO(){return{version:nD,digest:`968159bc29b3704e73f441107f9f98d4a4b39c5b229dfd8421bad59e032cd18c`}}function qO(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 JO(e,t){try{let n=GO(ie(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=UO(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:qO(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 YO(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function XO(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 ZO(e,t,n){let r=As(e,new Set(n.map(ks).filter(e=>e.includes(t)).flat()));return r===e?{seg:e}:{seg:e,id:r}}const QO=/^-?\d+$/;function $O(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 ek(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!QO.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 tk(e,t,n){return r=>r?QO.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 nk(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=>!QO.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 rk(e){return e===`config`?`set-config`:`set-state`}function ik(e,t,n){return t.kind===`int`?ek(`menu page "${e}"`):t.kind===`range`?tk(t.min,t.max,`${n} stepper "${e}"`):$O(t.allowed,`${n} "${e}"`,rk(n))}function ak(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:nk(e,n,t)}))}function ok(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=nk(e,[...a.specs,i],t);a.specs.push(i),a.merged=n,a.validator=ik(e,n,t)}else{let r=nk(e,[i],t);n.set(e,{permanent:!1,specs:[i],merged:r,validator:ik(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=nk(e,r.specs,t),r.validator=ik(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 sk=ok({},`config`);function ck(){return sk.listKeys()}function lk(e,t){return sk.validate(e,t)}function uk(e){return sk.rangeParamsFor(e)}function dk(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:qb(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:[YO({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[YO({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:qb(e.insertSegmentFrom,t).members.map(t=>YO({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function fk(e,t){let n=Al(e).get(t);return n===void 0?null:String(n)}function pk(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?nx(n.persist):null;e?.scope===`preset-root`&&t.add(ex(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function mk(e){let t=new Map([...Gb(e),...Ex(e)]);return[...pk(e),...Object.values(e.actions).flatMap(e=>dk(e,t))]}function hk(e){return ak(mk(e),`config`)}function gk(e,t){return sk.register(e,t)}const _k=Array.from({length:10},(e,t)=>(t+1)*1e5),vk=_k[0],yk=_k[_k.length-1];function bk(e){let t;try{t=cD(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>=vk&&n<=yk?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${vk}โ${yk} tokens)`)}function xk(e,t){let n=Math.min(t??yk,yk),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:_k.filter(e=>e<r).at(-1)??0,higher:_k.find(e=>e>r&&e<=n)??0}}const Sk=uS(`commands.`),Ck=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,wk=`{{ \$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 (${Ck}) (basename .project_dir) (ne (${Ck}) "") }}{{ end }}{{ end }}{{ abbreviatePath \$dir }}`,Tk={min:0,max:100,step:5},Ek={warnAt:{label:`warning at %`,domain:Tk,default:50},errorAt:{label:`error at %`,domain:{...Tk,atLeast:`warnAt`},default:80}};function Dk(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:Tk,default:80}}}const Ok={globals:{palette:`tokyo-night`},variables:{...Sk.variables,...Cb,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:wk},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:$x(``).template},commands:{description:`Type /compact, /model or /clear into this session; /clear asks for a second click.`,template:Sk.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:Dk(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:Dk(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:Ek,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:Ek,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`โก {{ template "formatRate" .burn.costPerHour }} ยท {{ template "formatEta" .block.etaMinutes }} to 5h ยท {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{description:`Token throughput for the latest exchange: output, input, and total.`,template:`โ
out {{ template "formatSpeed" .speed.output }} ยท in {{ template "formatSpeed" .speed.input }} ยท tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{description:`A sparkline of recent token throughput.`,template:`โก {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`โด {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${wa} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`โ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{description:`The memento plugin's context ceiling for this session: โ and + move it by 100K, โ lifts it, โบ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}โ โ {{ .memento.error }} {{ action "ceiling.clear" "โบ" }}{{ else }}โ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "โ" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "โ" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "โบ" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{description:`Claude Code's auto-compact window: โ and + move it by 100K, โบ returns it to auto. Clicks type /autocompact into this session.`,template:`{{ if ne .autocompact.error "" }}โฒ โ {{ .autocompact.error }}{{ else }}โฒ {{ if eq .autocompact.window 0 }}auto{{ else }}{{ template "formatTokenCount" .autocompact.applied }}{{ end }}{{ if gt .autocompact.lower 0 }} {{ action (printf "autocompact.%d" .autocompact.lower) "โ" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "autocompact.%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "autocompact.auto" "โบ" }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`},metrics:{description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} ฮ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} โง {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} โง {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} โ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} โ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} โ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} โ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} โณ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} โ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...$x(``).actions,...Sk.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:sS(`/autocompact auto`)},...Object.fromEntries(_k.map(e=>[`autocompact.${e}`,{slash:sS(`/autocompact ${e}`)}]))},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},presets:{default:{},compact:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`context`}]},globals:{padding:0}},verbose:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},zen:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`directory`},{kind:`segment`,name:`context`}]},globals:{endcaps:`plain`,style:`dim`}},git:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`gitPr`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`segment`,name:`context`},{kind:`segment`,name:`activity`}]}]}},usage:{root:{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`burnrate`}]},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`session`},{kind:`segment`,name:`today`},{kind:`segment`,name:`speed`},{kind:`segment`,name:`tokenSparkline`}]}]}},dense:{root:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`},{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`session`},{kind:`segment`,name:`activity`}]},globals:{padding:0}}},editGlobals:{endcaps:`plain`,default_separator:` | `},helpers:{gitPaint:`{{ fg (readableOn (color .color) (bgOf) ${wa}) .text }}`,gitCollapsed:`{{ template "gitBranch" . }}{{ template "gitAheadBehind" . }}{{ template "gitFlags" . }}`,gitExpanded:`(git){{ template "gitRepo" . }}{{ template "gitOperation" . }}{{ template "gitSha" . }}{{ template "gitFlags" . }} {{ template "gitBranch" . }}{{ template "gitUpstream" . }}{{ template "gitStash" . }}{{ template "gitAge" . }}`,gitBranch:`โ {{ template "gitPaint" (dict "color" .git.color.branch "text" .git.branch) }}`,gitRepo:`{{ if and .settings.repo (ne .git.repoName "") }} {{ .git.repoName }}{{ end }}`,gitOperation:`{{ if and .settings.operation (ne .git.operation "") }} [{{ .git.operation }}]{{ end }}`,gitSha:`{{ if and .settings.sha (ne .git.sha "") }} {{ .git.sha }}{{ end }}`,gitFlags:`{{ if and .settings.flags (or (gt .git.staged 0) (gt .git.unstaged 0) (gt .git.untracked 0) (gt .git.conflicts 0)) }} {{ if gt .git.staged 0 }}{{ template "gitPaint" (dict "color" .git.color.staged "text" "S") }}{{ end }}{{ if gt .git.unstaged 0 }}{{ template "gitPaint" (dict "color" .git.color.unstaged "text" "U") }}{{ end }}{{ if gt .git.untracked 0 }}{{ template "gitPaint" (dict "color" .git.color.untracked "text" "?") }}{{ end }}{{ if gt .git.conflicts 0 }}{{ template "gitPaint" (dict "color" .git.color.conflicts "text" (printf "!%v" .git.conflicts)) }}{{ end }}{{ end }}`,gitAheadBehind:`{{ if and .settings.aheadBehind (or (gt .git.ahead 0) (gt .git.behind 0)) }} {{ if gt .git.ahead 0 }}{{ template "gitPaint" (dict "color" .git.color.ahead "text" (printf "+%v" .git.ahead)) }}{{ end }}{{ if and (gt .git.ahead 0) (gt .git.behind 0) }}/{{ end }}{{ if gt .git.behind 0 }}{{ template "gitPaint" (dict "color" .git.color.behind "text" (printf "-%v" .git.behind)) }}{{ end }}{{ end }}`,gitUpstream:`{{ if and .settings.upstream (ne .git.upstream "") }} [{{ .git.upstream }}{{ template "gitAheadBehind" . }}]{{ end }}`,gitStash:`{{ if and .settings.stash (gt .git.stash 0) }} {{ template "gitPaint" (dict "color" .git.color.stash "text" (printf "(%v stashed)" .git.stash)) }}{{ end }}`,gitAge:`{{ if and .settings.age (gt .git.timeSinceCommit 0) }} โท {{ template "formatTimeSince" .git.timeSinceCommit }}{{ end }}`,formatCost:'{{ if lt . 0.01 }}<$0.01{{ else }}${{ printf "%.2f" . }}{{ end }}',formatTokenCount:`{{ if ge . 1000000 }}{{ printf "%.1f" (divf . 1000000) }}M{{ else if ge . 1000 }}{{ printf "%.1f" (divf . 1000) }}K{{ else }}{{ . }}{{ end }}`,formatTokens:`{{ template "formatTokenCount" . }} tokens`,formatToolTally:`{{ $names := splitList "," . }}{{ range $i, $pair := $names }}{{ if lt $i 2 }}{{ if $i }} {{ end }}{{ $kv := splitList ":" $pair }}{{ index $kv 0 }}{{ if ne (index $kv 1) "1" }}ร{{ index $kv 1 }}{{ end }}{{ end }}{{ end }}{{ if gt (len $names) 2 }} +{{ sub (len $names) 2 }}{{ end }}`,formatRate:`{{ if lt . 0 }}โ/hr{{ else }}{{ template "formatCost" . }}/hr{{ end }}`,formatEta:`{{ if lt . 0 }}โ{{ else }}{{ template "formatLongTimeRemaining" . }}{{ end }}`,formatSpeed:`{{ if lt . 0 }}โ{{ else }}{{ template "formatTokenCount" (round .) }}/s{{ end }}`,formatTokenBreakdown:`{{ $first := true }}{{ if gt .input 0 }}{{ template "formatTokenCount" .input }} in{{ $first = false }}{{ end }}{{ if gt .output 0 }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" .output }} out{{ $first = false }}{{ end }}{{ if or (gt .cacheCreation 0) (gt .cacheRead 0) }}{{ if not $first }} + {{ end }}{{ template "formatTokenCount" (add .cacheCreation .cacheRead) }} cached{{ $first = false }}{{ end }}{{ if $first }}0 tokens{{ end }}`,budgetStatus:`{{ if or (le .budget 0) (lt .cost 0) }}{{ else }}{{ $pct := minf 100 (mulf (divf .cost .budget) 100) }}{{ $p := printf "%.0f%%" $pct }}{{ if ge $pct .warn }} !{{ $p }}{{ else }}{{ if ge $pct 50 }} +{{ $p }}{{ else }} {{ $p }}{{ end }}{{ end }}{{ end }}`,formatTimeSince:`{{ if lt . 60 }}{{ . }}s{{ else if lt . 3600 }}{{ div . 60 }}m{{ else if lt . 86400 }}{{ div . 3600 }}h{{ else if lt . 604800 }}{{ div . 86400 }}d{{ else }}{{ div . 604800 }}w{{ end }}`,formatDuration:`{{ if lt . 60 }}{{ printf "%.0f" . }}s{{ else if lt . 3600 }}{{ printf "%.0f" (divf . 60) }}m{{ else if lt . 86400 }}{{ printf "%.1f" (divf . 3600) }}h{{ else }}{{ printf "%.1f" (divf . 86400) }}d{{ end }}`,formatResponseTime:`{{ if lt . 60 }}{{ printf "%.1f" . }}s{{ else }}{{ printf "%.1f" (divf . 60) }}m{{ end }}`,formatLongTimeRemaining:`{{ if ge . 1440 }}{{ $d := div . 1440 }}{{ $h := div (mod . 1440) 60 }}{{ if gt $h 0 }}{{ $d }}d {{ $h }}h{{ else }}{{ $d }}d{{ end }}{{ else if ge . 60 }}{{ $h := div . 60 }}{{ $m := mod . 60 }}{{ if gt $m 0 }}{{ $h }}h {{ $m }}m{{ else }}{{ $h }}h{{ end }}{{ else }}{{ . }}m{{ end }}`,formatResetCountdown:`{{ template "formatLongTimeRemaining" (add 1 (minutesUntilReset .)) }}`}},kk=new Set([Ok.globals.palette,...Object.values(Ok.segments).map(e=>e.palette)].filter(e=>e!==void 0)),Ak=Bc(uT(`<default>`,JSON.stringify(Ok),kk),Ok),jk=x_(Ak.presets);function Mk(e){return jk.includes(e)}function Nk(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 Fk(e){return((...t)=>Pk.run(()=>e(...t)))}const Ik=Fk(S),Lk=Fk(x),Rk=Fk(C);async function zk(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 Bk(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 Vk=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function Hk(e){let t;try{t=JSON.parse(e)}catch{return null}let n=t.message?.usage;if(!((n?.cache_read_input_tokens??0)>0||(n?.cache_creation_input_tokens??0)>0))return null;let r=t.timestamp==null?NaN:Date.parse(t.timestamp);return Number.isNaN(r)?null:r}async function Uk(e){let t=await Wk(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function Wk(e){for(let t of[65536,1048576]){let n=await Bk(e,t);if(n.kind!==`ok`)return n;let r=Gk(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function Gk(e,t){let n=e.toString(`utf8`).split(`
|
|
177
|
+
`),r=+!t;for(let e=n.length-1;e>=r;e--){let t=n[e];if(!t||!Vk.test(t))continue;let r=Hk(t);if(r!=null)return r}return null}function Kk(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:zb(a.palette,t(`theme`),i.palette),style:ao(a.style,t(`style`),i.style,e.styles),endcaps:co(a.endcaps,t(`endcaps`),i.endcaps),variation:xo(a.variation,t(`variation`),i.variation),separator:a.default_separator??i.default_separator,autoWrap:Oo(a.autoWrap,t(`autoWrap`),i.autoWrap),padding:Ao(a.padding,t(`padding`),i.padding),charset:po(a.charset,t(`charset`),i.charset),updateNotice:ko(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:_o(a.colorCompatibility,t(`colorCompatibility`),i.colorCompatibility)}}function qk(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function Jk(e){return{theme:e.theme,style:e.style,preset:e.preset,variation:e.variation}}function Yk(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:Mk(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 Xk=10*1e3;function Zk(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 Qk(e,t){if(!(t<60))return e*3600/t}function $k(e,t,n,r){let i=r-t;if(i<50||i>Xk)return;let a=n-e;if(!(a<=0))return a*1e3/i}function eA(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=$k(t.input,t.atMs,n.input,n.atMs),i=$k(t.output,t.atMs,n.output,n.atMs),a=$k(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 tA(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>Xk)continue;let o=$k(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function nA(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function rA(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`,()=>nA(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 iA(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=>dv(t,e.helpers).keys(),o=T_(e,t);for(let e of Qa){let t=o[e];if($a(t))for(let e of a(t))r.push(e)}for(let n of Ms(w_(e,t).node)){if(n.when)for(let e of a(n.when))r.push(e);if(n.kind!==`segment`)continue;let t=e.segments[n.name];if(t){for(let e of[t.template,t.when,t.bg,t.fg])if(e)for(let t of a(e))r.push(t)}}let s=new Set;for(;r.length>0;){let e=r.pop();for(let t of oA(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 aA(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=iA(e,n);return t.set(n,i),i}}function oA(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 sA(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function cA(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 lA(e,t,n,r,i,a,o){let s=e=>sA(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,cA(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`),()=>Uk(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(aD(iD(a.claudeConfigDir)))))]),x=[],S=e=>{if(e.kind===`failed`){x.push(e.reason);return}return e.kind===`ok`?e.value:void 0},C=_A(u);x.push(...C.failures);let ee=rA(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=fA(y);y.kind===`failed`&&x.push(`memento: ${y.reason}`);let oe=uA(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?Zk(D.used_percentage,D.resets_at,18e6,c):void 0,le=se?Zk(se.used_percentage,se.resets_at,6048e5,c):void 0,ue=te?.session.cost,de=w?.sessionDuration,fe=s(`burn`)&&ue!=null&&de!=null?Qk(ue,de):void 0,pe=S(v),me=pe===void 0?void 0:eA(pe),he=pe===void 0?void 0:tA(pe),ge=me!==void 0||he!==void 0?{...me,...he!==void 0&&{history:he}}:void 0,O=gA(process.env.HOME??process.env.USERPROFILE),_e=e.workspace?{...e.workspace,current_dir:gA(e.workspace.current_dir)??``,project_dir:gA(e.workspace.project_dir)??``}:e.workspace,ve=te===void 0?void 0:hA({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:hA({lastResponseTime:w.lastResponseTime,responseTime:w.responseTime,sessionDuration:w.sessionDuration,messageCount:w.messageCount,linesAdded:w.linesAdded,linesRemoved:w.linesRemoved}),xe=ie===void 0?void 0:pA(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,...Yk(i),history:t.history(e.session_id),navigation:{back:t.navigation(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 uA(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return xk(e.value,t)}}const dA=e=>e.trim().split(`
|
|
178
|
+
`).at(-1).trim();function fA(e){switch(e.kind){case`absent`:return;case`failed`:return{error:dA(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function pA(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=mA(e.running),i=mA(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 mA(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function hA(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 gA(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function _A(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 vA={theme:e=>e.theme.kind===`decided`?e.theme.name:null,preset:e=>e.preset,style:e=>e.style.kind===`decided`?e.style.name:null,endcaps:e=>e.endcaps,variation:e=>e.variation,charset:e=>e.charset,colorCompatibility:e=>e.colorCompatibility,autoWrap:e=>e.autoWrap?So:Co,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?So:Co},yA=Object.entries(wb),bA=new Set(Tb.map(e=>e.sessionKey)),xA=()=>!1;function SA(e,t){return Kk(e,e=>bA.has(e)?t(e):null,xA)}function CA(e,t,n,r){return e.flatMap(([e,i])=>{let a=vA[e](t);return a===null||a===vA[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function wA(e,t,n){return vA[n](SA(e,t))}function TA(e,t){let n=SA(e,t),r=Kk(e,()=>null,xA),i=Kk(e,e=>e===wb.preset.sessionKey?n.preset:null,xA);return CA(yA,n,e=>e===`preset`?r:i,t=>EA(e,n.preset,t.configKey))}function EA(e,t,n){return n in(C_(e.presets,t).globals??{})?tx(t,n):n}function DA(e,t,n){let r=S_(t(wb.preset.sessionKey),e.globals.preset,e.presets),i=nx(n);return{key:i?.scope===`globals`?EA(e,r,i.field):n,globals:T_(e,r)}}function OA(e,t){let{preset:n}=SA(e,t);return jA(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:Js(a,s);return c===void 0||qs(c)===qs(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function kA(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return x_(e.presets).flatMap(n=>{let i=jA(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Gs(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:Js(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const AA=new WeakMap;function jA(e,t){let n=AA.get(e)??new Map;AA.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...Ms(w_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Us(e.segments[t.name])[n];return{id:r,setting:n,key:i,decl:a,saved:t.settings?.[n]??a.default}})),a=[...new Map(i.map(e=>[e.key,e])).values()];return n.set(t,a),a}function MA(e,t){let n=SA(e,t),r=Kk(e,e=>e===wb.preset.sessionKey?n.preset:null,xA);return{from:n.preset,globals:C_(e.presets,n.preset).globals??{},picks:CA(yA.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:OA(e,t)}}function NA(e){return{sessionKeys:Tb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...bl(e)?jk.map(t=>tx(t,e)):[]]}}function PA(e){return new Set(Tb.map(e=>e.configKey).filter(t=>NA(t).fileKeys.some(t=>LA(e,IA(t)))))}function FA(e,t,n){let r=TA(e,n);return{unsaved:r.length+OA(e,n).length,resettable:new Set([...r.map(e=>e.configKey),...t]).size}}function IA(e){let t=nx(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return rx(t)}function LA(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&LA(e[n],r)}const RA=qa(),zA=new Set(RA),BA=new Set(oo),VA=e=>e?zA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${RA.join(`, `)})`}:{ok:!1,reason:`theme name is required`},HA=e=>e?BA.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${oo.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},UA=new Set([`1`,`true`]),WA=new Set([`0`,`false`]),GA=ok({endcaps:HA,theme:VA,"toolbar-expanded":e=>UA.has(e)?{ok:!0,value:`1`}:WA.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}});function KA(){return GA.listKeys()}function qA(e,t){return GA.register(e,t)}function JA(e,t){return GA.validate(e,t)}function YA(e){return GA.rangeParamsFor(e)}function XA(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:qb(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 ZA(e){let t=new Set(GA.listBaselineKeys());return e.filter(e=>e.spec.kind!==`allow-list`||!t.has(e.key))}function QA(e,t,n){let r=Ob.get(n);if(r!==void 0)return wA(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 $A(e){let t=Gb(e);return ZA(Object.values(e.actions).flatMap(e=>XA(e,t)))}function ej(e){return ak($A(e))}const tj=`update.dismissed`,nj=`updateNotice`,rj=wb.updateNotice.sessionKey;function ij(e){return e.kind===`source`?e.newer.digest:fD(e.newer)}const aj=e=>`${e.version} [${WO(e.digest)}]`;function oj(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:aj(e.newer),running:aj(e.running),act:`rebuild`,busy:`rebuildingโฆ`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:fD(e.newer),running:fD(e.running),act:`upgrade`,busy:`upgradingโฆ`,command:{bin:`pnpm`,args:[`dlx`,`${mD}@${fD(e.newer)}`,`install`]}}}}const sj={kind:`idle`},cj={kind:`running`};function lj(e,t,n){if(e===null)return[];let r=ij(e);if(!n.enabled||n.dismissed===r)return[];let i=oj(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
|
+
`),c=XE([{verb:ME,args:[s]}]),l=t.kind===`running`?MO(`[${i.busy}]`,c):MO(`[${i.act}]`,XE([{verb:UE,args:[n.sessionId]}]));return[{severity:jO,message:s,lines:[[MO(a,c),l,MO(`[dismiss]`,XE([{verb:EE,args:[n.sessionId,tj,r]}])),MO(`[disable]`,XE([{verb:NE,args:[n.sessionId,nj,`false`]},{verb:EE,args:[n.sessionId,rj,`false`]}]))],...o.map(e=>[MO(e,c)])]}]}function uj(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 dj(e){switch(e.kind){case`current`:return[`info`,`build: current ${aj(e.stamp)}`];case`stale`:return[`info`,`build: stale โ source ${aj(e.source)}, running ${aj(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function fj(e){switch(e.kind){case`current`:return[`info`,`release: current ${fD(e.installed)}`];case`stale`:return[`info`,`release: stale โ latest ${fD(e.latest)}, running ${fD(e.installed)}`];case`ahead`:return[`info`,`release: ahead โ running ${fD(e.installed)}, latest ${fD(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function pj(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const mj=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function hj(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=mj(e.stderr)??e.error??mj(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function gj(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=sj,d=null,f=pj(s),p=pj(s),m=()=>uj(c,l);function h(){let e=m(),t=e===null?null:ij(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:qA(tj,{kind:`allow-list`,allowed:[t]})})}function g(){c=JO(t,KO),f(dj(c)),h()}async function _(){l=gD(nD,await hD(mD,a,i)),p(fj(l)),h()}return{arm(){gk(nj,{kind:`allow-list`,allowed:[`false`]}),qA(rj,{kind:`allow-list`,allowed:[`false`]}),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>lj(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=oj(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=cj,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=sj,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=hj(n);u={kind:`failed`,identity:ij(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var _j=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 vj={"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 yj=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 _j.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await _j.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(vj).length} models`),this.executionCache=vj,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(vj).length} models`),vj)}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 bj=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function xj(e){if(typeof e==`string`)return bj.exec(e)?.[1]}function Sj(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 Cj(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=Sj(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?xj(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 wj(){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 Tj(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await Ik(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 Ej(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await Ik(i)).filter(e=>e.startsWith(`agent-`)&&e.endsWith(`.jsonl`));for(let a of t){let t=f(i,a);if(n?.has(t)){r.push(t);continue}try{let n=(await Lk(t,`utf-8`)).split(`
|
|
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 Dj(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 Oj=new Map;async function kj(e){try{let t=await Rk(e),n=t.size,r=Oj.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),Oj.delete(e),Oj.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 Mj(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(Oj.delete(e),Oj.size>=16&&Oj.delete(Oj.keys().next().value),Oj.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 Aj(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:Cj(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 jj(e){let t=[];for(let n of e.split(`
|
|
181
|
+
`))if(n.trim())try{let e=Aj(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function Mj(e){return jj(await Lk(e,`utf-8`))}async function Nj(e,t){let n=await zk(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:jj(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=Aj(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 Fj=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 Ij(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 Lj={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},Rj={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function zj(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function Bj(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function Vj(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function Hj(e,t,n,r){let i=zj(new Date(Bj())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:Vj(),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 yj.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=zj(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...Lj};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 Uj(e){let t=0,n=0,r=Vj(),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)??{...Lj};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:Rj,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 Wj(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 Gj=class{entries=new Map;flight=new Fj;seeded=new Map;speedRings=new Map;speedFlight=new Fj;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:Rj,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e){let t=zj(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={...Lj},i=!1;for(let e of this.entries.values()){i||=e.days.has(t);let n=e.days.get(t)??Lj;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=Nk(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=Ij(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??Nk(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 Ej(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 Nj(e,r?.cursor);if(o.kind===`failed`)return o;if(o.kind===`absent`){r&&i.set(e,r);continue}let{entries:s,cursor:c,reset:l}=o.value;i.set(e,await Hj(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...Uj(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=Bj(),n=await Tj(wj()),r=[];for(let e of n){let n;try{n=await Ik(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await Rk(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await Wj(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 Kj(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function qj(e,t){let n=H.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function Jj(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`โฆ`}):e.cellLength<t&&e.align(n.justify,t)}function Yj({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function Xj(e){let t=Yj(e);if(t.length===1)return e.text;let n=qj(t);return n.style=e.text.style,n}function Zj(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=qj(e,a).pad(o),u=new H(` `.repeat(o)),d={...s.length>0&&{lead:qj([u,...s],a)},...c.length>0&&{trail:qj([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(Jj(l,n,f),[{text:l,...d}])}const Qj=RegExp(`\\x1b\\[[0-9;]*m|${_i.source}`,`g`);function $j(e){return Lt(e.replace(Qj,``))}function eM(e,t){let n=e.map(Xj),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=DO(n,t).split(`
|
|
182
|
+
`);if(i.length>1)return n;let a=Math.max(0,t.width-$j(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];Jj(l,l.cellLength+c,i),n[t]=Xj(e[t])}),n}function tM(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=nM(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(iM(a.style).link){i();let e=nM([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function nM(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>rM(e,t)):e,r=H.fromFragments(n);return r.end=``,r.overflow=`ignore`,n.length===1?r.style=n[0].style:t!==void 0&&!t.isNull&&(r.style=t),r}function rM(e,t){let n=e.copy();return n.style=t.add(iM(e.style)),n}function iM(e){return e instanceof B?e:B.parse(e)}function aM(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,oM(e,t,o,n,r,i));return i}function oM(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=qb(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=Eb.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=qb(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=qb(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:cM(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:cM(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:AC(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:cM(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 sM(e){return e.kind===`do`?sM(e.head):e}function cM(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function lM(e,t){return e.has(t)?wv(e.read(t)):``}function uM(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function dM(e,t,n,r){let i=new H(e,{style:B.combine([r,new B({link:t,bold:n})])});return i.overflow=`ignore`,i.end=``,i}function fM(e,t){return Math.max(e.members.indexOf(lM(t,e.stateVar)),0)}function pM(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=lM(r,e.stateVar);return{effects:[{verb:EE,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=lM(r,e.stateVar);return{effects:[{verb:EE,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=lM(r,e.stateVar);return{effects:[{verb:EE,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(fM(e,r)+1)%e.members.length];return{effects:[{verb:EE,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:DE,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:OE,args:[uM(e.text,gy(r))]}],active:!1};case`open`:return{effects:[{verb:kE,args:[uM(e.target,gy(r))]}],active:!1};case`persist-literal`:{let t=lM(r,e.stateVar);return{effects:[{verb:NE,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=lM(r,e.stateVar);return{effects:[{verb:NE,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(fM(e,r)+1)%e.members.length];return{effects:[{verb:NE,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:PE,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:RE,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:BE,args:[i]}],active:!1};case`redo`:return{effects:[{verb:VE,args:[i]}],active:!1};case`back`:return{effects:[{verb:HE,args:[i]}],active:!1};case`save`:return{effects:[{verb:FE,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:IE,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:LE,args:[i,uM(e.name,gy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:WE,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:GE,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:KE,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:qE,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:zE,args:[i,e.key,YO(e.op)]}],active:!1};case`do`:{let a=pM(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>pM(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:zE,args:[i,e.key,YO(r)]}],active:!1}}}}function mM(e,t,n,r){if(n.length===0)throw Error(`action "${e}" needs a display (the clickable text)`);if(t.kind===`set-cycle`||t.kind===`persist-cycle`)return{display:qc(`action "${e}"`,n,t.members.length,fM(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 hM(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}=mM(e,sM(r),t,i),{effects:s,active:c}=pM(r,a,o,i,lM(i,`session.id`));return dM(a,XE(s),c)}function gM(e){return{action:{fn:(t,...n)=>hM(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function _M(e,t){return dM(`โ`,XE([{verb:EE,args:[lM(e,`session.id`),t,Wc]}]),!1)}function vM(e,t,n){return new B({bgcolor:gn.fromRgba(t),color:gn.fromRgba(Ta(e,t,n))})}function yM(e,t,n){return vM(e.palette,Ra(e.palette,e.disclosure,[t],n),n)}function bM(e,t,n,r,i){return r===void 0?n=>yM(e,{...n,distribution:t},i):(e,t)=>xM(r(t,n),i)}function xM(e,t){let n=ha(e,`background`);return new B({bgcolor:gn.fromRgba(n),color:gn.fromRgba(ir(ha(e,`primary`),n,4.5,t))})}function SM(e){return{current:null,drawnAt:e}}function CM(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 wM(e,t){let n=e.current;if(n===null)throw Error(`${t} is only available inside a segment's templates โ there is no active segment here. Segment-scoped functions cannot be used in variable declarations or layout-node "when" predicates, which are evaluated outside any segment.`);return n}function TM(e){return new H(e).cellLength}function EM(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function DM(e){return Math.max(1,EM(e)-(TM(`โ`)+2*e.padding+e.seamCols))}function OM(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 kM(e,t){let n=[];for(let t of e)n.length>0&&n.push(new H(` `)),n.push(t);let r=H.fromFragments(n);return r.overflow=t?`ignore`:void 0,r.end=``,r}function AM(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 jM(e,t,n){let r=e.compiled.get(t),i=r&&sM(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=jM(a,e,`picker`),c=a.compiled.get(e),l=a.store,u=lM(l,`session.id`),d=`stateVar`in s?lM(l,s.stateVar):void 0,f=s.options.map(TM),p=i?EM(a):1/0,m=TM(`โ`)+1,h=TM(`โ`)+1+TM(`โ`)+1,g=OM(f,p,m),_=g.length>1?OM(f,p,m+h):g,v=parseInt(lM(l,t.stateVar),10),y=Number.isInteger(v)?Math.max(0,Math.min(v,_.length-1)):0,b=_[y]??[],x=e=>XE([{verb:EE,args:[u,t.key,String(e)]}]),S=n.flatMap(([e,t])=>[e,t]),C=XE([{verb:EE,args:[u,...S]}]),ee=r?[{verb:EE,args:[u,...S]}]:[],te=e=>XE([...pM(c,e,e,l,u).effects,...ee]),ne=[dM(`โ`,C,!1)];y>0&&ne.push(dM(`โ`,x(y-1),!1));for(let e of b){let t=s.options[e];ne.push(dM(t,te(t),t===d,o({index:e,count:s.options.length},t)))}return y<_.length-1&&ne.push(dM(`โ`,x(y+1),!1)),kM(ne,i)}function NM(e,t){return{picker:{fn:(n,r,i,a,...o)=>{uy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=AM(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,bM(wM(t,`{{ picker }}`),la(void 0),e,jM(e,n,`picker`).paletteOf,t.drawnAt()))},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function PM(e,t,n,r,i){let a=Math.min(Math.floor((t-1)/2),i),o=n,s=0;for(;s<a;){let t=o+TM(e(-(s+1)))+1+TM(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function FM(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=lM(a,`session.id`),{options:c}=t,l=c.length,u=lM(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=XE(pM(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>dM(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=PM(p,l,TM(`โ`)+1+TM(p(0))+1+TM(`โถ`),DM(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return kM([...v(-1).reverse(),dM(`โ`,h(-1),!1),g(0),dM(`โถ`,h(1),!1),...v(1)],!0)}function IM(e,t){return{carousel:{fn:(n,r,...i)=>{if(uy(`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=jM(e,n,`carousel`);return FM(n,o,e,bM(wM(t,`{{ carousel }}`),la(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const LM=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function RM(e,t,n){let r=ja(e,{hue:ta,depth:0},n);return[ra(t).map((t,n)=>({text:LM[n%LM.length],colour:ga(e,t)})),[{text:`โพ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ha(e,`warning`)},{text:`error`,colour:ha(e,`error`)}]]}function zM(e,t,n,r){let i=RM(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:vM(e,i,n)})}))),a=[],o=0;for(let{gap:e,cell:t}of i){if(o+=e.length+t.cellLength,o>r)break;e!==``&&a.push(new H(e)),a.push(t)}let s=H.fromFragments(a);return s.overflow=`ignore`,s.end=``,s}function BM(e,t){return{themePreview:{fn:()=>zM(e.palette,e.variation,t.drawnAt(),DM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const VM=e=>e.slice(e.lastIndexOf(`.`)+1),HM=(e,t)=>{let n=new H(VM(e));return n.truncate(t,{marker:`โฆ`}),n.plain};function UM(e,t){let n=e.map(e=>e.map(({name:e})=>TM(VM(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 WM(e,t,n,r){let i=UM(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${HM(s,i)} `,{style:vM(l,Ha(l,{kind:`bar`,variation:t,address:c},n).tint,n)});if(o+=e.cellLength,o>r)break;a.push(e)}return a}),o=H.fromFragments(a.flatMap((e,t)=>t===0?e:[new H(`
|
|
183
|
+
`),...e]));return o.overflow=`ignore`,o.end=``,o}function GM(e,t){return{layoutPreview:{fn:()=>WM(e.layout(),e.variation,t.drawnAt(),DM(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function KM(e,t,n,r){let i=wM(r.activeSegment,`{{ menu }}`),a=r.action,o=d_(i.placementId,e,n.key),s=m_(o),c=u_(e),l=lM(a.store,o)===c,u=lM(a.store,`session.id`),d=l?Wc:c,f=dM(qc(`{{ menu "${e}" }}`,t,2,+!!l),XE([{verb:EE,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?[MM(e,{key:s,stateVar:s},[[o,Wc],[s,`0`]],n.closeOnPick,n.paged,a,bM(i,n.distribution,a,jM(a,e,`menu`).paletteOf,r.activeSegment.drawnAt()))]:[]),f}const qM=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function JM(e,t){let n=t[t.length-1],r=qM(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 YM(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 XM(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=ZM(t,n,r),c=[];for(let e=0;e<r;e++){let t=e<s,l=t&&o!==void 0?o(e*n/r):void 0;c.push(new H(t?i:a,{style:l===void 0?void 0:new B({color:l})}))}let l=H.fromFragments(c);return l.end=``,l.overflow=`ignore`,l}function ZM(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 QM(e){let t={fn:(()=>{let t=wM(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:(()=>wM(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=Xv(()=>wM(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...$M(s)];return XM({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 $M(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 eN(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}function eN(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,...tN(e,r)]}function tN(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 nN(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:eN(e.direction,e.children.map((t,i)=>n(t,[...r,rN(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function rN(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Ds[e.direction]}}const iN={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:la(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ns(t.path,n)))}},render(e,t){return eN(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,rN(e,r))))}},aN={drop:e=>e.place,above:()=>`above`},oN={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:Os(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Xc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Ps(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.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=vy(t.scope,e.settings);try{if(!Vj(i.when,a))return[];let n=Pb(e.settings.theme,t.palette),o=e.opens!==void 0&&Vj(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:aN[h.placement](e)})),_=e=>Kj(Xj([e],s.trigger),{...m,width:`auto`,baseStyle:s.trigger}),v=g.findIndex(e=>e.band===`own`),y=e.opens!==void 0&&v!==-1?t.closeDisclosure(e.opens.key):void 0,b=y===void 0?[]:_(y),x=y===void 0?[]:_(new H(` `.repeat(y.cellLength))),S=(e,t)=>e.band===`own`?t===v?b:x:[],C=g.map((e,t)=>({cells:[...S(e,t),...e.cells],band:`deeper`,place:e.place})),ee=$M(Xj(c,p)).map((e,t)=>({cells:Kj(e,{...m,lead:t===0?Xj(l,p):[],trail:t===0?Xj(u,p):[]}),band:`own`,place:`flow`})),te=d.map(e=>({cells:Kj(Xj([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),ne=[...ee,...te];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...ne.flatMap(e=>e.cells),...g.flatMap(S)].flatMap(Wj)),[...ne,...C]}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 H(`โ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:sN(e.lead,e,a,t),trail:sN(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function sN(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 cN={container:iN,segment:oN};function lN(e){return cN[e]}function uN(e){if(`ttl`in e)return{kind:`ttl`,durationMs:ab(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 dN(e,t){switch(Ls(e)){case`json`:return{kind:`json`,default:t};case`regex`:return{kind:`regex`,regex:new RegExp(e.regex),default:t};case`text`:return{kind:`text`,default:t}}}function fN(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:uN(n.cache),parse:dN(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:uN(n.cache),parse:dN(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?ab(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 pN(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 mN=e=>xo(void 0,null,e.globals.variation);function hN(e,t,n){let r=n.cwd,i=Vb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:bO({endcaps:`powerline`,charset:uo}),width:80,basePalette:i,palette:i,variation:ea[mN(e)],padding:1,seamCols:xO({endcaps:`powerline`,charset:uo}),layout:()=>[]},o=xM(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=x_(e.presets),u=new Map([...Gb(e),...xx(e)]),d=hy({...hM(a),...MM(a,o),...FM(a,o),...zM(a,o),...WM(a,o),...JM(s),...ZM(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=pN(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 Db)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=iM(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{fN(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{fN(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Us(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>Js(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return lN(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=w_(e,t);C.set(t,S(n,r))}let ee=new Map(Qa.map(e=>[e,new Map])),te=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of te)for(let n of Qa){let r=t[n];if(!$a(r))continue;let i=`${e}.${n}`,a=ee.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:gN(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function gN(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 _N(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 vN(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function yN(e,t){return e.kind===`decided`?e.name:t}function bN(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(vo(a.colorCompatibility));let{preset:d=y_}=s??{},f=T_(e,d),p=ea[s?.variation??xo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??io(`none`,e.styles),h=s?.theme??zb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(yN(h,Ga),yN(m,no))),t.menuRuntime.action.chromeCols=bO(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=xO(a);let _=gy(n),v=to(h,e=>{let n=_N(t,`palette`,e);return Rb(vN(n,_),n.where,e=>u?.(e))}),y=to(m,n=>io(vN(_N(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=Ib(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}=Ha(i,a,c),d=SM(t.activeSegment,e.name,e.id,i,u,l),f=tM(d,c,o.bg,o.fg,n),p=o.body.evaluate(n),m=d.drops.length>0||s;m&&(d.bg=ja(i,u,c).state);let h=o.lead?.evaluate(n)??[],g=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return _M(i,ja(i,u,c).state,c)},get band(){return _M(i,ja(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&&Vj(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>ee(e,t,Ba(r,n)),renderBody:(e,t,n)=>ee(e,i&&t,Va(n)),closeDisclosure:e=>gM(n,e)};return lN(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(!Vj(e.when,_))return!1;if(e.kind===`container`)return!0;if(Ax(e.name)===void 0)return!1;try{return Vj(t.segments[e.name].when,vy(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>nN(te,ne).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Ax(e);return r===void 0?[]:[{name:r,address:t,palette:Pb(n.theme,x)}]})),ee(te,!0,za(p)).map(e=>SO(Yj(e.cells,a),a)).join(`
|
|
186
|
-
`)}var
|
|
187
|
-
`)||null}var PN=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=kN(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=Xw(e,t,n),i=r.kind===`file`?r.path:null,a=[eT(e,t),Qw(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof xs&&a.push(...e.warnings),{resolvedPath:i,warning:NN(a),state:null,error:e instanceof xs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:NN(a),state:o,error:null}}buildState(e,t,n){let r=tT(t,Tk),{config:i,raw:a}=r;n.push(...r.warnings);let o=iT(r,t??`<default>`),s=new ON,c=new Sb(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=hN(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of YA(o))u.push(HA(e,t));for(let{key:e,spec:t}of uk(o))u.push(dk(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:eA(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:AN(i,a),fileHeldSettings:kA(a)}}refreshWatcher(e,t){e.configFilePath=t;let n=MN(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 FN=16384;var IN=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<FN){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%FN}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:ZE,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}}};function LN(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const RN={load:()=>({}),save:()=>{},flush:()=>{}};function zN(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var BN=class{sessions;storage;atom=(0,xv.createAtom)(`SessionState`);constructor(e=RN,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=zN(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,xv.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,xv.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,xv.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};const VN=(e,t)=>O(t);function HN(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 UN=class{timer=null;pending=null;constructor(e,t=500,n=VN){this.filePath=e,this.debounceMs=t,this.logger=n}load(){let e;try{e=r.readFileSync(this.filePath,`utf8`)}catch(e){let t=e.code;return t!==`ENOENT`&&this.logger(`warn`,`session-state read failed (${t}); starting empty`),{}}try{let t=JSON.parse(e);return HN(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 WN={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`},GN=new Set([`1`,`true`]),KN=new Set([`0`,`false`,``]);function qN(e,t){let n=vP(e),r=n.scope===`segment-palette`?`string`:WN[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(GN.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 YN(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 XN(e){return/^\s*$/.test(e)?null:Lo(e)}function ZN(e,t){return e!==null&&zo(e,t)!==void 0}function QN(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(QN),...i}}return e}function $N(e){if(!Mc(e))return QN(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,QN(t)])),...n}}const eP=Ck,tP=eP.segments,nP=eP.presets,rP=eP.root;function iP(e,t,n,r){if(!ZN(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function aP(e,t){let n=rx(t);return t.scope===`segment-palette`&&iP(e,[`segments`,t.segment],tP[t.segment],n.join(`.`)),n}function oP(e){return Lo(qo(e))}function sP(){return Object.entries(rP.rows).map(([e,t])=>{let n=QN(t);return{path:[`root`],fragment:oP({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function cP(e,t){let n=e===null?void 0:zo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function lP(e,t){if(t===void 0)return null;let n=$N(t);return{path:e,fragment:oP(n),unit:{path:e,value:n}}}function uP(e,t){let n=[`presets`,t],r=[...n,`root`],i=nP[t];iP(e,n,i,r.join(`.`));let a=cP(e,r)??lP(r,i?.root);return a!==null&&ms(a.fragment)?a:null}function dP(e,t){let n=ps(t.fragment);return n===null?new Map([[`#`,{path:t.path,unit:t.unit,node:t.fragment}]]):new Map([...e,...n.map(e=>[e.key,{path:[...t.path,`rows`,e.key],unit:t.unit,node:e.value}])])}function fP(e,t){return[...sP(),cP(e,[`root`]),uP(e,t)].filter(e=>e!==null).reduce(dP,new Map)}function pP(e,t,n){for(let{node:r,...i}of fP(e,t).values())if(gs(r,n))return i;throw new $(`${mP(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 mP(e,t){return uP(e,t)?.path??[`root`]}function hP(e,t){return t.scope===`preset-root`?mP(e,t.preset):rx(t)}function gP(e,{unit:t}){return t===null?e:ss(e,t.path,qo(t.value),Go)}function _P(e){let t=nx(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function vP(e){let t=_P(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function yP(e,t,n,r){bP(t,r),YN(t,r,e.logger),e.record(t,n,r)}function bP(e,t){try{return iT(nT(e,t,Tk),e)}catch(e){throw e instanceof xs?new $(`refused: the config file would not load after this click โ ${e.message}`):e}}function xP(e,t){let n=vP(t),r=XN(JN(e)??``),i=r===null?void 0:zo(r,rx(n));return i!==void 0&&`value`in i?i.value:void 0}function SP(e,t,n){CP(e,t,n,[])}function CP(e,t,n,r){let i=JN(t);yP(e,t,i,wP(n.reduce((e,[t,n])=>ss(e,aP(XN(e),vP(t)),qN(t,n),Go),i??``),t,r,e=>e))}function wP(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=pP(XN(s),n,i),l=bs(gP(s,c),c.path,i,a,qo(o));if(l===null)throw new $(`${c.path.join(`.`)} in ${t} has no placement "${i}" โ the bar you clicked is stale (it reloads on the next render)`);return l},e)}function TP(e,t,n){let r=XN(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of fP(r,t)){if(!gs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Vo(e,c):qo(s.value);if(a!==`#`)return ss(e,[...i,`rows`,a],l,Go);if(uP(r,t)!==null)throw new $(`cannot give preset "${t}" its own copy of ${o.join(`.`)}: it already stages rows of its own over that tree`);return ss(e,i,l,Go)}return e}function EP(e,t){return ls(e,t,t[0]===`presets`&&t.length>2&&!Dk(t[1])?2:0)}function DP(e,t,n){let r=n.map(_P),i=JN(t);if(i===null)return;let a=r.reduce((e,t)=>EP(e,hP(XN(e),t)),i);a!==i&&yP(e,t,i,a)}function OP(e){let t=e===null?void 0:zo(e,[`presets`]),n=new Set([...Ek,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(pu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(pu(e)))}function kP(e,t,n,r,i,a){let o=JN(t),s=XN(o??``),c=OP(s),l=[`presets`,c],u=uP(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Vo(o??``,u.fragment):qo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],qo(r)]]],f=i.map(([e,t])=>{let n=tx(c,e);return[aP(s,vP(n)),qN(n,t)]});return yP(e,t,o,wP([...d,...f].reduce((e,[t,n])=>ss(e,t,n,Go),ss(o??``,l,`{}`,Go)),t,a.map(e=>({...e,preset:c})),TP)),c}function AP(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=XN(i??``);if(i===null||a===null||zo(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t} declares no ${r.join(`.`)} โ the bar you clicked is stale; it reloads on the next render`);let o=zo(a,[`globals`,`preset`]);yP(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>EP(e,t),i))}function jP(e,t,n,r){let i=_P(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=pP(XN(a??``),i.preset,o),c=gP(a??``,s),{after:l,placed:u}=MP(c,s.path,r,()=>{let e=bP(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 yP(e,t,a,l),u}function MP(e,t,n,r){switch(n.op){case`remove`:return{after:vs(e,t,n.target),placed:null};case`insert`:{let i=KO(n.segment,n.anchor,r());return{after:ys(e,t,i,n.anchor,n.relation),placed:i}}}}const NP={load:()=>({}),save:()=>{}},PP=new Set(Tb.map(e=>e.sessionKey)),FP=e=>PP.has(e)||e.startsWith(G_),IP={past:[],future:[]},LP=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var RP=class{state=new Map;constructor(e,t,n=NP){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)??IP;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??IP}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(LP(n));r.set(LP(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)};return{sessionState:LN(this.sessionState,FP,(e,n,r,i)=>t(e,{kind:`session`,key:n,before:r,after:i})),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=[...e];e.clear();for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length!==0&&this.put(e,{past:VP([...this.history(e).past,t]),future:[]})}}}}undo(e){let{past:t,future:n}=this.history(e),r=t.at(-1);if(r===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,r,`before`,`undo`,{past:t.slice(0,-1),future:VP([...n,r])}),r}redo(e){let{past:t,future:n}=this.history(e),r=n.at(-1);if(r===void 0)throw new $(`redo: nothing to redo`);return this.apply(e,r,`after`,`redo`,{past:VP([...t,r]),future:n.slice(0,-1)}),r}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(LP));throw this.put(e,{past:HP(this.history(e).past,t),future:HP(this.history(e).future,t)}),new $(`${r}: ${o.map(WP).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`?YN(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||zP(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,BP(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function zP(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 BP({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function VP(e){return e.slice(-50)}function HP(e,t){return e.map(e=>e.filter(e=>!t.has(LP(e)))).filter(e=>e.length>0)}function UP(e){return e.map(WP).join(`, `)}function WP(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function GP(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(GP))}function qP(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(qP))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)}}}}const YP=e=>!FP(e)&&!Qx(e)&&e!==`update.dismissed`;var XP=class{past=new Map;depth(e,t){return this.restorable(e,t).length}restorable(e,t){let n=new Map,r=r=>n.has(r)?n.get(r):t.get(e,r),i=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>r(e.key)===e.after&&(e.before===null||UA(e.key,e.before).ok))){i.unshift(t);for(let e of t)n.set(e.key,e.before)}return i}begin(e){let t=new Map;return{sessionState:LN(e,YP,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t){let n=this.past.get(e)??[],r=this.restorable(e,t),i=r.at(-1),a=n.length-r.length;if(i===void 0)throw this.put(e,r),new $(`back: nothing to go back to${a>0?` (${a} step(s) over a view since gone, discarded)`:``}`);return(0,xv.runInAction)(()=>{let n=i.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of i)r===null&&t.clear(e,n)}),this.put(e,r.slice(0,-1)),{step:i,discarded:a}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function ZP(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 QP(e){let t=ZP(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 $P(){return{probeTmux:QP}}function eF(e){let t=rD(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 tF(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function nF(e,t){return{tmux:tF(e,t.tmux),claudeSettings:eF(eD($E(t.claudeConfigDir)))}}function rF(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ss(nD(n),[`env`,e.name],JSON.stringify(e.value),Ko);return r.mkdirSync(c.dirname(n),{recursive:!0}),k(n,i),{...t,claudeSettings:eF(n)}}default:return e.kind}}const iF=/^โ{20,}/,aF=/^โฏ(\s|$)/,oF=/โบ\s*stashed$/;function sF(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>iF.test(e)?[t]:[]).at(-2);return n===void 0||!aF.test(t[n+1]??``)?{kind:`no-prompt`}:oF.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const cF={"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 lF(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=sF(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:cF[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const uF=`cc-candybar-slash`;function dF(e,t,n,r){let i=ZP(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function fF(e){let t=dF(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
|
-
`);return{inMode:n!==`0`,screen:r}}function pF(e,t){let n=dF(e,`claude-input.type`,[`load-buffer`,`-b`,uF,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,uF,`-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 mF(){return{read:fF,type:pF}}function hF(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function gF(e){return _F(()=>decodeURIComponent(e))}function _F(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function vF(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 yF=(e,t)=>vF(gF(e),t),bF=(e,t)=>{let n=Oe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,gF(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`})`)}},xF=(e,t)=>vF(gF(e),t),SF=(e,t)=>vF(gF(e),t),CF=(e,t)=>{let n=hF(gF(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},wF=(e,t)=>{let[n=``,...r]=_F(()=>WE(e)),i=hF(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${VA().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: ${VA().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=UA(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}OF(t,i,`set-state`,a),t.navigating.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},TF=/^-?\d+$/;function EF(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const DF=(e,t)=>{let[n=``,r=``,i=``]=_F(()=>WE(e)),a=hF(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!TF.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=WA(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${VA().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&TF.test(c)?kF(s,parseInt(c,10)):AF(`step-state`,r,s,qA(t.configFor(PF(t,a)),e=>t.sessionState.get(a,e),r)),u=EF(l,o,s.min,s.max),d=UA(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);OF(t,a,`step-state`,[{key:r,value:d.value}]),t.navigating.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}โ${d.value} (by ${o}, session=${a})`)};function OF(e,t,n,r){let i=r.filter(e=>e.key.startsWith(G_));if(i.length===0)return;let a=wA(e.configFor(PF(e,t)),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused โ ${a.join(`; `)}`)}function kF(e,t){return Math.max(e.min,Math.min(e.max,t))}function AF(e,t,n,r){if(r===null)return n.min;if(!TF.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return kF(n,parseInt(r,10))}const jF=`render-origin`;function MF(e){return JSON.stringify(e)}function NF(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 PF(e,t){let n=e.sessionState.get(t,jF);if(n===null)throw new $(`session ${t} has not rendered yet โ no config to act on`);return NF(n)}function FF(e){return Zw(e.projectDir,e.cwd,e.configFile??void 0)}function IF(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const LF=(e,t)=>{let[n=``,r=``,i=``]=_F(()=>WE(e)),a=hF(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${rk().join(`, `)})`);let o=ik(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=PF(t,a),c=FF(s),l=SA(t.configFor(s),e=>t.sessionState.get(a,e),r);SP(IF(t,a),c,[[l.key,o.value]]),t.dlog(`info`,`set-config: ${l.key}=${o.value} โ ${c} (session=${a})`)},RF=(e,t)=>{let[n=``,r=``,i=``]=_F(()=>WE(e)),a=hF(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!TF.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=ak(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${rk().join(`, `)})`);let c=PF(t,a),l=FF(c),u=SA(t.configFor(c),e=>t.sessionState.get(a,e),r),d=xP(l,u.key),f=typeof d==`number`?kF(s,d):AF(`step-config`,r,s,sk(u.globals,r)),p=EF(f,o,s.min,s.max),m=ik(r,String(p));if(!m.ok)throw new $(`step-config: ${m.reason}`);SP(IF(t,a),l,[[u.key,m.value]]),t.dlog(`info`,`step-config: ${u.key} ${f}โ${m.value} (by ${o}) โ ${l} (session=${a})`)},zF=(e,t)=>{let[n=``]=_F(()=>WE(e)),r=hF(n),i=PF(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=bA(a,o),c=CA(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=UA(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});VF(`save`,c);let u=FF(i);CP(IF(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(BF)].join(` `)} โ ${u} (session=${r})`)},BF=e=>`${e.preset}/${e.id}.settings.${e.setting}=${qs(e.value)}`;function VF(e,t){for(let n of t){let t=UA(n.key,qs(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const HF=(e,t)=>{let[n=``]=_F(()=>WE(e)),r=hF(n),i=PF(t,r),a=DA(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=UA(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});VF(`save-preset`,a.placements);let s=FF(i),c=kP(IF(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...Tb.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,wb.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(BF)].join(` `)} โ ${s} (session=${r})`)},UF=(e,t)=>{let[n=``,r=``]=_F(()=>WE(e)),i=hF(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=PF(t,i),o=FF(a);AP(IF(t,i),o,r),t.reloadConfig(a);let s=wb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} โ ${o} (session=${i})`)},WF=(e,t)=>{let[n=``,...r]=_F(()=>WE(e)),i=hF(n),a=rk(),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=PF(t,i),c=FF(s),l=r.map(OA),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);DP(IF(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 GF(e,t){let n=(e,t)=>[...Ms(w_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(x_(t.presets).flatMap(e=>n(t,e).map(t=>K_(pu(e),Os(t)))));return x_(e.presets).flatMap(t=>n(e,t).map(e=>({member:K_(pu(t),Os(e)),node:e})).filter(({member:e})=>!r.has(e)))}function KF(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[B_]:[]])}const qF=(e,t)=>{let[n=``,r=``,i=``]=_F(()=>WE(e)),a=hF(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${rk().join(`, `)})`);let o=ik(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=GO(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=PF(t,a),l=FF(c),u=t.configFor(c),d=jP(IF(t,a),l,r,s);t.reloadConfig(c);let f=KF(GF(u,t.configFor(c)),t.sessionState.get(a,B_)).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})`)},JF=(e,t)=>{let[n=``]=_F(()=>WE(e)),r=hF(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${UP(i)} (session=${r})`)},YF=(e,t)=>{let n=hF(gF(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState),a=r.map(e=>`${e.key}=${e.before??`โ
`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},XF=(e,t)=>{let[n=``]=_F(()=>WE(e)),r=hF(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${UP(i)} (session=${r})`)},ZF=(e,t)=>{hF(gF(e)),t.applyUpdate()},QF=`client-hints`;function $F(e,t){let n=e.sessionState.get(t,QF);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 dT(r)}function eI(e,t,n){let r=Hx(n);e.sessionState.setBatch(t,Kx(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const tI=(e,t)=>{let n=hF(gF(e));eI(t,n,nF(t.doctor,$F(t,n)))},nI=(e,t)=>{let[n=``,r=``]=_F(()=>WE(e)),i=hF(n),a=Ux(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=nF(t.doctor,$F(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=rF(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} โ ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),eI(t,i,c)},rI=(e,t)=>{let[n=``,...r]=_F(()=>WE(e)),i=hF(n),a=PF(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=TC(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})`)},iI=(e,t)=>{let[n=``,r=``]=_F(()=>WE(e)),i=hF(n),a=Object.values(t.configFor(PF(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=lF(t.claudeInput,$F(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})`)},aI=`config-override`,oI=new Map([[CE,yF],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=hF(_F(()=>decodeURIComponent(e.slice(0,n)))),i=_F(()=>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,aI),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,aI,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[wE,bF],[xE,wF],[SE,DF],[OE,LF],[kE,RF],[NE,WF],[AE,zF],[jE,HF],[ME,UF],[PE,qF],[FE,JF],[IE,XF],[LE,YF],[EE,xF],[DE,SF],[TE,CF],[RE,ZF],[zE,tI],[BE,nI],[VE,rI],[HE,iI]]),sI=new Set([xE,SE,OE,kE,NE,AE,jE,ME,PE,FE,IE,LE,TE,RE,zE,BE,VE,HE]),cI=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of JE(KE(e))){if(!i&&sI.has(a)){let e=WE(o);e.length>0&&e[0]&&(i=e[0])}let e=oI.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(`
|
|
189
|
-
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function lI(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const uI=new Map([...oI,[bE,cI]].map(([e,t])=>[e,lI(t)]));Object.freeze([...uI.keys()]);const dI=new Set([`hook_event_name`,`session_id`,`session_name`,`transcript_path`,`cwd`,`model`,`workspace`,`version`,`output_style`,`cost`,`context_window`,`exceeds_200k_tokens`,`effort`,`thinking`,`rate_limits`,`vim`,`agent`,`worktree`]),fI=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]];function pI(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of fI){let i=hI(n,e);if(i==null)t.missingRequired.push(e);else{let n=mI(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))dI.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function mI(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function hI(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=n[e]}return n}function gI(e,t){switch(e){case`vars`:return{what:e,vars:_I(t)};case`segments`:return{what:e,segments:SI(t)};case`config`:return{what:e,config:EI(t)}}}function _I(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=bI(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...vI(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:yI(r.lastUpdatedMs())})}return o}function vI(e){if(e.kind!==`document`)try{return{type:e.type,value:e.read()}}catch(t){return{type:e.type,value:t instanceof Error?t.message:String(t)}}let t=e.read();switch(t.kind){case`ok`:return{type:`document`,value:JSON.stringify(t.value)};case`absent`:return{type:`document`,value:`(not yet scanned)`};case`failed`:return{type:`document`,value:t.reason}}}function yI(e){return e===null?null:Math.max(0,Date.now()-e)}function bI(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,xI(r));for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,xI(i));return t}function xI(e){return e.kind}function SI(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=wI(n),o=CI(n),s=[];for(let e of a){let t=n.segments[e];t&&s.push({name:e,description:t.description??null,template:t.template,referencedVars:TI(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function CI(e){let t=new Map;for(let n of x_(e.presets))for(let r of Ms(w_(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=Os(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function wI(e){let t=[],n=new Set;for(let r of Ms(Fc(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function TI(e,t,n){let r=new Set;for(let i of dv(e,t).keys()){if(n.has(i)){r.add(i);continue}let e=i.split(`.`);for(;e.length>1;){e.pop();let t=e.join(`.`);if(n.has(t)){r.add(t);break}}}return Array.from(r).sort()}function EI(e){return e===null?null:e.config}const DI=[`vars`,`segments`,`config`];function OI(e){return typeof e==`string`&&DI.includes(e)}function kI(e){return Math.max(1,e-2)}var AI=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return O(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);O(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{O(`Calculating context tokens from transcript: ${e}`);let n=await wj(e);if(n.length===0)return O(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,O(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return O(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},jI=class{states=new Map;constructor(e,t,n=256){this.empty=e,this.step=t,this.maxSessions=n}async read(e,t){let n=this.states.get(e),r=Ok(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await Oj(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:n?.value??this.empty};let{entries:a,cursor:o,reset:s}=i.value,c=s||n===void 0?this.empty:n.value;for(let e of a)c=this.step(c,e);for(this.touch(e,{cursor:o,value:c});this.states.size>this.maxSessions;){let e=this.states.keys().next().value;if(e===void 0)break;this.states.delete(e)}return{kind:`ok`,value:c}}touch(e,t){this.states.delete(e),this.states.set(e,t)}};const MI={messageCount:0,recent:[]};function NI(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!Sj(t),recent:n.length>20?n.slice(-20):n}}function PI(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(Sj(r))t=r.timestamp;else if(e===`assistant`&&t){let e=(r.timestamp.getTime()-t.getTime())/1e3;e>.1&&e<300&&(n=e)}}return n}var FI=class{fold=new jI(MI,NI);async getMetricsInfo(e,t){if(O(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:PI(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};const II={command:null,todos:[],pending:[],done:[]};function LI(e,t){let n=e.findIndex(e=>e.name===t);return n<0?[...e,{name:t,count:1}]:e.map((e,t)=>t===n?{name:e.name,count:e.count+1}:e)}function RI(e,t){if(t.isSidechain)return e;let n=Sj(t)?{...e,command:t.activity?.command??null,pending:[],done:[]}:e,r=t.activity;if(r===void 0)return n;let i=n.pending,a=n.done;r.started!==void 0&&(i=[...i,...r.started]);for(let e of r.finished??[]){let t=i.findIndex(t=>t.id===e);t<0||(a=LI(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos}}function zI(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>LI(e,t.name),[]),done:e.done}}var BI=class{fold=new jI(II,RI);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(zI(n.value))}};const VI=new Map;function HI(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var UI=class{async getSessionId(){if(!process.env.TMUX_PANE)return Y;let e=HI(process.env.TMUX),t=VI.get(e);if(t!==void 0)return t;O(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await De({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?J(n.stdout.trim()):Y:X(`tmux display-message: ${n.reason}`);return VI.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};const WI=e=>`${e.sessionId}|${e.projectDir}|${e.cwd}`;var GI=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=WI(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t.projectDir),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e.projectDir);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=WI(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};const KI=c.join(`lib`,`ceiling_config.py`),qI=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function JI(e,t){let n=typeof e==`object`&&e?e.plugins:void 0;if(typeof n!=`object`||!n)throw Error(`${t} has no "plugins" object`);return Object.entries(n).filter(([e])=>e.split(`@`)[0]===`memento`).flatMap(([e,n])=>{if(!Array.isArray(n))throw Error(`${t}: "${e}" is not a list of installs`);return n.map(n=>{let{scope:r,installPath:i,projectPath:a}=n??{};if(typeof r!=`string`||typeof i!=`string`)throw Error(`${t}: an install of "${e}" has no scope/path`);return typeof a==`string`?{key:e,scope:r,installPath:i,projectPath:a}:{key:e,scope:r,installPath:i}})})}function YI(e,t){let n=!0;for(let i of e){if(!r.existsSync(i))continue;let e;try{e=JSON.parse(r.readFileSync(i,`utf8`))?.enabledPlugins?.[t]}catch(e){return X(`memento lookup: ${i}: ${e.message}`)}typeof e==`boolean`&&(n=e)}return J(n)}function XI(e,t){if(!r.existsSync(e))return Y;let n;try{n=JI(JSON.parse(r.readFileSync(e,`utf8`)),e)}catch(e){return X(`memento lookup: ${e.message}`)}let i=n.find(e=>e.projectPath===t)??n.find(e=>e.scope===`user`);if(i===void 0)return Y;let a=YI([c.join(c.dirname(c.dirname(e)),`settings.json`),c.join(t,`.claude`,`settings.json`),c.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[KI,qI].filter(e=>!r.existsSync(c.join(i.installPath,e)));return o.length===0?J(i.installPath):X(`memento at ${i.installPath} has no ${o.join(` or `)} โ upgrade the plugin`)}function ZI(e){let{CLAUDE_PROJECT_DIR:t,CLAUDE_CODE_SESSION_ID:n,...r}=process.env;return{...r,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function QI(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function $I(e){let t;try{t=JSON.parse(e)}catch{return X(`memento read: not JSON: ${e.trim()}`)}let{ceiling:n,session:r}=t??{},i=n===`off`||typeof n==`number`&&n>=0?n:void 0;return i!==void 0&&(r===null||typeof r==`string`)?J({ceiling:i,session:r}):X(`memento read: unexpected answer: ${e.trim()}`)}async function eL(e,t){let n=await De({bin:`python3`,args:[`-c`,`
|
|
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 tN(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,...nN(e,r)]}function nN(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 rN(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:tN(e.direction,e.children.map((t,i)=>n(t,[...r,iN(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function iN(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Ds[e.direction]}}const aN={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:la(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ns(t.path,n)))}},render(e,t){return tN(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,iN(e,r))))}},oN={drop:e=>e.place,above:()=>`above`},sN={compile(e,t){return{kind:`segment`,when:t.when,name:e.name,id:Os(e),settings:t.placementSettings(e),...e.opens!==void 0&&{opens:{open:t.parse(Xc(e.opens.ref),`opens`),body:t.compileChild(e.opens.body,Ps(t.path)),key:e.opens.ref.key,placement:e.opens.placement}},...e.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=vy(t.scope,e.settings);try{if(!Kj(i.when,a))return[];let n=Pb(e.settings.theme,t.palette),o=e.opens!==void 0&&Kj(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:oN[h.placement](e)})),_=e=>Zj(tM([e],s.trigger),{...m,width:`auto`,baseStyle:s.trigger}),v=g.findIndex(e=>e.band===`own`),y=e.opens!==void 0&&v!==-1?t.closeDisclosure(e.opens.key):void 0,b=y===void 0?[]:_(y),x=y===void 0?[]:_(new H(` `.repeat(y.cellLength))),S=(e,t)=>e.band===`own`?t===v?b:x:[],C=g.map((e,t)=>({cells:[...S(e,t),...e.cells],band:`deeper`,place:e.place})),ee=eN(tM(c,p)).map((e,t)=>({cells:Zj(e,{...m,lead:t===0?tM(l,p):[],trail:t===0?tM(u,p):[]}),band:`own`,place:`flow`})),te=d.map(e=>({cells:Zj(tM([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),ne=[...ee,...te];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...ne.flatMap(e=>e.cells),...g.flatMap(S)].flatMap(Yj)),[...ne,...C]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:Zj([new H(`โ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:cN(e.lead,e,a,t),trail:cN(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function cN(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 lN={container:aN,segment:sN};function uN(e){return lN[e]}function dN(e){if(`ttl`in e)return{kind:`ttl`,durationMs:ab(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 fN(e,t){switch(Ls(e)){case`json`:return{kind:`json`,default:t};case`regex`:return{kind:`regex`,regex:new RegExp(e.regex),default:t};case`text`:return{kind:`text`,default:t}}}function pN(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:dN(n.cache),parse:fN(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:dN(n.cache),parse:fN(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?ab(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 mN(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 hN=e=>xo(void 0,null,e.globals.variation);function gN(e,t,n){let r=n.cwd,i=Vb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:TO({endcaps:`powerline`,charset:uo}),width:80,basePalette:i,palette:i,variation:ea[hN(e)],padding:1,seamCols:EO({endcaps:`powerline`,charset:uo}),layout:()=>[]},o=SM(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=x_(e.presets),u=new Map([...Gb(e),...Ex(e)]),d=hy({...gM(a),...NM(a,o),...IM(a,o),...BM(a,o),...GM(a,o),...YM(s),...QM(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=mN(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 Db)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=aM(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{pN(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{pN(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Us(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>Js(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return uN(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=w_(e,t);C.set(t,S(n,r))}let ee=new Map(Qa.map(e=>[e,new Map])),te=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of te)for(let n of Qa){let r=t[n];if(!$a(r))continue;let i=`${e}.${n}`,a=ee.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:_N(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:ee,loadWarnings:_}}function _N(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 vN(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 yN(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function bN(e,t){return e.kind===`decided`?e.name:t}function xN(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(vo(a.colorCompatibility));let{preset:d=y_}=s??{},f=T_(e,d),p=ea[s?.variation??xo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??io(`none`,e.styles),h=s?.theme??zb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(bN(h,Ga),bN(m,no))),t.menuRuntime.action.chromeCols=TO(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=EO(a);let _=gy(n),v=to(h,e=>{let n=vN(t,`palette`,e);return Rb(yN(n,_),n.where,e=>u?.(e))}),y=to(m,n=>io(yN(vN(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=Ib(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}=Ha(i,a,c),d=CM(t.activeSegment,e.name,e.id,i,u,l),f=lx(d,c,o.bg,o.fg,n),p=o.body.evaluate(n),m=d.drops.length>0||s;m&&(d.bg=ja(i,u,c).state);let h=o.lead?.evaluate(n)??[],g=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return vM(i,ja(i,u,c).state,c)},get band(){return vM(i,ja(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&&Kj(e.when,_),o={scope:_,palette:x,visible:i,padding:a.padding,region:r,perSegmentSink:c,onSegmentError:l,evaluateSegment:C,lookupSegment:S,renderChild:(e,t,n)=>ee(e,t,Ba(r,n)),renderBody:(e,t,n)=>ee(e,i&&t,Va(n)),closeDisclosure:e=>_M(n,e)};return uN(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(!Kj(e.when,_))return!1;if(e.kind===`container`)return!0;if(Fx(e.name)===void 0)return!1;try{return Kj(t.segments[e.name].when,vy(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>rN(te,ne).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=Fx(e);return r===void 0?[]:[{name:r,address:t,palette:Pb(n.theme,x)}]})),ee(te,!0,za(p)).map(e=>DO(eM(e.cells,a),a)).join(`
|
|
186
|
+
`)}var SN=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,ON(e,t,n,`initial value`),this.cell=xv.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){ON(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}},CN=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,xv.computed)(()=>{let e=n();return ON(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},wN=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=xv.observable.box(DN(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=DN(e);EN(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function TN(e){return JSON.stringify(e)}function EN(e,t){return TN(e)===TN(t)}function DN(e){return e.kind===`ok`?{kind:`ok`,value:Sv(e.value)}:e}function ON(e,t,n,r){let i=Cv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var kN=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new SN(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new wN(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new CN(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,xv.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,xv.runInAction)(()=>n.set(t))}runInAction(e){(0,xv.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 TN(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 AN(e,t,n){return e+`\0`+t+`\0`+(n??``)}function jN(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 MN(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 NN(e,t){let n=new Map;for(let t of $w(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=MN(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 PN(e){return e.filter(Boolean).join(`
|
|
187
|
+
`)||null}var FN=class{entries=new Map;deps;maxEntries;observers;constructor(e,t={}){this.deps=e,this.maxEntries=t.maxEntries??256,this.observers=t.observers??{}}getOrCreate(e,t,n){let r=AN(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=tT(e,t,n),i=r.kind===`file`?r.path:null,a=[aT(e,t),rT(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof xs&&a.push(...e.warnings),{resolvedPath:i,warning:PN(a),state:null,error:e instanceof xs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:PN(a),state:o,error:null}}buildState(e,t,n){let r=oT(t,Ak),{config:i,raw:a}=r;n.push(...r.warnings);let o=lT(r,t??`<default>`),s=new kN,c=new Sb(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l,u=[];try{l=gN(o,c,{cwd:e}),n.push(...l.loadWarnings);for(let{key:e,spec:t}of ej(o))u.push(qA(e,t));for(let{key:e,spec:t}of hk(o))u.push(gk(e,t))}catch(e){for(let e of u)e();throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:aA(o),lastRenderCellsBySegment:new Map,validatorDisposers:u,authoredRoots:jN(i,a),fileHeldSettings:PA(a)}}refreshWatcher(e,t){e.configFilePath=t;let n=NN(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 IN=16384;var LN=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<IN){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%IN}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:nD,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}}};function RN(e,t,n){let r=(r,i,a)=>{let o=i.filter(t).map(t=>({key:t,before:e.get(r,t)}));a();for(let{key:t,before:i}of o)n(r,t,i,e.get(r,t))};return{get:(t,n)=>e.get(t,n),set:(t,n,i)=>r(t,[n],()=>e.set(t,n,i)),setBatch:(t,n)=>r(t,n.map(e=>e.key),()=>e.setBatch(t,n)),clear:(t,n)=>r(t,[n],()=>e.clear(t,n))}}const zN={load:()=>({}),save:()=>{},flush:()=>{}};function BN(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var VN=class{sessions;storage;atom=(0,xv.createAtom)(`SessionState`);constructor(e=zN,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=BN(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,xv.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,xv.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,xv.runInAction)(()=>{for(let t of this.sessions.keys())e.has(t)||this.sessions.delete(t);this.persist(),this.atom.reportChanged()})}touch(e,t){this.sessions.delete(e),this.sessions.set(e,t)}evictOldest(){let e=this.sessions.size-this.maxSessions;if(!(e<=0)){for(let t of this.sessions.keys())if(this.sessions.delete(t),--e===0)break}}flush(){this.storage.flush()}persist(){this.storage.save(this.serialize())}serialize(){let e=Object.create(null);for(let[t,n]of this.sessions)e[t]=Object.fromEntries(n);return e}};const HN=(e,t)=>O(t);function UN(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 WN=class{timer=null;pending=null;constructor(e,t=500,n=HN){this.filePath=e,this.debounceMs=t,this.logger=n}load(){let e;try{e=r.readFileSync(this.filePath,`utf8`)}catch(e){let t=e.code;return t!==`ENOENT`&&this.logger(`warn`,`session-state read failed (${t}); starting empty`),{}}try{let t=JSON.parse(e);return UN(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 GN={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`},KN=new Set([`1`,`true`]),qN=new Set([`0`,`false`,``]);function JN(e,t){let n=yP(e),r=n.scope===`segment-palette`?`string`:GN[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(KN.has(t))return`true`;if(qN.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function YN(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function XN(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 ZN(e){return/^\s*$/.test(e)?null:Lo(e)}function QN(e,t){return e!==null&&zo(e,t)!==void 0}function $N(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($N),...i}}return e}function eP(e){if(!Mc(e))return $N(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,$N(t)])),...n}}const tP=Ok,nP=tP.segments,rP=tP.presets,iP=tP.root;function aP(e,t,n,r){if(!QN(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function oP(e,t){let n=rx(t);return t.scope===`segment-palette`&&aP(e,[`segments`,t.segment],nP[t.segment],n.join(`.`)),n}function sP(e){return Lo(qo(e))}function cP(){return Object.entries(iP.rows).map(([e,t])=>{let n=$N(t);return{path:[`root`],fragment:sP({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function lP(e,t){let n=e===null?void 0:zo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function uP(e,t){if(t===void 0)return null;let n=eP(t);return{path:e,fragment:sP(n),unit:{path:e,value:n}}}function dP(e,t){let n=[`presets`,t],r=[...n,`root`],i=rP[t];aP(e,n,i,r.join(`.`));let a=lP(e,r)??uP(r,i?.root);return a!==null&&ms(a.fragment)?a:null}function fP(e,t){let n=ps(t.fragment);return n===null?new Map([[`#`,{path:t.path,unit:t.unit,node:t.fragment}]]):new Map([...e,...n.map(e=>[e.key,{path:[...t.path,`rows`,e.key],unit:t.unit,node:e.value}])])}function pP(e,t){return[...cP(),lP(e,[`root`]),dP(e,t)].filter(e=>e!==null).reduce(fP,new Map)}function mP(e,t,n){for(let{node:r,...i}of pP(e,t).values())if(gs(r,n))return i;throw new $(`${hP(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 hP(e,t){return dP(e,t)?.path??[`root`]}function gP(e,t){return t.scope===`preset-root`?hP(e,t.preset):rx(t)}function _P(e,{unit:t}){return t===null?e:ss(e,t.path,qo(t.value),Go)}function vP(e){let t=nx(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function yP(e){let t=vP(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function bP(e,t,n,r){xP(t,r),XN(t,r,e.logger),e.record(t,n,r)}function xP(e,t){try{return lT(sT(e,t,Ak),e)}catch(e){throw e instanceof xs?new $(`refused: the config file would not load after this click โ ${e.message}`):e}}function SP(e,t){let n=yP(t),r=ZN(YN(e)??``),i=r===null?void 0:zo(r,rx(n));return i!==void 0&&`value`in i?i.value:void 0}function CP(e,t,n){wP(e,t,n,[])}function wP(e,t,n,r){let i=YN(t);bP(e,t,i,TP(n.reduce((e,[t,n])=>ss(e,oP(ZN(e),yP(t)),JN(t,n),Go),i??``),t,r,e=>e))}function TP(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=mP(ZN(s),n,i),l=bs(_P(s,c),c.path,i,a,qo(o));if(l===null)throw new $(`${c.path.join(`.`)} in ${t} has no placement "${i}" โ the bar you clicked is stale (it reloads on the next render)`);return l},e)}function EP(e,t,n){let r=ZN(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of pP(r,t)){if(!gs(c,n))continue;if(i.every((e,t)=>o[t]===e))return e;let l=s===null?Vo(e,c):qo(s.value);if(a!==`#`)return ss(e,[...i,`rows`,a],l,Go);if(dP(r,t)!==null)throw new $(`cannot give preset "${t}" its own copy of ${o.join(`.`)}: it already stages rows of its own over that tree`);return ss(e,i,l,Go)}return e}function DP(e,t){return ls(e,t,t[0]===`presets`&&t.length>2&&!Mk(t[1])?2:0)}function OP(e,t,n){let r=n.map(vP),i=YN(t);if(i===null)return;let a=r.reduce((e,t)=>DP(e,gP(ZN(e),t)),i);a!==i&&bP(e,t,i,a)}function kP(e){let t=e===null?void 0:zo(e,[`presets`]),n=new Set([...jk,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(pu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(pu(e)))}function AP(e,t,n,r,i,a){let o=YN(t),s=ZN(o??``),c=kP(s),l=[`presets`,c],u=dP(s,n),d=[...u===null?[]:[[[...l,`root`],u.unit===null?Vo(o??``,u.fragment):qo(u.unit.value)]],...Object.keys(r).length===0?[]:[[[...l,`globals`],qo(r)]]],f=i.map(([e,t])=>{let n=tx(c,e);return[oP(s,yP(n)),JN(n,t)]});return bP(e,t,o,TP([...d,...f].reduce((e,[t,n])=>ss(e,t,n,Go),ss(o??``,l,`{}`,Go)),t,a.map(e=>({...e,preset:c})),EP)),c}function jP(e,t,n){if(Mk(n))throw new $(`cannot delete preset "${n}": it is bundled โ reset its settings instead`);let r=[`presets`,n],i=YN(t),a=ZN(i??``);if(i===null||a===null||zo(a,r)===void 0)throw new $(`cannot delete preset "${n}": ${t} declares no ${r.join(`.`)} โ the bar you clicked is stale; it reloads on the next render`);let o=zo(a,[`globals`,`preset`]);bP(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>DP(e,t),i))}function MP(e,t,n,r){let i=vP(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=YN(t),o=r.op===`remove`?r.target:r.anchor,s=mP(ZN(a??``),i.preset,o),c=_P(a??``,s),{after:l,placed:u}=NP(c,s.path,r,()=>{let e=xP(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 bP(e,t,a,l),u}function NP(e,t,n,r){switch(n.op){case`remove`:return{after:vs(e,t,n.target),placed:null};case`insert`:{let i=ZO(n.segment,n.anchor,r());return{after:ys(e,t,i,n.anchor,n.relation),placed:i}}}}const PP={load:()=>({}),save:()=>{}},FP=new Set(Tb.map(e=>e.sessionKey)),IP=e=>FP.has(e)||e.startsWith(G_),LP={past:[],future:[]},RP=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var zP=class{state=new Map;constructor(e,t,n=PP){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)??LP;return{undo:t.length,redo:n.length}}history(e){return this.state.get(e)??LP}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(RP(n));r.set(RP(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)};return{sessionState:RN(this.sessionState,IP,(e,n,r,i)=>t(e,{kind:`session`,key:n,before:r,after:i})),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=[...e];e.clear();for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length!==0&&this.put(e,{past:HP([...this.history(e).past,t]),future:[]})}}}}undo(e){let{past:t,future:n}=this.history(e),r=t.at(-1);if(r===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,r,`before`,`undo`,{past:t.slice(0,-1),future:HP([...n,r])}),r}redo(e){let{past:t,future:n}=this.history(e),r=n.at(-1);if(r===void 0)throw new $(`redo: nothing to redo`);return this.apply(e,r,`after`,`redo`,{past:HP([...t,r]),future:n.slice(0,-1)}),r}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(RP));throw this.put(e,{past:UP(this.history(e).past,t),future:UP(this.history(e).future,t)}),new $(`${r}: ${o.map(GP).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):YN(t.file)}write(e,t,n){t.kind===`file`?XN(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||BP(n)>8388608;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):n.set(e,VP(t))}this.storage.save(Object.fromEntries(n)),this.state=n}};function BP(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 VP({past:e,future:t}){return e.length>0?{past:e.slice(1),future:t}:{past:e,future:t.slice(1)}}function HP(e){return e.slice(-50)}function UP(e,t){return e.map(e=>e.filter(e=>!t.has(RP(e)))).filter(e=>e.length>0)}function WP(e){return e.map(GP).join(`, `)}function GP(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function KP(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 qP(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(KP))}function JP(e){if(typeof e!=`object`||!e)return!1;let t=e;return qP(t.past)&&qP(t.future)}function YP(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(JP))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)}}}}const XP=e=>!IP(e)&&!rS(e)&&e!==`update.dismissed`;var ZP=class{past=new Map;depth(e,t){return this.restorable(e,t).length}restorable(e,t){let n=new Map,r=r=>n.has(r)?n.get(r):t.get(e,r),i=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>r(e.key)===e.after&&(e.before===null||JA(e.key,e.before).ok))){i.unshift(t);for(let e of t)n.set(e.key,e.before)}return i}begin(e){let t=new Map;return{sessionState:RN(e,XP,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t){let n=this.past.get(e)??[],r=this.restorable(e,t),i=r.at(-1),a=n.length-r.length;if(i===void 0)throw this.put(e,r),new $(`back: nothing to go back to${a>0?` (${a} step(s) over a view since gone, discarded)`:``}`);return(0,xv.runInAction)(()=>{let n=i.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of i)r===null&&t.clear(e,n)}),this.put(e,r.slice(0,-1)),{step:i,discarded:a}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function QP(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 $P(e){let t=QP(e,`doctor.tmux`,[`display`,`-p`,`-t`,e.pane,`#{client_termfeatures}`]);return t.kind===`ok`?{kind:`ok`,value:t.stdout.trim().split(`,`).filter(e=>e!==``)}:{kind:`failed`,reason:t.reason}}function eF(){return{probeTmux:$P}}function tF(e){let t=cD(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 nF(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function rF(e,t){return{tmux:nF(e,t.tmux),claudeSettings:tF(aD(iD(t.claudeConfigDir)))}}function iF(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ss(sD(n),[`env`,e.name],JSON.stringify(e.value),Ko);return r.mkdirSync(c.dirname(n),{recursive:!0}),k(n,i),{...t,claudeSettings:tF(n)}}default:return e.kind}}const aF=/^โ{20,}/,oF=/^โฏ(\s|$)/,sF=/โบ\s*stashed$/;function cF(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>aF.test(e)?[t]:[]).at(-2);return n===void 0||!oF.test(t[n+1]??``)?{kind:`no-prompt`}:sF.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const lF={"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 uF(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=cF(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:lF[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const dF=`cc-candybar-slash`;function fF(e,t,n,r){let i=QP(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function pF(e){let t=fF(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
|
+
`);return{inMode:n!==`0`,screen:r}}function mF(e,t){let n=fF(e,`claude-input.type`,[`load-buffer`,`-b`,dF,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,dF,`-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 hF(){return{read:pF,type:mF}}function gF(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function _F(e){return vF(()=>decodeURIComponent(e))}function vF(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function yF(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 bF=(e,t)=>yF(_F(e),t),xF=(e,t)=>{let n=Oe({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,_F(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`})`)}},SF=(e,t)=>yF(_F(e),t),CF=(e,t)=>yF(_F(e),t),wF=(e,t)=>{let n=gF(_F(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},TF=(e,t)=>{let[n=``,...r]=vF(()=>YE(e)),i=gF(n);if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${KA().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: ${KA().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=JA(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);a.push({key:t,value:i.value})}kF(t,i,`set-state`,a),t.navigating.setBatch(i,a);let o=a.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${o} (session=${i})`)},EF=/^-?\d+$/;function DF(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const OF=(e,t)=>{let[n=``,r=``,i=``]=vF(()=>YE(e)),a=gF(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!EF.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=YA(r);if(!s)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${KA().join(`, `)})`);let c=t.sessionState.get(a,r),l=c&&EF.test(c)?AF(s,parseInt(c,10)):jF(`step-state`,r,s,QA(t.configFor(FF(t,a)),e=>t.sessionState.get(a,e),r)),u=DF(l,o,s.min,s.max),d=JA(r,String(u));if(!d.ok)throw new $(`step-state: ${d.reason}`);kF(t,a,`step-state`,[{key:r,value:d.value}]),t.navigating.set(a,r,d.value),t.dlog(`info`,`step-state: ${r} ${l}โ${d.value} (by ${o}, session=${a})`)};function kF(e,t,n,r){let i=r.filter(e=>e.key.startsWith(G_));if(i.length===0)return;let a=kA(e.configFor(FF(e,t)),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused โ ${a.join(`; `)}`)}function AF(e,t){return Math.max(e.min,Math.min(e.max,t))}function jF(e,t,n,r){if(r===null)return n.min;if(!EF.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return AF(n,parseInt(r,10))}const MF=`render-origin`;function NF(e){return JSON.stringify(e)}function PF(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 FF(e,t){let n=e.sessionState.get(t,MF);if(n===null)throw new $(`session ${t} has not rendered yet โ no config to act on`);return PF(n)}function IF(e){return nT(e.projectDir,e.cwd,e.configFile??void 0)}function LF(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const RF=(e,t)=>{let[n=``,r=``,i=``]=vF(()=>YE(e)),a=gF(n);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${ck().join(`, `)})`);let o=lk(r,i);if(!o.ok)throw new $(`set-config: ${o.reason}`);let s=FF(t,a),c=IF(s),l=DA(t.configFor(s),e=>t.sessionState.get(a,e),r);CP(LF(t,a),c,[[l.key,o.value]]),t.dlog(`info`,`set-config: ${l.key}=${o.value} โ ${c} (session=${a})`)},zF=(e,t)=>{let[n=``,r=``,i=``]=vF(()=>YE(e)),a=gF(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!EF.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=uk(r);if(!s)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${ck().join(`, `)})`);let c=FF(t,a),l=IF(c),u=DA(t.configFor(c),e=>t.sessionState.get(a,e),r),d=SP(l,u.key),f=typeof d==`number`?AF(s,d):jF(`step-config`,r,s,fk(u.globals,r)),p=DF(f,o,s.min,s.max),m=lk(r,String(p));if(!m.ok)throw new $(`step-config: ${m.reason}`);CP(LF(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=``]=vF(()=>YE(e)),r=gF(n),i=FF(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=TA(a,o),c=OA(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=s.map(e=>{let t=JA(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});HF(`save`,c);let u=IF(i);wP(LF(t,r),u,l,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...l.map(([e,t])=>`${e}=${t}`),...c.map(VF)].join(` `)} โ ${u} (session=${r})`)},VF=e=>`${e.preset}/${e.id}.settings.${e.setting}=${qs(e.value)}`;function HF(e,t){for(let n of t){let t=JA(n.key,qs(n.value));if(!t.ok)throw new $(`${e}: ${t.reason}`)}}const UF=(e,t)=>{let[n=``]=vF(()=>YE(e)),r=gF(n),i=FF(t,r),a=MA(t.configFor(i),e=>t.sessionState.get(r,e)),o=a.picks.map(e=>{let t=JA(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});HF(`save-preset`,a.placements);let s=IF(i),c=AP(LF(t,r),s,a.from,a.globals,o,a.placements);t.reloadConfig(i);for(let e of[...Tb.map(e=>e.sessionKey),...a.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,wb.preset.sessionKey,c),t.dlog(`info`,`save-preset: ${[`${c} from=${a.from}`,...o.map(([e,t])=>`${e}=${t}`),...a.placements.map(VF)].join(` `)} โ ${s} (session=${r})`)},WF=(e,t)=>{let[n=``,r=``]=vF(()=>YE(e)),i=gF(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=FF(t,i),o=IF(a);jP(LF(t,i),o,r),t.reloadConfig(a);let s=wb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} โ ${o} (session=${i})`)},GF=(e,t)=>{let[n=``,...r]=vF(()=>YE(e)),i=gF(n),a=ck(),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=FF(t,i),c=IF(s),l=r.map(NA),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);OP(LF(t,i),c,u),t.reloadConfig(s);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} โ ${c} (session=${i})`)};function KF(e,t){let n=(e,t)=>[...Ms(w_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(x_(t.presets).flatMap(e=>n(t,e).map(t=>K_(pu(e),Os(t)))));return x_(e.presets).flatMap(t=>n(e,t).map(e=>({member:K_(pu(t),Os(e)),node:e})).filter(({member:e})=>!r.has(e)))}function qF(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[B_]:[]])}const JF=(e,t)=>{let[n=``,r=``,i=``]=vF(()=>YE(e)),a=gF(n);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${ck().join(`, `)})`);let o=lk(r,i);if(!o.ok)throw new $(`apply-layout-op: ${o.reason}`);let s=XO(o.value);if(s===null)throw new $(`apply-layout-op: "${o.value}" is not a layout op token`);let c=FF(t,a),l=IF(c),u=t.configFor(c),d=MP(LF(t,a),l,r,s);t.reloadConfig(c);let f=qF(KF(u,t.configFor(c)),t.sessionState.get(a,B_)).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})`)},YF=(e,t)=>{let[n=``]=vF(()=>YE(e)),r=gF(n);t.journal.commit();let i=t.history.undo(r);t.dlog(`info`,`undo: restored ${WP(i)} (session=${r})`)},XF=(e,t)=>{let n=gF(_F(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState),a=r.map(e=>`${e.key}=${e.before??`โ
`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},ZF=(e,t)=>{let[n=``]=vF(()=>YE(e)),r=gF(n);t.journal.commit();let i=t.history.redo(r);t.dlog(`info`,`redo: re-applied ${WP(i)} (session=${r})`)},QF=(e,t)=>{gF(_F(e)),t.applyUpdate()},$F=`client-hints`;function eI(e,t){let n=e.sessionState.get(t,$F);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 gT(r)}function tI(e,t,n){let r=qx(n);e.sessionState.setBatch(t,Zx(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const nI=(e,t)=>{let n=gF(_F(e));tI(t,n,rF(t.doctor,eI(t,n)))},rI=(e,t)=>{let[n=``,r=``]=vF(()=>YE(e)),i=gF(n),a=Jx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=rF(t.doctor,eI(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=iF(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} โ ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),tI(t,i,c)},iI=(e,t)=>{let[n=``,...r]=vF(()=>YE(e)),i=gF(n),a=FF(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=AC(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})`)},aI=(e,t)=>{let[n=``,r=``]=vF(()=>YE(e)),i=gF(n),a=Object.values(t.configFor(FF(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=uF(t.claudeInput,eI(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})`)},oI=`config-override`,sI=new Map([[OE,bF],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=gF(vF(()=>decodeURIComponent(e.slice(0,n)))),i=vF(()=>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,oI),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,oI,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[kE,xF],[EE,TF],[DE,OF],[NE,RF],[PE,zF],[RE,GF],[FE,BF],[IE,UF],[LE,WF],[zE,JF],[BE,YF],[VE,ZF],[HE,XF],[jE,SF],[ME,CF],[AE,wF],[UE,QF],[WE,nI],[GE,rI],[KE,iI],[qE,aI]]),cI=new Set([EE,DE,NE,PE,RE,FE,IE,LE,zE,BE,VE,HE,AE,UE,WE,GE,KE,qE]),lI=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of $E(ZE(e))){if(!i&&cI.has(a)){let e=YE(o);e.length>0&&e[0]&&(i=e[0])}let e=sI.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(`
|
|
189
|
+
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function uI(e){return(t,n)=>{let r=n.history.begin(),i=n.navigation.begin(r.sessionState),a=[];try{e(t,{...n,sessionState:r.sessionState,journal:r,navigating:i.sessionState})}catch(e){a.push(e)}i.commit();try{r.commit()}catch(e){a.push(e)}if(a.length===1)throw a[0];if(a.length>1)throw Error(a.map(e=>String(e.message??e)).join(`; `))}}const dI=new Map([...sI,[TE,lI]].map(([e,t])=>[e,uI(t)]));Object.freeze([...dI.keys()]);const fI=new Set([`hook_event_name`,`session_id`,`session_name`,`transcript_path`,`cwd`,`model`,`workspace`,`version`,`output_style`,`cost`,`context_window`,`exceeds_200k_tokens`,`effort`,`thinking`,`rate_limits`,`vim`,`agent`,`worktree`]),pI=[[`session_id`,`string`],[`transcript_path`,`string`],[`cwd`,`string`],[`model`,`object`],[`model.id`,`string`],[`model.display_name`,`string`],[`workspace`,`object`],[`workspace.current_dir`,`string`],[`workspace.project_dir`,`string`]];function mI(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of pI){let i=gI(n,e);if(i==null)t.missingRequired.push(e);else{let n=hI(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let e of Object.keys(n))fI.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function hI(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function gI(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||Array.isArray(n))return;n=n[e]}return n}function _I(e,t){switch(e){case`vars`:return{what:e,vars:vI(t)};case`segments`:return{what:e,segments:CI(t)};case`config`:return{what:e,config:DI(t)}}}function vI(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=xI(r),a=t.names().sort(),o=[];for(let e of a){let r=t.getNode(e),a=n.getLastError(e);o.push({name:e,source:i.get(e)??null,...yI(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:bI(r.lastUpdatedMs())})}return o}function yI(e){if(e.kind!==`document`)try{return{type:e.type,value:e.read()}}catch(t){return{type:e.type,value:t instanceof Error?t.message:String(t)}}let t=e.read();switch(t.kind){case`ok`:return{type:`document`,value:JSON.stringify(t.value)};case`absent`:return{type:`document`,value:`(not yet scanned)`};case`failed`:return{type:`document`,value:t.reason}}}function bI(e){return e===null?null:Math.max(0,Date.now()-e)}function xI(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,SI(r));for(let[n,r]of Object.entries(e.segments))if(r.vars)for(let[e,i]of Object.entries(r.vars))t.set(`${n}.${e}`,SI(i));return t}function SI(e){return e.kind}function CI(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=TI(n),o=wI(n),s=[];for(let e of a){let t=n.segments[e];t&&s.push({name:e,description:t.description??null,template:t.template,referencedVars:EI(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function wI(e){let t=new Map;for(let n of x_(e.presets))for(let r of Ms(w_(e,n).node)){if(r.kind!==`segment`)continue;let e=t.get(r.name)??[],n=Os(r);e.includes(n)||t.set(r.name,[...e,n])}return t}function TI(e){let t=[],n=new Set;for(let r of Ms(Fc(e.root)))r.kind===`segment`&&e.segments[r.name]&&!n.has(r.name)&&(t.push(r.name),n.add(r.name));for(let r of Object.keys(e.segments))n.has(r)||(t.push(r),n.add(r));return t}function EI(e,t,n){let r=new Set;for(let i of dv(e,t).keys()){if(n.has(i)){r.add(i);continue}let e=i.split(`.`);for(;e.length>1;){e.pop();let t=e.join(`.`);if(n.has(t)){r.add(t);break}}}return Array.from(r).sort()}function DI(e){return e===null?null:e.config}const OI=[`vars`,`segments`,`config`];function kI(e){return typeof e==`string`&&OI.includes(e)}function AI(e){return Math.max(1,e-2)}var jI=class{thresholds={LOW:50,MEDIUM:80};getContextUsageThresholds(){return this.thresholds}ratioPercentages(e,t){let n=Math.min(100,Math.max(0,Math.round(e/t*100)));return{percentage:n,contextLeftPercentage:Math.max(0,100-n)}}calculateContextFromHookData(e){let t=e.context_window;if(!t?.current_usage)return O(`No current_usage in hook data, falling back to transcript parsing`),null;let n=t.current_usage,r=t.context_window_size,i=(n.input_tokens||0)+(n.cache_creation_input_tokens||0)+(n.cache_read_input_tokens||0);O(`Native current_usage: input=${n.input_tokens}, cache_create=${n.cache_creation_input_tokens}, cache_read=${n.cache_read_input_tokens}, total=${i} (limit: ${r})`);let a=this.ratioPercentages(i,r);return{totalTokens:i,maxTokens:r,percentage:t.used_percentage==null?a.percentage:Math.round(t.used_percentage),contextLeftPercentage:t.remaining_percentage==null?a.contextLeftPercentage:Math.round(t.remaining_percentage)}}async calculateContextTokensFromTranscript(e,t){try{O(`Calculating context tokens from transcript: ${e}`);let n=await kj(e);if(n.length===0)return O(`No entries in transcript`),Y;let r=null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t&&t.message?.usage?.input_tokens&&t.isSidechain!==!0){r=t,O(`Context segment: Found most recent entry at ${t.timestamp.toISOString()}, stopping search`);break}}if(r?.message?.usage){let e=r.message.usage,n=(e.input_tokens||0)+(e.cache_read_input_tokens||0)+(e.cache_creation_input_tokens||0);return O(`Most recent main chain context: ${n} tokens (limit: ${t})`),J({totalTokens:n,maxTokens:t,...this.ratioPercentages(n,t)})}return O(`No main chain entries with usage data found`),Y}catch(e){return X(`context transcript: ${e instanceof Error?e.message:String(e)}`)}}async getContextInfo(e){let t=this.calculateContextFromHookData(e);if(t)return J(t);let n=e.context_window?.context_window_size??2e5;return this.calculateContextTokensFromTranscript(e.transcript_path,n)}},MI=class{states=new Map;constructor(e,t,n=256){this.empty=e,this.step=t,this.maxSessions=n}async read(e,t){let n=this.states.get(e),r=Nk(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await Nj(t,n?.cursor);if(i.kind===`failed`)return i;if(i.kind===`absent`)return{kind:`ok`,value:n?.value??this.empty};let{entries:a,cursor:o,reset:s}=i.value,c=s||n===void 0?this.empty:n.value;for(let e of a)c=this.step(c,e);for(this.touch(e,{cursor:o,value:c});this.states.size>this.maxSessions;){let e=this.states.keys().next().value;if(e===void 0)break;this.states.delete(e)}return{kind:`ok`,value:c}}touch(e,t){this.states.delete(e),this.states.set(e,t)}};const NI={messageCount:0,recent:[]};function PI(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!Dj(t),recent:n.length>20?n.slice(-20):n}}function FI(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(Dj(r))t=r.timestamp;else if(e===`assistant`&&t){let e=(r.timestamp.getTime()-t.getTime())/1e3;e>.1&&e<300&&(n=e)}}return n}var II=class{fold=new MI(NI,PI);async getMetricsInfo(e,t){if(O(`Getting metrics from hook data for session: ${e}`),!t.cost)return Y;let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`metrics (${e}): ${n.reason}`):J({responseTime:t.cost.total_api_duration_ms/1e3,lastResponseTime:FI(n.value.recent),sessionDuration:t.cost.total_duration_ms/1e3,messageCount:n.value.messageCount,linesAdded:t.cost.total_lines_added,linesRemoved:t.cost.total_lines_removed})}};const LI={command:null,todos:[],pending:[],done:[]};function RI(e,t){let n=e.findIndex(e=>e.name===t);return n<0?[...e,{name:t,count:1}]:e.map((e,t)=>t===n?{name:e.name,count:e.count+1}:e)}function zI(e,t){if(t.isSidechain)return e;let n=Dj(t)?{...e,command:t.activity?.command??null,pending:[],done:[]}:e,r=t.activity;if(r===void 0)return n;let i=n.pending,a=n.done;r.started!==void 0&&(i=[...i,...r.started]);for(let e of r.finished??[]){let t=i.findIndex(t=>t.id===e);t<0||(a=RI(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos}}function BI(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>RI(e,t.name),[]),done:e.done}}var VI=class{fold=new MI(LI,zI);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(BI(n.value))}};const HI=new Map;function UI(e){if(!e)return``;let t=e.indexOf(`,`);return t<0?e:e.slice(0,t)}var WI=class{async getSessionId(){if(!process.env.TMUX_PANE)return Y;let e=UI(process.env.TMUX),t=HI.get(e);if(t!==void 0)return t;O(`Getting tmux session ID, TMUX_PANE: ${process.env.TMUX_PANE}`);let n=await De({bin:`tmux`,args:[`display-message`,`-p`,`#S`],timeoutMs:1e3,category:`tmux`}),r=n.ok?n.stdout.trim()?J(n.stdout.trim()):Y:X(`tmux display-message: ${n.reason}`);return HI.set(e,r),r}isInTmux(){return!!process.env.TMUX_PANE}};const GI=e=>`${e.sessionId}|${e.projectDir}|${e.cwd}`;var KI=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=GI(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t.projectDir),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e.projectDir);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=GI(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};const qI=c.join(`lib`,`ceiling_config.py`),JI=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function YI(e,t){let n=typeof e==`object`&&e?e.plugins:void 0;if(typeof n!=`object`||!n)throw Error(`${t} has no "plugins" object`);return Object.entries(n).filter(([e])=>e.split(`@`)[0]===`memento`).flatMap(([e,n])=>{if(!Array.isArray(n))throw Error(`${t}: "${e}" is not a list of installs`);return n.map(n=>{let{scope:r,installPath:i,projectPath:a}=n??{};if(typeof r!=`string`||typeof i!=`string`)throw Error(`${t}: an install of "${e}" has no scope/path`);return typeof a==`string`?{key:e,scope:r,installPath:i,projectPath:a}:{key:e,scope:r,installPath:i}})})}function XI(e,t){let n=!0;for(let i of e){if(!r.existsSync(i))continue;let e;try{e=JSON.parse(r.readFileSync(i,`utf8`))?.enabledPlugins?.[t]}catch(e){return X(`memento lookup: ${i}: ${e.message}`)}typeof e==`boolean`&&(n=e)}return J(n)}function ZI(e,t){if(!r.existsSync(e))return Y;let n;try{n=YI(JSON.parse(r.readFileSync(e,`utf8`)),e)}catch(e){return X(`memento lookup: ${e.message}`)}let i=n.find(e=>e.projectPath===t)??n.find(e=>e.scope===`user`);if(i===void 0)return Y;let a=XI([c.join(c.dirname(c.dirname(e)),`settings.json`),c.join(t,`.claude`,`settings.json`),c.join(t,`.claude`,`settings.local.json`)],i.key);if(a.kind!==`ok`)return a;if(!a.value)return Y;let o=[qI,JI].filter(e=>!r.existsSync(c.join(i.installPath,e)));return o.length===0?J(i.installPath):X(`memento at ${i.installPath} has no ${o.join(` or `)} โ upgrade the plugin`)}function QI(e){let{CLAUDE_PROJECT_DIR:t,CLAUDE_CODE_SESSION_ID:n,...r}=process.env;return{...r,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function $I(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function eL(e){let t;try{t=JSON.parse(e)}catch{return X(`memento read: not JSON: ${e.trim()}`)}let{ceiling:n,session:r}=t??{},i=n===`off`||typeof n==`number`&&n>=0?n:void 0;return i!==void 0&&(r===null||typeof r==`string`)?J({ceiling:i,session:r}):X(`memento read: unexpected answer: ${e.trim()}`)}async function tL(e,t){let n=await De({bin:`python3`,args:[`-c`,`
|
|
190
190
|
import json, math, sys
|
|
191
191
|
sys.path.insert(0, sys.argv[1])
|
|
192
192
|
from ceiling_config import CONFIG_NAME, anchored, ceiling_in, in_force, session_directory
|
|
@@ -195,26 +195,26 @@ ceiling = in_force(directory, anchored(sys.argv[3]))
|
|
|
195
195
|
layer = ceiling_in(directory / CONFIG_NAME)
|
|
196
196
|
print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
|
|
197
197
|
"session": layer.text if layer else None}))
|
|
198
|
-
`,c.join(e,`lib`),t.sessionId,t.cwd],env:
|
|
199
|
-
`),te=
|
|
200
|
-
`)),w=
|
|
201
|
-
`})}catch(e){throw
|
|
202
|
-
`);return}t.stdout.write(
|
|
198
|
+
`,c.join(e,`lib`),t.sessionId,t.cwd],env:QI(t),timeoutMs:3e3,category:`memento.read`});return n.ok?eL(n.stdout):X($I(n))}function nL(e,t,n){let r=Oe({bin:c.join(e,JI),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:QI(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error($I(r))}function rL(){let e=oD(iD(rD(process.env,process.cwd())));return{locate:t=>ZI(e,t),read:tL,move:nL}}var iL=class{written=new Map;constructor(e){this.dir=e}pathFor(e){return c.join(this.dir,`${encodeURIComponent(e)}.txt`)}sync(e,t){let n=this.pathFor(e);if(t===(this.written.get(e)??null))return null;try{return t===null?(r.rmSync(n,{force:!0}),this.written.delete(e)):(r.mkdirSync(this.dir,{recursive:!0,mode:448}),r.writeFileSync(n,t,{mode:384}),this.written.set(e,t)),null}catch(e){return`${n}: ${e.message}`}}reset(){this.written.clear();try{return r.rmSync(this.dir,{recursive:!0,force:!0}),null}catch(e){return`${this.dir}: ${e.message}`}}};const aL=new LN;Te(aL.launchStats);const oL=new Gy({counters:aL,logger:Q}),sL=new $y({watchers:oL,logger:Q}),cL=new Gj,lL=new VN,uL=new zP(lL,Q),dL=new ZP,fL=new iL(Ke()),pL=new jI,mL=new II,hL=new VI,gL=new WI,_L=new KI(rL()),vL=new FN({gitService:sL,sessionState:lL,watchers:oL},{observers:{onReload:e=>Q(`info`,`config loaded projectDir=${e.projectDir} cwd=${e.cwd} file=${e.configFilePath??`<bundled default>`} error=${e.lastError===null?`none`:JSON.stringify(e.lastError)} warning=${e.lastWarning===null?`none`:JSON.stringify(e.lastWarning)}`)}}),yL=60*1e3;function bL(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(ie(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Q(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),IL(0);return}}catch(e){Q(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,yL),a.unref())},checkNow:o}}const xL=bL(),SL=gj({entryUrl:import.meta.url,intervalMs:yL,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>xL.checkNow(),log:Q});let CL=null,wL=null,TL=0;function EL(){t.on(`uncaughtException`,e=>{Q(`error`,`uncaughtException: ${e.stack||e.message}`),IL(1)}),t.on(`unhandledRejection`,e=>{Q(`error`,`unhandledRejection: ${String(e)}`),IL(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Q(`info`,`received ${e}, shutting down`),IL(0)});try{TL=ZT(t.env)}catch(e){Q(`error`,`refusing to boot: ${e.message}`),IL(1);return}CL=$D(t.pid);let e=lO(dO(CL));if(!e.decision.allow){Q(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),IL(1);return}wL=e.registryPath,r.mkdirSync(Pe(),{recursive:!0}),Le(Fe()),lL.useStorage(new WN(Be(),500,Q)),uL.useStorage(YP(Ve(),Q)),nO({anchor:tO(t.env),isAlive:rO,onOrphaned:e=>{Q(`info`,`parent watchdog: ${e}; shutting down`),IL(0)}}),DL(y.createServer({allowHalfOpen:!1},e=>{LL(e)}),Fe(),!1)}function DL(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Q(`error`,`server error: ${i.message}`),IL(1);return}if(r){Q(`info`,`lost rebind race; another daemon is alive โ exiting`),t.exit(0);return}OL(e,n)}),e.listen(n,()=>kL(n))}function OL(e,n){let i=UD(WD(Re(n)),(e,t)=>QD(e,t,{readStartTime:ZD,pidAlive:rO}));if(i.kind===`attach-and-exit`){Q(`info`,`EADDRINUSE: ${i.reason} โ exiting`),t.exit(0);return}Q(`warn`,`EADDRINUSE: ${i.reason} โ unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Q(`error`,`cannot unlink stale socket ${n}: ${e.message}`),IL(1);return}}DL(e,n,!0)}function kL(e){let n=qD(e);if(n.kind!==`present`){Q(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),IL(0);return}NL(e);try{r.chmodSync(e,384)}catch(e){Q(`warn`,`chmod socket failed: ${e.message}`)}Q(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(ne.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(TL/1048576)}MB`),mE();let i=fL.reset();i!==null&&Q(`warn`,`diagnostic dump wipe failed: ${i}`),xL.arm(),SL.arm(),ML(),AL(e,n.identity)}function AL(e,n){XD({bound:n,myPid:t.pid,readIdentity:()=>qD(e),readLease:()=>WD(Re(e)),shutdown:e=>IL(e),log:Q}).arm()}let jL=null;function ML(){jL=tE(aE(aL.startedAt.getTime(),e=>IL(e),{rssLimitBytes:TL})),jL.arm()}function NL(e){let n=GD(Re(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:CL});n!==null&&Q(`warn`,`lease write failed: ${n}`)}let PL=0,FL=!1;function IL(e){if(!FL){FL=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{sL.close()}catch(e){Q(`warn`,`gitService close failed: ${e.message}`)}try{cL.close()}catch(e){Q(`warn`,`usageStore close failed: ${e.message}`)}try{oL.closeAll()}catch(e){Q(`warn`,`watcherRegistry close failed: ${e.message}`)}try{lL.flush()}catch(e){Q(`warn`,`sessionState flush failed: ${e.message}`)}KD(ze(),t.pid),wL!==null&&uO(wL,t.pid,sO,e=>r.unlinkSync(e)),t.exit(e)}}function LL(e){PL++,aL.inFlight=PL;let t=!1,n=(n,r)=>{if(t){r!==null&&Q(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>IL(r);try{e.end(wT(n),i)}catch(e){Q(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{aL.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=TT(e=>{zL(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Q(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Q(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Q(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),PL=Math.max(0,PL-1),aL.inFlight=PL})}const RL=e=>({resp:e,exitAfterFlush:null});async function zL(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return RL({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Q(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded โ exiting after the response flushes`):Q(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale โ staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return RL({ok:!0,stats:aL.snapshot({gitCache:sL.getStats(),usageCache:cL.getStats(),renderCacheSize:vL.size,watchersActive:oL.size(),nextRestartReason:jL?.describeNextRestart()??null})});if(e.kind===`render`){aL.requestsTotal++;let t=Date.now();try{let{report:n}=mI(e.hookData);for(let e of n.unknownTopLevelFields)Q(`info`,`schema: unknown field '${e}' โ Anthropic may have added it`);let r=[];for(let e of n.missingRequired)r.push(`missing required field '${e}'`);for(let{path:e,expected:t,got:i}of n.typeMismatches)r.push(`field '${e}' expected ${t}, got ${i}`);if(e.cwd===``&&r.push(`request 'cwd' is empty`),r.length>0)return aL.requestsErrored++,Q(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),RL({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=BL(e.args),s=e.hookData.session_id,c=gT(e),l=JSON.stringify(c);lL.get(s,`client-hints`)!==l&&lL.set(s,$F,l);let u=lL.get(s,`config-override`)??a??c.configEnv,d=vL.getOrCreate(i,e.cwd,u),f=NF({projectDir:i,cwd:e.cwd,configFile:u??null});lL.get(s,`render-origin`)!==f&&lL.set(s,MF,f);let p=c.termCols,m=AI(p??120),h=OO(c.termRows),{authoredRoots:g}=d.state,_=t=>lL.get(e.hookData.session_id,t),v=Kk(d.state.config,_,e=>g.has(e)),y=await lA(e.hookData,GL,e.cwd,d.state.neededInputPaths(v.preset),v,c,FA(d.state.config,d.state.fileHeldSettings,_)),b=[],x=qk(v,m),S=xN(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},Jk(v)),C=lL.get(e.hookData.session_id,`click.error`);C&&lL.clear(e.hookData.session_id,`click.error`);let ee=[o,d.lastError,C].filter(Boolean).join(`
|
|
199
|
+
`),te=SL.notice({sessionId:s,dismissed:lL.get(s,tj),enabled:v.updateNotice}),ne=d.lastError===null?null:d.configFilePath,re=NO(ee,te,[d.lastWarning??``,...b].filter(Boolean).join(`
|
|
200
|
+
`)),w=fL.sync(s,re===null?null:FO(re));w!==null&&Q(`warn`,`diagnostic dump failed: ${w}`);let ie=IO(S,re,{fullText:w===null?{kind:`file`,path:fL.pathFor(s)}:{kind:`unavailable`,reason:w},failedConfigFile:ne},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),T=Date.now()-t,E=sL.getStats(),ae=cL.getStats();return Q(`info`,`render sid=${e.hookData.session_id??`?`} took=${T}ms termCols=${p??`?`} termRows=${c.termRows??`?`} width=${m} git=${E.size}/${E.hits}h/${E.misses}m usage=${ae.size}/${ae.hits}h/${ae.misses}m err=${ee?`Y`:`N`} upd=${te.length} warn=${d.lastWarning?`Y`:`N`}`),RL({ok:!0,output:ie+`
|
|
201
|
+
`})}catch(e){throw aL.requestsErrored++,e}}if(e.kind===`click`)return RL(await KL(e.verb,e.value));if(e.kind===`debug`){if(!kI(e.what))return RL({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${OI.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=vL.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?WL(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):UL};return RL({ok:!0,debug:_I(e.what,n)})}return RL({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function BL(e){let{values:t,tokens:n}=_({args:e.slice(1),options:{config:{type:`string`}},strict:!1,tokens:!0,allowPositionals:!0}),r=[...new Set((n??[]).filter(e=>e.kind===`option`&&e.name!==`config`).map(e=>`--${e.name}`))];return{configFile:vT(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const VL={sessionState:lL,dlog:Q,applyUpdate:()=>SL.act(),doctor:eF(),memento:_L,claudeInput:hF(),history:uL,navigation:dL,configFor:e=>vL.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>vL.reload(e.projectDir,e.cwd,e.configFile??void 0)},HL={endcaps:`powerline`,colorCompatibility:ho,wrap:!0,padding:1,charset:uo,width:1/0},UL=new Map;function WL(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,DO(a,{...HL,charset:t,colorCompatibility:n}));return r}const GL={gitProvider:sL,usageStore:cL,contextProvider:pL,metricsProvider:mL,activityProvider:hL,tmuxService:gL,mementoProvider:_L,autoCompact:bk,log:Q,clock:()=>new Date,history:e=>uL.depth(e),navigation:e=>dL.depth(e,lL)};function KL(e,t){let n=dI.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,VL),{ok:!0,output:``}}catch(e){let t=e instanceof $?`BAD_REQUEST`:`RENDER_FAILED`;return{ok:!1,error:String(e instanceof Error?e.message:e),code:t,daemonV:3}}}const qL={connectMs:200,budgetMs:500};async function JL(e){let n=e.includes(`--json`),r=await YL();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${NT(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
|
|
202
|
+
`);return}t.stdout.write($L(r.value))}function YL(){return DT({kind:`stats`},qL,e=>`stats`in e?e.stats:void 0)}function XL(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function ZL(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function QL(e){return e<60?`${e}s`:e<3600?`${Math.floor(e/60)}m${e%60}s`:`${Math.floor(e/3600)}h${Math.floor(e%3600/60)}m`}function $L(e){let t=[];t.push(`cc-candybar daemon stats`),t.push(``),t.push(`process`),t.push(` pid ${e.pid}`),t.push(` version ${e.version}`),t.push(` protocol ${e.protocolVersion}`),t.push(` startedAt ${e.startedAt}`),t.push(` uptime ${QL(e.uptimeSec)}`),t.push(` rss ${XL(e.rssBytes)}`),t.push(` heapUsed ${XL(e.heapUsedBytes)}`),t.push(` heapTotal ${XL(e.heapTotalBytes)}`),t.push(` external ${XL(e.externalBytes)}`),t.push(` arrayBuffers ${XL(e.arrayBuffersBytes)}`),t.push(``),t.push(`requests`),t.push(` total ${e.requests.total}`),t.push(` errored ${e.requests.errored}`),t.push(` timedOut ${e.requests.timedOut}`),t.push(` inFlight ${e.requests.inFlight}`),t.push(``),t.push(`gitCache`),t.push(` size ${e.gitCache.size}`),t.push(` hit rate ${ZL(e.gitCache.hits,e.gitCache.misses)} (${e.gitCache.hits} / ${e.gitCache.hits+e.gitCache.misses})`),t.push(` invalidations ${e.gitCache.invalidations}`),t.push(``),t.push(`usageCache`),t.push(` size ${e.usageCache.size}`),t.push(` hit rate ${ZL(e.usageCache.hits,e.usageCache.misses)} (${e.usageCache.hits} / ${e.usageCache.hits+e.usageCache.misses})`),t.push(` sweeps ${e.usageCache.sweeps}`),t.push(``),t.push(`renderCache`),t.push(` size ${e.renderCache.size}`),t.push(`watchers`),t.push(` active ${e.watchers.active}`),t.push(` opened ${e.watchers.opened}`),t.push(` closed ${e.watchers.closed}`),t.push(` evicted ${e.watchers.evicted}`),t.push(``),t.push(`subprocesses`),t.push(` total ${e.subprocesses.total}`),t.push(` inFlight ${e.subprocesses.inFlight}`),t.push(` lastMinute ${e.subprocesses.lastMinute}`);let n=Object.entries(e.subprocesses.byCategory),r=n.reduce((e,[t])=>Math.max(e,t.length),13);for(let[i,a]of n){let n=e.subprocesses.p50DurationMs[i],o=e.subprocesses.p99DurationMs[i],s=n!==void 0&&o!==void 0?` (p50 ${n}ms ยท p99 ${o}ms)`:``;t.push(` ${i.padEnd(r)} ${a}${s}`)}return e.nextRestartReason&&(t.push(``),t.push(`nextRestart ${e.nextRestartReason}`)),t.join(`
|
|
203
203
|
`)+`
|
|
204
|
-
`}const
|
|
205
|
-
`);return}t.stdout.write(
|
|
206
|
-
`;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`โ`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${
|
|
204
|
+
`}const eR={connectMs:200,budgetMs:500};async function tR(e,n){let r=n.includes(`--json`),i=await nR(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${NT(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
|
|
205
|
+
`);return}t.stdout.write(rR(i.value))}function nR(e){return DT({kind:`debug`,what:e},eR,e=>`debug`in e?e.debug:void 0)}function rR(e){switch(e.what){case`vars`:return iR(e.vars);case`segments`:return aR(e.segments);case`config`:return oR(e.config);default:return e}}function iR(e){if(e.length===0)return`no variables (DSL not active)
|
|
206
|
+
`;let t=[`variables (${e.length})`,``],n=e.reduce((e,t)=>Math.max(e,t.name.length),4),r=e.reduce((e,t)=>Math.max(e,(t.source??`โ`).length),6),i=e.reduce((e,t)=>Math.max(e,t.type.length),4);for(let a of e){let e=a.ageMs===null?``:` ${cR(a.ageMs)}`,o=a.lastError?` โ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`โ`).padEnd(r)} ${a.type.padEnd(i)} ${sR(a.value)}${e}${o}`)}return t.join(`
|
|
207
207
|
`)+`
|
|
208
|
-
`}function
|
|
208
|
+
`}function aR(e){if(e.length===0)return`no segments (DSL not active)
|
|
209
209
|
`;let t=[`segments (${e.length})`,``];for(let n of e){t.push(` ${n.name}`),n.description!==null&&t.push(` shows ${n.description}`),t.push(` template ${n.template}`),n.referencedVars.length>0&&t.push(` vars ${n.referencedVars.join(`, `)}`);for(let{id:e,lastRender:r}of n.placements)r!==null&&t.push(` last ${e}: ${r}`)}return t.join(`
|
|
210
210
|
`)+`
|
|
211
|
-
`}function
|
|
211
|
+
`}function oR(e){return e===null?`config: DSL not active
|
|
212
212
|
`:JSON.stringify(e,null,2)+`
|
|
213
|
-
`}function
|
|
214
|
-
`));return n.rendered}finally{r.registry.dispose()}}function
|
|
215
|
-
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) โ kicking daemon`};case`permanent`:return{output:
|
|
213
|
+
`}function sR(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`โฆ`:t}function cR(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function lR(){let e=dR();return e===null?null:r.readFileSync(e,`utf-8`)}function uR(){let e;try{e=lR()}catch(e){t.stderr.write(`schema: cannot read bundled schema: ${e instanceof Error?e.message:String(e)}\n`),t.exit(2)}e===null&&(t.stderr.write("schema: bundled schema not found (expected schema/cc-candybar.schema.json). Run `pnpm gen:schema` from a source checkout.\n"),t.exit(2)),t.stdout.write(e),t.exit(0)}function dR(){let e=c.join(`schema`,`cc-candybar.schema.json`),n=t.argv[1];if(n===void 0)return null;let i=c.dirname(c.resolve(n));for(;;){let t=c.join(i,e);if(r.existsSync(t))return t;let n=c.dirname(i);if(n===i)return null;i=n}}function fR(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const pR=5e3;function mR(e){let t=`/home/tester`,n=Math.floor(Date.now()/1e3);return{hook_event_name:`Status`,session_id:`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,version:`1.15.0`,home:t,cwd:`${t}/code/cc-candybar/src`,transcript_path:`${t}/.claude/projects/x/test.jsonl`,model:{id:`claude-opus-4-8`,display_name:`Opus 4.8`},workspace:{current_dir:`${t}/code/cc-candybar/src`,project_dir:`${t}/code/cc-candybar`},git:{repoName:`cc-candybar`,repoUrl:`https://github.com/promptctl/cc-candybar`,branch:`main`,sha:`abc1234`,ahead:2,behind:1,staged:3,unstaged:2,untracked:1,conflicts:0,upstream:`origin/main`,stash:1,status:`dirty`,operation:`rebase`,timeSinceCommit:780},session:{cost:.39,tokens:241400},today:{cost:12.5,tokens:34e5},context:{totalTokens:48487,contextLeft:24},metrics:{lastResponseTime:8.2,responseTime:4.2,sessionDuration:930,messageCount:8,linesAdded:512,linesRemoved:88},block:{nativeUtilization:63,resetsAt:n+2*3600},weekly:{percentage:21,resetsAt:n+5*86400},cache:{expiresAt:n+900},tmux:{session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:xk(4e5,1e6),...Yk(e),history:{undo:1,redo:1},navigation:{back:1},unsaved:1,resettable:1}}function hR(e,t){let n=tT(e,e),r=rT(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function gR(e,n=t.cwd()){let i=[],a=e===void 0?hR(n,i):c.resolve(Qw(e));if(e!==void 0&&a!==null){let e;try{e=r.statSync(a,{throwIfNoEntry:!1})}catch(e){return{kind:`unreadable`,path:a,message:e instanceof Error?e.message:String(e)}}if(e!==void 0&&!e.isFile())return{kind:`unreadable`,path:a,message:`not a file`}}let o=aT(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await yR(a,n,i)}}catch(e){let t=e;return a!==null&&typeof t==`object`&&t&&typeof t.code==`string`&&t.path===a&&typeof t.message==`string`?{kind:`unreadable`,path:a,message:t.message}:(e instanceof xs&&i.push(...e.warnings),{kind:`fatal`,configPath:a,message:e instanceof xs||e instanceof Error?e.message:String(e),warnings:i})}}async function _R(e,t,n){let r=oT(e,Ak);n.push(...r.warnings);let i=lT(r,e??`<default>`),a=new kN,o=new Sb(a,i.globals.default_empty_value??``,void 0,new VN);try{let e=gN(i,o,{cwd:t});n.push(...e.loadWarnings);let r=await o.settled(pR);return r.length>0&&n.push(`source${r.length===1?``:`s`} still running after ${pR} ms, rendered with fallback values: ${r.join(`, `)}`),{config:i,compiled:e,store:a,registry:o}}catch(e){throw o.dispose(),e}}function vR({config:e,compiled:t,store:n,registry:r},i,a){let o=new Map;return{rendered:xN(e,t,n,r,mR(i),qk(i,a),{onSegmentError:(e,t)=>o.set(`segment "${e}"`,t),onRenderWarning:e=>o.set(`theme rule`,e)},Jk(i)),failures:o}}async function yR(e,t,n){let r=await _R(e,t,n),{config:i}=r;try{ej(i);let e=Kk(i,()=>null,()=>!1),t=e=>vR(r,e,200),n=t(e),a=t({...e,presetCustomized:!0}),o=[...[...n.failures].map(([e,t])=>`${e}: ${t}`),...[...a.failures].filter(([e])=>!n.failures.has(e)).map(([e,t])=>`${e}: ${t} (under .preset.customized = true)`)];if(o.length>0)throw Error(`config renders with ${o.length} render error${o.length===1?``:`s`} (the daemon would show them on the bar):\n`+o.map(e=>` ${e}`).join(`
|
|
214
|
+
`));return n.rendered}finally{r.registry.dispose()}}function bR(e){return e.map(e=>`warning: ${e}\n`).join(``)}function xR(e,t=!1){switch(e.kind){case`clean`:return{stdout:`โ ${e.configPath??`bundled default (no config file found)`}: config OK${e.warnings.length>0?` (${e.warnings.length} warning${e.warnings.length===1?``:`s`})`:``}\n`+(t?`${e.rendered}\n`:``),stderr:bR(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:bR(e.warnings)+`โ ${e.configPath??`<default>`}\n${e.message}\n`,code:1};case`unreadable`:return{stdout:``,stderr:`check: cannot read ${e.path}: ${e.message}\n`,code:2}}}const SR=`--render`,CR=`Usage: cc-candybar check [${SR}] [config-file]\n`;function wR(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==SR);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${CR}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${CR}`}:{kind:`run`,target:n[0],render:t.includes(SR)}}async function TR(e){let n=wR(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:xR(await gR(n.target??fR(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const ER=`${gO}${hO}`;function DR(e){return`${ER}โ cc-candybar: ${OR(e)}[0m\n`}function OR(e){switch(e.cause){case`version_mismatch`:{let t=e.daemonV===0?`unknown`:`v${e.daemonV}`;return`protocol mismatch (client v${e.clientV} โ daemon ${t})`}case`bad_request`:return`daemon rejected request: ${mO(e.message,60)}`;case`render_failed`:return`render failed: ${mO(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${mO(e.message,60)}`}}function kR(e){switch(e.kind){case`ok`:return{output:e.value,kick:!1,debug:null};case`transient`:return{output:`
|
|
215
|
+
`,kick:!0,debug:`daemon unavailable (transient: ${e.cause}: ${e.message}) โ kicking daemon`};case`permanent`:return{output:DR(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) โ not kicking`}}}function AR(e,t){if(e!==void 0&&/^\+?\d+$/.test(e)){let t=Number(e);if(t>0&&t<=4294967295)return t}if(t&&t>0)return t}const jR=` (fix: click the settings menu (${Gc} by default) โบ ๐งฐ tools โบ ๐ฉบ doctor, then [fix] on the bar)`;function MR({check:e,verdict:t}){return t.ok?`โ ${e.label}\n`:`โ ${e.label} โ ${t.reason}${t.fix===void 0?``:jR}\n`}function NR(e,t,n){let r;try{r=rF(e,{tmux:Wx(t),claudeConfigDir:rD(t,n)})}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let i=qx(r);return{stdout:i.map(MR).join(``),stderr:``,code:+!i.every(e=>e.verdict.ok)}}function PR(e){e.length>0&&(t.stderr.write(`doctor: takes no arguments
|
|
216
216
|
Usage: cc-candybar doctor
|
|
217
|
-
`),t.exit(2));let n=
|
|
217
|
+
`),t.exit(2));let n=NR(eF(),t.env,t.cwd());t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}function FR(){return AR(t.env.COLUMNS,t.stderr.columns)}function IR(){return AR(t.env.LINES,t.stderr.rows)}const LR=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`],RR=e=>e.some(e=>t.argv.includes(e));function zR(){return LR.some(e=>(t.env[e]??``)!==``)}function BR(){console.log(mx)}async function VR(){try{RR(fx.help)&&(BR(),t.exit(0)),RR(fx.version)&&(console.log(`cc-candybar ${nD}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await VD(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(ID(),t.exit(0)),e===`url-handle`){await RD(t.argv[3]);return}if(e===`daemon`){EL();return}if(e===`daemon-stats`&&(await JL(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await TR(t.argv.slice(3));return}if(e===`schema`){uR();return}if(e===`doctor`){PR(t.argv.slice(3));return}kI(e)&&(await tR(e,t.argv.slice(3)),t.exit(0)),t.stdin.isTTY===!0&&(console.error(`Error: This tool requires input from Claude Code
|
|
218
218
|
|
|
219
219
|
cc-candybar is designed to be used as a Claude Code statusLine command.
|
|
220
220
|
It reads hook data from stdin and outputs formatted statusline.
|
|
@@ -230,4 +230,4 @@ Add to ~/.claude/settings.json:
|
|
|
230
230
|
Run with --help for more options.
|
|
231
231
|
|
|
232
232
|
To test output manually:
|
|
233
|
-
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar --style=powerline`),t.exit(1)),O(`Working directory: ${t.cwd()}`),O(`Process args:`,t.argv);let r=await n(t.stdin);O(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),
|
|
233
|
+
echo '{"session_id":"test-session","workspace":{"project_dir":"/path/to/project"},"model":{"id":"claude-sonnet-4-5","display_name":"Claude"}}' | cc-candybar --style=powerline`),t.exit(1)),O(`Working directory: ${t.cwd()}`),O(`Process args:`,t.argv);let r=await n(t.stdin);O(`Received hook data:`,JSON.stringify(r,null,2)),r||(console.error(`Error: No input data received from stdin`),BR(),t.exit(1));let i=kR(await LT(r,t.argv,t.cwd(),{termCols:FR(),termRows:IR(),ssh:zR(),tmux:Wx(t.env),configEnv:fR(t.env),claudeConfigDir:rD(t.env,t.cwd())}));i.debug!==null&&O(i.debug),i.kick&&oE(),t.stdout.write(i.output),t.exit(0)}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`Error generating statusline:`,n),t.exit(1)}}VR();export{};
|