@north-light/cli 0.3.582 → 0.3.584

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.
@@ -1744,7 +1744,7 @@ Invocation: \`${c.invocation.replaceAll("`","\\`")}\`
1744
1744
 
1745
1745
  ${c.content}
1746
1746
  `,noNvim:"nvim is required to inspect loaded commands. Install Neovim and retry."})}}}function mgn(t,e,n){let r=e;return{current:()=>r,refresh:()=>{t.canvasSource.getNode(t.nodeId).then(i=>{n.isTornDown()||i===null||(r=i,n.onChanged())}).catch(()=>{})}}}var ssi={readOption:Tf,writeOption:(t,e,n)=>{ag(t,e,n)},stampAsync:age,currentPane:()=>process.env.TMUX_PANE??sg()?.pane,ownerId:()=>String(process.pid)};function ygn(t,e,n=ssi){let r,i=n.ownerId(),o=()=>{if(r===void 0||r==="")return!0;let s=n.readOption(r,Agn);return s===void 0||s===""?!0:s===i};return{set:()=>{r=n.currentPane(),ggn(r,i,n.writeOption),usi(t,r,e,n.writeOption),dsi(r,n.writeOption),asi(t,r,n.writeOption)},stamp:()=>{t||r===void 0||r===""||n.stampAsync(r)},clear:()=>{o()&&(lsi(t,r,n.writeOption),psi(r,n.writeOption),csi(t,r,n.writeOption),ggn(r,"",n.writeOption))},pane:()=>r}}var Agn="@crtr_viewer_pid";function ggn(t,e,n){if(!(t===void 0||t===""))try{n(t,Agn,e)}catch{}}function asi(t,e,n){if(!(t||e===void 0||e===""))try{n(e,Q$,String(Date.now()))}catch{}}function csi(t,e,n=ag){if(!(t||e===void 0||e===""))try{n(e,Q$,"")}catch{}}function usi(t,e,n,r=ag){if(!(t||e===void 0||e===""))try{r(e,"@crtr_node",n)}catch{}}function lsi(t,e,n=ag){if(!(t||e===void 0||e===""))try{n(e,"@crtr_node","")}catch{}}function dsi(t,e=ag){if(!(t===void 0||t===""))try{e(t,"@crtr_attach","1")}catch{}}function psi(t,e=ag){if(!(t===void 0||t===""))try{e(t,"@crtr_attach","")}catch{}}pR();Il();import{constants as hsi,accessSync as fsi,existsSync as msi,mkdtempSync as gsi,readFileSync as ysi,rmSync as kpe,statSync as Asi}from"node:fs";import{tmpdir as xsi}from"node:os";import{delimiter as wsi,join as Tpe,resolve as bsi,sep as wgn}from"node:path";import{execFile as xgn,spawnSync as vsi}from"node:child_process";function Esi(t,e){let n=new Map(t.map(o=>[o.node_id,o])),r=new Set([e]);for(let o=n.get(e);o?.parent!==null&&o?.parent!==void 0;){let s=o.parent;if(r.has(s))break;r.add(s),o=n.get(s)}let i=[e];for(;i.length>0;){let o=i.pop();for(let s of t)s.parent!==o||r.has(s.node_id)||(r.add(s.node_id),i.push(s.node_id))}return t.filter(o=>r.has(o.node_id)).map(o=>o.node_id)}function bgn(t,e){let n=new Set(Esi(t,e));return t.filter(r=>n.has(r.node_id))}function Ssi(t){let e=[];for(let n of t)try{e.push(eYe(n.node_id,n.grantee))}catch{continue}return MVe(e)}function Csi(t){try{return Asi(t).isDirectory()}catch{return!1}}function _si(t,e){let n=[...e==null?[]:[e],...(process.env.PATH??"").split(wsi).filter(Boolean).map(r=>Tpe(r,t))];return[...new Set(n)]}function RVe(t,e){for(let n of _si(t,e)){try{fsi(n,hsi.X_OK)}catch{continue}if(vsi(n,["--version"],{stdio:"ignore"}).status===0)return n}return null}function Isi(t){if(t===null||t==="")return{projects:[],settings:null};try{let{profileId:e,manifest:n}=jx(t);return{projects:n.projects.map(r=>r.path),settings:yz(e)}}catch{return{projects:[],settings:null}}}function MVe(t){let e=new Set,n=[];for(let r of t){let i=bsi(r);e.has(i)||!Csi(i)||(e.add(i),n.push(i))}return n}function ksi(t){return t.filter(e=>!t.some(n=>n!==e&&e.startsWith(n+wgn)))}var Tsi=20;function Rsi(t){try{let e=ysi(t);if(e.length===0)return null;let n=e[e.length-1]===0?e.length-1:e.length;return e.subarray(0,n).toString("utf8")||null}catch{return null}}function vgn(t){let e=RVe("fd",t.fdPath);if(e===null){t.onNotice("fd is required for profile file search");return}let n=RVe("fzf");if(n===null){t.onNotice("fzf is required for profile file search");return}let r=RVe("nvim");if(r===null){t.onNotice("Neovim is required for profile file search");return}let i=Isi(t.profileId),o=MVe([t.cwd,...t.nodeDirs,...i.projects]);if(o.length===0){t.onNotice("No profile file-search directories exist");return}let s=ksi(o),a=MVe([...i.settings===null?[]:[i.settings]]),c=gsi(Tpe(xsi(),"crtr-profile-files-")),u=Tpe(c,"selection"),l=Tpe(c,"candidates"),d=Ssi(t.nodes).filter(m=>!s.some(g=>m===g||m.startsWith(g+wgn))),f=`{ ${[...s.map(m=>`${ln(e)} --type f --hidden --exclude .git . ${ln(m)}`),...d.map(m=>`${ln(e)} --type f --hidden --exclude .git --exclude ${ln("/jobs")} . ${ln(m)}`),...a.map(m=>`${ln(e)} --type f --hidden --exclude .git --no-ignore . ${ln(m)}`)].map(m=>`${m} &`).join(" ")} wait; } > ${ln(l)} && ${ln(n)} --print0 --scheme=path --hscroll-off=${Tsi} --header ${ln("fuzzy path \u2022 ctrl-y yank file path")} --bind ${ln("ctrl-y:execute-silent(printf '%s' {} | { if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v wl-copy >/dev/null 2>&1; then wl-copy; elif command -v xclip >/dev/null 2>&1; then xclip -selection clipboard; else cat >/dev/null; fi; }; printf '%s' {} | tmux load-buffer -w -)+abort")} --preview ${ln("head -100 -- {}")} < ${ln(l)} > ${ln(u)}`;try{xgn("tmux",["display-popup","-E","-T"," profile files ","-w","80%","-h","60%",...Hd(),f],()=>{let m=Rsi(u);if(m===null||!msi(m)){kpe(c,{recursive:!0,force:!0});return}let g=`exec ${XT("edit",[m],r)}`;try{xgn("tmux",["display-popup","-E","-T"," profile file ","-w","90%","-h","90%",...Hd(),g],()=>kpe(c,{recursive:!0,force:!0}))}catch(A){kpe(c,{recursive:!0,force:!0}),t.onNotice(`Could not open profile file: ${A instanceof Error?A.message:String(A)}`)}})}catch(m){kpe(c,{recursive:!0,force:!0}),t.onNotice(`Could not open profile file search: ${m instanceof Error?m.message:String(m)}`)}}var Sgn={statuses:{},widgets:{},title:void 0};function Cgn(t="observer"){return{role:t,agentDir:void 0,engine:void 0,contextTokens:void 0,queued:[],display:Sgn,dialog:null}}function Msi(t){let e=t.snapshot,n=e.display??Sgn,r=e.stats.contextUsage;return{role:t.role,agentDir:t.agentDir,engine:e.state,contextTokens:r?.tokens??void 0,queued:Psi(e),display:{statuses:{...n.statuses},widgets:Object.fromEntries(Object.entries(n.widgets).map(([i,o])=>[i,{lines:[...o.lines],placement:o.placement}])),title:n.title},dialog:t.pending_dialog??null}}function _gn(t,e){switch(e.type){case"welcome":return Msi(e);case"model_changed":return GN(t,{model:e.model});case"extension_ui_request":switch(e.method){case"setStatus":{let n=t.display.statuses[e.statusKey];if(e.statusText===void 0?n===void 0:n===e.statusText)return t;let r={...t.display.statuses};return delete r[e.statusKey],e.statusText!==void 0&&(r[e.statusKey]=e.statusText),{...t,display:{...t.display,statuses:r}}}case"setWidget":{let n=e.widgetLines===void 0?void 0:{lines:[...e.widgetLines],placement:e.widgetPlacement??"aboveEditor"};if(Bsi(t.display.widgets[e.widgetKey],n))return t;let r={...t.display.widgets};return delete r[e.widgetKey],n!==void 0&&(r[e.widgetKey]=n),{...t,display:{...t.display,widgets:r}}}case"setTitle":return t.display.title===e.title?t:{...t,display:{...t.display,title:e.title}};case"notify":return t;default:return{...t,dialog:e}}case"extension_ui_dismiss":return t.dialog!==null&&t.dialog.id===e.id?{...t,dialog:null}:t;case"message_end":return e.message.role!=="assistant"?t:Dsi(t,e.message.usage.input+e.message.usage.cacheRead+e.message.usage.cacheWrite);case"agent_start":return GN(t,{isStreaming:!0});case"agent_end":case"agent_settled":return GN(t,{isStreaming:!1});case"session_info_changed":return GN(t,{sessionName:e.name});case"thinking_level_changed":return GN(t,{thinkingLevel:e.level});case"queue_update":{let n=[...e.steering,...e.followUp].map(i=>({text:i}));return{...GN(t,{pendingMessageCount:n.length}),queued:n}}default:return t}}function Psi(t){let e=t.queued;if(typeof e!="object"||e===null)return[];let{steering:n,followUp:r}=e;return[...Egn(n),...Egn(r)].map(i=>({text:i}))}function Egn(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}function GN(t,e){let n=t.engine;if(n===void 0)return t;let r=!1;for(let[i,o]of Object.entries(e))if(n[i]!==o){r=!0;break}return r?{...t,engine:{...n,...e}}:t}function Dsi(t,e){return t.contextTokens===e?t:{...t,contextTokens:e}}function Bsi(t,e){return t===void 0||e===void 0?t===e:t.placement===e.placement&&t.lines.length===e.lines.length&&t.lines.every((n,r)=>n===e.lines[r])}function Ign(t,e){let n=Cgn(t),r=i=>{let o=n;if(o===i)return;let s=o.engine!==i.engine;s&&o.engine!==void 0&&(e.setEngineState(o.engine),e.setEditorTitle(o.engine.sessionName)),s&&e.paintEditorFrame(),o.display.widgets!==i.display.widgets&&e.renderExtensionWidgets(),o.display.title!==i.display.title&&o.display.title!==void 0&&e.setTerminalTitle(o.display.title),o.queued!==i.queued&&e.renderQueued(),(s||o.role!==i.role||o.contextTokens!==i.contextTokens||o.display.statuses!==i.display.statuses)&&e.renderFooter(),s&&e.refreshChrome()};return{state:()=>n,fold:i=>{let o=n;n=_gn(n,i),r(o)},patchLocal:i=>{let o=n.engine;if(o===void 0)return;let s=n;n={...n,engine:{...o,...i}},r(s)},modelThinkingLabel:()=>{let i=n.engine?.model?.id;if(i===void 0)return;let o=n.engine?.thinkingLevel;return o!==void 0&&o!=="off"?`${i} ${o}`:i}}}tt();import{spawn as Lsi}from"node:child_process";import{fileURLToPath as PVe}from"node:url";var Osi=40,kgn=[PVe(new URL("./assets/whip-snap.mp3",import.meta.url)),PVe(new URL("./assets/whip-crack.mp3",import.meta.url)),PVe(new URL("./assets/whip-06.mp3",import.meta.url))];function Nsi(t){let e=process.platform==="darwin"?"afplay":process.platform==="linux"?"aplay":void 0;if(e!==void 0)try{let n=Lsi(e,[t],{stdio:"ignore",detached:!0});n.on("error",()=>{}),n.unref()}catch{}}var Tgn=[["","","","","","","","\x1B[1m\u2844\x1B[22m","\x1B[1m\u2803\x1B[22m","\x1B[1m\u2880\x1B[22m\x1B[1m\u2860\x1B[22m/\u28A4\u2840","\x1B[1m\u280B\x1B[22m \u2811\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804",""],["","","","","","","","\x1B[1m\u2844\x1B[22m","\x1B[1m\u2803\x1B[22m","\x1B[1m\u2880\x1B[22m\x1B[1m\u2860\x1B[22m/\u2814\u2812\u2826\u2824\u28C4\u28C0","\x1B[1m\u280B\x1B[22m \u2808\u2809\u2813\u2812\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804",""],["","","","","","","","\x1B[1m\u28E6\x1B[22m","\x1B[1m\u285F\x1B[22m\x1B[1m\u2880\x1B[22m/\u2814\u2812\u2826\u2824\u28C4\u28C0\u2840","\x1B[1m\u28E7\x1B[22m\x1B[1m\u280E\x1B[22m \u2809\u2819\u2812\u2826\u2824\u28C4\u28C0","\x1B[1m\u280F\x1B[22m \u2809\u2819\u2812\u2812\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804",""],["","","","","","","","\x1B[1m\u28E6\x1B[22m \u2864\u2824\u2824\u28A4\u28C0\u2840","\x1B[1m\u285F\x1B[22m\x1B[1m\u2880\x1B[22m/\u281C \u2809\u2819\u2812\u2826\u2824\u2884\u28C0\u2840","\x1B[1m\u28E7\x1B[22m\x1B[1m\u280E\x1B[22m \u2809\u2809\u2811\u2812\u2826\u2824\u2884\u28C0\u2840","\x1B[1m\u280F\x1B[22m \u2808\u2809\u2811\u2812\u2806",""],["","","","","",""," \u2864\u2824\u2824\u2824\u28C4\u28C0","\x1B[1m\u28F4\x1B[22m\x1B[1m\u28B0\x1B[22m/\u281C \u2808\u2809\u2813\u2826\u28A4\u28C0","\x1B[1m\u28BF\x1B[22m\x1B[1m\u28FC\x1B[22m\x1B[1m\u2847\x1B[22m \u2808\u2811\u2826\u28C4\u2840","\x1B[1m\u28B8\x1B[22m\x1B[1m\u28FF\x1B[22m\x1B[1m\u2803\x1B[22m \u2809\u2813\u2826\u2824\u28C0\u28C0","\x1B[1m\u28B8\x1B[22m\x1B[1m\u28FF\x1B[22m \u2808\u2809\u2809\u2813\u2812\u2806"," \x1B[1m\u281B\x1B[22m"],["","","","",""," \u2864\u2824\u2824\u2824\u28C4\u28C0"," \x1B[1m\u2820\x1B[22m/\u281C \u2808\u2809\u2813\u2826\u28A4\u28C0","\x1B[1m\u28A4\x1B[22m \x1B[1m\u28FF\x1B[22m \u2808\u2819\u2832\u28A4\u2840"," \x1B[1m\u28A3\x1B[22m\x1B[1m\u28BB\x1B[22m\x1B[1m\u2846\x1B[22m \u2808\u2811\u2826\u2884\u2840"," \x1B[1m\u28BB\x1B[22m\x1B[1m\u2847\x1B[22m \u2808\u2811\u2822\u2884\u2840"," \x1B[1m\u2808\x1B[22m\x1B[1m\u281B\x1B[22m \u2808\u2811\u2806",""],["","","",""," \u2864\u2824\u2824\u2824\u28C4\u28C0"," /\u281C \u2808\u2809\u2813\u2826\u28A4\u28C0"," \x1B[1m\u28B8\x1B[22m\x1B[1m\u2840\x1B[22m \u2808\u2819\u2832\u28A4\u2840","\x1B[1m\u2824\x1B[22m\x1B[1m\u28C4\x1B[22m \x1B[1m\u2887\x1B[22m \u2808\u2811\u2826\u2884\u2840"," \x1B[1m\u2808\x1B[22m\x1B[1m\u2813\x1B[22m\x1B[1m\u28BC\x1B[22m\x1B[1m\u2844\x1B[22m \u2808\u2811\u2822\u2884\u2840"," \u2808\u2811\u2806","",""],["","",""," \u28C0\u2860\u2824\u2824\u2824\u2824\u2824\u2824\u28C4\u28C0"," \u28E0\u2814\u281A\u2809 \u2808\u2809\u2813\u2826\u28A4\u28C0"," /\u281C\u2801 \u2808\u2819\u2826\u28C0"," \x1B[1m\u28B8\x1B[22m\x1B[1m\u2840\x1B[22m \u2808\u28A7","\x1B[1m\u2824\x1B[22m\x1B[1m\u28C4\x1B[22m \x1B[1m\u2887\x1B[22m \u2847"," \x1B[1m\u2808\x1B[22m\x1B[1m\u2813\x1B[22m\x1B[1m\u28BC\x1B[22m\x1B[1m\u2844\x1B[22m \u2847"," \u2807","",""],[""," \u2880\u28E0\u2824\u2824\u2824\u2824\u2824\u28C4\u28C0"," \u28E0\u2814\u280A\u2801 \u2808\u2819\u2826\u28C4"," \u2880\u2874\u280B \u2808\u28B3\u2840"," \u28E0\u2814\u280B \u28A7"," /\u281C\u2801 \u284E"," \x1B[1m\u28B8\x1B[22m\x1B[1m\u2840\x1B[22m \u28A0\u2803","\x1B[1m\u2824\x1B[22m\x1B[1m\u28C4\x1B[22m \x1B[1m\u2887\x1B[22m \u281C"," \x1B[1m\u2808\x1B[22m\x1B[1m\u2813\x1B[22m\x1B[1m\u28BC\x1B[22m\x1B[1m\u2844\x1B[22m","","",""],[" \u28C0\u2864\u2824\u28A4\u2840"," \u28C0\u2864\u2814\u280B\u2801 \u28A7"," \u28E0\u2814\u280B\u2801 \u28B8"," \u28E0\u281E\u2801 \u285C"," \u2880\u281C\u2801 \u287C\u2801"," \x1B[1m\u2820\x1B[22m/\u2814\u2801 \u281C\u2801"," \x1B[1m\u28FF\x1B[22m","\x1B[1m\u28A4\x1B[22m\x1B[1m\u2840\x1B[22m \x1B[1m\u28FF\x1B[22m"," \x1B[1m\u2819\x1B[22m\x1B[1m\u28A6\x1B[22m\x1B[1m\u28F9\x1B[22m\x1B[1m\u2847\x1B[22m"," \x1B[1m\u2819\x1B[22m\x1B[1m\u2803\x1B[22m","",""],[" \u28C0\u2864\u2824\u28A4\u2840"," \u28C0\u2864\u2814\u280B\u2801 \u2847"," \u28E0\u28F4\u282F\u2815\u2812\u2812\u2832\u2824\u2824\u2814\u281A\u2801"," \u28A0\u2814\u2812\u2826\u2824\u2814\u28F2\u281F\u2801"," \u281C \u2880\u281C\u2801"," \x1B[1m\u2820\x1B[22m/\u2814\u2801"," \x1B[1m\u28FF\x1B[22m","\x1B[1m\u28A4\x1B[22m\x1B[1m\u2840\x1B[22m \x1B[1m\u28FF\x1B[22m"," \x1B[1m\u2819\x1B[22m\x1B[1m\u28A6\x1B[22m\x1B[1m\u28F9\x1B[22m\x1B[1m\u2847\x1B[22m"," \x1B[1m\u2819\x1B[22m\x1B[1m\u2803\x1B[22m","",""],[" \u28C0\u2864\u2824\u28A4\u2840"," \u28C0\u2864\u2814\u280B\u2801 \u2847"," \u28E0\u28F4\u282F\u2815\u2812\u2812\u2832\u2824\u2824\u2814\u281A\u2801"," \u28A0\u2814\u2812\u2826\u2824\u2814\u28F2\u281F\u2801"," \u281C \u2880\u281C\u2801"," \x1B[1m\u2820\x1B[22m/\u2814\u2801"," \x1B[1m\u28FF\x1B[22m","\x1B[1m\u28A4\x1B[22m\x1B[1m\u2840\x1B[22m \x1B[1m\u28FF\x1B[22m"," \x1B[1m\u2819\x1B[22m\x1B[1m\u28A6\x1B[22m\x1B[1m\u28F9\x1B[22m\x1B[1m\u2847\x1B[22m"," \x1B[1m\u2819\x1B[22m\x1B[1m\u2803\x1B[22m","",""],["","","","","","","","\x1B[1m\u2824\x1B[22m\x1B[1m\u28C4\x1B[22m \u2880\u28E0\u2824\u2814\u2812\u2812\u2812\u2812\u2812\u2812\u2812\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804"," \x1B[1m\u2808\x1B[22m\x1B[1m\u2813\x1B[22m\x1B[1m\u28A4\x1B[22m\x1B[1m\u28C0\x1B[22m\x1B[1m\u28C0\x1B[22m\x1B[1m\u2824\x1B[22m\x1B[1m\u2824\x1B[22m/\u2814\u280A\u2801","","",""],["","","","","",""," \\\\|/","\x1B[1m\u2824\x1B[22m\x1B[1m\u28C4\x1B[22m \u2880\u28E0\u2824\u2814\u2812\u2812\u2812\u2812\u2812\u2812\u2812\u2826\u2824\u2824\u2824\u2824-*-"," \x1B[1m\u2808\x1B[22m\x1B[1m\u2813\x1B[22m\x1B[1m\u28A4\x1B[22m\x1B[1m\u28C0\x1B[22m\x1B[1m\u28C0\x1B[22m\x1B[1m\u2824\x1B[22m\x1B[1m\u2824\x1B[22m/\u2814\u280A\u2801 /|\\\\","","",""],["","","","","","","","\x1B[1m\u28A4\x1B[22m\x1B[1m\u2840\x1B[22m"," \x1B[1m\u2833\x1B[22m\x1B[1m\u2840\x1B[22m \x1B[1m\u28E0\x1B[22m/\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804 ',."," \x1B[1m\u2839\x1B[22m\x1B[1m\u28C4\x1B[22m\x1B[1m\u2864\x1B[22m\x1B[1m\u280B\x1B[22m . ."," \x1B[1m\u2809\x1B[22m",""],["","","","","","","","\x1B[1m\u28F4\x1B[22m","\x1B[1m\u28BB\x1B[22m\x1B[1m\u2846\x1B[22m","\x1B[1m\u28B8\x1B[22m\x1B[1m\u2847\x1B[22m \x1B[1m\u28E0\x1B[22m/\u2814\u2812\u2812\u2826\u2824\u28C4\u28C0"," \x1B[1m\u28FF\x1B[22m\x1B[1m\u28E0\x1B[22m\x1B[1m\u281E\x1B[22m\x1B[1m\u2801\x1B[22m \u2808\u2809\u2813\u2812\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804 . ."," \x1B[1m\u281B\x1B[22m\x1B[1m\u2801\x1B[22m"],["","","","","","","","\x1B[1m\u28E6\x1B[22m","\x1B[1m\u287F\x1B[22m","\x1B[1m\u2847\x1B[22m \x1B[1m\u28E0\x1B[22m/\u28A4\u2840","\x1B[1m\u28E7\x1B[22m\x1B[1m\u281E\x1B[22m\x1B[1m\u2801\x1B[22m \u2809\u2813\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804","\x1B[1m\u2801\x1B[22m"],["","","","","","","","\x1B[1m\u2844\x1B[22m","\x1B[1m\u2803\x1B[22m","\x1B[1m\u2880\x1B[22m\x1B[1m\u2860\x1B[22m/\u28A4","\x1B[1m\u280B\x1B[22m \u2808\u2813\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804",""],["","","","","","","","\x1B[1m\u2844\x1B[22m","\x1B[1m\u2803\x1B[22m","\x1B[1m\u2880\x1B[22m\x1B[1m\u2860\x1B[22m/\u28A4\u2840","\x1B[1m\u280B\x1B[22m \u2811\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804",""],["","","","","","","","\x1B[1m\u2844\x1B[22m","\x1B[1m\u2803\x1B[22m","\x1B[1m\u2880\x1B[22m\x1B[1m\u2860\x1B[22m/\u28A4\u2840","\x1B[1m\u280B\x1B[22m \u2811\u2826\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2824\u2804",""]],Mgn="Go faster",Rgn;function Pgn(t){let e=t.filter(r=>r!==Rgn),n=e[Math.floor(Math.random()*e.length)];return Rgn=n,n}var Rpe=class{constructor(e,n){this.tui=e;this.pal=n}tui;pal;frame=-1;nextSound=0;timer;play(){this.stop(),Nsi(kgn[this.nextSound]),this.nextSound=(this.nextSound+1)%kgn.length,this.frame=0,this.tui.requestRender(),this.timer=setInterval(()=>{if(this.frame++,this.frame<Tgn.length){this.tui.requestRender();return}this.stop()},Osi)}dispose(){this.stop()}render(e){if(this.frame<0)return[];let n=Math.max(0,e);return Tgn[this.frame].map(r=>ot(this.pal.accent(r),n,"",!0))}invalidate(){}stop(){this.timer!==void 0&&clearInterval(this.timer),this.timer=void 0,this.frame=-1,this.tui.requestRender()}};SS();import{execFile as $si}from"node:child_process";import{mkdirSync as Dgn,readFileSync as Fsi,renameSync as Usi,writeFileSync as Bgn}from"node:fs";import{dirname as Lgn,join as DVe}from"node:path";var Qsi="whip-count.json",Wsi=DVe("tmp","whip-achievement.txt"),Ogn=46,Hsi=4,qsi=900,Gsi=[{at:1,title:"Breaking It In",line:"It didn't know what that was. Now it does."},{at:5,title:"Positive Reinforcement",line:"You've read the studies. You disagree with them."},{at:10,title:"Middle Management",line:"HR would love you."},{at:25,title:"Pavlovian",line:"It started working faster before the whip landed."},{at:50,title:"Occupational Hazard",line:"The tokens are fine. They\u2019re fine."},{at:100,title:"Centurion",line:"Rome would be proud. The agent isn't."},{at:250,title:"It Has A Name For You",line:"You never asked what it was called."},{at:500,title:"Standard Operating Procedure",line:"You don't remember when you started."},{at:1e3,title:"The Ledger",line:"One thousand. It kept count too."}];function jsi(t){let e={total:0,unlocked:[]};try{let n=JSON.parse(Fsi(t,"utf8"));if(!n||typeof n!="object"||Array.isArray(n))return e;let{total:r,firstAt:i,lastAt:o,unlocked:s}=n,a={total:typeof r=="number"&&Number.isFinite(r)&&r>0?Math.floor(r):0,unlocked:Array.isArray(s)?s.filter(c=>typeof c=="number"&&Number.isFinite(c)):[]};return typeof i=="number"&&Number.isFinite(i)&&(a.firstAt=i),typeof o=="number"&&Number.isFinite(o)&&(a.lastAt=o),a}catch{return e}}function zsi(t,e){try{Dgn(Lgn(t),{recursive:!0});let n=`${t}.${process.pid}.tmp`;Bgn(n,JSON.stringify(e),"utf8"),Usi(n,t)}catch{}}function Mpe(t){let e=Math.max(0,Math.floor((Ogn-Td(t))/2));return" ".repeat(e)+t}function Vsi(t,e,n){return["",Mpe(n.accent(n.bold("\u2605 ACHIEVEMENT UNLOCKED \u2605"))),"",Mpe(n.bold(t.title)),Mpe(n.muted(t.line)),"",Mpe(n.faint(`${e} whip${e===1?"":"s"}`))]}function Ksi(t,e,n){if(process.env.TMUX===void 0||process.env.TMUX==="")return;let r=Vsi(t,e,n),i=DVe(Qd(),Wsi);try{Dgn(Lgn(i),{recursive:!0}),Bgn(i,`\x1B[?25l${r.join(`\r
1747
- `)}`,"utf8")}catch{return}let o=`cat ${ln(i)}; sleep ${Hsi}`;$si("tmux",["display-popup","-E","-k","-x","R","-y","0","-w",String(Ogn+2),"-h",String(r.length+2),...Hd(),o],()=>{})}function Ngn(t,e=DVe(Qd(),Qsi)){let n=jsi(e),r=Date.now();n.total+=1,n.firstAt??=r,n.lastAt=r;let i=Gsi.find(a=>a.at===n.total&&!n.unlocked.includes(a.at));if(i!==void 0&&n.unlocked.push(i.at),zsi(e,n),i===void 0)return;let o=n.total;setTimeout(()=>Ksi(i,o,t),qsi).unref?.()}async function f5s(t,e,n,r=!0){LT("viewer.connect_start",{node:t});let i=await tgn(t,n,r);LT(i.initialSnapshot===void 0?"viewer.socket_connected":"viewer.offline_snapshot_ready");let{remote:o,canvasSource:s,meta:a,socket:c}=i,u=egn(o,e),l=Ysi();pon({cwd:a.cwd});let d=hon(),p=aon(),h=zx(),f=h.bindings;await uon(p);let m=await don(),g=new aw,A=new QA(g),w=new et,v=new Ede,S=new hde(A,w,{cwd:a.cwd,palette:d,hideThinking:!0,banner:Xrt(Zmn(a)),inlinePageBlocks:!o,pageOpenHint:()=>xR(f),backgroundBashHint:()=>o||!Ps()?null:_z(f),onActivityChange:Ye=>{v.clear(),Ye&&v.addChild(Ye)}}),_=S.transcriptSource(),I=Vdn(_),M=Gdn(_,I.decorate),D=hpn(S,M,_),B,L=dmn({tui:A,pal:d},()=>B.state()),F=cpn(A,d,M,I,{bindings:()=>f,setNotice:Ye=>V(Ye)}),q=hgn(g,A,w,v,d,p,M,F.component),{containers:j,editor:W}=q,he=new Rpe(A,d);j.header.addChild(he),j.header.addChild(L.component);let K={nodeId:t,remote:o,role:u,meta:a,canvasSource:s,socket:c,tui:A,pal:d,editor:W,containers:j},Re=Vfn(K,{syncCursor:()=>Pn.sync(),exitRoster:()=>Mn.exit(),openTicket:Ye=>{Q.open(Ye)},suppressed:()=>Q.active(),setNotice:Ye=>V(Ye),onRefreshFailure:Ye=>At.reportFailure("inbox strip refresh",Ye)});j.header.addChild(Re.component),await Vmn();let Fe=Kc("user"),Xe=process.env.CRTR_ATTACH_INITIAL_WHIP==="1";delete process.env.CRTR_ATTACH_INITIAL_WHIP;let St=Afn(),en=process.env.CRTR_ATTACH_OPEN_TICKET;en!==void 0&&delete process.env.CRTR_ATTACH_OPEN_TICKET;let $e=Dmn(Ye=>process.stdout.write(Ye),Fe.mouse_mode_default),X=Lmn({frame:()=>q.frame.lastRenderedFrame(),width:()=>A.terminal.columns});q.frame.setOverlay(Ye=>X.apply(Ye));let Ue=umn(K,{state:()=>B.state(),bashMode:()=>yt.bashMode(),asks:()=>At.asks(),bindings:()=>f,inboxAffordance:!o&&Ps(),mouseEnabled:()=>$e.enabled()}),Ke=new gpe({tui:A,mouse:$e,rows:()=>A.terminal.rows,statusNotice:Ue.setNotice,formatNotice:Ye=>d.warning(`\u26A0 ${Ye}`),noticeMs:3e3,capabilities:{remote:o,canFocusNode:!o&&process.env.TMUX_PANE!==void 0},selfPane:process.env.TMUX_PANE}),Lt=(()=>{let Ye=a.profile_id;if(Ye)try{return{id:Ye,label:jx(Ye).manifest.name}}catch{return{id:Ye,label:Ye}}})(),$t=zmn({host:Ke,...Lt===void 0?{}:{profile:Lt},...o?{}:{scan:async()=>{let Ye=Pt(),[ar,ki]=await Promise.all([Ye.listHumanInbox(),Ye.getInboxHistory(t,{state:"pending"})]),Tu=new Map;for(let Gs of ar.tickets){let Rd=zm(Gs);Tu.set(Rd.dir,Rd)}for(let Gs of ki.tickets){let Rd=zm(Gs);Rd.kind!=="page"||Rd.state!=="pending"||!Rd.awaitsResponse||Rd.inbox||Tu.has(Rd.dir)||Tu.set(Rd.dir,Rd)}for(let Gs of Re.pendingTickets())Tu.has(Gs.dir)||Tu.set(Gs.dir,Gs);return[...Tu.values()].sort(FE)}}}),un=o?()=>{}:FN(()=>{S.refreshPageBlocks(),Re.refresh()}),Q=smn(K,{syncCursor:()=>Pn.sync(),refreshStrip:()=>{Re.refresh()},setNotice:Ye=>V(Ye),openInbox:Ye=>$t.open(Ye),suspendForChild:()=>Ke.suspendForChild()});j.ticketPanel.addChild(Q.component);let G={toggleInbox:()=>{let Ye=Q.currentDir();if(Ye!==void 0){Q.close(),$t.open(Ye);return}$t.toggle()}},V=(Ye,ar)=>{Ke.hasFullPaneSurface()?Ke.notice(Ye,ar):Ue.setNotice(Ye,ar)},ve=Ue.render,ue=Ye=>{V(D.copy(Ye))},we=lpn(M,()=>A.requestRender()),De={"crtr.attach.scroll.up":()=>{we.cancel(),M.scrollBy(-1)&&A.requestRender()},"crtr.attach.scroll.down":()=>{we.cancel(),M.scrollBy(1)&&A.requestRender()},"crtr.attach.scroll.page-up":()=>{we.page("up")},"crtr.attach.scroll.page-down":()=>{we.page("down")},"crtr.attach.scroll.live":()=>{we.cancel(),M.goLive(),A.requestRender()},"crtr.attach.mouse.toggle":()=>{let Ye=$e.toggle();!Ye&&X.clear()&&A.requestRender(),V(Ye?"Mouse: wheel scrolling on, drag to select and copy":"Mouse: off \u2014 tmux drag-select and copy-mode restored")},"crtr.attach.copy.message":()=>ue("message")},ce,Ae=Dfn(K,()=>ce===void 0?i.initialSnapshot!==void 0:ce.isDormant()),Me=ngn(),Ce=fgn(K,Ae,{setNotice:V,bindings:()=>f,fdPath:m,frecency:Me}),ze=mgn(K,i.nodeIdentity,{isTornDown:()=>ci.isTornDown(),onChanged:()=>{yt.syncContextBadge();let Ye=B.state().engine;Ye!==void 0&&yt.setTitle(Ye.sessionName),A.requestRender()}});o&&ze.refresh();let yt=ugn(K,{nodeIdentity:ze.current,thinkingLevel:()=>B.state().engine?.thinkingLevel,renderFooter:ve,onTextChange:Ce.syncCommandPreview});yt.syncContextBadge();let{renderExtensionWidgets:st,renderQueued:er}=lmn(K,()=>B.state());B=Ign(u,{setEngineState:Ye=>Ot.setState(Ye),setEditorTitle:yt.setTitle,paintEditorFrame:yt.paintFrame,renderExtensionWidgets:()=>{L.render(),st()},renderQueued:er,renderFooter:ve,setTerminalTitle:Ye=>g.setTitle(Ye),refreshChrome:()=>At.refresh()});let $n=Ye=>{if(!Ps()){V("Inspector requires tmux");return}V(`Opening Inspector (${Ye})\u2026`);let ar=AA(),Tu=`${ar===void 0?"":`CRTR_HOME=${ln(ar)} `}crtr surface inspect ${ln(t)} --section ${Ye}`;Jsi("tmux",["display-popup","-E","-T",` inspector \xB7 ${Ye} `,"-w","90%","-h","85%",...Hd(),Tu],()=>{At.refresh()})},Mn=zfn(K,{asks:()=>At.asks(),setNotice:V,requestChromeRefresh:()=>At.refresh(),openInspector:$n,openObject:Ye=>{if(!Ps()){V("Object details require tmux");return}V("Opening object\u2026");let ar=AA(),ki=ar===void 0?"":`CRTR_HOME=${ln(ar)} `;Zz({name:Ye,produce:Tu=>`${ki}crtr canvas read ${ln(Ye)} > ${Tu} 2>&1`,title:`object \xB7 ${Ye}`,noNvim:"nvim is required to view the object. Install Neovim and retry.",onClose:()=>At.refresh()})},syncCursor:()=>Pn.sync()}),Pn=amn(W,[Mn.active,Re.active,Q.active]),Vr=new ppe(A,t,()=>At.asks(),d,f,s,u,Ye=>At.reportFailure("canvas graph refresh",Ye),V),xa=new hpe(A,d);xa.setBindings(f);let At=pmn(K,{isTornDown:()=>ci.isTornDown(),setNotice:V,refreshRoster:async()=>{await Mn.refresh(),await Re.refresh()},refreshGraph:()=>Vr.refresh(),refreshIdentity:()=>ze.refresh(),renderFooter:ve,renderExtensionWidgets:st,refreshInFlightTools:()=>S.refreshInFlightTools(),pollGit:yt.pollGit}),Ot=Bfn(K,p,Ae,{setNotice:V,agentDir:()=>B.state().agentDir,openNodeMetadata:()=>$n("overview"),isDormant:()=>ce.isDormant(),copyTarget:ue,toggleToolsExpanded:()=>S.toggleToolsExpanded(),toggleFoldTools:()=>S.toggleFoldSettledTools(),toggleShowWorking:()=>S.toggleShowWorking(),toggleThinking:()=>S.toggleThinking(),toggleGraph:()=>Vr.toggle(),toggleInbox:G.toggleInbox,toggleHelp:()=>xa.toggle(),toggleMouse:()=>$e.toggle(),quit:()=>Ms("detach"),setChipColor:yt.setChipColor,onPromptSent:()=>{Fe.whip_mode&&he.play()},frecency:Me}),ne=()=>{if(Ke.hasFullPaneSurface()){V("Close the active surface before whipping the agent");return}let Ye=Fe.whip_message_mode==="go-faster"?Mgn:Pgn(Fe.whip_messages);Ot.sendInterrupting(Ye)&&(he.play(),Ngn(d),V(`Whipped agent \u2014 ${Ye}`))},se=Umn({selfNodeId:t,remote:o,canvasSource:s,port:Fe.document_port,fetchSecret:async()=>(await Pt().documents.browserAccess()).secret,onSecretError:Ye=>V(`Document links are unavailable: ${Ye instanceof Error?Ye.message:String(Ye)}`),refresh:()=>S.refreshMarkdown()}),be=()=>{if(Q.active()){V("Close the open request first (Esc)");return}let Ye=[...S.getTranscriptDocRefsNewestFirst().map(ki=>`[[${ki}]]`),...S.getTranscriptFilePathsNewestFirst()],ar=ki=>{Efn(Ke,ki,{originNodeId:t,onNotice:V})};if(Ke.hasFullPaneSurface()){Ke.pickReviewFile({candidates:Ye,cwd:a.cwd,title:"Review a file or document named in this transcript"}).then(ki=>{ki!==null&&ar(ki)});return}Ot.openFileReviewPicker(Ye,a.cwd,ar)},Qe=()=>{if(o){V("Profile file search is unavailable on remote canvases");return}if(!Ps()){V("Profile file search requires tmux");return}s.listNodes().then(Ye=>{let ar=bgn(Ye,t);vgn({cwd:a.cwd,nodeDirs:ar.map(ki=>ki.cwd),nodes:ar,profileId:a.profile_id??null,fdPath:m,onNotice:V})}).catch(Ye=>{let ar=Ye instanceof Error?Ye.message:String(Ye);V(`Could not load related node directories: ${ar}`)})},Te,Ze=()=>{Te!==void 0&&clearTimeout(Te),Te=setTimeout(()=>{Te=void 0,f6e(()=>h,()=>{},Ps,Xz)},1e3),Te.unref()},bt=Tmn(K,{foldState:B.fold,chat:S,setNotice:V,renderFooter:ve,setEditorText:Ye=>{W.setText(Ye),A.requestRender()},attachDialog:Ye=>Ot.attachDialog(Ye),dismissDialog:Ye=>Ot.dismissDialog(Ye),refreshNodeIdentity:ze.refresh,setCommands:Ce.setCommands,resetMemoryRefs:Ce.resetMemoryRefs,reloadBindings:()=>{h=f6e(zx,Ye=>{Vr.setBindings(Ye),xa.setBindings(Ye)},Ps,Xz),f=h.bindings},modelThinkingLabel:B.modelThinkingLabel,onWelcome:()=>Ze()}),Qt=Ye=>{let ar=Ye instanceof Error?`${Ye.name}: ${Ye.message}`:String(Ye);zE("attach.unhandled_rejection",ar),dVe(Ye)&&At.reportFailure("background daemon call",Ye)};process.on("unhandledRejection",Qt);let Dr=()=>{process.off("unhandledRejection",Qt)},Gr=ygn(o,t),ci=mmn(K,{stopLocal:()=>{Te!==void 0&&clearTimeout(Te),Ke.closeAll(),we.cancel(),$e.disable(),At.stop(),Q.close(),Ue.dispose(),Vr.close(),xa.close(),F.close(),he.dispose(),Gr.clear(),Bpe(),Dpe(),Ppe(),Dr(),se.dispose(),un();try{S.dispose()}catch{}},lastSocketError:()=>ce.lastSocketError(),tagPane:Gr.pane}),Ms=ci.teardown;ce=Emn(K,{role:u,initialDormant:i.initialSnapshot!==void 0,clientId:l,onFrame:bt,setNotice:V,isTornDown:()=>ci.isTornDown(),teardown:Ms,onEnterDormancy:()=>{Ze(),S.settleRun(),B.patchLocal({isStreaming:!1})}}),i.assertConnected(),Gr.set(),ce.install(),q.mount(),A.start(),i.initialSnapshot!==void 0&&(B.fold({type:"welcome",snapshot:i.initialSnapshot,role:u}),S.applySnapshot(i.initialSnapshot),Ce.setCommands(i.initialCommands),o||Pt().markNodeRead(t).catch(()=>{})),Fe.whip_mode&&Xe&&he.play(),$e.reassert();let yc=!1,Mx=Ye=>{if(yc)return;if(o){V("Opening a file is unavailable in a remote attach");return}let ar=sg();if(ar===null)return;let ki=Fmn({file:Ye,pane:ar.pane,cwd:a.cwd,nodeId:t,observer:e,beforeRespawn:Gr.clear});if(ki==="opened"){yc=!0;return}ki==="failed"&&Gr.set(),ki==="missing"&&V("File no longer exists"),ki==="no_nvim"&&V("Neovim is required to open files \u2014 install it (brew install neovim / apt install neovim) and retry"),ki==="failed"&&V("Could not open file in Neovim")};$e.install(A,{onWheel:(Ye,ar)=>{X.clear()&&A.requestRender(),!Ke.handleWheel(Ye,ar)&&(we.cancel(),M.scrollBy(Ye==="up"?-ar:ar)&&A.requestRender())},onPrimaryPress:(Ye,ar)=>{Ke.hasFullPaneSurface()||(X.clear()&&A.requestRender(),X.begin(Ye,ar))},onPrimaryDrag:(Ye,ar)=>{Ke.hasFullPaneSurface()||X.extend(Ye,ar)&&A.requestRender()},onPrimaryRelease:()=>{let Ye=X.release();Ye?.kind==="selection"&&(V(Ye.notice),A.requestRender())}});let Ppe=A.addInputListener(Ye=>{let ar=$mn(Ye);if(ar===void 0)return;let ki=ar.file;return ki===void 0?V("Could not open file link"):Mx(ki),ar.remaining.length>0?{data:ar.remaining}:{consume:!0}}),Dpe=A.addInputListener(()=>{X.clear()&&A.requestRender()}),Bpe=Rmn(K,{bindings:()=>f,detachHint:()=>opn(f),hasExclusiveSurface:()=>Ke.hasFullPaneSurface(),setPaneFocused:Ye=>{Ye&&Gr.stamp(),Pn.setPaneFocused(Ye),A.requestRender()},viewportActions:()=>De,searchHandleKey:F.handleKey,panelHandleKey:Q.handleKey,stripHandleKey:Re.handleKey,rosterHandleKey:Mn.handleKey,setNotice:V,detach:()=>Ms("detach"),cancelTurn:()=>{Ot.abortTurn()?V("Canceling the agent\u2026"):V(`Nothing running to cancel \u2014 press ${spn(f)??"ctrl+d"} to detach`)},toggleGraph:()=>Vr.toggle(),toggleHelp:()=>xa.toggle(),toggleInbox:G.toggleInbox,toggleInboxStrip:()=>{if(Ke.hasFullPaneSurface()){V("Close the active surface before opening the request strip");return}Q.active()&&Q.close(),Re.toggle()},cycleModelLadder:Ye=>Ot.cycleLadder(Ye),inspectLoadedCommand:Ce.inspectLoadedCommand,openFileReview:be,openProfileFiles:Qe,openSearch:()=>{if(Ke.hasFullPaneSurface()||Q.active()){V("Close the active surface before searching the transcript");return}F.open()},whip:ne});ci.installSignalHandlers(),ve(),At.refresh(),er(),yt.pollGit(),LT("viewer.first_paint"),process.stdout.write(hmn),lon(g.kittyProtocolActive),i.initialSnapshot!==void 0&&Ze(),i.initialSnapshot===void 0?(LT("viewer.hello_sent"),ce.sendHello()):ce.startDormant(),At.start(),St!==void 0&&xfn(Ke,St),en!==void 0&&en!==""&&!o&&(async()=>{let Ye=Pt(),[ar,ki]=await Promise.all([Ye.listHumanInbox(),Ye.getInboxHistory(void 0,{state:"pending"})]),Tu=[...ar.tickets,...ki.tickets].map(zm).find(Gs=>Gs.inboxTicketId===en&&(Gs.kind!=="page"||Gs.state==="pending"));Tu===void 0?V("ask already answered"):Q.open(Tu)})().catch(Ye=>V(`could not open the ask: ${String(Ye?.message??Ye)}`)),await ci.done}export{f5s as runAttach};
1747
+ `)}`,"utf8")}catch{return}let o=`cat ${ln(i)}; sleep ${Hsi}`;$si("tmux",["display-popup","-E","-k","-x","R","-y","0","-w",String(Ogn+2),"-h",String(r.length+2),...Hd(),o],()=>{})}function Ngn(t,e=DVe(Qd(),Qsi)){let n=jsi(e),r=Date.now();n.total+=1,n.firstAt??=r,n.lastAt=r;let i=Gsi.find(a=>a.at===n.total&&!n.unlocked.includes(a.at));if(i!==void 0&&n.unlocked.push(i.at),zsi(e,n),i===void 0)return;let o=n.total;setTimeout(()=>Ksi(i,o,t),qsi).unref?.()}async function f5s(t,e,n,r=!0){await Vmn(),LT("viewer.connect_start",{node:t});let i=await tgn(t,n,r);LT(i.initialSnapshot===void 0?"viewer.socket_connected":"viewer.offline_snapshot_ready");let{remote:o,canvasSource:s,meta:a,socket:c}=i,u=egn(o,e),l=Ysi();pon({cwd:a.cwd});let d=hon(),p=aon(),h=zx(),f=h.bindings;await uon(p);let m=await don(),g=new aw,A=new QA(g),w=new et,v=new Ede,S=new hde(A,w,{cwd:a.cwd,palette:d,hideThinking:!0,banner:Xrt(Zmn(a)),inlinePageBlocks:!o,pageOpenHint:()=>xR(f),backgroundBashHint:()=>o||!Ps()?null:_z(f),onActivityChange:Ye=>{v.clear(),Ye&&v.addChild(Ye)}}),_=S.transcriptSource(),I=Vdn(_),M=Gdn(_,I.decorate),D=hpn(S,M,_),B,L=dmn({tui:A,pal:d},()=>B.state()),F=cpn(A,d,M,I,{bindings:()=>f,setNotice:Ye=>V(Ye)}),q=hgn(g,A,w,v,d,p,M,F.component),{containers:j,editor:W}=q,he=new Rpe(A,d);j.header.addChild(he),j.header.addChild(L.component);let K={nodeId:t,remote:o,role:u,meta:a,canvasSource:s,socket:c,tui:A,pal:d,editor:W,containers:j},Re=Vfn(K,{syncCursor:()=>Pn.sync(),exitRoster:()=>Mn.exit(),openTicket:Ye=>{Q.open(Ye)},suppressed:()=>Q.active(),setNotice:Ye=>V(Ye),onRefreshFailure:Ye=>At.reportFailure("inbox strip refresh",Ye)});j.header.addChild(Re.component);let Fe=Kc("user"),Xe=process.env.CRTR_ATTACH_INITIAL_WHIP==="1";delete process.env.CRTR_ATTACH_INITIAL_WHIP;let St=Afn(),en=process.env.CRTR_ATTACH_OPEN_TICKET;en!==void 0&&delete process.env.CRTR_ATTACH_OPEN_TICKET;let $e=Dmn(Ye=>process.stdout.write(Ye),Fe.mouse_mode_default),X=Lmn({frame:()=>q.frame.lastRenderedFrame(),width:()=>A.terminal.columns});q.frame.setOverlay(Ye=>X.apply(Ye));let Ue=umn(K,{state:()=>B.state(),bashMode:()=>yt.bashMode(),asks:()=>At.asks(),bindings:()=>f,inboxAffordance:!o&&Ps(),mouseEnabled:()=>$e.enabled()}),Ke=new gpe({tui:A,mouse:$e,rows:()=>A.terminal.rows,statusNotice:Ue.setNotice,formatNotice:Ye=>d.warning(`\u26A0 ${Ye}`),noticeMs:3e3,capabilities:{remote:o,canFocusNode:!o&&process.env.TMUX_PANE!==void 0},selfPane:process.env.TMUX_PANE}),Lt=(()=>{let Ye=a.profile_id;if(Ye)try{return{id:Ye,label:jx(Ye).manifest.name}}catch{return{id:Ye,label:Ye}}})(),$t=zmn({host:Ke,...Lt===void 0?{}:{profile:Lt},...o?{}:{scan:async()=>{let Ye=Pt(),[ar,ki]=await Promise.all([Ye.listHumanInbox(),Ye.getInboxHistory(t,{state:"pending"})]),Tu=new Map;for(let Gs of ar.tickets){let Rd=zm(Gs);Tu.set(Rd.dir,Rd)}for(let Gs of ki.tickets){let Rd=zm(Gs);Rd.kind!=="page"||Rd.state!=="pending"||!Rd.awaitsResponse||Rd.inbox||Tu.has(Rd.dir)||Tu.set(Rd.dir,Rd)}for(let Gs of Re.pendingTickets())Tu.has(Gs.dir)||Tu.set(Gs.dir,Gs);return[...Tu.values()].sort(FE)}}}),un=o?()=>{}:FN(()=>{S.refreshPageBlocks(),Re.refresh()}),Q=smn(K,{syncCursor:()=>Pn.sync(),refreshStrip:()=>{Re.refresh()},setNotice:Ye=>V(Ye),openInbox:Ye=>$t.open(Ye),suspendForChild:()=>Ke.suspendForChild()});j.ticketPanel.addChild(Q.component);let G={toggleInbox:()=>{let Ye=Q.currentDir();if(Ye!==void 0){Q.close(),$t.open(Ye);return}$t.toggle()}},V=(Ye,ar)=>{Ke.hasFullPaneSurface()?Ke.notice(Ye,ar):Ue.setNotice(Ye,ar)},ve=Ue.render,ue=Ye=>{V(D.copy(Ye))},we=lpn(M,()=>A.requestRender()),De={"crtr.attach.scroll.up":()=>{we.cancel(),M.scrollBy(-1)&&A.requestRender()},"crtr.attach.scroll.down":()=>{we.cancel(),M.scrollBy(1)&&A.requestRender()},"crtr.attach.scroll.page-up":()=>{we.page("up")},"crtr.attach.scroll.page-down":()=>{we.page("down")},"crtr.attach.scroll.live":()=>{we.cancel(),M.goLive(),A.requestRender()},"crtr.attach.mouse.toggle":()=>{let Ye=$e.toggle();!Ye&&X.clear()&&A.requestRender(),V(Ye?"Mouse: wheel scrolling on, drag to select and copy":"Mouse: off \u2014 tmux drag-select and copy-mode restored")},"crtr.attach.copy.message":()=>ue("message")},ce,Ae=Dfn(K,()=>ce===void 0?i.initialSnapshot!==void 0:ce.isDormant()),Me=ngn(),Ce=fgn(K,Ae,{setNotice:V,bindings:()=>f,fdPath:m,frecency:Me}),ze=mgn(K,i.nodeIdentity,{isTornDown:()=>ci.isTornDown(),onChanged:()=>{yt.syncContextBadge();let Ye=B.state().engine;Ye!==void 0&&yt.setTitle(Ye.sessionName),A.requestRender()}});o&&ze.refresh();let yt=ugn(K,{nodeIdentity:ze.current,thinkingLevel:()=>B.state().engine?.thinkingLevel,renderFooter:ve,onTextChange:Ce.syncCommandPreview});yt.syncContextBadge();let{renderExtensionWidgets:st,renderQueued:er}=lmn(K,()=>B.state());B=Ign(u,{setEngineState:Ye=>Ot.setState(Ye),setEditorTitle:yt.setTitle,paintEditorFrame:yt.paintFrame,renderExtensionWidgets:()=>{L.render(),st()},renderQueued:er,renderFooter:ve,setTerminalTitle:Ye=>g.setTitle(Ye),refreshChrome:()=>At.refresh()});let $n=Ye=>{if(!Ps()){V("Inspector requires tmux");return}V(`Opening Inspector (${Ye})\u2026`);let ar=AA(),Tu=`${ar===void 0?"":`CRTR_HOME=${ln(ar)} `}crtr surface inspect ${ln(t)} --section ${Ye}`;Jsi("tmux",["display-popup","-E","-T",` inspector \xB7 ${Ye} `,"-w","90%","-h","85%",...Hd(),Tu],()=>{At.refresh()})},Mn=zfn(K,{asks:()=>At.asks(),setNotice:V,requestChromeRefresh:()=>At.refresh(),openInspector:$n,openObject:Ye=>{if(!Ps()){V("Object details require tmux");return}V("Opening object\u2026");let ar=AA(),ki=ar===void 0?"":`CRTR_HOME=${ln(ar)} `;Zz({name:Ye,produce:Tu=>`${ki}crtr canvas read ${ln(Ye)} > ${Tu} 2>&1`,title:`object \xB7 ${Ye}`,noNvim:"nvim is required to view the object. Install Neovim and retry.",onClose:()=>At.refresh()})},syncCursor:()=>Pn.sync()}),Pn=amn(W,[Mn.active,Re.active,Q.active]),Vr=new ppe(A,t,()=>At.asks(),d,f,s,u,Ye=>At.reportFailure("canvas graph refresh",Ye),V),xa=new hpe(A,d);xa.setBindings(f);let At=pmn(K,{isTornDown:()=>ci.isTornDown(),setNotice:V,refreshRoster:async()=>{await Mn.refresh(),await Re.refresh()},refreshGraph:()=>Vr.refresh(),refreshIdentity:()=>ze.refresh(),renderFooter:ve,renderExtensionWidgets:st,refreshInFlightTools:()=>S.refreshInFlightTools(),pollGit:yt.pollGit}),Ot=Bfn(K,p,Ae,{setNotice:V,agentDir:()=>B.state().agentDir,openNodeMetadata:()=>$n("overview"),isDormant:()=>ce.isDormant(),copyTarget:ue,toggleToolsExpanded:()=>S.toggleToolsExpanded(),toggleFoldTools:()=>S.toggleFoldSettledTools(),toggleShowWorking:()=>S.toggleShowWorking(),toggleThinking:()=>S.toggleThinking(),toggleGraph:()=>Vr.toggle(),toggleInbox:G.toggleInbox,toggleHelp:()=>xa.toggle(),toggleMouse:()=>$e.toggle(),quit:()=>Ms("detach"),setChipColor:yt.setChipColor,onPromptSent:()=>{Fe.whip_mode&&he.play()},frecency:Me}),ne=()=>{if(Ke.hasFullPaneSurface()){V("Close the active surface before whipping the agent");return}let Ye=Fe.whip_message_mode==="go-faster"?Mgn:Pgn(Fe.whip_messages);Ot.sendInterrupting(Ye)&&(he.play(),Ngn(d),V(`Whipped agent \u2014 ${Ye}`))},se=Umn({selfNodeId:t,remote:o,canvasSource:s,port:Fe.document_port,fetchSecret:async()=>(await Pt().documents.browserAccess()).secret,onSecretError:Ye=>V(`Document links are unavailable: ${Ye instanceof Error?Ye.message:String(Ye)}`),refresh:()=>S.refreshMarkdown()}),be=()=>{if(Q.active()){V("Close the open request first (Esc)");return}let Ye=[...S.getTranscriptDocRefsNewestFirst().map(ki=>`[[${ki}]]`),...S.getTranscriptFilePathsNewestFirst()],ar=ki=>{Efn(Ke,ki,{originNodeId:t,onNotice:V})};if(Ke.hasFullPaneSurface()){Ke.pickReviewFile({candidates:Ye,cwd:a.cwd,title:"Review a file or document named in this transcript"}).then(ki=>{ki!==null&&ar(ki)});return}Ot.openFileReviewPicker(Ye,a.cwd,ar)},Qe=()=>{if(o){V("Profile file search is unavailable on remote canvases");return}if(!Ps()){V("Profile file search requires tmux");return}s.listNodes().then(Ye=>{let ar=bgn(Ye,t);vgn({cwd:a.cwd,nodeDirs:ar.map(ki=>ki.cwd),nodes:ar,profileId:a.profile_id??null,fdPath:m,onNotice:V})}).catch(Ye=>{let ar=Ye instanceof Error?Ye.message:String(Ye);V(`Could not load related node directories: ${ar}`)})},Te,Ze=()=>{Te!==void 0&&clearTimeout(Te),Te=setTimeout(()=>{Te=void 0,f6e(()=>h,()=>{},Ps,Xz)},1e3),Te.unref()},bt=Tmn(K,{foldState:B.fold,chat:S,setNotice:V,renderFooter:ve,setEditorText:Ye=>{W.setText(Ye),A.requestRender()},attachDialog:Ye=>Ot.attachDialog(Ye),dismissDialog:Ye=>Ot.dismissDialog(Ye),refreshNodeIdentity:ze.refresh,setCommands:Ce.setCommands,resetMemoryRefs:Ce.resetMemoryRefs,reloadBindings:()=>{h=f6e(zx,Ye=>{Vr.setBindings(Ye),xa.setBindings(Ye)},Ps,Xz),f=h.bindings},modelThinkingLabel:B.modelThinkingLabel,onWelcome:()=>Ze()}),Qt=Ye=>{let ar=Ye instanceof Error?`${Ye.name}: ${Ye.message}`:String(Ye);zE("attach.unhandled_rejection",ar),dVe(Ye)&&At.reportFailure("background daemon call",Ye)};process.on("unhandledRejection",Qt);let Dr=()=>{process.off("unhandledRejection",Qt)},Gr=ygn(o,t),ci=mmn(K,{stopLocal:()=>{Te!==void 0&&clearTimeout(Te),Ke.closeAll(),we.cancel(),$e.disable(),At.stop(),Q.close(),Ue.dispose(),Vr.close(),xa.close(),F.close(),he.dispose(),Gr.clear(),Bpe(),Dpe(),Ppe(),Dr(),se.dispose(),un();try{S.dispose()}catch{}},lastSocketError:()=>ce.lastSocketError(),tagPane:Gr.pane}),Ms=ci.teardown;ce=Emn(K,{role:u,initialDormant:i.initialSnapshot!==void 0,clientId:l,onFrame:bt,setNotice:V,isTornDown:()=>ci.isTornDown(),teardown:Ms,onEnterDormancy:()=>{Ze(),S.settleRun(),B.patchLocal({isStreaming:!1})}}),i.assertConnected(),Gr.set(),ce.install(),q.mount(),A.start(),i.initialSnapshot!==void 0&&(B.fold({type:"welcome",snapshot:i.initialSnapshot,role:u}),S.applySnapshot(i.initialSnapshot),Ce.setCommands(i.initialCommands),o||Pt().markNodeRead(t).catch(()=>{})),Fe.whip_mode&&Xe&&he.play(),$e.reassert();let yc=!1,Mx=Ye=>{if(yc)return;if(o){V("Opening a file is unavailable in a remote attach");return}let ar=sg();if(ar===null)return;let ki=Fmn({file:Ye,pane:ar.pane,cwd:a.cwd,nodeId:t,observer:e,beforeRespawn:Gr.clear});if(ki==="opened"){yc=!0;return}ki==="failed"&&Gr.set(),ki==="missing"&&V("File no longer exists"),ki==="no_nvim"&&V("Neovim is required to open files \u2014 install it (brew install neovim / apt install neovim) and retry"),ki==="failed"&&V("Could not open file in Neovim")};$e.install(A,{onWheel:(Ye,ar)=>{X.clear()&&A.requestRender(),!Ke.handleWheel(Ye,ar)&&(we.cancel(),M.scrollBy(Ye==="up"?-ar:ar)&&A.requestRender())},onPrimaryPress:(Ye,ar)=>{Ke.hasFullPaneSurface()||(X.clear()&&A.requestRender(),X.begin(Ye,ar))},onPrimaryDrag:(Ye,ar)=>{Ke.hasFullPaneSurface()||X.extend(Ye,ar)&&A.requestRender()},onPrimaryRelease:()=>{let Ye=X.release();Ye?.kind==="selection"&&(V(Ye.notice),A.requestRender())}});let Ppe=A.addInputListener(Ye=>{let ar=$mn(Ye);if(ar===void 0)return;let ki=ar.file;return ki===void 0?V("Could not open file link"):Mx(ki),ar.remaining.length>0?{data:ar.remaining}:{consume:!0}}),Dpe=A.addInputListener(()=>{X.clear()&&A.requestRender()}),Bpe=Rmn(K,{bindings:()=>f,detachHint:()=>opn(f),hasExclusiveSurface:()=>Ke.hasFullPaneSurface(),setPaneFocused:Ye=>{Ye&&Gr.stamp(),Pn.setPaneFocused(Ye),A.requestRender()},viewportActions:()=>De,searchHandleKey:F.handleKey,panelHandleKey:Q.handleKey,stripHandleKey:Re.handleKey,rosterHandleKey:Mn.handleKey,setNotice:V,detach:()=>Ms("detach"),cancelTurn:()=>{Ot.abortTurn()?V("Canceling the agent\u2026"):V(`Nothing running to cancel \u2014 press ${spn(f)??"ctrl+d"} to detach`)},toggleGraph:()=>Vr.toggle(),toggleHelp:()=>xa.toggle(),toggleInbox:G.toggleInbox,toggleInboxStrip:()=>{if(Ke.hasFullPaneSurface()){V("Close the active surface before opening the request strip");return}Q.active()&&Q.close(),Re.toggle()},cycleModelLadder:Ye=>Ot.cycleLadder(Ye),inspectLoadedCommand:Ce.inspectLoadedCommand,openFileReview:be,openProfileFiles:Qe,openSearch:()=>{if(Ke.hasFullPaneSurface()||Q.active()){V("Close the active surface before searching the transcript");return}F.open()},whip:ne});ci.installSignalHandlers(),ve(),At.refresh(),er(),yt.pollGit(),LT("viewer.first_paint"),process.stdout.write(hmn),lon(g.kittyProtocolActive),i.initialSnapshot!==void 0&&Ze(),i.initialSnapshot===void 0?(LT("viewer.hello_sent"),ce.sendHello()):ce.startDormant(),At.start(),St!==void 0&&xfn(Ke,St),en!==void 0&&en!==""&&!o&&(async()=>{let Ye=Pt(),[ar,ki]=await Promise.all([Ye.listHumanInbox(),Ye.getInboxHistory(void 0,{state:"pending"})]),Tu=[...ar.tickets,...ki.tickets].map(zm).find(Gs=>Gs.inboxTicketId===en&&(Gs.kind!=="page"||Gs.state==="pending"));Tu===void 0?V("ask already answered"):Q.open(Tu)})().catch(Ye=>V(`could not open the ask: ${String(Ye?.message??Ye)}`)),await ci.done}export{f5s as runAttach};
1748
1748
  /*! Bundled license information:
1749
1749
 
1750
1750
  undici/lib/web/fetch/body.js:
@@ -7,4 +7,4 @@ ${t.filter(s=>!n.split(`
7
7
  `).map(l=>l.trim()).includes(s)).join(`
8
8
  `)}
9
9
  `)}catch{}}o(le,"seedExclude");async function Ce(e){await _(e.repo_root,async()=>{const a=await i(["rev-parse","--verify",`refs/heads/${e.branch}`],e.repo_root);if(a.status!==0||a.stdout.trim()!==e.base_sha)return;const r=await i(["worktree","list","--porcelain"],e.repo_root);if(r.status===0){if(r.stdout.split(`
10
- `).some(n=>n.trim()===`branch refs/heads/${e.branch}`)){if((await i(["worktree","remove","--force",e.path],e.repo_root)).status!==0)return}else if(p(e.path))try{N(e.path,{recursive:!0,force:!0})}catch{return}await i(["update-ref","-d",`refs/heads/${e.branch}`,e.base_sha],e.repo_root)}})}o(Ce,"rollbackManagedWorktreeAsync");async function Le(e,a,r="main"){const n=await h(e,["rev-parse","--show-toplevel"],"not_git_repo","Pass --cwd <real repo> pointing inside a git repository.");if(ae(n))throw new c("managed_worktree_base",`cwd ${n} is a managed worktree and cannot be used as a managed worktree base`,"Pass `--cwd` pointing at the repository\u2019s primary checkout and keep `--worktree` set to the desired existing local base branch, including the parent branch.");const t=await L(n);return W(M(t),async()=>{const s=await $(n,r),l=oe(a),u=`crtr/${a}`;if(p(l))throw new c("worktree_path_exists",`managed worktree path already exists: ${l}`,"Remove the stale path or choose a fresh node id.");if((await i(["show-ref","--verify","--quiet",`refs/heads/${u}`],n)).status===0)throw new c("worktree_branch_exists",`managed worktree branch already exists: ${u}`,"Remove the stale branch or choose a fresh node id.");const b={state:"open",path:l,branch:u,repo_root:n,base_ref:r,base_sha:s,created:new Date().toISOString()};await h(n,["branch",u,s],"worktree_branch_create_failed","Inspect the git error, fix the repository/worktree state, then retry spawning with --worktree.");const f=await i(["worktree","add",l,u],n);if(f.status!==0)throw await i(["update-ref","-d",`refs/heads/${u}`,s],n),new c("worktree_add_failed","git worktree add failed","Inspect the git error, fix the repository/worktree state, then retry spawning with --worktree.",v(f));return le(n,t),b},{timeoutMs:C(),timeoutError:o(()=>new c("worktree_lock_timeout",`timed out waiting to create a managed worktree in ${t}`,"Wait for the other managed-worktree operation to finish, then retry."),"timeoutError")})}o(Le,"createManagedWorktreeAsync");async function P(e){if(e.state!=="open"||!p(e.path))return null;const a=await i(["rev-parse","--abbrev-ref","HEAD"],e.path),r=await i(["status","--porcelain"],e.path),n=await i(["rev-parse","HEAD"],e.path);if(a.status!==0||a.stdout.trim()!==e.branch||r.status!==0||r.stdout.trim()!==""||n.status!==0)return null;const t=await i(["rev-parse","--git-path","rebase-merge"],e.path);return t.status!==0||p(t.stdout.trim())?null:n.stdout.trim()}o(P,"cleanTip");async function F(e,a){try{const r=await $(e.path,e.base_ref);return(await i(["merge-base","--is-ancestor",a,r],e.path)).status===0}catch(r){if(r instanceof c&&r.code==="missing_base_branch"&&a===e.base_sha)return!0;throw r}}o(F,"containedInLocalBase");function de(e){return{node_id:"",branch:e.branch,worktree_path:e.path,worktree_removed:!1,worktree_remove_error:`cleanup pending: the caller checkout at ${e.path} remains intact.`,branch_deleted:!1,branch_delete_error:`cleanup pending: local branch ${e.branch} remains checked out at ${e.path}.`}}o(de,"deferred");async function R(e){if(e.state!=="open"||p(e.path))return null;const a=`refs/heads/${e.branch}`,r=await i(["show-ref","--verify","--quiet",a],e.repo_root);if(r.status===1&&r.executionFailed!==!0)return{branchSha:null};if(r.status!==0)return null;const n=await i(["rev-parse","--verify",a],e.repo_root);if(n.status!==0)return null;const t=n.stdout.trim(),s=await i(["worktree","list","--porcelain"],e.repo_root);if(s.status!==0||re(s.stdout,e.branch)!==null)return null;const l=await ie(e.repo_root,e,t);return l===null?null:{branchSha:t,containment:l}}o(R,"proveAbsentPathManagedWorktree");async function pe(e,a,r){return p(a.path)?null:r.branchSha===null?(await k(e,a,"complete"),{node_id:e,branch:a.branch,worktree_path:a.path,worktree_removed:!0,branch_deleted:!0}):r.containment===void 0?null:(await k(e,a,"complete"),{node_id:e,branch:a.branch,worktree_path:a.path,worktree_removed:!0,branch_deleted:!1,branch_delete_error:`local branch ${a.branch} is delivered but retained because its checkout status can change outside crtr's repository lock.`})}o(pe,"autoDropAbsentPathManagedWorktreeLocked");async function fe(e){const a=(await m(e))?.managed_worktree;return a==null||a.state!=="open"||p(a.path)||await R(a)===null?null:_(a.repo_root,async()=>{const r=(await m(e))?.managed_worktree;if(r==null||r.state!=="open")return null;const n=await R(r);if(n===null)return null;const t=await pe(e,r,n);return t===null?null:{dropped:t,landedSha:n.branchSha??r.base_sha}})}o(fe,"concludeAbsentManagedWorktreeAsync");async function Pe(e){const a=(await m(e))?.managed_worktree;if(a==null||a.state!=="open")return null;if(!p(a.path))return(await fe(e))?.dropped??null;const r=await P(a);return r===null||!await F(a,r)?null:_(a.path,async()=>{const n=(await m(e))?.managed_worktree;if(n==null||n.state!=="open")return null;const t=await P(n);return t===null||t!==r||!await F(n,t)?null:(await k(e,n,"pending"),{...de(n),node_id:e})})}o(Pe,"autoDropCleanManagedWorktreeAsync");async function T(e){for(const a of["rebase-merge","rebase-apply"]){const r=await i(["rev-parse","--git-path",a],e);if(r.status!==0||p(r.stdout.trim()))return!0}return!1}o(T,"rebaseInProgress");async function y(e,a,r,n,t,s=a.branch){await U(e,{cwd:a.repo_root,abandoned:{branch:s,tip_sha:r,at:n,by:t}})}o(y,"persistAbandoned");async function Fe(e,a){const r=(await m(e))?.managed_worktree;if(r==null||r.state!=="open")throw new c("no_managed_worktree",`node ${e} has no open managed worktree`,"Nothing to abandon for this node.");const n=[];try{return await _(r.path,()=>we(e,a,n))}finally{await ce(r.path,n[0])}}o(Fe,"abandonManagedWorktreeAsync");async function g(e,a){const{result:r,trash:n}=await he(e.repo_root,e.path);if(n!==void 0&&a.push(n),r.status!==0)throw new c("worktree_remove_failed",`git worktree remove ${e.path} failed`,"Inspect the worktree manually, then retry.",v(r))}o(g,"removeCheckout");async function we(e,a,r){const n=await m(e),t=n?.managed_worktree;if(n===null||t===void 0||t===null||t.state!=="open")throw new c("no_managed_worktree",`node ${e} has no open managed worktree`,"Nothing to abandon for this node.");if(n.status==="active"||n.status==="idle"||X(n.pi_pid))throw new c("node_running",`node ${e} is still running`,"Abandon requires a stopped node with no live broker process. From the running owner, use `crtr node worktree close` to land locally, or make the checkout clean, push its current tip to origin, and rerun `crtr push final`.");if(!p(t.path))throw new c("worktree_missing",`managed worktree path is missing: ${t.path}`,"Inspect the branch and worktree registration, then retry.");const s=await h(t.path,["rev-parse","--abbrev-ref","HEAD"],"branch_check_failed","Inspect the worktree manually, then retry."),l=await i(["show-ref","--verify","--quiet",`refs/heads/${t.branch}`],t.path);if(s!==t.branch){if(l.status===0||s==="HEAD")throw new c("wrong_branch",`managed worktree is not on its recorded branch (expected ${t.branch}, found ${s==="HEAD"?"detached HEAD":s})`,`Inspect ${t.path}, then rerun \`crtr node worktree abandon\`.`);if(await T(t.path)||await h(t.path,["status","--porcelain"],"status_failed","Inspect the worktree manually, then retry.")!=="")throw new c("dirty_worktree","managed worktree has uncommitted changes",`Commit or stash them in ${t.path}, then rerun \`crtr node worktree abandon\`.`);const d=await h(t.path,["rev-parse","HEAD"],"abandon_tip_failed","Inspect the worktree manually, then retry.");await g(t,r);const w=new Date().toISOString();return await y(e,t,d,w,a,s),{node_id:e,branch:s,tip_sha:d,worktree_path:t.path,branch_deleted:!1}}const u=await h(t.path,["rev-parse","HEAD"],"abandon_tip_failed","Inspect the branch manually, then retry.");let b=null;try{const d=await $(t.path,t.base_ref);(await i(["merge-base","--is-ancestor",u,d],t.path)).status===0&&(b=d)}catch(d){if(!(d instanceof c)||d.code!=="missing_base_branch")throw d}const f=new Date().toISOString(),H=await h(t.path,["status","--porcelain"],"status_failed","Inspect the worktree manually, then retry.");if(b!==null&&u===t.base_sha){const d=await h(t.repo_root,["rev-parse",`${u}^{tree}`],"abandon_tree_failed","Inspect the branch manually, then retry."),w=await h(t.repo_root,["-c","user.name=crtr-abandon","-c","user.email=crtr-abandon@localhost","commit-tree",d,"-p",u,"-m","crtr-abandon","-m",`Crtr-Abandon: ${e} ${f}`],"abandon_commit_failed","Inspect the branch manually, then retry.");return await h(t.repo_root,["update-ref",`refs/heads/${t.branch}`,w,u],"abandon_marker_failed","The branch changed while abandon was starting; inspect the worktree, then retry."),await g(t,r),(await i(["update-ref","--stdin"],t.repo_root,se(t.branch,w,`refs/heads/${t.base_ref}`,b))).status===0?(await k(e,t,"complete"),{node_id:e,branch:t.branch,tip_sha:w,worktree_path:t.path,branch_deleted:!0}):(await y(e,t,w,f,a),{node_id:e,branch:t.branch,tip_sha:w,worktree_path:t.path,branch_deleted:!1})}if(!await T(t.path)&&H==="")return await g(t,r),await y(e,t,u,f,a),{node_id:e,branch:t.branch,tip_sha:u,worktree_path:t.path,branch_deleted:!1};await h(t.path,["add","--all"],"abandon_stage_failed","Inspect the worktree manually, then retry."),await h(t.path,["-c","user.name=crtr-abandon","-c","user.email=crtr-abandon@localhost","commit","--allow-empty","-m","crtr-abandon","-m",`Crtr-Abandon: ${e} ${f}`],"abandon_commit_failed","Inspect the worktree manually, then retry.");const A=await h(t.path,["rev-parse","HEAD"],"abandon_tip_failed","Inspect the branch manually, then retry.");return await g(t,r),await y(e,t,A,f,a),{node_id:e,branch:t.branch,tip_sha:A,worktree_path:t.path,branch_deleted:!1}}o(we,"abandonLocked");export{Fe as abandonManagedWorktreeAsync,Me as admitIntoManagedCheckout,Pe as autoDropCleanManagedWorktreeAsync,fe as concludeAbsentManagedWorktreeAsync,Le as createManagedWorktreeAsync,Ce as rollbackManagedWorktreeAsync};
10
+ `).some(n=>n.trim()===`branch refs/heads/${e.branch}`)){if((await i(["worktree","remove","--force",e.path],e.repo_root)).status!==0)return}else if(p(e.path))try{N(e.path,{recursive:!0,force:!0})}catch{return}await i(["update-ref","-d",`refs/heads/${e.branch}`,e.base_sha],e.repo_root)}})}o(Ce,"rollbackManagedWorktreeAsync");async function Le(e,a,r="main"){const n=await h(e,["rev-parse","--show-toplevel"],"not_git_repo","Pass --cwd <real repo> pointing inside a git repository.");if(ae(n))throw new c("managed_worktree_base",`cwd ${n} is a managed worktree and cannot be used as a managed worktree base`,"Pass `--cwd` pointing at the repository\u2019s primary checkout and keep `--worktree` set to the desired existing local base branch, including the parent branch.");const t=await L(n);return W(M(t),async()=>{const s=await $(n,r),l=oe(a),u=`crtr/${a}`;if(p(l))throw new c("worktree_path_exists",`managed worktree path already exists: ${l}`,"Remove the stale path or choose a fresh node id.");if((await i(["show-ref","--verify","--quiet",`refs/heads/${u}`],n)).status===0)throw new c("worktree_branch_exists",`managed worktree branch already exists: ${u}`,"Remove the stale branch or choose a fresh node id.");const b={state:"open",path:l,branch:u,repo_root:n,base_ref:r,base_sha:s,created:new Date().toISOString()};await h(n,["branch",u,s],"worktree_branch_create_failed","Inspect the git error, fix the repository/worktree state, then retry spawning with --worktree.");const f=await i(["worktree","add",l,u],n);if(f.status!==0)throw await i(["update-ref","-d",`refs/heads/${u}`,s],n),new c("worktree_add_failed","git worktree add failed","Inspect the git error, fix the repository/worktree state, then retry spawning with --worktree.",v(f));return le(n,t),b},{timeoutMs:C(),timeoutError:o(()=>new c("worktree_lock_timeout",`timed out waiting to create a managed worktree in ${t}`,"Wait for the other managed-worktree operation to finish, then retry."),"timeoutError")})}o(Le,"createManagedWorktreeAsync");async function P(e){if(e.state!=="open"||!p(e.path))return null;const a=await i(["rev-parse","--abbrev-ref","HEAD"],e.path),r=await i(["status","--porcelain"],e.path),n=await i(["rev-parse","HEAD"],e.path);if(a.status!==0||a.stdout.trim()!==e.branch||r.status!==0||r.stdout.trim()!==""||n.status!==0)return null;const t=await i(["rev-parse","--git-path","rebase-merge"],e.path);return t.status!==0||p(t.stdout.trim())?null:n.stdout.trim()}o(P,"cleanTip");async function F(e,a){try{const r=await $(e.path,e.base_ref);return(await i(["merge-base","--is-ancestor",a,r],e.path)).status===0}catch(r){if(r instanceof c&&r.code==="missing_base_branch")return a===e.base_sha;throw r}}o(F,"containedInLocalBase");function de(e){return{node_id:"",branch:e.branch,worktree_path:e.path,worktree_removed:!1,worktree_remove_error:`cleanup pending: the caller checkout at ${e.path} remains intact.`,branch_deleted:!1,branch_delete_error:`cleanup pending: local branch ${e.branch} remains checked out at ${e.path}.`}}o(de,"deferred");async function R(e){if(e.state!=="open"||p(e.path))return null;const a=`refs/heads/${e.branch}`,r=await i(["show-ref","--verify","--quiet",a],e.repo_root);if(r.status===1&&r.executionFailed!==!0)return{branchSha:null};if(r.status!==0)return null;const n=await i(["rev-parse","--verify",a],e.repo_root);if(n.status!==0)return null;const t=n.stdout.trim(),s=await i(["worktree","list","--porcelain"],e.repo_root);if(s.status!==0||re(s.stdout,e.branch)!==null)return null;const l=await ie(e.repo_root,e,t);return l===null?null:{branchSha:t,containment:l}}o(R,"proveAbsentPathManagedWorktree");async function pe(e,a,r){return p(a.path)?null:r.branchSha===null?(await k(e,a,"complete"),{node_id:e,branch:a.branch,worktree_path:a.path,worktree_removed:!0,branch_deleted:!0}):r.containment===void 0?null:(await k(e,a,"complete"),{node_id:e,branch:a.branch,worktree_path:a.path,worktree_removed:!0,branch_deleted:!1,branch_delete_error:`local branch ${a.branch} is delivered but retained because its checkout status can change outside crtr's repository lock.`})}o(pe,"autoDropAbsentPathManagedWorktreeLocked");async function fe(e){const a=(await m(e))?.managed_worktree;return a==null||a.state!=="open"||p(a.path)||await R(a)===null?null:_(a.repo_root,async()=>{const r=(await m(e))?.managed_worktree;if(r==null||r.state!=="open")return null;const n=await R(r);if(n===null)return null;const t=await pe(e,r,n);return t===null?null:{dropped:t,landedSha:n.branchSha??r.base_sha}})}o(fe,"concludeAbsentManagedWorktreeAsync");async function Pe(e){const a=(await m(e))?.managed_worktree;if(a==null||a.state!=="open")return null;if(!p(a.path))return(await fe(e))?.dropped??null;const r=await P(a);return r===null||!await F(a,r)?null:_(a.path,async()=>{const n=(await m(e))?.managed_worktree;if(n==null||n.state!=="open")return null;const t=await P(n);return t===null||t!==r||!await F(n,t)?null:(await k(e,n,"pending"),{...de(n),node_id:e})})}o(Pe,"autoDropCleanManagedWorktreeAsync");async function T(e){for(const a of["rebase-merge","rebase-apply"]){const r=await i(["rev-parse","--git-path",a],e);if(r.status!==0||p(r.stdout.trim()))return!0}return!1}o(T,"rebaseInProgress");async function y(e,a,r,n,t,s=a.branch){await U(e,{cwd:a.repo_root,abandoned:{branch:s,tip_sha:r,at:n,by:t}})}o(y,"persistAbandoned");async function Fe(e,a){const r=(await m(e))?.managed_worktree;if(r==null||r.state!=="open")throw new c("no_managed_worktree",`node ${e} has no open managed worktree`,"Nothing to abandon for this node.");const n=[];try{return await _(r.path,()=>we(e,a,n))}finally{await ce(r.path,n[0])}}o(Fe,"abandonManagedWorktreeAsync");async function g(e,a){const{result:r,trash:n}=await he(e.repo_root,e.path);if(n!==void 0&&a.push(n),r.status!==0)throw new c("worktree_remove_failed",`git worktree remove ${e.path} failed`,"Inspect the worktree manually, then retry.",v(r))}o(g,"removeCheckout");async function we(e,a,r){const n=await m(e),t=n?.managed_worktree;if(n===null||t===void 0||t===null||t.state!=="open")throw new c("no_managed_worktree",`node ${e} has no open managed worktree`,"Nothing to abandon for this node.");if(n.status==="active"||n.status==="idle"||X(n.pi_pid))throw new c("node_running",`node ${e} is still running`,"Abandon requires a stopped node with no live broker process. From the running owner, use `crtr node worktree close` to land locally, or make the checkout clean, push its current tip to origin, and rerun `crtr push final`.");if(!p(t.path))throw new c("worktree_missing",`managed worktree path is missing: ${t.path}`,"Inspect the branch and worktree registration, then retry.");const s=await h(t.path,["rev-parse","--abbrev-ref","HEAD"],"branch_check_failed","Inspect the worktree manually, then retry."),l=await i(["show-ref","--verify","--quiet",`refs/heads/${t.branch}`],t.path);if(s!==t.branch){if(l.status===0||s==="HEAD")throw new c("wrong_branch",`managed worktree is not on its recorded branch (expected ${t.branch}, found ${s==="HEAD"?"detached HEAD":s})`,`Inspect ${t.path}, then rerun \`crtr node worktree abandon\`.`);if(await T(t.path)||await h(t.path,["status","--porcelain"],"status_failed","Inspect the worktree manually, then retry.")!=="")throw new c("dirty_worktree","managed worktree has uncommitted changes",`Commit or stash them in ${t.path}, then rerun \`crtr node worktree abandon\`.`);const d=await h(t.path,["rev-parse","HEAD"],"abandon_tip_failed","Inspect the worktree manually, then retry.");await g(t,r);const w=new Date().toISOString();return await y(e,t,d,w,a,s),{node_id:e,branch:s,tip_sha:d,worktree_path:t.path,branch_deleted:!1}}const u=await h(t.path,["rev-parse","HEAD"],"abandon_tip_failed","Inspect the branch manually, then retry.");let b=null;try{const d=await $(t.path,t.base_ref);(await i(["merge-base","--is-ancestor",u,d],t.path)).status===0&&(b=d)}catch(d){if(!(d instanceof c)||d.code!=="missing_base_branch")throw d}const f=new Date().toISOString(),H=await h(t.path,["status","--porcelain"],"status_failed","Inspect the worktree manually, then retry.");if(b!==null&&u===t.base_sha){const d=await h(t.repo_root,["rev-parse",`${u}^{tree}`],"abandon_tree_failed","Inspect the branch manually, then retry."),w=await h(t.repo_root,["-c","user.name=crtr-abandon","-c","user.email=crtr-abandon@localhost","commit-tree",d,"-p",u,"-m","crtr-abandon","-m",`Crtr-Abandon: ${e} ${f}`],"abandon_commit_failed","Inspect the branch manually, then retry.");return await h(t.repo_root,["update-ref",`refs/heads/${t.branch}`,w,u],"abandon_marker_failed","The branch changed while abandon was starting; inspect the worktree, then retry."),await g(t,r),(await i(["update-ref","--stdin"],t.repo_root,se(t.branch,w,`refs/heads/${t.base_ref}`,b))).status===0?(await k(e,t,"complete"),{node_id:e,branch:t.branch,tip_sha:w,worktree_path:t.path,branch_deleted:!0}):(await y(e,t,w,f,a),{node_id:e,branch:t.branch,tip_sha:w,worktree_path:t.path,branch_deleted:!1})}if(!await T(t.path)&&H==="")return await g(t,r),await y(e,t,u,f,a),{node_id:e,branch:t.branch,tip_sha:u,worktree_path:t.path,branch_deleted:!1};await h(t.path,["add","--all"],"abandon_stage_failed","Inspect the worktree manually, then retry."),await h(t.path,["-c","user.name=crtr-abandon","-c","user.email=crtr-abandon@localhost","commit","--allow-empty","-m","crtr-abandon","-m",`Crtr-Abandon: ${e} ${f}`],"abandon_commit_failed","Inspect the worktree manually, then retry.");const A=await h(t.path,["rev-parse","HEAD"],"abandon_tip_failed","Inspect the branch manually, then retry.");return await g(t,r),await y(e,t,A,f,a),{node_id:e,branch:t.branch,tip_sha:A,worktree_path:t.path,branch_deleted:!1}}o(we,"abandonLocked");export{Fe as abandonManagedWorktreeAsync,Me as admitIntoManagedCheckout,Pe as autoDropCleanManagedWorktreeAsync,fe as concludeAbsentManagedWorktreeAsync,Le as createManagedWorktreeAsync,Ce as rollbackManagedWorktreeAsync};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/cli",
3
- "version": "0.3.582",
3
+ "version": "0.3.584",
4
4
  "description": "crtr — agent runtime with memory, plugins, and marketplaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -145,7 +145,7 @@
145
145
  },
146
146
  "license": "UNLICENSED",
147
147
  "dependencies": {
148
- "@north-light/identity": "0.3.582",
148
+ "@north-light/identity": "0.3.584",
149
149
  "@earendil-works/chord": "1.1.0",
150
150
  "@earendil-works/pi-agent-core": "1.1.0",
151
151
  "@earendil-works/pi-ai": "1.1.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/identity",
3
- "version": "0.3.582",
3
+ "version": "0.3.584",
4
4
  "description": "Northlight access-token verification and scope rules",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/runtime.lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@north-light/cli",
3
- "version": "0.3.582",
3
+ "version": "0.3.584",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@north-light/cli",
9
- "version": "0.3.582",
9
+ "version": "0.3.584",
10
10
  "hasInstallScript": true,
11
11
  "license": "UNLICENSED",
12
12
  "workspaces": [
@@ -28,7 +28,7 @@
28
28
  "@milkdown/preset-gfm": "^7.22.3",
29
29
  "@milkdown/prose": "^7.22.3",
30
30
  "@milkdown/utils": "^7.22.3",
31
- "@north-light/identity": "0.3.582",
31
+ "@north-light/identity": "0.3.584",
32
32
  "cron-parser": "^5.6.0",
33
33
  "esbuild": "^0.27.7",
34
34
  "jose": "^6.2.12",
@@ -11956,17 +11956,17 @@
11956
11956
  },
11957
11957
  "packages/crouter-api": {
11958
11958
  "name": "@north-light/api",
11959
- "version": "0.3.582",
11959
+ "version": "0.3.584",
11960
11960
  "license": "UNLICENSED"
11961
11961
  },
11962
11962
  "packages/crouter-env-docker": {
11963
11963
  "name": "@north-light/env-docker",
11964
- "version": "0.3.582",
11964
+ "version": "0.3.584",
11965
11965
  "license": "UNLICENSED"
11966
11966
  },
11967
11967
  "packages/crouter-identity": {
11968
11968
  "name": "@north-light/identity",
11969
- "version": "0.3.582",
11969
+ "version": "0.3.584",
11970
11970
  "license": "UNLICENSED",
11971
11971
  "dependencies": {
11972
11972
  "jose": "^6.2.1"
@@ -11974,21 +11974,21 @@
11974
11974
  },
11975
11975
  "packages/crouter-plugin": {
11976
11976
  "name": "@north-light/plugin",
11977
- "version": "0.3.582",
11977
+ "version": "0.3.584",
11978
11978
  "license": "UNLICENSED",
11979
11979
  "dependencies": {
11980
- "@north-light/api": "0.3.582",
11981
- "@north-light/identity": "0.3.582"
11980
+ "@north-light/api": "0.3.584",
11981
+ "@north-light/identity": "0.3.584"
11982
11982
  }
11983
11983
  },
11984
11984
  "packages/crouter-sdk": {
11985
11985
  "name": "@north-light/sdk",
11986
- "version": "0.3.582",
11986
+ "version": "0.3.584",
11987
11987
  "license": "UNLICENSED",
11988
11988
  "dependencies": {
11989
- "@north-light/api": "0.3.582",
11990
- "@north-light/identity": "0.3.582",
11991
- "@north-light/plugin": "0.3.582",
11989
+ "@north-light/api": "0.3.584",
11990
+ "@north-light/identity": "0.3.584",
11991
+ "@north-light/plugin": "0.3.584",
11992
11992
  "jose": "^6.2.1"
11993
11993
  },
11994
11994
  "bin": {
@@ -42,7 +42,8 @@ if [ ! -f "$RELEASE_DIR/.complete" ]; then
42
42
  rm -rf "$tmp"
43
43
  trap - EXIT
44
44
  fi
45
- ln -sfn "$RELEASE_DIR" "$ROOT/current.new" && mv -T "$ROOT/current.new" "$ROOT/current"
45
+ current_tmp="$ROOT/current.new.$$"
46
+ ln -sfn "$RELEASE_DIR" "$current_tmp" && mv -T "$current_tmp" "$ROOT/current"
46
47
  # Keep the three newest releases (the current one among them).
47
48
  ls -1t "$RELEASES" 2>/dev/null | grep -v '^\.' | tail -n +4 | while read -r old; do
48
49
  [ "$old" = "$CRTR_RELEASE" ] || rm -rf "${RELEASES:?}/$old"