@promptctl/cc-candybar 1.113.1 โ 1.113.2
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 +37 -37
- 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 ky(e,t){if(e.kind!==`ok`)return e;let n=t(e.value);return n===null?Y:J(n)}function Ay(e){if(e.kind!==`ok`)return e;let t=e.value.trim();return t?J(t):Y}const jy=/^[A-Za-z]:[\\/]/;function My(e){let t=e.trim();if(jy.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 Ny(e){return My(e)?.host||null}function Py(e){let t=Ny(e);return t?t===`github.com`||t.endsWith(`.github.com`)?`github`:/(^|\.)gitlab\./.test(t)?`gitlab`:null:null}function Fy(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 Iy(e){return e.urls.find(e=>Vy(e)!==null)??e.urls[0]??null}function Ly(e){return e.find(e=>e.name===`origin`)??e[0]??null}function Ry(e){let t=Ly(e);return t?Iy(t):null}function zy(e){let t=Ly(e);return t?t.urls.find(e=>Py(e)!==null)??Iy(t):null}function By(e){let t=(My(e)?.path??e.replace(/[\\/]+$/,``)).split(`/`);return(t[t.length-1]??``).replace(/\.git$/,``)||null}function Vy(e){let t=My(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 Hy(e){let t=Ry(e);return t===null?null:Vy(t)}function Uy(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??Oy(t.stderr)].filter(Boolean).join(`, `)}`)}function Wy(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Gy(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 Ky(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(!Wy(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 qy(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(!Wy(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 Jy(e){try{let t=r.statSync(e);return{key:`${t.dev}:${t.ino}`,stamp:`${t.mtimeMs}:${t.size}`}}catch{return null}}var Yy=class{isGitRepo(e){try{return r.existsSync(c.join(e,`.git`))}catch{return!1}}async execGitAsync(e,t){return Oe({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=ky(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=ky(s,e=>this.repoNameFrom(e,r)),o.isWorktree=i),s!==void 0&&t.showRepoUrl&&(o.repoUrl=ky(s,Hy)),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 Ay(Dy(`git describe --tags`,await this.execGitAsync([`describe`,`--tags`,`--abbrev=0`],{cwd:e,timeout:2e3}),`absent`))}async timeSinceCommit(e,t){return t.kind===`ok`?ky(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=Ay(Dy(`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=Jy(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=Dy(`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`?Fy(t.value):[])}repoNameFrom(e,t){let n=Ry(e);return(n===null?null:By(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=zy(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return Oe({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=Py(t);return n===`github`?Uy(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,Ky):n===`gitlab`?Uy(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,qy):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=Dy(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(Gy(t.value)):t}};const Xy=(e,t)=>O(t);var Zy=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??Xy}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()}},Qy=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 $y=(e,t)=>O(t),eb={showSha:!0,showStashCount:!0};function tb(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function nb(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function rb(e,t){return e.head!==t.head||e.index!==t.index}function ib(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 ab=class extends Yy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new Qy;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new Yy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??$y,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new Zy({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}|${tb(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=nb(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}`,ib(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}`,ib(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,{...eb});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,{...eb}),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=nb(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),rb(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 ob=/\r\n|\r|\n/g,sb=e=>J(e.replace(ob,` `).trim());function cb(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(ob,` `))}}const lb=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function ub(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 db(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 fb=`session.id`;function pb(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await Oe({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 mb(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await S(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 hb(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 gb=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],_b=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],vb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],yb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function bb(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>gb[e.getMonth()]],[`Monday`,e=>vb[e.getDay()]],[`Jan`,e=>_b[e.getMonth()]],[`Mon`,e=>yb[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 xb={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function Sb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=xb[t];try{return Eb(r,e)}catch{return Db(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return Ey(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return Ey(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return Ey(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return Ey(e.stashCount,0)}}var Cb=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}},wb=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:ee(()=>{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&&(T(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())T(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function Tb(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function Eb(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`?Av(e):t===`number`?jv(e):Mv(e)}function Db(e){return e===`number`?0:e===`boolean`?!1:``}var Ob=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new Cb;ttlMgr=new wb;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new Qy;abort=new AbortController;drawn=Dv.observable.box(F.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=xy(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 ab({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,kv(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,pb(t,n.cwd,this.abort.signal),ub(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,mb(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,sb,t.default,n);case`regex`:return this.scalarPublisher(e,cb(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=hb(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,Ey(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=hb(i,lb,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=Sy(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 bb(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,bb(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=xb[t.field],r=t.varDefault===void 0?Db(n):Eb(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,Sb(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(fb);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=Tb(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,Eb(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,Dv.reaction)(()=>{let t=Sy(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,Dv.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,Eb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,Db(t))}}defaultFor(e){try{return Eb(this.defaultEmptyValue,e)}catch{return Db(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 kb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[fb]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},resume_command:{kind:`input`,path:`resumeCommand`,default:``},config_path:{kind:`input`,path:`configPath`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"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},"tmux.pane":{kind:`input`,path:`tmux.pane`,default:``},"autocompact.window":{kind:`input`,path:`autocompact.window`,type:`number`,default:-1},...Object.fromEntries([`applied`,`lower`,`higher`].map(e=>[`autocompact.${e}`,{kind:`input`,path:`autocompact.${e}`,type:`number`,default:0}])),"autocompact.error":{kind:`input`,path:`autocompact.error`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},Ab=`ne .tmux.pane ""`,jb={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:`๐ผ`},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`}},Mb=Object.values(jb),Nb=[{configKey:`charset`,effectiveVar:`charset.effective`},{configKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`}],Pb=new Set(Nb.map(e=>e.configKey)),Fb=new Map([...Mb,...Nb].map(e=>[e.configKey,e.effectiveVar])),Ib=new Map(Mb.map(e=>[e.sessionKey,e.effectiveVar]));function Lb(e){return Object.fromEntries(Object.keys(jb).map(t=>[t,e(t)]))}const Rb=new Map(Object.keys(jb).map(e=>[jb[e].sessionKey,e]));function zb(e,t,n){let r=new Set,i=e=>{for(let t of _v(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(fb);for(let t of Object.values(e.actions)){r.add(fb),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?Ib.get(t.set):void 0,n=`persist`in t?Fb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Bb(e,t,n){let r=Cv({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of zb(e,t,n.helpers)){if(Sv(a,r))continue;let e=kb[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 Vb=new Map,Hb=new Map;function Ub(e){let t=Gb(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 Wb(e,t){return e===`bar`?t:Ub(e)}function Gb(e){let t=Vb.get(e);if(t!==void 0)return t;let n=Tr(e);return n===null?null:(Vb.set(e,n),n)}function Kb(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Hb.get(n);if(r!==void 0)return r;let i=Nr(e,t);return Hb.set(n,i),i}function qb(e){let t=Gb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Jb(e,t,n){let r=qb(e);return r===null?(n(`${t} rendered "${Xa}": "${e}" names no installed theme${Ya(e)}`),Xb()):r}function Yb(e,t,n){return ao(e,t,n,Xb(),qb)}function Xb(){return qb(Xa)}function Zb(e){return oo(Yb(void 0,null,e),Xb).value}const Qb=new Map;function $b(e,t,n){Qb.set(e,{permanent:!0,resolve:t,paletteOf:n})}$b(`themes`,()=>Qa(),e=>Ub(e));const ex=`placementThemes`;$b(ex,$a,(e,t)=>Wb(e,t.palette)),$b(`endcaps`,()=>fo),$b(`variations`,()=>yo),$b(`charsets`,()=>ho),$b(`colorCompatibilities`,()=>_o);function tx(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Kb(n.basePalette,e.styles[t])}],[`presets`,{members:D_(e.presets)}]])}function nx(e){return[...new Set([...Qb.keys(),...e.keys()])]}function rx(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=Qb.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${nx(t).join(`, `)})`)}function ix(e){return{label:e.label,domain:ax(e.domain)}}function ax(e){return e===`theme`?{from:ex}:e===`bool`||`min`in e?e:{from:e}}function ox(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 sx=/^segments\.([^.]+)\.palette$/,cx=/^presets\.(.+)\.root$/,lx=/^presets\.(.+)\.globals\.([^.]+)$/;function ux(e){return`presets.${e}.root`}function dx(e,t){return`presets.${e}.globals.${t}`}function fx(e){if(kl(e))return{scope:`globals`,field:e};let t=sx.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=lx.exec(e);if(n&&Sl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=cx.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function px(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 mx=`open`;function hx(e,t,n,r){let i={variable:e,key:e,member:mx};return r.variables[e]=tl(e,Wc),r.actions[e]=nl(e,mx),r.segments[e]={template:Qc(e,`(?)`,`โ`),...gx(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 gx(e){let[t,...n]=e;return t===void 0?{}:{when:Xc(t,...n)}}const _x=`none`;var vx=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function yx(e,t,n,r,i){let{palette:a,tint:o}=e,s=bx(n,i),c=s!==_x,l=c?s===void 0?o:xx(a,s,`bg`):xx(a,`background`,`bg`);e.bg=l;let u=bx(r,i),d=u===void 0?c?Aa(a,l,t):void 0:xx(a,u,`fg`);return new B({...c&&{bgcolor:vn.fromRgba(l)},...d!==void 0&&{color:vn.fromRgba(d)}})}function bx(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function xx(e,t,n){try{return $n(e,t)}catch(e){throw e instanceof Xn?new vx(t,n,e.message):e}}const Sx={help:[`-h`,`--help`],version:[`-V`,`--version`]},Cx=[`โ inserts`,`โ removes`,`โ๏ธ configures`,`โบ resets layout`],wx=`
|
|
90
|
+
`).length:0)}async getRemotesAsync(e){let t=Jy(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=Dy(`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`?Fy(t.value):[])}repoNameFrom(e,t){let n=Ry(e);return(n===null?null:By(n))??c.basename(t)}async getRepoRemoteUrl(e){let t=await this.getRemotesAsync(e);if(t.kind!==`ok`)return t;let n=zy(t.value);return n===null?Y:J(n)}async execForgeAsync(e,t,n){return Oe({bin:e,args:[...t],cwd:n.cwd,env:{...process.env},timeoutMs:n.timeout,category:`forge`})}async resolvePullRequest(e,t){let n=Py(t);return n===`github`?Uy(`gh pr view`,await this.execForgeAsync(`gh`,[`pr`,`view`,`--json`,`number,state,url`],{cwd:e,timeout:5e3}),/no (open )?pull requests? found/i,Ky):n===`gitlab`?Uy(`glab mr view`,await this.execForgeAsync(`glab`,[`mr`,`view`,`--output`,`json`],{cwd:e,timeout:5e3}),/no (open )?merge requests? (found|available)/i,qy):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=Dy(`git status --porcelain=v2 --branch`,await this.execGitAsync([`status`,`--porcelain=v2`,`--branch`],{cwd:e,timeout:2e3}),`failed`);return t.kind===`ok`?J(Gy(t.value)):t}};let Xy=null;function Zy(e){if(Xy!==null)return Xy;r.mkdirSync(c.dirname(e),{recursive:!0});try{Xy=r.statSync(e).size}catch{Xy=0}return Xy}function Qy(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{}Xy=0}const $y=(e,t)=>O(t);function Z(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=Je(),t=Zy(e);r.appendFileSync(e,n),Xy=t+Buffer.byteLength(n,`utf8`),Xy>=5242880&&Qy(e)}catch(e){Xy=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}const eb=(e,t)=>O(t);var tb=class{slots=new Map;maxWatchers;counters;logger;closed=!1;constructor(e={}){this.maxWatchers=e.maxWatchers??128,this.counters=e.counters,this.logger=e.logger??eb}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()}},nb=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 rb={showSha:!0,showStashCount:!0};function ib(e){let t=Object.keys(e).sort(),n={};for(let r of t)n[r]=e[r];return JSON.stringify(n)}function ab(e){let t=t=>{try{return r.statSync(c.join(e,t)).mtimeMs}catch{return 0}};return{head:t(`HEAD`),index:t(`index`)}}function ob(e,t){return e.head!==t.head||e.index!==t.index}function sb(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 cb=class extends Yy{entries=new Map;subscribersByRepo=new Map;fetchInFlight=new Map;resolutions=new Map;prCache=new Map;prFetchInFlight=new Map;refreshes=new nb;hits=0;misses=0;invalidations=0;inner;ttlMs;maxEntries;watchers;ownsWatchers;logger;sanityTimer=null;constructor(e={}){super(),this.inner=e.inner??new Yy,this.ttlMs=e.ttlMs??3e4,this.maxEntries=e.maxEntries??64,this.logger=e.logger??$y,e.watchers?(this.watchers=e.watchers,this.ownsWatchers=!1):(this.watchers=new tb({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}|${ib(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=ab(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}`,sb(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}`,sb(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,{...rb});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,{...rb}),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=ab(this.inner.resolveGitDir(t.repoRoot)),e.set(t.repoRoot,n)),ob(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 lb=/\r\n|\r|\n/g,ub=e=>J(e.replace(lb,` `).trim());function db(e){return t=>{let n=e.exec(t)?.[1];return n===void 0?X(`regex no-match`):J(n.replace(lb,` `))}}const fb=e=>{try{return J(JSON.parse(e))}catch(e){return X(`JSON parse failed: ${e.message}`)}};function pb(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 mb(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 hb=`session.id`;function gb(e,t,n){return{where:`output of "${e}" in ${t}`,read:async()=>{let r=await Oe({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 _b(e,t,n){return{where:`"${e}"`,read:async()=>{try{let r=await S(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 vb(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 yb=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],bb=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],xb=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],Sb=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function Cb(e,t){let n=[[`2006`,e=>String(e.getFullYear())],[`January`,e=>yb[e.getMonth()]],[`Monday`,e=>xb[e.getDay()]],[`Jan`,e=>bb[e.getMonth()]],[`Mon`,e=>Sb[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 wb={branch:`string`,sha:`string`,dirty:`boolean`,ahead:`number`,behind:`number`,stash:`number`};function Tb(e,t,n,r){if(e===null){if(n!==void 0)return n;let e=wb[t];try{return kb(r,e)}catch{return Ab(e)}}switch(t){case`branch`:return e.branch===`detached`?``:e.branch;case`sha`:return Ey(e.sha,``);case`dirty`:return e.status!==`clean`;case`ahead`:return Ey(e.aheadBehind,{ahead:0,behind:0}).ahead;case`behind`:return Ey(e.aheadBehind,{ahead:0,behind:0}).behind;case`stash`:return Ey(e.stashCount,0)}}var Eb=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}},Db=class{buckets=new Map;subscribe(e,t){let n=this.buckets.get(e);if(!n){let t=new Set;n={timer:ee(()=>{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&&(T(n.timer),this.buckets.delete(e)))}dispose(){for(let{timer:e}of this.buckets.values())T(e);this.buckets.clear()}bucketCount(){return this.buckets.size}};function Ob(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n)return;n=n[e]}return n}function kb(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`?Av(e):t===`number`?jv(e):Mv(e)}function Ab(e){return e===`number`?0:e===`boolean`?!1:``}var jb=class{inputMetas=new Map;lastErrors=new Map;watchMgr=new Eb;ttlMgr=new Db;gitSubscriptions=new Map;cleanups=[];inFlight=new Map;reads=new nb;abort=new AbortController;drawn=Dv.observable.box(F.TRUECOLOR);drawnAt=()=>this.drawn.get();engine=xy(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 cb({sanityIntervalMs:0}),this.ownsGitProvider=!0),this.sessionState=r}get variableStore(){return this.store}declareLiteral(e,t){this.store.defineBox(e,kv(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,gb(t,n.cwd,this.abort.signal),pb(e,n.cache),n.parse)}declareFile(e,t,n){this.declareSource(e,_b(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,ub,t.default,n);case`regex`:return this.scalarPublisher(e,db(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=vb(n,t,r);this.noteOutcome(e,a),this.store.setBox(e,Ey(a,i))}}documentPublisher(e,t,n){let r=t===void 0?Y:J(t);return this.store.defineDocument(e,r),i=>{let a=vb(i,fb,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=Sy(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 Cb(t.format,e)}catch{return this.stringInitial(t.varDefault)}})(new Date));let r=this.ttlMgr.subscribe(n,()=>{try{this.store.setBox(e,Cb(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=wb[t.field],r=t.varDefault===void 0?Ab(n):kb(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,Tb(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(hb);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=Ob(e,n.path),i=this.store.getType(t);if(r!==void 0)try{this.store.setBox(t,kb(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,Dv.reaction)(()=>{let t=Sy(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,Dv.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,kb(this.defaultEmptyValue,t))}catch{this.store.setBox(e,Ab(t))}}defaultFor(e){try{return kb(this.defaultEmptyValue,e)}catch{return Ab(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 Mb={project_dir:{kind:`input`,path:`workspace.project_dir`,default:``},[hb]:{kind:`input`,path:`session_id`,default:``},transcript_path:{kind:`input`,path:`transcript_path`,default:``},resume_command:{kind:`input`,path:`resumeCommand`,default:``},config_path:{kind:`input`,path:`configPath`,default:``},"theme.effective":{kind:`input`,path:`theme.effective`,default:``},"style.effective":{kind:`input`,path:`style.effective`,default:``},"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},"tmux.pane":{kind:`input`,path:`tmux.pane`,default:``},"autocompact.window":{kind:`input`,path:`autocompact.window`,type:`number`,default:-1},...Object.fromEntries([`applied`,`lower`,`higher`].map(e=>[`autocompact.${e}`,{kind:`input`,path:`autocompact.${e}`,type:`number`,default:0}])),"autocompact.error":{kind:`input`,path:`autocompact.error`,default:``},"git.repoUrl":{kind:`input`,path:`git.repoUrl`,default:``}},Nb=`ne .tmux.pane ""`,Pb={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:`๐ผ`},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`}},Fb=Object.values(Pb),Ib=[{configKey:`charset`,effectiveVar:`charset.effective`},{configKey:`colorCompatibility`,effectiveVar:`colorCompatibility.effective`}],Lb=new Set(Ib.map(e=>e.configKey)),Rb=new Map([...Fb,...Ib].map(e=>[e.configKey,e.effectiveVar])),zb=new Map(Fb.map(e=>[e.sessionKey,e.effectiveVar]));function Bb(e){return Object.fromEntries(Object.keys(Pb).map(t=>[t,e(t)]))}const Vb=new Map(Object.keys(Pb).map(e=>[Pb[e].sessionKey,e]));function Hb(e,t,n){let r=new Set,i=e=>{for(let t of _v(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(hb);for(let t of Object.values(e.actions)){r.add(hb),`copy`in t&&i(t.copy),`open`in t&&i(t.open);let e=`set`in t?zb.get(t.set):void 0,n=`persist`in t?Rb.get(t.persist):void 0;e!==void 0&&r.add(e),n!==void 0&&r.add(n)}return r}function Ub(e,t,n){let r=Cv({...n,variables:{...n.variables,...e.variables},segments:{...n.segments,...e.segments}}),i={};for(let a of Hb(e,t,n.helpers)){if(Sv(a,r))continue;let e=Mb[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 Wb=new Map,Gb=new Map;function Kb(e){let t=Jb(e);if(t===null)throw Error(`Palette "${e}" did not resolve in the theme registry โ allowed names and the registry are inconsistent`);return t}function qb(e,t){return e===`bar`?t:Kb(e)}function Jb(e){let t=Wb.get(e);if(t!==void 0)return t;let n=Tr(e);return n===null?null:(Wb.set(e,n),n)}function Yb(e,t){let n=`${e.name} ${t.hueShift} ${t.chromaScale} ${t.lightnessScale} ${t.lightnessShift}`,r=Gb.get(n);if(r!==void 0)return r;let i=Nr(e,t);return Gb.set(n,i),i}function Xb(e){let t=Jb(e);return t===null?null:{kind:`decided`,name:e,value:t}}function Zb(e,t,n){let r=Xb(e);return r===null?(n(`${t} rendered "${Xa}": "${e}" names no installed theme${Ya(e)}`),$b()):r}function Qb(e,t,n){return ao(e,t,n,$b(),Xb)}function $b(){return Xb(Xa)}function ex(e){return oo(Qb(void 0,null,e),$b).value}const tx=new Map;function nx(e,t,n){tx.set(e,{permanent:!0,resolve:t,paletteOf:n})}nx(`themes`,()=>Qa(),e=>Kb(e));const rx=`placementThemes`;nx(rx,$a,(e,t)=>qb(e,t.palette)),nx(`endcaps`,()=>fo),nx(`variations`,()=>yo),nx(`charsets`,()=>ho),nx(`colorCompatibilities`,()=>_o);function ix(e){return new Map([[`styles`,{members:Object.keys(e.styles),paletteOf:(t,n)=>Yb(n.basePalette,e.styles[t])}],[`presets`,{members:D_(e.presets)}]])}function ax(e){return[...new Set([...tx.keys(),...e.keys()])]}function ox(e,t){if(typeof e!=`string`)return{members:e};let n=t.get(e);if(n)return n;let r=tx.get(e);if(r)return{members:r.resolve(),paletteOf:r.paletteOf};throw Error(`unknown option domain "${e}" (have: ${ax(t).join(`, `)})`)}function sx(e){return{label:e.label,domain:cx(e.domain)}}function cx(e){return e===`theme`?{from:rx}:e===`bool`||`min`in e?e:{from:e}}function lx(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 ux=/^segments\.([^.]+)\.palette$/,dx=/^presets\.(.+)\.root$/,fx=/^presets\.(.+)\.globals\.([^.]+)$/;function px(e){return`presets.${e}.root`}function mx(e,t){return`presets.${e}.globals.${t}`}function hx(e){if(kl(e))return{scope:`globals`,field:e};let t=ux.exec(e);if(t)return{scope:`segment-palette`,segment:t[1]};let n=fx.exec(e);if(n&&Sl(n[2]))return{scope:`preset-globals`,preset:n[1],field:n[2]};let r=dx.exec(e);return r?{scope:`preset-root`,preset:r[1]}:null}function gx(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 _x=`open`;function vx(e,t,n,r){let i={variable:e,key:e,member:_x};return r.variables[e]=tl(e,Wc),r.actions[e]=nl(e,_x),r.segments[e]={template:Qc(e,`(?)`,`โ`),...yx(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 yx(e){let[t,...n]=e;return t===void 0?{}:{when:Xc(t,...n)}}const bx=`none`;var xx=class extends Error{constructor(e,t,n){super(`Invalid ${t} color ${JSON.stringify(e)}: ${n}`),this.name=`ColorSpecError`}};function Sx(e,t,n,r,i){let{palette:a,tint:o}=e,s=Cx(n,i),c=s!==bx,l=c?s===void 0?o:wx(a,s,`bg`):wx(a,`background`,`bg`);e.bg=l;let u=Cx(r,i),d=u===void 0?c?Aa(a,l,t):void 0:wx(a,u,`fg`);return new B({...c&&{bgcolor:vn.fromRgba(l)},...d!==void 0&&{color:vn.fromRgba(d)}})}function Cx(e,t){if(e!==void 0)return e.evaluate(t).map(e=>e.plain).join(``)}function wx(e,t,n){try{return $n(e,t)}catch(e){throw e instanceof Xn?new xx(t,n,e.message):e}}const Tx={help:[`-h`,`--help`],version:[`-V`,`--version`]},Ex=[`โ inserts`,`โ removes`,`โ๏ธ configures`,`โบ resets layout`],Dx=`
|
|
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
|
+
${Tx.help.join(`, `).padEnd(25)}Show this help
|
|
97
|
+
${Tx.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: ${Ex.join(`, `)}.
|
|
121
121
|
|
|
122
122
|
Subcommands:
|
|
123
123
|
install One-shot setup: stages the runtime (native render
|
|
@@ -155,26 +155,26 @@ Config tooling:
|
|
|
155
155
|
config [--json] The effective merged config. (All three query the
|
|
156
156
|
running daemon; none spawn one.)
|
|
157
157
|
|
|
158
|
-
`,Tx=`readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3`,Ex={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Dx(e){let t=e[Ex.socket]??``,n=e[Ex.pane]??``;if(t===``||n===``)return null;let r=e[Ex.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const Ox=Ex.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[Ox];return typeof n==`string`&&n!==``?{ok:!1,reason:`${Ox} 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:Ox,value:`1`}}}}}}];function Ax(e){return kx.map(t=>({check:t,verdict:t.probe(e)}))}function jx(e){return kx.find(t=>t.name===e)}const Mx=`${K}doctor.`;function Nx(e){let t=`${Mx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Px(e){return e.flatMap(({check:e,verdict:t})=>{let n=Nx(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 Fx={copySession:{copy:`{{ .session.id }}`},copyResume:{copy:`{{ .resume_command }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},openConfig:{open:`{{ .config_path }}`}};function Ix(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "โ id" }}{{ if ne .resume_command "" }} {{ action "${t(`copyResume`)}" "โ resume" }}{{ end }} {{ action "${t(`openProject`)}" "โ proj" }} {{ action "${t(`openTranscript`)}" "โ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "โ repo" }}{{ end }}{{ if ne .config_path "" }} {{ action "${t(`openConfig`)}" "โ config" }}{{ end }}`,actions:Object.fromEntries(Object.entries(Fx).map(([t,n])=>[`${e}${t}`,n]))}}const Lx=`armed`,Rx=`disarmed`,zx=`.armed`,Bx=e=>e.endsWith(zx);function Vx(e,t,n){let r=`${e}${zx}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${Lx}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "โ" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:Lx},[a]:{set:r,to:Rx},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:Rx}},disarm:a}}const Hx=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Ux(e){return typeof e==`string`&&Hx.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 Wx(e){let t=Ux(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Gx=[`/compact`,`/model`],Kx=`/clear`;function qx(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=Vx(`${e}clear`,{arm:Kx,confirm:`${Kx} โ confirm`},[n]);return{template:Gx.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,when:`{{ ${Ab} }}`,actions:{...Object.fromEntries(Gx.map(e=>[t(e),{slash:Wx(e)}])),...r.actions,[n]:{slash:Wx(Kx)}},variables:r.variables,disarm:r.disarm}}function Jx(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function Yx(e){return e??c.join(m.homedir(),`.claude`)}function Xx(e){return c.join(e,`settings.json`)}function Zx(e){return c.join(e,`plugins`,`installed_plugins.json`)}function Qx(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function $x(e){let t;try{let n=Qx(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${eS(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const eS=e=>e instanceof Error?e.message:String(e),tS=Array.from({length:10},(e,t)=>(t+1)*1e5),nS=tS[0],rS=tS[tS.length-1];function iS(e){let t;try{t=$x(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>=nS&&n<=rS?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${nS}โ${rS} tokens)`)}function aS(e,t){let n=Math.min(t??rS,rS),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:tS.filter(e=>e<r).at(-1)??0,higher:tS.find(e=>e>r&&e<=n)??0}}function oS(e,t){return{template:`{{ if ne .autocompact.error "" }}โฒ โ {{ .autocompact.error }}{{ else }}โฒ {{ if eq .autocompact.window 0 }}auto{{ else }}${t(`.autocompact.applied`)}{{ end }}{{ if ${Ab} }}{{ if gt .autocompact.lower 0 }} {{ action (printf "${e}%d" .autocompact.lower) "โ" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "${e}%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "${e}auto" "โบ" }}{{ end }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`,actions:{[`${e}auto`]:{slash:Wx(`/autocompact auto`)},...Object.fromEntries(tS.map(t=>[`${e}${t}`,{slash:Wx(`/autocompact ${t}`)}]))}}}const sS=e=>`{{ if ge ${e} 1000000 }}{{ printf "%.1f" (divf ${e} 1000000) }}M{{ else if ge ${e} 1000 }}{{ printf "%.1f" (divf ${e} 1000) }}K{{ else }}{{ ${e} }}{{ end }}`,cS=`${K}menu`,lS=`open`,uS=`${K}edit`,dS=`${K}toolbar`,fS=Ix(K),pS=`${K}commands`,mS=qx(`${pS}.`),hS=`${K}autocompact`,gS=oS(`${hS}.`,sS),_S=e=>({kind:`segment`,name:e}),vS=`${K}tab`,yS=[{member:`session`,label:`โก session`},{member:`look`,label:`๐จ look`},{member:`layout`,label:`๐ layout`},{member:`config`,label:`โ config`},{member:`tools`,label:`๐งฐ tools`}],bS=e=>`${vS}.${e}`,xS=e=>`${bS(e)}.toggle`,SS=e=>({variable:vS,key:vS,member:e}),CS=`${K}save`,wS=`${K}preset.save`,TS=`${K}preset.delete`,ES=`${K}resetAll`,DS=`${cS}.toggle`,OS={variable:cS,key:cS,member:lS},kS=`${K}undo`,AS=`${K}back`,jS=`${AS}.step`,MS=`${K}navigation.back`,NS=AS,PS={template:`{{ if gt .${MS} 0 }}{{ action "${AS}" "โ" }}{{ else }}{{ fg (${Tx}) "โ" }}{{ end }}`},FS=`${K}redo`,IS=`${K}doctor`,LS=`${IS}.run`,RS=e=>`${IS}.fix.${e}`,zS=e=>`${IS}.${e}`,BS=`${K}pickers`,VS=[{template:`{{ themePreview }}`}],HS={template:`{{ layoutPreview }}`},US={preset:[HS,{when:`{{ not .preset.bundled }}`,template:`{{ action "${TS}" (printf "๐ delete %s" .${jb.preset.effectiveVar}) }}`}],theme:VS,style:VS,variation:[HS]},WS=e=>`${K}${e}`,GS=e=>`${K}apply.${e}`,KS=e=>`${K}reset.${e}`,qS=e=>`${K}carousel.${e}`,JS=(e,t)=>`${qS(e)}.${t}`,YS=e=>`${K}resettable.${e}`,XS=e=>e.length===0?`false`:`(or ${e.map(e=>`.${YS(e)}`).join(` `)})`,ZS=Object.keys(jb).map(e=>{let t=jb[e],n=pl(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=ox({label:t.label,domain:n},t.sessionKey,t.effectiveVar,GS(e));return{...t,name:e,control:r,beneath:US[e]??[]}}),QS={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,updateNotice:`config`},$S=e=>ZS.filter(t=>QS[t.name]===e),eC=e=>$S(e).map(mC);new Set(ZS.flatMap(e=>[e.sessionKey,e.configKey]));const tC=Vx(ES,{arm:`โฒ`,confirm:`โฒ reset all?`},ZS.map(e=>KS(e.name))),nC=[`unsaved`,`history.undo`,`history.redo`],rC=e=>`${K}${e}`,iC=rC(`unsaved`),aC=(e,t)=>({body:t,shown:`(gt .${rC(e)} 0)`}),oC=[aC(`unsaved`,`{{ action "${CS}" (printf "๐พ save %d" .${iC}) }}`),aC(`history.undo`,`{{ action "${kS}" "โถ" }}`),aC(`history.redo`,`{{ action "${FS}" "โท" }}`),{body:tC.template,shown:`(or ${XS(ZS.map(e=>e.name))} ${tC.armed})`}],sC={when:`{{ or ${oC.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+oC.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},cC=[{step:tC,place:`door`},{step:mS,place:`session`}],lC=e=>e.map(e=>e.step.disarm),uC=lC(cC),dC=lC(cC.filter(e=>e.place!==`door`)),fC=v_(BS),pC=e=>({variable:fC,key:fC,member:g_(GS(e))});function mC(e){let t=WS(e.name);return e.control.kind===`inline`?_S(t):Yc(t,pC(e.name),{kind:`container`,direction:`vertical`,children:[_S(qS(e.name)),...e.beneath.map((t,n)=>({kind:`segment`,name:JS(e.name,n)}))]},`drop`)}function hC(e){return e===cS}function gC(e){let t=_S(cS);if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[gC(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 _C(e){return vC(e)>0?e:gC(e)}function vC(e){let t=0;for(let n of Ms(e))n.kind===`segment`&&hC(n.name)&&(t+=1);return t}function yC(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&hC(e.name)||e.opens!==void 0&&yC(e.opens.body,!0):e.children.some(e=>yC(e,n))}const bC={session:{direction:`vertical`,content:[_S(dS),{kind:`container`,direction:`horizontal`,children:[_S(pS),_S(hS)]}]},look:{direction:`horizontal`,content:[]},layout:{direction:`horizontal`,content:[_S(wS),_S(uS)]},config:{direction:`horizontal`,content:[]},tools:{direction:`vertical`,content:[_S(IS),...kx.map(e=>_S(zS(e.name)))]}},xC=e=>({kind:`container`,direction:bC[e].direction,children:[...bC[e].content,...eC(e)]});function SC(e){return e.kind===`segment`?hC(e.name)?Yc(e.name,OS,wC,`above`):e:EC(e)}function CC(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[_S(NS),...eC(`door`),_S(CS)]},{kind:`container`,direction:`horizontal`,children:yS.map(({member:e})=>Yc(bS(e),SS(e),xC(e),`drop`))}]}}const wC=CC();function TC(e){let t=new Map;for(let e of Ms(wC))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=`${cS}.fold.${yu(t)}`;return e.actions[i]={set:t,to:r.default},i})}function EC(e){return{...e,children:e.children.map(e=>SC(e))}}function DC(e){let t={variables:{[cS]:tl(cS,Wc)},actions:{[DS]:nl(cS,lS),[LS]:{doctor:`run`},[uS]:{do:[...Y_]},...fS.actions,...mS.actions,...gS.actions,[CS]:{save:!0},[kS]:{undo:!0},[jS]:{back:!0},[AS]:{do:[jS,...uC]},[FS]:{redo:!0},[wS]:{preset:`save`},[TS]:{preset:`delete`,name:`{{ .${jb.preset.effectiveVar} }}`}},segments:{[cS]:{template:`{{ $door := ${$c(cS,el(e),el(`โ`))} }}{{ if ${Zc(OS)} }}{{ fg (color "error") $door }}{{ else }}{{ $door }}{{ end }}`},[dS]:{template:fS.template},[pS]:{template:mS.template,when:mS.when},[hS]:{template:gS.template,bg:gS.bg,when:gS.when},[NS]:PS,[CS]:sC,[wS]:{template:`{{ action "${wS}" "+ preset" }}`},[IS]:{template:`{{ action "${LS}" "๐ฉบ doctor" }}`},[uS]:{template:`{{ action "${uS}" "โ arrange" "โ done" }}`}}};t.variables[MS]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of nC)t.variables[rC(e)]={kind:`input`,path:e,type:`number`,default:0};t.variables[vS]=tl(vS,`session`);for(let{member:e,label:n}of yS){t.actions[xS(e)]=nl(vS,e),t.actions[bS(e)]={do:[xS(e),...dC]};let r=XS($S(e).map(e=>e.name)),i=`(ternary ${el(` โข`)} "" ${r})`,a=e=>`(print ${el(e)} ${i})`;t.segments[bS(e)]={template:`{{ ${$c(bS(e),a(n),a(`โพ ${n}`))} }}`}}return Object.assign(t.variables,mS.variables,tC.variables),kC(t),OC(t),t.actions[cS]={do:[DS,...uC,...TC(t)]},t}function OC(e){for(let t of kx){let n=Nx(t.name),r=RS(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[zS(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 kC(e){for(let t of ZS){Object.assign(e.actions,t.control.actions);let n=KS(t.name);e.actions[n]={reset:t.configKey},e.variables[YS(t.name)]={kind:`input`,path:`resettable.${t.name}`,type:`boolean`,default:!1};let r=`{{ if .${YS(t.name)} }} {{ action "${n}" "โบ" }}{{ end }}`;if(t.control.kind===`inline`){e.segments[WS(t.name)]={template:`${t.control.template}${r}`};continue}let i=pC(t.name),a=y_(i.key,i.member);e.variables[i.key]=tl(i.key,Wc),e.actions[a]=nl(i.key,i.member),e.segments[WS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} `+Qc(a,`โธ`,`โพ`)+r},e.segments[qS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[JS(t.name,r)]=n})}Object.assign(e.actions,tC.actions)}function AC(e){let{variables:t,actions:n}=iv();Object.assign(e.variables,t),Object.assign(e.actions,n)}function jC(e){let t=DC(e.globals.menuGlyph??`๐ซ`);AC(t);let n={...e.presets},r=[];for(let t of D_(e.presets)){let{node:i}=A_(e,t),a=SC(_C(i));r.push(a),n[t]={...k_(e.presets,t),root:a}}let i=Bb(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const MC=`${Su}live`,NC=[`โ live`,`โ live`],PC=`${Su}done`,FC=`${Su}cancel`,IC=`${Su}rewind`,LC=`${Su}changes`,RC=`(gt .${LC} 0)`,zC=`(or ${RC} (gt .${iC} 0))`,BC={variable:MC,key:MC,member:`open`};function VC(e){return`${Su}configuring.p${e}`}function HC(e){return`and ${Zc($_)} (not ${Zc(BC)}) (ne .${VC(e)} "true")`}function UC(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${K_} "${Jc(e)}")`).join(` `)} false }}`}}function WC(e,t,n){return`{{ if ${HC(e)} }}${t}{{ else }}${n}{{ end }}`}const GC=`{{ and ${Zc($_)} .preset.customized }}`,KC=wu,qC=`${Su}addable`;function JC(e){return new Map([[qC,{members:Object.keys(e.segments).filter(e=>!KC(e)),library:{groups:_u.map(e=>({id:e,label:vu[e]})),entry:t=>{let n=e.segments[t];return{group:n.group??`other`,...n.description!==void 0&&{description:n.description}}}}}]])}function YC(e,t,n){return n.segments[e]={template:t,when:ev,bg:_x},{kind:`segment`,name:e}}function XC(e,t,n){let r=`${Su}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${ka}`}) (action "${r}" "โ") }}`}function ZC(e){return`{{ if ${Zc($_)} }}${e}{{ end }}`}function QC(e,t){return e.reduce((e,t)=>`{{ if and ${Zc($_)} ${Zc(t)} }}true{{ else }}${e}{{ end }}`,t)}function $C(e){return e.flatMap(e=>[...Ms(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function ew(e,t,n){return`${Z_}${e}.${t}.${n}`}function tw(e,t,n,r){let i=Os(n),a=`${Su}${e.presetIdent}`,o=Q_(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:K_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=ew(e.presetIdent,i,r),l=`${Z_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Ks(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=ox(ix(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:K_,key:K_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const nw=`${Su}label:`;function rw(e){if(e.startsWith(nw)){let t=e.slice(nw.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function iw(e,t,n,r){let{artifacts:i}=n,a=Os(e),o=`${nw}${a}:${e.name}`;i.segments[o]={template:`{{ "${Jc(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=e.settings?.[Vs];return{...Yc(o,r.ref,r.body,`drop`,QC([r.ref],`{{ ${HC(n.presetIdent)} }}`)),...s!==void 0&&{settings:{theme:s}},drafts:{[Vs]:r.drafts[Vs]}}}function aw(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${Su}${i}.insert.${t}`,s=`${Su}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:qC,anchor:n,relation:r};let c=g_(o),l=__(s,o,void 0),u=b_(l),d=y_(l,c);return a.variables[l]=tl(l,Wc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=nl(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) ${ka}`}) $m }}{{ end }}`}}function ow(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!KC(e.name)),i=e=>ow(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(KC(o.name)){n.push(s);continue}let c=Os(o),l=a===r?[aw(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=aw(t,u,c,`after`),f=XC(t,u,c),p=t.segments[o.name],m=tw(t,u,o,Hs(p)),h=ZC(f),g=ZC(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>YC(e.host,e.template,t.artifacts)),{...iw(o,p,t,m),lead:h,trail:g},{...s,when:WC(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},YC(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:QC($C(n),WC(t.presetIdent,`true`,e.when))}}}function sw(e,t,n,r,i,a,o){let s=`${Su}${t}.resetLayout`,c=`${Su}${t}.customized`;return r.actions[s]={reset:n},r.segments[c]={template:`{{ action "${s}" "โบ reset layout" }}`,when:GC},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...i,{kind:`segment`,name:c},a]},cw(e,o)]}}function cw(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),cw(n,t)]}:{...e,children:[...e.children,t]}}function lw(e,t,n,r,i,a){let{node:o}=A_(e,t),s={presetIdent:yu(t),rootKey:ux(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},c=ow(o,s);return n.variables[VC(s.presetIdent)]=UC(s.configured),sw(c,s.presetIdent,s.rootKey,n,r,i,a)}function uw(e){let t={variables:{},actions:{},segments:{}},n=hx(`${Su}help`,Cx,[$_],t);t.variables[MC]=tl(MC,Wc),t.actions[MC]=nl(MC,BC.member),t.segments[MC]={template:Qc(MC,...NC),when:ev};let r={kind:`segment`,name:MC},i=n;t.variables[LC]={kind:`input`,path:`history.sinceEdit`,type:`number`,default:0},t.actions[PC]={do:[CS,...Y_]},t.segments[PC]={template:`{{ if ${zC} }}{{ action "${PC}" "โ save" }}{{ else }}{{ action "${PC}" "โ done" }}{{ end }}`,when:ev},t.actions[IC]={rewind:!0},t.actions[FC]={do:[IC,...Y_]},t.segments[FC]={template:`{{ action "${FC}" "โฉ cancel" }}`,when:`{{ and ${Zc($_)} ${RC} }}`};let a=[{kind:`segment`,name:PC},{kind:`segment`,name:FC}],o={...e.presets},s=[];for(let n of D_(e.presets)){let c=lw(e,n,t,a,r,i);s.push(c),o[n]={...k_(e.presets,n),root:c}}let c=Bb(t,s,e);return{...e,variables:{...c,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:o}}const dw=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`rewind`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function fw(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function pw(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function mw(e,t){if(t===void 0)return{};if(!nc(t))return Z(e,`actions`,`actions must be an object, got ${rc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=hw(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 hw(e,t,n){if(!nc(n))return Z(e,t,`${t} must be an action object, got ${rc(n)}`),null;if(`persistWhen`in n)return Z(e,t,`${t}.persistWhen was removed: declare the \`set\` alone โ a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=dw.filter(e=>e in n);return r.length===1?gw[r[0]](e,t,n):(Z(e,t,`action must declare exactly one of: ${dw.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const gw={set:(e,t,n)=>Jw(e,t,n,`set`,Ww),persist:(e,t,n)=>Jw(e,t,n,`persist`,Gw),copy:_w(`copy`),open:_w(`open`),reset:vw,undo:bw(`undo`),redo:bw(`redo`),back:bw(`back`),rewind:bw(`rewind`),save:bw(`save`),preset:xw,doctor:Sw,ceiling:Cw,slash:ww,do:Tw};function _w(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Z(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Zs(t,n,r,e);return i===null?null:{[e]:i}}}function vw(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=Ew(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 yw={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,rewind:`it steps the session's settings history back to where edit mode opened`,save:`it saves the session's unsaved settings`};function bw(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 โ ${yw[e]}), got ${G(r[e])}`),null)}}function xw(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=Zs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function Sw(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 Cw(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 ww(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=Ux(n.slash);return r.kind===`refused`?(Z(e,`${t}.slash`,r.reason),null):{slash:r.line}}function Tw(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 Ew(e,t,n,r,i,a){let o=Zs(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Z(e,s,i),null):o.includes(`/`)?(Z(e,s,a(o)),null):o}const Dw={set:`the SessionState key to write`,persist:`the config globals field to write`};function Ow(e,t,n,r){let i=Dw[r],a=Ew(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 kw(e){return e===`set`?`set-state`:`set-config`}const Aw={to:Yw(`set`)},jw={to:Yw(`persist`)},Mw={from:Xw(`set`)},Nw={from:Xw(`persist`)},Pw={min:tT(),max:tT(),by:tT()},Fw={int:Qw()},Iw={cycle:Zw(`set`)},Lw={cycle:Zw(`persist`)},Rw={removeSegment:$w(`removeSegment`)},zw={insertSegment:$w(`insertSegment`),anchor:$w(`anchor`),relation:eT()},Bw={insertSegmentFrom:Xw(`persist`),anchor:$w(`anchor`),relation:eT()},Vw={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},Hw={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function Uw(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 Ww=[Uw(`set`,Aw),Uw(`set`,Mw),Uw(`set`,Pw,[Vw,Hw]),Uw(`set`,Fw),Uw(`set`,Iw)],Gw=[Uw(`persist`,jw),Uw(`persist`,Nw),Uw(`persist`,Pw,[Vw,Hw]),Uw(`persist`,Lw),Uw(`persist`,Rw),Uw(`persist`,zw,[],[`insertSegment`]),Uw(`persist`,Bw,[],[`insertSegmentFrom`])];function Kw(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 qw(e){let t=Kw(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 Jw(e,t,n,r,i){let a=Ow(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Z(e,t,`${qw(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 Yw(e){let t=kw(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>Ew(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 Xw(e){let t=kw(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 Zw(e){let t=kw(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Z(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${rc(o)}`);return}let c=o;if(c.length<2){Z(n,s,`cycle needs at least two members (one member has no successor โ use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Z(n,s,`cycle members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Z(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Z(n,s,`cycle members must be unique โ the successor of a duplicated member is ambiguous`);return}return c}}}function Qw(){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=Zs(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Z(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Z(t,o,`${e} "${a}" contains "/" or ":" โ segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function eT(){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 tT(){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 nT(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style โ endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const rT={noun:`style key`,fields:{hueShift:vc(),chromaScale:vc({min:0}),lightnessScale:vc(),lightnessShift:vc()}};function iT(e,t){if(!nc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${rc(t)}`,line: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(po(r)){e.issues.push({path:`styles.${r}`,message:nT(`styles.${r}`,r,`globals.endcaps`),line:W(e.source,[`styles`,r])});continue}let t=ic(e,rT,`styles.${r}`,i);t!==null&&(n[r]={...zn,...t})}return n}const aT={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:fd(e,`${t}.${n}`,r[n])},globals:{required:!1,json:El(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Tl(e,`${t}.${n}`,r[n])}}};function oT(e,t){if(!nc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${rc(t)}`,line: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=ic(e,aT,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function sT(e,t){if(t===void 0)return{};if(!nc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${rc(t)}`,line: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 cT=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 lT(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 uT(e){let t=cT.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${lT(t)}`}function dT(e){let t=cT.get(e);return t===void 0?``:` โ ".${e}" is no longer a variable: ${lT(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function fT(e,t){let n=new Map;for(let e of Object.keys(t)){let t=yu(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 pT(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||io(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:po(i)?nT(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`])}),fT(e,t.presets);let i=tx(t);for(let[n,r]of Object.entries(t.actions))`set`in r&&Pb.has(r.set)&&e.issues.push({path:`actions.${n}.set`,message:`actions.${n} sets "${r.set}", which has no session pick โ globals.${r.set} is set in the config file only, so a click would change nothing; write it with { persist: "${r.set}", โฆ } instead`,line:W(e.source,[`actions`,n,`set`])}),!(!(`set`in r)||!(`from`in r)||typeof r.from!=`string`)&&(nx(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${nx(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&&pw(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=fx(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Al().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=mT.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`){hT(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!D_(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: ${D_(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(`, `)})${Ou(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=Cv(t);for(let t of a.names)t!==`settings`&&!t.startsWith(gT)||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)=>{vC(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${cS}" ${vC(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}),yC(t)&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${cS}" 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&&(OT(e,`${o}.when`,i.when,a,{line:n}),DT(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(hC(i.name)){(i.id!==void 0||i.settings!==void 0)&&e.issues.push({path:o,message:`${r} gives the global settings menu anchor "${cS}" an id or settings โ the anchor only marks where the menu goes, so place it as the bare name "${cS}"`,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${Ou(i.name)}`,line:n}),wT(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 D_(t.presets)){let{node:n,path:r}=A_(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)){TT(e,`variables.${n}`,r,a);let t=uT(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))TT(e,`segments.${n}.vars.${t}`,i,a,n);let i=Hs(r);vT(e,n,i);let o=_T(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){OT(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of xv(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){kT(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))ET(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))ET(e,`segments.${n}.vars.${t}`,i,a,n)}const mT=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function hT(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!D_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${D_(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(`, `)})${Ou(i)}`,line:c})},p=new Set(ks(A_(t,a).node)),m=(r,i)=>{!Du.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${Ou(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 gT=`settings.`;function _T(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>gT+e)])}}function vT(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=xT(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Ws(n,bT(n)))i(e,`the defaults do not stand together: ${t}`)}function yT(e){return xT(e).length>0||Ws(e,bT(e)).length>0}function bT(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function xT(e){let t=t=>Us(ST(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Us(ST(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${CT(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 ST(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function CT(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Us(n)!==void 0).map(([e])=>e)}function wT(e,t,n,r,i){let a=Object.prototype.hasOwnProperty.call(t.segments,n.name)?t.segments[n.name]:void 0;if(a===void 0)return;let o=Hs(a),s=`${r}: placement "${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(`, `)})`:Gs(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Ya(a):``}, but it must be ${Js(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Gs(o[e],t))||yT(o)))for(let{message:t}of Ws(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function TT(e,t,n,r,i){n.kind===`template`&&OT(e,`${t}.template`,n.template,r,{segCtx:i}),zs(n)&&n.cache&&`key`in n.cache&&OT(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function ET(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 DT(e,t,n,r){try{W_.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function OT(e,t,n,r,i){for(let[a,o]of _v(n,r.helpers)){if(Sv(a,r))continue;if(a.startsWith(gT)){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){kT(e,o,`Template references unknown variable ".${a}"${dT(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&Sv(n,r)?` (segment-local vars are namespaced โ write ".${n}")`:dT(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function kT(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 AT(e,t){let{graph:n,nodeInfo:r}=jT(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 jT(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 _v(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 MT=[`json5`,`json`];function NT(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function PT(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?m.homedir()+e.slice(1):e}function FT(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?MT.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...MT.map(e=>c.join(r,`.cc-candybar.${e}`)),...MT.map(e=>`${IT()}.${e}`)])]}function IT(){let e=process.env.XDG_CONFIG_HOME??c.join(m.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function LT(e,t,n){let r=[];for(let i of FT(e,t,n)){let e=NT(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 RT(e,t,n){let r=LT(e,t,n);return r.kind===`default`?`${IT()}.${MT[0]}`:r.path}function zT(e){return BT(e).join(`
|
|
159
|
-
`)||null}function
|
|
158
|
+
`,Ox=`readableOn (mix (color "foreground") (bgOf) 60) (bgOf) 3`,kx={socket:`TMUX`,pane:`TMUX_PANE`,truecolor:`CLAUDE_CODE_TMUX_TRUECOLOR`};function Ax(e){let t=e[kx.socket]??``,n=e[kx.pane]??``;if(t===``||n===``)return null;let r=e[kx.truecolor]??``;return{socket:t.split(`,`)[0],pane:n,truecolor:r===``?null:r}}const jx=kx.truecolor,Mx=[{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[jx];return typeof n==`string`&&n!==``?{ok:!1,reason:`${jx} 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:jx,value:`1`}}}}}}];function Nx(e){return Mx.map(t=>({check:t,verdict:t.probe(e)}))}function Px(e){return Mx.find(t=>t.name===e)}const Fx=`${K}doctor.`;function Ix(e){let t=`${Fx}${e}.`;return{verdict:`${t}verdict`,reason:`${t}reason`,fixable:`${t}fixable`}}function Lx(e){return e.flatMap(({check:e,verdict:t})=>{let n=Ix(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 Rx={copySession:{copy:`{{ .session.id }}`},copyResume:{copy:`{{ .resume_command }}`},openProject:{open:`{{ .project_dir }}`},openTranscript:{open:`{{ .transcript_path }}`},openConfig:{open:`{{ .config_path }}`}};function zx(e){let t=t=>`${e}${t}`;return{template:`{{ action "${t(`copySession`)}" "โ id" }}{{ if ne .resume_command "" }} {{ action "${t(`copyResume`)}" "โ resume" }}{{ end }} {{ action "${t(`openProject`)}" "โ proj" }} {{ action "${t(`openTranscript`)}" "โ log" }}{{ if ne .git.repoUrl "" }} {{ link .git.repoUrl "โ repo" }}{{ end }}{{ if ne .config_path "" }} {{ action "${t(`openConfig`)}" "โ config" }}{{ end }}`,actions:Object.fromEntries(Object.entries(Rx).map(([t,n])=>[`${e}${t}`,n]))}}const Bx=`armed`,Vx=`disarmed`,Hx=`.armed`,Ux=e=>e.endsWith(Hx);function Wx(e,t,n){let r=`${e}${Hx}`,i=`${e}.arm`,a=`${e}.disarm`,o=`(eq .${e} "${Bx}")`;return{template:`{{ if ${o} }}{{ action "${e}" "${t.confirm}" }} {{ action "${a}" "โ" }}{{ else }}{{ action "${i}" "${t.arm}" }}{{ end }}`,actions:{[i]:{set:r,to:Bx},[a]:{set:r,to:Vx},[e]:{do:[a,...n]}},armed:o,variables:{[e]:{kind:`state`,key:r,default:Vx}},disarm:a}}const Gx=RegExp(`^/[^\\s\\x00-\\x1f\\x7f-\\x9f/][^\\x00-\\x1f\\x7f-\\x9f]*$`);function Kx(e){return typeof e==`string`&&Gx.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 qx(e){let t=Kx(e);if(t.kind===`refused`)throw Error(t.reason);return t.line}const Jx=[`/compact`,`/model`],Yx=`/clear`;function Xx(e){let t=t=>`${e}${t.slice(1)}`,n=`${e}clear.slash`,r=Wx(`${e}clear`,{arm:Yx,confirm:`${Yx} โ confirm`},[n]);return{template:Jx.map(e=>`{{ action "${t(e)}" "${e}" }} `).join(``)+r.template,when:`{{ ${Nb} }}`,actions:{...Object.fromEntries(Jx.map(e=>[t(e),{slash:qx(e)}])),...r.actions,[n]:{slash:qx(Yx)}},variables:r.variables,disarm:r.disarm}}function Zx(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function Qx(e){return e??c.join(m.homedir(),`.claude`)}function $x(e){return c.join(e,`settings.json`)}function eS(e){return c.join(e,`plugins`,`installed_plugins.json`)}function tS(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function nS(e){let t;try{let n=tS(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${rS(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const rS=e=>e instanceof Error?e.message:String(e),iS=Array.from({length:10},(e,t)=>(t+1)*1e5),aS=iS[0],oS=iS[iS.length-1];function sS(e){let t;try{t=nS(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>=aS&&n<=oS?J(n):X(`${e}: autoCompactWindow is ${JSON.stringify(n)}, not a window /autocompact accepts (${aS}โ${oS} tokens)`)}function cS(e,t){let n=Math.min(t??oS,oS),r=e===`auto`?n:Math.min(e,n);return{window:e===`auto`?0:e,applied:e===`auto`?0:r,lower:iS.filter(e=>e<r).at(-1)??0,higher:iS.find(e=>e>r&&e<=n)??0}}function lS(e,t){return{template:`{{ if ne .autocompact.error "" }}โฒ โ {{ .autocompact.error }}{{ else }}โฒ {{ if eq .autocompact.window 0 }}auto{{ else }}${t(`.autocompact.applied`)}{{ end }}{{ if ${Nb} }}{{ if gt .autocompact.lower 0 }} {{ action (printf "${e}%d" .autocompact.lower) "โ" }}{{ end }}{{ if gt .autocompact.higher 0 }} {{ action (printf "${e}%d" .autocompact.higher) "+" }}{{ end }}{{ if gt .autocompact.window 0 }} {{ action "${e}auto" "โบ" }}{{ end }}{{ end }}{{ end }}`,bg:`{{ if ne .autocompact.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .autocompact.window 0) (ne .autocompact.error "") }}`,actions:{[`${e}auto`]:{slash:qx(`/autocompact auto`)},...Object.fromEntries(iS.map(t=>[`${e}${t}`,{slash:qx(`/autocompact ${t}`)}]))}}}const uS=e=>`{{ if ge ${e} 1000000 }}{{ printf "%.1f" (divf ${e} 1000000) }}M{{ else if ge ${e} 1000 }}{{ printf "%.1f" (divf ${e} 1000) }}K{{ else }}{{ ${e} }}{{ end }}`,dS=`${K}menu`,fS=`open`,pS=`${K}edit`,mS=`${K}toolbar`,hS=zx(K),gS=`${K}commands`,_S=Xx(`${gS}.`),vS=`${K}autocompact`,yS=lS(`${vS}.`,uS),bS=e=>({kind:`segment`,name:e}),xS=`${K}tab`,SS=[{member:`session`,label:`โก session`},{member:`look`,label:`๐จ look`},{member:`layout`,label:`๐ layout`},{member:`config`,label:`โ config`},{member:`tools`,label:`๐งฐ tools`}],CS=e=>`${xS}.${e}`,wS=e=>`${CS(e)}.toggle`,TS=e=>({variable:xS,key:xS,member:e}),ES=`${K}save`,DS=`${K}preset.save`,OS=`${K}preset.delete`,kS=`${K}resetAll`,AS=`${dS}.toggle`,jS={variable:dS,key:dS,member:fS},MS=`${K}undo`,NS=`${K}back`,PS=`${NS}.step`,FS=`${K}navigation.back`,IS=NS,LS={template:`{{ if gt .${FS} 0 }}{{ action "${NS}" "โ" }}{{ else }}{{ fg (${Ox}) "โ" }}{{ end }}`},RS=`${K}redo`,zS=`${K}doctor`,BS=`${zS}.run`,VS=e=>`${zS}.fix.${e}`,HS=e=>`${zS}.${e}`,US=`${K}pickers`,WS=[{template:`{{ themePreview }}`}],GS={template:`{{ layoutPreview }}`},KS={preset:[GS,{when:`{{ not .preset.bundled }}`,template:`{{ action "${OS}" (printf "๐ delete %s" .${Pb.preset.effectiveVar}) }}`}],theme:WS,style:WS,variation:[GS]},qS=e=>`${K}${e}`,JS=e=>`${K}apply.${e}`,YS=e=>`${K}reset.${e}`,XS=e=>`${K}carousel.${e}`,ZS=(e,t)=>`${XS(e)}.${t}`,QS=e=>`${K}resettable.${e}`,$S=e=>e.length===0?`false`:`(or ${e.map(e=>`.${QS(e)}`).join(` `)})`,eC=Object.keys(Pb).map(e=>{let t=Pb[e],n=pl(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=lx({label:t.label,domain:n},t.sessionKey,t.effectiveVar,JS(e));return{...t,name:e,control:r,beneath:KS[e]??[]}}),tC={preset:`door`,theme:`look`,style:`look`,variation:`look`,endcaps:`look`,autoWrap:`layout`,padding:`layout`,updateNotice:`config`},nC=e=>eC.filter(t=>tC[t.name]===e),rC=e=>nC(e).map(_C);new Set(eC.flatMap(e=>[e.sessionKey,e.configKey]));const iC=Wx(kS,{arm:`โฒ`,confirm:`โฒ reset all?`},eC.map(e=>YS(e.name))),aC=[`unsaved`,`history.undo`,`history.redo`],oC=e=>`${K}${e}`,sC=oC(`unsaved`),cC=(e,t)=>({body:t,shown:`(gt .${oC(e)} 0)`}),lC=[cC(`unsaved`,`{{ action "${ES}" (printf "๐พ save %d" .${sC}) }}`),cC(`history.undo`,`{{ action "${MS}" "โถ" }}`),cC(`history.redo`,`{{ action "${RS}" "โท" }}`),{body:iC.template,shown:`(or ${$S(eC.map(e=>e.name))} ${iC.armed})`}],uC={when:`{{ or ${lC.map(e=>e.shown).join(` `)} }}`,template:`{{ $sep := "" }}`+lC.map(e=>`{{ if ${e.shown} }}{{ $sep }}${e.body}{{ $sep = " " }}{{ end }}`).join(``)},dC=[{step:iC,place:`door`},{step:_S,place:`session`}],fC=e=>e.map(e=>e.step.disarm),pC=fC(dC),mC=fC(dC.filter(e=>e.place!==`door`)),hC=v_(US),gC=e=>({variable:hC,key:hC,member:g_(JS(e))});function _C(e){let t=qS(e.name);return e.control.kind===`inline`?bS(t):Yc(t,gC(e.name),{kind:`container`,direction:`vertical`,children:[bS(XS(e.name)),...e.beneath.map((t,n)=>({kind:`segment`,name:ZS(e.name,n)}))]},`drop`)}function vC(e){return e===dS}function yC(e){let t=bS(dS);if(e.kind===`container`&&e.direction===`vertical`){let[n,...r]=e.children;return e.when===void 0&&n!==void 0?{...e,children:[yC(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 bC(e){return xC(e)>0?e:yC(e)}function xC(e){let t=0;for(let n of Ms(e))n.kind===`segment`&&vC(n.name)&&(t+=1);return t}function SC(e,t=!1){let n=t||e.when!==void 0;return e.kind===`segment`?n&&vC(e.name)||e.opens!==void 0&&SC(e.opens.body,!0):e.children.some(e=>SC(e,n))}const CC={session:{direction:`vertical`,content:[bS(mS),{kind:`container`,direction:`horizontal`,children:[bS(gS),bS(vS)]}]},look:{direction:`horizontal`,content:[]},layout:{direction:`horizontal`,content:[bS(DS),bS(pS)]},config:{direction:`horizontal`,content:[]},tools:{direction:`vertical`,content:[bS(zS),...Mx.map(e=>bS(HS(e.name)))]}},wC=e=>({kind:`container`,direction:CC[e].direction,children:[...CC[e].content,...rC(e)]});function TC(e){return e.kind===`segment`?vC(e.name)?Yc(e.name,jS,DC,`above`):e:kC(e)}function EC(){return{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[bS(IS),...rC(`door`),bS(ES)]},{kind:`container`,direction:`horizontal`,children:SS.map(({member:e})=>Yc(CS(e),TS(e),wC(e),`drop`))}]}}const DC=EC();function OC(e){let t=new Map;for(let e of Ms(DC))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.${yu(t)}`;return e.actions[i]={set:t,to:r.default},i})}function kC(e){return{...e,children:e.children.map(e=>TC(e))}}function AC(e){let t={variables:{[dS]:tl(dS,Wc)},actions:{[AS]:nl(dS,fS),[BS]:{doctor:`run`},[pS]:{do:[...Y_]},...hS.actions,..._S.actions,...yS.actions,[ES]:{save:!0},[MS]:{undo:!0},[PS]:{back:!0},[NS]:{do:[PS,...pC]},[RS]:{redo:!0},[DS]:{preset:`save`},[OS]:{preset:`delete`,name:`{{ .${Pb.preset.effectiveVar} }}`}},segments:{[dS]:{template:`{{ $door := ${$c(dS,el(e),el(`โ`))} }}{{ if ${Zc(jS)} }}{{ fg (color "error") $door }}{{ else }}{{ $door }}{{ end }}`},[mS]:{template:hS.template},[gS]:{template:_S.template,when:_S.when},[vS]:{template:yS.template,bg:yS.bg,when:yS.when},[IS]:LS,[ES]:uC,[DS]:{template:`{{ action "${DS}" "+ preset" }}`},[zS]:{template:`{{ action "${BS}" "๐ฉบ doctor" }}`},[pS]:{template:`{{ action "${pS}" "โ arrange" "โ done" }}`}}};t.variables[FS]={kind:`input`,path:`navigation.back`,type:`number`,default:0};for(let e of aC)t.variables[oC(e)]={kind:`input`,path:e,type:`number`,default:0};t.variables[xS]=tl(xS,`session`);for(let{member:e,label:n}of SS){t.actions[wS(e)]=nl(xS,e),t.actions[CS(e)]={do:[wS(e),...mC]};let r=$S(nC(e).map(e=>e.name)),i=`(ternary ${el(` โข`)} "" ${r})`,a=e=>`(print ${el(e)} ${i})`;t.segments[CS(e)]={template:`{{ ${$c(CS(e),a(n),a(`โพ ${n}`))} }}`}}return Object.assign(t.variables,_S.variables,iC.variables),MC(t),jC(t),t.actions[dS]={do:[AS,...pC,...OC(t)]},t}function jC(e){for(let t of Mx){let n=Ix(t.name),r=VS(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[HS(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 MC(e){for(let t of eC){Object.assign(e.actions,t.control.actions);let n=YS(t.name);e.actions[n]={reset:t.configKey},e.variables[QS(t.name)]={kind:`input`,path:`resettable.${t.name}`,type:`boolean`,default:!1};let r=`{{ if .${QS(t.name)} }} {{ action "${n}" "โบ" }}{{ end }}`;if(t.control.kind===`inline`){e.segments[qS(t.name)]={template:`${t.control.template}${r}`};continue}let i=gC(t.name),a=y_(i.key,i.member);e.variables[i.key]=tl(i.key,Wc),e.actions[a]=nl(i.key,i.member),e.segments[qS(t.name)]={template:`${t.label} {{ .${t.effectiveVar} }} `+Qc(a,`โธ`,`โพ`)+r},e.segments[XS(t.name)]={template:t.control.template},t.beneath.forEach((n,r)=>{e.segments[ZS(t.name,r)]=n})}Object.assign(e.actions,iC.actions)}function NC(e){let{variables:t,actions:n}=iv();Object.assign(e.variables,t),Object.assign(e.actions,n)}function PC(e){let t=AC(e.globals.menuGlyph??`๐ซ`);NC(t);let n={...e.presets},r=[];for(let t of D_(e.presets)){let{node:i}=A_(e,t),a=TC(bC(i));r.push(a),n[t]={...k_(e.presets,t),root:a}}let i=Ub(t,r,e);return{...e,variables:{...i,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:n}}const FC=`${Su}live`,IC=[`โ live`,`โ live`],LC=`${Su}done`,RC=`${Su}cancel`,zC=`${Su}rewind`,BC=`${Su}changes`,VC=`(gt .${BC} 0)`,HC=`(or ${VC} (gt .${sC} 0))`,UC={variable:FC,key:FC,member:`open`};function WC(e){return`${Su}configuring.p${e}`}function GC(e){return`and ${Zc($_)} (not ${Zc(UC)}) (ne .${WC(e)} "true")`}function KC(e){return{kind:`template`,template:`{{ or ${e.map(e=>`(eq .${K_} "${Jc(e)}")`).join(` `)} false }}`}}function qC(e,t,n){return`{{ if ${GC(e)} }}${t}{{ else }}${n}{{ end }}`}const JC=`{{ and ${Zc($_)} .preset.customized }}`,YC=wu,XC=`${Su}addable`;function ZC(e){return new Map([[XC,{members:Object.keys(e.segments).filter(e=>!YC(e)),library:{groups:_u.map(e=>({id:e,label:vu[e]})),entry:t=>{let n=e.segments[t];return{group:n.group??`other`,...n.description!==void 0&&{description:n.description}}}}}]])}function QC(e,t,n){return n.segments[e]={template:t,when:ev,bg:bx},{kind:`segment`,name:e}}function $C(e,t,n){let r=`${Su}${e.presetIdent}.remove.${t}`;return e.artifacts.actions[r]={persist:e.rootKey,removeSegment:n},`{{ fg (${`readableOn (color "error") (bgOf) ${ka}`}) (action "${r}" "โ") }}`}function ew(e){return`{{ if ${Zc($_)} }}${e}{{ end }}`}function tw(e,t){return e.reduce((e,t)=>`{{ if and ${Zc($_)} ${Zc(t)} }}true{{ else }}${e}{{ end }}`,t)}function nw(e){return e.flatMap(e=>[...Ms(e)].flatMap(e=>e.kind===`segment`&&e.opens?.ref.key===`edit.configure`?[e.opens.ref]:[]))}function rw(e,t,n){return`${Z_}${e}.${t}.${n}`}function iw(e,t,n,r){let i=Os(n),a=`${Su}${e.presetIdent}`,o=Q_(e.presetIdent,i);e.configured.push(o);let s=`${a}.configure.${t}`;e.artifacts.actions[s]={set:K_,to:o};let c={},l=Object.entries(r).map(([r,o])=>{let s=rw(e.presetIdent,i,r),l=`${Z_}p${e.presetIdent}.d${t}.${r}`;e.artifacts.variables[l]={kind:`state`,key:s,default:Ks(n.settings?.[r]??o.default)},c[r]={id:i,key:s,variable:l};let u=`${a}.setting.${t}.${r}`,d=lx(sx(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:K_,key:K_,member:o},body:{kind:`container`,direction:`vertical`,children:l},drafts:c}}const aw=`${Su}label:`;function ow(e){if(e.startsWith(aw)){let t=e.slice(aw.length);return t.slice(t.indexOf(`:`)+1)}return e.startsWith(`edit.`)?void 0:e}function sw(e,t,n,r){let{artifacts:i}=n,a=Os(e),o=`${aw}${a}:${e.name}`;i.segments[o]={template:`{{ "${Jc(a)}" }}`,...t.palette!==void 0&&{palette:t.palette}};let s=e.settings?.[Vs];return{...Yc(o,r.ref,r.body,`drop`,tw([r.ref],`{{ ${GC(n.presetIdent)} }}`)),...s!==void 0&&{settings:{theme:s}},drafts:{[Vs]:r.drafts[Vs]}}}function cw(e,t,n,r){let{presetIdent:i,artifacts:a}=e,o=`${Su}${i}.insert.${t}`,s=`${Su}${i}.insertSeg.${t}`;a.actions[o]={persist:e.rootKey,insertSegmentFrom:XC,anchor:n,relation:r};let c=g_(o),l=__(s,o,void 0),u=b_(l),d=y_(l,c);return a.variables[l]=tl(l,Wc),a.variables[u]={kind:`state`,key:u,default:`0`},a.actions[d]=nl(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) ${ka}`}) $m }}{{ end }}`}}function lw(e,t){let n=[],r=e.children.findIndex(e=>e.kind===`segment`&&!YC(e.name)),i=e=>lw(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(YC(o.name)){n.push(s);continue}let c=Os(o),l=a===r?[cw(t,String(t.posCounter.n++),c,`before`)]:[],u=String(t.posCounter.n++),d=cw(t,u,c,`after`),f=$C(t,u,c),p=t.segments[o.name],m=iw(t,u,o,Hs(p)),h=ew(f),g=ew(m.term),_={kind:`container`,direction:`horizontal`,children:[...l.map(e=>QC(e.host,e.template,t.artifacts)),{...sw(o,p,t,m),lead:h,trail:g},{...s,when:qC(t.presetIdent,`false`,o.when??`true`),lead:h,trail:g,drafts:m.drafts},QC(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:tw(nw(n),qC(t.presetIdent,`true`,e.when))}}}function uw(e,t,n,r,i,a,o){let s=`${Su}${t}.resetLayout`,c=`${Su}${t}.customized`;return r.actions[s]={reset:n},r.segments[c]={template:`{{ action "${s}" "โบ reset layout" }}`,when:JC},{kind:`container`,direction:`vertical`,children:[{kind:`container`,direction:`horizontal`,children:[...i,{kind:`segment`,name:c},a]},dw(e,o)]}}function dw(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),dw(n,t)]}:{...e,children:[...e.children,t]}}function fw(e,t,n,r,i,a){let{node:o}=A_(e,t),s={presetIdent:yu(t),rootKey:px(t),segments:e.segments,artifacts:n,posCounter:{n:0},configured:[]},c=lw(o,s);return n.variables[WC(s.presetIdent)]=KC(s.configured),uw(c,s.presetIdent,s.rootKey,n,r,i,a)}function pw(e){let t={variables:{},actions:{},segments:{}},n=vx(`${Su}help`,Ex,[$_],t);t.variables[FC]=tl(FC,Wc),t.actions[FC]=nl(FC,UC.member),t.segments[FC]={template:Qc(FC,...IC),when:ev};let r={kind:`segment`,name:FC},i=n;t.variables[BC]={kind:`input`,path:`history.sinceEdit`,type:`number`,default:0},t.actions[LC]={do:[ES,...Y_]},t.segments[LC]={template:`{{ if ${HC} }}{{ action "${LC}" "โ save" }}{{ else }}{{ action "${LC}" "โ done" }}{{ end }}`,when:ev},t.actions[zC]={rewind:!0},t.actions[RC]={do:[zC,...Y_]},t.segments[RC]={template:`{{ action "${RC}" "โฉ cancel" }}`,when:`{{ and ${Zc($_)} ${VC} }}`};let a=[{kind:`segment`,name:LC},{kind:`segment`,name:RC}],o={...e.presets},s=[];for(let n of D_(e.presets)){let c=fw(e,n,t,a,r,i);s.push(c),o[n]={...k_(e.presets,n),root:c}}let c=Ub(t,s,e);return{...e,variables:{...c,...e.variables,...t.variables},actions:{...e.actions,...t.actions},segments:{...e.segments,...t.segments},presets:o}}const mw=[`set`,`persist`,`copy`,`open`,`reset`,`undo`,`redo`,`back`,`rewind`,`save`,`preset`,`doctor`,`ceiling`,`slash`,`do`];function hw(e){return e.ceiling===`set`?[`set`,e.to]:[`clear`]}function gw(e){return`from`in e||`int`in e||`insertSegmentFrom`in e}function _w(e,t){if(t===void 0)return{};if(!nc(t))return Q(e,`actions`,`actions must be an object, got ${rc(t)}`),{};let n=Object.create(null);for(let[r,i]of Object.entries(t)){let t=vw(e,`actions.${r}`,i);t!==null&&(n[r]=t)}return n}function Q(e,t,n){e.issues.push({path:t,message:n,line:W(e.source,t.split(`.`))})}function vw(e,t,n){if(!nc(n))return Q(e,t,`${t} must be an action object, got ${rc(n)}`),null;if(`persistWhen`in n)return Q(e,t,`${t}.persistWhen was removed: declare the \`set\` alone โ a session pick is a draft until a \`{ save: true }\` action writes every unsaved setting to the config file`),null;let r=mw.filter(e=>e in n);return r.length===1?yw[r[0]](e,t,n):(Q(e,t,`action must declare exactly one of: ${mw.join(`, `)}${r.length>1?` (found: ${r.join(`, `)})`:``}`),null)}const yw={set:(e,t,n)=>Zw(e,t,n,`set`,qw),persist:(e,t,n)=>Zw(e,t,n,`persist`,Jw),copy:bw(`copy`),open:bw(`open`),reset:xw,undo:Cw(`undo`),redo:Cw(`redo`),back:Cw(`back`),rewind:Cw(`rewind`),save:Cw(`save`),preset:ww,doctor:Tw,ceiling:Ew,slash:Dw,do:Ow};function bw(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);let i=Zs(t,n,r,e);return i===null?null:{[e]:i}}}function xw(e,t,n){for(let r of Object.keys(n))r!==`reset`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a reset action. Expected only: reset`);let r=kw(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 Sw={undo:`it steps the session's settings history`,redo:`it steps the session's settings history`,back:`it steps the session's navigation history`,rewind:`it steps the session's settings history back to where edit mode opened`,save:`it saves the session's unsaved settings`};function Cw(e){return(t,n,r)=>{for(let i of Object.keys(r))i!==e&&Q(t,`${n}.${i}`,`Unknown key "${i}" on a ${e} action. Expected only: ${e}`);return r[e]===!0?{[e]:!0}:(Q(t,`${n}.${e}`,`${e} must be the literal true (it takes no key โ ${Sw[e]}), got ${G(r[e])}`),null)}}function ww(e,t,n){let r=n.preset,i=r===`save`?[`preset`]:[`preset`,`name`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a preset action. Expected only: ${i.join(`, `)}`);if(r!==`save`&&r!==`delete`)return Q(e,`${t}.preset`,`preset must be "save" or "delete", got ${G(r)}`),null;if(r===`save`)return{preset:`save`};let a=Zs(e,t,n,`name`);return a===null?null:{preset:`delete`,name:a}}function Tw(e,t,n){let r=n.doctor,i=r===`run`?[`doctor`]:[`doctor`,`check`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a doctor action. Expected only: ${i.join(`, `)}`);if(r!==`run`&&r!==`fix`)return Q(e,`${t}.doctor`,`doctor must be "run" or "fix", got ${G(r)}`),null;if(r===`run`)return{doctor:`run`};let a=n.check;return typeof a!=`string`||Px(a)===void 0?(Q(e,`${t}.check`,`doctor fix must name a check (have: ${Mx.map(e=>e.name).join(`, `)}), got ${G(a)}`),null):{doctor:`fix`,check:a}}function Ew(e,t,n){let r=n.ceiling,i=r===`clear`?[`ceiling`]:[`ceiling`,`to`];for(let r of Object.keys(n))i.includes(r)||Q(e,`${t}.${r}`,`Unknown key "${r}" on a ceiling action. Expected only: ${i.join(`, `)}`);if(r===`clear`)return{ceiling:`clear`};if(r!==`set`)return Q(e,`${t}.ceiling`,`ceiling must be "set" or "clear", got ${G(r)}`),null;let a=n.to;return typeof a!=`string`||a.trim()===``?(Q(e,`${t}.to`,`ceiling set needs \`to\`: a memento ceiling value such as "+100_000", "400000" or "off", got ${G(a)}`),null):{ceiling:`set`,to:a}}function Dw(e,t,n){for(let r of Object.keys(n))r!==`slash`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a slash action. Expected only: slash`);let r=Kx(n.slash);return r.kind===`refused`?(Q(e,`${t}.slash`,r.reason),null):{slash:r.line}}function Ow(e,t,n){for(let r of Object.keys(n))r!==`do`&&Q(e,`${t}.${r}`,`Unknown key "${r}" on a do action. Expected only: do`);let r=n.do;return!Array.isArray(r)||r.length<2||r.some(e=>typeof e!=`string`||e===``)?(Q(e,`${t}.do`,`do must list at least two action names (the first is the click's face, the rest ride along in the same click), got ${G(r)}`),null):{do:r}}function kw(e,t,n,r,i,a){let o=Zs(e,t,r,n);if(o===null)return null;let s=`${t}.${n}`;return o===``?(Q(e,s,i),null):o.includes(`/`)?(Q(e,s,a(o)),null):o}const Aw={set:`the SessionState key to write`,persist:`the config globals field to write`};function jw(e,t,n,r){let i=Aw[r],a=kw(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 Mw(e){return e===`set`?`set-state`:`set-config`}const Nw={to:Qw(`set`)},Pw={to:Qw(`persist`)},Fw={from:$w(`set`)},Iw={from:$w(`persist`)},Lw={min:iT(),max:iT(),by:iT()},Rw={int:tT()},zw={cycle:eT(`set`)},Bw={cycle:eT(`persist`)},Vw={removeSegment:nT(`removeSegment`)},Hw={insertSegment:nT(`insertSegment`),anchor:nT(`anchor`),relation:rT()},Uw={insertSegmentFrom:$w(`persist`),anchor:nT(`anchor`),relation:rT()},Ww={ok:e=>e.min<e.max,issue:e=>({field:`min`,message:`min (${e.min}) must be less than max (${e.max})`})},Gw={ok:e=>e.by!==0,issue:()=>({field:`by`,message:`by must be a non-zero integer (the per-click increment; negative steps down)`})};function Kw(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 qw=[Kw(`set`,Nw),Kw(`set`,Fw),Kw(`set`,Lw,[Ww,Gw]),Kw(`set`,Rw),Kw(`set`,zw)],Jw=[Kw(`persist`,Pw),Kw(`persist`,Iw),Kw(`persist`,Lw,[Ww,Gw]),Kw(`persist`,Bw),Kw(`persist`,Vw),Kw(`persist`,Hw,[],[`insertSegment`]),Kw(`persist`,Uw,[],[`insertSegmentFrom`])];function Yw(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 Xw(e){let t=Yw(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 Zw(e,t,n,r,i){let a=jw(e,t,n,r),o=i.filter(e=>e.detect.some(e=>e in n));if(o.length!==1)return Q(e,t,`${Xw(r)}${o.length>1?` โ found: ${o.map(e=>e.label).join(`, `)}`:``}`),null;let s=o[0];for(let i of Object.keys(n))s.allowed.includes(i)||Q(e,`${t}.${i}`,`Unknown key "${i}" on this ${r} action. Expected one of: ${s.allowed.join(`, `)}`);let c=s.parse(e,t,n);return a===null||c===null?null:{...a,...c}}function Qw(e){let t=Mw(e);return{required:!0,json:{type:`string`},parse:(n,r,i,a)=>kw(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 $w(e){let t=Mw(e);return{required:!0,json:{anyOf:[{type:`string`,minLength:1},{type:`array`,items:{type:`string`,minLength:1},minItems:1,uniqueItems:!0}]},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(typeof o==`string`){if(o===``){Q(n,s,`${i} must be a non-empty domain name`);return}return o}if(Array.isArray(o)&&o.every(e=>typeof e==`string`)){let r=o;if(r.length===0){Q(n,s,`${i} must name a domain (a non-empty string) or declare an inline domain (a non-empty array of values)`);return}if(r.some(e=>e===``)){Q(n,s,`${i} array members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}let a=r.filter(e=>e.includes(`/`));if(a.length>0){Q(n,s,`${i} array member(s) ${a.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(r).size!==r.length){Q(n,s,`${i} array members must be unique โ a duplicated value would render the same picker option twice`);return}return r}Q(n,s,`${i} must be a domain name (a string) or an inline domain (an array of strings), got ${G(o)}`)}}}function eT(e){let t=Mw(e);return{required:!0,json:{type:`array`,items:{type:`string`,minLength:1},minItems:2,uniqueItems:!0},parse:(n,r,i,a)=>{let o=a[i],s=`${r}.${i}`;if(!Array.isArray(o)||o.some(e=>typeof e!=`string`)){Q(n,s,`cycle must be an array of strings (the enumerated values a click steps through), got ${rc(o)}`);return}let c=o;if(c.length<2){Q(n,s,`cycle needs at least two members (one member has no successor โ use a literal "to")`);return}let l=c.some(e=>e===``),u=c.filter(e=>e.includes(`/`));if(l){Q(n,s,`cycle members must be non-empty โ an empty value cannot be delivered on the ${t} wire`);return}if(u.length>0){Q(n,s,`cycle member(s) ${u.map(e=>`"${e}"`).join(`, `)} contain "/" โ ${e} values must be slash-free`);return}if(new Set(c).size!==c.length){Q(n,s,`cycle members must be unique โ the successor of a duplicated member is ambiguous`);return}return c}}}function tT(){return{required:!0,json:{const:!0},parse:(e,t,n,r)=>{if(r[n]!==!0){Q(e,`${t}.${n}`,`int must be the literal true (declares the key an unbounded integer cursor โ a paged picker's page key), got ${G(r[n])}`);return}return!0}}}function nT(e){return{required:!0,json:{type:`string`},parse:(t,n,r,i)=>{let a=Zs(t,n,i,r);if(a===null)return;let o=`${n}.${r}`;if(a===``){Q(t,o,`${e} must be non-empty (a segment name)`);return}if(a.includes(`/`)||a.includes(`:`)){Q(t,o,`${e} "${a}" contains "/" or ":" โ segment names in a layout op must be free of both (the click wire's own delimiter and layout-ops.ts's op-token delimiter)`);return}return a}}}function rT(){return{required:!0,json:{enum:[`before`,`after`]},parse:(e,t,n,r)=>{let i=r[n];if(i!==`before`&&i!==`after`){Q(e,`${t}.${n}`,`relation must be "before" or "after", got ${G(i)}`);return}return i}}}function iT(){return{required:!0,json:{type:`integer`},parse:(e,t,n,r)=>{let i=r[n];if(typeof i!=`number`||!Number.isInteger(i)){Q(e,`${t}.${n}`,`${n} must be an integer, got ${G(i)}`);return}return i}}}function aT(e,t,n){return`${e}: "${t}" is an endcaps shape, not a style โ endcaps were renamed from "style" to "endcaps"; write ${n}: "${t}"`}const oT={noun:`style key`,fields:{hueShift:vc(),chromaScale:vc({min:0}),lightnessScale:vc(),lightnessShift:vc()}};function sT(e,t){if(!nc(t))return e.issues.push({path:`styles`,message:`styles must be an object mapping style names to adaptation objects, got ${rc(t)}`,line: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(po(r)){e.issues.push({path:`styles.${r}`,message:aT(`styles.${r}`,r,`globals.endcaps`),line:W(e.source,[`styles`,r])});continue}let t=ic(e,oT,`styles.${r}`,i);t!==null&&(n[r]={...zn,...t})}return n}const cT={noun:`preset key`,fields:{root:{required:!1,json:{$ref:`#/definitions/RootFragment`},parse:(e,t,n,r)=>r[n]===void 0?void 0:fd(e,`${t}.${n}`,r[n])},globals:{required:!1,json:El(),parse:(e,t,n,r)=>r[n]===void 0?void 0:Tl(e,`${t}.${n}`,r[n])}}};function lT(e,t){if(!nc(t))return e.issues.push({path:`presets`,message:`presets must be an object mapping preset names to config fragments, got ${rc(t)}`,line: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=ic(e,cT,`presets.${r}`,i);t!==null&&(n[r]=t)}return n}function uT(e,t){if(t===void 0)return{};if(!nc(t))return e.issues.push({path:`helpers`,message:`helpers must be an object, got ${rc(t)}`,line: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 dT=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 fT(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 pT(e){let t=dT.get(e);return t===void 0?void 0:`variables.${e} is no longer read: ${fT(t)}`}function mT(e){let t=dT.get(e);return t===void 0?``:` โ ".${e}" is no longer a variable: ${fT(t)}; a "${t.segment}" template reads it as ".settings.${t.setting}"`}function hT(e,t){let n=new Map;for(let e of Object.keys(t)){let t=yu(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 gT(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||io(i)||Object.prototype.hasOwnProperty.call(t.styles,i))continue;let r=`${n.join(`.`)}.style`;e.issues.push({path:r,message:po(i)?aT(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`])}),hT(e,t.presets);let i=ix(t);for(let[n,r]of Object.entries(t.actions))`set`in r&&Lb.has(r.set)&&e.issues.push({path:`actions.${n}.set`,message:`actions.${n} sets "${r.set}", which has no session pick โ globals.${r.set} is set in the config file only, so a click would change nothing; write it with { persist: "${r.set}", โฆ } instead`,line:W(e.source,[`actions`,n,`set`])}),!(!(`set`in r)||!(`from`in r)||typeof r.from!=`string`)&&(ax(i).includes(r.from)||e.issues.push({path:`actions.${n}.from`,message:`actions.${n} from: references unknown option domain "${r.from}" (have: ${ax(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&&gw(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=hx(i);if(o===null){e.issues.push({path:`actions.${n}.${a}`,message:`actions.${n}: "${i}" is not a config globals field (have: ${Al().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=_T.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`){vT(e,t,n,a,i,o.preset,r);continue}if(o.scope===`preset-globals`&&!D_(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: ${D_(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(`, `)})${Ou(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=Cv(t);for(let t of a.names)t!==`settings`&&!t.startsWith(yT)||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)=>{xC(t)>1&&e.issues.push({path:n,message:`${n} places the global settings menu anchor "${dS}" ${xC(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}),SC(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&&(jT(e,`${o}.when`,i.when,a,{line:n}),AT(e,`${o}.when`,i.when,n)),i.kind===`segment`){if(vC(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${Ou(i.name)}`,line:n}),DT(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 D_(t.presets)){let{node:n,path:r}=A_(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)){OT(e,`variables.${n}`,r,a);let t=pT(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))OT(e,`segments.${n}.vars.${t}`,i,a,n);let i=Hs(r);xT(e,n,i);let o=bT(a,i);for(let a of[`template`,`bg`,`fg`,`when`]){let s=r[a];if(typeof s==`string`){jT(e,`segments.${n}.${a}`,s,o,{segCtx:n,settings:i});for(let{name:r,site:i,via:o}of xv(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){MT(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))kT(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))kT(e,`segments.${n}.vars.${t}`,i,a,n)}const _T=[`removeSegment`,`insertSegment`,`insertSegmentFrom`];function vT(e,t,n,r,i,a,o){let s=`actions.${n}.${r}`,c=W(e.source,[`actions`,n,r]);if(!D_(t.presets).includes(a)){e.issues.push({path:s,message:`actions.${n}: "${i}" names preset "${a}" which is not declared (have: ${D_(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(`, `)})${Ou(i)}`,line:c})},p=new Set(ks(A_(t,a).node)),m=(r,i)=>{!Du.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${Ou(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 yT=`settings.`;function bT(e,t){return{...e,names:new Set([...e.names,...Object.keys(t).map(e=>yT+e)])}}function xT(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=wT(n);for(let{setting:e,message:t}of a)i(e,t);if(!(a.length>0))for(let{setting:e,message:t}of Ws(n,CT(n)))i(e,`the defaults do not stand together: ${t}`)}function ST(e){return wT(e).length>0||Ws(e,CT(e)).length>0}function CT(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.default]))}function wT(e){let t=t=>Us(TT(e,t))?.atLeast;return Object.keys(e).flatMap(n=>{let r=t(n);if(r===void 0)return[];if(r===n||Us(TT(e,r))===void 0)return[{setting:n,message:`atLeast "${r}" must name another range setting of this segment (its range settings: ${ET(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 TT(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0}function ET(e,t){return Object.entries(e).filter(([e,n])=>e!==t&&Us(n)!==void 0).map(([e])=>e)}function DT(e,t,n,r,i){let a=Object.prototype.hasOwnProperty.call(t.segments,n.name)?t.segments[n.name]:void 0;if(a===void 0)return;let o=Hs(a),s=`${r}: placement "${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(`, `)})`:Gs(c,a)?void 0:`sets "${t}" to ${JSON.stringify(a)}${c.domain===`theme`?Ya(a):``}, but it must be ${Js(c)}`;l!==void 0&&e.issues.push({path:r,message:`${s} ${l}`,line:i})}let c=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,n.settings?.[e]??t.default]));if(!(!Object.entries(c).every(([e,t])=>Gs(o[e],t))||ST(o)))for(let{message:t}of Ws(o,c))e.issues.push({path:r,message:`${s}: ${t}`,line:i})}function OT(e,t,n,r,i){n.kind===`template`&&jT(e,`${t}.template`,n.template,r,{segCtx:i}),zs(n)&&n.cache&&`key`in n.cache&&jT(e,`${t}.cache.key`,n.cache.key,r,{segCtx:i})}function kT(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 AT(e,t,n,r){try{W_.parse(n)}catch(n){e.issues.push({path:t,message:`Template parse error in ${t}: ${n.message}`,line:r})}}function jT(e,t,n,r,i){for(let[a,o]of _v(n,r.helpers)){if(Sv(a,r))continue;if(a.startsWith(yT)){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){MT(e,o,`Template references unknown variable ".${a}"${mT(a)}`);continue}let n=i?.segCtx===void 0?void 0:`${i.segCtx}.${a}`,s=n!==void 0&&Sv(n,r)?` (segment-local vars are namespaced โ write ".${n}")`:mT(a);e.issues.push({path:t,message:`Template references unknown variable ".${a}"${s}`,line:i?.line??W(e.source,t.split(`.`))})}}function MT(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 NT(e,t){let{graph:n,nodeInfo:r}=PT(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 PT(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 _v(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 FT=[`json5`,`json`];function IT(e){try{return r.statSync(e,{throwIfNoEntry:!1})===void 0?`absent`:`present`}catch(t){return{path:e,error:t.message}}}function LT(e){return e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`)?m.homedir()+e.slice(1):e}function RT(e,t,n){if(n!==void 0)return[n];let r=t??process.cwd();return[...new Set([...e?FT.map(t=>c.join(e,`.cc-candybar.${t}`)):[],...FT.map(e=>c.join(r,`.cc-candybar.${e}`)),...FT.map(e=>`${zT()}.${e}`)])]}function zT(){let e=process.env.XDG_CONFIG_HOME??c.join(m.homedir(),`.config`);return c.join(e,`cc-candybar`,`config`)}function BT(e,t,n){let r=[];for(let i of RT(e,t,n)){let e=IT(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 VT(e,t,n){let r=BT(e,t,n);return r.kind===`default`?`${zT()}.${FT[0]}`:r.path}function HT(e){return UT(e).join(`
|
|
159
|
+
`)||null}function UT(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 WT(e,t){let n=RT(e,t).filter(e=>IT(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 GT(e,t,n){return e===null?{...qT,config:Bc(qT.raw,t)}:KT(e,r.readFileSync(e,`utf-8`),t,n)}function KT(e,t,n,r){let i={source:t,...XT(e,t,r,Hu(n))};return{...i,config:Bc(i.raw,n)}}const qT={raw:{},source:``,warnings:[]};function JT({config:e,raw:t,source:n},r=`<config>`,i=new Set(Qa())){let a=[],o={source:n,issues:a,allowedPalettes:i,groups:[]};if(gT(o,e,t),NT(o,e),a.length>0)throw new xs(r,a);let s=U_(e,a);if(a.length>0)throw new xs(r,a);return pw(PC(s))}function YT(e,t,n=new Set(Qa()),r=ZT){return XT(e,t,n,r).raw}function XT(e,t,n,r){let i=QT(e,t),a=ws(e,t),o=a===null?[]:[a],s=[],c={source:t,issues:s,allowedPalettes:n??new Set(Qa()),groups:[]};if(!nc(i))throw new xs(e,[{path:``,message:`Config root must be an object, got ${rc(i)}`}],o);let l=$T(c,i,r);if(s.length>0)throw new xs(e,s,o);return{raw:l,warnings:o}}const ZT=new Set;function QT(e,t){try{return tt.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 $T(e,t,n){for(let n of Object.keys(t))eE.has(n)||e.issues.push({path:n,message:`Unknown top-level key "${n}". Expected one of: ${[...eE].join(`, `)}`,line:W(e.source,[n])});let r={};return t.globals!==void 0&&(r.globals=wl(e,`globals`,t.globals)),t.variables!==void 0&&(r.variables=Wl(e,`variables`,t.variables)),t.segments!==void 0&&(r.segments=Uu(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=fd(e,`root`,t.root)),t.actions!==void 0&&(r.actions=
|
|
162
|
+
Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=fd(e,`root`,t.root)),t.actions!==void 0&&(r.actions=_w(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=sT(e,t.styles)),t.presets!==void 0&&(r.presets=lT(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=Dl(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=uT(e,t.helpers)),bd(e,r),V_(e,r),rv(e,r),Eu(e,r,K,`the global settings menu`),r}const eE=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function tE(e){let t=sE(e.termCols),n=sE(e.termRows),r=cE(e.ssh),i=aE(e.tmux),a=iE(e.configEnv),o=rE(e.claudeConfigDir),s=nE(e.mementoEnv);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o},...s!==void 0&&{mementoEnv:s}}}function nE(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=Ye.filter(e=>t[e]!==void 0);return n.every(e=>rE(t[e])!==void 0)?Object.fromEntries(n.map(e=>[e,t[e]])):void 0}function rE(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function iE(e){return typeof e==`string`&&e!==``?LT(e):void 0}function aE(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 oE=1e4;function sE(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>oE?oE:t}function cE(e){return typeof e==`boolean`?e:void 0}var lE=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function uE(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function dE(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 lE(`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 lE(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function fE(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=dE(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(uE(t))})}async function pE(e,t,n){let r=null;try{r=await vE(Ie(),t.connectMs);let i=await fE(r,{v:3,...e},t.budgetMs);return gE(e.kind,i,n)}catch(e){return _E(e)}finally{r&&r.destroy()}}function mE(e,t){return typeof e==`string`?e:t}function hE(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function gE(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=mE(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:hE(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 _E(e){if(e instanceof lE||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 vE(e,t){return new Promise((n,r)=>{let i=b.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 yE(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 bE={connectMs:50,budgetMs:150},xE={connectMs:50,budgetMs:200};function SE(e){let t=e.output;return typeof t==`string`?t:void 0}function CE(e,t,n,r){return pE({kind:`render`,hookData:e,args:t,cwd:n,...r},bE,SE)}function wE(e,t){return pE({kind:`click`,verb:e,value:t},xE,SE)}function TE(e){let t=[];for(let n of e){let e=n.read();if(e.kind===`text`)return`# memory report from: ${n.name}\n${e.text}`;t.push(`# ${n.name}: unavailable โ ${e.reason}`)}return[`# memory report: no probe answered`,...t.length>0?t:[`# no probe is known for this platform`]].join(`
|
|
163
163
|
`)}function EE(e,t){return e===`darwin`?[DE(`footprint`,[`-p`,String(t)]),DE(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[OE(`/proc/self/smaps_rollup`),OE(`/proc/self/status`)]:[]}function DE(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=ke({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}`}${kE(n.stderr)}`}}}}function OE(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 kE(e){let t=e.split(`
|
|
164
|
-
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const AE=`CC_CANDYBAR_RSS_LIMIT_MB`;function jE(e){let t=e[AE];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${AE} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function ME(e){return jE(e)*2}const NE=1024*1024;function PE(e){return jE(e)*NE}const FE={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function IE(e,t,n){let{prefix:r,suffix:i}=FE[t];return c.join(e,`${r}${n}${i}`)}function LE(e){for(let t of Object.keys(FE)){let{prefix:n,suffix:r}=FE[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function RE(e){let t=e.rssLimitBytes??512*NE,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 zE(e.log,`memory report`,()=>{let t=IE(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),zE(e.log,`heap snapshot`,()=>{let t=IE(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),zE(e.log,`artifact rotation`,()=>{VE(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 zE(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function BE(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=LE(t);if(n===null)return t;let{prefix:r,suffix:i}=FE[n];return t.slice(r.length,t.length-i.length)}function VE(e,t,n){let r=new Map;for(let t of e){let e=BE(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 HE(e,t,n={}){let i=Fe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:
|
|
165
|
-
`)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function qE(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function JE(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function YE(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 XE(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 ZE(){try{r.unlinkSync(Ke())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function QE(){let e=Ge(),n=Ke(),r=YE(n),i=qE($E(e),JE(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`),eD(e),XE(n,Math.min(r+1,5)),!0)}function $E(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function eD(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 tD=null;function nD(){let e=We();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 tD={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(!rD(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 rD(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function iD(){if(!tD)return;let{fd:e,path:t}=tD;tD=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function aD(){try{return r.mkdirSync(Fe(),{recursive:!0}),null}catch(e){return`mkdir ${Fe()}: ${e.message}`}}function oD(){let e=t.execPath,n=t.argv[1];return n?Ae({bin:e,args:[`--max-old-space-size=${ME(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const sD=`cc-candybar`,cD=`dispatch`,lD=`set-state`,uD=`step-state`,dD=`copy`,fD=`open-vscode`,pD=`toolbar-toggle`,mD=`show-config-error`,hD=`show-config-warning`,gD=`set-config`,_D=`step-config`,vD=`save`,yD=`save-preset`,bD=`delete-preset`,xD=`reset-config`,SD=`apply-layout-op`,CD=`undo`,wD=`redo`,TD=`back`,ED=`rewind`,DD=`apply-update`,OD=`doctor-run`,kD=`doctor-fix`,AD=`ceiling`,jD=`slash`;function MD(e){return e.map(encodeURIComponent).join(`/`)}function ND(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function PD(e){return`${sD}://${cD}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${MD(e.args)}`)}`).join(`&`)}`}function FD(e){return new re(e).getAll(`e`).map(zD)}const ID=new Set([lD,xD]);function LD(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&RD(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function RD(e,t){if(e.verb!==t.verb||!ID.has(e.verb))return;let[n,r]=[zD(e.value),zD(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function zD(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const BD=`1.113.
|
|
164
|
+
`).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const AE=`CC_CANDYBAR_RSS_LIMIT_MB`;function jE(e){let t=e[AE];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${AE} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function ME(e){return jE(e)*2}const NE=1024*1024;function PE(e){return jE(e)*NE}const FE={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function IE(e,t,n){let{prefix:r,suffix:i}=FE[t];return c.join(e,`${r}${n}${i}`)}function LE(e){for(let t of Object.keys(FE)){let{prefix:n,suffix:r}=FE[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function RE(e){let t=e.rssLimitBytes??512*NE,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 zE(e.log,`memory report`,()=>{let t=IE(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),zE(e.log,`heap snapshot`,()=>{let t=IE(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),zE(e.log,`artifact rotation`,()=>{VE(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 zE(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function BE(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=LE(t);if(n===null)return t;let{prefix:r,suffix:i}=FE[n];return t.slice(r.length,t.length-i.length)}function VE(e,t,n){let r=new Map;for(let t of e){let e=BE(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 HE(e,t,n={}){let i=Fe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Z,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>TE(EE(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>te.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>LE(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function UE(e={}){if(aD()!==null)return;let n=e.spawn??oD,r=nD();if(r.kind===`contended`){let e=GE();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) โ spawning unlocked\n`),WE(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) โ spawning unlocked\n`),WE(n);return}try{WE(n)}finally{iD()}}function WE(e){QE()&&KE(e)}function GE(){try{let e=r.statSync(We());return Date.now()-e.mtimeMs}catch{return null}}function KE(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 qE(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function JE(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function YE(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 XE(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 ZE(){try{r.unlinkSync(Ke())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function QE(){let e=Ge(),n=Ke(),r=YE(n),i=qE($E(e),JE(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`),eD(e),XE(n,Math.min(r+1,5)),!0)}function $E(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function eD(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 tD=null;function nD(){let e=We();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 tD={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(!rD(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 rD(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function iD(){if(!tD)return;let{fd:e,path:t}=tD;tD=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function aD(){try{return r.mkdirSync(Fe(),{recursive:!0}),null}catch(e){return`mkdir ${Fe()}: ${e.message}`}}function oD(){let e=t.execPath,n=t.argv[1];return n?Ae({bin:e,args:[`--max-old-space-size=${ME(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const sD=`cc-candybar`,cD=`dispatch`,lD=`set-state`,uD=`step-state`,dD=`copy`,fD=`open-vscode`,pD=`toolbar-toggle`,mD=`show-config-error`,hD=`show-config-warning`,gD=`set-config`,_D=`step-config`,vD=`save`,yD=`save-preset`,bD=`delete-preset`,xD=`reset-config`,SD=`apply-layout-op`,CD=`undo`,wD=`redo`,TD=`back`,ED=`rewind`,DD=`apply-update`,OD=`doctor-run`,kD=`doctor-fix`,AD=`ceiling`,jD=`slash`;function MD(e){return e.map(encodeURIComponent).join(`/`)}function ND(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function PD(e){return`${sD}://${cD}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${MD(e.args)}`)}`).join(`&`)}`}function FD(e){return new re(e).getAll(`e`).map(zD)}const ID=new Set([lD,xD]);function LD(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&RD(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function RD(e,t){if(e.verb!==t.verb||!ID.has(e.verb))return;let[n,r]=[zD(e.value),zD(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function zD(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const BD=`1.113.2`,VD=/^[A-Za-z0-9_./,:@%+-][A-Za-z0-9_./,:@%+=-]*$/;function HD(e){return`'${e.replaceAll(`'`,`'\\''`)}'`}function UD(e){return VD.test(e)?e:HD(e)}const WD=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function GD(e){let t=WD.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 KD(e){return e.join(`.`)}function qD([e,t,n],[r,i,a]){return e-r||t-i||n-a}const JD=`@promptctl/cc-candybar`;async function YD(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`?GD(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function XD(e,t){let n=GD(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=qD(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 ZD(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`โ cc-candybar ${KD(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${KD(t.installed)} is newer than the registry's latest release (${KD(t.latest)}): an unpublished build.\n`};case`stale`:{let n=KD(t.latest);return{stream:`stderr`,text:`โ cc-candybar ${KD(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 QD=`CCCandybarURLHandler`,$D=[],eO={"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 tO(e,t){return[e,...t].map(UD).join(` `)}function nO(){return c.join(m.homedir(),`Applications`,`${QD}.app`)}function rO(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function iO(){if(process.platform===`darwin`)return c.join(m.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(m.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function aO(){return c.join(iO(),`bin`,`cc-candybar`)}function oO(){return c.join(iO(),`dist`,`index.mjs`)}function sO(e,t){return[`on open location L`,`\tdo shell script "'${e.replace(/"/g,`\\"`)}' '${t.replace(/"/g,`\\"`)}' url-handle " & quoted form of L`,`end open location`].join(`
|
|
166
166
|
`)}function cO(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 lO(t){let n=eO[`${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 uO(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function dO(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 ${JD}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function fO(){let e=cO(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=lO(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(oO()),{recursive:!0}),r.mkdirSync(c.dirname(aO()),{recursive:!0}),uO(e,oO()),uO(t.sourcePath,aO()),r.chmodSync(aO(),493),r.rmSync(c.join(iO(),`url-handler.mjs`),{force:!0});let n=dO(aO());return process.stdout.write(`Staged cc-candybar v${BD} runtime at ${iO()}\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:aO(),distPath:oO(),entryKind:n}}function pO(){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>${sD}</string>`,` </array>`,` </dict>`,`</array>`].join(`
|
|
167
167
|
`)}]}function mO(e){let t=nO();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=ke({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,sO(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 pO())ke({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of pO()){let n=ke({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 ${sD}:// with Launch Services\n`);let a=ke({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(`โ ${QD}.app installed and registered.\n`),process.stdout.write(` Test: open '${sD}://hello-world' && pbpaste\n`)}function hO(){rO(),mO(fO().distPath)}function gO(e,t=sD){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:dD,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function _O(e){e||(process.stderr.write(`url-handle: missing URL argument.
|
|
168
|
-
`),process.exit(1));let t;try{t=gO(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await
|
|
168
|
+
`),process.exit(1));let t;try{t=gO(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await wE(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(UE(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(vO(n)+`
|
|
169
169
|
`),process.exit(1)}function vO(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 yO(){return`โ install complete.
|
|
170
170
|
Restart Claude Code to pick up the new statusline.
|
|
171
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 bO(e){let t=e.includes(`--force`),n=e.filter(e=>e!==`--force`),r=n.length>0?n:[...$D],i=fO();process.platform===`darwin`?mO(i.distPath):process.stdout.write(`Skipping URL handler (cmd-click verbs are macOS-only).
|
|
172
|
-
`),xO(i.binPath,r,t),process.stdout.write(yO());let a=ZD(JD,XD(BD,await YD(JD,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function xO(e,t,n,i){let a=i
|
|
172
|
+
`),xO(i.binPath,r,t),process.stdout.write(yO());let a=ZD(JD,XD(BD,await YD(JD,fetch,`https://registry.npmjs.org`)));process[a.stream].write(a.text)}function xO(e,t,n,i){let a=i??$x(Qx(Zx(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,UD(e),HD(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:tO(e,t)},je(a,JSON.stringify(o,null,2)),process.stdout.write(`Updated ${a}\n`)}function SO(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 CO(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 wO(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 TO(e,t){let n=CO(e);if(n.kind===`owned`&&n.pid===t)try{r.unlinkSync(e)}catch{}}function EO(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 DO(e,t,n,r){let i=OO(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 OO(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 kO(e){let t=!1;function n(){let n=DO(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 AO(e,t=ke){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 jO(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 MO(e,t=AO){let n=t(e);return n.kind===`start`?n.token:null}const NO=`CC_CANDYBAR_PARENT_PID`;function PO(e){let t=e[NO];if(t===void 0)return{kind:`outlives-nobody`};let n=Number.parseInt(t,10);if(!Number.isInteger(n)||n<=0)throw Error(`${NO} must be a positive integer pid, got ${JSON.stringify(t)}`);return{kind:`anchored`,pid:n}}function FO(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 IO(e){try{return t.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function LO(){let e=Number(process.env.CC_CANDYBAR_DAEMON_CEILING??``);return Number.isInteger(e)&&e>0?e:16}function RO(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 zO(e){try{return r.readdirSync(e).filter(e=>e.endsWith(`.json`)).map(t=>c.join(e,t))}catch{return[]}}function BO(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 VO(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 HO(e){if(!e.isolated)return{decision:RO(!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=RO(!0,VO(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 WO(e,t={}){return{isolated:!!process.env.CC_CANDYBAR_SOCKET,registryDir:Ue(),ceiling:LO(),pid:process.pid,startTime:e,isSameLiveProcess:(e,t)=>jO(e,t,{readStartTime:AO,pidAlive:IO}),listFiles:zO,readEntry:BO,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?Le:e=>{Le(c.dirname(e)),Le(e)},...t}}function GO(e){return e<32||e===127||e>=128&&e<=159}function KO(e){let t=``;for(let n of e)t+=GO(n.codePointAt(0)??0)?` `:n;return t.replace(/\s+/g,` `).trim()}function qO(e,t){let n=KO(e),r=``,i=0;for(let e of n){if(i===t)return r.replace(/.$/u,`โฆ`);r+=e,i++}return r}const JO=`\x1B[38;2;255;255;255m`,YO=`\x1B[48;2;200;40;40m`;function XO(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 ZO={fg:XO(JO),bg:XO(YO)},QO={fg:XO(`\x1B[38;2;0;0;0m`),bg:XO(`\x1B[48;2;220;160;40m`)},$O={unicode:zi,ascii:{glyph:`>`,divider:`|`,lead:`<`,tail:`>`}},ek={unicode:{},ascii:{left:`(`,right:`)`}};function tk(e,t,n){switch(e){case`capsule`:return new Gi(ek[t]);case`plain`:return new Ki(n===void 0?{}:{separator:n});case`powerline`:return new Hi($O[t]);default:return e}}const nk=new Map;function rk(e){let t=JSON.stringify([e.endcaps,e.charset,e.separator??null]),n=nk.get(t);if(n!==void 0)return n;let r=tk(e.endcaps,e.charset,e.separator),i=e=>new H(`x`,{end:``,overflow:`ignore`,style:new B({bgcolor:e})}),a=e=>new H(Yi(new U(e,r),{colorSystem:null}).replace(/\n$/,``)).cellLength,o=a([i(`#101010`)]),s={chrome:o-1,seam:a([i(`#101010`),i(`#202020`)])-o-1};return nk.set(t,s),s}function ik(e){return rk(e).chrome}function ak(e){return rk(e).seam}function ok(e,t){if(e.length===0)return``;let n=tk(t.endcaps,t.charset,t.separator),r=t.colorCompatibility,i=t.wrap&&Number.isFinite(t.width)?Yi(new ta([...e],{joiner:n}),{width:t.width,colorSystem:r}):Yi(new U([...e],n),{colorSystem:r});if(!i.endsWith(`
|
|
173
173
|
`))throw Error(`renderStripCells: rich-js strip output did not end its last line`);return i.slice(0,-1)}function sk(e){return Math.min(20,e??20)}const ck={heading:`ERROR`,glyph:`โ `,colors:ZO},lk={heading:`WARNING`,glyph:`โ `,colors:QO},uk={heading:`UPDATE`,glyph:`โฌ`,colors:QO};function dk(e,t){return{text:KO(e),link:t}}function fk(e,t,n){let[r,...i]=[pk(e,ck,mD),t,pk(n,lk,hD)].flat();return r===void 0?null:{channels:[r,...i]}}function pk(e,t,n){let r=PD([{verb:n,args:[e]}]),[i,...a]=e.split(/\r\n|\r|\n/).map(e=>dk(e,r)).filter(e=>e.text!==``).map(e=>[e]);return i===void 0?[]:[{severity:t,message:e,lines:[i,...a]}]}function mk(e){return e.channels.map(e=>`${e.severity.heading}\n${e.message}\n`).join(`
|
|
174
174
|
`)}function hk(e,t,n,r){if(t===null)return e;let i=gk(r),a=t.channels.flatMap(e=>_k(e,i)),o=n.failedConfigFile!==null||a.length>r.rowCap,s=a.slice(0,r.rowCap-Number(o)),c=o?[vk(t,n,a.length-s.length,i)]:[],l=[...s,...c].join(`
|
|
175
175
|
`);return e?`${l}\n${e}`:l}function gk(e){return{endcaps:`plain`,separator:``,width:e.width,wrap:!0,padding:0,charset:`unicode`,colorCompatibility:e.colorCompatibility}}function _k(e,t){let n=new B({bgcolor:e.severity.colors.bg,color:e.severity.colors.fg}),r=Bt(Math.max(2,t.width-1)),i=(e,t)=>new H(`${e} `,{style:t,end:``,overflow:`ignore`});return e.lines.flatMap((a,o)=>ok([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=>Ut(e,r)).map(e=>i(e,t))})],t).split(`
|
|
176
|
-
`))}function vk(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(D(a.path).href)):c(`full text unavailable: ${KO(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` ยท `:``}open `,s),c(KO(o),s.withLink(D(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`,ok([m],r)}const yk=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function bk(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function xk(e,t){return r.readdirSync(t).filter(yk).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?xk(e,i):[[c.relative(e,i).split(c.sep).join(`/`),bk(i,a)]]})}function Sk(e){let t=ie.createHash(`sha256`);for(let[n,r]of xk(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const Ck=e=>e.slice(0,7);function wk(e){return c.dirname(c.dirname(e))}function Tk(){return{version:BD,digest:`3119132a49fa0de494aafe3b172b6df51bfe7a686217e285ea40629d722154eb`}}function Ek(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 Dk(e,t){try{let n=wk(E(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=Sk(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:Ek(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 Ok(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function kk(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 Ak(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 jk=/^-?\d+$/;function Mk(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 Nk(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!jk.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 Pk(e,t,n){return r=>r?jk.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 Fk(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=>!jk.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 Ik(e){return e===`config`?`set-config`:`set-state`}function Lk(e,t,n){return t.kind===`int`?Nk(`menu page "${e}"`):t.kind===`range`?Pk(t.min,t.max,`${n} stepper "${e}"`):Mk(t.allowed,`${n} "${e}"`,Ik(n))}function Rk(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:Fk(e,n,t)}))}function zk(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of Rk(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" โ the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,Lk(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function Bk(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};zk(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=zk(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const Vk=Bk({},`config`,Jk);function Hk(e,t){return Vk.register(e,t)}function Uk(e){return Vk.gateFor(e)}function Wk(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:rx(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:[Ok({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[Ok({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:rx(e.insertSegmentFrom,t).members.map(t=>Ok({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function Gk(e,t){let n=Ml(e).get(t);return n===void 0?null:String(n)}function Kk(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?fx(n.persist):null;e?.scope===`preset-root`&&t.add(ux(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function qk(e){let t=new Map([...tx(e),...JC(e)]);return[...Kk(e),...Object.values(e.actions).flatMap(e=>Wk(e,t))]}function Jk(e){return Rk(qk(e),`config`)}const Yk=qx(`commands.`),Xk=oS(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),Zk=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,Qk=`{{ \$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 (${Zk}) (basename .project_dir) (ne (${Zk}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,$k=`{{ ${Tx} }}`,eA={min:0,max:100,step:5},tA={warnAt:{label:`warning at %`,domain:eA,default:50},errorAt:{label:`error at %`,domain:{...eA,atLeast:`warnAt`},default:80}};function nA(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:eA,default:80}}}const rA={globals:{palette:`tokyo-night`},variables:{...Yk.variables,...kb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style โ `~` under home, project-relative inside the project. Click to copy the full path.",template:Qk},model:{group:`model-context`,description:`The active model's display name.`,template:`โฑ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`โ{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`โ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`โ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact โ repo, in-progress operation, sha, upstream ยฑ, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "โธ" "โ" }}`,fg:$k,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `โ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "โ #%v" .git.prNumber) }}{{ else }}โ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:Ix(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:Yk.template,when:Yk.when},themeSwitcher:{group:`session-tools`,description:"`โ <theme> โถ`: the theme the bar is wearing; โ and โถ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`ยง {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:nA(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`โ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:nA(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`โฑ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:tA,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`โ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:tA,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`โก {{ template "formatRate" .burn.costPerHour }} ยท {{ template "formatEta" .block.etaMinutes }} to 5h ยท {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`โ
out {{ template "formatSpeed" .speed.output }} ยท in {{ template "formatSpeed" .speed.input }} ยท tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`โก {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`โด {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${ka} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`โ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: โ and + move it by 100K, โ lifts it, โบ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}โ โ {{ .memento.error }} {{ action "ceiling.clear" "โบ" }}{{ else }}โ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "โ" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "โ" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "โบ" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: โ and + move it by 100K, โบ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:Xk.template,bg:Xk.bg,when:Xk.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} ฮ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} โง {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} โง {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} โ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} โ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} โ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} โ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} โณ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} โ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...Ix(``).actions,...Yk.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`},...Xk.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},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) ${ka}) .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:sS(`.`),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 .)) }}`}},iA=new Set([rA.globals.palette,...Object.values(rA.segments).map(e=>e.palette)].filter(e=>e!==void 0)),aA=Bc(KT(`<default>`,JSON.stringify(rA),iA),rA),oA=D_(aA.presets);function sA(e){return oA.includes(e)}function cA(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const lA=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 uA(e){return((...t)=>lA.run(()=>e(...t)))}const dA=uA(C),fA=uA(S),pA=uA(w);async function mA(e,t){return lA.run(async()=>{let n=null;try{n=await x(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 hA(e,t){return lA.run(async()=>{let n=null;try{n=await x(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 gA=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function _A(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 vA(e){let t=await yA(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function yA(e){for(let t of[65536,1048576]){let n=await hA(e,t);if(n.kind!==`ok`)return n;let r=bA(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function bA(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||!gA.test(t))continue;let r=_A(t);if(r!=null)return r}return null}function xA(e,t){return{...e,claudeConfigDir:
|
|
176
|
+
`))}function vk(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(D(a.path).href)):c(`full text unavailable: ${KO(a.reason)}`,s)]:[],u=o===null?[]:[c(`${l.length>0?` ยท `:``}open `,s),c(KO(o),s.withLink(D(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`,ok([m],r)}const yk=e=>!e.startsWith(`.`)&&!e.endsWith(`~`);function bk(e,t){return t.isSymbolicLink()?Buffer.from(r.readlinkSync(e)):r.readFileSync(e)}function xk(e,t){return r.readdirSync(t).filter(yk).sort().flatMap(n=>{let i=c.join(t,n),a=r.lstatSync(i,{throwIfNoEntry:!1});return a===void 0?[]:a.isDirectory()?xk(e,i):[[c.relative(e,i).split(c.sep).join(`/`),bk(i,a)]]})}function Sk(e){let t=ie.createHash(`sha256`);for(let[n,r]of xk(e,e))t.update(n).update(`\0`).update(r).update(`\0`);return t.digest(`hex`)}const Ck=e=>e.slice(0,7);function wk(e){return c.dirname(c.dirname(e))}function Tk(){return{version:BD,digest:`ca67759af9b8b79e42ba7224c78954718f737a9f775c064411308003a112441b`}}function Ek(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 Dk(e,t){try{let n=wk(E(e)),i=c.join(n,`src`);if(!r.existsSync(i))return{kind:`not-source-checkout`};let a=t(),o=Sk(i);return o===a.digest?{kind:`current`,root:n,stamp:a}:{kind:`stale`,root:n,source:{version:Ek(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 Ok(e){return e.op===`remove`?`remove:${e.target}`:`insert:${e.segment}:${e.anchor}:${e.relation}`}function kk(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 Ak(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 jk=/^-?\d+$/;function Mk(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 Nk(e){return t=>{if(!t)return{ok:!1,reason:`${e} value is required`};if(!jk.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 Pk(e,t,n){return r=>r?jk.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 Fk(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=>!jk.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 Ik(e){return e===`config`?`set-config`:`set-state`}function Lk(e,t,n){return t.kind===`int`?Nk(`menu page "${e}"`):t.kind===`range`?Pk(t.min,t.max,`${n} stepper "${e}"`):Mk(t.allowed,`${n} "${e}"`,Ik(n))}function Rk(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:Fk(e,n,t)}))}function zk(e,t,n,r){let i=new Map(Object.entries(e)),a=new Map,o=new Set(t.map(e=>e.key));for(let{key:e,spec:t}of n)if(o.has(e)&&t.kind!==`allow-list`)throw Error(`${r} gate: key "${e}" is written by the daemon's own links as one of a list of values, and cannot be declared as ${t.kind===`int`?`a paged cursor (int)`:`a bounded value (range)`}. Use a distinct key.`);let s=[...t.map(({key:e,allowed:t})=>({key:e,spec:{kind:`allow-list`,allowed:t}})),...n];for(let{key:t,spec:n}of Rk(s,r)){if(!t)throw Error(`${r} gate: key is required`);if(t.includes(`/`))throw Error(`${r} gate: key "${t}" contains "/" โ the wire shape splits on "/" so a slash-bearing key cannot be addressed. Use a slash-free key.`);if(Object.hasOwn(e,t))throw Error(`${r} gate: key "${t}" is a built-in ${r} key and cannot be re-claimed (built-in keys: ${Object.keys(e).join(`, `)})`);i.set(t,Lk(t,n,r)),n.kind===`range`&&a.set(t,{min:n.min,max:n.max})}return{validate(e,t){let n=i.get(e);return n?n(t):{ok:!1,reason:`unknown ${r} key "${e}" (have: ${[...i.keys()].join(`, `)})`}},listKeys:()=>[...i.keys()],rangeParamsFor:e=>a.get(e)??null}}function Bk(e,t,n){let r=[],i=0,a=new WeakMap;return{register(n,a){let o={key:n,allowed:a};zk(e,[o],[],t),r.push(o),i++;let s=!0;return()=>{s&&(s=!1,r.splice(r.indexOf(o),1),i++)}},gateFor(o){let s=a.get(o);if(s?.epoch===i)return s.gate;let c=zk(e,r,n(o),t);return a.set(o,{epoch:i,gate:c}),c}}}const Vk=Bk({},`config`,Jk);function Hk(e,t){return Vk.register(e,t)}function Uk(e){return Vk.gateFor(e)}function Wk(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:ox(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:[Ok({op:`remove`,target:e.removeSegment})]}}]:`insertSegment`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:[Ok({op:`insert`,segment:e.insertSegment,anchor:e.anchor,relation:e.relation})]}}]:`insertSegmentFrom`in e?[{key:e.persist,spec:{kind:`allow-list`,allowed:ox(e.insertSegmentFrom,t).members.map(t=>Ok({op:`insert`,segment:t,anchor:e.anchor,relation:e.relation}))}}]:[{key:e.persist,spec:{kind:`range`,min:e.min,max:e.max}}]:[]}function Gk(e,t){let n=Ml(e).get(t);return n===void 0?null:String(n)}function Kk(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?hx(n.persist):null;e?.scope===`preset-root`&&t.add(px(e.preset))}return[...t].map(e=>({key:e,spec:{kind:`allow-list`,allowed:[]}}))}function qk(e){let t=new Map([...ix(e),...ZC(e)]);return[...Kk(e),...Object.values(e.actions).flatMap(e=>Wk(e,t))]}function Jk(e){return Rk(qk(e),`config`)}const Yk=Xx(`commands.`),Xk=lS(`autocompact.`,e=>`{{ template "formatTokenCount" ${e} }}`),Zk=`trimPrefix "/" (trimPrefix .project_dir .current_dir)`,Qk=`{{ \$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 (${Zk}) (basename .project_dir) (ne (${Zk}) "") }}{{ end }}{{ end }}{{ action "copyDir" (abbreviatePath \$dir) }}`,$k=`{{ ${Ox} }}`,eA={min:0,max:100,step:5},tA={warnAt:{label:`warning at %`,domain:eA,default:50},errorAt:{label:`error at %`,domain:{...eA,atLeast:`warnAt`},default:80}};function nA(e){return{budget:{label:`budget $`,domain:{min:0,max:1e4,step:5},default:e},warnAt:{label:`warning at %`,domain:eA,default:80}}}const rA={globals:{palette:`tokyo-night`},variables:{...Yk.variables,...Mb,current_dir:{kind:`input`,path:`workspace.current_dir`,default:`?`},"model.display_name":{kind:`input`,path:`model.display_name`,default:``},version:{kind:`input`,path:`version`,default:``},home:{kind:`input`,path:`home`,default:``},"tmux.session":{kind:`input`,path:`tmux.session`,default:``},"host.name":{kind:`input`,path:`host.name`,default:``},"host.user":{kind:`input`,path:`host.user`,default:``},"host.ssh":{kind:`input`,path:`host.ssh`,type:`boolean`,default:!1},"git.repoName":{kind:`input`,path:`git.repoName`,default:``},"git.branch":{kind:`input`,path:`git.branch`,default:``},"git.sha":{kind:`input`,path:`git.sha`,default:``},"git.ahead":{kind:`input`,path:`git.ahead`,type:`number`,default:0},"git.behind":{kind:`input`,path:`git.behind`,type:`number`,default:0},"git.staged":{kind:`input`,path:`git.staged`,type:`number`,default:0},"git.unstaged":{kind:`input`,path:`git.unstaged`,type:`number`,default:0},"git.untracked":{kind:`input`,path:`git.untracked`,type:`number`,default:0},"git.conflicts":{kind:`input`,path:`git.conflicts`,type:`number`,default:0},"git.upstream":{kind:`input`,path:`git.upstream`,default:``},"git.stash":{kind:`input`,path:`git.stash`,type:`number`,default:0},"git.status":{kind:`input`,path:`git.status`,default:`clean`},"git.operation":{kind:`input`,path:`git.operation`,default:``},"git.timeSinceCommit":{kind:`input`,path:`git.timeSinceCommit`,type:`number`,default:0},"git.color.branch":{kind:`literal`,value:`primary`},"git.color.staged":{kind:`literal`,value:`success`},"git.color.unstaged":{kind:`literal`,value:`warning`},"git.color.untracked":{kind:`literal`,value:`accent`},"git.color.conflicts":{kind:`literal`,value:`error`},"git.color.ahead":{kind:`literal`,value:`success`},"git.color.behind":{kind:`literal`,value:`warning`},"git.color.stash":{kind:`literal`,value:`accent`},"git.detail":{kind:`state`,key:`git-detail`,default:`collapsed`},"git.prNumber":{kind:`input`,path:`git.prNumber`,type:`number`,default:0},"git.prState":{kind:`input`,path:`git.prState`,default:``},"git.prUrl":{kind:`input`,path:`git.prUrl`,default:``},"git.prError":{kind:`input`,path:`git.prError`,default:``},"cache.expiresAt":{kind:`input`,path:`cache.expiresAt`,type:`number`,default:0},"session.cost":{kind:`input`,path:`session.cost`,type:`number`,default:0},"session.tokens":{kind:`input`,path:`session.tokens`,type:`number`,default:0},"today.cost":{kind:`input`,path:`today.cost`,type:`number`,default:0},"today.tokens":{kind:`input`,path:`today.tokens`,type:`number`,default:0},"block.nativeUtilization":{kind:`input`,path:`block.nativeUtilization`,type:`number`,default:0},"block.resetsAt":{kind:`input`,path:`block.resetsAt`,type:`number`,default:0},"weekly.percentage":{kind:`input`,path:`weekly.percentage`,type:`number`,default:0},"weekly.resetsAt":{kind:`input`,path:`weekly.resetsAt`,type:`number`,default:0},"burn.costPerHour":{kind:`input`,path:`burn.costPerHour`,type:`number`,default:-1},"block.etaMinutes":{kind:`input`,path:`block.etaMinutes`,type:`number`,default:-1},"weekly.etaMinutes":{kind:`input`,path:`weekly.etaMinutes`,type:`number`,default:-1},"speed.input":{kind:`input`,path:`speed.input`,type:`number`,default:-1},"speed.output":{kind:`input`,path:`speed.output`,type:`number`,default:-1},"speed.total":{kind:`input`,path:`speed.total`,type:`number`,default:-1},"speed.history":{kind:`input`,path:`speed.history`,type:`string`,default:``},"context.totalTokens":{kind:`input`,path:`context.totalTokens`,type:`number`,default:0},"context.contextLeft":{kind:`input`,path:`context.contextLeft`,type:`number`,default:100},"memento.ceiling":{kind:`input`,path:`memento.ceiling`,type:`number`,default:-1},"memento.off":{kind:`input`,path:`memento.off`,type:`boolean`,default:!1},"memento.session":{kind:`input`,path:`memento.session`,default:``},"memento.error":{kind:`input`,path:`memento.error`,default:``},"metrics.lastResponseTime":{kind:`input`,path:`metrics.lastResponseTime`,type:`number`,default:0},"metrics.responseTime":{kind:`input`,path:`metrics.responseTime`,type:`number`,default:0},"metrics.sessionDuration":{kind:`input`,path:`metrics.sessionDuration`,type:`number`,default:0},"metrics.messageCount":{kind:`input`,path:`metrics.messageCount`,type:`number`,default:0},"metrics.linesAdded":{kind:`input`,path:`metrics.linesAdded`,type:`number`,default:0},"metrics.linesRemoved":{kind:`input`,path:`metrics.linesRemoved`,type:`number`,default:0},"activity.command":{kind:`input`,path:`activity.command`,type:`string`,default:``},"activity.todo.total":{kind:`input`,path:`activity.todo.total`,type:`number`,default:0},"activity.todo.completed":{kind:`input`,path:`activity.todo.completed`,type:`number`,default:0},"activity.todo.position":{kind:`input`,path:`activity.todo.position`,type:`number`,default:0},"activity.todo.active":{kind:`input`,path:`activity.todo.active`,type:`string`,default:``},"activity.tool.running":{kind:`input`,path:`activity.tool.running`,type:`string`,default:``},"activity.tool.done":{kind:`input`,path:`activity.tool.done`,type:`string`,default:``}},segments:{directory:{group:`location`,description:"The current directory, shortened fish-style โ `~` under home, project-relative inside the project. Click to copy the full path.",template:Qk},model:{group:`model-context`,description:`The active model's display name.`,template:`โฑ {{ formatModelName .model.display_name }}`,when:`{{ ne .model.display_name "" }}`},sessionId:{group:`session-tools`,description:`The session id, truncated to 8 characters.`,template:`โ{{ trunc 8 .session.id }}`,when:`{{ ne .session.id "" }}`},version:{group:`model-context`,description:`The Claude Code version reported in the hook payload.`,template:`โ v{{ .version }}`,when:`{{ ne .version "" }}`},tmux:{group:`location`,description:`The tmux session name; hidden when not inside tmux.`,template:`tmux:{{ .tmux.session | default "none" }}`,when:`{{ ne .tmux.session "" }}`},host:{group:`location`,description:`user@host on a warning background, shown only over SSH.`,template:`โ {{ .host.user | default "?" }}@{{ .host.name | default "?" }}`,bg:`warning`,when:`{{ .host.ssh }}`},gitaculous:{group:`git`,description:`The git state: a summary (branch, ahead/behind, S/U/? flags) that the arrow at its right edge expands to every fact โ repo, in-progress operation, sha, upstream ยฑ, stash count, time since the last commit.`,template:`{{ if eq .git.detail "expanded" }}{{ template "gitExpanded" . }}{{ else }}{{ template "gitCollapsed" . }}{{ end }} {{ action "gitDetail" "โธ" "โ" }}`,fg:$k,when:`{{ ne .git.branch "" }}`,settings:{aheadBehind:{label:`ahead/behind`,domain:`bool`,default:!0},flags:{label:`dirty flags`,domain:`bool`,default:!0},operation:{label:`operation`,domain:`bool`,default:!0},repo:{label:`repo name`,domain:`bool`,default:!0},sha:{label:`commit hash`,domain:`bool`,default:!0},stash:{label:`stash`,domain:`bool`,default:!0},upstream:{label:`upstream`,domain:`bool`,default:!0},age:{label:`time since commit`,domain:`bool`,default:!0}}},gitPr:{group:`git`,description:"The pull request open for this branch, as a link; `โ PR` when the forge lookup failed.",template:`{{ if ne .git.prUrl "" }}{{ link .git.prUrl (printf "โ #%v" .git.prNumber) }}{{ else }}โ PR{{ end }}`,when:`{{ or (ne .git.prUrl "") (ne .git.prError "") }}`},toolbar:{group:`session-tools`,description:`Quick actions: copy the session id, and open the project, transcript or repo.`,template:zx(``).template},commands:{group:`session-tools`,description:`Type /compact, /model or /clear into this session; /clear asks for a second click. Hidden when not inside tmux.`,template:Yk.template,when:Yk.when},themeSwitcher:{group:`session-tools`,description:"`โ <theme> โถ`: the theme the bar is wearing; โ and โถ switch this session to the previous or next theme, wrapping at the ends.",template:`{{ carousel "stepTheme" 0 }}`},session:{group:`cost-limits`,description:`This session's cost and token total, with a budget warning once a budget is configured.`,template:`ยง {{ template "formatCost" .session.cost }} ({{ template "formatTokens" .session.tokens }}){{ template "budgetStatus" (dict "cost" .session.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:nA(0)},today:{group:`cost-limits`,description:`Today's cost and tokens across every session, with a budget warning once a budget is configured.`,template:`โ {{ template "formatCost" .today.cost }} ({{ template "formatTokens" .today.tokens }}){{ template "budgetStatus" (dict "cost" .today.cost "budget" .settings.budget "warn" .settings.warnAt) }}`,settings:nA(50)},block:{group:`cost-limits`,description:`The 5-hour rate-limit block: percent used and time to reset, heating to warning then error.`,template:`โฑ {{ round .block.nativeUtilization }}% ({{ template "formatResetCountdown" .block.resetsAt }})`,bg:`{{ ramp (round .block.nativeUtilization) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:tA,when:`{{ gt .block.resetsAt 0 }}`},weekly:{group:`cost-limits`,description:`The weekly rate-limit quota: percent used and time to reset, heating to warning then error.`,template:`โ {{ round .weekly.percentage }}% ({{ template "formatResetCountdown" .weekly.resetsAt }})`,bg:`{{ ramp (round .weekly.percentage) "step" 0 (tint) .settings.warnAt "warning" .settings.errorAt "error" }}`,settings:tA,when:`{{ gt .weekly.resetsAt 0 }}`},burnrate:{group:`cost-limits`,description:`Spend per hour, with the projected time to the 5-hour and weekly limits.`,template:`โก {{ template "formatRate" .burn.costPerHour }} ยท {{ template "formatEta" .block.etaMinutes }} to 5h ยท {{ template "formatEta" .weekly.etaMinutes }} to wk`,bg:`{{ ramp .block.etaMinutes "step" -1 (tint) 0 "error" .settings.errorWithin "warning" .settings.warnWithin (tint) }}`,settings:{errorWithin:{label:`error within (min)`,domain:{min:0,max:300,step:5},default:30},warnWithin:{label:`warning within (min)`,domain:{min:0,max:300,step:5,atLeast:`errorWithin`},default:60}},when:`{{ or (gt .block.resetsAt 0) (gt .weekly.resetsAt 0) }}`},speed:{group:`activity`,description:`Token throughput for the latest exchange: output, input, and total.`,template:`โ
out {{ template "formatSpeed" .speed.output }} ยท in {{ template "formatSpeed" .speed.input }} ยท tot {{ template "formatSpeed" .speed.total }}`,when:`{{ gt .session.tokens 0 }}`},tokenSparkline:{group:`activity`,description:`A sparkline of recent token throughput.`,template:`โก {{ sparkline .speed.history 24 }}`,when:`{{ ne .speed.history "" }}`},cacheTimer:{group:`activity`,description:"Minutes until the prompt cache expires, or `cold` once it has.",template:`โด {{ if le (minutesUntilReset .cache.expiresAt) 0 }}cold{{ else }}{{ minutesUntilReset .cache.expiresAt }}m{{ end }}`,fg:`{{ readableOn (color (cascade (minutesUntilReset .cache.expiresAt) "0:error" "9:warning" "21:foreground")) (bgOf) ${ka} }}`,when:`{{ gt .cache.expiresAt 0 }}`},context:{group:`model-context`,description:`Context used, in tokens and percent remaining, heating as it fills.`,template:`โ {{ formatInteger .context.totalTokens }} ({{ .context.contextLeft }}%)`,bg:`{{ ramp .context.contextLeft "step" 0 "error" 21 "warning" 41 (tint) }}`,when:`{{ gt .context.totalTokens 0 }}`},ceiling:{group:`model-context`,description:`The memento plugin's context ceiling for this session: โ and + move it by 100K, โ lifts it, โบ drops this session's own setting.`,template:`{{ if ne .memento.error "" }}โ โ {{ .memento.error }} {{ action "ceiling.clear" "โบ" }}{{ else }}โ {{ if .memento.off }}off{{ else }}{{ template "formatTokenCount" .memento.ceiling }} {{ action "ceiling.lower" "โ" }} {{ action "ceiling.raise" "+" }} {{ action "ceiling.off" "โ" }}{{ end }}{{ if ne .memento.session "" }} {{ action "ceiling.clear" "โบ" }}{{ end }}{{ end }}`,bg:`{{ if ne .memento.error "" }}{{ color "error" }}{{ else }}{{ tint }}{{ end }}`,when:`{{ or (ge .memento.ceiling 0) (ne .memento.error "") }}`},autocompact:{group:`model-context`,description:`Claude Code's auto-compact window: โ and + move it by 100K, โบ returns it to auto. Clicks type /autocompact into this session, so the controls show only inside tmux.`,template:Xk.template,bg:Xk.bg,when:Xk.when},metrics:{group:`activity`,description:`Response times, session duration, message count, and lines added/removed.`,template:`{{ if .metrics.lastResponseTime }} ฮ {{ template "formatResponseTime" .metrics.lastResponseTime }}{{ end }}{{ if .metrics.responseTime }} โง {{ template "formatResponseTime" .metrics.responseTime }}{{ end }}{{ if .metrics.sessionDuration }} โง {{ template "formatDuration" .metrics.sessionDuration }}{{ end }}{{ if .metrics.messageCount }} โ {{ .metrics.messageCount }}{{ end }}{{ if .metrics.linesAdded }} + {{ .metrics.linesAdded }}{{ end }}{{ if .metrics.linesRemoved }} - {{ .metrics.linesRemoved }}{{ end }} `,when:`{{ or (gt .metrics.lastResponseTime 0.0) (gt .metrics.responseTime 0.0) (gt .metrics.sessionDuration 0.0) (gt .metrics.messageCount 0) (gt .metrics.linesAdded 0) (gt .metrics.linesRemoved 0) }}`},activity:{group:`activity`,description:`What Claude is doing: the slash command that opened the turn, the in-progress todo, and the tools in flight.`,template:`{{ if .activity.command }} โ {{ .activity.command }}{{ end }}{{ if .activity.todo.total }}{{ if .activity.todo.active }} โ {{ .activity.todo.position }}/{{ .activity.todo.total }} {{ abbrev 32 .activity.todo.active }}{{ else }} โ {{ .activity.todo.completed }}/{{ .activity.todo.total }}{{ end }}{{ end }}{{ if .activity.tool.running }} โณ {{ template "formatToolTally" .activity.tool.running }}{{ end }}{{ if .activity.tool.done }} โ {{ template "formatToolTally" .activity.tool.done }}{{ end }} `,when:`{{ or (ne .activity.command "") (gt .activity.todo.total 0) (ne .activity.tool.running "") (ne .activity.tool.done "") }}`}},root:{rows:{identity:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`host`},{kind:`segment`,name:`directory`},{kind:`segment`,name:`gitaculous`}]},status:{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`model`},{kind:`container`,direction:`horizontal`,children:[{kind:`segment`,name:`context`},{kind:`segment`,name:`ceiling`},{kind:`segment`,name:`autocompact`}]},{kind:`segment`,name:`cacheTimer`},{kind:`segment`,name:`block`},{kind:`segment`,name:`weekly`},{kind:`segment`,name:`activity`}]}}},actions:{...zx(``).actions,...Yk.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`},...Xk.actions},styles:{none:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:0},vivid:{hueShift:0,chromaScale:1.35,lightnessScale:1,lightnessShift:0},muted:{hueShift:0,chromaScale:.55,lightnessScale:1,lightnessShift:0},dim:{hueShift:0,chromaScale:1,lightnessScale:.85,lightnessShift:0},bright:{hueShift:0,chromaScale:1,lightnessScale:1,lightnessShift:.08},inverted:{hueShift:0,chromaScale:1,lightnessScale:-1,lightnessShift:1}},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) ${ka}) .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:uS(`.`),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 .)) }}`}},iA=new Set([rA.globals.palette,...Object.values(rA.segments).map(e=>e.palette)].filter(e=>e!==void 0)),aA=Bc(YT(`<default>`,JSON.stringify(rA),iA),rA),oA=D_(aA.presets);function sA(e){return oA.includes(e)}function cA(e){if(!e)return 0;try{return o(e).mtimeMs}catch{return 0}}const lA=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 uA(e){return((...t)=>lA.run(()=>e(...t)))}const dA=uA(C),fA=uA(S),pA=uA(w);async function mA(e,t){return lA.run(async()=>{let n=null;try{n=await x(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 hA(e,t){return lA.run(async()=>{let n=null;try{n=await x(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 gA=/"(?:cache_read_input_tokens|cache_creation_input_tokens)":[1-9]/;function _A(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 vA(e){let t=await yA(e);return t.kind===`ok`?J(Math.floor((t.value+36e5)/1e3)):t}async function yA(e){for(let t of[65536,1048576]){let n=await hA(e,t);if(n.kind!==`ok`)return n;let r=bA(n.value.buf,n.value.fromStart);if(r!=null)return J(r);if(n.value.fromStart)return Y}return Y}function bA(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||!gA.test(t))continue;let r=_A(t);if(r!=null)return r}return null}function xA(e,t){return{...e,claudeConfigDir:Qx(t.claudeConfigDir),env:t.mementoEnv}}const SA=c.join(`lib`,`ceiling_config.py`),CA=c.join(`skills`,`ceiling`,`bin`,`ceiling`);function wA(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 TA(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 EA(e,t){if(!r.existsSync(e))return Y;let n;try{n=wA(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=TA([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=[SA,CA].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 DA(e,t=process.env){let n=new Set([`CLAUDE_PROJECT_DIR`,`CLAUDE_CODE_SESSION_ID`,...e.env===void 0?[]:Ye]);return{...Object.fromEntries(Object.entries(t).filter(([e])=>!n.has(e))),...e.env,CLAUDE_CODE_SESSION_ID:e.sessionId,CLAUDE_PROJECT_DIR:e.projectDir||e.cwd}}function OA(e){return e.stderr.trim()||e.error||`${e.reason}${e.exitCode===null?``:` (exit ${e.exitCode})`}`}function kA(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 AA(e,t){let n=await Oe({bin:`python3`,args:[`-c`,`
|
|
178
178
|
import json, math, sys
|
|
179
179
|
sys.path.insert(0, sys.argv[1])
|
|
180
180
|
from ceiling_config import CONFIG_NAME, anchored, ceiling_in, in_force, session_directory
|
|
@@ -183,38 +183,38 @@ ceiling = in_force(directory, anchored(sys.argv[3]))
|
|
|
183
183
|
layer = ceiling_in(directory / CONFIG_NAME)
|
|
184
184
|
print(json.dumps({"ceiling": "off" if ceiling == math.inf else ceiling,
|
|
185
185
|
"session": layer.text if layer else None}))
|
|
186
|
-
`,c.join(e,`lib`),t.sessionId,t.cwd],env:DA(t),timeoutMs:3e3,category:`memento.read`});return n.ok?kA(n.stdout):X(OA(n))}function jA(e,t,n){let r=ke({bin:c.join(e,CA),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:DA(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(OA(r))}function MA(){return{locate:e=>EA(
|
|
187
|
-
`).at(-1).trim();function ej(e){switch(e.kind){case`absent`:return;case`failed`:return{error:$A(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function tj(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=nj(e.running),i=nj(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 nj(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function rj(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 ij(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function aj(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 oj={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,autoWrap:e=>e.autoWrap?So:Co,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?So:Co},sj=Object.entries(
|
|
186
|
+
`,c.join(e,`lib`),t.sessionId,t.cwd],env:DA(t),timeoutMs:3e3,category:`memento.read`});return n.ok?kA(n.stdout):X(OA(n))}function jA(e,t,n){let r=ke({bin:c.join(e,CA),args:n.kind===`set`?[`set`,`session`,n.to]:[`clear`,`session`],env:DA(t),timeoutMs:5e3,category:`memento.move`});if(!r.ok)throw Error(OA(r))}function MA(){return{locate:e=>EA(eS(e.claudeConfigDir),e.projectDir),read:AA,move:jA}}function NA(e,t,n){let r=n===void 0?``:`CLAUDE_CONFIG_DIR=${UD(n)} `,i=e.added_dirs.map(e=>` --add-dir ${UD(e)}`).join(``);return`cd ${UD(e.project_dir)} && ${r}claude --resume ${UD(t)}${i}`}function PA(e,t,n){let r=O_(t(`preset`),e.globals.preset,e.presets),i=j_(e,r),a=t(`edit.mode`)===`arrange`?e.editGlobals:{};return{preset:r,presetCustomized:n(r),theme:Qb(a.palette,t(`theme`),i.palette),style:uo(a.style,t(`style`),i.style,e.styles),endcaps:mo(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:a.charset??i.charset??`unicode`,updateNotice:ko(a.updateNotice,t(`updateNotice`),i.updateNotice),colorCompatibility:a.colorCompatibility??i.colorCompatibility??`truecolor`}}function FA(e,t){return{endcaps:e.endcaps,separator:e.separator,colorCompatibility:e.colorCompatibility,wrap:e.autoWrap,padding:e.padding,charset:e.charset,width:t}}function IA(e){return{theme:e.theme,style:e.style,preset:e.preset,variation:e.variation}}function LA(e){return{preset:{effective:e.preset,customized:e.presetCustomized,bundled:sA(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 RA=10*1e3;function zA(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 BA(e,t){if(!(t<60))return e*3600/t}function VA(e,t,n,r){let i=r-t;if(i<50||i>RA)return;let a=n-e;if(!(a<=0))return a*1e3/i}function HA(e){let{prev:t,cur:n}=e;if(t===void 0)return;let r=VA(t.input,t.atMs,n.input,n.atMs),i=VA(t.output,t.atMs,n.output,n.atMs),a=VA(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 UA(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>RA)continue;let o=VA(r.total,r.atMs,i.total,i.atMs);n.push(o??0)}if(n.length!==0)return n.join(`,`)}function WA(e){let t=e.indexOf(`.`);return t<0?e:e.slice(0,t)}function GA(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`,()=>WA(m.hostname())),i=n(`user`,()=>m.userInfo().username);return{host:{...r!==void 0&&{name:r},...i!==void 0&&{user:i},...e.ssh!==void 0&&{ssh:e.ssh}},failures:t}}function KA(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=>_v(t,e.helpers).keys(),o=j_(e,t);for(let e of ro){let t=o[e];if(io(t))for(let e of a(t))r.push(e)}for(let n of Ms(A_(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 JA(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 qA(e){let t=new Map;return n=>{let r=t.get(n);if(r!==void 0)return r;let i=KA(e,n);return t.set(n,i),i}}function JA(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 YA(e,t){for(let n of e)if(n===t||n.startsWith(t+`.`))return!0;return!1}function XA(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 ZA(e,t,n,r,i,a,{configPath:o,...s}){let c=e=>YA(r,e),l=(t.clock??(()=>new Date))().getTime(),u=a.tmux??null,d=(e,t,n)=>t?n().catch(t=>X(`${e}: ${String(t)}`)):Promise.resolve(Y),[f,p,m,h,g,_,v,y,b,x,S]=await Promise.all([d(`git`,c(`git`),()=>t.gitProvider.getGitInfo(n??e.workspace?.current_dir,XA(r),e.workspace?.project_dir)),d(`session`,c(`session.cost`)||c(`session.tokens`)||c(`burn`),()=>t.usageStore.getUsageInfo(e.session_id,e)),d(`today`,c(`today`),()=>t.usageStore.getTodayInfo(e,a.claudeConfigDir)),d(`context`,c(`context`)||c(`autocompact`),()=>t.contextProvider.getContextInfo(e)),d(`metrics`,c(`metrics`)||c(`burn`),()=>t.metricsProvider.getMetricsInfo(e.session_id,e)),d(`activity`,c(`activity`),()=>t.activityProvider.getActivityInfo(e.session_id,e)),d(`tmux`,c(`tmux.session`),()=>u===null?Promise.resolve(Y):t.tmuxService.getSessionName(u)),d(`cache`,c(`cache`),()=>vA(e.transcript_path)),d(`speed`,c(`speed`),()=>t.usageStore.observeSpeed(e.session_id,e.transcript_path,l)),d(`memento`,c(`memento`),()=>t.mementoProvider.getCeiling(xA({sessionId:e.session_id,projectDir:e.workspace?.project_dir??``,cwd:n??e.workspace?.current_dir??``},a))),d(`autocompact`,c(`autocompact`),()=>Promise.resolve(t.autoCompact($x(Qx(a.claudeConfigDir)))))]),C=[],w=e=>{if(e.kind===`failed`){C.push(e.reason);return}return e.kind===`ok`?e.value:void 0},T=aj(f);C.push(...T.failures);let ee=GA(a);C.push(...ee.failures);let te=w(p),ne=w(m),re=w(h),E=w(g),D=w(_),ie=w(v),ae=w(y),oe=ej(x);x.kind===`failed`&&C.push(`memento: ${x.reason}`);let se=QA(S,re?.maxTokens);S.kind===`failed`&&C.push(`autocompact: ${S.reason}`);for(let e of C)t.log(`warn`,`provider fetch failed: ${e}`);let ce=e.rate_limits?.five_hour,le=e.rate_limits?.seven_day,ue=ce?zA(ce.used_percentage,ce.resets_at,18e6,l):void 0,de=le?zA(le.used_percentage,le.resets_at,6048e5,l):void 0,fe=te?.session.cost,pe=E?.sessionDuration,me=c(`burn`)&&fe!=null&&pe!=null?BA(fe,pe):void 0,he=w(b),ge=he===void 0?void 0:HA(he),_e=he===void 0?void 0:UA(he),O=ge!==void 0||_e!==void 0?{...ge,..._e!==void 0&&{history:_e}}:void 0,ve=ij(process.env.HOME??process.env.USERPROFILE),ye=e.workspace?{...e.workspace,current_dir:ij(e.workspace.current_dir)??``,project_dir:ij(e.workspace.project_dir)??``,added_dirs:(e.workspace.added_dirs??[]).map(e=>ij(e)??e)}:e.workspace,be=te===void 0?void 0:rj({cost:te.session.cost,tokens:te.session.tokens}),xe=ne===void 0?void 0:{cost:ne.cost,tokens:ne.tokens},Se=E===void 0?void 0:rj({lastResponseTime:E.lastResponseTime,responseTime:E.responseTime,sessionDuration:E.sessionDuration,messageCount:E.messageCount,linesAdded:E.linesAdded,linesRemoved:E.linesRemoved}),Ce=D===void 0?void 0:tj(D);return{...e,...ye!==void 0&&{workspace:ye},...ve!==void 0&&{home:ve},...T.git!==void 0&&{git:T.git},...u!==null&&{tmux:{pane:u.pane,...ie!==void 0&&{session:ie}}},host:ee.host,...LA(i),history:t.history(e.session_id),navigation:{back:t.navigation(e.session_id)},...s,...o!==null&&{configPath:o},resumeCommand:NA(ye,e.session_id,a.claudeConfigDir),...be!==void 0&&{session:be},...xe!==void 0&&{today:xe},...me!==void 0&&{burn:{costPerHour:me}},...O!==void 0&&{speed:O},...c(`block`)&&ce!==void 0&&{block:{nativeUtilization:ce.used_percentage,resetsAt:ce.resets_at,...ue!==void 0&&{etaMinutes:ue}}},...le!==void 0&&{weekly:{percentage:le.used_percentage,resetsAt:le.resets_at,...de!==void 0&&{etaMinutes:de}}},...ae!==void 0&&{cache:{expiresAt:ae}},...re!==void 0&&{context:{totalTokens:re.totalTokens,contextLeft:re.contextLeftPercentage}},...Se!==void 0&&{metrics:Se},...Ce!==void 0&&{activity:Ce},...oe!==void 0&&{memento:oe},...se!==void 0&&{autocompact:se}}}function QA(e,t){switch(e.kind){case`absent`:return;case`failed`:return{error:e.reason};case`ok`:return cS(e.value,t)}}const $A=e=>e.trim().split(`
|
|
187
|
+
`).at(-1).trim();function ej(e){switch(e.kind){case`absent`:return;case`failed`:return{error:$A(e.reason)};case`ok`:{let{ceiling:t,session:n}=e.value;return{ceiling:t===`off`?0:t,off:t===`off`,session:n??``}}}}function tj(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=nj(e.running),i=nj(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 nj(e){return e.length===0?void 0:e.map(e=>`${e.name}:${e.count}`).join(`,`)}function rj(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 ij(e){return e===void 0||e.length===0||c.sep!==`\\`?e:e.replace(/\\/g,`/`)}function aj(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 oj={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,autoWrap:e=>e.autoWrap?So:Co,padding:e=>String(e.padding),updateNotice:e=>e.updateNotice?So:Co},sj=Object.entries(Pb),cj=new Set(Fb.map(e=>e.sessionKey)),lj=()=>!1;function uj(e,t){return PA(e,e=>cj.has(e)?t(e):null,lj)}function dj(e,t,n,r){return e.flatMap(([e,i])=>{let a=oj[e](t);return a===null||a===oj[e](n(e))?[]:[{...i,value:a,target:r(i)}]})}function fj(e,t,n){return oj[n](uj(e,t))}function pj(e,t){let n=uj(e,t),r=PA(e,()=>null,lj),i=PA(e,e=>e===Pb.preset.sessionKey?n.preset:null,lj);return dj(sj,n,e=>e===`preset`?r:i,t=>mj(e,n.preset,t.configKey))}function mj(e,t,n){return n in(k_(e.presets,t).globals??{})?mx(t,n):n}function hj(e,t,n){let r=O_(t(Pb.preset.sessionKey),e.globals.preset,e.presets),i=hx(n);return{key:i?.scope===`globals`?mj(e,r,i.field):n,globals:j_(e,r)}}function gj(e,t){let{preset:n}=uj(e,t);return yj(e,n).flatMap(({id:e,setting:r,key:i,decl:a,saved:o})=>{let s=t(i),c=s===null?void 0:qs(a,s);return c===void 0||Ks(c)===Ks(o)?[]:[{preset:n,id:e,setting:r,key:i,value:c}]})}function _j(e,t,n){let r=new Map(n.map(e=>[e.key,e.value]));return D_(e.presets).flatMap(n=>{let i=yj(e,n);return[...new Set(i.filter(e=>r.has(e.key)).map(e=>e.id))].flatMap(e=>{let n=i.filter(t=>t.id===e);return Ws(Object.fromEntries(n.map(e=>[e.setting,e.decl])),Object.fromEntries(n.map(e=>{let n=r.get(e.key)??t(e.key),i=n===null?void 0:qs(e.decl,n);return[e.setting,i??e.saved]}))).map(({message:t})=>`placement "${e}": ${t}`)})})}const vj=new WeakMap;function yj(e,t){let n=vj.get(e)??new Map;vj.set(e,n);let r=n.get(t);if(r!==void 0)return r;let i=[...Ms(A_(e,t).node)].flatMap(t=>t.kind!==`segment`||t.drafts===void 0?[]:Object.entries(t.drafts).map(([n,{id:r,key:i}])=>{let a=Hs(e.segments[t.name])[n];return{id:r,setting:n,key:i,decl:a,saved:t.settings?.[n]??a.default}})),a=[...new Map(i.map(e=>[e.key,e])).values()];return n.set(t,a),a}function bj(e,t){let n=uj(e,t),r=PA(e,e=>e===Pb.preset.sessionKey?n.preset:null,lj);return{from:n.preset,globals:k_(e.presets,n.preset).globals??{},picks:dj(sj.filter(([e])=>e!==`preset`),n,()=>r,e=>e.configKey),placements:gj(e,t)}}function xj(e){return{sessionKeys:Fb.filter(t=>t.configKey===e).map(e=>e.sessionKey),fileKeys:[e,...Sl(e)?oA.map(t=>mx(t,e)):[]]}}function Sj(e){return new Set(Fb.map(e=>e.configKey).filter(t=>xj(t).fileKeys.some(t=>Tj(e,wj(t)))))}function Cj(e,t,n){let r=pj(e,n),i=new Set(r.map(e=>e.configKey)),a=Bb(e=>i.has(Pb[e].configKey)||t.has(Pb[e].configKey));return{unsaved:r.length+gj(e,n).length,resettable:a}}function wj(e){let t=hx(e);if(t===null||t.scope===`preset-root`)throw Error(`reset layer "${e}" is not a value path`);return gx(t)}function Tj(e,t){let[n,...r]=t;return n===void 0?e!==void 0:typeof e==`object`&&!!e&&Tj(e[n],r)}const Ej=Qa(),Dj=new Set(Ej),Oj=new Set(fo),kj=e=>e?Dj.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown theme "${e}" (have: ${Ej.join(`, `)})`}:{ok:!1,reason:`theme name is required`},Aj=e=>e?Oj.has(e)?{ok:!0,value:e}:{ok:!1,reason:`unknown endcaps "${e}" (have: ${fo.join(`, `)})`}:{ok:!1,reason:`endcaps name is required`},jj=new Set([`1`,`true`]),Mj=new Set([`0`,`false`]),Nj={endcaps:Aj,theme:kj,"toolbar-expanded":e=>jj.has(e)?{ok:!0,value:`1`}:Mj.has(e)?{ok:!0,value:``}:{ok:!1,reason:`expected boolean-ish (1, 0, true, false), got "${e}"`}},Pj=Bk(Nj,`state`,Vj);function Fj(e,t){return Pj.register(e,t)}function Ij(e){return Pj.gateFor(e)}function Lj(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:ox(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 Rj(e){return e.filter(e=>e.spec.kind!==`allow-list`||!Object.hasOwn(Nj,e.key))}function zj(e,t,n){let r=Vb.get(n);if(r!==void 0)return fj(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 Bj(e){let t=ix(e);return Rj(Object.values(e.actions).flatMap(e=>Lj(e,t)))}function Vj(e){return Rk(Bj(e))}const Hj=`update.dismissed`,Uj=`updateNotice`,Wj=Pb.updateNotice.sessionKey;function Gj(e){return e.kind===`source`?e.newer.digest:KD(e.newer)}const Kj=e=>`${e.version} [${Ck(e.digest)}]`;function qj(e){switch(e.kind){case`source`:return{headline:`Newer source`,newer:Kj(e.newer),running:Kj(e.running),act:`rebuild`,busy:`rebuildingโฆ`,command:{bin:`pnpm`,args:[`build`],cwd:e.root}};case`release`:return{headline:`Newer release`,newer:KD(e.newer),running:KD(e.running),act:`upgrade`,busy:`upgradingโฆ`,command:{bin:`pnpm`,args:[`dlx`,`${JD}@${KD(e.newer)}`,`install`]}}}}const Jj={kind:`idle`},Yj={kind:`running`};function Xj(e,t,n){if(e===null)return[];let r=Gj(e);if(!n.enabled||n.dismissed===r)return[];let i=qj(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(`
|
|
188
188
|
`),c=PD([{verb:hD,args:[s]}]),l=t.kind===`running`?dk(`[${i.busy}]`,c):dk(`[${i.act}]`,PD([{verb:DD,args:[n.sessionId]}]));return[{severity:uk,message:s,lines:[[dk(a,c),l,dk(`[dismiss]`,PD([{verb:lD,args:[n.sessionId,Hj,r]}])),dk(`[disable]`,PD([{verb:gD,args:[n.sessionId,Uj,`false`]},{verb:lD,args:[n.sessionId,Wj,`false`]}]))],...o.map(e=>[dk(e,c)])]}]}function Zj(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 Qj(e){switch(e.kind){case`current`:return[`info`,`build: current ${Kj(e.stamp)}`];case`stale`:return[`info`,`build: stale โ source ${Kj(e.source)}, running ${Kj(e.running)}`];case`not-source-checkout`:return[`info`,`build: not a source checkout`];case`unchecked`:return[`warn`,`build: unchecked: ${e.reason}`]}}function $j(e){switch(e.kind){case`current`:return[`info`,`release: current ${KD(e.installed)}`];case`stale`:return[`info`,`release: stale โ latest ${KD(e.latest)}, running ${KD(e.installed)}`];case`ahead`:return[`info`,`release: ahead โ running ${KD(e.installed)}, latest ${KD(e.latest)}`];case`unchecked`:return[`warn`,`release: unchecked: ${e.reason}`]}}function eM(e){let t=null;return([n,r])=>{r!==t&&(t=r,e(n,r))}}const tM=e=>e.split(/\r?\n/).map(e=>e.trim()).filter(e=>e!==``).at(-1);function nM(e){let t=e.exitCode===null?``:` (exit ${e.exitCode})`,n=tM(e.stderr)??e.error??tM(e.stdout)??`no output`;return`${e.reason}${t}: ${n}`}function rM(){let e=[Hk(Uj,[`false`]),Fj(Wj,[`false`]),Fj(Hj,[])];return()=>e.forEach(e=>e())}function iM(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=Jj,d=null,f=eM(s),p=eM(s),m=()=>Zj(c,l);function h(){let e=m(),t=e===null?null:Gj(e);(d===null?null:d.identity)!==t&&(d?.dispose(),d=t===null?null:{identity:t,dispose:Fj(Hj,[t])})}function g(){c=Dk(t,Tk),f(Qj(c)),h()}async function _(){l=XD(BD,await YD(JD,a,i)),p($j(l)),h()}return{arm(){rM(),g(),setInterval(g,n).unref(),c.kind===`not-source-checkout`&&(_(),setInterval(()=>void _(),r).unref())},notice:e=>Xj(m(),u,e),act(){let e=m();if(e===null)throw new $(`apply-update: nothing newer is known to apply`);let t=qj(e);if(u.kind===`running`)throw new $(`apply-update: already ${t.busy}`);u=Yj,s(`info`,`apply-update: ${t.act} โ ${t.command.bin} ${t.command.args?.join(` `)??``}`),Oe({...t.command,category:`update.apply`,timeoutMs:6e5}).then(n=>{if(n.ok){u=Jj,s(`info`,`apply-update: ${t.act} succeeded`),g(),o();return}let r=nM(n);u={kind:`failed`,identity:Gj(e),reason:r},s(`error`,`apply-update: ${t.act} failed: ${r}`)})}}}var aM=class{static CACHE_DIR=Pe();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 se(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 se(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 se(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 oM={"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 sM=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 aM.getUsageCache(`pricing`,e)}static async saveDiskCache(e){await aM.setUsageCache(`pricing`,e)}static async fetchPricingData(){return new Promise(e=>{let t=new ne(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(oM).length} models`),this.executionCache=oM,O(`[CACHE-SET] Pricing execution cache stored: ${Object.keys(oM).length} models`),oM)}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 cM=/<command-name>\s*([^<\s][^<]*?)\s*<\/command-name>/;function lM(e){if(typeof e==`string`)return cM.exec(e)?.[1]}function uM(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 dM(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=uM(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?lM(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 fM(e){if(e!==void 0)return[e];let t=h();return[f(t,`.config`,`claude`),f(t,`.claude`)].filter(e=>a(e))}async function pM(e){let t=[];for(let n of e){let e=f(n,`projects`);if(a(e))try{let n=await dA(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 mM(e,t,n){let r=[],i=f(t,e,`subagents`);try{let t=(await dA(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 fA(t,`utf-8`)).split(`
|
|
189
189
|
`)[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 hM(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 gM=new Map;async function _M(e){try{let t=await pA(e),n=t.size,r=gM.get(e);if(r&&r.mtime===t.mtimeMs&&r.size===n)return O(`[parse-cache] hit ${e}`),gM.delete(e),gM.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 SM(e)):i=await bM(e),O(`Parsed ${i.length} entries from ${e}`),n>5242880?i:(gM.delete(e),gM.size>=16&&gM.delete(gM.keys().next().value),gM.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 vM(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:dM(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 yM(e){let t=[];for(let n of e.split(`
|
|
190
|
-
`))if(n.trim())try{let e=vM(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function bM(e){return yM(await fA(e,`utf-8`))}async function xM(e,t){let n=await mA(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:yM(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function SM(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=ce({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=vM(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 CM=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 wM(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 TM=new Map,EM={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},DM={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function OM(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function kM(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function AM(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function jM(e,t,n,r){let i=OM(new Date(kM())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:AM(),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 sM.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=OM(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...EM};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 MM(e){let t=0,n=0,r=AM(),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)??{...EM};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:DM,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 NM(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 PM=class{entries=new Map;flight=new CM;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new CM;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:DM,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t){let n=OM(new Date),r=fM(t);try{await this.ensureSeeded(n,r)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let i=await this.ingest(e?.session_id??``,e?.transcript_path);if(i.kind===`failed`)return i;let a=r.map(e=>f(e,`projects`)+p),o={...EM},s=!1;for(let[t,r]of this.entries){let i=r.transcriptPath??``,c=t===e?.session_id||a.some(e=>i.startsWith(e))?r.days:TM;s||=c.has(n);let l=c.get(n)??EM;o.cost+=l.cost,o.input+=l.input,o.output+=l.output,o.cacheCreation+=l.cacheCreation,o.cacheRead+=l.cacheRead}return s?J({cost:o.cost,tokens:o.input+o.output+o.cacheCreation+o.cacheRead,tokenBreakdown:{input:o.input,output:o.output,cacheCreation:o.cacheCreation,cacheRead:o.cacheRead},date:n}):Y}async observeSpeed(e,t,n){let r=cA(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=wM(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??cA(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 mM(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 xM(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 jM(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...MM(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=kM(),n=await pM(e),r=[];for(let e of n){let n;try{n=await dA(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await pA(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await NM(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} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,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 FM(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function IM(e,t){let n=H.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function LM(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`โฆ`}):e.cellLength<t&&e.align(n.justify,t)}function RM({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function zM(e){let t=RM(e);if(t.length===1)return e.text;let n=IM(t);return n.style=e.text.style,n}function BM(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=IM(e,a).pad(o),u=new H(` `.repeat(o)),d={...s.length>0&&{lead:IM([u,...s],a)},...c.length>0&&{trail:IM([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(LM(l,n,f),[{text:l,...d}])}const VM=RegExp(`\\x1b\\[[0-9;]*m|${bi.source}`,`g`);function HM(e){return M(e.replace(VM,``))}function UM(e,t){let n=e.map(zM),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=ok(n,t).split(`
|
|
191
|
-
`);if(i.length>1)return n;let a=Math.max(0,t.width-HM(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];LM(l,l.cellLength+c,i),n[t]=zM(e[t])}),n}function WM(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=GM(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(qM(a.style).link){i();let e=GM([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function GM(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>KM(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 KM(e,t){let n=e.copy();return n.style=t.add(qM(e.style)),n}function qM(e){return e instanceof B?e:B.parse(e)}function JM(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,YM(e,t,o,n,r,i));return i}function YM(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=rx(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Fb.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=rx(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=rx(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:ZM(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:ZM(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:fw(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:ZM(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 XM(e){return e.kind===`do`?XM(e.head):e}function ZM(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function QM(e,t){return e.has(t)?Av(e.read(t)):``}function $M(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function eN(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 tN(e,t){return Math.max(e.members.indexOf(QM(t,e.stateVar)),0)}function nN(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=QM(r,e.stateVar);return{effects:[{verb:lD,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=QM(r,e.stateVar);return{effects:[{verb:lD,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=QM(r,e.stateVar);return{effects:[{verb:lD,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(tN(e,r)+1)%e.members.length];return{effects:[{verb:lD,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:uD,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:dD,args:[$M(e.text,Sy(r))]}],active:!1};case`open`:return{effects:[{verb:fD,args:[$M(e.target,Sy(r))]}],active:!1};case`persist-literal`:{let t=QM(r,e.stateVar);return{effects:[{verb:gD,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=QM(r,e.stateVar);return{effects:[{verb:gD,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(tN(e,r)+1)%e.members.length];return{effects:[{verb:gD,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:_D,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:xD,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:CD,args:[i]}],active:!1};case`redo`:return{effects:[{verb:wD,args:[i]}],active:!1};case`back`:return{effects:[{verb:TD,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:ED,args:[i]}],active:!1};case`save`:return{effects:[{verb:vD,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:yD,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:bD,args:[i,$M(e.name,Sy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:OD,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:kD,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:AD,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:jD,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:SD,args:[i,e.key,Ok(e.op)]}],active:!1};case`do`:{let a=nN(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>nN(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:SD,args:[i,e.key,Ok(r)]}],active:!1}}}}function rN(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,tN(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 iN(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}=rN(e,XM(r),t,i),{effects:s,active:c}=nN(r,a,o,i,QM(i,`session.id`));return eN(a,PD(s),c)}function aN(e){return{action:{fn:(t,...n)=>iN(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function oN(e,t){return eN(`โ`,PD([{verb:lD,args:[QM(e,`session.id`),t,Wc]}]),!1)}function sN(e,t,n){return new B({bgcolor:vn.fromRgba(t),color:vn.fromRgba(Aa(e,t,n))})}function cN(e,t,n){return new B({color:vn.fromRgba(sr(ba(e,`warning`),t,ka,n))})}function lN(e,t,n){return B.combine([sN(e,t,n),cN(e,t,n)])}function uN(e,t,n){return sN(e.palette,Ua(e.palette,e.disclosure,[t],n),n)}function dN(e,t,n,r,i){return r===void 0?n=>uN(e,{...n,distribution:t},i):(e,t)=>fN(r(t,n),i)}function fN(e,t){let n=ba(e,`background`);return new B({bgcolor:vn.fromRgba(n),color:vn.fromRgba(sr(ba(e,`primary`),n,4.5,t))})}function pN(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>mN(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function mN(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function hN(e,t){return new H(e).truncate(t,{marker:`โฆ`}).plain}function gN(e){return{current:null,drawnAt:e}}function _N(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 vN(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 yN(e){return new H(e).cellLength}function bN(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function xN(e){return Math.max(1,bN(e)-(yN(`โ`)+2*e.padding+e.seamCols))}function SN(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 CN(e,t){let n=yN(`โ`)+1,r=yN(`โ`)+1+yN(`โ`)+1,i=SN(e,t,n);return(i.length>1?SN(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function wN(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 TN(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 EN(e,t,n){let r=e.compiled.get(t),i=r&&XM(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 DN(e,t,n,r,i,a,o,s){let c=EN(a,e,`picker`),l=a.compiled.get(e),u=a.store,d=QM(u,`session.id`),f=`stateVar`in c?QM(u,c.stateVar):void 0,p=i?bN(a):1/0,m=c.library&&{groups:c.library.groups,entries:c.options.map(c.library.entry)},h=m===void 0?CN(c.options.map(yN),p):pN(m.entries,m.groups,i),g=parseInt(QM(u,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>PD([{verb:lD,args:[d,t.key,String(e)]}]),b=n.flatMap(([e,t])=>[e,t]),x=PD([{verb:lD,args:[d,...b]}]),S=r?[{verb:lD,args:[d,...b]}]:[],C=e=>PD([...nN(l,e,e,u,d).effects,...S]),w=(e,t)=>{let n=c.options[e];return eN(t,C(n),n===f,o({index:e,count:c.options.length},n))},T=[eN(`โ`,x,!1,s)];_>0&&T.push(eN(`โ`,y(_-1),!1));let ee=_<h.length-1?[eN(`โ`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[wN([...T,...e.map(e=>w(e,c.options[e])),...ee],i)]}let te=new B({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new H(`${v[0].label}${ne}`,{style:te})]:[],E=[wN([...T,...re,...ee],i)];for(let e of v){v.length>1&&E.push(wN([new H(e.label,{style:te})],i));let t=Math.max(...e.indices.map(e=>yN(c.options[e])));for(let n of e.indices){let e=c.options[n],r=m.entries[n].description,a=r===void 0?void 0:KO(r),o=` `.repeat(t-yN(e)+2),s=a===void 0?e:`${e}${o}${a}`;E.push(wN([w(n,hN(s,p))],i))}}return E}function ON(e,t){return{picker:{fn:(n,r,i,a,...o)=>{gy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=TN(e,r,`set-int`,`an int action ({ set, int: true })`),c=EN(e,n,`picker`);if(c.library!==void 0)throw Error(`{{ picker "${n}" โฆ }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let l=vN(t,`{{ picker }}`);if(l.bg===void 0)throw Error(`{{ picker }} is not available while segments.${l.segName}'s own "bg:" is being evaluated โ a picker is drawn on that background`);let[u]=DN(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,dN(l,pa(void 0),e,c.paletteOf,t.drawnAt()),cN(l.palette,l.bg,t.drawnAt()));return u},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function kN(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+yN(e(-(s+1)))+1+yN(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function AN(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=QM(a,`session.id`),{options:c}=t,l=c.length,u=QM(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=PD(nN(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>eN(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=kN(p,l,yN(`โ`)+1+yN(p(0))+1+yN(`โถ`),xN(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return wN([...v(-1).reverse(),eN(`โ`,h(-1),!1),g(0),eN(`โถ`,h(1),!1),...v(1)],!0)}function jN(e,t){return{carousel:{fn:(n,r,...i)=>{if(gy(`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=EN(e,n,`carousel`);return AN(n,o,e,dN(vN(t,`{{ carousel }}`),pa(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const MN=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function NN(e,t,n){let r=Ia(e,{hue:oa,depth:0},n);return[sa(t.hues).map((t,n)=>({text:MN[n%MN.length],colour:xa(e,t)})),[{text:`โพ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ba(e,`warning`)},{text:`error`,colour:ba(e,`error`)}]]}function PN(e,t,n,r){let i=NN(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:sN(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 FN(e,t){return{themePreview:{fn:()=>PN(e.palette,e.variation,t.drawnAt(),xN(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const IN=e=>e.slice(e.lastIndexOf(`.`)+1),LN=(e,t)=>{let n=new H(IN(e));return n.truncate(t,{marker:`โฆ`}),n.plain};function RN(e,t){let n=e.map(e=>e.map(({name:e})=>yN(IN(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 zN(e,t,n,r){let i=RN(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${LN(s,i)} `,{style:sN(l,qa(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(`
|
|
192
|
-
`),...e]));return o.overflow=`ignore`,o.end=``,o}function
|
|
190
|
+
`))if(n.trim())try{let e=vM(JSON.parse(n));e&&t.push(e)}catch(e){O(`Failed to parse JSONL line: ${e}`);continue}return t}async function bM(e){return yM(await fA(e,`utf-8`))}async function xM(e,t){let n=await mA(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:yM(r.subarray(0,c+1).toString(`utf-8`)),cursor:{offset:i+c+1,mtimeMs:a,ino:o},reset:s})}async function SM(e){return new Promise((t,n)=>{let r=[],a=i(e,{encoding:`utf8`}),o=ce({input:a,crlfDelay:1/0});o.on(`line`,e=>{let t=e.trim();if(t)try{let e=vM(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 CM=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 wM(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 TM=new Map,EM={cost:0,input:0,output:0,cacheCreation:0,cacheRead:0},DM={cost:null,calculatedCost:null,officialCost:null,tokens:null,tokenBreakdown:null};function OM(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function kM(){let e=new Date;return e.setHours(0,0,0,0),e.setDate(e.getDate()-1),e.getTime()}function AM(){return{input:0,output:0,cacheCreation:0,cacheRead:0}}async function jM(e,t,n,r){let i=OM(new Date(kM())),a=e&&!t?e:void 0,o=a?.entries??0,s=a?.cost??0,c=a?{...a.breakdown}:AM(),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 sM.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=OM(new Date(e.timestamp));if(r<i)continue;let a=l.get(r)??{...EM};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 MM(e){let t=0,n=0,r=AM(),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)??{...EM};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:DM,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 NM(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 PM=class{entries=new Map;flight=new CM;seeded=new Map;seededDay=``;speedRings=new Map;speedFlight=new CM;maxEntries;staleAgeMs;log;hits=0;misses=0;sweeps=0;seeds=0;sweepTimer=null;constructor(e={}){this.log=e.logger??$y,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:DM,i=t?.cost?.total_cost_usd??null;return J({session:{...r,cost:i??r.cost,officialCost:i}})}async getTodayInfo(e,t){let n=OM(new Date),r=fM(t);try{await this.ensureSeeded(n,r)}catch(e){return X(`usage seed: ${e instanceof Error?e.message:String(e)}`)}let i=await this.ingest(e?.session_id??``,e?.transcript_path);if(i.kind===`failed`)return i;let a=r.map(e=>f(e,`projects`)+p),o={...EM},s=!1;for(let[t,r]of this.entries){let i=r.transcriptPath??``,c=t===e?.session_id||a.some(e=>i.startsWith(e))?r.days:TM;s||=c.has(n);let l=c.get(n)??EM;o.cost+=l.cost,o.input+=l.input,o.output+=l.output,o.cacheCreation+=l.cacheCreation,o.cacheRead+=l.cacheRead}return s?J({cost:o.cost,tokens:o.input+o.output+o.cacheCreation+o.cacheRead,tokenBreakdown:{input:o.input,output:o.output,cacheCreation:o.cacheCreation,cacheRead:o.cacheRead},date:n}):Y}async observeSpeed(e,t,n){let r=cA(t);return this.speedFlight.run(`${e}:${r}`,async()=>{let i=await this.ingest(e,t,r);if(i.kind===`failed`)return i;let a=wM(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??cA(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 mM(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 xM(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 jM(r,l,s,c)),e===t&&(a=c.mtimeMs)}return J({files:i,...MM(i),mainMtime:a})}ensureSeeded(e,t){this.seededDay!==e&&(this.seeded.clear(),this.seededDay=e);let n=t.join(`\0`),r=this.seeded.get(n);if(r)return r;let i=this.seed(t);return this.seeded.set(n,i),i.catch(()=>{this.seeded.get(n)===i&&this.seeded.delete(n)}),i}async seed(e){let t=kM(),n=await pM(e),r=[];for(let e of n){let n;try{n=await dA(e)}catch{continue}for(let i of n){if(!i.endsWith(`.jsonl`))continue;let n=f(e,i),a;try{a=(await pA(n)).mtimeMs}catch{continue}a<t||r.push({sessionId:i.slice(0,-6),path:n,mtime:a})}}await NM(r,8,async e=>{let t=await this.ingest(e.sessionId,e.path,e.mtime);t.kind===`failed`&&this.log(`warn`,`usageStore seed: ${t.reason}`)}),this.seeds++,this.log(`info`,`usageStore seed sessions=${r.length} dirs=${e.join(`,`)}`)}sweepStale(){let e=Date.now(),t=0;for(let[n,r]of this.entries)e-r.lastSeenAt>this.staleAgeMs&&(this.entries.delete(n),this.speedRings.delete(n),t++);return t>0&&(this.sweeps++,this.log(`info`,`usageStore sweep dropped=${t}`)),t}evictIfNeeded(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(e===void 0)break;this.entries.delete(e),this.speedRings.delete(e),this.log(`info`,`usageStore evict ${e}`)}}close(){this.sweepTimer&&=(clearInterval(this.sweepTimer),null),this.entries.clear(),this.seeded.clear(),this.speedRings.clear()}},FM=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 _M(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)}},IM=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=cA(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await xM(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 LM={messageCount:0,recent:[]};function RM(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!hM(t),recent:n.length>20?n.slice(-20):n}}function zM(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(hM(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 BM=class{fold=new IM(LM,RM);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:zM(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 VM={command:null,todos:[],pending:[],done:[]};function HM(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 UM(e,t){if(t.isSidechain)return e;let n=hM(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=HM(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 WM(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>HM(e,t.name),[]),done:e.done}}var GM=class{fold=new IM(VM,UM);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(WM(n.value))}};function KM(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function qM(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function JM(e,t,n,r){return qM(ke(KM(e,t,n,r)),n)}async function YM(e,t,n){return qM(await Oe(KM(e,t,n)),n)}const XM=e=>`${e.socket}\n${e.pane}`;var ZM=class{names=new Map;asking=new CM;constructor(e=Date.now){this.now=e}getSessionName(e){let t=XM(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){O(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await YM(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const QM=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:Ye.map(t=>e.env?.[t]??null)]);var $M=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=QM(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=QM(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}};function eN(e){return{gitProvider:new cb({watchers:e.watchers,logger:e.logger}),usageStore:new PM({logger:e.logger}),contextProvider:new FM,metricsProvider:new BM,activityProvider:new GM,tmuxService:new ZM,mementoProvider:new $M(MA()),autoCompact:sS,log:e.logger}}function tN(e,t){return e===void 0?!0:e.evaluate(t).map(e=>e.plain).join(``)!==`false`}function nN(e,t){let n=H.fromFragments(e);return n.end=``,n.overflow=`ignore`,t!==void 0&&!t.isNull&&(n.style=t),n}function rN(e,t,n){e.cellLength>t?e.truncate(t,{mode:n.truncate,marker:`โฆ`}):e.cellLength<t&&e.align(n.justify,t)}function iN({lead:e,text:t,trail:n}){return[...e===void 0?[]:[e],t,...n===void 0?[]:[n]]}function aN(e){let t=iN(e);if(t.length===1)return e.text;let n=nN(t);return n.style=e.text.style,n}function oN(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=nN(e,a).pad(o),u=new H(` `.repeat(o)),d={...s.length>0&&{lead:nN([u,...s],a)},...c.length>0&&{trail:nN([...c,u],a)}};if(n===`auto`)return[{text:l,...d}];let f={justify:r,truncate:i};return n===`fill`?[{text:l,fill:f,...d}]:(rN(l,n,f),[{text:l,...d}])}const sN=RegExp(`\\x1b\\[[0-9;]*m|${bi.source}`,`g`);function cN(e){return M(e.replace(sN,``))}function lN(e,t){let n=e.map(aN),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=ok(n,t).split(`
|
|
191
|
+
`);if(i.length>1)return n;let a=Math.max(0,t.width-cN(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];rN(l,l.cellLength+c,i),n[t]=aN(e[t])}),n}function uN(e,t){let n=[],r=[],i=()=>{if(!r.length)return;let e=dN(r,t);e.plain.length>0&&n.push(e),r=[]};for(let a of e)if(pN(a.style).link){i();let e=dN([a],t);e.plain.length>0&&n.push(e)}else r.push(a);return i(),n}function dN(e,t){let n=t!==void 0&&!t.isNull?e.map(e=>fN(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 fN(e,t){let n=e.copy();return n.style=t.add(pN(e.style)),n}function pN(e){return e instanceof B?e:B.parse(e)}function mN(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,hN(e,t,o,n,r,i));return i}function hN(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=ox(n.from,i);return{kind:`set-option`,key:n.set,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}return`int`in n?{kind:`set-int`,key:n.set,stateVar:e}:`cycle`in n?{kind:`set-cycle`,key:n.set,stateVar:e,members:n.cycle}:{kind:`set-bounded`,key:n.set,by:n.by}}if(`persist`in n){let e=Rb.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=ox(n.from,i);return{kind:`persist-option`,key:n.persist,stateVar:e,options:[...t.members],paletteOf:t.paletteOf,library:t.library}}if(`cycle`in n)return{kind:`persist-cycle`,key:n.persist,stateVar:e,members:n.cycle};if(`removeSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`remove`,target:n.removeSegment}};if(`insertSegment`in n)return{kind:`layout-op`,key:n.persist,op:{op:`insert`,segment:n.insertSegment,anchor:n.anchor,relation:n.relation}};if(`insertSegmentFrom`in n){let e=ox(n.insertSegmentFrom,i);return{kind:`layout-op-option`,key:n.persist,anchor:n.anchor,relation:n.relation,options:[...e.members],paletteOf:e.paletteOf,library:e.library}}return{kind:`persist-bounded`,key:n.persist,by:n.by}}if(`copy`in n)return{kind:`copy`,text:_N(e,n.copy,t)};if(`open`in n)return{kind:`open`,target:_N(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:hw(n)};if(`slash`in n)return{kind:`slash`,line:n.slash};if(`undo`in n)return{kind:`undo`};if(`redo`in n)return{kind:`redo`};if(`back`in n)return{kind:`back`};if(`rewind`in n)return{kind:`rewind`};if(`save`in n)return{kind:`save`};if(`preset`in n)return n.preset===`save`?{kind:`preset-save`}:{kind:`preset-delete`,name:_N(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 gN(e){return e.kind===`do`?gN(e.head):e}function _N(e,t,n){try{return e(t)}catch(e){throw Error(`Template parse error in actions.${n}: ${e.message}`,{cause:e})}}function vN(e,t){return e.has(t)?Av(e.read(t)):``}function yN(e,t){return e.evaluate(t).map(e=>e.plain).join(``)}function bN(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 xN(e,t){return Math.max(e.members.indexOf(vN(t,e.stateVar)),0)}function SN(e,t,n,r,i){switch(e.kind){case`set-literal`:{let t=vN(r,e.stateVar);return{effects:[{verb:lD,args:[i,e.key,e.value]}],active:t===e.value}}case`set-option`:{let a=n??t,o=vN(r,e.stateVar);return{effects:[{verb:lD,args:[i,e.key,a]}],active:o===a}}case`set-int`:{let a=n??t,o=vN(r,e.stateVar);return{effects:[{verb:lD,args:[i,e.key,a]}],active:o===a}}case`set-cycle`:{let t=e.members[(xN(e,r)+1)%e.members.length];return{effects:[{verb:lD,args:[i,e.key,t]}],active:!1}}case`set-bounded`:return{effects:[{verb:uD,args:[i,e.key,String(e.by)]}],active:!1};case`copy`:return{effects:[{verb:dD,args:[yN(e.text,Sy(r))]}],active:!1};case`open`:return{effects:[{verb:fD,args:[yN(e.target,Sy(r))]}],active:!1};case`persist-literal`:{let t=vN(r,e.stateVar);return{effects:[{verb:gD,args:[i,e.key,e.value]}],active:t===e.value}}case`persist-option`:{let a=n??t,o=vN(r,e.stateVar);return{effects:[{verb:gD,args:[i,e.key,a]}],active:o===a}}case`persist-cycle`:{let t=e.members[(xN(e,r)+1)%e.members.length];return{effects:[{verb:gD,args:[i,e.key,t]}],active:!1}}case`persist-bounded`:return{effects:[{verb:_D,args:[i,e.key,String(e.by)]}],active:!1};case`reset`:return{effects:[{verb:xD,args:[i,e.key]}],active:!1};case`undo`:return{effects:[{verb:CD,args:[i]}],active:!1};case`redo`:return{effects:[{verb:wD,args:[i]}],active:!1};case`back`:return{effects:[{verb:TD,args:[i]}],active:!1};case`rewind`:return{effects:[{verb:ED,args:[i]}],active:!1};case`save`:return{effects:[{verb:vD,args:[i]}],active:!1};case`preset-save`:return{effects:[{verb:yD,args:[i]}],active:!1};case`preset-delete`:return{effects:[{verb:bD,args:[i,yN(e.name,Sy(r))]}],active:!1};case`doctor-run`:return{effects:[{verb:OD,args:[i]}],active:!1};case`doctor-fix`:return{effects:[{verb:kD,args:[i,e.check]}],active:!1};case`ceiling`:return{effects:[{verb:AD,args:[i,...e.args]}],active:!1};case`slash`:return{effects:[{verb:jD,args:[i,e.line]}],active:!1};case`layout-op`:return{effects:[{verb:SD,args:[i,e.key,Ok(e.op)]}],active:!1};case`do`:{let a=SN(e.head,t,n,r,i);return{effects:[...a.effects,...e.rest.flatMap(e=>SN(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:SD,args:[i,e.key,Ok(r)]}],active:!1}}}}function CN(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,xN(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 wN(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}=CN(e,gN(r),t,i),{effects:s,active:c}=SN(r,a,o,i,vN(i,`session.id`));return bN(a,PD(s),c)}function TN(e){return{action:{fn:(t,...n)=>wN(t,n,e),argTypes:[`string`,`string`],arity:{kind:`variadic`},returnType:`T`}}}function EN(e,t){return bN(`โ`,PD([{verb:lD,args:[vN(e,`session.id`),t,Wc]}]),!1)}function DN(e,t,n){return new B({bgcolor:vn.fromRgba(t),color:vn.fromRgba(Aa(e,t,n))})}function ON(e,t,n){return new B({color:vn.fromRgba(sr(ba(e,`warning`),t,ka,n))})}function kN(e,t,n){return B.combine([DN(e,t,n),ON(e,t,n)])}function AN(e,t,n){return DN(e.palette,Ua(e.palette,e.disclosure,[t],n),n)}function jN(e,t,n,r,i){return r===void 0?n=>AN(e,{...n,distribution:t},i):(e,t)=>MN(r(t,n),i)}function MN(e,t){let n=ba(e,`background`);return new B({bgcolor:vn.fromRgba(n),color:vn.fromRgba(sr(ba(e,`primary`),n,4.5,t))})}function NN(e,t,n){let r=t.map(t=>({label:t.label,indices:e.flatMap((e,n)=>e.group===t.id?[n]:[])})).filter(e=>e.indices.length>0);if(r.reduce((e,t)=>e+t.indices.length,0)!==e.length){let n=new Set(t.map(e=>e.id)),r=e.flatMap((e,t)=>n.has(e.group)?[]:[`#${t} (group "${e.group}")`]);throw Error(`library: ${r.join(`, `)} name a group the domain does not list (${[...n].join(`, `)})`)}return n?r.flatMap(e=>PN(e.indices,8).map(t=>[{label:e.label,indices:t}])):[r]}function PN(e,t){return Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))}function FN(e,t){return new H(e).truncate(t,{marker:`โฆ`}).plain}function IN(e){return{current:null,drawnAt:e}}function LN(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 RN(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 zN(e){return new H(e).cellLength}function BN(e){return Math.max(1,e.width-e.chromeCols-2*e.padding)}function VN(e){return Math.max(1,BN(e)-(zN(`โ`)+2*e.padding+e.seamCols))}function HN(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 UN(e,t){let n=zN(`โ`)+1,r=zN(`โ`)+1+zN(`โ`)+1,i=HN(e,t,n);return(i.length>1?HN(e,t,n+r):i).map(e=>[{label:``,indices:e}])}function WN(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 GN(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 KN(e,t,n){let r=e.compiled.get(t),i=r&&gN(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 qN(e,t,n,r,i,a,o,s){let c=KN(a,e,`picker`),l=a.compiled.get(e),u=a.store,d=vN(u,`session.id`),f=`stateVar`in c?vN(u,c.stateVar):void 0,p=i?BN(a):1/0,m=c.library&&{groups:c.library.groups,entries:c.options.map(c.library.entry)},h=m===void 0?UN(c.options.map(zN),p):NN(m.entries,m.groups,i),g=parseInt(vN(u,t.stateVar),10),_=Number.isInteger(g)?Math.max(0,Math.min(g,h.length-1)):0,v=h[_]??[],y=e=>PD([{verb:lD,args:[d,t.key,String(e)]}]),b=n.flatMap(([e,t])=>[e,t]),x=PD([{verb:lD,args:[d,...b]}]),S=r?[{verb:lD,args:[d,...b]}]:[],C=e=>PD([...SN(l,e,e,u,d).effects,...S]),w=(e,t)=>{let n=c.options[e];return bN(t,C(n),n===f,o({index:e,count:c.options.length},n))},T=[bN(`โ`,x,!1,s)];_>0&&T.push(bN(`โ`,y(_-1),!1));let ee=_<h.length-1?[bN(`โ`,y(_+1),!1)]:[];if(m===void 0){let e=v.flatMap(e=>e.indices);return[WN([...T,...e.map(e=>w(e,c.options[e])),...ee],i)]}let te=new B({bold:!0}),ne=h.length>1?` ${_+1}/${h.length}`:``,re=v.length===1?[new H(`${v[0].label}${ne}`,{style:te})]:[],E=[WN([...T,...re,...ee],i)];for(let e of v){v.length>1&&E.push(WN([new H(e.label,{style:te})],i));let t=Math.max(...e.indices.map(e=>zN(c.options[e])));for(let n of e.indices){let e=c.options[n],r=m.entries[n].description,a=r===void 0?void 0:KO(r),o=` `.repeat(t-zN(e)+2),s=a===void 0?e:`${e}${o}${a}`;E.push(WN([w(n,FN(s,p))],i))}}return E}function JN(e,t){return{picker:{fn:(n,r,i,a,...o)=>{gy(`picker "${n}"`,[`closeOnPick`,`paged`],o);let s=GN(e,r,`set-int`,`an int action ({ set, int: true })`),c=KN(e,n,`picker`);if(c.library!==void 0)throw Error(`{{ picker "${n}" โฆ }} ranges a catalogue domain, which lays out as one row per member; a catalogue renders in a {{ menu }} body`);let l=RN(t,`{{ picker }}`);if(l.bg===void 0)throw Error(`{{ picker }} is not available while segments.${l.segName}'s own "bg:" is being evaluated โ a picker is drawn on that background`);let[u]=qN(n,{key:s.key,stateVar:s.stateVar},[[s.key,`-1`]],i===!0,a===!0,e,jN(l,pa(void 0),e,c.paletteOf,t.drawnAt()),ON(l.palette,l.bg,t.drawnAt()));return u},argTypes:[`string`,`string`,`bool`],arity:{kind:`variadic`},returnType:`T`}}}function YN(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+zN(e(-(s+1)))+1+zN(e(s+1))+1;if(t>r)break;o=t,s+=1}return s}function XN(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=vN(a,`session.id`),{options:c}=t,l=c.length,u=vN(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=PD(SN(o,p(e),p(e),a,s).effects);return m.set(e,n),n},g=e=>bN(p(e),h(e),p(e)===u,r({index:f(e),count:l},p(e))),_=YN(p,l,zN(`โ`)+1+zN(p(0))+1+zN(`โถ`),VN(n),i),v=e=>Array.from({length:_},(t,n)=>g(e*(n+1)));return WN([...v(-1).reverse(),bN(`โ`,h(-1),!1),g(0),bN(`โถ`,h(1),!1),...v(1)],!0)}function ZN(e,t){return{carousel:{fn:(n,r,...i)=>{if(gy(`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=KN(e,n,`carousel`);return XN(n,o,e,jN(RN(t,`{{ carousel }}`),pa(void 0),e,o.paletteOf,t.drawnAt()),a)},argTypes:[`string`,`int`],arity:{kind:`variadic`},returnType:`T`}}}const QN=[`~/code`,`main`,`opus`,`42%`,`5m`,`$1.20`];function $N(e,t,n){let r=Ia(e,{hue:oa,depth:0},n);return[sa(t.hues).map((t,n)=>({text:QN[n%QN.length],colour:xa(e,t)})),[{text:`โพ open`,colour:r.state},{text:`menu`,colour:r.plane}],[{text:`warn`,colour:ba(e,`warning`)},{text:`error`,colour:ba(e,`error`)}]]}function eP(e,t,n,r){let i=$N(e,t,n).flatMap((t,r)=>t.map(({text:t,colour:i},a)=>({gap:r>0&&a===0?` `:``,cell:new H(` ${t} `,{style:DN(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 tP(e,t){return{themePreview:{fn:()=>eP(e.palette,e.variation,t.drawnAt(),VN(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}const nP=e=>e.slice(e.lastIndexOf(`.`)+1),rP=(e,t)=>{let n=new H(nP(e));return n.truncate(t,{marker:`โฆ`}),n.plain};function iP(e,t){let n=e.map(e=>e.map(({name:e})=>zN(nP(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 aP(e,t,n,r){let i=iP(e,r),a=e.map(e=>{let a=[],o=0;for(let{name:s,address:c,palette:l}of e){let e=new H(` ${rP(s,i)} `,{style:DN(l,qa(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(`
|
|
192
|
+
`),...e]));return o.overflow=`ignore`,o.end=``,o}function oP(e,t){return{layoutPreview:{fn:()=>aP(e.layout(),e.variation,t.drawnAt(),VN(e)),argTypes:[],arity:{kind:`exact`},returnType:`T`}}}function sP(e,t,n,r){let i=RN(r.activeSegment,`{{ menu }}`),a=r.action,o=__(i.placementId,e,n.key),s=b_(o),c=g_(e),l=vN(a.store,o)===c,u=vN(a.store,`session.id`),d=l?Wc:c,f=bN(qc(`{{ menu "${e}" }}`,t,2,+!!l),PD([{verb:lD,args:[u,o,d,s,`0`]}]),!1);return i.drops.push(...l?qN(e,{key:s,stateVar:s},[[o,Wc],[s,`0`]],n.closeOnPick,n.paged,a,jN(i,n.distribution,a,KN(a,e,`menu`).paletteOf,r.activeSegment.drawnAt()),ON(i.palette,Ia(i.palette,i.disclosure,r.activeSegment.drawnAt()).plane,r.activeSegment.drawnAt())):[]),f}const cP=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function lP(e,t){let n=t[t.length-1],r=cP(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:w_(r??{})}}function uP(e){return{menu:{fn:(t,...n)=>{let{displays:r,options:i}=lP(t,n);return sP(t,r,i,e)},argTypes:[`string`,`value`],arity:{kind:`variadic`},returnType:`T`}}}function dP(e){let{value:t,max:n,width:r,filled:i,empty:a,colourAt:o}=e,s=fP(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 fP(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 pP(e){let t={fn:(()=>{let t=RN(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:(()=>RN(e,`{{ tint }}`).tint.hex),argTypes:[],arity:{kind:`exact`},returnType:`string`},r=ny(()=>RN(e,`{{ color }} / {{ ramp }} / {{ gauge }}`).palette),i={fn:((e,t,n,i,a,o,...s)=>{let c=o===void 0?void 0:[o,...mP(s)];return dP({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 mP(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 hP(e){let t=[],n=[];for(let r of e){if(!r.contains(`
|
|
193
193
|
`)){n.push(r);continue}let e=r.split(`
|
|
194
|
-
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function XN(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,...ZN(e,r)]}function ZN(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 QN(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:XN(e.direction,e.children.map((t,i)=>n(t,[...r,$N(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function $N(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Ds[e.direction]}}const eP={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:pa(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ns(t.path,n)))}},render(e,t){return XN(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,$N(e,r))))}},tP={drop:e=>e.place,above:()=>`above`},nP={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},rP={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=wy(t.scope,e.settings);try{if(!FM(i.when,a))return[];let n=Wb(e.settings.theme,t.palette),o=e.opens!==void 0&&FM(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:tP[h.placement](e)})),_=YN(WM(c,p)).map((e,t)=>({cells:BM(e,{...m,lead:t===0?WM(l,p):[],trail:t===0?WM(u,p):[]}),band:`own`,place:`flow`})),v=d.map(e=>({cells:BM(WM([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),y=(e,t,n)=>BM(WM([e],t),{...m,width:`auto`,baseStyle:t,padding:n}),b=g.findIndex(e=>e.band===`own`),{lead:x,stays:S}=h!==void 0&&b!==-1?nP[h.placement](_,()=>y(t.closeDisclosure(h.key),s.close,t.padding)):{lead:[],stays:_},C=x.flatMap(e=>y(new H(` `.repeat(RM(e).reduce((e,t)=>e+t.cellLength,0))),s.trigger,0)),w=(e,t)=>e.band===`own`?t===b?x:C:[],T=g.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),ee=[...S,...v];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...ee.flatMap(e=>e.cells),...g.flatMap(w)].flatMap(RM)),[...ee,...T]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:BM([new H(`โ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:iP(e.lead,e,a,t),trail:iP(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function iP(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 aP={container:eP,segment:rP};function oP(e){return aP[e]}function sP(e){if(`ttl`in e)return{kind:`ttl`,durationMs:db(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 cP(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 lP(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:sP(n.cache),parse:cP(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:sP(n.cache),parse:cP(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?db(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 uP(e,t){let n=Yd.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 dP=e=>xo(void 0,null,e.globals.variation);function fP(e,t,n){let r=n.cwd,i=Zb(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:ik({endcaps:`powerline`,charset:go}),width:80,basePalette:i,palette:i,variation:aa[dP(e)],padding:1,seamCols:ak({endcaps:`powerline`,charset:go}),layout:()=>[]},o=gN(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=D_(e.presets),u=new Map([...tx(e),...JC(e)]),d=xy({...aN(a),...ON(a,o),...jN(a,o),...FN(a,o),...BN(a,o),...WN(s),...qN(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=uP(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 Ib)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=JM(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{lP(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{lP(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Hs(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>qs(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return oP(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=A_(e,t);C.set(t,S(n,r))}let w=new Map(ro.map(e=>[e,new Map])),T=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of T)for(let n of ro){let r=t[n];if(!io(r))continue;let i=`${e}.${n}`,a=w.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:pP(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:w,loadWarnings:_}}function pP(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 mP(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 hP(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function gP(e,t){return e.kind===`decided`?e.name:t}function _P(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(vo(a.colorCompatibility));let{preset:d=T_}=s??{},f=j_(e,d),p=aa[s?.variation??xo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??lo(`none`,e.styles),h=s?.theme??Yb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(gP(h,Xa),gP(m,so))),t.menuRuntime.action.chromeCols=ik(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=ak(a);let _=Sy(n),v=oo(h,e=>{let n=mP(t,`palette`,e);return Jb(hP(n,_),n.where,e=>u?.(e))}),y=oo(m,n=>lo(hP(mP(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=Kb(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}=qa(i,a,c),d=_N(t.activeSegment,e.name,e.id,i,u,l),f=yx(d,c,o.bg,o.fg,n),p=()=>Ia(i,u,c).state;s&&(d.bg=p());let m=o.body.evaluate(n),h=d.drops.length>0||s;h&&(d.bg=p());let g=o.lead?.evaluate(n)??[],_=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return sN(i,p(),c)},get band(){return sN(i,Ia(i,u,c).plane,c)},get close(){return lN(i,p(),c)},disclosure:u},fragments:m,lead:g,trail:_,drops:d.drops,open:h}}finally{t.activeSegment.current=null}},w=(e,t,r)=>{let i=t&&FM(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)=>w(e,t,Ga(r,n)),renderBody:(e,t,n)=>w(e,i&&t,Ka(n)),closeDisclosure:e=>oN(n,e)};return oP(e.kind).render(e,o)},T=t.roots.get(d);if(T===void 0)throw Error(`Preset "${d}" has no compiled layout โ registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${T_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let ee=e=>{if(!FM(e.when,_))return!1;if(e.kind===`container`)return!0;if(rw(e.name)===void 0)return!1;try{return FM(t.segments[e.name].when,wy(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>QN(T,ee).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=rw(e);return r===void 0?[]:[{name:r,address:t,palette:Wb(n.theme,x)}]})),w(T,!0,Wa(p)).map(e=>ok(UM(e.cells,a),a)).join(`
|
|
195
|
-
`)}var
|
|
196
|
-
`)||null}var jP=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=EP(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.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=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}loadFromDisk(e,t,n){let r=LT(e,t,n),i=r.kind===`file`?r.path:null,a=[VT(e,t),zT(r)],o;try{o=this.buildState(t,i,a)}catch(e){return e instanceof xs&&a.push(...e.warnings),{resolvedPath:i,warning:AP(a),state:null,error:e instanceof xs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:AP(a),state:o,error:null}}buildState(e,t,n){let r=HT(t,aA),{config:i,raw:a}=r;n.push(...r.warnings);let o=GT(r,t??`<default>`),s=new TP,c=new Ob(s,o.globals.default_empty_value??``,this.deps.gitService,this.deps.sessionState),l;try{l=fP(o,c,{cwd:e}),n.push(...l.loadWarnings),Ij(o),Uk(o)}catch(e){throw c.dispose(),e}return{config:o,store:s,registry:c,compiled:l,neededInputPaths:qA(o),lastRenderCellsBySegment:new Map,authoredRoots:DP(i,a),fileHeldSettings:Sj(a)}}refreshWatcher(e,t){e.configFilePath=t;let n=kP(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 MP=16384;var NP=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<MP){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%MP}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:BD,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 PP(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 FP={load:()=>({}),save:()=>{},flush:()=>{}};function IP(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var LP=class{sessions;storage;atom=(0,Dv.createAtom)(`SessionState`);constructor(e=FP,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=IP(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,Dv.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,Dv.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,Dv.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 RP=(e,t)=>O(t);function zP(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 BP=class{timer=null;pending=null;constructor(e,t=500,n=RP){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 zP(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 VP={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`},HP=new Set([`1`,`true`]),UP=new Set([`0`,`false`,``]);function WP(e,t){let n=hF(e),r=n.scope===`segment-palette`?`string`:VP[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(HP.has(t))return`true`;if(UP.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function GP(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function KP(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),je(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function qP(e){return/^\s*$/.test(e)?null:Lo(e)}function JP(e,t){return e!==null&&zo(e,t)!==void 0}function YP(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(YP),...i}}return e}function XP(e){if(!Mc(e))return YP(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,YP(t)])),...n}}const ZP=rA,QP=ZP.segments,$P=ZP.presets,eF=ZP.root;function tF(e,t,n,r){if(!JP(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function nF(e,t){let n=px(t);return t.scope===`segment-palette`&&tF(e,[`segments`,t.segment],QP[t.segment],n.join(`.`)),n}function rF(e){return Lo(qo(e))}function iF(){return Object.entries(eF.rows).map(([e,t])=>{let n=YP(t);return{path:[`root`],fragment:rF({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function aF(e,t){let n=e===null?void 0:zo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function oF(e,t){if(t===void 0)return null;let n=XP(t);return{path:e,fragment:rF(n),unit:{path:e,value:n}}}function sF(e,t){let n=[`presets`,t],r=[...n,`root`],i=$P[t];tF(e,n,i,r.join(`.`));let a=aF(e,r)??oF(r,i?.root);return a!==null&&ms(a.fragment)?a:null}function cF(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 lF(e,t){return[...iF(),aF(e,[`root`]),sF(e,t)].filter(e=>e!==null).reduce(cF,new Map)}function uF(e,t,n){for(let{node:r,...i}of lF(e,t).values())if(gs(r,n))return i;throw new $(`${dF(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 dF(e,t){return sF(e,t)?.path??[`root`]}function fF(e,t){return t.scope===`preset-root`?dF(e,t.preset):px(t)}function pF(e,{unit:t}){return t===null?e:ss(e,t.path,qo(t.value),Go)}function mF(e){let t=fx(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function hF(e){let t=mF(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function gF(e,t,n,r){_F(t,r),KP(t,r,e.logger),e.record(t,n,r)}function _F(e,t){try{return GT(UT(e,t,aA),e)}catch(e){throw e instanceof xs?new $(`refused: the config file would not load after this click โ ${e.message}`):e}}function vF(e,t){let n=hF(t),r=qP(GP(e)??``),i=r===null?void 0:zo(r,px(n));return i!==void 0&&`value`in i?i.value:void 0}function yF(e,t,n){bF(e,t,n,[])}function bF(e,t,n,r){let i=GP(t);gF(e,t,i,xF(n.reduce((e,[t,n])=>ss(e,nF(qP(e),hF(t)),WP(t,n),Go),i??``),t,r,e=>e))}function xF(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=uF(qP(s),n,i),l=bs(pF(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 SF(e,t,n){let r=qP(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of lF(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(sF(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 CF(e,t){return ls(e,t,t[0]===`presets`&&t.length>2&&!sA(t[1])?2:0)}function wF(e,t,n){let r=n.map(mF),i=GP(t);if(i===null)return;let a=r.reduce((e,t)=>CF(e,fF(qP(e),t)),i);a!==i&&gF(e,t,i,a)}function TF(e){let t=e===null?void 0:zo(e,[`presets`]),n=new Set([...oA,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(yu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(yu(e)))}function EF(e,t,n,r,i,a){let o=GP(t),s=qP(o??``),c=TF(s),l=[`presets`,c],u=sF(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=dx(c,e);return[nF(s,hF(n)),WP(n,t)]});return gF(e,t,o,xF([...d,...f].reduce((e,[t,n])=>ss(e,t,n,Go),ss(o??``,l,`{}`,Go)),t,a.map(e=>({...e,preset:c})),SF)),c}function DF(e,t,n){if(sA(n))throw new $(`cannot delete preset "${n}": it is bundled โ reset its settings instead`);let r=[`presets`,n],i=GP(t),a=qP(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`]);gF(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>CF(e,t),i))}function OF(e,t,n,r){let i=mF(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=GP(t),o=r.op===`remove`?r.target:r.anchor,s=uF(qP(a??``),i.preset,o),c=pF(a??``,s),{after:l,placed:u}=kF(c,s.path,r,()=>{let e=_F(t,c);return D_(e.presets).map(t=>A_(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 gF(e,t,a,l),u}function kF(e,t,n,r){switch(n.op){case`remove`:return{after:vs(e,t,n.target),placed:null};case`insert`:{let i=Ak(n.segment,n.anchor,r());return{after:ys(e,t,i,n.anchor,n.relation),placed:i}}}}const AF={load:()=>({}),save:()=>{}},jF=new Set(Mb.map(e=>e.sessionKey)),MF=e=>jF.has(e)||e.startsWith(Z_),NF=8*1024*1024,PF={past:[],future:[]},FF=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var IF=class{state=new Map;constructor(e,t,n=AF){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??PF;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??PF}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(FF(n));r.set(FF(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:PP(this.sessionState,e=>MF(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:WF(i,n),o=r.get(e),s=o===void 0?a:JF(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,KF(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint โ nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(FF)),a=n.net.filter(e=>!i.has(FF(e))),o=zF(YF(qF(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(ZF).join(`, `)} changed since edit mode opened โ kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=zF(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...VF(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(FF)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:YF(n,t),future:YF(i,t),...a!==void 0&&{savepoint:{at:YF([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(FF(e))),below:YF(a.below,t)}}}),new $(`${r}: ${o.map(ZF).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):GP(t.file)}write(e,t,n){t.kind===`file`?KP(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||LF(n)>NF;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,RF(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${NF} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function LF(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function RF({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...VF(n,1,[])}:{past:e,future:t.slice(1),...VF(n,0,[])}}function zF(e){return e.slice(-50)}const BF=e=>e===$_.member;function VF(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:HF(e.net,n),below:e.below}}}function HF(e,t){let n=new Map(e.map(e=>[FF(e),e]));for(let e of t){let t=n.get(FF(e));n.set(FF(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const UF=e=>e.map(e=>({...e,before:e.after,after:e.before}));function WF(e,t){let n=[...e.past,t],r=zF(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...VF(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...GF(e.future,a),...i.below]},n.length-r.length,t)}}function GF(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function KF(e,t){return{past:e.past.slice(0,-1),future:zF([...e.future,t]),...VF(e.savepoint,0,UF(t))}}function qF(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...GF(r,t.at-i.length),...t.below]}function JF(e,t){if(BF(t.after)&&!BF(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!BF(t.after)&&BF(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function YF(e,t){return e.map(e=>e.filter(e=>!t.has(FF(e)))).filter(e=>e.length>0)}function XF(e){return e.map(ZF).join(`, `)}function ZF(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function QF(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 $F(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(QF))}function eI(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(QF)&&$F(t.below)}function tI(e){if(typeof e!=`object`||!e)return!1;let t=e;return $F(t.past)&&$F(t.future)&&(t.savepoint===void 0||eI(t.savepoint))}function nI(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(tI))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),je(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 rI=e=>!MF(e)&&!Bx(e)&&e!==`update.dismissed`;var iI=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:PP(e,rI,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,Dv.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function aI(e,t,n,r){return{bin:`tmux`,args:[`-S`,e.socket,...n],timeoutMs:2e3,category:t,stdinInput:r}}function oI(e,t){if(e.ok)return{kind:`ok`,stdout:e.stdout};if(e.reason===`rate-limited`)return{kind:`rate-limited`,reason:e.error??`rate-limited`};let n=e.error??[e.reason,e.stderr.trim()].filter(e=>e!==``).join(`: `);return{kind:`failed`,reason:`tmux ${t[0]} failed (${n})`}}function sI(e,t,n,r){return oI(ke(aI(e,t,n,r)),n)}async function cI(e,t,n){return oI(await Oe(aI(e,t,n)),n)}function lI(e){let t=sI(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 uI(){return{probeTmux:lI}}function dI(e){let t=$x(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 fI(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function pI(e,t){return{tmux:fI(e,t.tmux),claudeSettings:dI(Xx(Yx(t.claudeConfigDir)))}}function mI(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ss(Qx(n),[`env`,e.name],JSON.stringify(e.value),Ko);return r.mkdirSync(c.dirname(n),{recursive:!0}),je(n,i),{...t,claudeSettings:dI(n)}}default:return e.kind}}const hI=/^โ{20,}/,gI=/^โฏ(\s|$)/,_I=/โบ\s*stashed$/;function vI(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>hI.test(e)?[t]:[]).at(-2);return n===void 0||!gI.test(t[n+1]??``)?{kind:`no-prompt`}:_I.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const yI={"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 bI(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=vI(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:yI[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const xI=`cc-candybar-slash`;function SI(e,t,n,r){let i=sI(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function CI(e){let t=SI(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(`
|
|
197
|
-
`);return{inMode:n!==`0`,screen:r}}function wI(e,t){let n=SI(e,`claude-input.type`,[`load-buffer`,`-b`,xI,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,xI,`-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 TI(){return{read:CI,type:wI}}function EI(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function DI(e){return OI(()=>decodeURIComponent(e))}function OI(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function kI(e,t){let n=ke({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 AI=(e,t)=>kI(DI(e),t),jI=(e,t)=>{let n=ke({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,DI(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`})`)}},MI=(e,t)=>kI(DI(e),t),NI=(e,t)=>kI(DI(e),t),PI=(e,t)=>{let n=EI(DI(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},FI=(e,t)=>{let[n=``,...r]=OI(()=>ND(e)),i=EI(n),a=Ij(qI(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}zI(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},II=/^-?\d+$/;function LI(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const RI=(e,t)=>{let[n=``,r=``,i=``]=OI(()=>ND(e)),a=EI(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!II.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=qI(t,a),c=Ij(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&II.test(u)?BI(l,parseInt(u,10)):VI(`step-state`,r,l,zj(s,e=>t.sessionState.get(a,e),r)),f=LI(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);zI(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}โ${p.value} (by ${o}, session=${a})`)};function zI(e,t,n,r){let i=r.filter(e=>e.key.startsWith(Z_));if(i.length===0)return;let a=_j(qI(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused โ ${a.join(`; `)}`)}function BI(e,t){return Math.max(e.min,Math.min(e.max,t))}function VI(e,t,n,r){if(r===null)return n.min;if(!II.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return BI(n,parseInt(r,10))}const HI=`render-origin`;function UI(e){return JSON.stringify(e)}function WI(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 GI(e,t){let n=e.sessionState.get(t,HI);if(n===null)throw new $(`session ${t} has not rendered yet โ no config to act on`);return WI(n)}function KI(e,t,n){let r=e.sessionState.get(t,HI);if(r===null)return;let i=WI(r),a=JI(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function qI(e,t){return e.configFor(GI(e,t))}function JI(e){return RT(e.projectDir,e.cwd,e.configFile??void 0)}function YI(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const XI=(e,t)=>{let[n=``,r=``,i=``]=OI(()=>ND(e)),a=EI(n),o=GI(t,a),s=t.configFor(o),c=Uk(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=JI(o),d=hj(s,e=>t.sessionState.get(a,e),r);yF(YI(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} โ ${u} (session=${a})`)},ZI=(e,t)=>{let[n=``,r=``,i=``]=OI(()=>ND(e)),a=EI(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!II.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=GI(t,a),c=t.configFor(s),l=Uk(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=JI(s),f=hj(c,e=>t.sessionState.get(a,e),r),p=vF(d,f.key),m=typeof p==`number`?BI(u,p):VI(`step-config`,r,u,Gk(f.globals,r)),h=LI(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);yF(YI(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}โ${g.value} (by ${o}) โ ${d} (session=${a})`)},QI=(e,t)=>{let[n=``]=OI(()=>ND(e)),r=EI(n),i=GI(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=pj(a,o),c=gj(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=Ij(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});eL(`save`,l,c);let d=JI(i);bF(YI(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map($I)].join(` `)} โ ${d} (session=${r})`)},$I=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Ks(e.value)}`;function eL(e,t,n){for(let r of n){let n=t.validate(r.key,Ks(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const tL=(e,t)=>{let[n=``]=OI(()=>ND(e)),r=EI(n),i=GI(t,r),a=t.configFor(i),o=bj(a,e=>t.sessionState.get(r,e)),s=Ij(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});eL(`save-preset`,s,o.placements);let l=JI(i),u=EF(YI(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...Mb.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,jb.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map($I)].join(` `)} โ ${l} (session=${r})`)},nL=(e,t)=>{let[n=``,r=``]=OI(()=>ND(e)),i=EI(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=GI(t,i),o=JI(a);DF(YI(t,i),o,r),t.reloadConfig(a);let s=jb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} โ ${o} (session=${i})`)},rL=(e,t)=>{let[n=``,...r]=OI(()=>ND(e)),i=EI(n),a=GI(t,i),o=Uk(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=JI(a),l=r.map(xj),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);wF(YI(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} โ ${c} (session=${i})`)};function iL(e,t){let n=(e,t)=>[...Ms(A_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(D_(t.presets).flatMap(e=>n(t,e).map(t=>Q_(yu(e),Os(t)))));return D_(e.presets).flatMap(t=>n(e,t).map(e=>({member:Q_(yu(t),Os(e)),node:e})).filter(({member:e})=>!r.has(e)))}function aL(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[K_]:[]])}const oL=(e,t)=>{let[n=``,r=``,i=``]=OI(()=>ND(e)),a=EI(n),o=GI(t,a),s=t.configFor(o),c=Uk(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=kk(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=JI(o),f=OF(YI(t,a),d,r,u);t.reloadConfig(o);let p=aL(iL(s,t.configFor(o)),t.sessionState.get(a,K_)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} โ ${d} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},sL=(e,t)=>{let[n=``]=OI(()=>ND(e)),r=EI(n);t.journal.commit();let i=t.history.undo(r);KI(t,r,i),t.dlog(`info`,`undo: restored ${XF(i)} (session=${r})`)},cL=(e,t)=>{let n=EI(DI(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,Ij(qI(t,n))),a=r.map(e=>`${e.key}=${e.before??`โ
`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},lL=(e,t)=>{let n=EI(DI(e));t.journal.commit();let r=t.history.rewind(n);KI(t,n,r),t.dlog(`info`,`rewind: put back ${XF(r)||`nothing`} as edit mode found it (session=${n})`)},uL=(e,t)=>{let[n=``]=OI(()=>ND(e)),r=EI(n);t.journal.commit();let i=t.history.redo(r);KI(t,r,i),t.dlog(`info`,`redo: re-applied ${XF(i)} (session=${r})`)},dL=(e,t)=>{EI(DI(e)),t.applyUpdate()},fL=`client-hints`;function pL(e,t){let n=e.sessionState.get(t,fL);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 QT(r)}function mL(e,t,n){let r=Ax(n);e.sessionState.setBatch(t,Px(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const hL=(e,t)=>{let n=EI(DI(e));mL(t,n,pI(t.doctor,pL(t,n)))},gL=(e,t)=>{let[n=``,r=``]=OI(()=>ND(e)),i=EI(n),a=jx(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=pI(t.doctor,pL(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=mI(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} โ ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),mL(t,i,c)},_L=(e,t)=>{let[n=``,...r]=OI(()=>ND(e)),i=EI(n),a=GI(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=fw(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=xA({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},pL(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},vL=(e,t)=>{let[n=``,r=``]=OI(()=>ND(e)),i=EI(n),a=Object.values(t.configFor(GI(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=bI(t.claudeInput,pL(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})`)},yL=`config-override`,bL=new Map([[dD,AI],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=EI(OI(()=>decodeURIComponent(e.slice(0,n)))),i=OI(()=>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,yL),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,yL,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[fD,jI],[lD,FI],[uD,RI],[gD,XI],[_D,ZI],[xD,rL],[vD,QI],[yD,tL],[bD,nL],[SD,oL],[CD,sL],[wD,uL],[TD,cL],[ED,lL],[mD,MI],[hD,NI],[pD,PI],[DD,dL],[OD,hL],[kD,gL],[AD,_L],[jD,vL]]),xL=new Set([lD,uD,gD,_D,xD,vD,yD,bD,SD,CD,wD,TD,ED,pD,DD,OD,kD,AD,jD]),SL=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of LD(FD(e))){if(!i&&xL.has(a)){let e=ND(o);e.length>0&&e[0]&&(i=e[0])}let e=bL.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(`
|
|
198
|
-
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function CL(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 wL=new Map([...bL,[cD,SL]].map(([e,t])=>[e,CL(t)]));Object.freeze([...wL.keys()]);const TL=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`]),EL=[[`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`]],DL=[[`workspace.added_dirs`,`string-list`]];function OL(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of EL){let i=jL(n,e);if(i==null)t.missingRequired.push(e);else{let n=kL(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of DL){let i=jL(n,e),a=i===void 0?r:AL(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))TL.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function kL(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function AL(e){return Array.isArray(e)&&e.every(e=>kL(e)===`string`)?`string-list`:kL(e)}function jL(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 ML(e,t){switch(e){case`vars`:return{what:e,vars:NL(t)};case`segments`:return{what:e,segments:RL(t)};case`config`:return{what:e,config:HL(t)}}}function NL(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=IL(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,...PL(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:FL(r.lastUpdatedMs())})}return o}function PL(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 FL(e){return e===null?null:Math.max(0,Date.now()-e)}function IL(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,LL(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}`,LL(i));return t}function LL(e){return e.kind}function RL(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=BL(n),o=zL(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:VL(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function zL(e){let t=new Map;for(let n of D_(e.presets))for(let r of Ms(A_(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 BL(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 VL(e,t,n){let r=new Set;for(let i of _v(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 HL(e){return e===null?null:e.config}const UL=[`vars`,`segments`,`config`];function WL(e){return typeof e==`string`&&UL.includes(e)}function GL(e){return Math.max(1,e-2)}var KL=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 _M(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)}},qL=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=cA(t);if(n&&r!==0&&n.cursor.mtimeMs===r)return this.touch(e,n),{kind:`ok`,value:n.value};let i=await xM(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 JL={messageCount:0,recent:[]};function YL(e,t){if(t.isSidechain)return e;let n=[...e.recent,t];return{messageCount:e.messageCount+ +!!hM(t),recent:n.length>20?n.slice(-20):n}}function XL(e){let t=null,n=null;for(let r of e){let e=r.type||r.message?.role||r.message?.type;if(hM(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 ZL=class{fold=new qL(JL,YL);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:XL(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 QL={command:null,todos:[],pending:[],done:[]};function $L(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 eR(e,t){if(t.isSidechain)return e;let n=hM(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=$L(a,i[t].name),i=[...i.slice(0,t),...i.slice(t+1)])}return{...n,pending:i,done:a,todos:r.todos??n.todos}}function tR(e){return{command:e.command,todos:e.todos,running:e.pending.reduce((e,t)=>$L(e,t.name),[]),done:e.done}}var nR=class{fold=new qL(QL,eR);async getActivityInfo(e,t){let n=await this.fold.read(e,t.transcript_path);return n.kind===`failed`?X(`activity (${e}): ${n.reason}`):J(tR(n.value))}};const rR=e=>`${e.socket}\n${e.pane}`;var iR=class{names=new Map;asking=new CM;constructor(e=Date.now){this.now=e}getSessionName(e){let t=rR(e),n=this.names.get(t);if(n&&this.now()-n.at<3e4)return Promise.resolve(n.outcome);let r=this.asking.run(t,()=>this.ask(t,e));return n?Promise.resolve(n.outcome):r}async ask(e,t){O(`Getting tmux session name for pane ${t.pane} on ${t.socket}`);let n=await cI(t,`tmux`,[`display-message`,`-p`,`-t`,t.pane,`#S`]),r=n.kind===`ok`?n.stdout.trim():``,i=n.kind===`ok`?r?J(r):Y:X(n.reason);for(this.names.delete(e),this.names.set(e,{outcome:i,at:this.now()});this.names.size>64;)this.names.delete(this.names.keys().next().value);return i}};const aR=e=>JSON.stringify([e.sessionId,e.projectDir,e.cwd,e.claudeConfigDir,e.env===void 0?null:Ye.map(t=>e.env?.[t]??null)]);var oR=class{readings=new Map;inFlight=new Map;constructor(e,t=Date.now){this.edge=e,this.now=t}getCeiling(e){let t=aR(e),n=this.readings.get(t);if(n&&this.now()-n.at<1e4)return Promise.resolve(n.outcome);let r=this.inFlight.get(t)??this.fetch(t,e);return n?Promise.resolve(n.outcome):r}fetch(e,t){let n=this.edge.locate(t),r=(n.kind===`ok`?this.edge.read(n.value,t):Promise.resolve(n)).then(t=>{if(this.inFlight.get(e)!==r)return t;for(this.readings.delete(e),this.readings.set(e,{outcome:t,at:this.now()});this.readings.size>64;)this.readings.delete(this.readings.keys().next().value);return t}).finally(()=>{this.inFlight.get(e)===r&&this.inFlight.delete(e)});return this.inFlight.set(e,r),r}move(e,t){let n=this.edge.locate(e);if(n.kind!==`ok`)throw Error(n.kind===`failed`?n.reason:`memento is not installed or not enabled for this project`);let r=aR(e);try{this.edge.move(n.value,e,t)}finally{this.readings.delete(r),this.inFlight.delete(r),this.fetch(r,e)}}},sR=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 cR=new NP;Ee(cR.launchStats);const lR=new Zy({counters:cR,logger:Q}),uR=new ab({watchers:lR,logger:Q}),dR=new PM,fR=new LP,pR=new IF(fR,Q),mR=new iI,hR=new sR(qe()),gR=new KL,_R=new ZL,vR=new nR,yR=new iR,bR=new oR(MA()),xR=new jP({gitService:uR,sessionState:fR,watchers:lR},{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)}`)}}),SR=60*1e3;function CR(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(E(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Q(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),zR(0);return}}catch(e){Q(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,SR),a.unref())},checkNow:o}}const wR=CR(),TR=iM({entryUrl:import.meta.url,intervalMs:SR,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>wR.checkNow(),log:Q});let ER=null,DR=null,OR=0;function kR(){t.on(`uncaughtException`,e=>{Q(`error`,`uncaughtException: ${e.stack||e.message}`),zR(1)}),t.on(`unhandledRejection`,e=>{Q(`error`,`unhandledRejection: ${String(e)}`),zR(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Q(`info`,`received ${e}, shutting down`),zR(0)});try{OR=PE(t.env)}catch(e){Q(`error`,`refusing to boot: ${e.message}`),zR(1);return}ER=MO(t.pid);let e=HO(WO(ER));if(!e.decision.allow){Q(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),zR(1);return}DR=e.registryPath,r.mkdirSync(Fe(),{recursive:!0}),Re(Ie()),fR.useStorage(new BP(Ve(),500,Q)),pR.useStorage(nI(He(),Q)),FO({anchor:PO(t.env),isAlive:IO,onOrphaned:e=>{Q(`info`,`parent watchdog: ${e}; shutting down`),zR(0)}}),AR(b.createServer({allowHalfOpen:!1},e=>{BR(e)}),Ie(),!1)}function AR(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Q(`error`,`server error: ${i.message}`),zR(1);return}if(r){Q(`info`,`lost rebind race; another daemon is alive โ exiting`),t.exit(0);return}jR(e,n)}),e.listen(n,()=>MR(n))}function jR(e,n){let i=SO(CO(ze(n)),(e,t)=>jO(e,t,{readStartTime:AO,pidAlive:IO}));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}`),zR(1);return}}AR(e,n,!0)}function MR(e){let n=EO(e);if(n.kind!==`present`){Q(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),zR(0);return}IR(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(te.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(OR/1048576)}MB`),ZE();let i=hR.reset();i!==null&&Q(`warn`,`diagnostic dump wipe failed: ${i}`),wR.arm(),TR.arm(),FR(),NR(e,n.identity)}function NR(e,n){kO({bound:n,myPid:t.pid,readIdentity:()=>EO(e),readLease:()=>CO(ze(e)),shutdown:e=>zR(e),log:Q}).arm()}let PR=null;function FR(){PR=RE(HE(cR.startedAt.getTime(),e=>zR(e),{rssLimitBytes:OR})),PR.arm()}function IR(e){let n=wO(ze(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:ER});n!==null&&Q(`warn`,`lease write failed: ${n}`)}let LR=0,RR=!1;function zR(e){if(!RR){RR=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{uR.close()}catch(e){Q(`warn`,`gitService close failed: ${e.message}`)}try{dR.close()}catch(e){Q(`warn`,`usageStore close failed: ${e.message}`)}try{lR.closeAll()}catch(e){Q(`warn`,`watcherRegistry close failed: ${e.message}`)}try{fR.flush()}catch(e){Q(`warn`,`sessionState flush failed: ${e.message}`)}TO(Be(),t.pid),DR!==null&&UO(DR,t.pid,BO,e=>r.unlinkSync(e)),t.exit(e)}}function BR(e){LR++,cR.inFlight=LR;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:()=>zR(r);try{e.end(sE(n),i)}catch(e){Q(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{cR.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=cE(e=>{HR(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),LR=Math.max(0,LR-1),cR.inFlight=LR})}const VR=e=>({resp:e,exitAfterFlush:null});async function HR(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return VR({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 VR({ok:!0,stats:cR.snapshot({gitCache:uR.getStats(),usageCache:dR.getStats(),renderCacheSize:xR.size,watchersActive:lR.size(),nextRestartReason:PR?.describeNextRestart()??null})});if(e.kind===`render`){cR.requestsTotal++;let t=Date.now();try{let{report:n}=OL(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 cR.requestsErrored++,Q(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),VR({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=UR(e.args),s=e.hookData.session_id,c=QT(e),l=JSON.stringify(c);fR.get(s,`client-hints`)!==l&&fR.set(s,fL,l);let u=fR.get(s,`config-override`)??a??c.configEnv,d=xR.getOrCreate(i,e.cwd,u),f=UI({projectDir:i,cwd:e.cwd,configFile:u??null});fR.get(s,`render-origin`)!==f&&fR.set(s,HI,f);let p=c.termCols,m=GL(p??120),h=sk(c.termRows),{authoredRoots:g}=d.state,_=t=>fR.get(e.hookData.session_id,t),v=PA(d.state.config,_,e=>g.has(e)),y=await ZA(e.hookData,{...JR,navigation:e=>mR.depth(e,fR,Ij(d.state.config))},e.cwd,d.state.neededInputPaths(v.preset),v,c,{...Cj(d.state.config,d.state.fileHeldSettings,_),configPath:d.configFilePath}),b=[],x=FA(v,m),S=_P(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},IA(v)),C=fR.get(e.hookData.session_id,`click.error`);C&&fR.clear(e.hookData.session_id,`click.error`);let w=[o,d.lastError,C].filter(Boolean).join(`
|
|
199
|
-
`),T=
|
|
200
|
-
`)),ne=
|
|
201
|
-
`})}catch(e){throw
|
|
202
|
-
`);return}t.stdout.write(
|
|
194
|
+
`);n.push(e[0]);for(let r=1;r<e.length;r++)t.push(n),n=[e[r]]}return t.push(n),t}function gP(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,..._P(e,r)]}function _P(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 vP(e,t){let n=(e,r)=>t(e)?e.kind===`segment`?[{cells:[{name:e.name,address:r,settings:e.settings}],band:`own`,place:`flow`}]:gP(e.direction,e.children.map((t,i)=>n(t,[...r,yP(e,i)]))):[];return n(e,[]).map(e=>[...e.cells])}function yP(e,t){return{index:t,count:e.children.length,distribution:e.distribution,axis:Ds[e.direction]}}const bP={compile(e,t){return{kind:`container`,direction:e.direction,when:t.when,distribution:pa(e.distribution),children:e.children.map((e,n)=>t.compileChild(e,Ns(t.path,n)))}},render(e,t){return gP(e.direction,e.children.map((n,r)=>t.renderChild(n,t.visible,yP(e,r))))}},xP={drop:e=>e.place,above:()=>`above`},SP={drop:(e,t)=>({lead:t(),stays:e}),above:e=>({lead:e.slice(0,1).flatMap(e=>e.cells),stays:e.slice(1)})},CP={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=wy(t.scope,e.settings);try{if(!tN(i.when,a))return[];let n=qb(e.settings.theme,t.palette),o=e.opens!==void 0&&tN(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:xP[h.placement](e)})),_=hP(uN(c,p)).map((e,t)=>({cells:oN(e,{...m,lead:t===0?uN(l,p):[],trail:t===0?uN(u,p):[]}),band:`own`,place:`flow`})),v=d.map(e=>({cells:oN(uN([e],s.band),{...m,baseStyle:s.band}),band:`deeper`,place:`flow`})),y=(e,t,n)=>oN(uN([e],t),{...m,width:`auto`,baseStyle:t,padding:n}),b=g.findIndex(e=>e.band===`own`),{lead:x,stays:S}=h!==void 0&&b!==-1?SP[h.placement](_,()=>y(t.closeDisclosure(h.key),s.close,t.padding)):{lead:[],stays:_},C=x.flatMap(e=>y(new H(` `.repeat(iN(e).reduce((e,t)=>e+t.cellLength,0))),s.trigger,0)),w=(e,t)=>e.band===`own`?t===b?x:C:[],T=g.map((e,t)=>({cells:[...w(e,t),...e.cells],band:`deeper`,place:e.place})),ee=[...S,...v];return t.perSegmentSink!==void 0&&t.perSegmentSink.set(e.id,[...ee.flatMap(e=>e.cells),...g.flatMap(w)].flatMap(iN)),[...ee,...T]}catch(n){let r=n.message??String(n);t.onSegmentError?.(e.id,r);let i=r.replace(/\s*\n\s*/g,` `);return[{cells:oN([new H(`โ ${e.id}: ${i}`,{end:``})],{width:`auto`,justify:`left`,truncate:`right`,padding:0,lead:wP(e.lead,e,a,t),trail:wP(e.trail,e,a,t)}),band:`own`,place:`flow`}]}}};function wP(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 TP={container:bP,segment:CP};function EP(e){return TP[e]}function DP(e){if(`ttl`in e)return{kind:`ttl`,durationMs:mb(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 OP(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 kP(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:DP(n.cache),parse:OP(n.parse,n.default)});break;case`shell`:e.declareShell(t,n.command,{cwd:r,cache:DP(n.cache),parse:OP(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?mb(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 AP(e,t){let n=Yd.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 jP=e=>xo(void 0,null,e.globals.variation);function MP(e,t,n){let r=n.cwd,i=ex(e.globals.palette),a={store:t.variableStore,compiled:new Map,chromeCols:ik({endcaps:`powerline`,charset:go}),width:80,basePalette:i,palette:i,variation:aa[jP(e)],padding:1,seamCols:ak({endcaps:`powerline`,charset:go}),layout:()=>[]},o=IN(t.drawnAt),s={action:a,activeSegment:o},c=Object.keys(e.styles),l=D_(e.presets),u=new Map([...ix(e),...ZC(e)]),d=xy({...TN(a),...JN(a,o),...ZN(a,o),...tP(a,o),...oP(a,o),...uP(s),...pP(o),styles:{fn:()=>c,argTypes:[],arity:{kind:`exact`}},presets:{fn:()=>l,argTypes:[],arity:{kind:`exact`}}},n.clock,t.drawnAt),f=AP(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 zb)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=mN(p,e.actions,g,u);let _=[];for(let[n,i]of Object.entries(e.variables))try{kP(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{kP(t,`${n}.${e}`,a,r)}catch(t){_.push(`Variable "${n}.${e}": ${t.message??String(t)}`)}let v=Object.create(null);for(let[t,n]of Object.entries(e.segments)){let e=(e,n,r=p)=>{try{return r(e)}catch(e){throw Error(`Template parse error in segments.${t}.${n}: ${e.message}`,{cause:e})}};v[t]={when:n.when===void 0?void 0:e(n.when,`when`,h),template:e(n.template,`template`),bg:n.bg===void 0?void 0:e(n.bg,`bg`),fg:n.fg===void 0?void 0:e(n.fg,`fg`)}}let y=(e,t,n)=>{try{return h(e)}catch(e){throw Error(`Template parse error in ${t}.${n}: ${e.message}`,{cause:e})}},b=t.variableStore,x=t=>{let n=Hs(e.segments[t.name]),r=Object.create(null);for(let[e,i]of Object.entries(n)){let n=t.settings?.[e]??i.default,a=t.drafts?.[e];Object.defineProperty(r,e,{enumerable:!0,get:a===void 0?()=>n:()=>qs(i,String(b.read(a.variable)))??n})}return Object.freeze(r)},S=(e,t)=>{let n={path:t,when:e.when===void 0?void 0:y(e.when,t,`when`),parse:(e,n)=>y(e,t,n),compileChild:S,placementSettings:x};return EP(e.kind).compile(e,n)},C=new Map;for(let t of l){let{node:n,path:r}=A_(e,t);C.set(t,S(n,r))}let w=new Map(ro.map(e=>[e,new Map])),T=[[`globals`,e.globals],...Object.entries(e.presets).map(([e,t])=>[`presets.${e}.globals`,t.globals??{}])];for(let[e,t]of T)for(let n of ro){let r=t[n];if(!io(r))continue;let i=`${e}.${n}`,a=w.get(n),o=a.get(r);a.set(r,o===void 0?{where:i,template:NP(p,i,r)}:{where:`${o.where}, ${i}`,template:o.template})}return{segments:v,roots:C,activeSegment:o,menuRuntime:s,globalExpressions:w,loadWarnings:_}}function NP(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 PP(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 FP(e,t){return e.template.evaluate(t).map(e=>e.plain).join(``)}function IP(e,t){return e.kind===`decided`?e.name:t}function LP(e,t,n,r,i,a,o,s){let{perSegmentSink:c,onSegmentError:l,onRenderWarning:u}=o??{};r.drawAt(vo(a.colorCompatibility));let{preset:d=T_}=s??{},f=j_(e,d),p=aa[s?.variation??xo(void 0,null,f.variation)];t.menuRuntime.action.variation=p;let m=s?.style??lo(`none`,e.styles),h=s?.theme??Qb(void 0,null,f.palette),g=(e,t)=>({...i,term:{cols:a.width},theme:{effective:e},style:{effective:t}});r.applyInput(g(IP(h,Xa),IP(m,so))),t.menuRuntime.action.chromeCols=ik(a),t.menuRuntime.action.padding=a.padding,t.menuRuntime.action.width=a.width,t.menuRuntime.action.seamCols=ak(a);let _=Sy(n),v=oo(h,e=>{let n=PP(t,`palette`,e);return Zb(FP(n,_),n.where,e=>u?.(e))}),y=oo(m,n=>lo(FP(PP(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=Yb(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}=qa(i,a,c),d=LN(t.activeSegment,e.name,e.id,i,u,l),f=Sx(d,c,o.bg,o.fg,n),p=()=>Ia(i,u,c).state;s&&(d.bg=p());let m=o.body.evaluate(n),h=d.drops.length>0||s;h&&(d.bg=p());let g=o.lead?.evaluate(n)??[],_=o.trail?.evaluate(n)??[];return{styles:{closed:f,get trigger(){return DN(i,p(),c)},get band(){return DN(i,Ia(i,u,c).plane,c)},get close(){return kN(i,p(),c)},disclosure:u},fragments:m,lead:g,trail:_,drops:d.drops,open:h}}finally{t.activeSegment.current=null}},w=(e,t,r)=>{let i=t&&tN(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)=>w(e,t,Ga(r,n)),renderBody:(e,t,n)=>w(e,i&&t,Ka(n)),closeDisclosure:e=>EN(n,e)};return EP(e.kind).render(e,o)},T=t.roots.get(d);if(T===void 0)throw Error(`Preset "${d}" has no compiled layout โ registerDslConfig compiles one per declared preset and effectivePresetName collapses unknown names to "${T_}"; a miss here is merge/policy drift (have: ${[...t.roots.keys()].join(`, `)})`);let ee=e=>{if(!tN(e.when,_))return!1;if(e.kind===`container`)return!0;if(ow(e.name)===void 0)return!1;try{return tN(t.segments[e.name].when,wy(_,e.settings))}catch{return!0}};return t.menuRuntime.action.layout=()=>vP(T,ee).map(e=>e.flatMap(({name:e,address:t,settings:n})=>{let r=ow(e);return r===void 0?[]:[{name:r,address:t,palette:qb(n.theme,x)}]})),w(T,!0,Wa(p)).map(e=>ok(lN(e.cells,a),a)).join(`
|
|
195
|
+
`)}var RP=class{kind=`box`;cell;lastChangedAt;constructor(e,t,n){this.name=e,this.type=t,WP(e,t,n,`initial value`),this.cell=Dv.observable.box(n,{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){WP(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}},zP=class{kind=`computed`;cell;constructor(e,t,n){this.name=e,this.type=t,this.cell=(0,Dv.computed)(()=>{let e=n();return WP(this.name,this.type,e,`computed result`),e},{keepAlive:!0})}read(){return this.cell.get()}lastUpdatedMs(){return null}},BP=class{kind=`document`;cell;lastChangedAt;constructor(e,t){this.name=e,this.cell=Dv.observable.box(UP(t),{deep:!1}),this.lastChangedAt=Date.now()}read(){return this.cell.get()}set(e){let t=UP(e);HP(this.cell.get(),t)||(this.cell.set(t),this.lastChangedAt=Date.now())}lastUpdatedMs(){return this.lastChangedAt}};function VP(e){return JSON.stringify(e)}function HP(e,t){return VP(e)===VP(t)}function UP(e){return e.kind===`ok`?{kind:`ok`,value:Ov(e.value)}:e}function WP(e,t,n,r){let i=kv(n);if(i!==t)throw TypeError(`Variable "${e}": ${r} type ${i} does not match declared type ${t}`)}var GP=class{nodes=new Map;defineBox(e,t,n){this.assertNotDefined(e),this.nodes.set(e,new RP(e,t,n))}defineDocument(e,t){this.assertNotDefined(e),this.nodes.set(e,new BP(e,t))}defineComputed(e,t,n){this.assertNotDefined(e);let r=e=>this.read(e);this.nodes.set(e,new zP(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,Dv.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,Dv.runInAction)(()=>n.set(t))}runInAction(e){(0,Dv.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 VP(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 KP(e,t,n){return e+`\0`+t+`\0`+(n??``)}function qP(e,t){return new Set(D_(e.presets).filter(n=>A_(e,n).path===`root`?t.root!==void 0:t.presets?.[n]?.root!==void 0))}function JP(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 YP(e,t){let n=new Map;for(let t of RT(e.projectDir,e.cwd,e.configFile)){let{dir:e,name:r}=JP(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 XP(e){return e.filter(Boolean).join(`
|
|
196
|
+
`)||null}function ZP(e,t,n,r){let i=GT(t,aA),{config:a,raw:o}=i;n.push(...i.warnings);let s=JT(i,t??`<default>`),c=new GP,l=new jb(c,s.globals.default_empty_value??``,r.gitService,r.sessionState),u;try{u=MP(s,l,{cwd:e}),n.push(...u.loadWarnings),Ij(s),Uk(s)}catch(e){throw l.dispose(),e}return{config:s,store:c,registry:l,compiled:u,neededInputPaths:qA(s),lastRenderCellsBySegment:new Map,authoredRoots:qP(a,o),fileHeldSettings:Sj(o)}}var QP=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=KP(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??ZP(t,null,[],this.deps),watcher:null,watcherKey:null};if(this.entries.set(r,o),this.entries.size>this.maxEntries){let e=this.entries.entries().next().value;if(e!==void 0){let[t,n]=e;n.state.registry.dispose(),n.watcher?.release(),this.entries.delete(t)}}return this.refreshWatcher(o,a.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=t.state),this.refreshWatcher(e,t.resolvedPath),this.observers.onReload?.(e)}loadFromDisk(e,t,n){let r=BT(e,t,n),i=r.kind===`file`?r.path:null,a=[WT(e,t),HT(r)],o;try{o=ZP(t,i,a,this.deps)}catch(e){return e instanceof xs&&a.push(...e.warnings),{resolvedPath:i,warning:XP(a),state:null,error:e instanceof xs||e instanceof Error?e.message:String(e)}}return{resolvedPath:i,warning:XP(a),state:o,error:null}}refreshWatcher(e,t){e.configFilePath=t;let n=YP(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){Z(`info`,`config change detected for entry projectDir=${e.projectDir} cwd=${e.cwd}`),this.reloadInto(e)}get size(){return this.entries.size}firstState(){return this.entries.values().next().value?.state??null}};const $P=16384;var eF=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<$P){this.rollingTimestamps.push(e);return}this.rollingTimestamps[this.rollingHead]=e,this.rollingHead=(this.rollingHead+1)%$P}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:BD,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 tF(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 nF={load:()=>({}),save:()=>{},flush:()=>{}};function rF(e){let t=new Map;for(let[n,r]of Object.entries(e))t.set(n,new Map(Object.entries(r)));return t}var iF=class{sessions;storage;atom=(0,Dv.createAtom)(`SessionState`);constructor(e=nF,t=256){this.maxSessions=t,this.storage=e,this.sessions=new Map,this.hydrateFromStorage()}useStorage(e){this.storage=e,this.hydrateFromStorage()}hydrateFromStorage(){this.sessions=rF(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,Dv.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,Dv.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,Dv.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}};function aF(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 oF=class{timer=null;pending=null;constructor(e,t=500,n=$y){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 aF(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 sF={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`},cF=new Set([`1`,`true`]),lF=new Set([`0`,`false`,``]);function uF(e,t){let n=FF(e),r=n.scope===`segment-palette`?`string`:sF[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(cF.has(t))return`true`;if(lF.has(t))return`false`;throw Error(`persistValueText: "${e}" expects boolean-ish (1, 0, true, false), got "${t}"`)}function dF(e){try{return r.readFileSync(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}function fF(e,t,n){try{if(t===null){r.rmSync(e,{force:!0});return}r.mkdirSync(c.dirname(e),{recursive:!0}),je(e,t)}catch(t){let r=`config write failed (${e}): ${t.message}`;throw n(`error`,r),Error(r)}}function pF(e){return/^\s*$/.test(e)?null:Lo(e)}function mF(e,t){return e!==null&&zo(e,t)!==void 0}function hF(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(hF),...i}}return e}function gF(e){if(!Mc(e))return hF(e);let{rows:t,...n}=e;return{rows:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,hF(t)])),...n}}const _F=rA,vF=_F.segments,yF=_F.presets,bF=_F.root;function xF(e,t,n,r){if(!mF(e,t)&&n===void 0)throw new $(`cannot edit ${r}: neither the config file nor the bundled default declares ${t.join(`.`)}`)}function SF(e,t){let n=gx(t);return t.scope===`segment-palette`&&xF(e,[`segments`,t.segment],vF[t.segment],n.join(`.`)),n}function CF(e){return Lo(qo(e))}function wF(){return Object.entries(bF.rows).map(([e,t])=>{let n=hF(t);return{path:[`root`],fragment:CF({rows:{[e]:n}}),unit:{path:[`root`,`rows`,e],value:n}}})}function TF(e,t){let n=e===null?void 0:zo(e,t);return n===void 0?null:{path:t,fragment:n,unit:null}}function EF(e,t){if(t===void 0)return null;let n=gF(t);return{path:e,fragment:CF(n),unit:{path:e,value:n}}}function DF(e,t){let n=[`presets`,t],r=[...n,`root`],i=yF[t];xF(e,n,i,r.join(`.`));let a=TF(e,r)??EF(r,i?.root);return a!==null&&ms(a.fragment)?a:null}function OF(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 kF(e,t){return[...wF(),TF(e,[`root`]),DF(e,t)].filter(e=>e!==null).reduce(OF,new Map)}function AF(e,t,n){for(let{node:r,...i}of kF(e,t).values())if(gs(r,n))return i;throw new $(`${jF(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 jF(e,t){return DF(e,t)?.path??[`root`]}function MF(e,t){return t.scope===`preset-root`?jF(e,t.preset):gx(t)}function NF(e,{unit:t}){return t===null?e:ss(e,t.path,qo(t.value),Go)}function PF(e){let t=hx(e);if(t===null)throw Error(`"${e}" is not a valid persist target`);return t}function FF(e){let t=PF(e);if(t.scope===`preset-root`)throw Error(`"${e}" names a layout, not a value`);return t}function IF(e,t,n,r){LF(t,r),fF(t,r,e.logger),e.record(t,n,r)}function LF(e,t){try{return JT(KT(e,t,aA),e)}catch(e){throw e instanceof xs?new $(`refused: the config file would not load after this click โ ${e.message}`):e}}function RF(e,t){let n=FF(t),r=pF(dF(e)??``),i=r===null?void 0:zo(r,gx(n));return i!==void 0&&`value`in i?i.value:void 0}function zF(e,t,n){BF(e,t,n,[])}function BF(e,t,n,r){let i=dF(t);IF(e,t,i,VF(n.reduce((e,[t,n])=>ss(e,SF(pF(e),FF(t)),uF(t,n),Go),i??``),t,r,e=>e))}function VF(e,t,n,r){return n.reduce((e,{preset:n,id:i,setting:a,value:o})=>{let s=r(e,n,i),c=AF(pF(s),n,i),l=bs(NF(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 HF(e,t,n){let r=pF(e),i=[`presets`,t,`root`];for(let[a,{path:o,unit:s,node:c}]of kF(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(DF(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 UF(e,t){return ls(e,t,t[0]===`presets`&&t.length>2&&!sA(t[1])?2:0)}function WF(e,t,n){let r=n.map(PF),i=dF(t);if(i===null)return;let a=r.reduce((e,t)=>UF(e,MF(pF(e),t)),i);a!==i&&IF(e,t,i,a)}function GF(e){let t=e===null?void 0:zo(e,[`presets`]),n=new Set([...oA,...t?.kind===`object`?t.entries.map(e=>e.key):[]].map(yu));return Array.from({length:n.size+1},(e,t)=>`custom-${t+1}`).find(e=>!n.has(yu(e)))}function KF(e,t,n,r,i,a){let o=dF(t),s=pF(o??``),c=GF(s),l=[`presets`,c],u=DF(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=mx(c,e);return[SF(s,FF(n)),uF(n,t)]});return IF(e,t,o,VF([...d,...f].reduce((e,[t,n])=>ss(e,t,n,Go),ss(o??``,l,`{}`,Go)),t,a.map(e=>({...e,preset:c})),HF)),c}function qF(e,t,n){if(sA(n))throw new $(`cannot delete preset "${n}": it is bundled โ reset its settings instead`);let r=[`presets`,n],i=dF(t),a=pF(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`]);IF(e,t,i,[r,...o?.kind===`string`&&o.value===n?[[`globals`,`preset`]]:[]].reduce((e,t)=>UF(e,t),i))}function JF(e,t,n,r){let i=PF(n);if(i.scope!==`preset-root`)throw Error(`"${n}" is not a "presets.<name>.root" target`);let a=dF(t),o=r.op===`remove`?r.target:r.anchor,s=AF(pF(a??``),i.preset,o),c=NF(a??``,s),{after:l,placed:u}=YF(c,s.path,r,()=>{let e=LF(t,c);return D_(e.presets).map(t=>A_(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 IF(e,t,a,l),u}function YF(e,t,n,r){switch(n.op){case`remove`:return{after:vs(e,t,n.target),placed:null};case`insert`:{let i=Ak(n.segment,n.anchor,r());return{after:ys(e,t,i,n.anchor,n.relation),placed:i}}}}const XF={load:()=>({}),save:()=>{}},ZF=new Set(Fb.map(e=>e.sessionKey)),QF=e=>ZF.has(e)||e.startsWith(Z_),$F=8*1024*1024,eI={past:[],future:[]},tI=e=>e.kind===`session`?`session:${e.key}`:`file:${e.file}`;var nI=class{state=new Map;constructor(e,t,n=XF){this.sessionState=e,this.logger=t,this.storage=n,this.state=new Map(Object.entries(n.load()))}useStorage(e){this.storage=e,this.state=new Map(Object.entries(e.load()))}depth(e){let{past:t,future:n,savepoint:r}=this.state.get(e)??eI;return{undo:t.length,redo:n.length,sinceEdit:r?.net.length??0}}history(e){return this.state.get(e)??eI}begin(){let e=new Map,t=(t,n)=>{let r=e.get(t)??new Map,i=r.get(tI(n));r.set(tI(n),i===void 0?n:{...n,before:i.before}),e.set(t,r)},n=new Map;return{sessionState:tF(this.sessionState,e=>QF(e)||e===`edit.mode`,(e,r,i,a)=>{if(r===`edit.mode`){let t=n.get(e);n.set(e,{before:t===void 0?i:t.before,after:a});return}t(e,{kind:`session`,key:r,before:i,after:a})}),file:(e,n,r,i)=>t(e,{kind:`file`,file:n,before:r,after:i}),commit:()=>{let t=new Map(e),r=new Map(n);e.clear(),n.clear();for(let e of new Set([...t.keys(),...r.keys()])){let n=[...t.get(e)?.values()??[]].filter(e=>e.before!==e.after),i=this.history(e),a=n.length===0?i:uI(i,n),o=r.get(e),s=o===void 0?a:mI(a,o);s!==i&&this.put(e,s)}}}}undo(e){let t=this.history(e),n=t.past.at(-1);if(n===void 0)throw new $(`undo: nothing to undo`);return this.apply(e,n,`before`,`undo`,fI(t,n)),n}rewind(e){let t=this.history(e),{savepoint:n}=t;if(n===void 0)throw new $(`rewind: edit mode has no savepoint โ nothing to cancel`);let r=n.net.filter(t=>this.read(e,t)!==t.after),i=new Set(r.map(tI)),a=n.net.filter(e=>!i.has(tI(e))),o=aI(hI(pI(t,n),i));if(this.apply(e,a,`before`,`rewind`,{past:o,future:[],savepoint:{at:o.length,net:[],below:[]}}),r.length>0)throw new $(`rewind: ${r.map(_I).join(`, `)} changed since edit mode opened โ kept as it is; everything else edit mode changed was put back`);return a}redo(e){let t=this.history(e),{past:n,future:r}=t,i=r.at(-1);if(i===void 0)throw new $(`redo: nothing to redo`);let a=[...n,i],o=aI(a);return this.apply(e,i,`after`,`redo`,{past:o,future:r.slice(0,-1),...sI(t.savepoint,a.length-o.length,i)}),i}apply(e,t,n,r,i){let a=n===`before`?`after`:`before`,o=t.filter(t=>this.read(e,t)!==t[a]);if(o.length>0){let t=new Set(o.map(tI)),{past:n,future:i,savepoint:a}=this.history(e);throw this.put(e,{past:hI(n,t),future:hI(i,t),...a!==void 0&&{savepoint:{at:hI([...n,...[...i].reverse()].slice(0,a.at),t).length,net:a.net.filter(e=>!t.has(tI(e))),below:hI(a.below,t)}}}),new $(`${r}: ${o.map(_I).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):dF(t.file)}write(e,t,n){t.kind===`file`?fF(t.file,n,this.logger):n===null?this.sessionState.clear(e,t.key):this.sessionState.set(e,t.key,n)}put(e,t){let n=new Map(this.state);for(n.delete(e),(t.past.length>0||t.future.length>0||t.savepoint!==void 0)&&n.set(e,t);n.size>32||rI(n)>$F;){let[e,t]=n.entries().next().value;n.size>1?n.delete(e):t.past.length+t.future.length>0?n.set(e,iI(t)):(this.logger(`warn`,`settings-history: edit mode's changes for session ${e} exceed ${$F} bytes; cancel is no longer available`),n.delete(e))}this.storage.save(Object.fromEntries(n)),this.state=n}};function rI(e){let t=0;for(let{past:n,future:r,savepoint:i}of e.values())for(let e of[...n,...r,...i===void 0?[]:[i.net,...i.below]])for(let n of e)t+=(n.before?.length??0)+(n.after?.length??0);return t}function iI({past:e,future:t,savepoint:n}){return e.length>0?{past:e.slice(1),future:t,...sI(n,1,[])}:{past:e,future:t.slice(1),...sI(n,0,[])}}function aI(e){return e.slice(-50)}const oI=e=>e===$_.member;function sI(e,t,n){return e===void 0?{}:{savepoint:{at:Math.max(0,e.at-t),net:cI(e.net,n),below:e.below}}}function cI(e,t){let n=new Map(e.map(e=>[tI(e),e]));for(let e of t){let t=n.get(tI(e));n.set(tI(e),t===void 0?e:{...t,after:e.after})}return[...n.values()].filter(e=>e.before!==e.after)}const lI=e=>e.map(e=>({...e,before:e.after,after:e.before}));function uI(e,t){let n=[...e.past,t],r=aI(n),{savepoint:i}=e,a=i===void 0?0:Math.max(0,i.at-e.past.length);return{past:r,future:[],...sI(i&&{at:Math.min(i.at,e.past.length),net:i.net,below:[...dI(e.future,a),...i.below]},n.length-r.length,t)}}function dI(e,t){let n=Math.min(t,e.length);return e.slice(e.length-n).reverse()}function fI(e,t){return{past:e.past.slice(0,-1),future:aI([...e.future,t]),...sI(e.savepoint,0,lI(t))}}function pI(e,t){let{past:n,future:r}=e,i=n.slice(0,t.at);return[...i,...dI(r,t.at-i.length),...t.below]}function mI(e,t){if(oI(t.after)&&!oI(t.before))return{...e,savepoint:{at:e.past.length,net:[],below:[]}};if(!oI(t.after)&&oI(t.before)){let{past:t,future:n}=e;return{past:t,future:n}}return e}function hI(e,t){return e.map(e=>e.filter(e=>!t.has(tI(e)))).filter(e=>e.length>0)}function gI(e){return e.map(_I).join(`, `)}function _I(e){return e.kind===`session`?`session setting "${e.key}"`:e.file}function vI(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 yI(e){return Array.isArray(e)&&e.every(e=>Array.isArray(e)&&e.every(vI))}function bI(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.at)&&t.at>=0&&Array.isArray(t.net)&&t.net.every(vI)&&yI(t.below)}function xI(e){if(typeof e!=`object`||!e)return!1;let t=e;return yI(t.past)&&yI(t.future)&&(t.savepoint===void 0||bI(t.savepoint))}function SI(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(xI))return e}catch{}return t(`warn`,`settings-history load: unexpected shape, starting empty`),{}},save:n=>{try{r.mkdirSync(c.dirname(e),{recursive:!0}),je(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 CI=e=>!QF(e)&&!Ux(e)&&e!==`update.dismissed`;var wI=class{past=new Map;depth(e,t,n){return this.restorable(e,t,n).length}restorable(e,t,n){let r=new Map,i=n=>r.has(n)?r.get(n):t.get(e,n),a=[];for(let t of[...this.past.get(e)??[]].reverse())if(t.every(e=>i(e.key)===e.after&&(e.before===null||n.validate(e.key,e.before).ok))){a.unshift(t);for(let e of t)r.set(e.key,e.before)}return a}begin(e){let t=new Map;return{sessionState:tF(e,CI,(e,n,r,i)=>{let a=t.get(e)??new Map,o=a.get(n);a.set(n,{key:n,before:o?o.before:r,after:i}),t.set(e,a)}),commit:()=>{for(let[e,n]of t){let t=[...n.values()].filter(e=>e.before!==e.after);t.length>0&&this.push(e,t)}t.clear()}}}back(e,t,n){let r=this.past.get(e)??[],i=this.restorable(e,t,n),a=i.at(-1),o=r.length-i.length;if(a===void 0)throw this.put(e,i),new $(`back: nothing to go back to${o>0?` (${o} step(s) over a view since gone, discarded)`:``}`);return(0,Dv.runInAction)(()=>{let n=a.flatMap(({key:e,before:t})=>t===null?[]:[{key:e,value:t}]);n.length>0&&t.setBatch(e,n);for(let{key:n,before:r}of a)r===null&&t.clear(e,n)}),this.put(e,i.slice(0,-1)),{step:a,discarded:o}}push(e,t){let n=this.past.get(e)??[];this.put(e,[...n,t].slice(-20))}put(e,t){for(this.past.delete(e),t.length>0&&this.past.set(e,t);this.past.size>32;)this.past.delete(this.past.keys().next().value)}};function TI(e){let t=JM(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 EI(){return{probeTmux:TI}}function DI(e){let t=nS(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 OI(e,t){return t===void 0?{kind:`unreported`}:t===null?{kind:`outside`}:{kind:`inside`,hint:t,termfeatures:e.probeTmux(t)}}function kI(e,t){return{tmux:OI(e,t.tmux),claudeSettings:DI($x(Qx(t.claudeConfigDir)))}}function AI(e,t){let n=t.claudeSettings.path;switch(e.kind){case`claude-settings-env`:{let i=ss(tS(n),[`env`,e.name],JSON.stringify(e.value),Ko);return r.mkdirSync(c.dirname(n),{recursive:!0}),je(n,i),{...t,claudeSettings:DI(n)}}default:return e.kind}}const jI=/^โ{20,}/,MI=/^โฏ(\s|$)/,NI=/โบ\s*stashed$/;function PI(e){if(e.inMode)return{kind:`in-mode`};let t=e.screen.map(e=>e.trimEnd()),n=t.flatMap((e,t)=>jI.test(e)?[t]:[]).at(-2);return n===void 0||!MI.test(t[n+1]??``)?{kind:`no-prompt`}:NI.test(t[n-1]??``)?{kind:`stashed`}:{kind:`ready`}}const FI={"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 II(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=PI(e.read(t));if(r.kind!==`ready`)return{kind:`refused`,reason:FI[r.kind]};let i=e.type(t,n);return i.kind===`typed`?{kind:`typed`,pane:t.pane}:i}const LI=`cc-candybar-slash`;function RI(e,t,n,r){let i=JM(e,t,n,r);if(i.kind===`failed`)throw Error(i.reason);return i}function zI(e){let t=RI(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(`
|
|
197
|
+
`);return{inMode:n!==`0`,screen:r}}function BI(e,t){let n=RI(e,`claude-input.type`,[`load-buffer`,`-b`,LI,`-`,`;`,`send-keys`,`-t`,e.pane,`C-s`,`;`,`paste-buffer`,`-p`,`-d`,`-b`,LI,`-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 VI(){return{read:zI,type:BI}}function HI(e){if(!e)throw new $(`session id is required`);if(e.includes(`/`)||e.includes(`..`))throw new $(`invalid session id "${e}"`);return e}function UI(e){return WI(()=>decodeURIComponent(e))}function WI(e){try{return e()}catch(e){throw e instanceof URIError?new $(`malformed wire encoding: ${e.message}`):e}}function GI(e,t){let n=ke({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 KI=(e,t)=>GI(UI(e),t),qI=(e,t)=>{let n=ke({bin:`/usr/bin/open`,args:[`-a`,`Visual Studio Code`,UI(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`})`)}},JI=(e,t)=>GI(UI(e),t),YI=(e,t)=>GI(UI(e),t),XI=(e,t)=>{let n=HI(UI(e));t.navigating.get(n,`toolbar-expanded`)?t.navigating.clear(n,`toolbar-expanded`):t.navigating.set(n,`toolbar-expanded`,`1`)},ZI=(e,t)=>{let[n=``,...r]=WI(()=>ND(e)),i=HI(n),a=Ij(lL(t,i));if(r.length===0)throw new $(`set-state: <key>/<value> is required (have keys: ${a.listKeys().join(`, `)})`);if(r.length%2!=0)throw new $(`set-state: expected even-count <key>/<value> pairs, got ${r.length} segment(s) after session id (have keys: ${a.listKeys().join(`, `)})`);let o=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t)throw new $(`set-state: empty key at pair ${e/2+1} (expected <sessionId>/<key>/<value>[/<key>/<value>...] segments)`);let i=a.validate(t,n);if(!i.ok)throw new $(`set-state: pair ${e/2+1}: ${i.reason}`);o.push({key:t,value:i.value})}tL(t,i,`set-state`,o),t.navigating.setBatch(i,o);let s=o.map(e=>`${e.key}=${e.value}`).join(` `);t.dlog(`info`,`set-state: ${s} (session=${i})`)},QI=/^-?\d+$/;function $I(e,t,n,r){let i=e+t;return i>r?e===r?n:r:i<n?e===n?r:n:i}const eL=(e,t)=>{let[n=``,r=``,i=``]=WI(()=>ND(e)),a=HI(n);if(!r)throw new $(`step-state: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!QI.test(i))throw new $(`step-state: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=lL(t,a),c=Ij(s),l=c.rangeParamsFor(r);if(!l)throw new $(`step-state: key "${r}" is not a bounded (range) state key (have keys: ${c.listKeys().join(`, `)})`);let u=t.sessionState.get(a,r),d=u&&QI.test(u)?nL(l,parseInt(u,10)):rL(`step-state`,r,l,zj(s,e=>t.sessionState.get(a,e),r)),f=$I(d,o,l.min,l.max),p=c.validate(r,String(f));if(!p.ok)throw new $(`step-state: ${p.reason}`);tL(t,a,`step-state`,[{key:r,value:p.value}]),t.navigating.set(a,r,p.value),t.dlog(`info`,`step-state: ${r} ${d}โ${p.value} (by ${o}, session=${a})`)};function tL(e,t,n,r){let i=r.filter(e=>e.key.startsWith(Z_));if(i.length===0)return;let a=_j(lL(e,t),n=>e.sessionState.get(t,n),i);if(a.length>0)throw new $(`${n}: refused โ ${a.join(`; `)}`)}function nL(e,t){return Math.max(e.min,Math.min(e.max,t))}function rL(e,t,n,r){if(r===null)return n.min;if(!QI.test(r))throw new $(`${e}: "${t}" shows ${JSON.stringify(r)} before any click, not an integer to step`);return nL(n,parseInt(r,10))}const iL=`render-origin`;function aL(e){return JSON.stringify(e)}function oL(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 sL(e,t){let n=e.sessionState.get(t,iL);if(n===null)throw new $(`session ${t} has not rendered yet โ no config to act on`);return oL(n)}function cL(e,t,n){let r=e.sessionState.get(t,iL);if(r===null)return;let i=oL(r),a=uL(i);n.some(e=>e.kind===`file`&&e.file===a)&&e.reloadConfig(i)}function lL(e,t){return e.configFor(sL(e,t))}function uL(e){return VT(e.projectDir,e.cwd,e.configFile??void 0)}function dL(e,t){return{record:(n,r,i)=>e.journal.file(t,n,r,i),logger:e.dlog}}const fL=(e,t)=>{let[n=``,r=``,i=``]=WI(()=>ND(e)),a=HI(n),o=sL(t,a),s=t.configFor(o),c=Uk(s);if(!r)throw new $(`set-config: <key>/<value> is required (have keys: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`set-config: ${l.reason}`);let u=uL(o),d=hj(s,e=>t.sessionState.get(a,e),r);zF(dL(t,a),u,[[d.key,l.value]]),t.reloadConfig(o),t.dlog(`info`,`set-config: ${d.key}=${l.value} โ ${u} (session=${a})`)},pL=(e,t)=>{let[n=``,r=``,i=``]=WI(()=>ND(e)),a=HI(n);if(!r)throw new $(`step-config: <key> is required (shape: <sessionId>/<key>/<by>)`);if(!QI.test(i))throw new $(`step-config: delta must be an integer, got "${i}"`);let o=parseInt(i,10),s=sL(t,a),c=t.configFor(s),l=Uk(c),u=l.rangeParamsFor(r);if(!u)throw new $(`step-config: key "${r}" is not a bounded (range) config key (have keys: ${l.listKeys().join(`, `)})`);let d=uL(s),f=hj(c,e=>t.sessionState.get(a,e),r),p=RF(d,f.key),m=typeof p==`number`?nL(u,p):rL(`step-config`,r,u,Gk(f.globals,r)),h=$I(m,o,u.min,u.max),g=l.validate(r,String(h));if(!g.ok)throw new $(`step-config: ${g.reason}`);zF(dL(t,a),d,[[f.key,g.value]]),t.reloadConfig(s),t.dlog(`info`,`step-config: ${f.key} ${m}โ${g.value} (by ${o}) โ ${d} (session=${a})`)},mL=(e,t)=>{let[n=``]=WI(()=>ND(e)),r=HI(n),i=sL(t,r),a=t.configFor(i),o=e=>t.sessionState.get(r,e),s=pj(a,o),c=gj(a,o);if(s.length+c.length===0){t.dlog(`info`,`save: nothing unsaved (session=${r})`);return}let l=Ij(a),u=s.map(e=>{let t=l.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save: ${t.reason}`);return[e.target,t.value]});gL(`save`,l,c);let d=uL(i);BF(dL(t,r),d,u,c),t.reloadConfig(i);for(let e of[...s.map(e=>e.sessionKey),...c.map(e=>e.key)])t.sessionState.clear(r,e);t.dlog(`info`,`save: ${[...u.map(([e,t])=>`${e}=${t}`),...c.map(hL)].join(` `)} โ ${d} (session=${r})`)},hL=e=>`${e.preset}/${e.id}.settings.${e.setting}=${Ks(e.value)}`;function gL(e,t,n){for(let r of n){let n=t.validate(r.key,Ks(r.value));if(!n.ok)throw new $(`${e}: ${n.reason}`)}}const _L=(e,t)=>{let[n=``]=WI(()=>ND(e)),r=HI(n),i=sL(t,r),a=t.configFor(i),o=bj(a,e=>t.sessionState.get(r,e)),s=Ij(a),c=o.picks.map(e=>{let t=s.validate(e.sessionKey,e.value);if(!t.ok)throw new $(`save-preset: ${t.reason}`);return[e.configKey,t.value]});gL(`save-preset`,s,o.placements);let l=uL(i),u=KF(dL(t,r),l,o.from,o.globals,c,o.placements);t.reloadConfig(i);for(let e of[...Fb.map(e=>e.sessionKey),...o.placements.map(e=>e.key)])t.sessionState.clear(r,e);t.sessionState.set(r,Pb.preset.sessionKey,u),t.dlog(`info`,`save-preset: ${[`${u} from=${o.from}`,...c.map(([e,t])=>`${e}=${t}`),...o.placements.map(hL)].join(` `)} โ ${l} (session=${r})`)},vL=(e,t)=>{let[n=``,r=``]=WI(()=>ND(e)),i=HI(n);if(!r)throw new $(`delete-preset: <name> is required (shape: <sessionId>/<name>)`);let a=sL(t,i),o=uL(a);qF(dL(t,i),o,r),t.reloadConfig(a);let s=Pb.preset.sessionKey;t.sessionState.get(i,s)===r&&t.sessionState.clear(i,s),t.dlog(`info`,`delete-preset: ${r} โ ${o} (session=${i})`)},yL=(e,t)=>{let[n=``,...r]=WI(()=>ND(e)),i=HI(n),a=sL(t,i),o=Uk(t.configFor(a)).listKeys(),s=r.length===0?[``]:r.filter(e=>!o.includes(e));if(s.length>0)throw new $(`reset-config: unknown config key "${s.join(`", "`)}" (have: ${o.join(`, `)})`);let c=uL(a),l=r.map(xj),u=l.flatMap(e=>e.fileKeys),d=l.flatMap(e=>e.sessionKeys);WF(dL(t,i),c,u),t.reloadConfig(a);for(let e of d)t.sessionState.clear(i,e);t.dlog(`info`,`reset-config: ${[...u,...d.map(e=>`session:${e}`)].join(` `)} โ ${c} (session=${i})`)};function bL(e,t){let n=(e,t)=>[...Ms(A_(e,t).node)].filter(e=>e.kind===`segment`),r=new Set(D_(t.presets).flatMap(e=>n(t,e).map(t=>Q_(yu(e),Os(t)))));return D_(e.presets).flatMap(t=>n(e,t).map(e=>({member:Q_(yu(t),Os(e)),node:e})).filter(({member:e})=>!r.has(e)))}function xL(e,t){return e.flatMap(({member:e,node:n})=>[...Object.values(n.drafts??{}).map(e=>e.key),...e===t?[K_]:[]])}const SL=(e,t)=>{let[n=``,r=``,i=``]=WI(()=>ND(e)),a=HI(n),o=sL(t,a),s=t.configFor(o),c=Uk(s);if(!r)throw new $(`apply-layout-op: <key>/<op> is required (have: ${c.listKeys().join(`, `)})`);let l=c.validate(r,i);if(!l.ok)throw new $(`apply-layout-op: ${l.reason}`);let u=kk(l.value);if(u===null)throw new $(`apply-layout-op: "${l.value}" is not a layout op token`);let d=uL(o),f=JF(dL(t,a),d,r,u);t.reloadConfig(o);let p=xL(bL(s,t.configFor(o)),t.sessionState.get(a,K_)).filter(e=>t.sessionState.get(a,e)!==null);for(let e of p)t.sessionState.clear(a,e);t.dlog(`info`,`apply-layout-op: ${r} ${l.value} โ ${d} placed=${JSON.stringify(f)} released=${JSON.stringify(p)} (session=${a})`)},CL=(e,t)=>{let[n=``]=WI(()=>ND(e)),r=HI(n);t.journal.commit();let i=t.history.undo(r);cL(t,r,i),t.dlog(`info`,`undo: restored ${gI(i)} (session=${r})`)},wL=(e,t)=>{let n=HI(UI(e)),{step:r,discarded:i}=t.navigation.back(n,t.sessionState,Ij(lL(t,n))),a=r.map(e=>`${e.key}=${e.before??`โ
`}`).join(` `);t.dlog(`info`,`back: ${a} discarded=${i} (session=${n})`)},TL=(e,t)=>{let n=HI(UI(e));t.journal.commit();let r=t.history.rewind(n);cL(t,n,r),t.dlog(`info`,`rewind: put back ${gI(r)||`nothing`} as edit mode found it (session=${n})`)},EL=(e,t)=>{let[n=``]=WI(()=>ND(e)),r=HI(n);t.journal.commit();let i=t.history.redo(r);cL(t,r,i),t.dlog(`info`,`redo: re-applied ${gI(i)} (session=${r})`)},DL=(e,t)=>{HI(UI(e)),t.applyUpdate()},OL=`client-hints`;function kL(e,t){let n=e.sessionState.get(t,OL);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 tE(r)}function AL(e,t,n){let r=Nx(n);e.sessionState.setBatch(t,Lx(r)),e.dlog(`info`,`doctor: ${r.map(e=>`${e.check.name}=${e.verdict.ok?`ok`:`failed`}`).join(` `)} (session=${t})`)}const jL=(e,t)=>{let n=HI(UI(e));AL(t,n,kI(t.doctor,kL(t,n)))},ML=(e,t)=>{let[n=``,r=``]=WI(()=>ND(e)),i=HI(n),a=Px(r);if(a===void 0)throw new $(`doctor-fix: unknown check "${r}"`);let o=kI(t.doctor,kL(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=AI(s.fix,o);t.dlog(`info`,`doctor-fix: ${a.name} โ ${s.fix.kind} ${s.fix.name}=${s.fix.value} (session=${i})`),AL(t,i,c)},NL=(e,t)=>{let[n=``,...r]=WI(()=>ND(e)),i=HI(n),a=sL(t,i),o=Object.values(t.configFor(a).actions).filter(e=>`ceiling`in e).find(e=>{let t=hw(e);return t.length===r.length&&t.every((e,t)=>e===r[t])});if(o===void 0)throw new $(`ceiling: "${r.join(` `)}" is not a move this config declares`);let s=o.ceiling===`set`?{kind:`set`,to:o.to}:{kind:`clear`},c=xA({sessionId:i,projectDir:a.projectDir,cwd:a.cwd},kL(t,i));t.memento.move(c,s),t.dlog(`info`,`ceiling: ${r.join(` `)} (session=${i} claudeConfigDir=${c.claudeConfigDir})`)},PL=(e,t)=>{let[n=``,r=``]=WI(()=>ND(e)),i=HI(n),a=Object.values(t.configFor(sL(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=II(t.claudeInput,kL(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})`)},FL=`config-override`,IL=new Map([[dD,KI],[`load-config`,(e,t)=>{let n=e.indexOf(`/`);if(n===-1)throw new $(`load-config: expected <sessionId>/<path> (missing separator)`);let r=HI(WI(()=>decodeURIComponent(e.slice(0,n)))),i=WI(()=>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,FL),t.dlog(`info`,`load-config: override cleared (session=${r})`)):(t.sessionState.set(r,FL,i),t.dlog(`info`,`load-config: ${i} (session=${r})`))}],[fD,qI],[lD,ZI],[uD,eL],[gD,fL],[_D,pL],[xD,yL],[vD,mL],[yD,_L],[bD,vL],[SD,SL],[CD,CL],[wD,EL],[TD,wL],[ED,TL],[mD,JI],[hD,YI],[pD,XI],[DD,DL],[OD,jL],[kD,ML],[AD,NL],[jD,PL]]),LL=new Set([lD,uD,gD,_D,xD,vD,yD,bD,SD,CD,wD,TD,ED,pD,DD,OD,kD,AD,jD]),RL=(e,t)=>{let n=[],r=!1,i=null;for(let{verb:a,value:o}of LD(FD(e))){if(!i&&LL.has(a)){let e=ND(o);e.length>0&&e[0]&&(i=e[0])}let e=IL.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(`
|
|
198
|
+
`));let e=`dispatch: ${n.join(`; `)}`;throw r?Error(e):new $(e)}};function zL(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 BL=new Map([...IL,[cD,RL]].map(([e,t])=>[e,zL(t)]));Object.freeze([...BL.keys()]);const VL=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`]),HL=[[`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`]],UL=[[`workspace.added_dirs`,`string-list`]];function WL(e){let t={missingRequired:[],typeMismatches:[],unknownTopLevelFields:[]},n=typeof e==`object`&&e&&!Array.isArray(e)?e:{};for(let[e,r]of HL){let i=qL(n,e);if(i==null)t.missingRequired.push(e);else{let n=GL(i);n!==r&&t.typeMismatches.push({path:e,expected:r,got:n})}}for(let[e,r]of UL){let i=qL(n,e),a=i===void 0?r:KL(i);a!==r&&t.typeMismatches.push({path:e,expected:r,got:a})}for(let e of Object.keys(n))VL.has(e)||t.unknownTopLevelFields.push(e);return{data:e,report:t}}function GL(e){return Array.isArray(e)?`array`:typeof e==`string`&&!e.isWellFormed()?`ill-formed string`:typeof e}function KL(e){return Array.isArray(e)&&e.every(e=>GL(e)===`string`)?`string-list`:GL(e)}function qL(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 JL(e,t){switch(e){case`vars`:return{what:e,vars:YL(t)};case`segments`:return{what:e,segments:eR(t)};case`config`:return{what:e,config:iR(t)}}}function YL(e){if(e===null)return[];let{store:t,registry:n,config:r}=e,i=QL(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,...XL(r),lastError:a===void 0?null:{timestampMs:a.timestamp,message:a.message},ageMs:ZL(r.lastUpdatedMs())})}return o}function XL(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 ZL(e){return e===null?null:Math.max(0,Date.now()-e)}function QL(e){let t=new Map;for(let[n,r]of Object.entries(e.variables))t.set(n,$L(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}`,$L(i));return t}function $L(e){return e.kind}function eR(e){if(e===null)return[];let{store:t,config:n,lastRenderBySegment:r}=e,i=new Set(t.names()),a=nR(n),o=tR(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:rR(t.template,n.helpers,i),placements:(o.get(e)??[]).map(e=>({id:e,lastRender:r.get(e)??null}))})}return s}function tR(e){let t=new Map;for(let n of D_(e.presets))for(let r of Ms(A_(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 nR(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 rR(e,t,n){let r=new Set;for(let i of _v(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 iR(e){return e===null?null:e.config}const aR=[`vars`,`segments`,`config`];function oR(e){return typeof e==`string`&&aR.includes(e)}function sR(e){return Math.max(1,e-2)}var cR=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 lR=new eF;Ee(lR.launchStats);const uR=new tb({counters:lR,logger:Z}),dR=eN({watchers:uR,logger:Z}),{gitProvider:fR,usageStore:pR,mementoProvider:mR}=dR,hR=new iF,gR=new nI(hR,Z),_R=new wI,vR=new cR(qe()),yR=new QP({gitService:fR,sessionState:hR,watchers:uR},{observers:{onReload:e=>Z(`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)}`)}}),bR=60*1e3;function xR(){let e=import.meta.url,n=[];e.startsWith(`file://`)&&n.push(E(e)),t.argv[1]&&n.push(t.argv[1]);let i=new Map;for(let e of n)try{i.set(e,r.statSync(e).mtimeMs)}catch{}let a=null,o=()=>{for(let[e,t]of i)try{if(r.statSync(e).mtimeMs!==t){Z(`info`,`binary mtime changed (${e}); shutting down`),a&&clearInterval(a),LR(0);return}}catch(e){Z(`warn`,`bin stat failed: ${e.message}`)}};return{arm(){i.size!==0&&(a=setInterval(o,bR),a.unref())},checkNow:o}}const SR=xR(),CR=iM({entryUrl:import.meta.url,intervalMs:bR,releaseIntervalMs:216e5,registryUrl:t.env.CC_CANDYBAR_REGISTRY_URL??`https://registry.npmjs.org`,fetchImpl:fetch,onApplied:()=>SR.checkNow(),log:Z});let wR=null,TR=null,ER=0;function DR(){t.on(`uncaughtException`,e=>{Z(`error`,`uncaughtException: ${e.stack||e.message}`),LR(1)}),t.on(`unhandledRejection`,e=>{Z(`error`,`unhandledRejection: ${String(e)}`),LR(1)});for(let e of[`SIGINT`,`SIGTERM`,`SIGHUP`])t.on(e,()=>{Z(`info`,`received ${e}, shutting down`),LR(0)});try{ER=PE(t.env)}catch(e){Z(`error`,`refusing to boot: ${e.message}`),LR(1);return}wR=MO(t.pid);let e=HO(WO(wR));if(!e.decision.allow){Z(`warn`,`fork-bomb breaker: ${e.decision.reason}; refusing to boot`),LR(1);return}TR=e.registryPath,r.mkdirSync(Fe(),{recursive:!0}),Re(Ie()),hR.useStorage(new oF(Ve(),500,Z)),gR.useStorage(SI(He(),Z)),FO({anchor:PO(t.env),isAlive:IO,onOrphaned:e=>{Z(`info`,`parent watchdog: ${e}; shutting down`),LR(0)}}),OR(b.createServer({allowHalfOpen:!1},e=>{RR(e)}),Ie(),!1)}function OR(e,n,r){e.removeAllListeners(`error`),e.removeAllListeners(`listening`),e.once(`error`,i=>{if(i.code!==`EADDRINUSE`){Z(`error`,`server error: ${i.message}`),LR(1);return}if(r){Z(`info`,`lost rebind race; another daemon is alive โ exiting`),t.exit(0);return}kR(e,n)}),e.listen(n,()=>AR(n))}function kR(e,n){let i=SO(CO(ze(n)),(e,t)=>jO(e,t,{readStartTime:AO,pidAlive:IO}));if(i.kind===`attach-and-exit`){Z(`info`,`EADDRINUSE: ${i.reason} โ exiting`),t.exit(0);return}Z(`warn`,`EADDRINUSE: ${i.reason} โ unlinking stale socket and rebinding`);try{r.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`){Z(`error`,`cannot unlink stale socket ${n}: ${e.message}`),LR(1);return}}OR(e,n,!0)}function AR(e){let n=EO(e);if(n.kind!==`present`){Z(`warn`,`no ownable socket at bind callback (${n.kind}); exiting`),LR(0);return}PR(e);try{r.chmodSync(e,384)}catch(e){Z(`warn`,`chmod socket failed: ${e.message}`)}Z(`info`,`daemon up: pid=${t.pid} v=3 sock=${e} heapCap=${Math.round(te.getHeapStatistics().heap_size_limit/1048576)}MB rssLimit=${Math.round(ER/1048576)}MB`),ZE();let i=vR.reset();i!==null&&Z(`warn`,`diagnostic dump wipe failed: ${i}`),SR.arm(),CR.arm(),NR(),jR(e,n.identity)}function jR(e,n){kO({bound:n,myPid:t.pid,readIdentity:()=>EO(e),readLease:()=>CO(ze(e)),shutdown:e=>LR(e),log:Z}).arm()}let MR=null;function NR(){MR=RE(HE(lR.startedAt.getTime(),e=>LR(e),{rssLimitBytes:ER})),MR.arm()}function PR(e){let n=wO(ze(e),{pid:t.pid,version:3,binPath:t.argv[1],startTime:wR});n!==null&&Z(`warn`,`lease write failed: ${n}`)}let FR=0,IR=!1;function LR(e){if(!IR){IR=!0,setTimeout(()=>t.kill(t.pid,`SIGKILL`),500);try{fR.close()}catch(e){Z(`warn`,`gitService close failed: ${e.message}`)}try{pR.close()}catch(e){Z(`warn`,`usageStore close failed: ${e.message}`)}try{uR.closeAll()}catch(e){Z(`warn`,`watcherRegistry close failed: ${e.message}`)}try{hR.flush()}catch(e){Z(`warn`,`sessionState flush failed: ${e.message}`)}TO(Be(),t.pid),TR!==null&&UO(TR,t.pid,BO,e=>r.unlinkSync(e)),t.exit(e)}}function RR(e){FR++,lR.inFlight=FR;let t=!1,n=(n,r)=>{if(t){r!==null&&Z(`warn`,`exit-after-flush dropped: an earlier responder settled this socket`);return}t=!0;let i=r===null?void 0:()=>LR(r);try{e.end(uE(n),i)}catch(e){Z(`warn`,`response write failed: ${e.message}`),i?.()}},r=setTimeout(()=>{lR.requestsTimedOut++,n({ok:!1,error:`request exceeded 200ms`,code:`TIMEOUT`,daemonV:3},null)},200),i=dE(e=>{BR(e).then(e=>n(e.resp,e.exitAfterFlush)).catch(e=>{Z(`error`,`handler threw: ${e?.stack||e}`),n({ok:!1,error:String(e?.message||e),code:`RENDER_FAILED`,daemonV:3},null)})},e=>{Z(`warn`,`frame parse failed: ${e.message}`),n({ok:!1,error:e.message,code:`BAD_REQUEST`,daemonV:3},null)});e.on(`data`,i),e.on(`error`,e=>{Z(`warn`,`socket error: ${e.message}`)}),e.on(`close`,()=>{clearTimeout(r),FR=Math.max(0,FR-1),lR.inFlight=FR})}const zR=e=>({resp:e,exitAfterFlush:null});async function BR(e){if(!e||typeof e!=`object`||typeof e.v!=`number`)return zR({ok:!1,error:`malformed request`,code:`BAD_REQUEST`,daemonV:3});if(e.v!==3)return e.v>3?Z(`info`,`version mismatch: client=${e.v} > daemon=3; binary likely upgraded โ exiting after the response flushes`):Z(`info`,`version mismatch: client=${e.v} < daemon=3; client is stale โ staying up`),{resp:{ok:!1,error:`protocol v${e.v} not supported (daemon at v3)`,code:`VERSION_MISMATCH`,daemonV:3},exitAfterFlush:e.v>3?0:null};if(e.kind===`shutdown`)return{resp:{ok:!0,output:``},exitAfterFlush:0};if(e.kind===`stats`)return zR({ok:!0,stats:lR.snapshot({gitCache:fR.getStats(),usageCache:pR.getStats(),renderCacheSize:yR.size,watchersActive:uR.size(),nextRestartReason:MR?.describeNextRestart()??null})});if(e.kind===`render`){lR.requestsTotal++;let t=Date.now();try{let{report:n}=WL(e.hookData);for(let e of n.unknownTopLevelFields)Z(`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 lR.requestsErrored++,Z(`warn`,`BAD_REQUEST: ${r.join(`; `)}`),zR({ok:!1,error:`malformed hookData: ${r.join(`; `)}`,code:`BAD_REQUEST`,daemonV:3});let i=e.hookData.workspace.project_dir,{configFile:a,unknownFlagsError:o}=VR(e.args),s=e.hookData.session_id,c=tE(e),l=JSON.stringify(c);hR.get(s,`client-hints`)!==l&&hR.set(s,OL,l);let u=hR.get(s,`config-override`)??a??c.configEnv,d=yR.getOrCreate(i,e.cwd,u),f=aL({projectDir:i,cwd:e.cwd,configFile:u??null});hR.get(s,`render-origin`)!==f&&hR.set(s,iL,f);let p=c.termCols,m=sR(p??120),h=sk(c.termRows),{authoredRoots:g}=d.state,_=t=>hR.get(e.hookData.session_id,t),v=PA(d.state.config,_,e=>g.has(e)),y=await ZA(e.hookData,{...KR,navigation:e=>_R.depth(e,hR,Ij(d.state.config))},e.cwd,d.state.neededInputPaths(v.preset),v,c,{...Cj(d.state.config,d.state.fileHeldSettings,_),configPath:d.configFilePath}),b=[],x=FA(v,m),S=LP(d.state.config,d.state.compiled,d.state.store,d.state.registry,y,x,{perSegmentSink:d.state.lastRenderCellsBySegment,onRenderWarning:e=>b.push(e)},IA(v)),C=hR.get(e.hookData.session_id,`click.error`);C&&hR.clear(e.hookData.session_id,`click.error`);let w=[o,d.lastError,C].filter(Boolean).join(`
|
|
199
|
+
`),T=CR.notice({sessionId:s,dismissed:hR.get(s,Hj),enabled:v.updateNotice}),ee=d.lastError===null?null:d.configFilePath,te=fk(w,T,[d.lastWarning??``,...b].filter(Boolean).join(`
|
|
200
|
+
`)),ne=vR.sync(s,te===null?null:mk(te));ne!==null&&Z(`warn`,`diagnostic dump failed: ${ne}`);let re=hk(S,te,{fullText:ne===null?{kind:`file`,path:vR.pathFor(s)}:{kind:`unavailable`,reason:ne},failedConfigFile:ee},{width:m,rowCap:h,colorCompatibility:v.colorCompatibility}),E=Date.now()-t,D=fR.getStats(),ie=pR.getStats();return Z(`info`,`render sid=${e.hookData.session_id??`?`} took=${E}ms termCols=${p??`?`} termRows=${c.termRows??`?`} width=${m} git=${D.size}/${D.hits}h/${D.misses}m usage=${ie.size}/${ie.hits}h/${ie.misses}m err=${w?`Y`:`N`} upd=${T.length} warn=${d.lastWarning?`Y`:`N`}`),zR({ok:!0,output:re+`
|
|
201
|
+
`})}catch(e){throw lR.requestsErrored++,e}}if(e.kind===`click`)return zR(await qR(e.verb,e.value));if(e.kind===`debug`){if(!oR(e.what))return zR({ok:!1,error:`unknown debug 'what': ${String(e.what)} (have: ${aR.join(`, `)})`,code:`BAD_REQUEST`,daemonV:3});let t=yR.firstState(),n=t===null?null:{store:t.store,registry:t.registry,config:t.config,compiled:t.compiled,lastRenderBySegment:e.what===`segments`?GR(t.lastRenderCellsBySegment,t.config.globals.charset??`unicode`,t.config.globals.colorCompatibility??`truecolor`):WR};return zR({ok:!0,debug:JL(e.what,n)})}return zR({ok:!1,error:`unknown kind`,code:`BAD_REQUEST`,daemonV:3})}function VR(e){let{values:t,tokens:n}=v({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:iE(t.config),unknownFlagsError:r.length>0?`Unknown flags: ${r.join(`, `)}`:null}}const HR={sessionState:hR,dlog:Z,applyUpdate:()=>CR.act(),doctor:EI(),memento:mR,claudeInput:VI(),history:gR,navigation:_R,configFor:e=>yR.getOrCreate(e.projectDir,e.cwd,e.configFile??void 0).state.config,reloadConfig:e=>yR.reload(e.projectDir,e.cwd,e.configFile??void 0)};HR.reloadConfig;const UR={endcaps:`powerline`,colorCompatibility:`truecolor`,wrap:!0,padding:1,charset:go,width:1/0},WR=new Map;function GR(e,t,n){let r=new Map;for(let[i,a]of e)r.set(i,ok(a,{...UR,charset:t,colorCompatibility:n}));return r}const KR={...dR,clock:()=>new Date,history:e=>gR.depth(e)};function qR(e,t){let n=BL.get(e);if(!n)return{ok:!1,error:`unknown click verb: ${e}`,code:`BAD_REQUEST`,daemonV:3};try{return n(t,HR),{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 JR={connectMs:200,budgetMs:500};async function YR(e){let n=e.includes(`--json`),r=await XR();if(r.kind!==`ok`&&(t.stderr.write(`daemon-stats: ${yE(r)}\n`),t.exit(1)),n){t.stdout.write(JSON.stringify(r.value,null,2)+`
|
|
202
|
+
`);return}t.stdout.write(ez(r.value))}function XR(){return pE({kind:`stats`},JR,e=>`stats`in e?e.stats:void 0)}function ZR(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/1024/1024).toFixed(1)}MB`}function QR(e,t){let n=e+t;return n===0?`n/a`:`${(e/n*100).toFixed(1)}%`}function $R(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 ez(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 ${$R(e.uptimeSec)}`),t.push(` rss ${ZR(e.rssBytes)}`),t.push(` heapUsed ${ZR(e.heapUsedBytes)}`),t.push(` heapTotal ${ZR(e.heapTotalBytes)}`),t.push(` external ${ZR(e.externalBytes)}`),t.push(` arrayBuffers ${ZR(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 ${QR(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 ${QR(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 tz={connectMs:200,budgetMs:500};async function nz(e,n){let r=n.includes(`--json`),i=await rz(e);if(i.kind!==`ok`&&(t.stderr.write(`${e}: ${yE(i)}\n`),t.exit(1)),r){t.stdout.write(JSON.stringify(i.value,null,2)+`
|
|
205
|
+
`);return}t.stdout.write(iz(i.value))}function rz(e){return pE({kind:`debug`,what:e},tz,e=>`debug`in e?e.debug:void 0)}function iz(e){switch(e.what){case`vars`:return az(e.vars);case`segments`:return oz(e.segments);case`config`:return sz(e.config);default:return e}}function az(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?``:` ${lz(a.ageMs)}`,o=a.lastError?` โ ${a.lastError.message}`:``;t.push(` ${a.name.padEnd(n)} ${(a.source??`โ`).padEnd(r)} ${a.type.padEnd(i)} ${cz(a.value)}${e}${o}`)}return t.join(`
|
|
207
207
|
`)+`
|
|
208
|
-
`}function
|
|
208
|
+
`}function oz(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 sz(e){return e===null?`config: DSL not active
|
|
212
212
|
`:JSON.stringify(e,null,2)+`
|
|
213
|
-
`}function
|
|
214
|
-
`));return a.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 cz(e){let t=typeof e==`string`?e:JSON.stringify(e);return t.length>60?t.slice(0,57)+`โฆ`:t}function lz(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m`}function uz(){let e=fz();return e===null?null:r.readFileSync(e,`utf-8`)}function dz(){let e;try{e=uz()}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 fz(){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 pz(e){let t=e.CC_CANDYBAR_CONFIG??``;return t===``?void 0:t}const mz=5e3;function hz(e){let t=`/home/tester`,n=Math.floor(Date.now()/1e3),r=`test0a1b-2c3d-4e5f-6a7b-8c9d0e1f2a3b`,i={current_dir:`${t}/code/cc-candybar/src`,project_dir:`${t}/code/cc-candybar`,added_dirs:[]};return{hook_event_name:`Status`,session_id:r,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:i,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:{pane:`%0`,session:`work`},host:{name:`tester-box`,user:`tester`,ssh:!0},autocompact:cS(4e5,1e6),...LA(e),history:{undo:1,redo:1,sinceEdit:1},navigation:{back:1},unsaved:1,resettable:Bb(()=>!0),resumeCommand:NA(i,r,void 0),configPath:`${t}/.config/cc-candybar/config.json5`}}function gz(e,t){let n=BT(e,e),r=HT(n);return r!==null&&t.push(r),n.kind===`file`?n.path:null}async function _z(e,n=t.cwd()){let i=[],a=e===void 0?gz(n,i):c.resolve(LT(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=WT(n,n);o!==null&&i.push(o);try{return{kind:`clean`,configPath:a,warnings:i,rendered:await bz(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 vz(e,t,n){let r=GT(e,aA);n.push(...r.warnings);let i=JT(r,e??`<default>`),a=new GP,o=new jb(a,i.globals.default_empty_value??``,void 0,new iF);try{let e=MP(i,o,{cwd:t});n.push(...e.loadWarnings);let r=await o.settled(mz);return r.length>0&&n.push(`source${r.length===1?``:`s`} still running after ${mz} ms, rendered with fallback values: ${r.join(`, `)}`),{config:i,compiled:e,store:a,registry:o}}catch(e){throw o.dispose(),e}}function yz({config:e,compiled:t,store:n,registry:r},i,a){let o=new Map;return{rendered:LP(e,t,n,r,hz(i),FA(i,a),{onSegmentError:(e,t)=>o.set(`segment "${e}"`,t),onRenderWarning:e=>o.set(`theme rule`,e)},IA(i)),failures:o}}async function bz(e,t,n){let r=await vz(e,t,n),{config:i}=r;try{let e=rM();try{Ij(i),Uk(i)}finally{e()}let t=PA(i,()=>null,()=>!1),n=e=>yz(r,e,200),a=n(t),o=n({...t,presetCustomized:!0}),s=[...[...a.failures].map(([e,t])=>`${e}: ${t}`),...[...o.failures].filter(([e])=>!a.failures.has(e)).map(([e,t])=>`${e}: ${t} (under .preset.customized = true)`)];if(s.length>0)throw Error(`config renders with ${s.length} render error${s.length===1?``:`s`} (the daemon would show them on the bar):\n`+s.map(e=>` ${e}`).join(`
|
|
214
|
+
`));return a.rendered}finally{r.registry.dispose()}}function xz(e){return e.map(e=>`warning: ${e}\n`).join(``)}function Sz(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:xz(e.warnings),code:0};case`fatal`:return{stdout:``,stderr:xz(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 Cz=`--render`,wz=`Usage: cc-candybar check [${Cz}] [config-file]\n`;function Tz(e){let t=e.filter(e=>e.startsWith(`--`)),n=e.filter(e=>!e.startsWith(`--`)),r=t.filter(e=>e!==Cz);return r.length>0?{kind:`usage`,message:`check: unknown option ${r.join(` `)}\n${wz}`}:n.length>1||n[0]===``?{kind:`usage`,message:`check: expected at most one non-empty path\n${wz}`}:{kind:`run`,target:n[0],render:t.includes(Cz)}}async function Ez(e){let n=Tz(e),r=n.kind===`usage`?{stdout:``,stderr:n.message,code:2}:Sz(await _z(n.target??pz(t.env)),n.render);t.stdout.write(r.stdout),t.stderr.write(r.stderr),t.exit(r.code)}const Dz=`${YO}${JO}`;function Oz(e){return`${Dz}โ cc-candybar: ${kz(e)}[0m\n`}function kz(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: ${qO(e.message,60)}`;case`render_failed`:return`render failed: ${qO(e.message,60)}`;case`malformed_response`:return`malformed daemon response: ${qO(e.message,60)}`}}function Az(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:Oz(e),kick:!1,debug:`daemon refused request (permanent: ${e.cause}) โ not kicking`}}}function jz(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 Mz=[`SSH_CONNECTION`,`SSH_CLIENT`,`SSH_TTY`];function Nz(e,t,n){return{termCols:jz(e.COLUMNS,n.columns),termRows:jz(e.LINES,n.rows),ssh:Mz.some(t=>(e[t]??``)!==``),tmux:Ax(e),configEnv:pz(e),claudeConfigDir:Zx(e,t),mementoEnv:Xe(e,t)}}const Pz=` (fix: click the settings menu (${Gc} by default) โบ ๐งฐ tools โบ ๐ฉบ doctor, then [fix] on the bar)`;function Fz({check:e,verdict:t}){return t.ok?`โ ${e.label}\n`:`โ ${e.label} โ ${t.reason}${t.fix===void 0?``:Pz}\n`}function Iz(e,t,n){let r;try{r=kI(e,{tmux:Ax(t),claudeConfigDir:Zx(t,n)})}catch(e){return{stdout:``,stderr:`doctor: ${e instanceof Error?e.message:String(e)}\n`,code:2}}let i=Nx(r);return{stdout:i.map(Fz).join(``),stderr:``,code:+!i.every(e=>e.verdict.ok)}}function Lz(e){e.length>0&&(t.stderr.write(`doctor: takes no arguments
|
|
216
216
|
Usage: cc-candybar doctor
|
|
217
|
-
`),t.exit(2));let n=Iz(
|
|
217
|
+
`),t.exit(2));let n=Iz(EI(),t.env,t.cwd());t.stdout.write(n.stdout),t.stderr.write(n.stderr),t.exit(n.code)}const Rz=e=>e.some(e=>t.argv.includes(e));function zz(){console.log(Dx)}async function Bz(){try{Rz(Tx.help)&&(zz(),t.exit(0)),Rz(Tx.version)&&(console.log(`cc-candybar ${BD}`),t.exit(0));let e=t.argv[2];if(e===`install`&&(await bO(t.argv.slice(3)),t.exit(0)),e===`install-url-handler`&&(hO(),t.exit(0)),e===`url-handle`){await _O(t.argv[3]);return}if(e===`daemon`){DR();return}if(e===`daemon-stats`&&(await YR(t.argv.slice(3)),t.exit(0)),e===`check`||e===`lint`){await Ez(t.argv.slice(3));return}if(e===`schema`){dz();return}if(e===`doctor`){Lz(t.argv.slice(3));return}oR(e)&&(await nz(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`),zz(),t.exit(1));let i=Az(await CE(r,t.argv,t.cwd(),Nz(t.env,t.cwd(),t.stderr)));i.debug!==null&&O(i.debug),i.kick&&UE(),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)}}Bz();export{};
|