@promptctl/cc-candybar 1.105.1 → 1.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +1 -1
  2. package/package.json +6 -5
package/dist/index.mjs CHANGED
@@ -162,7 +162,7 @@ Config tooling:
162
162
  Single-row example: root: { h: ["seg1", "seg2"] }`,line:W(e.source,[`layout`])}),t.root!==void 0&&(r.root=ud(e,`root`,t.root)),t.actions!==void 0&&(r.actions=VC(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=jw(e,t.styles)),t.presets!==void 0&&(r.presets=Nw(e,t.presets)),t.editGlobals!==void 0&&(r.editGlobals=El(e,`editGlobals`,t.editGlobals)),t.helpers!==void 0&&(r.helpers=Pw(e,t.helpers)),vd(e,r),z_(e,r),tv(e,r),wu(e,r,K,`the global settings menu`),r}const wT=new Set([`globals`,`variables`,`segments`,`layout`,`looks`,`root`,`actions`,`styles`,`presets`,`editGlobals`,`helpers`]);function TT(e){let t=AT(e.termCols),n=AT(e.termRows),r=jT(e.ssh),i=OT(e.tmux),a=DT(e.configEnv),o=ET(e.claudeConfigDir);return{...t!==void 0&&{termCols:t},...n!==void 0&&{termRows:n},...r!==void 0&&{ssh:r},...i!==void 0&&{tmux:i},...a!==void 0&&{configEnv:a},...o!==void 0&&{claudeConfigDir:o}}}function ET(e){return typeof e==`string`&&c.isAbsolute(e)?e:void 0}function DT(e){return typeof e==`string`&&e!==``?sT(e):void 0}function OT(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 kT=1e4;function AT(e){if(typeof e!=`number`||!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t>kT?kT:t}function jT(e){return typeof e==`boolean`?e:void 0}var MT=class extends Error{constructor(e){super(e),this.name=`ProtocolError`}};function NT(e){let t=Buffer.from(JSON.stringify(e),`utf8`),n=Buffer.alloc(4);return n.writeUInt32BE(t.length,0),Buffer.concat([n,t])}function PT(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 MT(`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 MT(e instanceof Error?e.message:String(e));e instanceof Error&&(n.cause=e),t(n);return}}}}function FT(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=PT(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(NT(t))})}async function IT(e,t,n){let r=null;try{r=await VT(Fe(),t.connectMs);let i=await FT(r,{v:3,...e},t.budgetMs);return zT(e.kind,i,n)}catch(e){return BT(e)}finally{r&&r.destroy()}}function LT(e,t){return typeof e==`string`?e:t}function RT(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:0}function zT(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=LT(r.error,`(no error message)`);switch(r.code){case`VERSION_MISMATCH`:return{kind:`permanent`,cause:`version_mismatch`,clientV:3,daemonV:RT(r.daemonV)};case`TIMEOUT`:return{kind:`transient`,cause:`timeout`,message:i};case`BAD_REQUEST`:return{kind:`permanent`,cause:`bad_request`,message:i};case`RENDER_FAILED`:return{kind:`permanent`,cause:`render_failed`,message:i};default:return{kind:`permanent`,cause:`malformed_response`,message:`unknown error code: ${String(r.code)}`}}}function BT(e){if(e instanceof MT||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 VT(e,t){return new Promise((n,r)=>{let i=y.createConnection({path:e}),a=setTimeout(()=>{i.destroy(),r(Error(`CONNECT_TIMEOUT`))},t);i.once(`connect`,()=>{clearTimeout(a),n(i)}),i.once(`error`,e=>{clearTimeout(a),r(e)})})}function HT(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 UT={connectMs:50,budgetMs:150},WT={connectMs:50,budgetMs:200};function GT(e){let t=e.output;return typeof t==`string`?t:void 0}function KT(e,t,n,r){return IT({kind:`render`,hookData:e,args:t,cwd:n,...r},UT,GT)}function qT(e,t){return IT({kind:`click`,verb:e,value:t},WT,GT)}let JT=null;function YT(e){if(JT!==null)return JT;r.mkdirSync(c.dirname(e),{recursive:!0});try{JT=r.statSync(e).size}catch{JT=0}return JT}function XT(e){for(let t=2;t>=1;t--){let n=`${e}.${t}`,i=`${e}.${t+1}`;try{r.renameSync(n,i)}catch{}}try{r.renameSync(e,`${e}.1`)}catch{}JT=0}function Q(e,t){let n=`${new Date().toISOString()} [${e}] ${t}\n`;try{let e=qe(),t=YT(e);r.appendFileSync(e,n),JT=t+Buffer.byteLength(n,`utf8`),JT>=5242880&&XT(e)}catch(e){JT=null;try{process.stderr.write(`${n}cc-candybar: daemon.log unwritable: ${e.message}\n`)}catch{}}}function ZT(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 QT(e,t){return e===`darwin`?[$T(`footprint`,[`-p`,String(t)]),$T(`vmmap`,[`--summary`,String(t)])]:e===`linux`?[eE(`/proc/self/smaps_rollup`),eE(`/proc/self/status`)]:[]}function $T(e,t){return{name:`${e} ${t.join(` `)}`,read:()=>{let n=Oe({bin:e,args:[...t],timeoutMs:5e3,category:`limits.memory-report`});return n.ok?n.stdout.trim().length>0?{kind:`text`,text:n.stdout}:{kind:`unavailable`,reason:`exited 0 but printed nothing`}:{kind:`unavailable`,reason:`${n.reason}${n.error===void 0?``:`: ${n.error}`}${tE(n.stderr)}`}}}}function eE(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 tE(e){let t=e.split(`
164
164
  `).map(e=>e.trim()).find(e=>e.length>0);return t===void 0?``:` (${t})`}const nE=`CC_CANDYBAR_RSS_LIMIT_MB`;function rE(e){let t=e[nE];if(t===void 0)return 512;let n=/^\d+$/.test(t)?Number(t):NaN;if(!Number.isSafeInteger(n)||n<=0)throw Error(`${nE} must be a positive integer (MB), got ${JSON.stringify(t)}`);return n}function iE(e){return rE(e)*2}const aE=1024*1024;function oE(e){return rE(e)*aE}const sE={memoryReport:{prefix:`memory-`,suffix:`.txt`},heapSnapshot:{prefix:`heap-`,suffix:`.heapsnapshot`}};function cE(e,t,n){let{prefix:r,suffix:i}=sE[t];return c.join(e,`${r}${n}${i}`)}function lE(e){for(let t of Object.keys(sE)){let{prefix:n,suffix:r}=sE[t];if(e.startsWith(n)&&e.endsWith(r))return t}return null}function uE(e){let t=e.rssLimitBytes??512*aE,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 dE(e.log,`memory report`,()=>{let t=cE(e.snapshotDir,`memoryReport`,o);e.writeMemoryReport(t,e.captureMemoryReport()),e.log(`info`,`memory report written: ${t}`)}),dE(e.log,`heap snapshot`,()=>{let t=cE(e.snapshotDir,`heapSnapshot`,o);e.log(`info`,`heap snapshot written: ${e.writeHeapSnapshot(t)}`)}),dE(e.log,`artifact rotation`,()=>{pE(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 dE(e,t,n){try{n()}catch(n){e(`warn`,`${t} failed: ${n.message}`)}}function fE(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=lE(t);if(n===null)return t;let{prefix:r,suffix:i}=sE[n];return t.slice(r.length,t.length-i.length)}function pE(e,t,n){let r=new Map;for(let t of e){let e=fE(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 mE(e,t,n={}){let i=Pe();return{now:()=>Date.now(),pid:process.pid,snapshotDir:i,log:Q,memoryBytes:()=>{let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal}},captureMemoryReport:()=>ZT(QT(process.platform,process.pid)),writeMemoryReport:(e,t)=>r.writeFileSync(e,t,{mode:384}),writeHeapSnapshot:e=>ne.writeHeapSnapshot(e),listArtifacts:()=>{try{return r.readdirSync(i).filter(e=>lE(e)!==null).map(e=>c.join(i,e))}catch{return[]}},removeFile:e=>r.unlinkSync(e),shutdown:t,startedAtMs:e,...n}}function hE(e={}){if(jE()!==null)return;let n=e.spawn??ME,r=OE();if(r.kind===`contended`){let e=_E();e!==null&&e>2e3&&(t.stderr.write(`cc-candybar: spawn-lock held ${e}ms (likely crashed holder) — spawning unlocked\n`),gE(n));return}if(r.kind===`error`){t.stderr.write(`cc-candybar: spawn-lock unavailable (${r.reason}) — spawning unlocked\n`),gE(n);return}try{gE(n)}finally{AE()}}function gE(e){wE()&&vE(e)}function _E(){try{let e=r.statSync(Ue());return Date.now()-e.mtimeMs}catch{return null}}function vE(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 yE(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function bE(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function xE(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 SE(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 CE(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function wE(){let e=We(),n=Ge(),r=xE(n),i=yE(TE(e),bE(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`),EE(e),SE(n,Math.min(r+1,5)),!0)}function TE(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function EE(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 DE=null;function OE(){let e=Ue();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return DE={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(!kE(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 kE(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function AE(){if(!DE)return;let{fd:e,path:t}=DE;DE=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function jE(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function ME(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${iE(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const NE=`cc-candybar`,PE=`dispatch`,FE=`set-state`,IE=`step-state`,LE=`copy`,RE=`open-vscode`,zE=`toolbar-toggle`,BE=`show-config-error`,VE=`show-config-warning`,HE=`set-config`,UE=`step-config`,WE=`save`,GE=`save-preset`,KE=`delete-preset`,qE=`reset-config`,JE=`apply-layout-op`,YE=`undo`,XE=`redo`,ZE=`back`,QE=`rewind`,$E=`apply-update`,eD=`doctor-run`,tD=`doctor-fix`,nD=`ceiling`,rD=`slash`;function iD(e){return e.map(encodeURIComponent).join(`/`)}function aD(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function oD(e){return`${NE}://${PE}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${iD(e.args)}`)}`).join(`&`)}`}function sD(e){return new w(e).getAll(`e`).map(dD)}const cD=new Set([FE,qE]);function lD(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&uD(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function uD(e,t){if(e.verb!==t.verb||!cD.has(e.verb))return;let[n,r]=[dD(e.value),dD(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function dD(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const fD=`1.105.1`;function pD(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function mD(e){return e??c.join(p.homedir(),`.claude`)}function hD(e){return c.join(e,`settings.json`)}function gD(e){return c.join(e,`plugins`,`installed_plugins.json`)}function _D(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function vD(e){let t;try{let n=_D(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${yD(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const yD=e=>e instanceof Error?e.message:String(e),bD=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function xD(e){let t=bD.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 SD(e){return e.join(`.`)}function CD([e,t,n],[r,i,a]){return e-r||t-i||n-a}const wD=`@promptctl/cc-candybar`;async function TD(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`?xD(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function ED(e,t){let n=xD(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=CD(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 DD(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${SD(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${SD(t.installed)} is newer than the registry's latest release (${SD(t.latest)}): an unpublished build.\n`};case`stale`:{let n=SD(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${SD(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 OD=`CCCandybarURLHandler`,kD=[],AD={"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 jD(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function MD(e,t){return[e,...t].map(jD).join(` `)}function ND(){return c.join(p.homedir(),`Applications`,`${OD}.app`)}function PD(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function FD(){if(process.platform===`darwin`)return c.join(p.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(p.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function ID(){return c.join(FD(),`bin`,`cc-candybar`)}function LD(){return c.join(FD(),`dist`,`index.mjs`)}function RD(e,t){return[`on open location L`,`\tdo shell script "'${e.replace(/"/g,`\\"`)}' '${t.replace(/"/g,`\\"`)}' url-handle " & quoted form of L`,`end open location`].join(`
165
+ `)}catch(e){t.stderr.write(`cc-candybar: daemon spawn failed: ${e.message}\n`)}}function yE(e,t){return e===null?{kind:`allow`}:e<-1e4?{kind:`allow-future-garbage`,futureMs:-e}:e<t?{kind:`deny`}:{kind:`allow`}}function bE(e){return Math.min(3e3*2**Math.min(Math.max(e,0),5),6e4)}function xE(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 SE(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 CE(){try{r.unlinkSync(Ge())}catch(e){e.code!==`ENOENT`&&t.stderr.write(`cc-candybar: could not reset spawn.backoff: ${e.message}\n`)}}function wE(){let e=We(),n=Ge(),r=xE(n),i=yE(TE(e),bE(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`),EE(e),SE(n,Math.min(r+1,5)),!0)}function TE(e){try{return Date.now()-r.statSync(e).mtimeMs}catch{return null}}function EE(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 DE=null;function OE(){let e=Ue();for(let n=0;n<2;n++){try{let n=r.openSync(e,`wx`,384);try{r.writeSync(n,JSON.stringify({pid:t.pid,ts:Date.now()}))}catch{}return DE={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(!kE(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 kE(e){try{let t=r.statSync(e);return Date.now()-t.mtimeMs>1e4}catch{return!0}}function AE(){if(!DE)return;let{fd:e,path:t}=DE;DE=null;try{r.closeSync(e)}catch{}try{r.unlinkSync(t)}catch{}}function jE(){try{return r.mkdirSync(Pe(),{recursive:!0}),null}catch(e){return`mkdir ${Pe()}: ${e.message}`}}function ME(){let e=t.execPath,n=t.argv[1];return n?ke({bin:e,args:[`--max-old-space-size=${iE(t.env)}`,n,`daemon`],category:`daemon-spawn`}).ok:!1}const NE=`cc-candybar`,PE=`dispatch`,FE=`set-state`,IE=`step-state`,LE=`copy`,RE=`open-vscode`,zE=`toolbar-toggle`,BE=`show-config-error`,VE=`show-config-warning`,HE=`set-config`,UE=`step-config`,WE=`save`,GE=`save-preset`,KE=`delete-preset`,qE=`reset-config`,JE=`apply-layout-op`,YE=`undo`,XE=`redo`,ZE=`back`,QE=`rewind`,$E=`apply-update`,eD=`doctor-run`,tD=`doctor-fix`,nD=`ceiling`,rD=`slash`;function iD(e){return e.map(encodeURIComponent).join(`/`)}function aD(e){return e.length===0?[]:e.split(`/`).map(decodeURIComponent)}function oD(e){return`${NE}://${PE}/${e.map(e=>`e=${encodeURIComponent(`${e.verb}/${iD(e.args)}`)}`).join(`&`)}`}function sD(e){return new w(e).getAll(`e`).map(dD)}const cD=new Set([FE,qE]);function lD(e){return e.reduce((e,t)=>{let n=e.at(-1),r=n&&uD(n,t);return r?[...e.slice(0,-1),r]:[...e,t]},[])}function uD(e,t){if(e.verb!==t.verb||!cD.has(e.verb))return;let[n,r]=[dD(e.value),dD(t.value)];return n.verb===r.verb?{verb:e.verb,value:`${n.verb}/${n.value}/${r.value}`}:void 0}function dD(e){let t=e.indexOf(`/`);return t===-1?{verb:e,value:``}:{verb:e.slice(0,t),value:e.slice(t+1)}}const fD=`1.106.0`;function pD(e,t){let n=(e.CLAUDE_CONFIG_DIR??``).split(`,`)[0].trim();return n===``?void 0:c.resolve(t,n)}function mD(e){return e??c.join(p.homedir(),`.claude`)}function hD(e){return c.join(e,`settings.json`)}function gD(e){return c.join(e,`plugins`,`installed_plugins.json`)}function _D(e){return r.existsSync(e)?r.readFileSync(e,`utf8`):``}function vD(e){let t;try{let n=_D(e);if(/^\s*$/.test(n))return{};t=Ko.parse(n)}catch(t){throw Error(`cannot read ${e}: ${yD(t)}`,{cause:t})}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`cannot read ${e}: not a JSON object`);return t}const yD=e=>e instanceof Error?e.message:String(e),bD=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;function xD(e){let t=bD.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 SD(e){return e.join(`.`)}function CD([e,t,n],[r,i,a]){return e-r||t-i||n-a}const wD=`@promptctl/cc-candybar`;async function TD(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`?xD(n.latest):Y}catch(e){return X(e instanceof Error?e.message:String(e))}}function ED(e,t){let n=xD(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=CD(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 DD(e,t){switch(t.kind){case`current`:return{stream:`stdout`,text:`✓ cc-candybar ${SD(t.installed)} is the latest release.\n`};case`ahead`:return{stream:`stdout`,text:`cc-candybar ${SD(t.installed)} is newer than the registry's latest release (${SD(t.latest)}): an unpublished build.\n`};case`stale`:{let n=SD(t.latest);return{stream:`stderr`,text:`⚠ cc-candybar ${SD(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 OD=`CCCandybarURLHandler`,kD=[],AD={"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 jD(e){return/^[A-Za-z0-9_./=,:-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function MD(e,t){return[e,...t].map(jD).join(` `)}function ND(){return c.join(p.homedir(),`Applications`,`${OD}.app`)}function PD(){if(process.platform!==`darwin`)throw Error(`URL handler installation requires macOS (found platform: ${process.platform}).`)}function FD(){if(process.platform===`darwin`)return c.join(p.homedir(),`Library`,`Application Support`,`CCCandybar`);let e=process.env.XDG_DATA_HOME??c.join(p.homedir(),`.local`,`share`);return c.join(e,`cc-candybar`)}function ID(){return c.join(FD(),`bin`,`cc-candybar`)}function LD(){return c.join(FD(),`dist`,`index.mjs`)}function RD(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 zD(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 BD(t){let n=AD[`${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 VD(e,t){c.resolve(e)!==c.resolve(t)&&r.copyFileSync(e,t)}function HD(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 ${wD}@latest install`);return n.toString(`latin1`)===`#!`?`node-shim`:`native`}finally{r.closeSync(t)}}function UD(){let e=zD(process.argv[1]);if(!r.existsSync(e))throw Error(`install: bundled dist not found at ${e}. Reinstall the package.`);let t=BD(e);if(!r.existsSync(t.sourcePath))throw Error(`install: render entry not found at ${t.sourcePath}. Reinstall the package.`);r.mkdirSync(c.dirname(LD()),{recursive:!0}),r.mkdirSync(c.dirname(ID()),{recursive:!0}),VD(e,LD()),VD(t.sourcePath,ID()),r.chmodSync(ID(),493),r.rmSync(c.join(FD(),`url-handler.mjs`),{force:!0});let n=HD(ID());return process.stdout.write(`Staged cc-candybar v${fD} runtime at ${FD()}\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:ID(),distPath:LD(),entryKind:n}}function WD(){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>${NE}</string>`,` </array>`,` </dict>`,`</array>`].join(`
167
167
  `)}]}function GD(e){let t=ND();r.mkdirSync(c.dirname(t),{recursive:!0}),r.existsSync(t)&&r.rmSync(t,{recursive:!0,force:!0}),process.stdout.write(`Building ${t}\n`);let n=Oe({bin:`/usr/bin/osacompile`,args:[`-o`,t,`-e`,RD(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 WD())Oe({bin:`/usr/bin/plutil`,args:[`-remove`,e,i],category:`install.plutil`});for(let{key:e,xml:t}of WD()){let n=Oe({bin:`/usr/bin/plutil`,args:[`-insert`,e,`-xml`,t,i],category:`install.plutil`});if(!n.ok)throw process.stderr.write(n.stderr),Error(`plutil -insert ${e} failed (${n.reason})`)}process.stdout.write(`Registering ${NE}:// with Launch Services\n`);let a=Oe({bin:`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister`,args:[`-f`,t],category:`install.lsregister`});if(!a.ok)throw process.stderr.write(a.stderr),Error(`lsregister failed (${a.reason})`);process.stdout.write(`✓ ${OD}.app installed and registered.\n`),process.stdout.write(` Test: open '${NE}://hello-world' && pbpaste\n`)}function KD(){PD(),GD(UD().distPath)}function qD(e,t=NE){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:LE,value:r}:{verb:decodeURIComponent(r.slice(0,i)),value:r.slice(i+1)}}async function JD(e){e||(process.stderr.write(`url-handle: missing URL argument.
168
168
  `),process.exit(1));let t;try{t=qD(e)}catch(e){process.stderr.write(`url-handle: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let n=await qT(t.verb,t.value);n.kind===`ok`&&process.exit(0),n.kind===`transient`&&(hE(),process.stderr.write(`url-handle: daemon unavailable (${n.cause}: ${n.message})\n`),process.exit(1)),process.stderr.write(YD(n)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptctl/cc-candybar",
3
- "version": "1.105.1",
3
+ "version": "1.106.0",
4
4
  "description": "Statusline renderer for Claude Code — a JSON5-configurable DSL with daemon-cached data sources, byte-clean palette-aware composition, and OSC8 click verbs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -25,6 +25,7 @@
25
25
  "demo": "tsx src/demo/dsl.ts",
26
26
  "gallery": "tsx src/demo/gallery.ts",
27
27
  "bar": "node --require ./scripts/version-stamp.cjs --import tsx scripts/drive-bar.ts",
28
+ "bar:web": "node --require ./scripts/version-stamp.cjs --import tsx scripts/bar-web.ts",
28
29
  "benchmark:timing": "scripts/benchmark_timing.sh",
29
30
  "preloadtest": "pnpm build",
30
31
  "loadtest": "node --import tsx scripts/daemon-load-harness.ts",
@@ -92,9 +93,9 @@
92
93
  "mobx": "^6.15.0"
93
94
  },
94
95
  "optionalDependencies": {
95
- "@promptctl/cc-candybar-darwin-arm64": "1.105.1",
96
- "@promptctl/cc-candybar-darwin-x64": "1.105.1",
97
- "@promptctl/cc-candybar-linux-x64": "1.105.1",
98
- "@promptctl/cc-candybar-linux-arm64": "1.105.1"
96
+ "@promptctl/cc-candybar-darwin-arm64": "1.106.0",
97
+ "@promptctl/cc-candybar-darwin-x64": "1.106.0",
98
+ "@promptctl/cc-candybar-linux-x64": "1.106.0",
99
+ "@promptctl/cc-candybar-linux-arm64": "1.106.0"
99
100
  }
100
101
  }