@hydra-acp/cli 0.1.81 → 0.1.82

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/cli.js +11 -11
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -132,35 +132,35 @@ uncaught: ${e.stack??e.message}
132
132
  `);if(s.filter(i=>i.length>0).length>1){this.onKey([{type:"paste",text:n.replace(/\r/g,"")}]);return}for(let i=0;i<s.length;i++)s[i].length>0&&this.handleRawStdin(Buffer.from(s[i],"binary")),i<s.length-1&&this.onKey([{type:"key",name:"ctrl-enter"}]);return}if(n.includes("\x1B[")&&/\x1b\[\d+(?:;\d+)?u/.test(n)){this.handleCsiUStdin(n);return}this.handleRawStdinSegment(n)}}handleCsi27Stdin(e){let n=/\x1b\[27;(\d+);(\d+)~/g,s=0,r;for(;(r=n.exec(e))!==null;){r.index>s&&this.handleRawStdin(Buffer.from(e.slice(s,r.index),"binary"));let i=parseInt(r[1],10),o=parseInt(r[2],10),a=Dg(o,i);a!==null?this.onKey([{type:"key",name:a}]):(i===1||i===2)&&o>=32&&o<127&&this.handleRawStdinSegment(String.fromCharCode(o)),s=r.index+r[0].length}s<e.length&&this.handleRawStdin(Buffer.from(e.slice(s),"binary"))}handleCsiUStdin(e){let n=/\x1b\[(\d+)(?:;(\d+))?u/g,s=0,r;for(;(r=n.exec(e))!==null;){r.index>s&&this.handleRawStdin(Buffer.from(e.slice(s,r.index),"binary"));let i=parseInt(r[1],10),o=r[2]!==void 0?parseInt(r[2],10):1,a=Dg(i,o);a!==null&&this.onKey([{type:"key",name:a}]),s=r.index+r[0].length}s<e.length&&this.handleRawStdin(Buffer.from(e.slice(s),"binary"))}handleRawStdinSegment(e){let n=ri,s=io;for(;e.length>0;){if(this.pasteActive){let i=e.indexOf(s);if(i===-1){this.pasteBuffer+=e;return}this.pasteBuffer+=e.slice(0,i),e=e.slice(i+s.length),this.pasteActive=!1;let o=Buffer.from(this.pasteBuffer,"binary").toString("utf-8").replace(/\r\n?/g,`
133
133
  `);this.pasteBuffer="";let a=Ig(o);a!==null?this.onKey([{type:"attachment-paths",paths:a}]):this.onKey([{type:"paste",text:o}]);continue}let r=e.indexOf(n);if(r===-1){let i=TA(e);i!==null?this.onKey([{type:"paste",text:i}]):this.terminalKitStdinHandler&&this.terminalKitStdinHandler(Buffer.from(e,"binary"));return}r>0&&this.terminalKitStdinHandler&&this.terminalKitStdinHandler(Buffer.from(e.slice(0,r),"binary")),e=e.slice(r+n.length),this.pasteActive=!0}}width(){return this.term.width||0}appendLines(e){e.length!==0&&(this.streamingActive=!1,this.lines.push(...e),this.trackLines(e),this.adjustScrollForRowChange(this.wrappedRowsOfMany(e)),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint())}appendLine(e){this.streamingActive=!1,this.lines.push(e),this.trackLine(e),this.adjustScrollForRowChange(this.wrappedRowsOf(e)),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}adjustScrollForRowChange(e){this.scrollOffset>0&&e!==0&&(this.scrollOffset=Math.max(0,this.scrollOffset+e))}wrappedRowsOf(e){let n=this.term.width;return this.wrapCacheWidth!==n&&(this.wrapCache.clear(),this.wrapCacheWidth=n),this.wrapOne(e,n).length}wrappedRowsOfMany(e){let n=0;for(let s of e)n+=this.wrappedRowsOf(s);return n}trackLine(e){this.lineIds.set(e,this.nextLineId++)}trackLines(e){for(let n of e)this.trackLine(n)}forgetLine(e){let n=this.lineIds.get(e);n!==void 0&&this.wrapCache.delete(n)}trimScrollback(){let e=this.lines.length-this.maxScrollbackLines;if(e<=0)return;let n=this.lines.splice(0,e);for(let s of n)this.forgetLine(s);this.invalidateSelectionIfTouches(n);for(let[s,r]of[...this.keyedBlocks.entries()])r.start-=e,r.start<0&&this.keyedBlocks.delete(s)}upsertLine(e,n){this.upsertLines(e,[n])}upsertLines(e,n){if(n.length===0)return;for(let o of n)o.blockKey=e;let s=this.keyedBlocks.get(e),r=!1,i=0;if(s){let o=s.start+s.count;r=o>=this.lines.length;let a=this.wrappedRowsOfMany(this.lines.slice(s.start,o)),d=n.length-s.count,c=this.lines.splice(s.start,s.count,...n);for(let l of c)this.forgetLine(l);if(this.trackLines(n),this.invalidateSelectionIfTouches(c),s.count=n.length,d!==0)for(let[l,f]of this.keyedBlocks)l!==e&&f.start>s.start&&(f.start+=d);i=this.wrappedRowsOfMany(n)-a}else r=!0,this.keyedBlocks.set(e,{start:this.lines.length,count:n.length}),this.lines.push(...n),this.trackLines(n),i=this.wrappedRowsOfMany(n);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(i),e!==this.stickyBottomKey&&this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}appendStreaming(e,n,s,r){if(e.length===0)return;let i=e.split(`
134
134
  `),[o,...a]=i,d=0;if(this.streamingActive&&this.lines.length>0){let l=this.lines[this.lines.length-1];if(l){let f=this.wrappedRowsOf(l);this.forgetLine(l),l.body+=o??"",d+=this.wrappedRowsOf(l)-f}}else{if(this.lines.length>0){let f=this.lines[this.lines.length-1];if(!(f&&f.body===""&&(!f.prefix||f.prefix===""))){let p={body:""};this.lines.push(p),this.trackLine(p),d+=this.wrappedRowsOf(p)}}let l={prefix:n,body:o??"",bodyStyle:s};r!==void 0&&(l.prefixStyle=r),this.lines.push(l),this.trackLine(l),d+=this.wrappedRowsOf(l)}let c=" ".repeat(n.length);for(let l of a){let f={prefix:c,body:l,bodyStyle:s};this.lines.push(f),this.trackLine(f),d+=this.wrappedRowsOf(f)}this.streamingActive=!0,this.adjustScrollForRowChange(d),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}setSessionbar(e){this.sessionbar={...this.sessionbar,...e},this.syncWindowTitle(),this.repaint()}syncWindowTitle(){let e=this.sessionbar.title?.trim(),n=zl(this.sessionbar.sessionId)||"hydra",s=e&&e.length>0?e:n,i=(this.readonly?`${s} [VIEW ONLY]`:s).replace(/[\x00-\x1f\x7f]/g,"").slice(0,200);i!==this.lastWindowTitle&&(this.lastWindowTitle=i,process.stdout.write(`\x1B]0;${i}\x1B\\`))}clearWindowTitle(){this.lastWindowTitle=null,process.stdout.write("\x1B]0;\x1B\\")}setBanner(e){this.banner={...this.banner,...e},this.writeProgressIndicator(this.banner.status==="busy"?3:0),this.syncedPartialRepaint(()=>this.drawBanner())}syncedPartialRepaint(e){this.started&&Be(()=>{e(),this.placeCursor()})}currentModeId(){return this.banner.currentMode}writeProgressIndicator(e){this.started&&this.progressIndicatorEnabled&&e!==this.lastProgressState&&(this.lastProgressState=e,process.stdout.write(`\x1B]9;4;${e}\x1B\\`))}notify(e,n=4e3){this.bannerNotificationTimer&&clearTimeout(this.bannerNotificationTimer),this.bannerNotification=e,this.bannerNotificationTimer=setTimeout(()=>{this.bannerNotification=null,this.bannerNotificationTimer=null,this.syncedPartialRepaint(()=>this.drawBanner())},n),this.syncedPartialRepaint(()=>this.drawBanner())}setMouseEnabled(e){this.mouseEnabled!==e&&(this.mouseEnabled=e,this.started&&(e?(this.term.grabInput({mouse:"drag"}),this.term.on("mouse",this.mouseHandler)):(this.term.off("mouse",this.mouseHandler),this.term.grabInput(!0)),this.reclaimStdinAfterGrabInput()))}reclaimStdinAfterGrabInput(){if(this.terminalKitStdinHandler===null)return;let e=this.term;!e.stdin||typeof e.onStdin!="function"||(this.terminalKitStdinHandler=e.onStdin,e.stdin.removeListener("data",e.onStdin),e.stdin.removeListener("data",this.rawStdinHandler),e.stdin.on("data",this.rawStdinHandler))}isMouseEnabled(){return this.mouseEnabled}setInAppSelectionEnabled(e){this.inAppSelectionEnabled=e}isInAppSelectionEnabled(){return this.inAppSelectionEnabled}setSelection(e,n){let s=this.lineIndexById(e.sourceLineId),r=this.lineIndexById(n.sourceLineId),i=s<r||s===r&&e.offset<=n.offset,o=i?e:n,a=i?n:e;if(o.sourceLineId===a.sourceLineId&&o.offset===a.offset){this.clearSelection();return}let d={startLineId:o.sourceLineId,startOffset:o.offset,endLineId:a.sourceLineId,endOffset:a.offset},c=this.selection;c&&c.startLineId===d.startLineId&&c.startOffset===d.startOffset&&c.endLineId===d.endLineId&&c.endOffset===d.endOffset||(this.selection=d,this.repaint())}clearSelection(){this.selection!==null&&(this.selection=null,this.repaint())}hasSelection(){return this.selection!==null}getSelection(){return this.selection===null?null:{start:{sourceLineId:this.selection.startLineId,offset:this.selection.startOffset},end:{sourceLineId:this.selection.endLineId,offset:this.selection.endOffset}}}getSelectionText(){let e=this.selectionLineBounds();if(e===null)return"";let n=[];for(let s=e.loIdx;s<=e.hiIdx;s++){let r=this.lines[s];if(!r)continue;let i=this.lineIds.get(r),o=i===void 0?void 0:e.byId.get(i);if(!o)continue;let a=r.body??"",d;r.ansi?d=s===e.loIdx||s===e.hiIdx?"":a.replace(IA,""):(d=a.slice(o.start,o.end),bd(r.bodyStyle)&&(d=$A(d))),n.push(d)}return n.join(`
135
- `)}selectionLineBounds(){let e=this.selection;if(e===null)return null;let n=this.lineIndexById(e.startLineId),s=this.lineIndexById(e.endLineId);if(n===-1||s===-1)return null;let r=n,i=s,o=e.startOffset,a=e.endOffset;n>s&&(r=s,i=n,o=e.endOffset,a=e.startOffset);let d=new Map;for(let c=r;c<=i;c++){let l=this.lines[c];if(!l)continue;let f=this.lineIds.get(l);if(f===void 0)continue;let u=(l.body??"").length,p=c===r?Math.max(0,Math.min(u,o)):0,m=c===i?Math.max(0,Math.min(u,a)):u;d.set(f,{start:p,end:m,toEnd:c<i})}return{loIdx:r,hiIdx:i,byId:d}}selectionRangeForChunk(e){if(this.selection===null||e.ansi)return null;let n=this.selectionRenderBounds??this.selectionLineBounds()?.byId??null;if(n===null)return null;let s=this.wrapOrigin.get(e);if(!s)return null;let r=n.get(s.sourceLineId);if(!r)return null;let i=s.sourceColOffset,o=i+e.body.length,a=Math.max(r.start,i),d=Math.min(r.end,o);return d<=a?null:{start:a-i,end:d-i,toEndOfLine:r.toEnd||r.end>o}}setBannerSearchIndicator(e){this.bannerSearchIndicator!==e&&(this.bannerSearchIndicator=e,this.syncedPartialRepaint(()=>this.drawBanner()))}bannerRightContent(){if(this.scrollbackSearch!==null){let e=this.scrollbackSearch,n=e.matches.length>0?` ${e.matchIndex+1}/${e.matches.length}`:e.term.length===0?"":" 0/0";return{text:`\u{1F50D} ${e.term}${n}`,kind:"search"}}return this.bannerSearchIndicator!==null?{text:`\u{1F50D} ${this.bannerSearchIndicator}`,kind:"search"}:this.bannerNotification!==null?{text:this.bannerNotification,kind:"notify"}:null}clearScrollback(){this.lines=[],this.keyedBlocks.clear(),this.wrapCache.clear(),this.wrapCacheWidth=0,this.streamingActive=!1,this.scrollOffset=0,this.selection!==null&&(this.selection=null),this.repaint()}invalidateSelectionIfTouches(e){if(this.selection!==null)for(let n of e){let s=this.lineIds.get(n);if(s!==void 0&&(s===this.selection.startLineId||s===this.selection.endLineId)){this.selection=null;return}}}setHideThoughts(e){this.hideThoughts!==e&&(this.hideThoughts=e,this.repaint())}clearKey(e){this.keyedBlocks.delete(e)}hasKey(e){return this.keyedBlocks.has(e)}removeKey(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count,r=s>=this.lines.length,i=this.wrappedRowsOfMany(this.lines.slice(n.start,s)),o=this.lines.splice(n.start,n.count);for(let a of o)this.forgetLine(a);this.invalidateSelectionIfTouches(o),this.keyedBlocks.delete(e);for(let[a,d]of this.keyedBlocks)a!==e&&d.start>n.start&&(d.start-=n.count);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(-i),this.moveStickyToEnd(),this.scheduleRepaint()}setStickyBottomKey(e){this.stickyBottomKey=e,this.moveStickyToEnd(),this.scheduleRepaint()}moveStickyToEnd(){if(this.stickyBottomKey===null)return;let e=this.keyedBlocks.get(this.stickyBottomKey);if(!e)return;let n=e.start+e.count;if(n>=this.lines.length)return;let s=this.lines.splice(e.start,e.count);for(let[r,i]of this.keyedBlocks)r!==this.stickyBottomKey&&i.start>=n&&(i.start-=e.count);e.start=this.lines.length,this.lines.push(...s),this.streamingActive=!1}removeBlock(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count>=this.lines.length,r=this.wrappedRowsOfMany(this.lines.slice(n.start,n.start+n.count)),i=this.lines.splice(n.start,n.count);for(let o of i)this.forgetLine(o);this.invalidateSelectionIfTouches(i),this.keyedBlocks.delete(e);for(let[,o]of this.keyedBlocks)o.start>n.start&&(o.start-=n.count);s&&(this.streamingActive=!1),this.adjustScrollForRowChange(-r),this.scheduleRepaint()}contiguousRun(e,n){if(!this.keyedBlocks.has(e))return[];let s=[...n].map(d=>{let c=this.keyedBlocks.get(d);return c?{key:d,start:c.start,count:c.count}:null}).filter(d=>d!==null).sort((d,c)=>d.start-c.start),r=s.findIndex(d=>d.key===e);if(r<0)return[];let i=(d,c)=>{for(let[l,f]of this.keyedBlocks)if(!n.has(l)&&f.start>=d&&f.start<c)return!0;return!1},o=r;for(;o>0&&!i(s[o-1].start+s[o-1].count,s[o].start);)o--;let a=r;for(;a<s.length-1&&!i(s[a].start+s[a].count,s[a+1].start);)a++;return s.slice(o,a+1).map(d=>d.key)}setRunCollapsed(e,n,s){if(e.length===0)return;let r=e[0];if(!this.keyedBlocks.has(r))return;this.upsertLines(r,s);let i=this.keyedBlocks.get(r),o=i.start+i.count;for(let a of e){let d=this.keyedBlocks.get(a);d&&(o=Math.max(o,d.start+d.count))}for(let a=i.start+i.count;a<o;a++){let d=this.lines[a];d&&(d.collapsed=n)}this.scheduleRepaint()}redraw(){this.repaint()}fullRedraw(){this.painter.clearCache(),this.lastWindowTitle=null,this.wrapCache.clear(),this.wrapCacheWidth=0,process.stdout.write(yl),this.term.clear(),this.repaint()}pauseRepaint(){this.repaintPaused+=1}resumeRepaint(){this.repaintPaused!==0&&(this.repaintPaused-=1,this.repaintPaused===0&&this.repaintPending&&(this.repaintPending=!1,this.repaint()))}setQueuedPrompts(e){this.queuedTexts=[...e],this.lastQueueEditingIndex=this.dispatcher.state().queueIndex,this.repaint()}repaintNow(){this.repaint()}setPermissionPrompt(e){e!==null&&this.permissionPrompt===null&&this.clearSelection(),this.permissionPrompt=e?{...e}:null,this.repaint()}setOptionsPrompt(e){e!==null&&this.optionsPrompt===null&&this.clearSelection(),this.optionsPrompt=e?{...e,options:e.options.map(n=>({...n}))}:null,this.repaint()}isOptionsPromptActive(){return this.optionsPrompt!==null}setConfirmPrompt(e){e!==null&&this.confirmPrompt===null&&this.clearSelection(),this.confirmPrompt=e?{...e}:null,this.repaint()}setHelpPrompt(e){e!==null&&this.helpPrompt===null&&this.clearSelection(),this.helpPrompt=e?{...e,entries:[...e.entries]}:null,this.repaint()}isHelpPromptActive(){return this.helpPrompt!==null}openBtwOverlay(e){let n=e?.height??12;this.btwOverlayOpen=!0,this.btwOverlayMaxHeight=n,this.focusedPane="btw",this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.scheduleRepaint()}setBtwOverlayMeta(e){let n=!1;if(e.sessionId!==void 0&&this.btwOverlaySessionId!==e.sessionId&&(this.btwOverlaySessionId=e.sessionId,n=!0),e.usage!==void 0){let s=this.btwOverlayUsage,r=e.usage;(!s||s.used!==r.used||s.size!==r.size||s.costAmount!==r.costAmount||s.costCurrency!==r.costCurrency)&&(this.btwOverlayUsage={...r},n=!0)}n&&this.scheduleRepaint()}setBtwOverlayContent(e){if(this.btwOverlayLines.length===e.length){let n=!0;for(let s=0;s<e.length;s++)if(this.btwOverlayLines[s]!==e[s]){n=!1;break}if(n)return}this.btwOverlayLines=[...e],this.scheduleRepaint()}setBtwOverlayStatus(e){let n=this.btwOverlayLabel===e.label,s=this.btwOverlayStatus===e.style;n&&s||(this.btwOverlayLabel=e.label,this.btwOverlayStatus=e.style,this.scheduleRepaint())}closeBtwOverlay(){this.btwOverlayOpen&&(this.btwOverlayOpen=!1,this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.focusedPane="main",this.scheduleRepaint())}toggleFocusedPane(){this.focusedPane=this.focusedPane==="main"?"btw":"main",this.scheduleRepaint()}getFocusedPane(){return this.focusedPane}isOverlayOpen(){return this.btwOverlayOpen}setCompletions(e){e.length===this.completions.length&&e.every((s,r)=>{let i=this.completions[r];return i!==void 0&&i.name===s.name&&i.description===s.description})||(this.completions=[...e],this.repaint())}ensureSeparator(e){if(this.lines.length===0)return;let n=this.stickyBottomKey!==null?this.keyedBlocks.get(this.stickyBottomKey):void 0,s=n!==void 0&&n.start+n.count===this.lines.length,r=s?n.start-1:this.lines.length-1;if(r<0)return;let i=this.lines[r];if(i&&i.body===""&&(i.prefix===void 0||i.prefix===""))return;let o={body:""};e!==void 0&&(o.bodyStyle=e),s?(this.lines.splice(n.start,0,o),n.start+=1):this.lines.push(o),this.trackLine(o),this.streamingActive=!1,this.adjustScrollForRowChange(this.wrappedRowsOf(o)),this.trimScrollback(),this.scheduleRepaint()}refreshPrompt(){if(this.promptRows()!==this.lastPromptRows){this.repaint();return}this.syncedPartialRepaint(()=>{let e=this.dispatcher.state().queueIndex;e!==this.lastQueueEditingIndex&&(this.lastQueueEditingIndex=e,this.drawQueuedZone()),this.drawPrompt()})}handleKey(e,n){if(n.isCharacter){this.onKey([{type:"char",ch:e}]);return}if(e==="PAGE_UP"){this.scrollBy(this.scrollPageSize());return}if(e==="PAGE_DOWN"){this.scrollBy(-this.scrollPageSize());return}let s=kd(e);s&&this.onKey([{type:"key",name:s}])}handleMouse(e,n){if(e==="MOUSE_WHEEL_UP"){this.scrollBy(3);return}if(e==="MOUSE_WHEEL_DOWN"){this.scrollBy(-3);return}let s=this.mouseCell(n),r=EA(e),i=null;if(e==="MOUSE_DRAG"||e==="MOUSE_MOTION"?i="move":e.endsWith("_PRESSED")?i="press":e.endsWith("_RELEASED")&&(i="release"),i!==null&&s!==null&&this.onMouse&&this.onMouse({kind:i,button:r,x:s.x,y:s.y,name:e}),e==="MOUSE_LEFT_BUTTON_PRESSED"){let o=this.lastLeftClick;o!==null&&s!==null&&Math.abs(s.x-o.x)<=wd&&Math.abs(s.y-o.y)<=wd&&Date.now()-o.t<=Nl||this.flushPendingBlockClick(),this.pressCell=s,this.handleSelectionPress(s);return}if(e.endsWith("_PRESSED")&&e!=="MOUSE_LEFT_BUTTON_PRESSED"&&this.flushPendingBlockClick(),e==="MOUSE_DRAG"&&s!==null){this.handleSelectionDrag(s);return}if(e==="MOUSE_LEFT_BUTTON_RELEASED"||e==="MOUSE_BUTTON_RELEASED"){let o=this.pressCell;this.pressCell=null;let a=this.inAppSelectionEnabled&&(this.selectionDragStarted||this.doubleClickPending);if(this.onBlockClick&&o!==null&&s!==null&&s.x===o.x&&s.y===o.y&&!a){let d=this.keyAtRow(s.y);if(d!==null){let c=s.y;for(;c>1&&this.keyAtRow(c-1)===d;)c-=1;this.schedulePendingBlockClick(d,s.y-c)}}this.handleSelectionRelease(s)}}handleSelectionPress(e){if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,!this.inAppSelectionEnabled||e===null)return;let n=this.resolveCellToSource(e.x,e.y);if(n===null){this.lastLeftClick=null;return}this.selectionAnchor=n;let s=Date.now(),r=this.lastLeftClick;if(r!==null&&s-r.t<=Nl&&Math.abs(e.x-r.x)<=wd&&Math.abs(e.y-r.y)<=wd){if(this.cancelPendingBlockClick(),this.onBlockDoubleClick&&e!==null){let a=this.keyAtRow(e.y);if(a!==null){let d=e.y;for(;d>1&&this.keyAtRow(d-1)===a;)d-=1;let c=e.y-d;if(this.onBlockDoubleClick(a,c)){this.doubleClickPending=!0,this.lastLeftClick=null;return}}}if(this.tryOpenFileAt(n)){this.doubleClickPending=!0,this.lastLeftClick=null;return}let o=this.wordBoundsAt(n);o!==null&&(this.setSelection({sourceLineId:n.sourceLineId,offset:o.start},{sourceLineId:n.sourceLineId,offset:o.end}),this.doubleClickPending=!0),this.lastLeftClick=null}}handleSelectionDrag(e){if(!this.inAppSelectionEnabled||this.selectionAnchor===null||this.doubleClickPending)return;let n=this.resolveCellToSource(e.x,e.y);n!==null&&(this.selectionDragStarted=!0,this.setSelection(this.selectionAnchor,n))}handleSelectionRelease(e){let n=this.selectionDragStarted,s=this.doubleClickPending;if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,e!==null&&(this.lastLeftClick={x:e.x,y:e.y,t:Date.now()}),!!this.inAppSelectionEnabled){if(n||s){this.finalizeSelection();return}this.selection!==null&&this.clearSelection()}}wordBoundsAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let r=Math.max(0,Math.min(s.length-1,e.offset));if(e.offset>=s.length&&(r=s.length-1),!Dl.test(s[r]))return null;let i=r;for(;i>0&&Dl.test(s[i-1]);)i--;let o=r+1;for(;o<s.length&&Dl.test(s[o]);)o++;return{start:i,end:o}}pathTokenAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let{clean:r,rawToClean:i}=_A(s);if(r.length===0)return null;let o=i[Math.min(e.offset,i.length-1)]??r.length;if(n.links){for(let p of n.links)if(o>=p.start&&o<p.end){let m=p.url;return{raw:m.startsWith("file://")?m.slice(7):m,line:null}}}let a=Math.max(0,Math.min(r.length-1,o));if(o>=r.length&&(a=r.length-1),!Hl.test(r[a]))return null;let d=a;for(;d>0&&Hl.test(r[d-1]);)d--;let c=a+1;for(;c<r.length&&Hl.test(r[c]);)c++;let l=r.slice(d,c);if(l=l.replace(/[.]+$/,""),l.length===0)return null;let f=null,u=r.slice(c).match(/^:(\d+)(?::\d+)?/);return u&&(f=Number.parseInt(u[1],10)),{raw:l,line:f}}resolvePathToken(e){let n=e;(n==="~"||n.startsWith("~/"))&&(n=n==="~"?_g():`${_g()}/${n.slice(2)}`);let s=$g(n)||e.startsWith("~"),r=n.includes("/");if(!s&&!r)return null;let i=$g(n)?n:bA(this.sessionbar.cwd,n);if(s)return i;try{if(wA(i).isFile())return i}catch{return null}return null}tryOpenFileAt(e){if(this.openFileCommand===null)return!1;let n=this.pathTokenAt(e);if(n===null)return!1;let s=n.line===null?"":`:${n.line}`;return this.tryOpenPathString(n.raw+s)}tryOpenPathString(e){if(this.openFileCommand===null)return!1;let n=e,s=null,r=e.match(/^(.*?):(\d+)(?::\d+)?$/);r&&(n=r[1],s=Number.parseInt(r[2],10));let i=this.resolvePathToken(n);if(i===null)return!1;let o=s===null?"":String(s),[a,...d]=this.openFileCommand;if(!a)return!1;let c=!1,l=[];for(let f of d)f.includes("%f")&&(c=!0),!(o===""&&f.includes("%n"))&&l.push(f.replaceAll("%f",i).replaceAll("%n",o));c||l.push(i);try{let f=yA(a,l,{detached:!0,stdio:"ignore",cwd:this.sessionbar.cwd});f.on("error",p=>{this.notify(`open file failed: ${p.message}`)}),f.unref();let u=s===null?i:`${i}:${s}`;this.notify(`opening ${u}`)}catch(f){this.notify(`open file failed: ${f.message}`)}return!0}schedulePendingBlockClick(e,n){if(!this.onBlockClick)return;if(this.openFileCommand===null){this.onBlockClick(e,n);return}this.cancelPendingBlockClick();let s=this.onBlockClick,r=setTimeout(()=>{this.pendingBlockClick=null,s(e,n)},Nl);typeof r.unref=="function"&&r.unref(),this.pendingBlockClick={timer:r,key:e,rowOffset:n}}cancelPendingBlockClick(){this.pendingBlockClick!==null&&(clearTimeout(this.pendingBlockClick.timer),this.pendingBlockClick=null)}flushPendingBlockClick(){let e=this.pendingBlockClick;e!==null&&(clearTimeout(e.timer),this.pendingBlockClick=null,this.onBlockClick&&this.onBlockClick(e.key,e.rowOffset))}lineById(e){for(let n of this.lines)if(this.lineIds.get(n)===e)return n;return null}lineIndexById(e){for(let n=0;n<this.lines.length;n++){let s=this.lines[n];if(s&&this.lineIds.get(s)===e)return n}return-1}finalizeSelection(){let e=this.getSelectionText();e.length!==0&&Eg(e,{target:this.selectionClipboard}).then(n=>{if(n.ok){let s=e.length;this.notify(`copied ${s} char${s===1?"":"s"} to clipboard`)}else this.notify(`clipboard copy failed: ${n.reason}`)},n=>{this.notify(`clipboard copy failed: ${n.message}`)})}mouseCell(e){if(!e||typeof e!="object")return null;let n=e,s=Number(n.x),r=Number(n.y);return!Number.isFinite(s)||!Number.isFinite(r)?null:{x:s,y:r}}keyAtRow(e){let n=this.term.width,s=1,r=this.scrollbackVisibleRows();if(r<=0)return null;let i=e-s;if(i<0||i>=r)return null;let{rows:o}=this.wrapTail(n,r+this.scrollOffset),a=o.length-this.scrollOffset,d=Math.max(0,a-r),c=o.slice(d,a),l=Math.max(0,r-c.length),f=i-l;return f<0||f>=c.length?null:c[f]?.blockKey??null}resolveCellToSource(e,n){if(!Number.isFinite(e)||!Number.isFinite(n))return null;let s=this.term.width,r=1,i=this.scrollbackVisibleRows();if(i<=0)return null;let o=n-r;if(o<0||o>=i||e<1||e>s)return null;let{rows:a}=this.wrapTail(s,i+this.scrollOffset),d=a.length-this.scrollOffset,c=Math.max(0,d-i),l=a.slice(c,d),f=Math.max(0,i-l.length),u=o-f;if(u<0||u>=l.length)return null;let p=l[u];if(!p)return null;let m=this.wrapOrigin.get(p);if(!m)return null;let g=vs(p.prefix??""),y=e-1-g;if(y<0)return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset};let v=bd(p.bodyStyle)?kg(Vl(p.body),y):Sg(p.body,y);return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset+v}}scrollBy(e){if(e===0)return;this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let n=this.maxScrollOffset(),s=Math.min(n,Math.max(0,this.scrollOffset+e));s!==this.scrollOffset&&(this.scrollOffset=s,this.repaint())}scrollToBottom(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch(),this.scrollOffset!==0&&(this.scrollOffset=0,this.repaint())}scrollToTop(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let e=this.maxScrollOffset();this.scrollOffset!==e&&(this.scrollOffset=e,this.repaint())}isScrolledBack(){return this.scrollOffset>0}isScrollbackSearchActive(){return this.scrollbackSearch!==null}enterScrollbackSearch(){this.scrollbackSearch===null&&(this.scrollbackSearch={term:"",matchIndex:0,matches:[],baselineScroll:this.scrollOffset},this.scrollbackHighlight=null,this.repaint())}updateScrollbackSearchTerm(e){if(this.scrollbackSearch===null)return;let n=e.toLowerCase(),s=[];if(n.length>0)for(let r=this.lines.length-1;r>=0;r--){let i=this.lines[r];if(!i||i.body.length===0||i.ansi)continue;let o=i.body.toLowerCase(),a=[],d=0;for(;d<o.length;){let c=o.indexOf(n,d);if(c===-1)break;a.push(c),d=c+n.length}for(let c=a.length-1;c>=0;c--)s.push({lineIdx:r,col:a[c]})}this.scrollbackSearch.term=e,this.scrollbackSearch.matches=s,this.scrollbackSearch.matchIndex=0,this.scrollbackHighlight=n.length>0?n:null,s.length>0&&this.scrollToMatch(s[0]),this.repaint()}advanceScrollbackSearch(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return;let e=Math.min(this.scrollbackSearch.matches.length-1,this.scrollbackSearch.matchIndex+1);e!==this.scrollbackSearch.matchIndex&&(this.scrollbackSearch.matchIndex=e,this.scrollToMatch(this.scrollbackSearch.matches[e]),this.repaint())}retreatScrollbackSearch(){this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0||this.scrollbackSearch.matchIndex!==0&&(this.scrollbackSearch.matchIndex-=1,this.scrollToMatch(this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex]),this.repaint())}acceptScrollbackSearch(){this.scrollbackSearch!==null&&(this.scrollbackSearch=null,this.scrollbackHighlight=null,this.repaint())}cancelScrollbackSearch(){if(this.scrollbackSearch===null)return;let e=this.scrollbackSearch.baselineScroll;this.scrollbackSearch=null,this.scrollbackHighlight=null,this.scrollOffset=e,this.repaint()}scrollbackSearchTerm(){return this.scrollbackSearch?.term??""}currentMatchInfo(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return null;let e=this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex];if(!e)return null;let n=this.lines[e.lineIdx];if(!n)return null;let s=this.lineIds.get(n);return s===void 0?null:{lineId:s,col:e.col,length:this.scrollbackSearch.term.length}}activeMatchCol(e,n){if(!e||n===null)return null;let s=this.wrapOrigin.get(e);if(!s||s.sourceLineId!==n.lineId)return null;let r=n.col-s.sourceColOffset;return r<0||r>=e.body.length?null:r}scrollToMatch(e){let n=this.term.width,s=this.scrollbackVisibleRows();if(s<=0)return;let r=0;for(let l=this.lines.length-1;l>e.lineIdx;l--){let f=this.lines[l];f&&(r+=this.wrapOne(f,n).length)}let i=this.lines[e.lineIdx],o=0;if(i){let l=this.wrapOne(i,n),f=0;for(let u=0;u<l.length;u++){let p=l[u];if(!p)continue;let m=p.body.length;if(e.col<f+m){o=l.length-1-u;break}f+=m}}let a=r+o,d=Math.max(0,a-Math.floor(s/2)),c=this.maxScrollOffset();this.scrollOffset=Math.min(c,d)}scrollPageSize(){return Math.max(1,this.scrollbackVisibleRows()-2)}scrollbackVisibleRows(){let n=this.term.height-this.promptRows()-We-Je-Ze-Je-this.chipRows()-this.queuedRows()-this.completionRows()-this.btwOverlayRows();return Math.max(0,n-1+1)}maxScrollOffset(){let{rows:e}=this.wrapTail(this.term.width,Number.POSITIVE_INFINITY);return Math.max(0,e.length-this.scrollbackVisibleRows())}scheduleRepaint(){this.scheduler.schedule()}paintRow(e,n,s){this.started&&this.painter.paintRow(e,n,s)}repaint(){if(!this.started)return;if(this.repaintPaused>0){this.repaintPending=!0;return}this.scheduler.noteRepaintStart();let e=this.term.width,n=this.term.height;e<20||n<8||(this.painter.ensureSize(e,n),Be(()=>{this.term.hideCursor(),this.drawScrollback(),this.drawBtwOverlay(),this.drawCompletionZone(),this.drawQueuedZone(),this.drawAttachmentChipZone();let s=this.promptRows(),r=n-s-Ze-Je-We;this.drawSeparator(r),this.drawPrompt(),this.drawBanner(),this.drawSeparator(n-We),this.drawSessionbar(),this.placeCursor(),(this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt)&&this.term.hideCursor(!1),this.lastPromptRows=s}))}drawSessionbar(){let e=this.term.width,n=this.term.height,s=zl(this.sessionbar.sessionId),r=this.sessionbar.title?.trim(),i=kh(this.sessionbar.agent,this.sessionbar.model),o=je(this.sessionbar.cwd),a=Ng(this.sessionbar.usage),d=`sbar|${e}|${s}|${i}|${o}|${r??""}|${a??""}`;this.paintRow(n,d,()=>{let c=a?a.length+3:0,l=s.length+3+i.length+3+(r?3:0)+c,f=Math.max(8,e-l),u,p;if(r){let m=Math.min(r.length,8);u=Math.min(o.length,Math.max(8,f-m)),p=Math.max(0,f-u)}else p=0,u=f;if(this.term.yellow(s)(" \xB7 ").cyan.noFormat(i)(" \xB7 ").dim.noFormat(bt(o,u)),r&&this.term(" \xB7 ").bold.noFormat(bt(r,p)),this.term.eraseLineAfter(),a){let m=or(a),g=Math.max(1,e-m);this.term.moveTo(g,n).eraseLineAfter(),this.term.dim.noFormat(a)}})}drawSeparator(e){let n=this.term.width;this.paintRow(e,`sep|${n}`,()=>{this.term.dim("\u2500".repeat(n))})}buildBtwHeaderSegments(){let e=this.term.width,n="By the way",s="\u2500\u2500 ",r=this.btwOverlaySessionId?zl(this.btwOverlaySessionId):"",i=r?" \xB7 ":" ",o=Ng(this.btwOverlayUsage),a=o?` ${o} `:"",d=o?"\u2500\u2500":"",c=s.length+or(n)+i.length+or(r)+or(a)+d.length,l="\u2500".repeat(Math.max(0,e-c)),f=`${e}|${r}|${this.btwOverlayStatus}|${o??""}`;return{left:s,label:n,sidSep:i,sid:r,middle:l,usage:a,right:d,signature:f}}paintBtwHeader(e){switch(this.term.dim(e.left),this.btwOverlayStatus){case"busy":this.term.brightYellow(e.label);break;case"done":this.term(e.label);break;case"cancelled":case"errored":this.term.brightRed(e.label);break;default:this.term(e.label)}this.term.dim(e.sidSep),e.sid&&this.term.yellow(e.sid),this.term.dim(e.middle),e.usage&&this.term.dim.noFormat(e.usage),this.term.dim(e.right)}drawScrollback(){let e=this.term.width,n=1,s=this.scrollbackVisibleRows();if(s<=0)return;let{rows:r,exhausted:i}=this.wrapTail(e,s+this.scrollOffset);if(i){let u=Math.max(0,r.length-s);this.scrollOffset>u&&(this.scrollOffset=u)}let o=r.length-this.scrollOffset,a=Math.max(0,o-s),d=r.slice(a,o),c=Math.max(0,s-d.length),l=this.currentMatchInfo(),f=l?.length??0;this.selectionRenderBounds=this.selectionLineBounds()?.byId??null;for(let u=0;u<s;u++){let p=n+u,m=u-c,g=m>=0?d[m]:void 0,y=this.activeMatchCol(g,l),v=g?this.selectionRangeForChunk(g):null,b=Og("sb",e,g,this.scrollbackHighlight,y,v);this.paintRow(p,b,()=>{g&&this.writeFormattedLine(g,e,y,f,v)})}if(this.onBlockVisible&&this.pendingVisibleKeys.size>0){let u=new Set;for(let m of d)m.blockKey!==void 0&&u.add(m.blockKey);let p=[];for(let m of this.pendingVisibleKeys)u.has(m)&&p.push(m);for(let m of p)this.pendingVisibleKeys.delete(m),this.onBlockVisible(m)}}notifyWhenVisible(e){this.onBlockVisible&&(this.pendingVisibleKeys.add(e),this.scheduleRepaint())}queuedRows(){return Math.min(jl,this.queuedTexts.length)}chipRows(){return Math.min(Wl,this.attachments.length)}setAttachments(e){this.attachments.length===e.length&&this.attachments.every((n,s)=>n===e[s])||(this.attachments=[...e],this.repaint())}completionRows(){return this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt?0:Math.min(ql,this.completions.length)}drawCompletionZone(){let e=this.completionRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-We-Je-Ze,i=this.queuedRows(),o=this.chipRows(),d=r-1-i-o-e+1,c=0;for(let l of this.completions.slice(0,e))l.name.length>c&&(c=l.name.length);for(let l=0;l<e;l++){let f=d+l,u=this.completions[l],p=l===e-1&&this.completions.length>ql,m=this.completions.length-ql+1,g=u?p?`comp|${n}|overflow|${m}`:`comp|${n}|${c}|${u.name}|${u.description??""}`:`comp|${n}|empty`;this.paintRow(f,g,()=>{if(!u)return;if(p){this.term.dim(` + ${m} more match(es)`);return}let y=u.name.padEnd(c),v=u.description??"",b=n-y.length-4,k=b>0?bt(v,b):"";this.term(" ").brightCyan(y),k.length>0&&this.term(" ").dim(k)})}}drawAttachmentChipZone(){let e=this.chipRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),o=this.term.height-s-We-Je-Ze-1-e+1,a=this.isIterm2();for(let d=0;d<e;d++){let c=o+d,l=d===e-1&&this.attachments.length>Wl,f=this.attachments.length-Wl,u=this.attachments[d],p=u?`${u.name??"image"} \xB7 ${qt(u.sizeBytes)}`:"",m=l?`chip|${n}|overflow|${f}`:u?`chip|${n}|${a?"i":"t"}|${p}|${u.sizeBytes}`:`chip|${n}|empty`;this.paintRow(c,m,()=>{if(l){this.term.dim(` \u{1F4CE} + ${f+1} more attached`);return}u&&(this.term(" ").yellow(`\u{1F4CE} ${p}`),a&&(this.term(" "),this.writeIterm2Image(u.data,1)))})}}isIterm2(){let e=process.env;return e.LC_TERMINAL==="iTerm2"||e.TERM_PROGRAM==="iTerm.app"}writeIterm2Image(e,n){process.stdout.write(OA(e,n,!!process.env.TMUX))}drawQueuedZone(){let e=this.queuedRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-We-Je-Ze,i=this.chipRows(),a=r-1-i-e+1,d=this.dispatcher.state().queueIndex;for(let c=0;c<e;c++){let l=a+c,f=this.queuedTexts[c],u=c===e-1&&this.queuedTexts.length>jl,p=this.queuedTexts.length-jl,m=f===void 0?"":u?`+ ${p+1} more queued`:bt(DA(f),n-4),g=!u&&c===d,y=f===void 0?`queued|${n}|empty`:`queued|${n}|${g?"edit":u?"ovf":"row"}|${m}`;this.paintRow(l,y,()=>{if(f===void 0)return;let v=`\u23F3 ${m}`,b=v+" ".repeat(Math.max(0,n-1-v.length));g?this.term.bgBlue.brightYellow("\u25B8"):this.term.bgBlue(" "),this.term.bgBlue.brightWhite.noFormat(b)})}}drawPrompt(){if(this.permissionPrompt){this.drawPermissionPrompt();return}if(this.optionsPrompt){this.drawOptionsPrompt();return}if(this.confirmPrompt){this.drawConfirmPrompt();return}if(this.helpPrompt){this.drawHelpPrompt();return}if(this.readonly)return;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),o=this.term.height-i.rendered-Ze-Je-We+1,a=!1;for(let d=0;d<i.rendered;d++){let c=r[i.windowStart+d],l=o+d,f="wrap",u="";c&&(c.bufferIdx===0&&c.startCol===0?f="first":c.startCol===0&&(f="newline"),u=(s.buffer[c.bufferIdx]??"").slice(c.startCol,c.endCol));let p=c?`prompt|${this.term.width}|${f}|${u}`:`prompt|${this.term.width}|empty`;this.paintRow(l,p,()=>{c&&(f==="first"?a?this.term.dim("> "):this.term.brightWhite("> "):f==="newline"?this.term.dim("\xB7 "):this.term(" "),a?this.term.dim(u):this.term.noFormat(u))})}}drawConfirmPrompt(){let e=this.confirmPrompt;if(!e)return;let n=this.term.width,s=this.term.height-Jl-Ze-Je-We+1;this.paintRow(s,`confirm|q|${n}|${e.question}`,()=>{this.term.brightYellow(` ? ${bt(e.question,n-4)}`)}),this.paintRow(s+1,`confirm|h|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}drawHelpPrompt(){let e=this.helpPrompt;if(!e)return;let n=this.term.width,s=this.helpRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`help|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2753 ${bt(e.title,n-5)}`)});let a=Math.min(24,Math.max(...e.entries.map(d=>d===null?0:d[0].length),4));for(let d of e.entries){if(i>=r+s-1)break;if(d===null){o(`help|sep|${n}|${i}`,()=>{});continue}let[c,l]=d,f=c.padEnd(a);o(`help|e|${n}|${c}|${l}`,()=>{this.term(" "),this.term.brightCyan.noFormat(f),this.term.noFormat(` ${bt(l,n-2-a-1)}`)})}o(`help|hint|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}helpRows(){return this.helpPrompt?Math.min(xA,2+this.helpPrompt.entries.length):0}drawPermissionPrompt(){let e=this.permissionPrompt;if(!e)return;let n=this.term.width,s=this.permissionRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`perm|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u{1F512} ${bt(e.title,n-5)}`)});let a=e.detail&&e.detail.length>0?e.detail:"This action requires approval";o(`perm|sub|${n}|${a}`,()=>{this.term.dim(` ${bt(a,n-2)}`)}),o(`perm|q|${n}`,()=>{this.term(" Do you want to proceed?")});for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. ${bt(c.label,n-8)}`;o(`perm|o|${n}|${d}|${l?"1":"0"}|${c.label}`,()=>{l?this.term.brightYellow(u):this.term.dim(u)})}o(`perm|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter submit \xB7 Esc cancel \xB7 1\u20139 quick-pick")})}drawBanner(){let e=this.term.height-We-Je,n=this.term.width,s=this.banner.status==="busy"&&this.banner.elapsedMs!==void 0&&this.banner.elapsedMs>=1e3?In(this.banner.elapsedMs):"",r=this.bannerRightContent(),i=r?`${r.kind}|${r.text}`:"",o=this.banner.status==="busy"&&this.banner.stalled===!0,a=`bnr|${n}|${this.banner.status}|${s}|${o?"1":"0"}|${this.banner.queued}|${this.scrollOffset}|${this.banner.currentMode??""}|${this.banner.hint}|`+i;this.paintRow(e,a,()=>{let d=this.banner.status==="busy"?"\u25CF":"\u25CB";this.banner.status==="busy"?(o?this.term.brightRed(`${d} stalled`):this.term.brightYellow(`${d} ${this.banner.status}`),s&&this.term(" ").dim(s)):this.banner.status==="disconnected"?this.term.brightRed(`${d} ${this.banner.status}`):this.banner.status==="cold"?this.term.brightMagenta(`${d} ${this.banner.status}`):this.term.brightGreen(`${d} ${this.banner.status}`),this.banner.queued>0&&this.term(" \xB7 ").brightYellow(`${this.banner.queued} queued`),this.scrollOffset>0&&this.term(" \xB7 ").brightCyan(`\u2191 ${this.scrollOffset}`);let c=this.banner.currentMode?this.banner.hint.replace("\u21E7\u21E5 mode",`\u21E7\u21E5 mode: ${this.banner.currentMode}`):this.banner.hint;if(this.term(" \xB7 ").dim(c),this.term.eraseLineAfter(),r){let l=or(r.text),f=Math.max(1,n-l);this.term.moveTo(f,e).eraseLineAfter(),r.kind==="search"?this.term.brightCyan.noFormat(r.text):this.term.brightYellow.noFormat(r.text)}})}placeCursor(){if(!this.started)return;if(this.permissionPrompt){let l=this.permissionRows(),u=this.term.height-l-Ze-Je-We+1+3+this.permissionPrompt.selectedIndex,p=this.term.height-Ze-Je-We;this.term.moveTo(2,Math.min(u,p));return}if(this.optionsPrompt){let l=this.optionsRows(),u=this.term.height-l-Ze-Je-We+1+1+this.optionsPrompt.selectedIndex,p=this.term.height-Ze-Je-We;this.term.moveTo(2,Math.min(u,p));return}if(this.confirmPrompt){let l=this.term.height-Jl-Ze-Je-We+1;this.term.moveTo(2,l);return}if(this.helpPrompt){let l=this.helpRows(),f=this.term.height-l-Ze-Je-We+1;this.term.moveTo(2,f);return}if(this.scrollbackSearch){this.term.hideCursor(!0);return}if(this.readonly){this.term.hideCursor(!0);return}this.term.hideCursor(!1);let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),a=this.term.height-i.rendered-Ze-Je-We+1+Math.max(0,i.cursorVisualRow-i.windowStart),d=i.cursorVisualCol+3,c=this.term.height-Ze-Je-We;this.term.moveTo(Math.min(d,this.term.width),Math.min(a,c))}promptRows(){if(this.permissionPrompt)return this.permissionRows();if(this.optionsPrompt)return this.optionsRows();if(this.confirmPrompt)return Jl;if(this.helpPrompt)return this.helpRows();if(this.readonly)return 0;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n);return Math.min(Ul,Math.max(1,r.length))}permissionRows(){return this.permissionPrompt?Math.min(SA,4+this.permissionPrompt.options.length):0}optionsRows(){return this.optionsPrompt?Math.min(kA,2+this.optionsPrompt.options.length):0}drawOptionsPrompt(){let e=this.optionsPrompt;if(!e)return;let n=this.term.width,s=this.optionsRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`opts|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2699 ${bt(e.title,n-5)}`)});let a=Math.max(...e.options.map(d=>d.label.length),0);for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. `,p=c.label.padEnd(a),m=n-u.length-3,g=`${u}${bt(`${p} ${c.value}`,m)}`;o(`opts|o|${n}|${d}|${l?"1":"0"}|${c.value}|${c.label}`,()=>{l?this.term.brightYellow(g):this.term.dim(g)})}o(`opts|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter this session \xB7 s save default \xB7 Esc close")})}btwOverlayRows(){return!this.btwOverlayOpen||this.btwOverlayLines.length===0?0:Math.min(this.btwOverlayMaxHeight,1+this.btwOverlayLines.length)}drawBtwOverlay(){if(!this.btwOverlayOpen)return;let e=this.btwOverlayRows();if(e===0)return;let n=this.term.width,r=this.term.height-this.promptRows()-Ze-Je-We,i=this.chipRows()+this.queuedRows()+this.completionRows(),a=r-1-i-e+1,d=e-1,c=a,l=this.buildBtwHeaderSegments();this.paintRow(c,`btw|h|${l.signature}`,()=>{this.paintBtwHeader(l)});for(let f=0;f<d;f++){let u=c+1+f,p=this.btwOverlayLines.length-d+f,m=p>=0?this.btwOverlayLines[p]:void 0,g=Og(`btw|c${f}`,n,m);this.paintRow(u,g,()=>{m?this.writeFormattedLine(m,n):this.term.noFormat(" ".repeat(n))})}}wrapTail(e,n){let s=c=>c.collapsed===!0||this.hideThoughts&&c.bodyStyle==="thought";if(e<=4){let c=[];for(let f of this.lines)s(f)||c.push(f);let l=Math.min(n,c.length);return{rows:c.slice(c.length-l),exhausted:n>=c.length}}if(this.wrapCacheWidth!==e&&(this.wrapCache.clear(),this.wrapCacheWidth=e),n<=0||this.lines.length===0)return{rows:[],exhausted:!0};let r=[],i=0,o=0,a=!1;for(let c=this.lines.length-1;c>=0;c--){let l=this.lines[c];if(s(l)){c===0&&(a=!0);continue}let f=this.wrapOne(l,e);if(r.push(f),i+=f.length,o=c,i>=n)break}let d=[];for(let c=r.length-1;c>=0;c--)d.push(...r[c]);return{rows:d,exhausted:o===0||a}}wrapOne(e,n){let s=this.lineIds.get(e);if(s!==void 0){let f=this.wrapCache.get(s);if(f)return f}let r=e.prefix??"",i=vs(r),o=Math.max(1,n-i),a=bd(e.bodyStyle),d=e.ansi?PA(e.body,o):FA(e.body,o,{stripMarkup:a}),c=[],l=0;for(let f=0;f<d.length;f++){let u=d[f]??"",p={prefix:f===0?e.prefix:" ".repeat(i),body:u};if(e.prefixStyle!==void 0&&(p.prefixStyle=e.prefixStyle),e.bodyStyle!==void 0&&(p.bodyStyle=e.bodyStyle),e.blockKey!==void 0&&(p.blockKey=e.blockKey),e.fillRow&&(p.fillRow=!0),e.ansi&&(p.ansi=!0),f===0&&e.iterm2Image&&(p.iterm2Image=e.iterm2Image),s!==void 0&&u.length>0){let m=e.body.indexOf(u,l),g=m===-1?l:m;this.wrapOrigin.set(p,{sourceLineId:s,sourceColOffset:g}),l=g+u.length}c.push(p)}return s!==void 0&&this.wrapCache.set(s,c),c}writeFormattedLine(e,n,s=null,r=0,i=null){e.prefix&&Wn(this.term,e.prefix,e.prefixStyle??e.bodyStyle);let o=Math.max(0,n-vs(e.prefix??"")),a=bd(e.bodyStyle),d=e.ansi?e.body:bt(e.body,o,{stripMarkup:a}),c=(l,f)=>{if(l.length!==0)if(this.scrollbackHighlight!==null&&!e.ansi){let u=s!==null&&s>=f?s-f:null;Fg(this.term,l,e.bodyStyle,this.scrollbackHighlight,u,r)}else Wn(this.term,l,e.bodyStyle)};if(i!==null&&!e.ansi){let l=Math.max(0,Math.min(d.length,i.start)),f=Math.max(l,Math.min(d.length,i.end));c(d.slice(0,l),0),f>l&&Wn(this.term,d.slice(l,f),"selection-highlight"),c(d.slice(f),f)}else this.scrollbackHighlight!==null&&!e.ansi?Fg(this.term,d,e.bodyStyle,this.scrollbackHighlight,s,r):Wn(this.term,d,e.bodyStyle);if(e.fillRow){let l=e.ansi?or(d):vs(d),f=o-l;if(f>0){let u=i!==null&&i.toEndOfLine?"selection-highlight":e.bodyStyle;Wn(this.term," ".repeat(f),u)}}(e.ansi||e.body.includes("^"))&&this.term.styleReset(),e.iterm2Image&&this.isIterm2()&&this.writeIterm2Image(e.iterm2Image.data,e.iterm2Image.heightCells)}};Hg=/[^\x20-\x7e]/,Kl=new Intl.Segmenter(void 0,{granularity:"grapheme"}),Ug=!1;MA=/[a-zA-Z+\-:_!#/]/;zl=ze});function HA(t,e,n=xd){if(e.kind==="cancel")return{kind:"cancel"};if(e.kind==="back")return{kind:"back"};if(e.kind==="enter"){let s=n[t];return s?{kind:"resolve",action:s.key}:{kind:"back"}}if(e.kind==="up")return{kind:"continue",selected:Math.max(0,t-1)};if(e.kind==="down")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(e.kind==="char"){let s=e.ch.toLowerCase();if(s==="n")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(s==="p")return{kind:"continue",selected:Math.max(0,t-1)};let r=n.findIndex(i=>i.hotkey.toLowerCase()===s);if(r>=0){let i=n[r];if(i)return{kind:"resolve",action:i.key}}}return{kind:"continue",selected:t}}async function Jg(t,e){Un();let n=ze(e.sessionId),s=e.importedFromMachine??"another machine",r=je(e.cwd),i=xd.findIndex(a=>a.key==="view");i<0&&(i=0);let o=()=>{let d=7+xd.length*2+2,c=jn(t,{contentHeight:d,title:"Imported session"}),l=c.contentW,f=[{label:"session: ",value:n},{label:"from: ",value:s},{label:"cwd: ",value:r}],u=0;for(let p of f)t.moveTo(c.contentX,c.contentY+u),t.dim.noFormat(` ${p.label}`),t.noFormat(Xe(p.value,l-p.label.length-2)),u++;return u++,zg(t,c,u,{intro:"What do you want to do?",choices:xd,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 f/v jump \xB7 Esc back"}),c};return ys({term:t,render:o,onKey:(a,d,c,l)=>{let f=UA(a,c);if(!f)return;let u=HA(i,f);if(u.kind==="cancel"){l("cancel");return}if(u.kind==="back"){l("back");return}if(u.kind==="resolve"){l(u.action);return}u.selected!==i&&(i=u.selected,o())}})}function zg(t,e,n,s){let r=e.contentW,i=n;t.moveTo(e.contentX,e.contentY+i),t.noFormat(` ${s.intro}`),i+=2;for(let o=0;o<s.choices.length;o++){let a=s.choices[o];if(!a)continue;let c=` ${o===s.selected?"\u276F":" "} ${a.label}`;t.moveTo(e.contentX,e.contentY+i),o===s.selected?t.brightWhite.bgBlue.noFormat(rd(c,r)):t.noFormat(c),i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${a.description}`),i++}i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${s.footer}`)}function UA(t,e){return t==="UP"?{kind:"up"}:t==="DOWN"?{kind:"down"}:t==="ENTER"||t==="KP_ENTER"?{kind:"enter"}:t==="ESCAPE"?{kind:"back"}:t==="CTRL_C"||t==="CTRL_D"?{kind:"cancel"}:e?.isCharacter?{kind:"char",ch:t}:null}async function Kg(t,e,n){let s=ze(e.sessionId),r=e.title??je(e.cwd),i=1,o=[{label:"Launch",hotkey:"l",description:"start a new agent session"},{label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}],a=()=>{let d=jn(t,{contentHeight:11,title:"Open session"}),c=d.contentW,l=0;t.moveTo(d.contentX,d.contentY+l),t.dim.noFormat(" session: "),t.noFormat(Xe(s,c-10)),l++,t.moveTo(d.contentX,d.contentY+l),t.noFormat(" "+Xe(r,c-2)),l++,l++,zg(t,d,l,{intro:"What do you want to do?",choices:o,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 l/v jump \xB7 Esc back"})};return a(),t.hideCursor(),await new Promise(d=>{let c=!1,l=()=>{c=!0},f=p=>{l(),n.pop(),d(p)},u=(p,m,g)=>{if(p==="CTRL_C"||p==="CTRL_D"){f("cancel");return}if(p==="ESCAPE"){f("back");return}if(p==="ENTER"||p==="KP_ENTER"){f(i===0?"launch":"view");return}if(p==="UP"||p==="SHIFT_TAB"){i>0&&(i--,a());return}if(p==="DOWN"||p==="TAB"){i<o.length-1&&(i++,a());return}if(g?.isCharacter){let y=p.toLowerCase();if(y==="l"){f("launch");return}if(y==="v"){f("view");return}if(y==="n"){i<o.length-1&&(i++,a());return}if(y==="p"){i>0&&(i--,a());return}}};n.push({onKey:(p,m,g)=>{c||u(p,m,g)},onResize:()=>{c||a()}})})}var xd,Gl=q(()=>{"use strict";ge();hn();ci();xd=[{key:"fork-local",label:"Fork locally",hotkey:"f",description:"spawn a local fork \u2014 original imported copy stays as-is"},{key:"view",label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}]});function wo(t){if(t.length===0)return"";let e=t[0]??"";for(let n=1;n<t.length;n++){let s=t[n]??"",r=0;for(;r<e.length&&r<s.length&&e[r]===s[r];)r+=1;if(e=e.slice(0,r),e.length===0)break}return e}function Vg(t){let{matches:e,firstLine:n}=t;if(e.length===0)return null;let s=n.indexOf(" "),r=s===-1?n:n.slice(0,s),i=s===-1?"":n.slice(s);if(e.length===1){let a=e[0]??"",d=i.startsWith(" ")?"":" ";return a+d+i}let o=wo(e);return o.length<=r.length?null:o+i}var Ad=q(()=>{"use strict"});import*as Yg from"os";async function ar(t,e,n={}){let s=n.defaultCwd??(e?await mg(e.cwd):void 0)??Yg.homedir();Un();let r=n.title??"Fork locally \u2014 choose cwd",i=n.intro??"Pick a local cwd for this session:",o=e?[{label:"session: ",value:ze(e.sessionId)},...e.importedFromMachine?[{label:"from: ",value:e.importedFromMachine}]:[],{label:"cwd: ",value:je(e.cwd)}]:[],a=s,d=null,c=!1,l=null,f=()=>{let g=o.length+6;l=jn(t,{contentHeight:g,title:r});let y=l.contentW,v=0;for(let b of o)t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(` ${b.label}`),t.noFormat(Xe(b.value,y-b.label.length-2)),v++;v++,t.moveTo(l.contentX,l.contentY+v),t.noFormat(` ${i}`),v+=2,p(v),v+=2,d!==null?(t.moveTo(l.contentX,l.contentY+v),t.red.noFormat(` ${Xe(d,y-2)}`)):(t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear"))},u=()=>o.length+3,p=g=>{if(!l)return;let y=g??u();t.moveTo(l.contentX,l.contentY+y).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+y),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+y),t.bold.noFormat(" cwd: ");let v=l.contentW-6-2;t.noFormat(jA(a,v)),c||t.bgWhite(" ")},m=()=>{if(p(),!l)return;let g=u()+2;t.moveTo(l.contentX,l.contentY+g).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+g),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+g),d!==null?t.red.noFormat(` ${Xe(d,l.contentW-2)}`):t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear")};return ys({term:t,render:f,hideCursor:!1,onKey:(g,y,v,b)=>{if(!c){if(g==="ENTER"||g==="KP_ENTER"){let k=a;c=!0,d=null,m(),po(k).then(R=>{if(c=!1,R.ok){b({kind:"ok",path:R.path});return}d=R.reason,m()});return}if(g==="ESCAPE"){b({kind:"back"});return}if(g==="CTRL_C"||g==="CTRL_D"){b({kind:"cancel"});return}if(g==="TAB"){c=!0,gg(a).then(k=>{if(c=!1,k.matches.length===0)return;let R;if(k.matches.length===1)R=k.prefix+k.matches[0];else{let H=wo(k.matches);if(H.length<=k.basePrefix.length)return;R=k.prefix+H}R!==a&&(a=R,d=null,m())});return}if(g==="BACKSPACE"){a.length>0&&(a=a.slice(0,-1),d=null,m());return}if(g==="CTRL_U"){a="",d=null,m();return}if(g==="CTRL_W"){let k=a.replace(/[/\s]+$/,""),R=Math.max(k.lastIndexOf("/"),k.lastIndexOf(" "));a=R>=0?k.slice(0,R+1):"",d=null,m();return}if(v?.isCharacter){a+=g,d=null,m();return}}}})}function jA(t,e){return e<=1?"":t.length<=e?t:"\u2026"+t.slice(t.length-(e-1))}var Ql=q(()=>{"use strict";ge();hn();Cl();Ad();ci()});function Zl(){return{filters:{cwdOnly:!1,hostFilter:"__local",includeNonInteractive:!1}}}async function eu(t,e){let n=()=>{process.stdout.write(er),process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(ii),process.stdout.write(oi),process.stdout.write(ai),process.stdout.write(Zs),process.stdout.write("\x1B>")};n();let s=e.prefs??Zl();e.prefs===void 0&&e.currentSessionId!==void 0&&e.sessions.find(E=>E.sessionId===e.currentSessionId)?.importedFromMachine&&(s.filters.hostFilter="__all");let r=e.cwd,i=Rd(e.sessions,r),o=C=>{let E=C;return s.filters.cwdOnly&&(E=E.filter($=>$.cwd===r)),s.filters.includeNonInteractive||(E=E.filter($=>$.interactive===!0)),E=KA(E,s.filters.hostFilter),E},a=o(i),d={columns:e.config.tui.sessionColumns??Gr,cwdMaxWidth:e.config.tui.cwdColumnMaxWidth},c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,u=0,p=0;if(e.currentSessionId!==void 0){let C=a.findIndex(E=>E.sessionId===e.currentSessionId);C>=0&&(u=C+1)}let m=!1,g="",y=120,v=!1,b=0,k="normal",R=null,H=!1,z="input",K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Y=null,te=!1,Z="",ee=null,Q=!1,oe=new qn({history:[]});e.initialPrompt&&oe.setBuffer(e.initialPrompt);let Oe=e.config.tui.promptHistoryMaxEntries;Hi(M.globalTuiHistoryFile()).then(C=>{let E=C.length>Oe?C.slice(C.length-Oe):C;oe.setHistory(E)}).catch(()=>{});let j=new pi(t),ue=sr(t),_e=Xt(t),$e=0,kn="",ks=0,Ot=[],nt=1,zn=0,Kn=0,xn=0,dr="",mi=[],be=1,gi=0,yi=[],at=1,An=0,xs=0,wi=0,cr=()=>{ue=sr(t),_e=Xt(t);let C=Math.max(10,_e-Xl);ks=Math.max(10,_e-Gg);let E=Math.max(10,_e-8);kn=zA(r,E);let $=oe.state();Ot=Jn($.buffer,ks);let X=Is(Ot,$,Cd);nt=X.rendered,zn=X.windowStart,Kn=X.cursorVisualRow,xn=X.cursorVisualCol;let ie=6+nt,Ue=Math.max(3,ue-ie);$e=Math.min(a.length,Ue),dr=hs(Qr,l,C,d).padEnd(C),mi=c.map(xe=>hs(xe,l,C,d).padEnd(C))},vo=()=>{c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,cr()},ve=()=>{let C=o(i);m&&g.length>0?a=C.filter(E=>YA(E,g)):a=C,vo(),m?(p=0,u=a.length>0?1:0):u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke()},At=C=>{if(C!==void 0){let E=a.findIndex($=>$.sessionId===C);if(E>=0){u=E+1,Ke();return}}u=a.length>0?1:0,p=0,Ke()},Ke=()=>{if(u===0)return;let C=u-1;C<p?p=C:C>=p+$e?p=C-$e+1:p+$e>a.length&&(p=Math.max(0,a.length-$e))},Zt=()=>Math.max(2,_e-2),Vn=()=>{let C=Zt(),E=`\u2500 ${kn} `,$=Math.max(1,C-E.length),X="\u2500".repeat($);u===0?t.brightBlue.noFormat(`\u256D${E}${X}\u256E`):t.dim.noFormat(`\u256D${E}${X}\u256E`)},lr=()=>{let C=Zt(),E="\u2500".repeat(C);u===0?t.brightBlue.noFormat(`\u2570${E}\u256F`):t.dim.noFormat(`\u2570${E}\u256F`)},As=C=>{let E=Ot[C];return E?(oe.state().buffer[E.bufferIdx]??"").slice(E.startCol,E.endCol):""},Cs=C=>{let E=Zt(),$=As(C),X=Math.max(0,E-1-$.length),ie=" ".repeat(X);u===0?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.dim.noFormat("\u2502"))},Yn=C=>{let E=mi[C]??"",$=a[C],X=$&&$.priority&&$.priority>0?"* ":" ";u===C+1?t.brightWhite.bgBlue.noFormat(`${X}${E}`):t.noFormat(`${X}${E}`)},ur=()=>{let C=p,E=Math.max(0,a.length-p-$e),$=[];return s.filters.cwdOnly&&$.push("cwd-only"),s.filters.hostFilter!=="__all"&&$.push(s.filters.hostFilter==="__local"?"host: local":`host: ${s.filters.hostFilter}`),s.filters.includeNonInteractive&&$.push("+non-interactive"),C>0&&$.push(`\u2191 ${C} above`),E>0&&$.push(`\u2193 ${E} below`),$.length===0?"":` ${$.join(" \xB7 ")}`},en=C=>ze(C),bi=()=>{let C=R?`${R.sessionId}|${R.status}`:"";return["ind",k,C,Z,ee??"",m?`1|${g}|${a.length}`:"0",ur()].join("")},Ie=()=>{Be(()=>{j.paintRow(Wt(),bi(),()=>{if(k==="confirm-kill"&&R)t.brightYellow.noFormat(` kill ${en(R.sessionId)}? [y/N]`);else if(k==="confirm-delete"&&R)R.status==="live"?t.brightRed.noFormat(` kill + delete ${en(R.sessionId)}? [y/N]`):t.brightRed.noFormat(` delete ${en(R.sessionId)}? [y/N]`);else if(k==="busy"&&R)t.dim.noFormat(` working on ${en(R.sessionId)}\u2026`);else if(k==="rename"&&R)t.brightYellow.noFormat(` title: ${Z}`),t.bgBrightYellow(" "),t.dim.noFormat(" Enter saves \xB7 Esc cancels");else if(ee!==null)t.dim.noFormat(` ${ee}`);else if(m){t.brightYellow.noFormat(` /${g}`),t.bgBrightYellow(" ");let C=a.length===0?" no matches":` ${a.length} match${a.length===1?"":"es"}`;t.dim.noFormat(`${C} \xB7 ^c clears`)}else t.dim.noFormat(ur())})})},tn=C=>be+1+C,fr=()=>be+nt+1,Ve=()=>be+nt+3,Ft=C=>Ve()+1+(C-p),Wt=()=>Ve()+1+$e,he=()=>{let C=Kn-zn;if(C<0||C>=nt)return;let E=3+xn;t.moveTo(E,tn(C))},vi=()=>`ct|${u===0?"f":"u"}|${Zt()}|${kn}`,Gn=()=>`cb|${u===0?"f":"u"}|${Zt()}`,ft=C=>`cbb|${u===0?"f":"u"}|${Zt()}|${As(C)}`,Rs=()=>`h|${dr}`,Cn=C=>{let E=a[C],$=E&&E.priority&&E.priority>0?"* ":" ",X=mi[C]??"";return`sr|${u===C+1?"1":"0"}|${$}${X}`},I=()=>{Be(()=>{t.hideCursor(),cr(),Ke(),be=1,j.ensureSize(_e,ue),j.paintRow(be,vi(),()=>{Vn()});for(let C=0;C<nt;C++){let E=zn+C;j.paintRow(tn(C),ft(E),()=>{Cs(E)})}j.paintRow(fr(),Gn(),()=>{lr()}),j.paintRow(fr()+1,"blank",()=>{}),j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=p+C,$=Ve()+1+C;E<a.length?j.paintRow($,Cn(E),()=>{Yn(E)}):j.paintRow($,"blank",()=>{})}Ie(),j.paintRow(Wt()+1,"blank",()=>{}),u===0&&(he(),t.hideCursor(!1))})},Ii=()=>{j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),I()},Io=()=>{Be(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(" Picker hotkeys")(`
135
+ `)}selectionLineBounds(){let e=this.selection;if(e===null)return null;let n=this.lineIndexById(e.startLineId),s=this.lineIndexById(e.endLineId);if(n===-1||s===-1)return null;let r=n,i=s,o=e.startOffset,a=e.endOffset;n>s&&(r=s,i=n,o=e.endOffset,a=e.startOffset);let d=new Map;for(let c=r;c<=i;c++){let l=this.lines[c];if(!l)continue;let f=this.lineIds.get(l);if(f===void 0)continue;let u=(l.body??"").length,p=c===r?Math.max(0,Math.min(u,o)):0,m=c===i?Math.max(0,Math.min(u,a)):u;d.set(f,{start:p,end:m,toEnd:c<i})}return{loIdx:r,hiIdx:i,byId:d}}selectionRangeForChunk(e){if(this.selection===null||e.ansi)return null;let n=this.selectionRenderBounds??this.selectionLineBounds()?.byId??null;if(n===null)return null;let s=this.wrapOrigin.get(e);if(!s)return null;let r=n.get(s.sourceLineId);if(!r)return null;let i=s.sourceColOffset,o=i+e.body.length,a=Math.max(r.start,i),d=Math.min(r.end,o);return d<=a?null:{start:a-i,end:d-i,toEndOfLine:r.toEnd||r.end>o}}setBannerSearchIndicator(e){this.bannerSearchIndicator!==e&&(this.bannerSearchIndicator=e,this.syncedPartialRepaint(()=>this.drawBanner()))}bannerRightContent(){if(this.scrollbackSearch!==null){let e=this.scrollbackSearch,n=e.matches.length>0?` ${e.matchIndex+1}/${e.matches.length}`:e.term.length===0?"":" 0/0";return{text:`\u{1F50D} ${e.term}${n}`,kind:"search"}}return this.bannerSearchIndicator!==null?{text:`\u{1F50D} ${this.bannerSearchIndicator}`,kind:"search"}:this.bannerNotification!==null?{text:this.bannerNotification,kind:"notify"}:null}clearScrollback(){this.lines=[],this.keyedBlocks.clear(),this.wrapCache.clear(),this.wrapCacheWidth=0,this.streamingActive=!1,this.scrollOffset=0,this.selection!==null&&(this.selection=null),this.repaint()}invalidateSelectionIfTouches(e){if(this.selection!==null)for(let n of e){let s=this.lineIds.get(n);if(s!==void 0&&(s===this.selection.startLineId||s===this.selection.endLineId)){this.selection=null;return}}}setHideThoughts(e){this.hideThoughts!==e&&(this.hideThoughts=e,this.repaint())}clearKey(e){this.keyedBlocks.delete(e)}hasKey(e){return this.keyedBlocks.has(e)}removeKey(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count,r=s>=this.lines.length,i=this.wrappedRowsOfMany(this.lines.slice(n.start,s)),o=this.lines.splice(n.start,n.count);for(let a of o)this.forgetLine(a);this.invalidateSelectionIfTouches(o),this.keyedBlocks.delete(e);for(let[a,d]of this.keyedBlocks)a!==e&&d.start>n.start&&(d.start-=n.count);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(-i),this.moveStickyToEnd(),this.scheduleRepaint()}setStickyBottomKey(e){this.stickyBottomKey=e,this.moveStickyToEnd(),this.scheduleRepaint()}moveStickyToEnd(){if(this.stickyBottomKey===null)return;let e=this.keyedBlocks.get(this.stickyBottomKey);if(!e)return;let n=e.start+e.count;if(n>=this.lines.length)return;let s=this.lines.splice(e.start,e.count);for(let[r,i]of this.keyedBlocks)r!==this.stickyBottomKey&&i.start>=n&&(i.start-=e.count);e.start=this.lines.length,this.lines.push(...s),this.streamingActive=!1}removeBlock(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count>=this.lines.length,r=this.wrappedRowsOfMany(this.lines.slice(n.start,n.start+n.count)),i=this.lines.splice(n.start,n.count);for(let o of i)this.forgetLine(o);this.invalidateSelectionIfTouches(i),this.keyedBlocks.delete(e);for(let[,o]of this.keyedBlocks)o.start>n.start&&(o.start-=n.count);s&&(this.streamingActive=!1),this.adjustScrollForRowChange(-r),this.scheduleRepaint()}contiguousRun(e,n){if(!this.keyedBlocks.has(e))return[];let s=[...n].map(d=>{let c=this.keyedBlocks.get(d);return c?{key:d,start:c.start,count:c.count}:null}).filter(d=>d!==null).sort((d,c)=>d.start-c.start),r=s.findIndex(d=>d.key===e);if(r<0)return[];let i=(d,c)=>{for(let[l,f]of this.keyedBlocks)if(!n.has(l)&&f.start>=d&&f.start<c)return!0;return!1},o=r;for(;o>0&&!i(s[o-1].start+s[o-1].count,s[o].start);)o--;let a=r;for(;a<s.length-1&&!i(s[a].start+s[a].count,s[a+1].start);)a++;return s.slice(o,a+1).map(d=>d.key)}setRunCollapsed(e,n,s){if(e.length===0)return;let r=e[0];if(!this.keyedBlocks.has(r))return;this.upsertLines(r,s);let i=this.keyedBlocks.get(r),o=i.start+i.count;for(let a of e){let d=this.keyedBlocks.get(a);d&&(o=Math.max(o,d.start+d.count))}for(let a=i.start+i.count;a<o;a++){let d=this.lines[a];d&&(d.collapsed=n)}this.scheduleRepaint()}redraw(){this.repaint()}fullRedraw(){this.painter.clearCache(),this.lastWindowTitle=null,this.wrapCache.clear(),this.wrapCacheWidth=0,process.stdout.write(yl),this.term.clear(),this.repaint()}pauseRepaint(){this.repaintPaused+=1}resumeRepaint(){this.repaintPaused!==0&&(this.repaintPaused-=1,this.repaintPaused===0&&this.repaintPending&&(this.repaintPending=!1,this.repaint()))}setQueuedPrompts(e){this.queuedTexts=[...e],this.lastQueueEditingIndex=this.dispatcher.state().queueIndex,this.repaint()}repaintNow(){this.repaint()}setPermissionPrompt(e){e!==null&&this.permissionPrompt===null&&this.clearSelection(),this.permissionPrompt=e?{...e}:null,this.repaint()}setOptionsPrompt(e){e!==null&&this.optionsPrompt===null&&this.clearSelection(),this.optionsPrompt=e?{...e,options:e.options.map(n=>({...n}))}:null,this.repaint()}isOptionsPromptActive(){return this.optionsPrompt!==null}setConfirmPrompt(e){e!==null&&this.confirmPrompt===null&&this.clearSelection(),this.confirmPrompt=e?{...e}:null,this.repaint()}setHelpPrompt(e){e!==null&&this.helpPrompt===null&&this.clearSelection(),this.helpPrompt=e?{...e,entries:[...e.entries]}:null,this.repaint()}isHelpPromptActive(){return this.helpPrompt!==null}openBtwOverlay(e){let n=e?.height??12;this.btwOverlayOpen=!0,this.btwOverlayMaxHeight=n,this.focusedPane="btw",this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.scheduleRepaint()}setBtwOverlayMeta(e){let n=!1;if(e.sessionId!==void 0&&this.btwOverlaySessionId!==e.sessionId&&(this.btwOverlaySessionId=e.sessionId,n=!0),e.usage!==void 0){let s=this.btwOverlayUsage,r=e.usage;(!s||s.used!==r.used||s.size!==r.size||s.costAmount!==r.costAmount||s.costCurrency!==r.costCurrency)&&(this.btwOverlayUsage={...r},n=!0)}n&&this.scheduleRepaint()}setBtwOverlayContent(e){if(this.btwOverlayLines.length===e.length){let n=!0;for(let s=0;s<e.length;s++)if(this.btwOverlayLines[s]!==e[s]){n=!1;break}if(n)return}this.btwOverlayLines=[...e],this.scheduleRepaint()}setBtwOverlayStatus(e){let n=this.btwOverlayLabel===e.label,s=this.btwOverlayStatus===e.style;n&&s||(this.btwOverlayLabel=e.label,this.btwOverlayStatus=e.style,this.scheduleRepaint())}closeBtwOverlay(){this.btwOverlayOpen&&(this.btwOverlayOpen=!1,this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.focusedPane="main",this.scheduleRepaint())}toggleFocusedPane(){this.focusedPane=this.focusedPane==="main"?"btw":"main",this.scheduleRepaint()}getFocusedPane(){return this.focusedPane}isOverlayOpen(){return this.btwOverlayOpen}setCompletions(e){e.length===this.completions.length&&e.every((s,r)=>{let i=this.completions[r];return i!==void 0&&i.name===s.name&&i.description===s.description})||(this.completions=[...e],this.repaint())}ensureSeparator(e){if(this.lines.length===0)return;let n=this.stickyBottomKey!==null?this.keyedBlocks.get(this.stickyBottomKey):void 0,s=n!==void 0&&n.start+n.count===this.lines.length,r=s?n.start-1:this.lines.length-1;if(r<0)return;let i=this.lines[r];if(i&&i.body===""&&(i.prefix===void 0||i.prefix===""))return;let o={body:""};e!==void 0&&(o.bodyStyle=e),s?(this.lines.splice(n.start,0,o),n.start+=1):this.lines.push(o),this.trackLine(o),this.streamingActive=!1,this.adjustScrollForRowChange(this.wrappedRowsOf(o)),this.trimScrollback(),this.scheduleRepaint()}refreshPrompt(){if(this.promptRows()!==this.lastPromptRows){this.repaint();return}this.syncedPartialRepaint(()=>{let e=this.dispatcher.state().queueIndex;e!==this.lastQueueEditingIndex&&(this.lastQueueEditingIndex=e,this.drawQueuedZone()),this.drawPrompt()})}handleKey(e,n){if(n.isCharacter){this.onKey([{type:"char",ch:e}]);return}if(e==="PAGE_UP"){this.scrollBy(this.scrollPageSize());return}if(e==="PAGE_DOWN"){this.scrollBy(-this.scrollPageSize());return}let s=kd(e);s&&this.onKey([{type:"key",name:s}])}handleMouse(e,n){if(e==="MOUSE_WHEEL_UP"){this.scrollBy(3);return}if(e==="MOUSE_WHEEL_DOWN"){this.scrollBy(-3);return}let s=this.mouseCell(n),r=EA(e),i=null;if(e==="MOUSE_DRAG"||e==="MOUSE_MOTION"?i="move":e.endsWith("_PRESSED")?i="press":e.endsWith("_RELEASED")&&(i="release"),i!==null&&s!==null&&this.onMouse&&this.onMouse({kind:i,button:r,x:s.x,y:s.y,name:e}),e==="MOUSE_LEFT_BUTTON_PRESSED"){let o=this.lastLeftClick;o!==null&&s!==null&&Math.abs(s.x-o.x)<=wd&&Math.abs(s.y-o.y)<=wd&&Date.now()-o.t<=Nl||this.flushPendingBlockClick(),this.pressCell=s,this.handleSelectionPress(s);return}if(e.endsWith("_PRESSED")&&e!=="MOUSE_LEFT_BUTTON_PRESSED"&&this.flushPendingBlockClick(),e==="MOUSE_DRAG"&&s!==null){this.handleSelectionDrag(s);return}if(e==="MOUSE_LEFT_BUTTON_RELEASED"||e==="MOUSE_BUTTON_RELEASED"){let o=this.pressCell;this.pressCell=null;let a=this.inAppSelectionEnabled&&(this.selectionDragStarted||this.doubleClickPending);if(this.onBlockClick&&o!==null&&s!==null&&s.x===o.x&&s.y===o.y&&!a){let d=this.keyAtRow(s.y);if(d!==null){let c=s.y;for(;c>1&&this.keyAtRow(c-1)===d;)c-=1;this.schedulePendingBlockClick(d,s.y-c)}}this.handleSelectionRelease(s)}}handleSelectionPress(e){if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,!this.inAppSelectionEnabled||e===null)return;let n=this.resolveCellToSource(e.x,e.y);if(n===null){this.lastLeftClick=null;return}this.selectionAnchor=n;let s=Date.now(),r=this.lastLeftClick;if(r!==null&&s-r.t<=Nl&&Math.abs(e.x-r.x)<=wd&&Math.abs(e.y-r.y)<=wd){if(this.cancelPendingBlockClick(),this.onBlockDoubleClick&&e!==null){let a=this.keyAtRow(e.y);if(a!==null){let d=e.y;for(;d>1&&this.keyAtRow(d-1)===a;)d-=1;let c=e.y-d;if(this.onBlockDoubleClick(a,c)){this.doubleClickPending=!0,this.lastLeftClick=null;return}}}if(this.tryOpenFileAt(n)){this.doubleClickPending=!0,this.lastLeftClick=null;return}let o=this.wordBoundsAt(n);o!==null&&(this.setSelection({sourceLineId:n.sourceLineId,offset:o.start},{sourceLineId:n.sourceLineId,offset:o.end}),this.doubleClickPending=!0),this.lastLeftClick=null}}handleSelectionDrag(e){if(!this.inAppSelectionEnabled||this.selectionAnchor===null||this.doubleClickPending)return;let n=this.resolveCellToSource(e.x,e.y);n!==null&&(this.selectionDragStarted=!0,this.setSelection(this.selectionAnchor,n))}handleSelectionRelease(e){let n=this.selectionDragStarted,s=this.doubleClickPending;if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,e!==null&&(this.lastLeftClick={x:e.x,y:e.y,t:Date.now()}),!!this.inAppSelectionEnabled){if(n||s){this.finalizeSelection();return}this.selection!==null&&this.clearSelection()}}wordBoundsAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let r=Math.max(0,Math.min(s.length-1,e.offset));if(e.offset>=s.length&&(r=s.length-1),!Dl.test(s[r]))return null;let i=r;for(;i>0&&Dl.test(s[i-1]);)i--;let o=r+1;for(;o<s.length&&Dl.test(s[o]);)o++;return{start:i,end:o}}pathTokenAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let{clean:r,rawToClean:i}=_A(s);if(r.length===0)return null;let o=i[Math.min(e.offset,i.length-1)]??r.length;if(n.links){for(let p of n.links)if(o>=p.start&&o<p.end){let m=p.url;return{raw:m.startsWith("file://")?m.slice(7):m,line:null}}}let a=Math.max(0,Math.min(r.length-1,o));if(o>=r.length&&(a=r.length-1),!Hl.test(r[a]))return null;let d=a;for(;d>0&&Hl.test(r[d-1]);)d--;let c=a+1;for(;c<r.length&&Hl.test(r[c]);)c++;let l=r.slice(d,c);if(l=l.replace(/[.]+$/,""),l.length===0)return null;let f=null,u=r.slice(c).match(/^:(\d+)(?::\d+)?/);return u&&(f=Number.parseInt(u[1],10)),{raw:l,line:f}}resolvePathToken(e){let n=e;(n==="~"||n.startsWith("~/"))&&(n=n==="~"?_g():`${_g()}/${n.slice(2)}`);let s=$g(n)||e.startsWith("~"),r=n.includes("/");if(!s&&!r)return null;let i=$g(n)?n:bA(this.sessionbar.cwd,n);if(s)return i;try{if(wA(i).isFile())return i}catch{return null}return null}tryOpenFileAt(e){if(this.openFileCommand===null)return!1;let n=this.pathTokenAt(e);if(n===null)return!1;let s=n.line===null?"":`:${n.line}`;return this.tryOpenPathString(n.raw+s)}tryOpenPathString(e){if(this.openFileCommand===null)return!1;let n=e,s=null,r=e.match(/^(.*?):(\d+)(?::\d+)?$/);r&&(n=r[1],s=Number.parseInt(r[2],10));let i=this.resolvePathToken(n);if(i===null)return!1;let o=s===null?"":String(s),[a,...d]=this.openFileCommand;if(!a)return!1;let c=!1,l=[];for(let f of d)f.includes("%f")&&(c=!0),!(o===""&&f.includes("%n"))&&l.push(f.replaceAll("%f",i).replaceAll("%n",o));c||l.push(i);try{let f=yA(a,l,{detached:!0,stdio:"ignore",cwd:this.sessionbar.cwd});f.on("error",p=>{this.notify(`open file failed: ${p.message}`)}),f.unref();let u=s===null?i:`${i}:${s}`;this.notify(`opening ${u}`)}catch(f){this.notify(`open file failed: ${f.message}`)}return!0}schedulePendingBlockClick(e,n){if(!this.onBlockClick)return;if(this.openFileCommand===null){this.onBlockClick(e,n);return}this.cancelPendingBlockClick();let s=this.onBlockClick,r=setTimeout(()=>{this.pendingBlockClick=null,s(e,n)},Nl);typeof r.unref=="function"&&r.unref(),this.pendingBlockClick={timer:r,key:e,rowOffset:n}}cancelPendingBlockClick(){this.pendingBlockClick!==null&&(clearTimeout(this.pendingBlockClick.timer),this.pendingBlockClick=null)}flushPendingBlockClick(){let e=this.pendingBlockClick;e!==null&&(clearTimeout(e.timer),this.pendingBlockClick=null,this.onBlockClick&&this.onBlockClick(e.key,e.rowOffset))}lineById(e){for(let n of this.lines)if(this.lineIds.get(n)===e)return n;return null}lineIndexById(e){for(let n=0;n<this.lines.length;n++){let s=this.lines[n];if(s&&this.lineIds.get(s)===e)return n}return-1}finalizeSelection(){let e=this.getSelectionText();e.length!==0&&Eg(e,{target:this.selectionClipboard}).then(n=>{if(n.ok){let s=e.length;this.notify(`copied ${s} char${s===1?"":"s"} to clipboard`)}else this.notify(`clipboard copy failed: ${n.reason}`)},n=>{this.notify(`clipboard copy failed: ${n.message}`)})}mouseCell(e){if(!e||typeof e!="object")return null;let n=e,s=Number(n.x),r=Number(n.y);return!Number.isFinite(s)||!Number.isFinite(r)?null:{x:s,y:r}}keyAtRow(e){let n=this.term.width,s=1,r=this.scrollbackVisibleRows();if(r<=0)return null;let i=e-s;if(i<0||i>=r)return null;let{rows:o}=this.wrapTail(n,r+this.scrollOffset),a=o.length-this.scrollOffset,d=Math.max(0,a-r),c=o.slice(d,a),l=Math.max(0,r-c.length),f=i-l;return f<0||f>=c.length?null:c[f]?.blockKey??null}resolveCellToSource(e,n){if(!Number.isFinite(e)||!Number.isFinite(n))return null;let s=this.term.width,r=1,i=this.scrollbackVisibleRows();if(i<=0)return null;let o=n-r;if(o<0||o>=i||e<1||e>s)return null;let{rows:a}=this.wrapTail(s,i+this.scrollOffset),d=a.length-this.scrollOffset,c=Math.max(0,d-i),l=a.slice(c,d),f=Math.max(0,i-l.length),u=o-f;if(u<0||u>=l.length)return null;let p=l[u];if(!p)return null;let m=this.wrapOrigin.get(p);if(!m)return null;let g=vs(p.prefix??""),y=e-1-g;if(y<0)return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset};let v=bd(p.bodyStyle)?kg(Vl(p.body),y):Sg(p.body,y);return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset+v}}scrollBy(e){if(e===0)return;this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let n=this.maxScrollOffset(),s=Math.min(n,Math.max(0,this.scrollOffset+e));s!==this.scrollOffset&&(this.scrollOffset=s,this.repaint())}scrollToBottom(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch(),this.scrollOffset!==0&&(this.scrollOffset=0,this.repaint())}scrollToTop(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let e=this.maxScrollOffset();this.scrollOffset!==e&&(this.scrollOffset=e,this.repaint())}isScrolledBack(){return this.scrollOffset>0}isScrollbackSearchActive(){return this.scrollbackSearch!==null}enterScrollbackSearch(){this.scrollbackSearch===null&&(this.scrollbackSearch={term:"",matchIndex:0,matches:[],baselineScroll:this.scrollOffset},this.scrollbackHighlight=null,this.repaint())}updateScrollbackSearchTerm(e){if(this.scrollbackSearch===null)return;let n=e.toLowerCase(),s=[];if(n.length>0)for(let r=this.lines.length-1;r>=0;r--){let i=this.lines[r];if(!i||i.body.length===0||i.ansi)continue;let o=i.body.toLowerCase(),a=[],d=0;for(;d<o.length;){let c=o.indexOf(n,d);if(c===-1)break;a.push(c),d=c+n.length}for(let c=a.length-1;c>=0;c--)s.push({lineIdx:r,col:a[c]})}this.scrollbackSearch.term=e,this.scrollbackSearch.matches=s,this.scrollbackSearch.matchIndex=0,this.scrollbackHighlight=n.length>0?n:null,s.length>0&&this.scrollToMatch(s[0]),this.repaint()}advanceScrollbackSearch(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return;let e=Math.min(this.scrollbackSearch.matches.length-1,this.scrollbackSearch.matchIndex+1);e!==this.scrollbackSearch.matchIndex&&(this.scrollbackSearch.matchIndex=e,this.scrollToMatch(this.scrollbackSearch.matches[e]),this.repaint())}retreatScrollbackSearch(){this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0||this.scrollbackSearch.matchIndex!==0&&(this.scrollbackSearch.matchIndex-=1,this.scrollToMatch(this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex]),this.repaint())}acceptScrollbackSearch(){this.scrollbackSearch!==null&&(this.scrollbackSearch=null,this.scrollbackHighlight=null,this.repaint())}cancelScrollbackSearch(){if(this.scrollbackSearch===null)return;let e=this.scrollbackSearch.baselineScroll;this.scrollbackSearch=null,this.scrollbackHighlight=null,this.scrollOffset=e,this.repaint()}scrollbackSearchTerm(){return this.scrollbackSearch?.term??""}currentMatchInfo(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return null;let e=this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex];if(!e)return null;let n=this.lines[e.lineIdx];if(!n)return null;let s=this.lineIds.get(n);return s===void 0?null:{lineId:s,col:e.col,length:this.scrollbackSearch.term.length}}activeMatchCol(e,n){if(!e||n===null)return null;let s=this.wrapOrigin.get(e);if(!s||s.sourceLineId!==n.lineId)return null;let r=n.col-s.sourceColOffset;return r<0||r>=e.body.length?null:r}scrollToMatch(e){let n=this.term.width,s=this.scrollbackVisibleRows();if(s<=0)return;let r=0;for(let l=this.lines.length-1;l>e.lineIdx;l--){let f=this.lines[l];f&&(r+=this.wrapOne(f,n).length)}let i=this.lines[e.lineIdx],o=0;if(i){let l=this.wrapOne(i,n),f=0;for(let u=0;u<l.length;u++){let p=l[u];if(!p)continue;let m=p.body.length;if(e.col<f+m){o=l.length-1-u;break}f+=m}}let a=r+o,d=Math.max(0,a-Math.floor(s/2)),c=this.maxScrollOffset();this.scrollOffset=Math.min(c,d)}scrollPageSize(){return Math.max(1,this.scrollbackVisibleRows()-2)}scrollbackVisibleRows(){let n=this.term.height-this.promptRows()-We-Je-Ze-Je-this.chipRows()-this.queuedRows()-this.completionRows()-this.btwOverlayRows();return Math.max(0,n-1+1)}maxScrollOffset(){let{rows:e}=this.wrapTail(this.term.width,Number.POSITIVE_INFINITY);return Math.max(0,e.length-this.scrollbackVisibleRows())}scheduleRepaint(){this.scheduler.schedule()}paintRow(e,n,s){this.started&&this.painter.paintRow(e,n,s)}repaint(){if(!this.started)return;if(this.repaintPaused>0){this.repaintPending=!0;return}this.scheduler.noteRepaintStart();let e=this.term.width,n=this.term.height;e<20||n<8||(this.painter.ensureSize(e,n),Be(()=>{this.term.hideCursor(),this.drawScrollback(),this.drawBtwOverlay(),this.drawCompletionZone(),this.drawQueuedZone(),this.drawAttachmentChipZone();let s=this.promptRows(),r=n-s-Ze-Je-We;this.drawSeparator(r),this.drawPrompt(),this.drawBanner(),this.drawSeparator(n-We),this.drawSessionbar(),this.placeCursor(),(this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt)&&this.term.hideCursor(!1),this.lastPromptRows=s}))}drawSessionbar(){let e=this.term.width,n=this.term.height,s=zl(this.sessionbar.sessionId),r=this.sessionbar.title?.trim(),i=kh(this.sessionbar.agent,this.sessionbar.model),o=je(this.sessionbar.cwd),a=Ng(this.sessionbar.usage),d=`sbar|${e}|${s}|${i}|${o}|${r??""}|${a??""}`;this.paintRow(n,d,()=>{let c=a?a.length+3:0,l=s.length+3+i.length+3+(r?3:0)+c,f=Math.max(8,e-l),u,p;if(r){let m=Math.min(r.length,8);u=Math.min(o.length,Math.max(8,f-m)),p=Math.max(0,f-u)}else p=0,u=f;if(this.term.yellow(s)(" \xB7 ").cyan.noFormat(i)(" \xB7 ").dim.noFormat(bt(o,u)),r&&this.term(" \xB7 ").bold.noFormat(bt(r,p)),this.term.eraseLineAfter(),a){let m=or(a),g=Math.max(1,e-m);this.term.moveTo(g,n).eraseLineAfter(),this.term.dim.noFormat(a)}})}drawSeparator(e){let n=this.term.width;this.paintRow(e,`sep|${n}`,()=>{this.term.dim("\u2500".repeat(n))})}buildBtwHeaderSegments(){let e=this.term.width,n="By the way",s="\u2500\u2500 ",r=this.btwOverlaySessionId?zl(this.btwOverlaySessionId):"",i=r?" \xB7 ":" ",o=Ng(this.btwOverlayUsage),a=o?` ${o} `:"",d=o?"\u2500\u2500":"",c=s.length+or(n)+i.length+or(r)+or(a)+d.length,l="\u2500".repeat(Math.max(0,e-c)),f=`${e}|${r}|${this.btwOverlayStatus}|${o??""}`;return{left:s,label:n,sidSep:i,sid:r,middle:l,usage:a,right:d,signature:f}}paintBtwHeader(e){switch(this.term.dim(e.left),this.btwOverlayStatus){case"busy":this.term.brightYellow(e.label);break;case"done":this.term(e.label);break;case"cancelled":case"errored":this.term.brightRed(e.label);break;default:this.term(e.label)}this.term.dim(e.sidSep),e.sid&&this.term.yellow(e.sid),this.term.dim(e.middle),e.usage&&this.term.dim.noFormat(e.usage),this.term.dim(e.right)}drawScrollback(){let e=this.term.width,n=1,s=this.scrollbackVisibleRows();if(s<=0)return;let{rows:r,exhausted:i}=this.wrapTail(e,s+this.scrollOffset);if(i){let u=Math.max(0,r.length-s);this.scrollOffset>u&&(this.scrollOffset=u)}let o=r.length-this.scrollOffset,a=Math.max(0,o-s),d=r.slice(a,o),c=Math.max(0,s-d.length),l=this.currentMatchInfo(),f=l?.length??0;this.selectionRenderBounds=this.selectionLineBounds()?.byId??null;for(let u=0;u<s;u++){let p=n+u,m=u-c,g=m>=0?d[m]:void 0,y=this.activeMatchCol(g,l),v=g?this.selectionRangeForChunk(g):null,b=Og("sb",e,g,this.scrollbackHighlight,y,v);this.paintRow(p,b,()=>{g&&this.writeFormattedLine(g,e,y,f,v)})}if(this.onBlockVisible&&this.pendingVisibleKeys.size>0){let u=new Set;for(let m of d)m.blockKey!==void 0&&u.add(m.blockKey);let p=[];for(let m of this.pendingVisibleKeys)u.has(m)&&p.push(m);for(let m of p)this.pendingVisibleKeys.delete(m),this.onBlockVisible(m)}}notifyWhenVisible(e){this.onBlockVisible&&(this.pendingVisibleKeys.add(e),this.scheduleRepaint())}queuedRows(){return Math.min(jl,this.queuedTexts.length)}chipRows(){return Math.min(Wl,this.attachments.length)}setAttachments(e){this.attachments.length===e.length&&this.attachments.every((n,s)=>n===e[s])||(this.attachments=[...e],this.repaint())}completionRows(){return this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt?0:Math.min(ql,this.completions.length)}drawCompletionZone(){let e=this.completionRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-We-Je-Ze,i=this.queuedRows(),o=this.chipRows(),d=r-1-i-o-e+1,c=0;for(let l of this.completions.slice(0,e))l.name.length>c&&(c=l.name.length);for(let l=0;l<e;l++){let f=d+l,u=this.completions[l],p=l===e-1&&this.completions.length>ql,m=this.completions.length-ql+1,g=u?p?`comp|${n}|overflow|${m}`:`comp|${n}|${c}|${u.name}|${u.description??""}`:`comp|${n}|empty`;this.paintRow(f,g,()=>{if(!u)return;if(p){this.term.dim(` + ${m} more match(es)`);return}let y=u.name.padEnd(c),v=u.description??"",b=n-y.length-4,k=b>0?bt(v,b):"";this.term(" ").brightCyan(y),k.length>0&&this.term(" ").dim(k)})}}drawAttachmentChipZone(){let e=this.chipRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),o=this.term.height-s-We-Je-Ze-1-e+1,a=this.isIterm2();for(let d=0;d<e;d++){let c=o+d,l=d===e-1&&this.attachments.length>Wl,f=this.attachments.length-Wl,u=this.attachments[d],p=u?`${u.name??"image"} \xB7 ${qt(u.sizeBytes)}`:"",m=l?`chip|${n}|overflow|${f}`:u?`chip|${n}|${a?"i":"t"}|${p}|${u.sizeBytes}`:`chip|${n}|empty`;this.paintRow(c,m,()=>{if(l){this.term.dim(` \u{1F4CE} + ${f+1} more attached`);return}u&&(this.term(" ").yellow(`\u{1F4CE} ${p}`),a&&(this.term(" "),this.writeIterm2Image(u.data,1)))})}}isIterm2(){let e=process.env;return e.LC_TERMINAL==="iTerm2"||e.TERM_PROGRAM==="iTerm.app"}writeIterm2Image(e,n){process.stdout.write(OA(e,n,!!process.env.TMUX))}drawQueuedZone(){let e=this.queuedRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-We-Je-Ze,i=this.chipRows(),a=r-1-i-e+1,d=this.dispatcher.state().queueIndex;for(let c=0;c<e;c++){let l=a+c,f=this.queuedTexts[c],u=c===e-1&&this.queuedTexts.length>jl,p=this.queuedTexts.length-jl,m=f===void 0?"":u?`+ ${p+1} more queued`:bt(DA(f),n-4),g=!u&&c===d,y=f===void 0?`queued|${n}|empty`:`queued|${n}|${g?"edit":u?"ovf":"row"}|${m}`;this.paintRow(l,y,()=>{if(f===void 0)return;let v=`\u23F3 ${m}`,b=v+" ".repeat(Math.max(0,n-1-v.length));g?this.term.bgBlue.brightYellow("\u25B8"):this.term.bgBlue(" "),this.term.bgBlue.brightWhite.noFormat(b)})}}drawPrompt(){if(this.permissionPrompt){this.drawPermissionPrompt();return}if(this.optionsPrompt){this.drawOptionsPrompt();return}if(this.confirmPrompt){this.drawConfirmPrompt();return}if(this.helpPrompt){this.drawHelpPrompt();return}if(this.readonly)return;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),o=this.term.height-i.rendered-Ze-Je-We+1,a=!1;for(let d=0;d<i.rendered;d++){let c=r[i.windowStart+d],l=o+d,f="wrap",u="";c&&(c.bufferIdx===0&&c.startCol===0?f="first":c.startCol===0&&(f="newline"),u=(s.buffer[c.bufferIdx]??"").slice(c.startCol,c.endCol));let p=c?`prompt|${this.term.width}|${f}|${u}`:`prompt|${this.term.width}|empty`;this.paintRow(l,p,()=>{c&&(f==="first"?a?this.term.dim("> "):this.term.brightWhite("> "):f==="newline"?this.term.dim("\xB7 "):this.term(" "),a?this.term.dim(u):this.term.noFormat(u))})}}drawConfirmPrompt(){let e=this.confirmPrompt;if(!e)return;let n=this.term.width,s=this.term.height-Jl-Ze-Je-We+1;this.paintRow(s,`confirm|q|${n}|${e.question}`,()=>{this.term.brightYellow(` ? ${bt(e.question,n-4)}`)}),this.paintRow(s+1,`confirm|h|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}drawHelpPrompt(){let e=this.helpPrompt;if(!e)return;let n=this.term.width,s=this.helpRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`help|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2753 ${bt(e.title,n-5)}`)});let a=Math.min(24,Math.max(...e.entries.map(d=>d===null?0:d[0].length),4));for(let d of e.entries){if(i>=r+s-1)break;if(d===null){o(`help|sep|${n}|${i}`,()=>{});continue}let[c,l]=d,f=c.padEnd(a);o(`help|e|${n}|${c}|${l}`,()=>{this.term(" "),this.term.brightCyan.noFormat(f),this.term.noFormat(` ${bt(l,n-2-a-1)}`)})}o(`help|hint|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}helpRows(){return this.helpPrompt?Math.min(xA,2+this.helpPrompt.entries.length):0}drawPermissionPrompt(){let e=this.permissionPrompt;if(!e)return;let n=this.term.width,s=this.permissionRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`perm|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u{1F512} ${bt(e.title,n-5)}`)});let a=e.detail&&e.detail.length>0?e.detail:"This action requires approval";o(`perm|sub|${n}|${a}`,()=>{this.term.dim(` ${bt(a,n-2)}`)}),o(`perm|q|${n}`,()=>{this.term(" Do you want to proceed?")});for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. ${bt(c.label,n-8)}`;o(`perm|o|${n}|${d}|${l?"1":"0"}|${c.label}`,()=>{l?this.term.brightYellow(u):this.term.dim(u)})}o(`perm|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter submit \xB7 Esc cancel \xB7 1\u20139 quick-pick")})}drawBanner(){let e=this.term.height-We-Je,n=this.term.width,s=this.banner.status==="busy"&&this.banner.elapsedMs!==void 0&&this.banner.elapsedMs>=1e3?In(this.banner.elapsedMs):"",r=this.bannerRightContent(),i=r?`${r.kind}|${r.text}`:"",o=this.banner.status==="busy"&&this.banner.stalled===!0,a=`bnr|${n}|${this.banner.status}|${s}|${o?"1":"0"}|${this.banner.queued}|${this.scrollOffset}|${this.banner.currentMode??""}|${this.banner.hint}|`+i;this.paintRow(e,a,()=>{let d=this.banner.status==="busy"?"\u25CF":"\u25CB";this.banner.status==="busy"?(o?this.term.brightRed(`${d} stalled`):this.term.brightYellow(`${d} ${this.banner.status}`),s&&this.term(" ").dim(s)):this.banner.status==="disconnected"?this.term.brightRed(`${d} ${this.banner.status}`):this.banner.status==="cold"?this.term.brightMagenta(`${d} ${this.banner.status}`):this.term.brightGreen(`${d} ${this.banner.status}`),this.banner.queued>0&&this.term(" \xB7 ").brightYellow(`${this.banner.queued} queued`),this.scrollOffset>0&&this.term(" \xB7 ").brightCyan(`\u2191 ${this.scrollOffset}`);let c=this.banner.currentMode?this.banner.hint.replace("\u21E7\u21E5 mode",`\u21E7\u21E5 mode: ${this.banner.currentMode}`):this.banner.hint;if(this.term(" \xB7 ").dim(c),this.term.eraseLineAfter(),r){let l=or(r.text),f=Math.max(1,n-l);this.term.moveTo(f,e).eraseLineAfter(),r.kind==="search"?this.term.brightCyan.noFormat(r.text):this.term.brightYellow.noFormat(r.text)}})}placeCursor(){if(!this.started)return;if(this.permissionPrompt){let l=this.permissionRows(),u=this.term.height-l-Ze-Je-We+1+3+this.permissionPrompt.selectedIndex,p=this.term.height-Ze-Je-We;this.term.moveTo(2,Math.min(u,p));return}if(this.optionsPrompt){let l=this.optionsRows(),u=this.term.height-l-Ze-Je-We+1+1+this.optionsPrompt.selectedIndex,p=this.term.height-Ze-Je-We;this.term.moveTo(2,Math.min(u,p));return}if(this.confirmPrompt){let l=this.term.height-Jl-Ze-Je-We+1;this.term.moveTo(2,l);return}if(this.helpPrompt){let l=this.helpRows(),f=this.term.height-l-Ze-Je-We+1;this.term.moveTo(2,f);return}if(this.scrollbackSearch){this.term.hideCursor(!0);return}if(this.readonly){this.term.hideCursor(!0);return}this.term.hideCursor(!1);let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),a=this.term.height-i.rendered-Ze-Je-We+1+Math.max(0,i.cursorVisualRow-i.windowStart),d=i.cursorVisualCol+3,c=this.term.height-Ze-Je-We;this.term.moveTo(Math.min(d,this.term.width),Math.min(a,c))}promptRows(){if(this.permissionPrompt)return this.permissionRows();if(this.optionsPrompt)return this.optionsRows();if(this.confirmPrompt)return Jl;if(this.helpPrompt)return this.helpRows();if(this.readonly)return 0;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n);return Math.min(Ul,Math.max(1,r.length))}permissionRows(){return this.permissionPrompt?Math.min(SA,4+this.permissionPrompt.options.length):0}optionsRows(){return this.optionsPrompt?Math.min(kA,2+this.optionsPrompt.options.length):0}drawOptionsPrompt(){let e=this.optionsPrompt;if(!e)return;let n=this.term.width,s=this.optionsRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`opts|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2699 ${bt(e.title,n-5)}`)});let a=Math.max(...e.options.map(d=>d.label.length),0);for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. `,p=c.label.padEnd(a),m=n-u.length-3,g=`${u}${bt(`${p} ${c.value}`,m)}`;o(`opts|o|${n}|${d}|${l?"1":"0"}|${c.value}|${c.label}`,()=>{l?this.term.brightYellow(g):this.term.dim(g)})}o(`opts|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter this session \xB7 s save default \xB7 Esc close")})}btwOverlayRows(){return!this.btwOverlayOpen||this.btwOverlayLines.length===0?0:Math.min(this.btwOverlayMaxHeight,1+this.btwOverlayLines.length)}drawBtwOverlay(){if(!this.btwOverlayOpen)return;let e=this.btwOverlayRows();if(e===0)return;let n=this.term.width,r=this.term.height-this.promptRows()-Ze-Je-We,i=this.chipRows()+this.queuedRows()+this.completionRows(),a=r-1-i-e+1,d=e-1,c=a,l=this.buildBtwHeaderSegments();this.paintRow(c,`btw|h|${l.signature}`,()=>{this.paintBtwHeader(l)});for(let f=0;f<d;f++){let u=c+1+f,p=this.btwOverlayLines.length-d+f,m=p>=0?this.btwOverlayLines[p]:void 0,g=Og(`btw|c${f}`,n,m);this.paintRow(u,g,()=>{m?this.writeFormattedLine(m,n):this.term.noFormat(" ".repeat(n))})}}wrapTail(e,n){let s=c=>c.collapsed===!0||this.hideThoughts&&c.bodyStyle==="thought";if(e<=4){let c=[];for(let f of this.lines)s(f)||c.push(f);let l=Math.min(n,c.length);return{rows:c.slice(c.length-l),exhausted:n>=c.length}}if(this.wrapCacheWidth!==e&&(this.wrapCache.clear(),this.wrapCacheWidth=e),n<=0||this.lines.length===0)return{rows:[],exhausted:!0};let r=[],i=0,o=0,a=!1;for(let c=this.lines.length-1;c>=0;c--){let l=this.lines[c];if(s(l)){c===0&&(a=!0);continue}let f=this.wrapOne(l,e);if(r.push(f),i+=f.length,o=c,i>=n)break}let d=[];for(let c=r.length-1;c>=0;c--)d.push(...r[c]);return{rows:d,exhausted:o===0||a}}wrapOne(e,n){let s=this.lineIds.get(e);if(s!==void 0){let f=this.wrapCache.get(s);if(f)return f}let r=e.prefix??"",i=vs(r),o=Math.max(1,n-i),a=bd(e.bodyStyle),d=e.ansi?PA(e.body,o):FA(e.body,o,{stripMarkup:a}),c=[],l=0;for(let f=0;f<d.length;f++){let u=d[f]??"",p={prefix:f===0?e.prefix:" ".repeat(i),body:u};if(e.prefixStyle!==void 0&&(p.prefixStyle=e.prefixStyle),e.bodyStyle!==void 0&&(p.bodyStyle=e.bodyStyle),e.blockKey!==void 0&&(p.blockKey=e.blockKey),e.fillRow&&(p.fillRow=!0),e.ansi&&(p.ansi=!0),f===0&&e.iterm2Image&&(p.iterm2Image=e.iterm2Image),s!==void 0&&u.length>0){let m=e.body.indexOf(u,l),g=m===-1?l:m;this.wrapOrigin.set(p,{sourceLineId:s,sourceColOffset:g}),l=g+u.length}c.push(p)}return s!==void 0&&this.wrapCache.set(s,c),c}writeFormattedLine(e,n,s=null,r=0,i=null){e.prefix&&Wn(this.term,e.prefix,e.prefixStyle??e.bodyStyle);let o=Math.max(0,n-vs(e.prefix??"")),a=bd(e.bodyStyle),d=e.ansi?e.body:bt(e.body,o,{stripMarkup:a}),c=(l,f)=>{if(l.length!==0)if(this.scrollbackHighlight!==null&&!e.ansi){let u=s!==null&&s>=f?s-f:null;Fg(this.term,l,e.bodyStyle,this.scrollbackHighlight,u,r)}else Wn(this.term,l,e.bodyStyle)};if(i!==null&&!e.ansi){let l=Math.max(0,Math.min(d.length,i.start)),f=Math.max(l,Math.min(d.length,i.end));c(d.slice(0,l),0),f>l&&Wn(this.term,d.slice(l,f),"selection-highlight"),c(d.slice(f),f)}else this.scrollbackHighlight!==null&&!e.ansi?Fg(this.term,d,e.bodyStyle,this.scrollbackHighlight,s,r):Wn(this.term,d,e.bodyStyle);if(e.fillRow){let l=e.ansi?or(d):vs(d),f=o-l;if(f>0){let u=i!==null&&i.toEndOfLine?"selection-highlight":e.bodyStyle;Wn(this.term," ".repeat(f),u)}}(e.ansi||e.body.includes("^"))&&this.term.styleReset(),e.iterm2Image&&this.isIterm2()&&this.writeIterm2Image(e.iterm2Image.data,e.iterm2Image.heightCells)}};Hg=/[^\x20-\x7e]/,Kl=new Intl.Segmenter(void 0,{granularity:"grapheme"}),Ug=!1;MA=/[a-zA-Z+\-:_!#/]/;zl=ze});function HA(t,e,n=xd){if(e.kind==="cancel")return{kind:"cancel"};if(e.kind==="back")return{kind:"back"};if(e.kind==="enter"){let s=n[t];return s?{kind:"resolve",action:s.key}:{kind:"back"}}if(e.kind==="up")return{kind:"continue",selected:Math.max(0,t-1)};if(e.kind==="down")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(e.kind==="char"){let s=e.ch.toLowerCase();if(s==="n")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(s==="p")return{kind:"continue",selected:Math.max(0,t-1)};let r=n.findIndex(i=>i.hotkey.toLowerCase()===s);if(r>=0){let i=n[r];if(i)return{kind:"resolve",action:i.key}}}return{kind:"continue",selected:t}}async function Jg(t,e){Un();let n=ze(e.sessionId),s=e.importedFromMachine??"another machine",r=je(e.cwd),i=xd.findIndex(a=>a.key==="view");i<0&&(i=0);let o=()=>{let d=7+xd.length*2+2,c=jn(t,{contentHeight:d,title:"Imported session"}),l=c.contentW,f=[{label:"session: ",value:n},{label:"from: ",value:s},{label:"cwd: ",value:r}],u=0;for(let p of f)t.moveTo(c.contentX,c.contentY+u),t.dim.noFormat(` ${p.label}`),t.noFormat(Xe(p.value,l-p.label.length-2)),u++;return u++,zg(t,c,u,{intro:"What do you want to do?",choices:xd,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 f/v jump \xB7 Esc back"}),c};return ys({term:t,render:o,onKey:(a,d,c,l)=>{let f=UA(a,c);if(!f)return;let u=HA(i,f);if(u.kind==="cancel"){l("cancel");return}if(u.kind==="back"){l("back");return}if(u.kind==="resolve"){l(u.action);return}u.selected!==i&&(i=u.selected,o())}})}function zg(t,e,n,s){let r=e.contentW,i=n;t.moveTo(e.contentX,e.contentY+i),t.noFormat(` ${s.intro}`),i+=2;for(let o=0;o<s.choices.length;o++){let a=s.choices[o];if(!a)continue;let c=` ${o===s.selected?"\u276F":" "} ${a.label}`;t.moveTo(e.contentX,e.contentY+i),o===s.selected?t.brightWhite.bgBlue.noFormat(rd(c,r)):t.noFormat(c),i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${a.description}`),i++}i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${s.footer}`)}function UA(t,e){return t==="UP"?{kind:"up"}:t==="DOWN"?{kind:"down"}:t==="ENTER"||t==="KP_ENTER"?{kind:"enter"}:t==="ESCAPE"?{kind:"back"}:t==="CTRL_C"||t==="CTRL_D"?{kind:"cancel"}:e?.isCharacter?{kind:"char",ch:t}:null}async function Kg(t,e,n){let s=ze(e.sessionId),r=e.title??je(e.cwd),i=1,o=[{label:"Launch",hotkey:"l",description:"start a new agent session"},{label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}],a=()=>{let d=jn(t,{contentHeight:11,title:"Open session"}),c=d.contentW,l=0;t.moveTo(d.contentX,d.contentY+l),t.dim.noFormat(" session: "),t.noFormat(Xe(s,c-10)),l++,t.moveTo(d.contentX,d.contentY+l),t.noFormat(" "+Xe(r,c-2)),l++,l++,zg(t,d,l,{intro:"What do you want to do?",choices:o,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 l/v jump \xB7 Esc back"})};return a(),t.hideCursor(),await new Promise(d=>{let c=!1,l=()=>{c=!0},f=p=>{l(),n.pop(),d(p)},u=(p,m,g)=>{if(p==="CTRL_C"||p==="CTRL_D"){f("cancel");return}if(p==="ESCAPE"){f("back");return}if(p==="ENTER"||p==="KP_ENTER"){f(i===0?"launch":"view");return}if(p==="UP"||p==="SHIFT_TAB"){i>0&&(i--,a());return}if(p==="DOWN"||p==="TAB"){i<o.length-1&&(i++,a());return}if(g?.isCharacter){let y=p.toLowerCase();if(y==="l"){f("launch");return}if(y==="v"){f("view");return}if(y==="n"){i<o.length-1&&(i++,a());return}if(y==="p"){i>0&&(i--,a());return}}};n.push({onKey:(p,m,g)=>{c||u(p,m,g)},onResize:()=>{c||a()}})})}var xd,Gl=q(()=>{"use strict";ge();hn();ci();xd=[{key:"fork-local",label:"Fork locally",hotkey:"f",description:"spawn a local fork \u2014 original imported copy stays as-is"},{key:"view",label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}]});function wo(t){if(t.length===0)return"";let e=t[0]??"";for(let n=1;n<t.length;n++){let s=t[n]??"",r=0;for(;r<e.length&&r<s.length&&e[r]===s[r];)r+=1;if(e=e.slice(0,r),e.length===0)break}return e}function Vg(t){let{matches:e,firstLine:n}=t;if(e.length===0)return null;let s=n.indexOf(" "),r=s===-1?n:n.slice(0,s),i=s===-1?"":n.slice(s);if(e.length===1){let a=e[0]??"",d=i.startsWith(" ")?"":" ";return a+d+i}let o=wo(e);return o.length<=r.length?null:o+i}var Ad=q(()=>{"use strict"});import*as Yg from"os";async function ar(t,e,n={}){let s=n.defaultCwd??(e?await mg(e.cwd):void 0)??Yg.homedir();Un();let r=n.title??"Fork locally \u2014 choose cwd",i=n.intro??"Pick a local cwd for this session:",o=e?[{label:"session: ",value:ze(e.sessionId)},...e.importedFromMachine?[{label:"from: ",value:e.importedFromMachine}]:[],{label:"cwd: ",value:je(e.cwd)}]:[],a=s,d=null,c=!1,l=null,f=()=>{let g=o.length+6;l=jn(t,{contentHeight:g,title:r});let y=l.contentW,v=0;for(let b of o)t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(` ${b.label}`),t.noFormat(Xe(b.value,y-b.label.length-2)),v++;v++,t.moveTo(l.contentX,l.contentY+v),t.noFormat(` ${i}`),v+=2,p(v),v+=2,d!==null?(t.moveTo(l.contentX,l.contentY+v),t.red.noFormat(` ${Xe(d,y-2)}`)):(t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear"))},u=()=>o.length+3,p=g=>{if(!l)return;let y=g??u();t.moveTo(l.contentX,l.contentY+y).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+y),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+y),t.bold.noFormat(" cwd: ");let v=l.contentW-6-2;t.noFormat(jA(a,v)),c||t.bgWhite(" ")},m=()=>{if(p(),!l)return;let g=u()+2;t.moveTo(l.contentX,l.contentY+g).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+g),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+g),d!==null?t.red.noFormat(` ${Xe(d,l.contentW-2)}`):t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear")};return ys({term:t,render:f,hideCursor:!1,onKey:(g,y,v,b)=>{if(!c){if(g==="ENTER"||g==="KP_ENTER"){let k=a;c=!0,d=null,m(),po(k).then(R=>{if(c=!1,R.ok){b({kind:"ok",path:R.path});return}d=R.reason,m()});return}if(g==="ESCAPE"){b({kind:"back"});return}if(g==="CTRL_C"||g==="CTRL_D"){b({kind:"cancel"});return}if(g==="TAB"){c=!0,gg(a).then(k=>{if(c=!1,k.matches.length===0)return;let R;if(k.matches.length===1)R=k.prefix+k.matches[0];else{let H=wo(k.matches);if(H.length<=k.basePrefix.length)return;R=k.prefix+H}R!==a&&(a=R,d=null,m())});return}if(g==="BACKSPACE"){a.length>0&&(a=a.slice(0,-1),d=null,m());return}if(g==="CTRL_U"){a="",d=null,m();return}if(g==="CTRL_W"){let k=a.replace(/[/\s]+$/,""),R=Math.max(k.lastIndexOf("/"),k.lastIndexOf(" "));a=R>=0?k.slice(0,R+1):"",d=null,m();return}if(v?.isCharacter){a+=g,d=null,m();return}}}})}function jA(t,e){return e<=1?"":t.length<=e?t:"\u2026"+t.slice(t.length-(e-1))}var Ql=q(()=>{"use strict";ge();hn();Cl();Ad();ci()});function Zl(){return{filters:{cwdOnly:!1,hostFilter:"__local",includeNonInteractive:!1}}}async function eu(t,e){let n=()=>{process.stdout.write(er),process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(ii),process.stdout.write(oi),process.stdout.write(ai),process.stdout.write(Zs),process.stdout.write("\x1B>")};n();let s=e.prefs??Zl();e.prefs===void 0&&e.currentSessionId!==void 0&&e.sessions.find(E=>E.sessionId===e.currentSessionId)?.importedFromMachine&&(s.filters.hostFilter="__all");let r=e.cwd,i=Rd(e.sessions,r),o=C=>{let E=C;return s.filters.cwdOnly&&(E=E.filter($=>$.cwd===r)),s.filters.includeNonInteractive||(E=E.filter($=>$.interactive===!0)),E=KA(E,s.filters.hostFilter),E},a=o(i),d={columns:e.config.tui.sessionColumns??Gr,cwdMaxWidth:e.config.tui.cwdColumnMaxWidth},c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,u=0,p=0;if(e.currentSessionId!==void 0){let C=a.findIndex(E=>E.sessionId===e.currentSessionId);C>=0&&(u=C+1)}let m=!1,g="",y=120,v=!1,b=0,k="normal",R=null,H=!1,z="input",K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Y=null,te=!1,Z="",ee=null,Q=!1,oe=new qn({history:[]});e.initialPrompt&&oe.setBuffer(e.initialPrompt);let Oe=e.config.tui.promptHistoryMaxEntries;Hi(M.globalTuiHistoryFile()).then(C=>{let E=C.length>Oe?C.slice(C.length-Oe):C;oe.setHistory(E)}).catch(()=>{});let j=new pi(t),ce=sr(t),_e=Xt(t),$e=0,kn="",ks=0,Ot=[],nt=1,zn=0,Kn=0,xn=0,dr="",mi=[],be=1,gi=0,yi=[],at=1,An=0,xs=0,wi=0,cr=()=>{ce=sr(t),_e=Xt(t);let C=Math.max(10,_e-Xl);ks=Math.max(10,_e-Gg);let E=Math.max(10,_e-8);kn=zA(r,E);let $=oe.state();Ot=Jn($.buffer,ks);let X=Is(Ot,$,Cd);nt=X.rendered,zn=X.windowStart,Kn=X.cursorVisualRow,xn=X.cursorVisualCol;let ie=6+nt,Ue=Math.max(3,ce-ie);$e=Math.min(a.length,Ue),dr=hs(Qr,l,C,d).padEnd(C),mi=c.map(xe=>hs(xe,l,C,d).padEnd(C))},vo=()=>{c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,cr()},ve=()=>{let C=o(i);m&&g.length>0?a=C.filter(E=>YA(E,g)):a=C,vo(),m?(p=0,u=a.length>0?1:0):u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke()},At=C=>{if(C!==void 0){let E=a.findIndex($=>$.sessionId===C);if(E>=0){u=E+1,Ke();return}}u=a.length>0?1:0,p=0,Ke()},Ke=()=>{if(u===0)return;let C=u-1;C<p?p=C:C>=p+$e?p=C-$e+1:p+$e>a.length&&(p=Math.max(0,a.length-$e))},Zt=()=>Math.max(2,_e-2),Vn=()=>{let C=Zt(),E=`\u2500 ${kn} `,$=Math.max(1,C-E.length),X="\u2500".repeat($);u===0?t.brightBlue.noFormat(`\u256D${E}${X}\u256E`):t.dim.noFormat(`\u256D${E}${X}\u256E`)},lr=()=>{let C=Zt(),E="\u2500".repeat(C);u===0?t.brightBlue.noFormat(`\u2570${E}\u256F`):t.dim.noFormat(`\u2570${E}\u256F`)},As=C=>{let E=Ot[C];return E?(oe.state().buffer[E.bufferIdx]??"").slice(E.startCol,E.endCol):""},Cs=C=>{let E=Zt(),$=As(C),X=Math.max(0,E-1-$.length),ie=" ".repeat(X);u===0?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.dim.noFormat("\u2502"))},Yn=C=>{let E=mi[C]??"",$=a[C],X=$&&$.priority&&$.priority>0?"* ":" ";u===C+1?t.brightWhite.bgBlue.noFormat(`${X}${E}`):t.noFormat(`${X}${E}`)},ur=()=>{let C=p,E=Math.max(0,a.length-p-$e),$=[];return s.filters.cwdOnly&&$.push("cwd-only"),s.filters.hostFilter!=="__all"&&$.push(s.filters.hostFilter==="__local"?"host: local":`host: ${s.filters.hostFilter}`),s.filters.includeNonInteractive&&$.push("+non-interactive"),C>0&&$.push(`\u2191 ${C} above`),E>0&&$.push(`\u2193 ${E} below`),$.length===0?"":` ${$.join(" \xB7 ")}`},en=C=>ze(C),bi=()=>{let C=R?`${R.sessionId}|${R.status}`:"";return["ind",k,C,Z,ee??"",m?`1|${g}|${a.length}`:"0",ur()].join("")},Ie=()=>{Be(()=>{j.paintRow(Wt(),bi(),()=>{if(k==="confirm-kill"&&R)t.brightYellow.noFormat(` kill ${en(R.sessionId)}? [y/N]`);else if(k==="confirm-delete"&&R)R.status==="live"?t.brightRed.noFormat(` kill + delete ${en(R.sessionId)}? [y/N]`):t.brightRed.noFormat(` delete ${en(R.sessionId)}? [y/N]`);else if(k==="busy"&&R)t.dim.noFormat(` working on ${en(R.sessionId)}\u2026`);else if(k==="rename"&&R)t.brightYellow.noFormat(` title: ${Z}`),t.bgBrightYellow(" "),t.dim.noFormat(" Enter saves \xB7 Esc cancels");else if(ee!==null)t.dim.noFormat(` ${ee}`);else if(m){t.brightYellow.noFormat(` /${g}`),t.bgBrightYellow(" ");let C=a.length===0?" no matches":` ${a.length} match${a.length===1?"":"es"}`;t.dim.noFormat(`${C} \xB7 ^c clears`)}else t.dim.noFormat(ur())})})},tn=C=>be+1+C,fr=()=>be+nt+1,Ve=()=>be+nt+3,Ft=C=>Ve()+1+(C-p),Wt=()=>Ve()+1+$e,he=()=>{let C=Kn-zn;if(C<0||C>=nt)return;let E=3+xn;t.moveTo(E,tn(C))},vi=()=>`ct|${u===0?"f":"u"}|${Zt()}|${kn}`,Gn=()=>`cb|${u===0?"f":"u"}|${Zt()}`,ft=C=>`cbb|${u===0?"f":"u"}|${Zt()}|${As(C)}`,Rs=()=>`h|${dr}`,Cn=C=>{let E=a[C],$=E&&E.priority&&E.priority>0?"* ":" ",X=mi[C]??"";return`sr|${u===C+1?"1":"0"}|${$}${X}`},I=()=>{Be(()=>{t.hideCursor(),cr(),Ke(),be=1,j.ensureSize(_e,ce),j.paintRow(be,vi(),()=>{Vn()});for(let C=0;C<nt;C++){let E=zn+C;j.paintRow(tn(C),ft(E),()=>{Cs(E)})}j.paintRow(fr(),Gn(),()=>{lr()}),j.paintRow(fr()+1,"blank",()=>{}),j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=p+C,$=Ve()+1+C;E<a.length?j.paintRow($,Cn(E),()=>{Yn(E)}):j.paintRow($,"blank",()=>{})}Ie();for(let C=Wt()+1;C<=ce;C++)j.paintRow(C,"blank",()=>{});u===0&&(he(),t.hideCursor(!1))})},Ii=()=>{j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),I()},Io=()=>{Be(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(" Picker hotkeys")(`
136
136
 
137
137
  `);for(let C of JA){if(C===null){t(`
138
138
  `);continue}let[E,$]=C;t.brightCyan.noFormat(` ${E.padEnd(WA)}`),t.noFormat($)(`
139
139
  `)}t(`
140
140
  `),t.dim.noFormat(" press any key to dismiss")(`
141
- `)})},vt=()=>at+4,pr=2,Fe=0,nn=()=>{ue=sr(t);let C=Math.max(2,ue-(at+3)-pr);return Math.max(1,Math.floor(C/2))},So=()=>{let C=nn();F<Fe?Fe=F:F>=Fe+C&&(Fe=F-C+1),Fe+C>J.length&&(Fe=Math.max(0,J.length-C)),Fe<0&&(Fe=0)},ko=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500 Find sessions ",X="\u2500".repeat(Math.max(1,E-$.length));C?t.brightBlue.noFormat(`\u256D${$}${X}\u256E`):t.dim.noFormat(`\u256D${$}${X}\u256E`),t.styleReset()},Qn=()=>{_e=Xt(t),gi=Math.max(10,_e-Gg);let C=K.state();yi=Jn(C.buffer,gi);let E=Is(yi,C,qA);at=E.rendered,An=E.windowStart,xs=E.cursorVisualRow,wi=E.cursorVisualCol},sn=(C,E)=>{_e=Xt(t);let $=Math.max(2,_e-2),X=yi[C],ie="";X&&(ie=(K.state().buffer[X.bufferIdx]??"").slice(X.startCol,X.endCol));let Ue=Math.max(0,$-1-ie.length),xe=" ".repeat(Ue);E?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${ie}${xe}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${ie}${xe}`),t.dim.noFormat("\u2502")),t.styleReset()},Si=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500".repeat(E);C?t.brightBlue.noFormat(`\u2570${$}\u256F`):t.dim.noFormat(`\u2570${$}\u256F`),t.styleReset()},Ts=()=>3+wi,Es=()=>2+(xs-An),ki=()=>{let C=z==="input";Be(()=>{C&&t.hideCursor(),t.moveTo(1,1),ko(C);for(let E=0;E<at;E++)t.moveTo(1,2+E),sn(An+E,C);t.moveTo(1,2+at),Si(C),C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},xo=()=>{Be(()=>{t.hideCursor();for(let C=0;C<at;C++)t.moveTo(1,2+C),sn(An+C,!0);t.moveTo(Ts(),Es()),t.hideCursor(!1)})},Ed={user:"user",agent:"agent",thought:"thought",tool:"tool","tool-input":"tool-input"},Ao=(C,E)=>{let $=J[C];if(!$)return{rowBudget:20,line1:"",line2:"",focusedRow:!1};let X=Xt(t),ie=Math.max(20,X-Xl),Ue=ze($.sessionId),xe=$.title??je($.cwd),Rt=E&&$.snippets.length>1?` [${U+1}/${$.snippets.length}]`:E&&$.totalMatches>$.snippets.length?` [${$.snippets.length} of ${$.totalMatches}]`:"",St=`${Ue} ${$.status==="live"?"live":"cold"}`,pt=Math.max(5,ie-St.length-Rt.length-2),Tt=no(xe,pt),dn=`${St} ${Tt}${Rt}`.padEnd(ie),rt=$.snippets[E?U:0],ht=rt?Ed[rt.kind]??rt.kind:"",Ye=rt?.toolName?`${ht} \xB7 ${rt.toolName}`:ht,Ps=Math.max(10,ie-Ye.length-6),Ms=rt?no(rt.text,Ps):"",En=rt?` ${Ye} ${Ms}`:" (no snippet)";return{rowBudget:ie,line1:dn,line2:En.padEnd(ie+Xl),focusedRow:E}},It=(C,E)=>{let{line1:$,focusedRow:X}=Ao(C,E);X?t.brightWhite.bgBlue.noFormat(`\u276F ${$}`):t.noFormat(` ${$}`),t.styleReset()},st=(C,E)=>{let{line2:$}=Ao(C,E);t.dim.noFormat($),t.styleReset()},hr=()=>{if(te)t.dim.noFormat(" searching\u2026"),t.styleReset(),t.eraseLineAfter();else if(Y!==null)t.brightRed.noFormat(` ${Y}`),t.styleReset(),t.eraseLineAfter();else if(z==="input")J.length>0?t.dim.noFormat(" Enter to search \xB7 \u2193 browse results \xB7 Esc cancel"):t.dim.noFormat(" Enter to search \xB7 Esc cancel"),t.styleReset(),t.eraseLineAfter();else{let C=J.length,E=W?" \xB7 truncated":"",$=C>0?` ${C} ${C===1?"session":"sessions"} match${E} \xB7 `:" ";t.dim.noFormat(`${$}\u2191 edit query \xB7 Up/Down sessions \xB7 n/p snippets \xB7 Enter open \xB7 Esc back`),t.styleReset(),t.eraseLineAfter()}},rn=()=>{Qn();let C=z==="input",E=K.state().buffer.join(`
141
+ `)})},vt=()=>at+4,pr=2,Fe=0,nn=()=>{ce=sr(t);let C=Math.max(2,ce-(at+3)-pr);return Math.max(1,Math.floor(C/2))},So=()=>{let C=nn();F<Fe?Fe=F:F>=Fe+C&&(Fe=F-C+1),Fe+C>J.length&&(Fe=Math.max(0,J.length-C)),Fe<0&&(Fe=0)},ko=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500 Find sessions ",X="\u2500".repeat(Math.max(1,E-$.length));C?t.brightBlue.noFormat(`\u256D${$}${X}\u256E`):t.dim.noFormat(`\u256D${$}${X}\u256E`),t.styleReset()},Qn=()=>{_e=Xt(t),gi=Math.max(10,_e-Gg);let C=K.state();yi=Jn(C.buffer,gi);let E=Is(yi,C,qA);at=E.rendered,An=E.windowStart,xs=E.cursorVisualRow,wi=E.cursorVisualCol},sn=(C,E)=>{_e=Xt(t);let $=Math.max(2,_e-2),X=yi[C],ie="";X&&(ie=(K.state().buffer[X.bufferIdx]??"").slice(X.startCol,X.endCol));let Ue=Math.max(0,$-1-ie.length),xe=" ".repeat(Ue);E?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${ie}${xe}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${ie}${xe}`),t.dim.noFormat("\u2502")),t.styleReset()},Si=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500".repeat(E);C?t.brightBlue.noFormat(`\u2570${$}\u256F`):t.dim.noFormat(`\u2570${$}\u256F`),t.styleReset()},Ts=()=>3+wi,Es=()=>2+(xs-An),ki=()=>{let C=z==="input";Be(()=>{C&&t.hideCursor(),t.moveTo(1,1),ko(C);for(let E=0;E<at;E++)t.moveTo(1,2+E),sn(An+E,C);t.moveTo(1,2+at),Si(C),C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},xo=()=>{Be(()=>{t.hideCursor();for(let C=0;C<at;C++)t.moveTo(1,2+C),sn(An+C,!0);t.moveTo(Ts(),Es()),t.hideCursor(!1)})},Ed={user:"user",agent:"agent",thought:"thought",tool:"tool","tool-input":"tool-input"},Ao=(C,E)=>{let $=J[C];if(!$)return{rowBudget:20,line1:"",line2:"",focusedRow:!1};let X=Xt(t),ie=Math.max(20,X-Xl),Ue=ze($.sessionId),xe=$.title??je($.cwd),Rt=E&&$.snippets.length>1?` [${U+1}/${$.snippets.length}]`:E&&$.totalMatches>$.snippets.length?` [${$.snippets.length} of ${$.totalMatches}]`:"",St=`${Ue} ${$.status==="live"?"live":"cold"}`,pt=Math.max(5,ie-St.length-Rt.length-2),Tt=no(xe,pt),dn=`${St} ${Tt}${Rt}`.padEnd(ie),rt=$.snippets[E?U:0],ht=rt?Ed[rt.kind]??rt.kind:"",Ye=rt?.toolName?`${ht} \xB7 ${rt.toolName}`:ht,Ps=Math.max(10,ie-Ye.length-6),Ms=rt?no(rt.text,Ps):"",En=rt?` ${Ye} ${Ms}`:" (no snippet)";return{rowBudget:ie,line1:dn,line2:En.padEnd(ie+Xl),focusedRow:E}},It=(C,E)=>{let{line1:$,focusedRow:X}=Ao(C,E);X?t.brightWhite.bgBlue.noFormat(`\u276F ${$}`):t.noFormat(` ${$}`),t.styleReset()},st=(C,E)=>{let{line2:$}=Ao(C,E);t.dim.noFormat($),t.styleReset()},hr=()=>{if(te)t.dim.noFormat(" searching\u2026"),t.styleReset(),t.eraseLineAfter();else if(Y!==null)t.brightRed.noFormat(` ${Y}`),t.styleReset(),t.eraseLineAfter();else if(z==="input")J.length>0?t.dim.noFormat(" Enter to search \xB7 \u2193 browse results \xB7 Esc cancel"):t.dim.noFormat(" Enter to search \xB7 Esc cancel"),t.styleReset(),t.eraseLineAfter();else{let C=J.length,E=W?" \xB7 truncated":"",$=C>0?` ${C} ${C===1?"session":"sessions"} match${E} \xB7 `:" ";t.dim.noFormat(`${$}\u2191 edit query \xB7 Up/Down sessions \xB7 n/p snippets \xB7 Enter open \xB7 Esc back`),t.styleReset(),t.eraseLineAfter()}},rn=()=>{Qn();let C=z==="input",E=K.state().buffer.join(`
142
142
  `);Be(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),ko(C);for(let X=0;X<at;X++)t.moveTo(1,2+X),sn(An+X,C);t.moveTo(1,2+at),Si(C);let $=J.length;if($===0)t.moveTo(1,vt()),te||(Y===null&&E.trim().length===0?(t.dim.noFormat(" type a query in the box above, then press Enter"),t.eraseLineAfter()):Y===null&&(t.dim.noFormat(" no matches"),t.eraseLineAfter())),t.moveTo(1,vt()+1),hr();else{So();let X=nn(),ie=z!=="input";for(let Ue=0;Ue<X;Ue++){let xe=Fe+Ue;t.moveTo(1,vt()+Ue*2),xe<$?It(xe,ie&&xe===F):t.eraseLineAfter(),t.moveTo(1,vt()+Ue*2+1),xe<$?st(xe,ie&&xe===F):t.eraseLineAfter()}t.moveTo(1,vt()+X*2),hr()}C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},on=(C,E)=>{let $=C-Fe;$<0||$>=nn()||Be(()=>{t.moveTo(1,vt()+$*2),It(C,E),t.moveTo(1,vt()+$*2+1),st(C,E)})},an=()=>{Be(()=>{t.moveTo(1,vt()+nn()*2),hr()})},mr=()=>{Be(()=>{let C=nn(),E=J.length,$=z!=="input";for(let X=0;X<C;X++){let ie=Fe+X;t.moveTo(1,vt()+X*2),ie<E?It(ie,$&&ie===F):t.eraseLineAfter(),t.moveTo(1,vt()+X*2+1),ie<E?st(ie,$&&ie===F):t.eraseLineAfter()}t.moveTo(1,vt()+C*2),hr()})},Co=()=>K.state().buffer.join(`
143
143
  `),Pd=C=>{let E=at;K.feed({type:"paste",text:C}),Qn(),at!==E?rn():xo()},Md=async()=>{let C=Co().trim();if(C.length!==0){if(a.length===0){Y="no sessions in view to search",rn();return}te=!0,Y=null,rn();try{let E=await Ih(e.target,C,{sessionIds:a.map($=>$.sessionId)});J=E.results,W=E.truncated,F=0,U=0,Fe=0,z=E.results.length>0?"results":"input",Qn()}catch(E){Y=`search failed: ${E.message}`}finally{te=!1,rn()}}},Rn=()=>{},Jt=()=>{Be(()=>{let C=u===0;C&&t.hideCursor(),j.paintRow(be,vi(),()=>{Vn()}),j.paintRow(fr(),Gn(),()=>{lr()});for(let E=0;E<nt;E++){let $=zn+E;j.paintRow(tn(E),ft($),()=>{Cs($)})}C&&(he(),t.hideCursor(!1))})},xi=()=>{Be(()=>{let C=oe.state();Ot=Jn(C.buffer,ks);let E=Is(Ot,C,Cd);zn=E.windowStart,Kn=E.cursorVisualRow,xn=E.cursorVisualCol;let $=u===0;$&&t.hideCursor();for(let X=0;X<nt;X++){let ie=zn+X;j.paintRow(tn(X),ft(ie),()=>{Cs(ie)})}$&&(he(),t.hideCursor(!1))})},Ro=C=>{C<p||C>=p+$e||Be(()=>{j.paintRow(Ft(C),Cn(C),()=>{Yn(C)})})},To=()=>{Be(()=>{for(let C=0;C<$e;C++){let E=Ve()+1+C,$=p+C;$<a.length?j.paintRow(E,Cn($),()=>{Yn($)}):j.paintRow(E,"blank",()=>{})}Ie()})},Ai=()=>{Be(()=>{j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=Ve()+1+C,$=p+C;$<a.length?j.paintRow(E,Cn($),()=>{Yn($)}):j.paintRow(E,"blank",()=>{})}Ie(),u===0&&(he(),t.hideCursor(!1))})},Xn=!1,Tn="",Ct=null,Ci=null,gr=C=>{let E=C.toString("binary");if(!Xn&&E===""&&Ci){Ci();return}if(Xn){let X=E.indexOf(io);if(X===-1){Tn+=E;return}Tn+=E.slice(0,X),Xn=!1;let ie=Buffer.from(Tn,"binary").toString("utf-8").replace(/\r\n?/g,`
144
144
  `);Tn="";let Ue=E.slice(X+io.length);if(H)z==="input"&&!te&&Pd(ie);else if(u===0&&!m){oe.feed({type:"paste",text:ie});let xe=oe.state(),Rt=Jn(xe.buffer,ks);Is(Rt,xe,Cd).rendered!==nt?I():xi()}Ue.length>0&&Ct&&Ct(Buffer.from(Ue,"binary"));return}let $=E.indexOf(ri);if($===-1){Ct?.(C);return}$>0&&Ct?.(Buffer.from(E.slice(0,$),"binary")),E=E.slice($+ri.length),Xn=!0,E.length>0&&gr(Buffer.from(E,"binary"))};return I(),await new Promise(C=>{let E=!1,$=null,X=!1,ie=null,Ue=!1,xe=[],Rt=T=>{xe.push(T)},St=()=>{xe.pop(),E||xe[xe.length-1]?.onResize()},pt={push:Rt,pop:St},Tt=()=>({kind:"new",cwd:r}),dn=async()=>{Os(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),Rt({onKey:()=>{},onResize:()=>{}});let B;try{B=await ar(t,void 0,{defaultCwd:r,title:"Change cwd",intro:"New cwd for the picker and any new sessions:"})}finally{St(),On()}B.kind==="ok"&&B.path!==r&&(r=B.path,i=Rd(i,r),ve()),E||I()};Rn=()=>{K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Fe=0,Y=null,te=!1,z="input",H=!1,St()};let rt=(T,B,ae)=>{Ms(),xe[xe.length-1]?.onKey(T,B,ae)},ht=()=>{E||xe[xe.length-1]?.onResize()},Ye=()=>{if(E)return;E=!0,xe.length=0,$&&(clearInterval($),$=null),ie&&(ie.abort(),ie=null,X=!1),t.off("key",rt),t.off("resize",ht),process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.grabInput(!1),t.hideCursor(!1),t.moveTo(1,Wt()+1),t(`
145
145
  `)},Ps=()=>{if(E||xe.length>1||k!=="normal"||m||Ue)return;X&&ie&&(ie.abort(),ie=null,X=!1);let T=u>0?a[u-1]?.sessionId:void 0;X=!0;let B=new AbortController;ie=B,Zn(T,{silent:!0,signal:B.signal}).finally(()=>{ie===B&&(ie=null),X=!1})},Ms=()=>{E||($&&clearInterval($),$=setInterval(Ps,3e3))},En=()=>(Ye(),C({kind:Q?"exit":"abort"}),!0),Eo=()=>{let T=c.map(B=>`${B.session}|${B.upstream}|${B.host}|${B.state}|${B.agent}|${B.model}|${B.age}|${B.title}|${B.cwd}|${B.cost}`).join(`
146
146
  `);return`${u}:${p}:${ee??""}
147
- ${T}`},Zn=async(T,B={})=>{try{let ae=B.silent?Eo():"",O=f,ne=await bn(e.target,{includeNonInteractive:!0,signal:B.signal}),ce=T??(u>0?a[u-1]?.sessionId:void 0);if(i=Rd(ne,r),ve(),ce!==void 0){let Te=a.findIndex(Ne=>Ne.sessionId===ce);Te>=0?u=Te+1:u=0}if(u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke(),B.silent&&Eo()===ae)return;f===O?Ai():I()}catch(ae){if(B.silent)return;ee=`refresh failed: ${ae.message}`,I()}},Ri=async T=>{if(!R)return;let B=R;k="busy",Ie();try{await wh(e.target,B.sessionId,T),k="normal",R=null,Z="",await Zn(B.sessionId)}catch(ae){k="normal",R=null,Z="",ee=`rename failed: ${ae.message}`,Ie()}},et=async T=>{try{await vh(e.target,T.sessionId),ee="title regen queued (press r to refresh)",Ie()}catch(B){ee=`regen failed: ${B.message}`,Ie()}},Pn=async T=>{let ae=(T.priority&&T.priority>0?T.priority:0)>0?null:1,O=ae??0;for(let ce of i)ce.sessionId===T.sessionId&&(ce.priority=O>0?O:void 0);let ne=T.sessionId;i=Rd(i,r),ve(),At(ne),I(),ee=O>0?"priority: high":"priority: normal",Ie();try{await bh(e.target,T.sessionId,ae)}catch(ce){ee=`priority failed: ${ce.message}`,Ie()}},Mn=async()=>{if(Ue)return;Ue=!0;let T=u>0?a[u-1]?.sessionId:void 0;ee="syncing agents\u2026",Ie();try{let{synced:B,skipped:ae,agents:O}=await yh(e.target);await Zn(T),ee=`synced ${B} new (${ae} known) from ${O} agent${O===1?"":"s"}`,Ie()}catch(B){ee=`sync failed: ${B.message}`,Ie()}finally{Ue=!1}},es=async T=>{if(!R)return;let B=R;k="busy",Ie();try{T==="kill"?await vn(e.target,B.sessionId):await Sh(e.target,B.sessionId),k="normal",R=null,B.sessionId===e.currentSessionId&&(Q=!0);let ae;if(T==="kill")ae=B.sessionId;else{let O=a.findIndex(ne=>ne.sessionId===B.sessionId);O>=0&&(ae=a[O+1]?.sessionId??a[O-1]?.sessionId)}await Zn(ae)}catch(ae){k="normal",R=null,ee=`${T} failed: ${ae.message}`,Ie()}},_n=(T,B)=>{T===0!=(B===0)&&(Jt(),B===0?(t.hideCursor(!1),he()):t.hideCursor())},it=T=>{let B=Math.min(f-1,Math.max(0,u+T));if(B===u)return;let ae=u;u=B,Ke(),Be(()=>{To(),_n(ae,u)})},zt=()=>ee===null?!1:(ee=null,Ie(),!0),$n=()=>{Io(),Rt({onKey:T=>{if(T==="CTRL_C"){Ye(),C({kind:"abort"});return}St()},onResize:()=>Io()})},_s=T=>{let B=null,ae=null,O=!0,ne=()=>{Be(()=>{if(t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(` Session info \u2014 ${ze(T.sessionId)}`)(`
147
+ ${T}`},Zn=async(T,B={})=>{try{let ae=B.silent?Eo():"",O=f,ne=await bn(e.target,{includeNonInteractive:!0,signal:B.signal}),le=T??(u>0?a[u-1]?.sessionId:void 0);if(i=Rd(ne,r),ve(),le!==void 0){let Te=a.findIndex(Ne=>Ne.sessionId===le);Te>=0?u=Te+1:u=0}if(u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke(),B.silent&&Eo()===ae)return;f===O?Ai():I()}catch(ae){if(B.silent)return;ee=`refresh failed: ${ae.message}`,I()}},Ri=async T=>{if(!R)return;let B=R;k="busy",Ie();try{await wh(e.target,B.sessionId,T),k="normal",R=null,Z="",await Zn(B.sessionId)}catch(ae){k="normal",R=null,Z="",ee=`rename failed: ${ae.message}`,Ie()}},et=async T=>{try{await vh(e.target,T.sessionId),ee="title regen queued (press r to refresh)",Ie()}catch(B){ee=`regen failed: ${B.message}`,Ie()}},Pn=async T=>{let ae=(T.priority&&T.priority>0?T.priority:0)>0?null:1,O=ae??0;for(let le of i)le.sessionId===T.sessionId&&(le.priority=O>0?O:void 0);let ne=T.sessionId;i=Rd(i,r),ve(),At(ne),I(),ee=O>0?"priority: high":"priority: normal",Ie();try{await bh(e.target,T.sessionId,ae)}catch(le){ee=`priority failed: ${le.message}`,Ie()}},Mn=async()=>{if(Ue)return;Ue=!0;let T=u>0?a[u-1]?.sessionId:void 0;ee="syncing agents\u2026",Ie();try{let{synced:B,skipped:ae,agents:O}=await yh(e.target);await Zn(T),ee=`synced ${B} new (${ae} known) from ${O} agent${O===1?"":"s"}`,Ie()}catch(B){ee=`sync failed: ${B.message}`,Ie()}finally{Ue=!1}},es=async T=>{if(!R)return;let B=R;k="busy",Ie();try{T==="kill"?await vn(e.target,B.sessionId):await Sh(e.target,B.sessionId),k="normal",R=null,B.sessionId===e.currentSessionId&&(Q=!0);let ae;if(T==="kill")ae=B.sessionId;else{let O=a.findIndex(ne=>ne.sessionId===B.sessionId);O>=0&&(ae=a[O+1]?.sessionId??a[O-1]?.sessionId)}await Zn(ae)}catch(ae){k="normal",R=null,ee=`${T} failed: ${ae.message}`,Ie()}},_n=(T,B)=>{T===0!=(B===0)&&(Jt(),B===0?(t.hideCursor(!1),he()):t.hideCursor())},it=T=>{let B=Math.min(f-1,Math.max(0,u+T));if(B===u)return;let ae=u;u=B,Ke(),Be(()=>{To(),_n(ae,u)})},zt=()=>ee===null?!1:(ee=null,Ie(),!0),$n=()=>{Io(),Rt({onKey:T=>{if(T==="CTRL_C"){Ye(),C({kind:"abort"});return}St()},onResize:()=>Io()})},_s=T=>{let B=null,ae=null,O=!0,ne=()=>{Be(()=>{if(t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(` Session info \u2014 ${ze(T.sessionId)}`)(`
148
148
 
149
149
  `),O)t.dim.noFormat(" loading\u2026")(`
150
150
  `);else if(ae!==null)t.brightRed.noFormat(` ${ae}`)(`
151
151
  `);else if(B!==null)for(let Ne of B)t.noFormat(` ${Ne}`)(`
152
152
  `);t(`
153
153
  `),t.dim.noFormat(" Esc / ^C to return")(`
154
- `)})};ne();let ce=new AbortController,Te={onKey:Ne=>{if(Ne==="ESCAPE"||Ne==="CTRL_C"){ce.abort(),St();return}},onResize:()=>ne()};Rt(Te),(async()=>{try{let Ne=await $t(`${e.target.baseUrl}/v1/sessions/${encodeURIComponent(T.sessionId)}/export`,{headers:{Authorization:`Bearer ${e.target.token}`},signal:ce.signal});if(!Ne.ok)throw new Error(`daemon returned HTTP ${Ne.status}`);let Ge=await Ne.json(),mt=Gt(Ge),Me=ul(mt,T.status);B=Za(Me,!1).replace(/\n$/,"").split(`
155
- `)}catch(Ne){if(ce.signal.aborted)return;ae=`failed to load info: ${Ne.message}`}finally{O=!1,!E&&xe[xe.length-1]===Te&&ne()}})()},yr=()=>{if(a.length===0){ee="no sessions to search",Ie();return}K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Fe=0,Y=null,te=!1,z="input",H=!0,Qn(),rn(),Rt({onKey:(B,ae,O)=>{if(z==="input"){if(te)return;if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="ENTER"||B==="KP_ENTER"){if(Co().trim().length===0)return;Md();return}if((B==="DOWN"||B==="TAB"||B==="CTRL_N")&&J.length>0){z="results",F=0,U=0,Be(()=>{ki(),on(0,!0),an(),t.hideCursor()});return}let ne=K.state(),ce=null;if(O?.isCharacter)ce={type:"char",ch:B};else{let mt=kd(B);mt!==null&&(ce={type:"key",name:mt})}if(ce===null){t.moveTo(Ts(),Es());return}K.feed(ce);let Te=K.state();if(ne.buffer.length===Te.buffer.length&&ne.buffer.every((mt,Me)=>mt===Te.buffer[Me])&&ne.row===Te.row&&ne.col===Te.col){t.moveTo(Ts(),Es());return}let Ge=at;Qn(),at!==Ge?rn():xo();return}if(z==="results"){if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="CTRL_F"){z="input",mr(),an(),ki();return}if(B==="ENTER"||B==="KP_ENTER"){let ce=J[F];if(!ce)return;let Te=a.find(Ge=>Ge.sessionId===ce.sessionId);if(!!Te?.importedFromMachine&&!Te.upstreamSessionId){Ye();let Ge={kind:"attach",sessionId:ce.sessionId};Te.agentId!==void 0&&(Ge.agentId=Te.agentId),C(Ge);return}(async()=>{let Ge=await Kg(t,{sessionId:ce.sessionId,title:ce.title,cwd:ce.cwd},pt);if(Ge==="cancel"){Ye(),C({kind:"abort"});return}if(Ge==="back")return;Ye();let mt={kind:"attach",sessionId:ce.sessionId,readonly:Ge==="view"};Te?.agentId!==void 0&&(mt.agentId=Te.agentId),C(mt)})();return}if(O?.isCharacter&&(B==="n"||B==="N")){let ce=J[F];if(!ce||ce.snippets.length<=1)return;U=(U+1)%ce.snippets.length,on(F,!0);return}if(O?.isCharacter&&(B==="p"||B==="P")){let ce=J[F];if(!ce||ce.snippets.length<=1)return;U=(U-1+ce.snippets.length)%ce.snippets.length,on(F,!0);return}let ne=ce=>{if(ce<0&&F===0){z="input",Be(()=>{on(0,!1),an(),ki()});return}let Te=Math.min(J.length-1,Math.max(0,F+ce));if(Te===F)return;let Ne=F,Ge=Fe;F=Te,U=0,So(),Fe!==Ge?mr():(Be(()=>{on(Ne,!1),on(F,!0)}),an())};switch(B){case"UP":case"SHIFT_TAB":case"CTRL_P":ne(-1);return;case"DOWN":case"TAB":case"CTRL_N":ne(1);return;case"PAGE_UP":ne(-nn());return;case"PAGE_DOWN":ne(nn());return;case"HOME":ne(-F);return;case"END":ne(J.length);return}return}},onResize:()=>rn()})},$s=(T,B,ae)=>{if(k!=="busy"){if(T==="CTRL_O"){dn();return}if(T==="CTRL_L"){Ii();return}if(k==="rename"){if(T==="ENTER"||T==="KP_ENTER"){let O=Z.trim();if(O.length===0){k="normal",R=null,Z="",Ie();return}Ri(O);return}if(T==="ESCAPE"||T==="CTRL_C"){k="normal",R=null,Z="",Ie();return}if(T==="BACKSPACE"){Z.length>0&&(Z=Z.slice(0,-1),Ie());return}if(T==="CTRL_U"){Z="",Ie();return}if(T==="CTRL_W"){let O=Z.replace(/\s+$/,""),ne=O.lastIndexOf(" ");Z=ne>=0?O.slice(0,ne):"",Ie();return}if(ae?.isCharacter){Z+=T,Ie();return}return}if(k==="confirm-kill"||k==="confirm-delete"){if(ae?.isCharacter&&(T==="y"||T==="Y")){es(k==="confirm-kill"?"kill":"delete");return}if(T==="ESCAPE"||T==="CTRL_C"||T==="ENTER"||T==="KP_ENTER"||ae?.isCharacter&&(T==="n"||T==="N")){k="normal",R=null,Ie();return}return}if(zt(),T==="CTRL_F"){yr();return}if(u===0&&!m){if(T==="ESCAPE"){En();return}if(T==="ENTER"||T==="KP_ENTER"){Ye();let Me=oe.expandedText(),Lt=Tt();Me.trim().length>0&&(Lt.prompt=Me),C(Lt);return}if(T==="UP"&&v){let Me=Date.now(),Lt=Me-b;if(b=Me,Lt<y){he();return}v=!1}if(T==="DOWN"){let Me=oe.state(),Lt=Me.historyIndex!==-1||Me.queueIndex!==-1,_d=Ot.length===0||Kn===Ot.length-1;if(!Lt&&_d&&a.length>0){it(1);return}}if(T==="PAGE_DOWN"&&(Ot.length===0||Kn===Ot.length-1)&&a.length>0){it(1);return}if(T==="CTRL_P"){a.length>0&&it(1);return}v=!1;let O=oe.state(),ne=null;if(ae?.isCharacter)ne={type:"char",ch:T};else{let Me=kd(T);Me!==null&&(ne={type:"key",name:Me})}if(ne===null){he();return}let ce=oe.feed(ne),Te=oe.state(),Ne=O.buffer.length===Te.buffer.length&&O.buffer.every((Me,Lt)=>Me===Te.buffer[Lt])&&O.row===Te.row&&O.col===Te.col;if(ce.some(Me=>Me.type==="exit")){En();return}if(Ne){he();return}let Ge=Jn(Te.buffer,ks);if(Is(Ge,Te,Cd).rendered!==nt){I();return}xi();return}if(!m&&ae?.isCharacter&&T==="?"){$n();return}if(m){if(ae?.isCharacter){g+=T,ve(),I();return}if(T==="BACKSPACE"){g.length>0?(g=g.slice(0,-1),ve(),I()):(m=!1,ve(),I());return}if(T==="ESCAPE"||T==="CTRL_C"){m=!1,g="",ve(),I();return}}if(ae?.isCharacter){if(T==="/"){m=!0,g="",ve(),I();return}if(T==="n"||T==="N"){it(1);return}if(T==="p"||T==="P"){it(-1);return}if(T==="c"||T==="C"){let O=u>0?a[u-1]:void 0,ne=Tt();O?.cwd&&(ne.cwd=O.cwd),Ye(),C(ne);return}if(T==="q"||T==="Q"){En();return}if(T==="o"||T==="O"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.cwdOnly=!s.filters.cwdOnly,ve(),At(O),I();return}if(T==="h"||T==="H"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.hostFilter=VA(s.filters.hostFilter,i),ve(),At(O),I();return}if(T==="i"&&u>0){let O=a[u-1];if(!O)return;_s(O);return}if(T==="I"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.includeNonInteractive=!s.filters.includeNonInteractive,ve(),At(O),I();return}if(T==="r"||T==="R"){let O=u>0?a[u-1]?.sessionId:void 0;Zn(O);return}if(T==="s"||T==="S"){Mn();return}if((T==="v"||T==="V")&&u>0){let O=a[u-1];if(!O)return;Ye();let ne={kind:"attach",sessionId:O.sessionId,readonly:!0};O.agentId!==void 0&&(ne.agentId=O.agentId),C(ne);return}if((T==="f"||T==="F")&&u>0){let O=a[u-1];if(!O)return;Ye();let ne={kind:"fork",sourceSessionId:O.sessionId,sourceCwd:O.cwd};O.agentId!==void 0&&(ne.sourceAgentId=O.agentId),O.importedFromMachine!==void 0&&(ne.sourceImportedFromMachine=O.importedFromMachine),O.upstreamSessionId!==void 0&&(ne.sourceUpstreamSessionId=O.upstreamSessionId),C(ne);return}if((T==="k"||T==="K")&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},k="confirm-kill",Ie();return}if(T==="t"&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},Z=O.title??"",k="rename",Ie();return}if(T==="T"&&u>0){let O=a[u-1];if(!O||O.status!=="live")return;et({sessionId:O.sessionId});return}if(T==="*"&&u>0){let O=a[u-1];if(!O)return;Pn(O);return}if((T==="d"||T==="D")&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},k="confirm-delete",Ie();return}return}switch(T){case"UP":case"SHIFT_TAB":case"CTRL_P":T==="UP"&&(u===1&&(v=!0),b=Date.now()),it(-1);return;case"DOWN":case"TAB":case"CTRL_N":it(1);return;case"PAGE_UP":it(-$e);return;case"PAGE_DOWN":it($e);return;case"HOME":it(1-u);return;case"END":it(f);return;case"ENTER":case"KP_ENTER":{if(Ye(),u===0){C(Tt());return}let O=a[u-1];if(!O){C({kind:"abort"});return}let ne={kind:"attach",sessionId:O.sessionId};O.agentId!==void 0&&(ne.agentId=O.agentId),C(ne);return}case"ESCAPE":case"CTRL_C":case"CTRL_D":En();return}}};Rt({onKey:(T,B,ae)=>$s(T,B,ae),onResize:()=>{E||I()}});let On=()=>{t.grabInput({});let T=t;T.stdin&&typeof T.onStdin=="function"&&(Ct=T.onStdin,T.stdin.removeListener("data",T.onStdin),T.stdin.on("data",gr),process.stdout.write(nd)),t.on("key",rt),t.on("resize",ht)},Os=()=>{process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.off("key",rt),t.off("resize",ht),t.grabInput(!1),t.hideCursor(!1)};if(On(),process.platform!=="win32"){let T=!1,B=()=>{T&&(T=!1,t.fullscreen(!0),n(),t.hideCursor(),On(),E||Ii())};Ci=()=>{T||E||(T=!0,Os(),t.fullscreen(!1),process.stdout.write(`${oo}${sd}
154
+ `)})};ne();let le=new AbortController,Te={onKey:Ne=>{if(Ne==="ESCAPE"||Ne==="CTRL_C"){le.abort(),St();return}},onResize:()=>ne()};Rt(Te),(async()=>{try{let Ne=await $t(`${e.target.baseUrl}/v1/sessions/${encodeURIComponent(T.sessionId)}/export`,{headers:{Authorization:`Bearer ${e.target.token}`},signal:le.signal});if(!Ne.ok)throw new Error(`daemon returned HTTP ${Ne.status}`);let Ge=await Ne.json(),mt=Gt(Ge),Me=ul(mt,T.status);B=Za(Me,!1).replace(/\n$/,"").split(`
155
+ `)}catch(Ne){if(le.signal.aborted)return;ae=`failed to load info: ${Ne.message}`}finally{O=!1,!E&&xe[xe.length-1]===Te&&ne()}})()},yr=()=>{if(a.length===0){ee="no sessions to search",Ie();return}K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Fe=0,Y=null,te=!1,z="input",H=!0,Qn(),rn(),Rt({onKey:(B,ae,O)=>{if(z==="input"){if(te)return;if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="ENTER"||B==="KP_ENTER"){if(Co().trim().length===0)return;Md();return}if((B==="DOWN"||B==="TAB"||B==="CTRL_N")&&J.length>0){z="results",F=0,U=0,Be(()=>{ki(),on(0,!0),an(),t.hideCursor()});return}let ne=K.state(),le=null;if(O?.isCharacter)le={type:"char",ch:B};else{let mt=kd(B);mt!==null&&(le={type:"key",name:mt})}if(le===null){t.moveTo(Ts(),Es());return}K.feed(le);let Te=K.state();if(ne.buffer.length===Te.buffer.length&&ne.buffer.every((mt,Me)=>mt===Te.buffer[Me])&&ne.row===Te.row&&ne.col===Te.col){t.moveTo(Ts(),Es());return}let Ge=at;Qn(),at!==Ge?rn():xo();return}if(z==="results"){if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="CTRL_F"){z="input",mr(),an(),ki();return}if(B==="ENTER"||B==="KP_ENTER"){let le=J[F];if(!le)return;let Te=a.find(Ge=>Ge.sessionId===le.sessionId);if(!!Te?.importedFromMachine&&!Te.upstreamSessionId){Ye();let Ge={kind:"attach",sessionId:le.sessionId};Te.agentId!==void 0&&(Ge.agentId=Te.agentId),C(Ge);return}(async()=>{let Ge=await Kg(t,{sessionId:le.sessionId,title:le.title,cwd:le.cwd},pt);if(Ge==="cancel"){Ye(),C({kind:"abort"});return}if(Ge==="back")return;Ye();let mt={kind:"attach",sessionId:le.sessionId,readonly:Ge==="view"};Te?.agentId!==void 0&&(mt.agentId=Te.agentId),C(mt)})();return}if(O?.isCharacter&&(B==="n"||B==="N")){let le=J[F];if(!le||le.snippets.length<=1)return;U=(U+1)%le.snippets.length,on(F,!0);return}if(O?.isCharacter&&(B==="p"||B==="P")){let le=J[F];if(!le||le.snippets.length<=1)return;U=(U-1+le.snippets.length)%le.snippets.length,on(F,!0);return}let ne=le=>{if(le<0&&F===0){z="input",Be(()=>{on(0,!1),an(),ki()});return}let Te=Math.min(J.length-1,Math.max(0,F+le));if(Te===F)return;let Ne=F,Ge=Fe;F=Te,U=0,So(),Fe!==Ge?mr():(Be(()=>{on(Ne,!1),on(F,!0)}),an())};switch(B){case"UP":case"SHIFT_TAB":case"CTRL_P":ne(-1);return;case"DOWN":case"TAB":case"CTRL_N":ne(1);return;case"PAGE_UP":ne(-nn());return;case"PAGE_DOWN":ne(nn());return;case"HOME":ne(-F);return;case"END":ne(J.length);return}return}},onResize:()=>rn()})},$s=(T,B,ae)=>{if(k!=="busy"){if(T==="CTRL_O"){dn();return}if(T==="CTRL_L"){Ii();return}if(k==="rename"){if(T==="ENTER"||T==="KP_ENTER"){let O=Z.trim();if(O.length===0){k="normal",R=null,Z="",Ie();return}Ri(O);return}if(T==="ESCAPE"||T==="CTRL_C"){k="normal",R=null,Z="",Ie();return}if(T==="BACKSPACE"){Z.length>0&&(Z=Z.slice(0,-1),Ie());return}if(T==="CTRL_U"){Z="",Ie();return}if(T==="CTRL_W"){let O=Z.replace(/\s+$/,""),ne=O.lastIndexOf(" ");Z=ne>=0?O.slice(0,ne):"",Ie();return}if(ae?.isCharacter){Z+=T,Ie();return}return}if(k==="confirm-kill"||k==="confirm-delete"){if(ae?.isCharacter&&(T==="y"||T==="Y")){es(k==="confirm-kill"?"kill":"delete");return}if(T==="ESCAPE"||T==="CTRL_C"||T==="ENTER"||T==="KP_ENTER"||ae?.isCharacter&&(T==="n"||T==="N")){k="normal",R=null,Ie();return}return}if(zt(),T==="CTRL_F"){yr();return}if(u===0&&!m){if(T==="ESCAPE"){En();return}if(T==="ENTER"||T==="KP_ENTER"){Ye();let Me=oe.expandedText(),Lt=Tt();Me.trim().length>0&&(Lt.prompt=Me),C(Lt);return}if(T==="UP"&&v){let Me=Date.now(),Lt=Me-b;if(b=Me,Lt<y){he();return}v=!1}if(T==="DOWN"){let Me=oe.state(),Lt=Me.historyIndex!==-1||Me.queueIndex!==-1,_d=Ot.length===0||Kn===Ot.length-1;if(!Lt&&_d&&a.length>0){it(1);return}}if(T==="PAGE_DOWN"&&(Ot.length===0||Kn===Ot.length-1)&&a.length>0){it(1);return}if(T==="CTRL_P"){a.length>0&&it(1);return}v=!1;let O=oe.state(),ne=null;if(ae?.isCharacter)ne={type:"char",ch:T};else{let Me=kd(T);Me!==null&&(ne={type:"key",name:Me})}if(ne===null){he();return}let le=oe.feed(ne),Te=oe.state(),Ne=O.buffer.length===Te.buffer.length&&O.buffer.every((Me,Lt)=>Me===Te.buffer[Lt])&&O.row===Te.row&&O.col===Te.col;if(le.some(Me=>Me.type==="exit")){En();return}if(Ne){he();return}let Ge=Jn(Te.buffer,ks);if(Is(Ge,Te,Cd).rendered!==nt){I();return}xi();return}if(!m&&ae?.isCharacter&&T==="?"){$n();return}if(m){if(ae?.isCharacter){g+=T,ve(),I();return}if(T==="BACKSPACE"){g.length>0?(g=g.slice(0,-1),ve(),I()):(m=!1,ve(),I());return}if(T==="ESCAPE"||T==="CTRL_C"){m=!1,g="",ve(),I();return}}if(ae?.isCharacter){if(T==="/"){m=!0,g="",ve(),I();return}if(T==="n"||T==="N"){it(1);return}if(T==="p"||T==="P"){it(-1);return}if(T==="c"||T==="C"){let O=u>0?a[u-1]:void 0,ne=Tt();O?.cwd&&(ne.cwd=O.cwd),Ye(),C(ne);return}if(T==="q"||T==="Q"){En();return}if(T==="o"||T==="O"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.cwdOnly=!s.filters.cwdOnly,ve(),At(O),I();return}if(T==="h"||T==="H"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.hostFilter=VA(s.filters.hostFilter,i),ve(),At(O),I();return}if(T==="i"&&u>0){let O=a[u-1];if(!O)return;_s(O);return}if(T==="I"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.includeNonInteractive=!s.filters.includeNonInteractive,ve(),At(O),I();return}if(T==="r"||T==="R"){let O=u>0?a[u-1]?.sessionId:void 0;Zn(O);return}if(T==="s"||T==="S"){Mn();return}if((T==="v"||T==="V")&&u>0){let O=a[u-1];if(!O)return;Ye();let ne={kind:"attach",sessionId:O.sessionId,readonly:!0};O.agentId!==void 0&&(ne.agentId=O.agentId),C(ne);return}if((T==="f"||T==="F")&&u>0){let O=a[u-1];if(!O)return;Ye();let ne={kind:"fork",sourceSessionId:O.sessionId,sourceCwd:O.cwd};O.agentId!==void 0&&(ne.sourceAgentId=O.agentId),O.importedFromMachine!==void 0&&(ne.sourceImportedFromMachine=O.importedFromMachine),O.upstreamSessionId!==void 0&&(ne.sourceUpstreamSessionId=O.upstreamSessionId),C(ne);return}if((T==="k"||T==="K")&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},k="confirm-kill",Ie();return}if(T==="t"&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},Z=O.title??"",k="rename",Ie();return}if(T==="T"&&u>0){let O=a[u-1];if(!O||O.status!=="live")return;et({sessionId:O.sessionId});return}if(T==="*"&&u>0){let O=a[u-1];if(!O)return;Pn(O);return}if((T==="d"||T==="D")&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},k="confirm-delete",Ie();return}return}switch(T){case"UP":case"SHIFT_TAB":case"CTRL_P":T==="UP"&&(u===1&&(v=!0),b=Date.now()),it(-1);return;case"DOWN":case"TAB":case"CTRL_N":it(1);return;case"PAGE_UP":it(-$e);return;case"PAGE_DOWN":it($e);return;case"HOME":it(1-u);return;case"END":it(f);return;case"ENTER":case"KP_ENTER":{if(Ye(),u===0){C(Tt());return}let O=a[u-1];if(!O){C({kind:"abort"});return}let ne={kind:"attach",sessionId:O.sessionId};O.agentId!==void 0&&(ne.agentId=O.agentId),C(ne);return}case"ESCAPE":case"CTRL_C":case"CTRL_D":En();return}}};Rt({onKey:(T,B,ae)=>$s(T,B,ae),onResize:()=>{E||I()}});let On=()=>{t.grabInput({});let T=t;T.stdin&&typeof T.onStdin=="function"&&(Ct=T.onStdin,T.stdin.removeListener("data",T.onStdin),T.stdin.on("data",gr),process.stdout.write(nd)),t.on("key",rt),t.on("resize",ht)},Os=()=>{process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.off("key",rt),t.off("resize",ht),t.grabInput(!1),t.hideCursor(!1)};if(On(),process.platform!=="win32"){let T=!1,B=()=>{T&&(T=!1,t.fullscreen(!0),n(),t.hideCursor(),On(),E||Ii())};Ci=()=>{T||E||(T=!0,Os(),t.fullscreen(!1),process.stdout.write(`${oo}${sd}
156
156
  `),process.once("SIGCONT",B),process.kill(process.pid,"SIGTSTP"))}}$=setInterval(Ps,3e3)})}function zA(t,e){let n="Create new session in ",s=Math.max(1,e-n.length);return n+no(je(t),s)}function Rd(t,e){let n=r=>r.priority&&r.priority>0?r.priority:0,s=r=>{let i=r.status==="live",o=n(r)>0;return i&&r.awaitingInput?5:i&&r.busy?4:i&&o?3:i?2:o?1:0};return[...t].sort((r,i)=>{let o=s(i)-s(r);if(o!==0)return o;let a=n(i)-n(r);return a!==0?a:i.updatedAt.slice(0,16).localeCompare(r.updatedAt.slice(0,16))})}function KA(t,e){return e==="__all"?t:e==="__local"?t.filter(n=>!n.importedFromMachine||!!n.upstreamSessionId):t.filter(n=>n.importedFromMachine===e&&!n.upstreamSessionId)}function VA(t,e){let n=new Set;for(let i of e)i.importedFromMachine&&!i.upstreamSessionId&&n.add(i.importedFromMachine);let s=["__local",...[...n].sort(),"__all"],r=s.indexOf(t);return r===-1?"__local":s[(r+1)%s.length]??"__local"}function YA(t,e){if(e.length===0)return!0;let n=e.toLowerCase(),s=[ze(t.sessionId),t.upstreamSessionId??"",t.agentId??"",t.title??"",t.cwd,je(t.cwd)];for(let r of s)if(r.toLowerCase().includes(n))return!0;return!1}var Xl,Cd,qA,Gg,WA,JA,Qg=q(()=>{"use strict";Va();ge();hn();to();da();Pl();Yl();Gl();Ql();ci();Ml();Bl();ao();Ws();fl();Xl=2,Cd=4,qA=4,Gg=4,WA=20,JA=[["Composer","type prompt for new session; Enter creates + submits"],["\u2193 from composer","drop focus into session list"],null,["\u2191 / \u2193, n / p, ^p / ^n","navigate sessions"],["PgUp / PgDn","page up / page down"],["Home / End","first / last"],["Enter","open selected session"],["v","view-only (open transcript without spawning the agent)"],null,["/","search sessions (metadata)"],["^f","find in session history (content + tool inputs)"],["o","toggle cwd-only filter"],["h","cycle host filter (local / <peer> / all)"],["^o","change cwd (for the picker and any new sessions)"],["i","show info for the selected session"],["I","toggle include-cat filter"],["r","refresh from daemon"],["s","sync sessions from installed agents"],null,["k","kill the selected live session"],["d","delete the selected session (kills first if live)"],["t","retitle the selected session"],["T","regenerate title + synopsis via agent (live session)"],["*","toggle high priority on the selected session (floats to top)"],null,["?","toggle this help"],["q / Esc / ^C / ^D","quit picker (detach)"]]});function ZA(t,e){let n=t.findIndex(s=>s.id===e);return n===-1?0:n}async function Xg(t,e,n){Un();let s=ZA(e,n??GA),r=0,i=()=>{let l=sr(t)-8;return Math.max(1,Math.min(QA,e.length,l))},o=()=>{let l=i();s<r?r=s:s>=r+l&&(r=s-l+1);let f=Math.max(0,e.length-l);r>f&&(r=f),r<0&&(r=0)},a=()=>{o();let l=i(),f=l+4,u=Math.min(XA,Math.max(40,Xt(t)-8)),p=jn(t,{contentHeight:f,contentWidth:u,title:"Select agent"}),m=p.contentW,g=0;t.moveTo(p.contentX,p.contentY+g),t.noFormat(" Which agent should this session use?"),g+=2;let y=Math.min(e.length,r+l);for(let b=r;b<y;b++){let k=e[b];if(!k)continue;let R=b===s?"\u276F":" ",H=k.description??k.name,z=` ${R} ${k.id}`;if(t.moveTo(p.contentX,p.contentY+g),b===s){let K=`${z} ${H}`;t.brightWhite.bgBlue.noFormat(rd(Xe(K,m),m))}else{t.noFormat(z);let K=m-z.length-2;K>1&&t.dim.noFormat(` ${Xe(H,K)}`)}g++}g++,t.moveTo(p.contentX,p.contentY+g);let v=e.length>l?` (${s+1}/${e.length})`:"";return t.dim.noFormat(` \u2191/\u2193 navigate \xB7 Enter this session \xB7 s set default \xB7 Esc back${v}`),p},d=()=>{s<e.length-1&&(s++,a())},c=()=>{s>0&&(s--,a())};return ys({term:t,render:a,onKey:(l,f,u,p)=>{if(l==="CTRL_C"||l==="CTRL_D"){p({kind:"cancel"});return}if(l==="ESCAPE"){p({kind:"back"});return}if(l==="ENTER"||l==="KP_ENTER"){let m=e[s];m&&p({kind:"select",agentId:m.id,persist:!1});return}if(l==="UP"||l==="SHIFT_TAB"){c();return}if(l==="DOWN"||l==="TAB"){d();return}if(u?.isCharacter){let m=l.toLowerCase();if(m==="s"){let g=e[s];g&&p({kind:"select",agentId:g.id,persist:!0});return}if(m==="j"){d();return}if(m==="k"){c();return}}}})}var GA,QA,XA,Zg=q(()=>{"use strict";ci();GA="opencode",QA=20,XA=88});import*as ty from"fs";import*as ny from"os";import*as Td from"path";function sy(t,e){let n=e;for(;n>0;){let s=t[n-1]??"";if(/\s/.test(s)){if(s===" "&&t[n-2]==="\\"){n-=2;continue}break}n-=1}return n===e?null:{token:t.slice(n,e),start:n}}function eC(t){return t.length===0?!1:t.includes("/")?!0:t==="~"||t==="."||t===".."}function tC(t){return t.replace(/\\ /g," ")}function ey(t){return t.replace(/ /g,"\\ ")}function nC(t){let e=t.lastIndexOf("/");return e===-1?{dirPrefix:"",base:t}:{dirPrefix:t.slice(0,e+1),base:t.slice(e+1)}}function sC(t,e){let n=t.length===0?".":t;return(n==="~"||n.startsWith("~/"))&&(n=ny.homedir()+n.slice(1)),Td.isAbsolute(n)?n:Td.resolve(e,n)}function rC(t){let e;try{e=ty.readdirSync(t,{withFileTypes:!0})}catch{return null}return e.map(n=>({name:n.name,isDir:n.isDirectory()}))}function ry(t,e,n=rC){if(!eC(t))return null;let s=tC(t),{dirPrefix:r,base:i}=nC(s),o=sC(r,e),a=n(o);if(a===null)return null;let d=i.startsWith("."),c=a.filter(u=>u.name.startsWith(i)&&(d||!u.name.startsWith(".")));if(c.length===0)return null;let l=c.map(u=>u.isDir?u.name+"/":u.name);if(c.length===1){let u=c[0],p=u.isDir?u.name+"/":u.name;return{replacement:ey(r+p),candidates:l}}let f=wo(c.map(u=>u.name));return{replacement:ey(r+f),candidates:l}}var iy=q(()=>{"use strict";Ad()});function oy(t){let e={};if(!t||typeof t!="object")return e;let n=t;typeof n.historyPolicy=="string"&&(e.appliedPolicy=n.historyPolicy),typeof n.clientId=="string"&&n.clientId.length>0&&(e.clientId=n.clientId);let s=n._meta;if(s&&typeof s=="object"){let r=s["hydra-acp"];if(r&&typeof r=="object"){let i=r.turnStartedAt;typeof i=="number"&&(e.turnStartedAt=i)}}return e}function ay(t){return!t.replayDraining&&!t.amended&&t.pendingTurns>0&&t.queueSize===0&&!t.ownTurnInFlight&&!t.hasInFlightHead}function dy(t){return t.daemonTurnStartedAt!==void 0?{pendingTurnsDelta:t.pendingTurns===0?1:0,banner:"busy",busySince:t.daemonTurnStartedAt}:{pendingTurnsDelta:t.pendingTurns>0?-t.pendingTurns:0,banner:"ready"}}var cy=q(()=>{"use strict"});import{appendFileSync as iC,readFileSync as oC,statSync as aC,renameSync as dC}from"fs";import{nanoid as ly}from"nanoid";import cC from"terminal-kit";import lC from"fs/promises";import bo from"path";function uy(t){if(!Array.isArray(t))return;let e=yn({sessionUpdate:"config_option_update",configOptions:t});return e&&e.kind==="config-options"?e.options:void 0}function fy(t){switch(t.type){case"send":case"amend":case"queue-edit":case"queue-remove":case"plan-toggle":case"attachment-request":return!0;default:return!1}}function pC(t,e){e.has(t)?e.delete(t):e.add(t)}async function my(t){let e=await ye(),n=t.target??await Dt(e);wy=e.tui.logMaxBytes,n.isLocal&&!t.target&&await fs(e);let s=cC.terminal;Wg(s);let r={},i={showThoughts:e.tui.showThoughts,toolsExpanded:!1,planExpanded:!1,showFileUpdates:e.tui.showFileUpdates,mouseEnabled:e.tui.mouse,inAppSelectionEnabled:wu(e),defaultEnterAction:e.tui.defaultEnterAction},o=Zl(),a=!1,d=()=>{a||(s.fullscreen(!0),a=!0)},c=()=>{a&&(s.fullscreen(!1),a=!1,process.stdout.write(`
157
157
  `))};d();let l=()=>{a&&(s.fullscreen(!1),a=!1)};process.once("exit",l);let f=t;try{for(;f!==null;)f=await mC(s,e,n,f,r,i,o)}finally{c(),process.off("exit",l)}let u=await lo();if(u&&process.stderr.write(`\u2728 ${uo(u)}
158
158
  `),process.stdout.isTTY){let p=await Vs(e);if(p?.version!==void 0){let m=p.version!==fe,g=ds(e),y=p.configDigest!==void 0&&p.configDigest!==g;if(m||y){let v=m?`daemon ${p.version} \u2260 cli ${fe}`:"config changed since daemon started",b=k=>`\x1B[33m${k}\x1B[0m`;process.stderr.write(b(`! ${v} \u2014 run \`${cn()} daemon restart\` to apply.`)+`
159
159
  `)}}}if(r.sessionId&&process.stdout.isTTY){let p=ze(r.sessionId),m=r.readonly?" --readonly":"";process.stdout.write(`Continue: ${cn()} --session ${p}${m}
160
- `)}}function hC(t){let{order:e,states:n,startedAt:s,endedAt:r,stopReason:i,perToolExpanded:o,collapsedLimit:a=20}=t,d=e.length,c=a>0,l=!c||t.expanded?e:e.slice(Math.max(0,d-a)),f=d-l.length,u=r===null,p=r??Date.now(),m=p-s,g=!u&&i!==null&&i!=="end_turn"?i:null,y=g==="amended",v=y?`amended \xB7 ${In(m)}`:`stopped (${g}) \xB7 ${In(m)}`,b;if(d===0)g!==null?b=v:b=u?`thinking \xB7 ${In(m)}`:`thought \xB7 ${In(m)}`;else{let W=d===1?"tool":"tools",F=g!==null?v:u?In(m):`took ${In(m)}`,U=[`${d} ${W}`,F];u&&c&&f>0&&U.push(`${f} hidden`),b=U.join(" \xB7 ")}let k=d===0&&u,R=y?"tool-status-cancelled":"tool-status-fail",K=[{prefix:"\u2699 ",prefixStyle:k?"tool-status-running":g!==null?R:"tool",body:b,bodyStyle:k?"tool-status-running":g!==null?R:"dim"}],J=[null];for(let W of l){let F=n.get(W);if(F){let U=ro(F,p);if(K.push(...U),J.push(...U.map(()=>W)),o?.has(W)){let Y=jh(F);K.push(...Y),J.push(...Y.map(()=>W))}}}return{lines:K,rowOwners:J}}async function mC(t,e,n,s,r,i,o){let a=await gC(t,e,n,s,o);if(!a)return t.grabInput(!1),null;let d=a.sessionId==="__new__"?"Starting new session\u2026":"Resuming session\u2026",c=bC(t,d);c.write(d);let l=n.wsUrl,f=["acp.v1",`hydra-acp-token.${n.token}`],u=null,p=null,m=new li({url:l,subprotocols:f,onConnect:async h=>{h||u&&await u()},onDisconnect:h=>{p&&p(h)},log:()=>{}}),g=new kt(m);await m.start(),g.onNotification(Yo,h=>{let w=gf.safeParse(h);w.success&&c.applyProgress(w.data)});let y=[],v=null,b=!1,k=!1,R=(h,w)=>{h&&(v?v(h,w):y.push({event:h,rawUpdate:w}))},H,z=h=>{h!==H&&(H=h,h!==void 0&&I.appendLines([{prefix:" ",body:`\u2500\u2500 T${h} \u2500\u2500`,bodyStyle:"dim"}]))},K=null,J=null,W=!1,F=0,U=0,Y=!1,te,Z=null,ee=null,Q=null,oe=()=>setInterval(()=>{if(Z===null||ue===null)return;let h=Q===null?0:Date.now()-Q;ue.setBanner({elapsedMs:Date.now()-Z,stalled:h>=uC}),Kt()},1e3),Oe=!1,j=h=>{let w=U;U=Math.max(0,U+h);let S=typeof ue<"u"&&ue!==null;w===0&&U>0?(Y=!1,Z=Date.now(),Q=Date.now(),_e?.setTurnRunning(!0),S&&ue.setBanner({status:"busy",elapsedMs:0,stalled:!1}),ee===null&&S&&(ee=oe())):w>0&&U===0?(Y=!1,Z=null,Q=null,_e?.setTurnRunning(!1),ee!==null&&(clearInterval(ee),ee=null),S&&ue.setBanner({status:"ready",elapsedMs:void 0,stalled:!1})):U>0&&Y&&(Y=!1,S&&ue.setBanner({status:"busy",stalled:!1}))},ue=null,_e=null,$e,kn=null,ks=new Set(["session_info_update","current_model_update","current_mode_update","available_commands_update","available_modes_update","usage_update","config_option_update"]),Ot=h=>{let{update:w}=h??{},S=yn(w,{cwd:Ke});yC(w,S),Q=Date.now();let x=w?.sessionUpdate;if(typeof x=="string"&&!ks.has(x)){let A=w??{};typeof A.messageId=="string"&&($e=A.messageId)}if(x==="prompt_received"?j(1):S?.kind==="turn-complete"&&(j(-1),W=!0),x==="permission_resolved"){mi(w);return}R(S,w),yi(w)};g.onNotification("session/update",h=>{if(!b){if(kn!==null){kn.push(h);return}Ot(h)}}),g.onNotification("hydra-acp/session/closed",()=>{if(b)return;U>0&&j(-U),typeof ue<"u"&&ue!==null&&ue.setBanner({status:"cold",elapsedMs:void 0})});let nt=new Map,zn=200,Kn=0,xn=!1,dr=4e3;g.onNotification("hydra-acp/prompt_queue/added",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;if(typeof w._meta?.["hydra-acp"]?.amending=="string"){let x=w.messageId,A=w.prompt,P=setTimeout(()=>{b||(nt.delete(x),pt.set(x,St(x,A)),ue&&_e&&Ye())},zn);nt.set(x,P)}else pt.set(w.messageId,St(w.messageId,w.prompt)),ue&&_e&&Ye();if(Vn!==void 0&&w.originator?.clientId===Vn){let x=Tt.shift();x&&(x.messageId=w.messageId,dn.set(w.messageId,x))}}),g.onNotification("hydra-acp/prompt_queue/updated",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string"||!pt.has(w.messageId))return;pt.set(w.messageId,St(w.messageId,w.prompt));let S=dn.get(w.messageId);if(S){let x=Array.isArray(w.prompt)?w.prompt:[],A="",P=[];for(let L of x){if(!L||typeof L!="object")continue;let _=L;_.type==="text"&&typeof _.text=="string"?A+=_.text:_.type==="image"&&typeof _.data=="string"&&typeof _.mimeType=="string"&&P.push({data:_.data,mimeType:_.mimeType,sizeBytes:Math.floor(_.data.length*3/4)})}S.text=A,S.attachments=P}ue&&_e&&Ye()}),g.onNotification("hydra-acp/prompt_queue/removed",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;w.reason==="started"&&(te=w.messageId);let S=nt.get(w.messageId);S!==void 0&&(clearTimeout(S),nt.delete(w.messageId)),pt.delete(w.messageId)&&ue&&_e&&Ye();let A=dn.get(w.messageId);A&&(dn.delete(w.messageId),w.reason==="started"&&(A.flushed=!0,R({kind:"user-text",text:A.displayText,attachments:A.attachments}),ht=A))}),g.onNotification("hydra-acp/cancel_failed",h=>{if(b)return;let w=h??{};if(!(typeof ue<"u"&&ue!==null))return;Kn=Date.now(),xn=!0;let x=typeof w.code=="number"?` (${w.code})`:"",A=typeof w.message=="string"&&w.message.length>0?`: ${w.message}`:"";ue.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`cancel rejected by agent${x}${A} \u2014 this agent build may not support cancellation. Cancel again to force-stop (restarts the agent).`,bodyStyle:"tool-status-fail"}])}),g.onNotification("hydra-acp/prompt/amended",h=>{if(b)return;let w=h??{};if(typeof w.cancelledMessageId!="string")return;let S=w.cancelledMessageId;rt.add(S),ht!==null&&ht.messageId!==void 0&&ht.messageId===S&&(R({kind:"turn-complete",stopReason:"cancelled",amended:!0}),ht=null,rt.delete(S))});let mi=h=>{let w=h??{},S=typeof w.toolCallId=="string"?w.toolCallId:void 0,x;w.outcome&&typeof w.outcome=="object"?x=w.outcome:typeof w.chosenOptionId=="string"&&(x={kind:"selected",optionId:w.chosenOptionId}),gi(S,x?{outcome:x}:void 0)},be=null,gi=(h,w)=>{if(!be||be.toolCallId&&h&&be.toolCallId!==h)return;let S=be.resolve;be=null,I.setPermissionPrompt(null),S(w??{outcome:{outcome:"cancelled"}})},yi=h=>{if(!be?.toolCallId)return;let w=h??{};w.sessionUpdate!=="tool_call"&&w.sessionUpdate!=="tool_call_update"||w.toolCallId===be.toolCallId&&(!w.status||w.status==="pending"||gi(w.toolCallId,void 0))},at=()=>{if(!be){I.setPermissionPrompt(null);return}I.setPermissionPrompt({title:be.title,detail:be.detail,options:be.options.map(h=>({label:h.name})),selectedIndex:be.selectedIndex})},An=h=>{if(!be)return;let{options:w,resolve:S}=be;if(be=null,I.setPermissionPrompt(null),h===null){S({outcome:{outcome:"cancelled"}});return}S({outcome:{outcome:"selected",optionId:h}})};g.onRequest("session/request_permission",async h=>{if(b)return{outcome:{outcome:"cancelled"}};if(s.dangerouslySkipPermissions)return rr(h);let w=h??{},x=(Array.isArray(w.options)?w.options:[]).map(G=>({optionId:G.optionId,name:Ae(G.name??""),...G.kind!==void 0?{kind:G.kind}:{}})),A=w.toolCall?.title??w.toolCall?.name??"tool",P=Ae(A),L=Ae(Vm(Km(h))),_=w.toolCall?.toolCallId;return x.length===0?(I.appendLines([{prefix:"\u{1F512} ",body:`Permission requested \xB7 ${P} \xB7 (no options offered, cancelling)`,bodyStyle:"tool-status-fail"}]),{outcome:{outcome:"cancelled"}}):new Promise(G=>{be={title:P,detail:L,options:x,selectedIndex:0,resolve:G,toolCallId:_},at()})}),g.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}}));let xs,wi,cr=!0,vo=!1;try{let h=await g.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}});wi=h?.agentInfo?.name,h?.agentCapabilities?.promptCapabilities?.image===!1&&(cr=!1),vo=Mt(h?._meta??void 0).prompt?.amending===!0}catch{}let ve=a.sessionId,At=a.agentId,Ke=a.cwd,Zt,Vn,lr,As,Cs,Yn,ur,en,bi,Ie;if(a.sessionId==="__new__"){let h={};s.agentId&&(h.agentId=s.agentId),s.name&&(h.title=s.name),s.model&&(h.model=s.model);let w={cwd:a.cwd,...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}},S=await Nm({request:()=>g.request("session/new",w),showBanner:(P,L,_)=>Dm(t,P,L,_,{authenticate:G=>g.request("authenticate",{methodId:G})}),resolveOnboarding:async P=>{if(P)try{return(await Qc(n)).find(G=>G.id===P)?.onboarding}catch{return}},fallbackAgentId:s.agentId});if(S.kind==="cancel")return t.grabInput(!1),m.close().catch(()=>{}),null;if(S.kind==="back"){t.grabInput(!1),m.close().catch(()=>{});let P={...s};return delete P.sessionId,delete P.forceNew,delete P.resume,delete P.agentId,P}let x=S.result;c.write(d),ve=x.sessionId,r.sessionId=ve,r.readonly=!1;let A=Mt(x._meta??void 0);A.clientId&&(Vn=A.clientId),xs=A.upstreamSessionId,A.agentId&&(At=A.agentId),A.cwd&&(Ke=A.cwd),A.title&&(Zt=A.title),lr=A.currentModel,As=A.currentMode,bi=A.currentUsage,Ie=A.turnStartedAt,A.availableCommands&&(Cs=Aa(A.availableCommands)),A.availableModes&&(Yn=A.availableModes),ur=uy(x.configOptions),en=A.queue}else{let h={};s.readonly===!0&&(h.readonly=!0),e.tui.toolContent==="references"&&(h.toolContent="references"),s.drip===!0&&(h.replayMode="drip",s.dripSpeed!==void 0&&(h.dripSpeed=s.dripSpeed)),a.resumeHint!==void 0&&(h.resume={upstreamSessionId:a.resumeHint.upstreamSessionId,agentId:a.resumeHint.agentId,cwd:a.resumeHint.cwd});let w=await g.request("session/attach",{sessionId:a.sessionId,historyPolicy:"full",clientInfo:{name:"hydra-acp-tui",version:fe},...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}});ve=w.sessionId,w.clientId&&(Vn=w.clientId),r.sessionId=ve,r.readonly=s.readonly===!0;let S=Mt(w._meta??void 0);xs=S.upstreamSessionId,S.agentId&&(At=S.agentId),S.cwd&&(Ke=S.cwd),S.title&&(Zt=S.title),lr=S.currentModel,As=S.currentMode,bi=S.currentUsage,Ie=S.turnStartedAt,S.availableCommands&&(Cs=Aa(S.availableCommands)),S.availableModes&&(Yn=S.availableModes),ur=uy(w.configOptions),en=S.queue}let tn=M.tuiHistoryFile(ve),fr=M.globalTuiHistoryFile(),Ve=await Hi(tn).catch(()=>[]),Ft=await Hi(fr).catch(()=>[]);Ft.length>e.tui.promptHistoryMaxEntries&&(Ft=Ft.slice(Ft.length-e.tui.promptHistoryMaxEntries));let Wt=[...Ve],he=new qn({history:aa(Ft,Wt)});_e=he;let vi=!1,Gn=(h,w)=>{let S=h.replace(/\n+$/,"");if(S.length===0)return;let x=(w??h).replace(/\n+$/,""),A=Ui(Ve,S),P=A!==Ve;Ve=A,Wt=Ui(Wt,x);let L=Ui(Ft,S,e.tui.promptHistoryMaxEntries),_=L!==Ft;Ft=L,he.setHistory(aa(Ft,Wt)),P&&qs(tn,Ve).catch(()=>{}),_&&tp(fr,S).catch(()=>{})};U>0&&he.setTurnRunning(!0);let ft=null,Rs=null;jg(e.tui.ambiguousWidth==="wide"),Wh(e.tui.diffContextLines);let Cn=!1,I,Ii=()=>{Cn&&(Cn=!1,I.start())},Io=()=>{Cn||(Cn=!0,I.stop(),process.kill(process.pid,"SIGTSTP"))};process.platform!=="win32"&&process.on("SIGCONT",Ii),I=new Sd({term:t,dispatcher:he,repaintThrottleMs:e.tui.repaintThrottleMs,maxScrollbackLines:e.tui.maxScrollbackLines,mouse:i.mouseEnabled,inAppSelection:i.inAppSelectionEnabled,selectionClipboard:e.tui.selectionClipboard,openFileCommand:e.tui.openFileCommand,progressIndicator:e.tui.progressIndicator,readonly:s.readonly===!0,onSuspend:process.platform!=="win32"?Io:void 0,onBlockClick:(h,w)=>{Uy(h,w)},onBlockDoubleClick:(h,w)=>Hy(h,w),onBlockVisible:h=>{By(h)},onMouse:h=>{if(h.kind!=="press"||h.button!=="middle")return;let w={type:"attachment-request",source:"primary"};s.readonly===!0&&fy(w)||ie(w)},onKey:h=>{for(let w of h){if(be&&Ed(w)||Md(w)||Ci(w)||xo(w)||Ts(w)||ki(w))continue;if(w.type==="key"&&w.name==="escape"&&I.isScrolledBack()){I.scrollToBottom();continue}if(w.type==="attachment-paths"){Ue(w.paths);continue}let S=he.feed(w);for(let x of S)s.readonly===!0&&fy(x)||ie(x)}Si(),I.setBannerSearchIndicator(he.state().historySearchQuery),I.setAttachments(he.state().attachments),I.refreshPrompt()}}),ue=I,I.setStickyBottomKey("plan");let vt=[{name:"/help",description:"Show TUI built-in commands"},{name:"/quit",description:"Exit the TUI"},{name:"/clear",description:"Clear scrollback"},{name:"/sessions",description:"List sessions"},{name:"/resume",description:"Switch sessions (open the picker)"},{name:"/session",description:"Switch session: /session <id|next|prev> (no arg opens picker)"},{name:"/rename",description:"Rename this session (alias for /hydra title): /rename [title]"},{name:"/model",description:"Switch model: /model <model-id>"},{name:"/agent",description:"Switch agent via config option: /agent <agent-id>"},{name:"/btw",description:"Run an ancillary forked session: /btw <prompt>"}],pr=Cs??[],Fe=Yn??[],nn=ur??[],So=()=>nn.find(h=>h.id==="agent"),ko=()=>{let h=new Set,w=[];for(let S of[...vt,...pr])h.has(S.name)||(h.add(S.name),w.push(S));return w},Qn=()=>{let h=he.state().buffer,w=h[0]??"";if(!w.startsWith("/"))return[];if(h.length>1)return[];let S=w.indexOf(" "),x=S===-1?w:w.slice(0,S);if(x.lastIndexOf("/")>0)return[];let A=ko().filter(P=>P.name.startsWith(x));return A.length===1&&A[0]?.name===x?[]:A},sn=[],Si=()=>{let h=Qn();if(h.length>0){sn=[],I.setCompletions(h);return}I.setCompletions(sn)},Ts=h=>{if(h.type!=="key"||h.name!=="tab")return sn.length>0&&(sn=[]),!1;let w=Qn();if(I.isOverlayOpen()&&w.length===0)return I.toggleFocusedPane(),!0;if(w.length>0){sn=[];let S=he.state().buffer[0]??"",x=Vg({matches:w.map(A=>A.name),firstLine:S});return x===null||he.replaceFirstLine(x),!0}return Es()},Es=()=>{let h=he.state(),w=h.buffer[h.row]??"",S=sy(w,h.col);if(S===null)return!1;let x=ry(S.token,Ke);return x===null?!1:(x.replacement!==S.token&&he.replaceRangeOnCurrentLine(S.start,h.col,x.replacement),sn=x.candidates.length>1?x.candidates.map(A=>({name:A})):[],!0)},ki=h=>!I.isOverlayOpen()||h.type!=="key"||h.name!=="escape"&&h.name!=="ctrl-c"?!1:(K&&(K.cancel(),K=null,J=null),I.closeBtwOverlay(),!0),xo=h=>{if(!I.isScrollbackSearchActive())return h.type==="key"&&h.name==="ctrl-r"&&I.isScrolledBack()?(I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(""),!0):!1;if(h.type==="char"){let w=I.scrollbackSearchTerm()+h.ch;return I.updateScrollbackSearchTerm(w),!0}if(h.type==="paste"){let w=I.scrollbackSearchTerm()+h.text.replace(/\n/g," ");return I.updateScrollbackSearchTerm(w),!0}if(h.type==="key")switch(h.name){case"ctrl-r":return I.advanceScrollbackSearch(),!0;case"ctrl-s":return I.retreatScrollbackSearch(),!0;case"backspace":{let w=I.scrollbackSearchTerm();return w.length===0?I.cancelScrollbackSearch():I.updateScrollbackSearchTerm(w.slice(0,-1)),!0}case"enter":return I.acceptScrollbackSearch(),!0;case"escape":case"ctrl-c":return I.cancelScrollbackSearch(),!0;default:return!0}return!0},Ed=h=>{if(!be)return!1;let w=be.options;if(h.type==="key")switch(h.name){case"up":return be.selectedIndex=Math.max(0,be.selectedIndex-1),at(),!0;case"down":return be.selectedIndex=Math.min(w.length-1,be.selectedIndex+1),at(),!0;case"enter":{let S=w[be.selectedIndex];return S&&An(S.optionId),!0}case"escape":case"ctrl-c":return An(null),!0;default:return!0}if(h.type==="char"&&/^[1-9]$/.test(h.ch)){let S=parseInt(h.ch,10)-1,x=w[S];return x&&An(x.optionId),!0}return!0},Ao=At||wi||"?",It={...bi??{}};c.finalize(),I.start({skipFullscreen:!0}),I.setHideThoughts(!i.showThoughts),I.setSessionbar({agent:Ao,cwd:Ke,sessionId:ve,title:Zt,model:lr,usage:{...It}}),As&&I.setBanner({currentMode:As}),lo().then(h=>{h&&I.notify(`\u2728 ${uo(h)}`,3e4)}).catch(()=>{});let st=null,hr=new Promise(h=>{st=h}),rn=()=>{g.notify("session/cancel",{sessionId:ve}).catch(()=>{})},on=()=>{ue!==null&&U===1&&(Y=!0,ue.setBanner({status:"cancelling",elapsedMs:void 0,stalled:!1}))},an=()=>{if(ft){ft.cancel(),on();return}if(U>0){rn(),on();return}mr()},mr=()=>{C(0)},Co=()=>{let h="enqueue prompt (sends now, or queues during a turn)",w="amend the in-flight turn (cancel + replace)";return[...i.defaultEnterAction==="amend"?[["Enter",w],["Ctrl+Enter / Shift+Enter / ^S",h]]:[["Enter",h],["Ctrl+Enter / Shift+Enter / ^S",w]],...fC]},Pd=()=>{if(I.isHelpPromptActive()){I.setHelpPrompt(null);return}I.setHelpPrompt({title:"Hotkeys",entries:Co(),hint:"any key dismisses \xB7 /help lists commands"})},Md=h=>I.isHelpPromptActive()?(h.type==="key"&&h.name==="ctrl-g",I.setHelpPrompt(null),!0):!1,Rn=["tools","plan","thoughts","diffs","mouse","enter"],Jt=0,xi=h=>{switch(h){case"tools":return i.toolsExpanded?"expanded":"collapsed";case"plan":return i.planExpanded?"expanded":"collapsed";case"thoughts":return i.showThoughts?"shown":"hidden";case"diffs":return i.showFileUpdates;case"mouse":return i.mouseEnabled?"on":"off";case"enter":return i.defaultEnterAction}},Ro=h=>{switch(h){case"tools":return"Tools";case"plan":return"Plan";case"thoughts":return"Thoughts";case"diffs":return"File updates";case"mouse":return"Mouse capture";case"enter":return"Enter key"}},To=()=>({title:"Session options",options:Rn.map(h=>({label:Ro(h),value:xi(h)})),selectedIndex:Jt}),Ai=()=>{I.isOptionsPromptActive()&&I.setOptionsPrompt(To())},Xn=()=>{if(I.isOptionsPromptActive()){I.setOptionsPrompt(null);return}Jt=0,I.setOptionsPrompt(To())},Tn=h=>{switch(h){case"tools":i.toolsExpanded=!i.toolsExpanded,_s.clear(),yr.clear(),$y();break;case"plan":i.planExpanded=!i.planExpanded,ne=null,Ge();break;case"thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts);break;case"diffs":i.showFileUpdates=i.showFileUpdates==="diff"?"edit":"diff",Mn.clear(),Ny();break;case"mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w;break}case"enter":i.defaultEnterAction=i.defaultEnterAction==="amend"?"enqueue":"amend";break}Ai()},Ct=h=>{(async()=>{try{switch(h){case"tools":case"plan":I.notify(`${Ro(h)} is session-only \u2014 not saved`);return;case"thoughts":await Ei("showThoughts",i.showThoughts);break;case"diffs":await Ei("showFileUpdates",i.showFileUpdates);break;case"mouse":await Ei("mouse",i.mouseEnabled);break;case"enter":await Ei("defaultEnterAction",i.defaultEnterAction);break}I.notify(`saved default: ${Ro(h)} ${xi(h)}`)}catch(w){I.notify(`save failed: ${w instanceof Error?w.message:String(w)}`)}})()},Ci=h=>{if(!I.isOptionsPromptActive())return!1;if(h.type==="key")switch(h.name){case"up":return Jt=Math.max(0,Jt-1),Ai(),!0;case"down":return Jt=Math.min(Rn.length-1,Jt+1),Ai(),!0;case"enter":{let w=Rn[Jt];return w&&Tn(w),!0}case"ctrl-o":case"escape":case"ctrl-c":return I.setOptionsPrompt(null),!0;case"ctrl-d":return I.setOptionsPrompt(null),!1;default:return!0}if(h.type==="char"){if(/^[1-9]$/.test(h.ch)){let w=parseInt(h.ch,10)-1,S=Rn[w];return S&&(Jt=w,Tn(S)),!0}if(h.ch==="s"||h.ch==="S"){let w=Rn[Jt];return w&&Ct(w),!0}}return!0},gr=()=>{b=!0,K?(K.cancel(),K=null,J=null):J!==null&&(vn(n,J).catch(()=>{}),J=null),process.off("SIGINT",an),process.platform!=="win32"&&process.off("SIGCONT",Ii),ee!==null&&(clearInterval(ee),ee=null);for(let h of nt.values())clearTimeout(h);nt.clear(),I.clearWindowTitle(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{}),m.close().catch(()=>{})},C=(h=0)=>{gr(),st&&(st(null),st=null),h!==0&&process.exit(h)},E=async()=>{if(!st)return;K?(K.cancel(),K=null,J=null):J!==null&&(vn(n,J).catch(()=>{}),J=null);let h=he.state().buffer.join(`
161
- `);h.replace(/\s+$/,"").length>0&&Gn(h),I.pauseRepaint(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{});let w=null,S=null;for(;w===null;){let L=await bn(n,{includeNonInteractive:!0}),_=await eu(t,{cwd:Ke,sessions:L,config:e,target:n,currentSessionId:ve,prefs:o});if(_.kind==="abort"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(_.kind==="exit"){C(0);return}if(_.kind==="new"){w={choice:_,sessions:L};break}if(_.kind==="fork"){let le=await yy(t,n,_,L);if(le.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(le.kind==="back")continue;w={choice:{kind:"attach",sessionId:le.ctx.sessionId,...le.ctx.agentId?{agentId:le.ctx.agentId}:{}},sessions:L},S={readonly:!1,cwd:le.ctx.cwd},le.ctx.resumeHint!==void 0&&(S.resumeHint=le.ctx.resumeHint);break}let G=L.find(le=>le.sessionId===_.sessionId);if(!(G!==void 0&&!!G.importedFromMachine&&!G.upstreamSessionId&&_.readonly!==!0)){if(n.isLocal&&G&&!G.importedFromMachine&&_.readonly!==!0&&!(await po(G.cwd)).ok){let Pe=await ar(t,G,{defaultCwd:Nt(e.defaultCwd),title:"Working directory missing \u2014 choose cwd",intro:"This session's working directory no longer exists. Pick a new one:"});if(Pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(Pe.kind==="back")continue;w={choice:_,sessions:L},S={readonly:!1,cwd:Pe.path,resumeHint:{agentId:_.agentId??G.agentId??"",cwd:Pe.path,upstreamSessionId:""}};break}w={choice:_,sessions:L};break}let Ee={...s,readonly:!1},pe=await gy(t,G,_,Ee);if(pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}pe.kind!=="back"&&(w={choice:_,sessions:L},S={readonly:Ee.readonly===!0,cwd:pe.ctx.cwd},pe.ctx.resumeHint!==void 0&&(S.resumeHint=pe.ctx.resumeHint))}let{choice:x}=w,A=st;if(st=null,process.off("SIGINT",an),m.close().catch(()=>{}),x.kind==="new"){let{sessionId:L,..._}=s,G={..._,cwd:x.cwd??Ke,forceNew:!0,readonly:!1};x.prompt!==void 0&&(G.initialPrompt=x.prompt),A(G);return}if(x.kind!=="attach")return;let P={...s,sessionId:x.sessionId,cwd:S?.cwd??Ke,readonly:S?.readonly??x.readonly===!0};x.agentId!==void 0&&(P.agentId=x.agentId),S?.resumeHint!==void 0?P.resumeHint=S.resumeHint:delete P.resumeHint,A(P)},$=async(h="next")=>{if(!st)return;let S=(await bn(n)).filter(Ee=>Ee.status==="live");if(S.length<=1)return;let x=S.findIndex(Ee=>Ee.sessionId===ve),L=((x===-1?0:x)+(h==="prev"?-1:1)+S.length)%S.length,_=S[L],G=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let Le={...s,sessionId:_.sessionId,cwd:Ke,readonly:!1};_.agentId!==void 0&&(Le.agentId=_.agentId),G(Le)},X=async h=>{if(!st)return;let w=await bn(n,{includeNonInteractive:!0}),S=h.trim();if(!S){I.notify("usage: /session <id|next|prev>");return}let x=S.startsWith(Ht)?[S]:[S,Ht+S],A=w.find(_=>x.includes(_.sessionId));if(!A){let _=w.filter(G=>x.some(Le=>G.sessionId.startsWith(Le)));if(_.length===1)A=_[0];else if(_.length>1){I.notify(`ambiguous session id: ${S} (${_.length} matches)`);return}}if(!A){I.notify(`no session matches: ${S}`);return}if(A.sessionId===ve){I.notify("already on that session");return}let P=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let L={...s,sessionId:A.sessionId,cwd:A.cwd??Ke,readonly:A.status!=="live"};A.agentId!==void 0&&(L.agentId=A.agentId),delete L.resumeHint,P(L)},ie=h=>{switch(h.type){case"send":i.defaultEnterAction==="amend"?En(h.text,h.attachments,h.displayText):Ms(h.text,h.attachments,h.displayText);return;case"amend":i.defaultEnterAction==="amend"?Ms(h.text,h.attachments,h.displayText):En(h.text,h.attachments,h.displayText);return;case"queue-edit":{let w=Ps(h.index);if(!w)return;let S=[];h.text.length>0&&S.push({type:"text",text:h.text});for(let x of h.attachments)S.push({type:"image",data:x.data,mimeType:x.mimeType});g.request("hydra-acp/prompt/update",{sessionId:ve,messageId:w,prompt:S}).then(x=>{let A=x;!A.updated&&A.reason!=="ok"&&I.notify(`queue edit skipped (${A.reason})`)}).catch(x=>{I.notify(`queue edit failed: ${x.message}`)});return}case"queue-remove":{let w=Ps(h.index);if(!w)return;g.request("hydra-acp/prompt/cancel",{sessionId:ve,messageId:w}).then(S=>{let x=S;!x.cancelled&&x.reason!=="ok"&&I.notify(`queue cancel skipped (${x.reason})`)}).catch(S=>{I.notify(`queue cancel failed: ${S.message}`)});return}case"cancel":{if(I.isOverlayOpen()){K&&(K.cancel(),K=null,J=null),I.closeBtwOverlay();return}if(h.prefill&&ft){let w=pt.size===0,S=he.state().buffer.every(x=>x==="");w&&S&&(Rs={text:ft.text,attachments:ft.attachments})}ft?ft.cancel():U>0&&rn(),on();return}case"exit":mr();return;case"plan-toggle":Eo(h.on);return;case"redraw-banner":I.setBanner({});return;case"redraw":I.fullRedraw();return;case"scroll-to-top":I.scrollToTop();return;case"scroll-to-bottom":I.scrollToBottom();return;case"switch-session":E().catch(()=>{});return;case"next-live-session":$().catch(()=>{});return;case"toggle-options":Xn();return;case"toggle-thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts),I.notify(i.showThoughts?"thoughts shown":"thoughts hidden");return;case"toggle-mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w,I.notify(w?"mouse capture on \u2014 wheel scrolls; shift+drag to select text":"mouse capture off \u2014 click-drag selects text; PgUp/PgDn scrolls");return}case"show-help":Pd();return;case"escalate-search":I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(h.query);return;case"attachment-request":xe(h.source);return}},Ue=async h=>{if(!cr){I.notify("agent does not accept image attachments");return}let w=0;for(let S of h){if(S.startsWith("data:")){let A=_l(S);if(!A){I.notify("unsupported data: URI");continue}if(A.sizeBytes>Sn){I.notify(`image too large (${qt(A.sizeBytes)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:A.mimeType,data:A.data,name:"pasted image",sizeBytes:A.sizeBytes}),w++;continue}let x=ho(S);if(!x){I.notify(`unsupported image type: ${bo.basename(S)}`);continue}try{let A=await lC.readFile(S);if(A.length>Sn){I.notify(`image too large (${qt(A.length)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:x,data:A.toString("base64"),name:bo.basename(S),sizeBytes:A.length}),w++}catch(A){I.notify(`cannot read ${bo.basename(S)}: ${A.message}`)}}w>0&&(I.setAttachments(he.state().attachments),I.refreshPrompt())},xe=async(h="clipboard")=>{let w=h==="primary"?await Tg():await Rg();if(!w.ok){I.notify(w.reason);return}if(w.kind==="image"){if(!cr){I.notify("agent does not accept image attachments");return}he.addAttachment(w.attachment),I.setAttachments(he.state().attachments),I.refreshPrompt();return}let S=he.feed({type:"paste",text:w.text});for(let x of S)ie(x);I.refreshPrompt()},Rt=h=>h.attachmentCount>0?`${h.text} \xB7 \u{1F4CE}\xD7${h.attachmentCount}`:h.text,St=(h,w)=>{let S=Array.isArray(w)?w:[],x="",A=0;for(let P of S){if(!P||typeof P!="object")continue;let L=P;L.type==="text"&&typeof L.text=="string"?x+=L.text:L.type==="image"&&(A+=1)}return{messageId:h,text:Ae(x),attachmentCount:A}},pt=new Map,Tt=[],dn=new Map,rt=new Set,ht=null,Ye=()=>{let h=[...pt.values()],w=h.map(Rt);I.setQueuedPrompts(w),I.setBanner({queued:h.length}),he.setQueue(h.map(S=>S.text))},Ps=h=>[...pt.values()][h]?.messageId;if(en&&en.length>0){for(let h of en){if(h.position===0){te=h.messageId;continue}pt.set(h.messageId,St(h.messageId,h.prompt))}pt.size>0&&Ye()}let Ms=(h,w,S)=>{I.scrollToBottom(),!Zn(h)&&(Gn(h,S),Ri(h,w,S))},En=(h,w,S)=>{if(I.scrollToBottom(),Zn(h))return;if(Gn(h,S),!vo||te===void 0){Ri(h,w,S);return}let x=te,A=[];h.length>0&&A.push({type:"text",text:h});for(let _ of w)A.push({type:"image",data:_.data,mimeType:_.mimeType});let P={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(P);let L=()=>{let _=Tt.indexOf(P);_>=0&&Tt.splice(_,1),P.messageId!==void 0&&dn.delete(P.messageId)};g.request("hydra-acp/prompt/amend",{sessionId:ve,targetMessageId:x,prompt:A}).then(_=>{let G=_;if(G.amended&&G.reason==="ok"){j(1);return}if(L(),G.reason==="target_completed"){I.notify("previous response finished \u2014 press Enter to send as a new turn"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_cancelled"){I.notify("amend skipped \u2014 previous turn was cancelled"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_not_found"){I.notify("amend skipped \u2014 no matching prompt"),he.setBuffer(h,w),I.refreshPrompt();return}}).catch(_=>{L(),I.notify(`amend failed: ${_.message}`),he.setBuffer(h,w),I.refreshPrompt()})},Eo=async h=>{if(Fe.length===0){I.notify("no modes advertised by agent");return}let w=I.currentModeId(),S=Fe.findIndex(P=>P.id===w),x=S===-1?0:(S+1)%Fe.length,A=Fe[x]?.id;if(A){I.setBanner({currentMode:A});try{await g.request("session/set_mode",{sessionId:ve,modeId:A})}catch(P){I.notify(`set_mode failed: ${P.message}`)}}},Zn=h=>{let w=h.replace(/\s+$/,"");if(!w.startsWith("/")||w.includes(`
162
- `))return!1;let S=w.indexOf(" ");switch(S===-1?w:w.slice(0,S)){case"/quit":case"/exit":return mr(),!0;case"/clear":return et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null,Pn.clear(),Mn.clear(),$n.clear(),_s.clear(),On.clear(),Os.clear(),I.clearScrollback(),!0;case"/help":{let A=[{prefix:" ",body:"Built-in commands:",bodyStyle:"system"}];for(let P of vt)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"});if(pr.length>0){A.push({prefix:" ",body:"Agent commands:",bodyStyle:"system"});for(let P of pr)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"})}return I.appendLines(A),!0}case"/agent":{let A=S===-1?"":w.slice(S+1).trim(),P=So();if(!P)return I.appendLines([{prefix:" ",body:"no agent config option advertised for this session",bodyStyle:"info"}]),!0;if(!A){let L=[{prefix:" ",body:"Available agents:",bodyStyle:"system"}];for(let _ of P.options){let G=_.value===P.currentValue?"* ":" ";L.push({prefix:" ",body:`${G}${_.value.padEnd(16)} ${_.name}`,bodyStyle:"info"})}return I.appendLines(L),!0}return P.options.some(L=>L.value===A)?A===P.currentValue?(I.notify(`already on agent ${A}`),!0):(I.notify(`switching to ${A}\u2026`),g.request("session/set_config_option",{sessionId:ve,configId:"agent",value:A}).catch(L=>{I.notify(`set_config_option failed: ${L.message}`)}),!0):(I.notify(`unknown agent: ${A}`),!0)}case"/sessions":return I.appendLines([{prefix:" ",body:"Run `hydra-acp sessions` (or `hydra sessions`) for the full list.",bodyStyle:"info"}]),!0;case"/resume":return E().catch(()=>{}),!0;case"/session":{let A=S===-1?"":w.slice(S+1).trim();return A?A==="next"||A==="prev"?($(A).catch(P=>{I.notify(`session ${A} failed: ${P.message}`)}),!0):(X(A).catch(P=>{I.notify(`session switch failed: ${P.message}`)}),!0):(E().catch(()=>{}),!0)}case"/rename":{let A=S===-1?"":w.slice(S+1).trim(),P=A.length>0?`/hydra title ${A}`:"/hydra title";return Gn(w,w),Ri(P,[],w),!0}case"/btw":{let A=S===-1?"":w.slice(S+1).trim();if(!A)return I.appendLines([{prefix:" ",body:"/btw requires a prompt",bodyStyle:"info"}]),!0;if(ve==="__new__")return I.appendLines([{prefix:" ",body:"no active session to fork",bodyStyle:"info"}]),!0;F+=1;let P=F;K&&(K.cancel(),K=null);let L=null;J!==null&&!W?L=J:J!==null&&(vn(n,J).catch(()=>{}),J=null),W=!1,I.openBtwOverlay(),I.setBtwOverlayStatus({label:"busy",style:"busy"});let _=new pd({getMaxWidth:()=>{let pe=I.width();return pe>0?pe:void 0}});_.on("changed",()=>{I.setBtwOverlayContent(_.getLines())});let G={};_.append({sessionUpdate:"prompt_received",prompt:[{type:"text",text:A}]});let Le=pe=>{_.append({sessionUpdate:"agent_message_chunk",content:{type:"text",text:pe}})},Ee={};return L!==null&&(Ee.reuseSessionId=L),yg(n,ve,A,Ee).then(pe=>{if(P!==F){pe.cancel();return}K=pe,J=pe.sessionId,I.setBtwOverlayMeta({sessionId:pe.sessionId}),pe.on("event",le=>{if(P===F)if(le.kind==="update"){_.append(le.update);let Pe=yn(le.update);if(Pe&&Pe.kind==="usage-update"){let Ls=!1;Pe.used!==void 0&&G.used!==Pe.used&&(G.used=Pe.used,Ls=!0),Pe.size!==void 0&&G.size!==Pe.size&&(G.size=Pe.size,Ls=!0),Pe.costAmount!==void 0&&G.costAmount!==Pe.costAmount&&(G.costAmount=Pe.costAmount,Ls=!0),Pe.costCurrency!==void 0&&G.costCurrency!==Pe.costCurrency&&(G.costCurrency=Pe.costCurrency,Ls=!0),Ls&&I.setBtwOverlayMeta({usage:{...G}})}}else le.kind==="completed"?(I.setBtwOverlayStatus({label:"done",style:"done"}),K=null):le.kind==="cancelled"?(I.setBtwOverlayStatus({label:"cancelled",style:"cancelled"}),K=null,J=null):le.kind==="errored"&&(I.setBtwOverlayStatus({label:"errored",style:"errored"}),Le(`btw errored: ${le.error.message}`),J!==null&&vn(n,J).catch(()=>{}),K=null,J=null)})}).catch(pe=>{if(P!==F)return;let le=pe instanceof Error?pe.message:String(pe);I.setBtwOverlayStatus({label:"errored",style:"errored"}),Le(`btw startup failed: ${le}`),I.appendLines([{prefix:" ",body:`btw startup failed: ${le}`,bodyStyle:"tool-status-fail"}])}),!0}default:return!1}},Ri=async(h,w,S)=>{let x=[];h.length>0&&x.push({type:"text",text:h});for(let Ee of w)x.push({type:"image",data:Ee.data,mimeType:Ee.mimeType});j(1);let A={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(A),xn=!1;let P=!1,L=null,_=Ee=>{typeof ue<"u"&&ue!==null&&ue.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:Ee,bodyStyle:"tool-status-fail"}])},G=!1;ft={text:h,attachments:w,cancel:()=>{if(xn){xn=!1,G=!0,_("force-stopping agent \u2014 turn aborted; resumes on your next message\u2026"),g.request("hydra-acp/session/force_cancel",{sessionId:ve}).catch(pe=>{_(`force-stop failed: ${pe.message}`)});return}if(P)return;P=!0,g.notify("session/cancel",{sessionId:ve}).catch(()=>{});let Ee=Date.now();L=setTimeout(()=>{ft!==null&&(Kn>=Ee||(xn=!0,_("cancel not acknowledged by agent \u2014 the turn is still running. Cancel again to force-stop (restarts the agent).")))},dr)}};let Le;try{let Ee=await g.request("session/prompt",{sessionId:ve,prompt:x});Ee&&typeof Ee.stopReason=="string"&&(Le=Ee.stopReason)}catch(Ee){let pe=Tt.indexOf(A);pe>=0&&Tt.splice(pe,1),A.messageId!==void 0&&dn.delete(A.messageId),G?I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"turn force-stopped",bodyStyle:"tool-status-fail"}]):I.appendLines([{prefix:"\u2717 ",prefixStyle:"tool-status-fail",body:Ee.message,bodyStyle:"tool-status-fail"}])}finally{if(ft=null,L!==null&&(clearTimeout(L),L=null),j(-1),A.flushed&&ht===A){let Ee=A.messageId!==void 0&&rt.has(A.messageId);Ee&&A.messageId!==void 0&&rt.delete(A.messageId);let pe={kind:"turn-complete"};Le!==void 0&&(pe.stopReason=Le),Ee&&(pe.amended=!0),R(pe),ht=null}if(Rs!==null){let{text:Ee,attachments:pe}=Rs;Rs=null,he.state().buffer.every(Pe=>Pe==="")&&(he.setBuffer(Ee,pe),I.refreshPrompt())}}},et=new Map,Pn=new Map,Mn=new Map,es=new Map,_n=[],it=0,zt=`tools:${it}`,$n=new Map,_s=new Map,yr=new Set,$s=new Map,On=new Map,Os=new Map,T=null,B=null,ae=null,O=null,ne=null,ce=e.tui.maxToolItems,Te=e.tui.maxPlanItems,Ne=()=>({maxPlanItems:ne??i.planExpanded?1/0:Te}),Ge=()=>{if(O===null)return;let h=ms(O,Ne());h.length>0&&I.upsertLines("plan",[{body:""},...h])},mt="",Me=null,Lt=0,_d=()=>{if(Me===null)return;let h=I.width(),w=gs(mt,h>0?{maxWidth:h}:void 0);w.length!==0&&I.upsertLines(Me,w)},Ty=h=>{h.length!==0&&(Me===null&&(I.ensureSeparator(),Me=`agent:${Lt}`,Lt+=1,mt=""),mt+=h,_d())},ts=()=>{Me=null,mt=""},wr="",Fs=null,ru=0,Ey=()=>({prefix:" ",body:"\u25B8 Thoughts",bodyStyle:"thought"}),Py=()=>{if(Fs===null||wr.length===0)return;let h=ti(wr);h.length!==0&&I.upsertLines(Fs,h)},My=h=>{let w=On.get(h);if(w===void 0)return[];let S=ti(w.text);return w.workerTaskId&&S.unshift({prefix:" ",body:`[T${w.workerTaskId}] `,bodyStyle:"dim"}),S},_y=(h,w)=>{h.length!==0&&(Fs===null&&(I.ensureSeparator("thought"),Fs=`thought:${ru}`,ru+=1,wr=""),wr+=h,On.set(Fs,{text:wr,workerTaskId:w}),Py())},ns=()=>{Fs=null,wr=""},iu=h=>hC({...h,collapsedLimit:ce}),ou=h=>_s.get(h)??i.toolsExpanded,Kt=()=>{if(T===null)return;let{lines:h,rowOwners:w}=iu({order:_n,states:et,startedAt:T,endedAt:B,stopReason:ae,expanded:ou(zt),perToolExpanded:yr});I.upsertLines(zt,h),$s.set(zt,w)},Po=h=>{let w=$n.get(h);if(!w)return;let{lines:S,rowOwners:x}=iu({order:w.order,states:w.states,startedAt:w.startedAt,endedAt:w.endedAt,stopReason:w.stopReason,expanded:ou(h),perToolExpanded:yr});I.upsertLines(h,S),$s.set(h,x)},$y=()=>{T!==null&&!$n.has(zt)&&Kt();for(let h of $n.keys())Po(h)},$d=()=>{T!==null&&$n.set(zt,{order:[..._n],states:new Map(et),startedAt:T,endedAt:B??Date.now(),stopReason:ae,rowOwners:$s.get(zt)??[]})},au=()=>{it+=1,zt=`tools:${it}`,T=Date.now(),B=null,ae=null,Kt()};function Oy(h){if(!h||typeof h!="object")return null;let w=h,S=Array.isArray(w.content)?w.content:void 0;if(!S)return null;let x=[],A=P=>{if(typeof P=="string"){x.push({text:Qe(P)});return}if(P&&typeof P=="object"){let L=P;typeof L.__hydraBlob=="string"&&x.push({hash:L.__hydraBlob})}};for(let P of S){if(!P||typeof P!="object")continue;let L=P;if(L.type==="content"&&L.content&&typeof L.content=="object"){let _=L.content;if(_.text!==void 0){A(_.text);continue}}if(L.type==="text"&&L.text!==void 0){A(L.text);continue}L.text!==void 0&&A(L.text)}return x.length>0?x:null}let du=(h,w)=>{let S=w.map(P=>"text"in P?P.text:"").join(`
163
- `);if(S.length===0)return;let{text:x,truncated:A}=Uh(S);h.resultText=x,h.resultTruncated=A},Mo=new Set,Fy=(h,w)=>{!w.some(x=>"hash"in x)||Mo.has(h)||(Mo.add(h),(async()=>{let x=await Promise.all(w.map(async P=>"text"in P?P:{text:await Od(P.hash)??""}));Mo.delete(h);let A=et.get(h);if(!A)for(let P of $n.values()){let L=P.states.get(h);if(L){A=L;break}}if(A){du(A,x),et.has(h)&&Kt();for(let[P,L]of $n)L.states.has(h)&&Po(P);I.repaintNow()}})().catch(()=>{Mo.delete(h)}))},cu=(h,w,S,x,A,P,L,_,G,Le)=>{let Ee=!et.has(h),pe=et.get(h),le=pe??{initialTitle:w??"tool",latestTitle:w??"tool",status:S??"pending",startedAt:Date.now()};if(!pe&&G!==void 0&&(le.workerTaskId=G),pe&&w!==void 0&&(le.latestTitle=w),P!==void 0&&le.detail===void 0&&(le.detail=P),L!==void 0&&le.detailFull===void 0&&(le.detailFull=L),_!==void 0&&_.length>0&&(le.locations=_),pe&&S!==void 0&&(le.status=S),pe||(le.status=S??"pending"),le.endedAt===void 0&&Kh(le.status)&&(le.endedAt=Date.now()),x!==void 0&&(le.errorText=x),A!==void 0&&(le.editDiff=A),Le!==void 0){let Pe=Oy(Le);Pe!==null&&(du(le,Pe),Pe.some(Ls=>"hash"in Ls)&&Fy(h,Pe))}et.set(h,le),Ee&&(T===null&&(it+=1,zt=`tools:${it}`,T=Date.now(),B=null,ae=null),_n.push(h))},Od=async h=>{try{let w=await g.request("hydra-acp/session/tool_content",{sessionId:ve,hash:h});return typeof w?.content=="string"?w.content:null}catch{return null}},_o=new Set,Ly=(h,w)=>{_o.has(h)||w.oldRef===void 0&&w.newRef===void 0||(_o.add(h),(async()=>{let[S,x]=await Promise.all([w.oldRef?Od(w.oldRef.hash):Promise.resolve(w.oldText),w.newRef?Od(w.newRef.hash):Promise.resolve(w.newText)]);if(w.oldRef!==void 0&&S===null||w.newRef!==void 0&&x===null){_o.delete(h);let Le=il(w,"diff",{deferredStatus:"error"});Le.length>0&&(I.upsertLines(`editdiff:${h}`,Le),I.repaintNow());return}let P={...w.path!==void 0?{path:w.path}:{},oldText:S??"",newText:x??""};Pn.set(h,P);let L=et.get(h);L?.editDiff&&(L.editDiff=P),_o.delete(h);let _=Mn.get(h),G=_===void 0?i.showFileUpdates:_?"diff":"edit";G!=="none"&&($o(h,P,G==="diff"?"diff":"edit"),I.repaintNow())})())},$o=(h,w,S)=>{let x=`editdiff:${h}`,A=il(w,S);if(A.length===0){I.removeKey(x);return}I.upsertLines(x,A),S==="diff"&&(w.oldRef!==void 0||w.newRef!==void 0)&&I.notifyWhenVisible(x)},By=h=>{if(!h.startsWith("editdiff:"))return;let w=h.slice(9),S=Pn.get(w);S&&(S.oldRef!==void 0||S.newRef!==void 0)&&Ly(w,S)},lu=h=>{let w=`editdiff:${h}`,S=i.showFileUpdates,x=et.get(h),A;if(S==="none"||!x?.editDiff||x.status!=="completed")A=null;else{let L=Mn.get(h);A=L!==void 0?L?"diff":"edit":S==="diff"?"diff":"edit"}if(A===null){I.removeKey(w);return}let P=x.editDiff;Pn.set(h,P),$o(h,P,A)},Ny=()=>{let h=i.showFileUpdates;for(let[w,S]of Pn){let x=`editdiff:${w}`,A=Mn.get(w),P=A===void 0?h:A?"diff":"edit";if(P==="none"){I.removeKey(x);continue}$o(w,S,P==="diff"?"diff":"edit")}},Dy=h=>{if(!h.path)return null;let w=Qe(h.oldText).split(`
160
+ `)}}function hC(t){let{order:e,states:n,startedAt:s,endedAt:r,stopReason:i,perToolExpanded:o,collapsedLimit:a=20}=t,d=e.length,c=a>0,l=!c||t.expanded?e:e.slice(Math.max(0,d-a)),f=d-l.length,u=r===null,p=r??Date.now(),m=p-s,g=!u&&i!==null&&i!=="end_turn"?i:null,y=g==="amended",v=y?`amended \xB7 ${In(m)}`:`stopped (${g}) \xB7 ${In(m)}`,b;if(d===0)g!==null?b=v:b=u?`thinking \xB7 ${In(m)}`:`thought \xB7 ${In(m)}`;else{let W=d===1?"tool":"tools",F=g!==null?v:u?In(m):`took ${In(m)}`,U=[`${d} ${W}`,F];u&&c&&f>0&&U.push(`${f} hidden`),b=U.join(" \xB7 ")}let k=d===0&&u,R=y?"tool-status-cancelled":"tool-status-fail",K=[{prefix:"\u2699 ",prefixStyle:k?"tool-status-running":g!==null?R:"tool",body:b,bodyStyle:k?"tool-status-running":g!==null?R:"dim"}],J=[null];for(let W of l){let F=n.get(W);if(F){let U=ro(F,p);if(K.push(...U),J.push(...U.map(()=>W)),o?.has(W)){let Y=jh(F);K.push(...Y),J.push(...Y.map(()=>W))}}}return{lines:K,rowOwners:J}}async function mC(t,e,n,s,r,i,o){let a=await gC(t,e,n,s,o);if(!a)return t.grabInput(!1),null;let d=a.sessionId==="__new__"?"Starting new session\u2026":"Resuming session\u2026",c=bC(t,d);c.write(d);let l=n.wsUrl,f=["acp.v1",`hydra-acp-token.${n.token}`],u=null,p=null,m=new li({url:l,subprotocols:f,onConnect:async h=>{h||u&&await u()},onDisconnect:h=>{p&&p(h)},log:()=>{}}),g=new kt(m);await m.start(),g.onNotification(Yo,h=>{let w=gf.safeParse(h);w.success&&c.applyProgress(w.data)});let y=[],v=null,b=!1,k=!1,R=(h,w)=>{h&&(v?v(h,w):y.push({event:h,rawUpdate:w}))},H,z=h=>{h!==H&&(H=h,h!==void 0&&I.appendLines([{prefix:" ",body:`\u2500\u2500 T${h} \u2500\u2500`,bodyStyle:"dim"}]))},K=null,J=null,W=!1,F=0,U=0,Y=!1,te,Z=null,ee=null,Q=null,oe=()=>setInterval(()=>{if(Z===null||ce===null)return;let h=Q===null?0:Date.now()-Q;ce.setBanner({elapsedMs:Date.now()-Z,stalled:h>=uC}),Kt()},1e3),Oe=!1,j=h=>{let w=U;U=Math.max(0,U+h);let S=typeof ce<"u"&&ce!==null;w===0&&U>0?(Y=!1,Z=Date.now(),Q=Date.now(),_e?.setTurnRunning(!0),S&&ce.setBanner({status:"busy",elapsedMs:0,stalled:!1}),ee===null&&S&&(ee=oe())):w>0&&U===0?(Y=!1,Z=null,Q=null,_e?.setTurnRunning(!1),ee!==null&&(clearInterval(ee),ee=null),S&&ce.setBanner({status:"ready",elapsedMs:void 0,stalled:!1})):U>0&&Y&&(Y=!1,S&&ce.setBanner({status:"busy",stalled:!1}))},ce=null,_e=null,$e,kn=null,ks=new Set(["session_info_update","current_model_update","current_mode_update","available_commands_update","available_modes_update","usage_update","config_option_update"]),Ot=h=>{let{update:w}=h??{},S=yn(w,{cwd:Ke});yC(w,S),Q=Date.now();let x=w?.sessionUpdate;if(typeof x=="string"&&!ks.has(x)){let A=w??{};typeof A.messageId=="string"&&($e=A.messageId)}if(x==="prompt_received"?j(1):S?.kind==="turn-complete"&&(j(-1),W=!0),x==="permission_resolved"){mi(w);return}R(S,w),yi(w)};g.onNotification("session/update",h=>{if(!b){if(kn!==null){kn.push(h);return}Ot(h)}}),g.onNotification("hydra-acp/session/closed",()=>{if(b)return;U>0&&j(-U),typeof ce<"u"&&ce!==null&&ce.setBanner({status:"cold",elapsedMs:void 0})});let nt=new Map,zn=200,Kn=0,xn=!1,dr=4e3;g.onNotification("hydra-acp/prompt_queue/added",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;if(typeof w._meta?.["hydra-acp"]?.amending=="string"){let x=w.messageId,A=w.prompt,P=setTimeout(()=>{b||(nt.delete(x),pt.set(x,St(x,A)),ce&&_e&&Ye())},zn);nt.set(x,P)}else pt.set(w.messageId,St(w.messageId,w.prompt)),ce&&_e&&Ye();if(Vn!==void 0&&w.originator?.clientId===Vn){let x=Tt.shift();x&&(x.messageId=w.messageId,dn.set(w.messageId,x))}}),g.onNotification("hydra-acp/prompt_queue/updated",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string"||!pt.has(w.messageId))return;pt.set(w.messageId,St(w.messageId,w.prompt));let S=dn.get(w.messageId);if(S){let x=Array.isArray(w.prompt)?w.prompt:[],A="",P=[];for(let L of x){if(!L||typeof L!="object")continue;let _=L;_.type==="text"&&typeof _.text=="string"?A+=_.text:_.type==="image"&&typeof _.data=="string"&&typeof _.mimeType=="string"&&P.push({data:_.data,mimeType:_.mimeType,sizeBytes:Math.floor(_.data.length*3/4)})}S.text=A,S.attachments=P}ce&&_e&&Ye()}),g.onNotification("hydra-acp/prompt_queue/removed",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;w.reason==="started"&&(te=w.messageId);let S=nt.get(w.messageId);S!==void 0&&(clearTimeout(S),nt.delete(w.messageId)),pt.delete(w.messageId)&&ce&&_e&&Ye();let A=dn.get(w.messageId);A&&(dn.delete(w.messageId),w.reason==="started"&&(A.flushed=!0,R({kind:"user-text",text:A.displayText,attachments:A.attachments}),ht=A))}),g.onNotification("hydra-acp/cancel_failed",h=>{if(b)return;let w=h??{};if(!(typeof ce<"u"&&ce!==null))return;Kn=Date.now(),xn=!0;let x=typeof w.code=="number"?` (${w.code})`:"",A=typeof w.message=="string"&&w.message.length>0?`: ${w.message}`:"";ce.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`cancel rejected by agent${x}${A} \u2014 this agent build may not support cancellation. Cancel again to force-stop (restarts the agent).`,bodyStyle:"tool-status-fail"}])}),g.onNotification("hydra-acp/prompt/amended",h=>{if(b)return;let w=h??{};if(typeof w.cancelledMessageId!="string")return;let S=w.cancelledMessageId;rt.add(S),ht!==null&&ht.messageId!==void 0&&ht.messageId===S&&(R({kind:"turn-complete",stopReason:"cancelled",amended:!0}),ht=null,rt.delete(S))});let mi=h=>{let w=h??{},S=typeof w.toolCallId=="string"?w.toolCallId:void 0,x;w.outcome&&typeof w.outcome=="object"?x=w.outcome:typeof w.chosenOptionId=="string"&&(x={kind:"selected",optionId:w.chosenOptionId}),gi(S,x?{outcome:x}:void 0)},be=null,gi=(h,w)=>{if(!be||be.toolCallId&&h&&be.toolCallId!==h)return;let S=be.resolve;be=null,I.setPermissionPrompt(null),S(w??{outcome:{outcome:"cancelled"}})},yi=h=>{if(!be?.toolCallId)return;let w=h??{};w.sessionUpdate!=="tool_call"&&w.sessionUpdate!=="tool_call_update"||w.toolCallId===be.toolCallId&&(!w.status||w.status==="pending"||gi(w.toolCallId,void 0))},at=()=>{if(!be){I.setPermissionPrompt(null);return}I.setPermissionPrompt({title:be.title,detail:be.detail,options:be.options.map(h=>({label:h.name})),selectedIndex:be.selectedIndex})},An=h=>{if(!be)return;let{options:w,resolve:S}=be;if(be=null,I.setPermissionPrompt(null),h===null){S({outcome:{outcome:"cancelled"}});return}S({outcome:{outcome:"selected",optionId:h}})};g.onRequest("session/request_permission",async h=>{if(b)return{outcome:{outcome:"cancelled"}};if(s.dangerouslySkipPermissions)return rr(h);let w=h??{},x=(Array.isArray(w.options)?w.options:[]).map(G=>({optionId:G.optionId,name:Ae(G.name??""),...G.kind!==void 0?{kind:G.kind}:{}})),A=w.toolCall?.title??w.toolCall?.name??"tool",P=Ae(A),L=Ae(Vm(Km(h))),_=w.toolCall?.toolCallId;return x.length===0?(I.appendLines([{prefix:"\u{1F512} ",body:`Permission requested \xB7 ${P} \xB7 (no options offered, cancelling)`,bodyStyle:"tool-status-fail"}]),{outcome:{outcome:"cancelled"}}):new Promise(G=>{be={title:P,detail:L,options:x,selectedIndex:0,resolve:G,toolCallId:_},at()})}),g.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}}));let xs,wi,cr=!0,vo=!1;try{let h=await g.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}});wi=h?.agentInfo?.name,h?.agentCapabilities?.promptCapabilities?.image===!1&&(cr=!1),vo=Mt(h?._meta??void 0).prompt?.amending===!0}catch{}let ve=a.sessionId,At=a.agentId,Ke=a.cwd,Zt,Vn,lr,As,Cs,Yn,ur,en,bi,Ie;if(a.sessionId==="__new__"){let h={};s.agentId&&(h.agentId=s.agentId),s.name&&(h.title=s.name),s.model&&(h.model=s.model);let w={cwd:a.cwd,...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}},S=await Nm({request:()=>g.request("session/new",w),showBanner:(P,L,_)=>Dm(t,P,L,_,{authenticate:G=>g.request("authenticate",{methodId:G})}),resolveOnboarding:async P=>{if(P)try{return(await Qc(n)).find(G=>G.id===P)?.onboarding}catch{return}},fallbackAgentId:s.agentId});if(S.kind==="cancel")return t.grabInput(!1),m.close().catch(()=>{}),null;if(S.kind==="back"){t.grabInput(!1),m.close().catch(()=>{});let P={...s};return delete P.sessionId,delete P.forceNew,delete P.resume,delete P.agentId,P}let x=S.result;c.write(d),ve=x.sessionId,r.sessionId=ve,r.readonly=!1;let A=Mt(x._meta??void 0);A.clientId&&(Vn=A.clientId),xs=A.upstreamSessionId,A.agentId&&(At=A.agentId),A.cwd&&(Ke=A.cwd),A.title&&(Zt=A.title),lr=A.currentModel,As=A.currentMode,bi=A.currentUsage,Ie=A.turnStartedAt,A.availableCommands&&(Cs=Aa(A.availableCommands)),A.availableModes&&(Yn=A.availableModes),ur=uy(x.configOptions),en=A.queue}else{let h={};s.readonly===!0&&(h.readonly=!0),e.tui.toolContent==="references"&&(h.toolContent="references"),s.drip===!0&&(h.replayMode="drip",s.dripSpeed!==void 0&&(h.dripSpeed=s.dripSpeed)),a.resumeHint!==void 0&&(h.resume={upstreamSessionId:a.resumeHint.upstreamSessionId,agentId:a.resumeHint.agentId,cwd:a.resumeHint.cwd});let w=await g.request("session/attach",{sessionId:a.sessionId,historyPolicy:"full",clientInfo:{name:"hydra-acp-tui",version:fe},...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}});ve=w.sessionId,w.clientId&&(Vn=w.clientId),r.sessionId=ve,r.readonly=s.readonly===!0;let S=Mt(w._meta??void 0);xs=S.upstreamSessionId,S.agentId&&(At=S.agentId),S.cwd&&(Ke=S.cwd),S.title&&(Zt=S.title),lr=S.currentModel,As=S.currentMode,bi=S.currentUsage,Ie=S.turnStartedAt,S.availableCommands&&(Cs=Aa(S.availableCommands)),S.availableModes&&(Yn=S.availableModes),ur=uy(w.configOptions),en=S.queue}let tn=M.tuiHistoryFile(ve),fr=M.globalTuiHistoryFile(),Ve=await Hi(tn).catch(()=>[]),Ft=await Hi(fr).catch(()=>[]);Ft.length>e.tui.promptHistoryMaxEntries&&(Ft=Ft.slice(Ft.length-e.tui.promptHistoryMaxEntries));let Wt=[...Ve],he=new qn({history:aa(Ft,Wt)});_e=he;let vi=!1,Gn=(h,w)=>{let S=h.replace(/\n+$/,"");if(S.length===0)return;let x=(w??h).replace(/\n+$/,""),A=Ui(Ve,S),P=A!==Ve;Ve=A,Wt=Ui(Wt,x);let L=Ui(Ft,S,e.tui.promptHistoryMaxEntries),_=L!==Ft;Ft=L,he.setHistory(aa(Ft,Wt)),P&&qs(tn,Ve).catch(()=>{}),_&&tp(fr,S).catch(()=>{})};U>0&&he.setTurnRunning(!0);let ft=null,Rs=null;jg(e.tui.ambiguousWidth==="wide"),Wh(e.tui.diffContextLines);let Cn=!1,I,Ii=()=>{Cn&&(Cn=!1,I.start())},Io=()=>{Cn||(Cn=!0,I.stop(),process.kill(process.pid,"SIGTSTP"))};process.platform!=="win32"&&process.on("SIGCONT",Ii),I=new Sd({term:t,dispatcher:he,repaintThrottleMs:e.tui.repaintThrottleMs,maxScrollbackLines:e.tui.maxScrollbackLines,mouse:i.mouseEnabled,inAppSelection:i.inAppSelectionEnabled,selectionClipboard:e.tui.selectionClipboard,openFileCommand:e.tui.openFileCommand,progressIndicator:e.tui.progressIndicator,readonly:s.readonly===!0,onSuspend:process.platform!=="win32"?Io:void 0,onBlockClick:(h,w)=>{Uy(h,w)},onBlockDoubleClick:(h,w)=>Hy(h,w),onBlockVisible:h=>{By(h)},onMouse:h=>{if(h.kind!=="press"||h.button!=="middle")return;let w={type:"attachment-request",source:"primary"};s.readonly===!0&&fy(w)||ie(w)},onKey:h=>{for(let w of h){if(be&&Ed(w)||Md(w)||Ci(w)||xo(w)||Ts(w)||ki(w))continue;if(w.type==="key"&&w.name==="escape"&&I.isScrolledBack()){I.scrollToBottom();continue}if(w.type==="attachment-paths"){Ue(w.paths);continue}let S=he.feed(w);for(let x of S)s.readonly===!0&&fy(x)||ie(x)}Si(),I.setBannerSearchIndicator(he.state().historySearchQuery),I.setAttachments(he.state().attachments),I.refreshPrompt()}}),ce=I,I.setStickyBottomKey("plan");let vt=[{name:"/help",description:"Show TUI built-in commands"},{name:"/quit",description:"Exit the TUI"},{name:"/clear",description:"Clear scrollback"},{name:"/sessions",description:"List sessions"},{name:"/resume",description:"Switch sessions (open the picker)"},{name:"/session",description:"Switch session: /session <id|next|prev> (no arg opens picker)"},{name:"/rename",description:"Rename this session (alias for /hydra title): /rename [title]"},{name:"/model",description:"Switch model: /model <model-id>"},{name:"/agent",description:"Switch agent via config option: /agent <agent-id>"},{name:"/btw",description:"Run an ancillary forked session: /btw <prompt>"}],pr=Cs??[],Fe=Yn??[],nn=ur??[],So=()=>nn.find(h=>h.id==="agent"),ko=()=>{let h=new Set,w=[];for(let S of[...vt,...pr])h.has(S.name)||(h.add(S.name),w.push(S));return w},Qn=()=>{let h=he.state().buffer,w=h[0]??"";if(!w.startsWith("/"))return[];if(h.length>1)return[];let S=w.indexOf(" "),x=S===-1?w:w.slice(0,S);if(x.lastIndexOf("/")>0)return[];let A=ko().filter(P=>P.name.startsWith(x));return A.length===1&&A[0]?.name===x?[]:A},sn=[],Si=()=>{let h=Qn();if(h.length>0){sn=[],I.setCompletions(h);return}I.setCompletions(sn)},Ts=h=>{if(h.type!=="key"||h.name!=="tab")return sn.length>0&&(sn=[]),!1;let w=Qn();if(I.isOverlayOpen()&&w.length===0)return I.toggleFocusedPane(),!0;if(w.length>0){sn=[];let S=he.state().buffer[0]??"",x=Vg({matches:w.map(A=>A.name),firstLine:S});return x===null||he.replaceFirstLine(x),!0}return Es()},Es=()=>{let h=he.state(),w=h.buffer[h.row]??"",S=sy(w,h.col);if(S===null)return!1;let x=ry(S.token,Ke);return x===null?!1:(x.replacement!==S.token&&he.replaceRangeOnCurrentLine(S.start,h.col,x.replacement),sn=x.candidates.length>1?x.candidates.map(A=>({name:A})):[],!0)},ki=h=>!I.isOverlayOpen()||h.type!=="key"||h.name!=="escape"&&h.name!=="ctrl-c"?!1:(K&&(K.cancel(),K=null,J=null),I.closeBtwOverlay(),!0),xo=h=>{if(!I.isScrollbackSearchActive())return h.type==="key"&&h.name==="ctrl-r"&&I.isScrolledBack()?(I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(""),!0):!1;if(h.type==="char"){let w=I.scrollbackSearchTerm()+h.ch;return I.updateScrollbackSearchTerm(w),!0}if(h.type==="paste"){let w=I.scrollbackSearchTerm()+h.text.replace(/\n/g," ");return I.updateScrollbackSearchTerm(w),!0}if(h.type==="key")switch(h.name){case"ctrl-r":return I.advanceScrollbackSearch(),!0;case"ctrl-s":return I.retreatScrollbackSearch(),!0;case"backspace":{let w=I.scrollbackSearchTerm();return w.length===0?I.cancelScrollbackSearch():I.updateScrollbackSearchTerm(w.slice(0,-1)),!0}case"enter":return I.acceptScrollbackSearch(),!0;case"escape":case"ctrl-c":return I.cancelScrollbackSearch(),!0;default:return!0}return!0},Ed=h=>{if(!be)return!1;let w=be.options;if(h.type==="key")switch(h.name){case"up":return be.selectedIndex=Math.max(0,be.selectedIndex-1),at(),!0;case"down":return be.selectedIndex=Math.min(w.length-1,be.selectedIndex+1),at(),!0;case"enter":{let S=w[be.selectedIndex];return S&&An(S.optionId),!0}case"escape":case"ctrl-c":return An(null),!0;default:return!0}if(h.type==="char"&&/^[1-9]$/.test(h.ch)){let S=parseInt(h.ch,10)-1,x=w[S];return x&&An(x.optionId),!0}return!0},Ao=At||wi||"?",It={...bi??{}};c.finalize(),I.start({skipFullscreen:!0}),I.setHideThoughts(!i.showThoughts),I.setSessionbar({agent:Ao,cwd:Ke,sessionId:ve,title:Zt,model:lr,usage:{...It}}),As&&I.setBanner({currentMode:As}),lo().then(h=>{h&&I.notify(`\u2728 ${uo(h)}`,3e4)}).catch(()=>{});let st=null,hr=new Promise(h=>{st=h}),rn=()=>{g.notify("session/cancel",{sessionId:ve}).catch(()=>{})},on=()=>{ce!==null&&U===1&&(Y=!0,ce.setBanner({status:"cancelling",elapsedMs:void 0,stalled:!1}))},an=()=>{if(ft){ft.cancel(),on();return}if(U>0){rn(),on();return}mr()},mr=()=>{C(0)},Co=()=>{let h="enqueue prompt (sends now, or queues during a turn)",w="amend the in-flight turn (cancel + replace)";return[...i.defaultEnterAction==="amend"?[["Enter",w],["Ctrl+Enter / Shift+Enter / ^S",h]]:[["Enter",h],["Ctrl+Enter / Shift+Enter / ^S",w]],...fC]},Pd=()=>{if(I.isHelpPromptActive()){I.setHelpPrompt(null);return}I.setHelpPrompt({title:"Hotkeys",entries:Co(),hint:"any key dismisses \xB7 /help lists commands"})},Md=h=>I.isHelpPromptActive()?(h.type==="key"&&h.name==="ctrl-g",I.setHelpPrompt(null),!0):!1,Rn=["tools","plan","thoughts","diffs","mouse","enter"],Jt=0,xi=h=>{switch(h){case"tools":return i.toolsExpanded?"expanded":"collapsed";case"plan":return i.planExpanded?"expanded":"collapsed";case"thoughts":return i.showThoughts?"shown":"hidden";case"diffs":return i.showFileUpdates;case"mouse":return i.mouseEnabled?"on":"off";case"enter":return i.defaultEnterAction}},Ro=h=>{switch(h){case"tools":return"Tools";case"plan":return"Plan";case"thoughts":return"Thoughts";case"diffs":return"File updates";case"mouse":return"Mouse capture";case"enter":return"Enter key"}},To=()=>({title:"Session options",options:Rn.map(h=>({label:Ro(h),value:xi(h)})),selectedIndex:Jt}),Ai=()=>{I.isOptionsPromptActive()&&I.setOptionsPrompt(To())},Xn=()=>{if(I.isOptionsPromptActive()){I.setOptionsPrompt(null);return}Jt=0,I.setOptionsPrompt(To())},Tn=h=>{switch(h){case"tools":i.toolsExpanded=!i.toolsExpanded,_s.clear(),yr.clear(),$y();break;case"plan":i.planExpanded=!i.planExpanded,ne=null,Ge();break;case"thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts);break;case"diffs":i.showFileUpdates=i.showFileUpdates==="diff"?"edit":"diff",Mn.clear(),Ny();break;case"mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w;break}case"enter":i.defaultEnterAction=i.defaultEnterAction==="amend"?"enqueue":"amend";break}Ai()},Ct=h=>{(async()=>{try{switch(h){case"tools":case"plan":I.notify(`${Ro(h)} is session-only \u2014 not saved`);return;case"thoughts":await Ei("showThoughts",i.showThoughts);break;case"diffs":await Ei("showFileUpdates",i.showFileUpdates);break;case"mouse":await Ei("mouse",i.mouseEnabled);break;case"enter":await Ei("defaultEnterAction",i.defaultEnterAction);break}I.notify(`saved default: ${Ro(h)} ${xi(h)}`)}catch(w){I.notify(`save failed: ${w instanceof Error?w.message:String(w)}`)}})()},Ci=h=>{if(!I.isOptionsPromptActive())return!1;if(h.type==="key")switch(h.name){case"up":return Jt=Math.max(0,Jt-1),Ai(),!0;case"down":return Jt=Math.min(Rn.length-1,Jt+1),Ai(),!0;case"enter":{let w=Rn[Jt];return w&&Tn(w),!0}case"ctrl-o":case"escape":case"ctrl-c":return I.setOptionsPrompt(null),!0;case"ctrl-d":return I.setOptionsPrompt(null),!1;default:return!0}if(h.type==="char"){if(/^[1-9]$/.test(h.ch)){let w=parseInt(h.ch,10)-1,S=Rn[w];return S&&(Jt=w,Tn(S)),!0}if(h.ch==="s"||h.ch==="S"){let w=Rn[Jt];return w&&Ct(w),!0}}return!0},gr=()=>{b=!0,K?(K.cancel(),K=null,J=null):J!==null&&(vn(n,J).catch(()=>{}),J=null),process.off("SIGINT",an),process.platform!=="win32"&&process.off("SIGCONT",Ii),ee!==null&&(clearInterval(ee),ee=null);for(let h of nt.values())clearTimeout(h);nt.clear(),I.clearWindowTitle(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{}),m.close().catch(()=>{})},C=(h=0)=>{gr(),st&&(st(null),st=null),h!==0&&process.exit(h)},E=async()=>{if(!st)return;K?(K.cancel(),K=null,J=null):J!==null&&(vn(n,J).catch(()=>{}),J=null);let h=he.state().buffer.join(`
161
+ `);h.replace(/\s+$/,"").length>0&&Gn(h),I.pauseRepaint(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{});let w=null,S=null;for(;w===null;){let L=await bn(n,{includeNonInteractive:!0}),_=await eu(t,{cwd:Ke,sessions:L,config:e,target:n,currentSessionId:ve,prefs:o});if(_.kind==="abort"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(_.kind==="exit"){C(0);return}if(_.kind==="new"){w={choice:_,sessions:L};break}if(_.kind==="fork"){let ue=await yy(t,n,_,L);if(ue.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(ue.kind==="back")continue;w={choice:{kind:"attach",sessionId:ue.ctx.sessionId,...ue.ctx.agentId?{agentId:ue.ctx.agentId}:{}},sessions:L},S={readonly:!1,cwd:ue.ctx.cwd},ue.ctx.resumeHint!==void 0&&(S.resumeHint=ue.ctx.resumeHint);break}let G=L.find(ue=>ue.sessionId===_.sessionId);if(!(G!==void 0&&!!G.importedFromMachine&&!G.upstreamSessionId&&_.readonly!==!0)){if(n.isLocal&&G&&!G.importedFromMachine&&_.readonly!==!0&&!(await po(G.cwd)).ok){let Pe=await ar(t,G,{defaultCwd:Nt(e.defaultCwd),title:"Working directory missing \u2014 choose cwd",intro:"This session's working directory no longer exists. Pick a new one:"});if(Pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(Pe.kind==="back")continue;w={choice:_,sessions:L},S={readonly:!1,cwd:Pe.path,resumeHint:{agentId:_.agentId??G.agentId??"",cwd:Pe.path,upstreamSessionId:""}};break}w={choice:_,sessions:L};break}let Ee={...s,readonly:!1},pe=await gy(t,G,_,Ee);if(pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}pe.kind!=="back"&&(w={choice:_,sessions:L},S={readonly:Ee.readonly===!0,cwd:pe.ctx.cwd},pe.ctx.resumeHint!==void 0&&(S.resumeHint=pe.ctx.resumeHint))}let{choice:x}=w,A=st;if(st=null,process.off("SIGINT",an),m.close().catch(()=>{}),x.kind==="new"){let{sessionId:L,..._}=s,G={..._,cwd:x.cwd??Ke,forceNew:!0,readonly:!1};x.prompt!==void 0&&(G.initialPrompt=x.prompt),A(G);return}if(x.kind!=="attach")return;let P={...s,sessionId:x.sessionId,cwd:S?.cwd??Ke,readonly:S?.readonly??x.readonly===!0};x.agentId!==void 0&&(P.agentId=x.agentId),S?.resumeHint!==void 0?P.resumeHint=S.resumeHint:delete P.resumeHint,A(P)},$=async(h="next")=>{if(!st)return;let S=(await bn(n)).filter(Ee=>Ee.status==="live");if(S.length<=1)return;let x=S.findIndex(Ee=>Ee.sessionId===ve),L=((x===-1?0:x)+(h==="prev"?-1:1)+S.length)%S.length,_=S[L],G=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let Le={...s,sessionId:_.sessionId,cwd:Ke,readonly:!1};_.agentId!==void 0&&(Le.agentId=_.agentId),G(Le)},X=async h=>{if(!st)return;let w=await bn(n,{includeNonInteractive:!0}),S=h.trim();if(!S){I.notify("usage: /session <id|next|prev>");return}let x=S.startsWith(Ht)?[S]:[S,Ht+S],A=w.find(_=>x.includes(_.sessionId));if(!A){let _=w.filter(G=>x.some(Le=>G.sessionId.startsWith(Le)));if(_.length===1)A=_[0];else if(_.length>1){I.notify(`ambiguous session id: ${S} (${_.length} matches)`);return}}if(!A){I.notify(`no session matches: ${S}`);return}if(A.sessionId===ve){I.notify("already on that session");return}let P=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let L={...s,sessionId:A.sessionId,cwd:A.cwd??Ke,readonly:A.status!=="live"};A.agentId!==void 0&&(L.agentId=A.agentId),delete L.resumeHint,P(L)},ie=h=>{switch(h.type){case"send":i.defaultEnterAction==="amend"?En(h.text,h.attachments,h.displayText):Ms(h.text,h.attachments,h.displayText);return;case"amend":i.defaultEnterAction==="amend"?Ms(h.text,h.attachments,h.displayText):En(h.text,h.attachments,h.displayText);return;case"queue-edit":{let w=Ps(h.index);if(!w)return;let S=[];h.text.length>0&&S.push({type:"text",text:h.text});for(let x of h.attachments)S.push({type:"image",data:x.data,mimeType:x.mimeType});g.request("hydra-acp/prompt/update",{sessionId:ve,messageId:w,prompt:S}).then(x=>{let A=x;!A.updated&&A.reason!=="ok"&&I.notify(`queue edit skipped (${A.reason})`)}).catch(x=>{I.notify(`queue edit failed: ${x.message}`)});return}case"queue-remove":{let w=Ps(h.index);if(!w)return;g.request("hydra-acp/prompt/cancel",{sessionId:ve,messageId:w}).then(S=>{let x=S;!x.cancelled&&x.reason!=="ok"&&I.notify(`queue cancel skipped (${x.reason})`)}).catch(S=>{I.notify(`queue cancel failed: ${S.message}`)});return}case"cancel":{if(I.isOverlayOpen()){K&&(K.cancel(),K=null,J=null),I.closeBtwOverlay();return}if(h.prefill&&ft){let w=pt.size===0,S=he.state().buffer.every(x=>x==="");w&&S&&(Rs={text:ft.text,attachments:ft.attachments})}ft?ft.cancel():U>0&&rn(),on();return}case"exit":mr();return;case"plan-toggle":Eo(h.on);return;case"redraw-banner":I.setBanner({});return;case"redraw":I.fullRedraw();return;case"scroll-to-top":I.scrollToTop();return;case"scroll-to-bottom":I.scrollToBottom();return;case"switch-session":E().catch(()=>{});return;case"next-live-session":$().catch(()=>{});return;case"toggle-options":Xn();return;case"toggle-thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts),I.notify(i.showThoughts?"thoughts shown":"thoughts hidden");return;case"toggle-mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w,I.notify(w?"mouse capture on \u2014 wheel scrolls; shift+drag to select text":"mouse capture off \u2014 click-drag selects text; PgUp/PgDn scrolls");return}case"show-help":Pd();return;case"escalate-search":I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(h.query);return;case"attachment-request":xe(h.source);return}},Ue=async h=>{if(!cr){I.notify("agent does not accept image attachments");return}let w=0;for(let S of h){if(S.startsWith("data:")){let A=_l(S);if(!A){I.notify("unsupported data: URI");continue}if(A.sizeBytes>Sn){I.notify(`image too large (${qt(A.sizeBytes)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:A.mimeType,data:A.data,name:"pasted image",sizeBytes:A.sizeBytes}),w++;continue}let x=ho(S);if(!x){I.notify(`unsupported image type: ${bo.basename(S)}`);continue}try{let A=await lC.readFile(S);if(A.length>Sn){I.notify(`image too large (${qt(A.length)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:x,data:A.toString("base64"),name:bo.basename(S),sizeBytes:A.length}),w++}catch(A){I.notify(`cannot read ${bo.basename(S)}: ${A.message}`)}}w>0&&(I.setAttachments(he.state().attachments),I.refreshPrompt())},xe=async(h="clipboard")=>{let w=h==="primary"?await Tg():await Rg();if(!w.ok){I.notify(w.reason);return}if(w.kind==="image"){if(!cr){I.notify("agent does not accept image attachments");return}he.addAttachment(w.attachment),I.setAttachments(he.state().attachments),I.refreshPrompt();return}let S=he.feed({type:"paste",text:w.text});for(let x of S)ie(x);I.refreshPrompt()},Rt=h=>h.attachmentCount>0?`${h.text} \xB7 \u{1F4CE}\xD7${h.attachmentCount}`:h.text,St=(h,w)=>{let S=Array.isArray(w)?w:[],x="",A=0;for(let P of S){if(!P||typeof P!="object")continue;let L=P;L.type==="text"&&typeof L.text=="string"?x+=L.text:L.type==="image"&&(A+=1)}return{messageId:h,text:Ae(x),attachmentCount:A}},pt=new Map,Tt=[],dn=new Map,rt=new Set,ht=null,Ye=()=>{let h=[...pt.values()],w=h.map(Rt);I.setQueuedPrompts(w),I.setBanner({queued:h.length}),he.setQueue(h.map(S=>S.text))},Ps=h=>[...pt.values()][h]?.messageId;if(en&&en.length>0){for(let h of en){if(h.position===0){te=h.messageId;continue}pt.set(h.messageId,St(h.messageId,h.prompt))}pt.size>0&&Ye()}let Ms=(h,w,S)=>{I.scrollToBottom(),!Zn(h)&&(Gn(h,S),Ri(h,w,S))},En=(h,w,S)=>{if(I.scrollToBottom(),Zn(h))return;if(Gn(h,S),!vo||te===void 0){Ri(h,w,S);return}let x=te,A=[];h.length>0&&A.push({type:"text",text:h});for(let _ of w)A.push({type:"image",data:_.data,mimeType:_.mimeType});let P={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(P);let L=()=>{let _=Tt.indexOf(P);_>=0&&Tt.splice(_,1),P.messageId!==void 0&&dn.delete(P.messageId)};g.request("hydra-acp/prompt/amend",{sessionId:ve,targetMessageId:x,prompt:A}).then(_=>{let G=_;if(G.amended&&G.reason==="ok"){j(1);return}if(L(),G.reason==="target_completed"){I.notify("previous response finished \u2014 press Enter to send as a new turn"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_cancelled"){I.notify("amend skipped \u2014 previous turn was cancelled"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_not_found"){I.notify("amend skipped \u2014 no matching prompt"),he.setBuffer(h,w),I.refreshPrompt();return}}).catch(_=>{L(),I.notify(`amend failed: ${_.message}`),he.setBuffer(h,w),I.refreshPrompt()})},Eo=async h=>{if(Fe.length===0){I.notify("no modes advertised by agent");return}let w=I.currentModeId(),S=Fe.findIndex(P=>P.id===w),x=S===-1?0:(S+1)%Fe.length,A=Fe[x]?.id;if(A){I.setBanner({currentMode:A});try{await g.request("session/set_mode",{sessionId:ve,modeId:A})}catch(P){I.notify(`set_mode failed: ${P.message}`)}}},Zn=h=>{let w=h.replace(/\s+$/,"");if(!w.startsWith("/")||w.includes(`
162
+ `))return!1;let S=w.indexOf(" ");switch(S===-1?w:w.slice(0,S)){case"/quit":case"/exit":return mr(),!0;case"/clear":return et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null,Pn.clear(),Mn.clear(),$n.clear(),_s.clear(),On.clear(),Os.clear(),I.clearScrollback(),!0;case"/help":{let A=[{prefix:" ",body:"Built-in commands:",bodyStyle:"system"}];for(let P of vt)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"});if(pr.length>0){A.push({prefix:" ",body:"Agent commands:",bodyStyle:"system"});for(let P of pr)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"})}return I.appendLines(A),!0}case"/agent":{let A=S===-1?"":w.slice(S+1).trim(),P=So();if(!P)return I.appendLines([{prefix:" ",body:"no agent config option advertised for this session",bodyStyle:"info"}]),!0;if(!A){let L=[{prefix:" ",body:"Available agents:",bodyStyle:"system"}];for(let _ of P.options){let G=_.value===P.currentValue?"* ":" ";L.push({prefix:" ",body:`${G}${_.value.padEnd(16)} ${_.name}`,bodyStyle:"info"})}return I.appendLines(L),!0}return P.options.some(L=>L.value===A)?A===P.currentValue?(I.notify(`already on agent ${A}`),!0):(I.notify(`switching to ${A}\u2026`),g.request("session/set_config_option",{sessionId:ve,configId:"agent",value:A}).catch(L=>{I.notify(`set_config_option failed: ${L.message}`)}),!0):(I.notify(`unknown agent: ${A}`),!0)}case"/sessions":return I.appendLines([{prefix:" ",body:"Run `hydra-acp sessions` (or `hydra sessions`) for the full list.",bodyStyle:"info"}]),!0;case"/resume":return E().catch(()=>{}),!0;case"/session":{let A=S===-1?"":w.slice(S+1).trim();return A?A==="next"||A==="prev"?($(A).catch(P=>{I.notify(`session ${A} failed: ${P.message}`)}),!0):(X(A).catch(P=>{I.notify(`session switch failed: ${P.message}`)}),!0):(E().catch(()=>{}),!0)}case"/rename":{let A=S===-1?"":w.slice(S+1).trim(),P=A.length>0?`/hydra title ${A}`:"/hydra title";return Gn(w,w),Ri(P,[],w),!0}case"/btw":{let A=S===-1?"":w.slice(S+1).trim();if(!A)return I.appendLines([{prefix:" ",body:"/btw requires a prompt",bodyStyle:"info"}]),!0;if(ve==="__new__")return I.appendLines([{prefix:" ",body:"no active session to fork",bodyStyle:"info"}]),!0;F+=1;let P=F;K&&(K.cancel(),K=null);let L=null;J!==null&&!W?L=J:J!==null&&(vn(n,J).catch(()=>{}),J=null),W=!1,I.openBtwOverlay(),I.setBtwOverlayStatus({label:"busy",style:"busy"});let _=new pd({getMaxWidth:()=>{let pe=I.width();return pe>0?pe:void 0}});_.on("changed",()=>{I.setBtwOverlayContent(_.getLines())});let G={};_.append({sessionUpdate:"prompt_received",prompt:[{type:"text",text:A}]});let Le=pe=>{_.append({sessionUpdate:"agent_message_chunk",content:{type:"text",text:pe}})},Ee={};return L!==null&&(Ee.reuseSessionId=L),yg(n,ve,A,Ee).then(pe=>{if(P!==F){pe.cancel();return}K=pe,J=pe.sessionId,I.setBtwOverlayMeta({sessionId:pe.sessionId}),pe.on("event",ue=>{if(P===F)if(ue.kind==="update"){_.append(ue.update);let Pe=yn(ue.update);if(Pe&&Pe.kind==="usage-update"){let Ls=!1;Pe.used!==void 0&&G.used!==Pe.used&&(G.used=Pe.used,Ls=!0),Pe.size!==void 0&&G.size!==Pe.size&&(G.size=Pe.size,Ls=!0),Pe.costAmount!==void 0&&G.costAmount!==Pe.costAmount&&(G.costAmount=Pe.costAmount,Ls=!0),Pe.costCurrency!==void 0&&G.costCurrency!==Pe.costCurrency&&(G.costCurrency=Pe.costCurrency,Ls=!0),Ls&&I.setBtwOverlayMeta({usage:{...G}})}}else ue.kind==="completed"?(I.setBtwOverlayStatus({label:"done",style:"done"}),K=null):ue.kind==="cancelled"?(I.setBtwOverlayStatus({label:"cancelled",style:"cancelled"}),K=null,J=null):ue.kind==="errored"&&(I.setBtwOverlayStatus({label:"errored",style:"errored"}),Le(`btw errored: ${ue.error.message}`),J!==null&&vn(n,J).catch(()=>{}),K=null,J=null)})}).catch(pe=>{if(P!==F)return;let ue=pe instanceof Error?pe.message:String(pe);I.setBtwOverlayStatus({label:"errored",style:"errored"}),Le(`btw startup failed: ${ue}`),I.appendLines([{prefix:" ",body:`btw startup failed: ${ue}`,bodyStyle:"tool-status-fail"}])}),!0}default:return!1}},Ri=async(h,w,S)=>{let x=[];h.length>0&&x.push({type:"text",text:h});for(let Ee of w)x.push({type:"image",data:Ee.data,mimeType:Ee.mimeType});j(1);let A={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(A),xn=!1;let P=!1,L=null,_=Ee=>{typeof ce<"u"&&ce!==null&&ce.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:Ee,bodyStyle:"tool-status-fail"}])},G=!1;ft={text:h,attachments:w,cancel:()=>{if(xn){xn=!1,G=!0,_("force-stopping agent \u2014 turn aborted; resumes on your next message\u2026"),g.request("hydra-acp/session/force_cancel",{sessionId:ve}).catch(pe=>{_(`force-stop failed: ${pe.message}`)});return}if(P)return;P=!0,g.notify("session/cancel",{sessionId:ve}).catch(()=>{});let Ee=Date.now();L=setTimeout(()=>{ft!==null&&(Kn>=Ee||(xn=!0,_("cancel not acknowledged by agent \u2014 the turn is still running. Cancel again to force-stop (restarts the agent).")))},dr)}};let Le;try{let Ee=await g.request("session/prompt",{sessionId:ve,prompt:x});Ee&&typeof Ee.stopReason=="string"&&(Le=Ee.stopReason)}catch(Ee){let pe=Tt.indexOf(A);pe>=0&&Tt.splice(pe,1),A.messageId!==void 0&&dn.delete(A.messageId),G?I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"turn force-stopped",bodyStyle:"tool-status-fail"}]):I.appendLines([{prefix:"\u2717 ",prefixStyle:"tool-status-fail",body:Ee.message,bodyStyle:"tool-status-fail"}])}finally{if(ft=null,L!==null&&(clearTimeout(L),L=null),j(-1),A.flushed&&ht===A){let Ee=A.messageId!==void 0&&rt.has(A.messageId);Ee&&A.messageId!==void 0&&rt.delete(A.messageId);let pe={kind:"turn-complete"};Le!==void 0&&(pe.stopReason=Le),Ee&&(pe.amended=!0),R(pe),ht=null}if(Rs!==null){let{text:Ee,attachments:pe}=Rs;Rs=null,he.state().buffer.every(Pe=>Pe==="")&&(he.setBuffer(Ee,pe),I.refreshPrompt())}}},et=new Map,Pn=new Map,Mn=new Map,es=new Map,_n=[],it=0,zt=`tools:${it}`,$n=new Map,_s=new Map,yr=new Set,$s=new Map,On=new Map,Os=new Map,T=null,B=null,ae=null,O=null,ne=null,le=e.tui.maxToolItems,Te=e.tui.maxPlanItems,Ne=()=>({maxPlanItems:ne??i.planExpanded?1/0:Te}),Ge=()=>{if(O===null)return;let h=ms(O,Ne());h.length>0&&I.upsertLines("plan",[{body:""},...h])},mt="",Me=null,Lt=0,_d=()=>{if(Me===null)return;let h=I.width(),w=gs(mt,h>0?{maxWidth:h}:void 0);w.length!==0&&I.upsertLines(Me,w)},Ty=h=>{h.length!==0&&(Me===null&&(I.ensureSeparator(),Me=`agent:${Lt}`,Lt+=1,mt=""),mt+=h,_d())},ts=()=>{Me=null,mt=""},wr="",Fs=null,ru=0,Ey=()=>({prefix:" ",body:"\u25B8 Thoughts",bodyStyle:"thought"}),Py=()=>{if(Fs===null||wr.length===0)return;let h=ti(wr);h.length!==0&&I.upsertLines(Fs,h)},My=h=>{let w=On.get(h);if(w===void 0)return[];let S=ti(w.text);return w.workerTaskId&&S.unshift({prefix:" ",body:`[T${w.workerTaskId}] `,bodyStyle:"dim"}),S},_y=(h,w)=>{h.length!==0&&(Fs===null&&(I.ensureSeparator("thought"),Fs=`thought:${ru}`,ru+=1,wr=""),wr+=h,On.set(Fs,{text:wr,workerTaskId:w}),Py())},ns=()=>{Fs=null,wr=""},iu=h=>hC({...h,collapsedLimit:le}),ou=h=>_s.get(h)??i.toolsExpanded,Kt=()=>{if(T===null)return;let{lines:h,rowOwners:w}=iu({order:_n,states:et,startedAt:T,endedAt:B,stopReason:ae,expanded:ou(zt),perToolExpanded:yr});I.upsertLines(zt,h),$s.set(zt,w)},Po=h=>{let w=$n.get(h);if(!w)return;let{lines:S,rowOwners:x}=iu({order:w.order,states:w.states,startedAt:w.startedAt,endedAt:w.endedAt,stopReason:w.stopReason,expanded:ou(h),perToolExpanded:yr});I.upsertLines(h,S),$s.set(h,x)},$y=()=>{T!==null&&!$n.has(zt)&&Kt();for(let h of $n.keys())Po(h)},$d=()=>{T!==null&&$n.set(zt,{order:[..._n],states:new Map(et),startedAt:T,endedAt:B??Date.now(),stopReason:ae,rowOwners:$s.get(zt)??[]})},au=()=>{it+=1,zt=`tools:${it}`,T=Date.now(),B=null,ae=null,Kt()};function Oy(h){if(!h||typeof h!="object")return null;let w=h,S=Array.isArray(w.content)?w.content:void 0;if(!S)return null;let x=[],A=P=>{if(typeof P=="string"){x.push({text:Qe(P)});return}if(P&&typeof P=="object"){let L=P;typeof L.__hydraBlob=="string"&&x.push({hash:L.__hydraBlob})}};for(let P of S){if(!P||typeof P!="object")continue;let L=P;if(L.type==="content"&&L.content&&typeof L.content=="object"){let _=L.content;if(_.text!==void 0){A(_.text);continue}}if(L.type==="text"&&L.text!==void 0){A(L.text);continue}L.text!==void 0&&A(L.text)}return x.length>0?x:null}let du=(h,w)=>{let S=w.map(P=>"text"in P?P.text:"").join(`
163
+ `);if(S.length===0)return;let{text:x,truncated:A}=Uh(S);h.resultText=x,h.resultTruncated=A},Mo=new Set,Fy=(h,w)=>{!w.some(x=>"hash"in x)||Mo.has(h)||(Mo.add(h),(async()=>{let x=await Promise.all(w.map(async P=>"text"in P?P:{text:await Od(P.hash)??""}));Mo.delete(h);let A=et.get(h);if(!A)for(let P of $n.values()){let L=P.states.get(h);if(L){A=L;break}}if(A){du(A,x),et.has(h)&&Kt();for(let[P,L]of $n)L.states.has(h)&&Po(P);I.repaintNow()}})().catch(()=>{Mo.delete(h)}))},cu=(h,w,S,x,A,P,L,_,G,Le)=>{let Ee=!et.has(h),pe=et.get(h),ue=pe??{initialTitle:w??"tool",latestTitle:w??"tool",status:S??"pending",startedAt:Date.now()};if(!pe&&G!==void 0&&(ue.workerTaskId=G),pe&&w!==void 0&&(ue.latestTitle=w),P!==void 0&&ue.detail===void 0&&(ue.detail=P),L!==void 0&&ue.detailFull===void 0&&(ue.detailFull=L),_!==void 0&&_.length>0&&(ue.locations=_),pe&&S!==void 0&&(ue.status=S),pe||(ue.status=S??"pending"),ue.endedAt===void 0&&Kh(ue.status)&&(ue.endedAt=Date.now()),x!==void 0&&(ue.errorText=x),A!==void 0&&(ue.editDiff=A),Le!==void 0){let Pe=Oy(Le);Pe!==null&&(du(ue,Pe),Pe.some(Ls=>"hash"in Ls)&&Fy(h,Pe))}et.set(h,ue),Ee&&(T===null&&(it+=1,zt=`tools:${it}`,T=Date.now(),B=null,ae=null),_n.push(h))},Od=async h=>{try{let w=await g.request("hydra-acp/session/tool_content",{sessionId:ve,hash:h});return typeof w?.content=="string"?w.content:null}catch{return null}},_o=new Set,Ly=(h,w)=>{_o.has(h)||w.oldRef===void 0&&w.newRef===void 0||(_o.add(h),(async()=>{let[S,x]=await Promise.all([w.oldRef?Od(w.oldRef.hash):Promise.resolve(w.oldText),w.newRef?Od(w.newRef.hash):Promise.resolve(w.newText)]);if(w.oldRef!==void 0&&S===null||w.newRef!==void 0&&x===null){_o.delete(h);let Le=il(w,"diff",{deferredStatus:"error"});Le.length>0&&(I.upsertLines(`editdiff:${h}`,Le),I.repaintNow());return}let P={...w.path!==void 0?{path:w.path}:{},oldText:S??"",newText:x??""};Pn.set(h,P);let L=et.get(h);L?.editDiff&&(L.editDiff=P),_o.delete(h);let _=Mn.get(h),G=_===void 0?i.showFileUpdates:_?"diff":"edit";G!=="none"&&($o(h,P,G==="diff"?"diff":"edit"),I.repaintNow())})())},$o=(h,w,S)=>{let x=`editdiff:${h}`,A=il(w,S);if(A.length===0){I.removeKey(x);return}I.upsertLines(x,A),S==="diff"&&(w.oldRef!==void 0||w.newRef!==void 0)&&I.notifyWhenVisible(x)},By=h=>{if(!h.startsWith("editdiff:"))return;let w=h.slice(9),S=Pn.get(w);S&&(S.oldRef!==void 0||S.newRef!==void 0)&&Ly(w,S)},lu=h=>{let w=`editdiff:${h}`,S=i.showFileUpdates,x=et.get(h),A;if(S==="none"||!x?.editDiff||x.status!=="completed")A=null;else{let L=Mn.get(h);A=L!==void 0?L?"diff":"edit":S==="diff"?"diff":"edit"}if(A===null){I.removeKey(w);return}let P=x.editDiff;Pn.set(h,P),$o(h,P,A)},Ny=()=>{let h=i.showFileUpdates;for(let[w,S]of Pn){let x=`editdiff:${w}`,A=Mn.get(w),P=A===void 0?h:A?"diff":"edit";if(P==="none"){I.removeKey(x);continue}$o(w,S,P==="diff"?"diff":"edit")}},Dy=h=>{if(!h.path)return null;let w=Qe(h.oldText).split(`
164
164
  `),S=Qe(h.newText).split(`
165
165
  `),x=0,A=Math.min(w.length,S.length);for(;x<A&&w[x]===S[x];)x++;let P=S[x];if(!P)return null;let L=bo.isAbsolute(h.path)?h.path:bo.resolve(Ke,h.path),_;try{_=oC(L,"utf8")}catch{return null}let G=_.split(`
166
166
  `);for(let Le=0;Le<G.length;Le++)if(G[Le]===P)return Le+1;return null},Hy=(h,w)=>{if(h.startsWith("editdiff:")){let S=h.slice(9),x=Pn.get(S),P=et.get(S)?.locations?.[0],L=P?.path??x?.path;if(!L)return!1;let _=null;P?.line!==void 0?_=P.line:x&&(_=Dy(x));let G=_===null?"":`:${_}`;return I.tryOpenPathString(L+G)}if(h.startsWith("tools:")){if(w===0)return!1;let S=$s.get(h),x=S?S[w]:void 0;if(!x)return!1;let A=et.get(x),P=A?.locations?.[0];if(P){let _=P.line===void 0?"":`:${P.line}`;if(I.tryOpenPathString(P.path+_))return!0}let L=A?.detailFull??A?.detail;if(L)return I.tryOpenPathString(L)}return!1},Uy=(h,w)=>{if(h.startsWith("editdiff:")){let S=h.slice(9),x=Pn.get(S);if(!x)return;let A=Mn.get(S)??i.showFileUpdates==="diff";Mn.set(S,!A),$o(S,x,A?"edit":"diff"),I.repaintNow();return}if(h==="plan"){if(O===null)return;ne=!(ne??i.planExpanded),Ge(),I.repaintNow();return}if(h.startsWith("tools:")){if(w===0){let A=_s.get(h)??i.toolsExpanded;_s.set(h,!A),h===zt&&T!==null?Kt():Po(h),I.repaintNow();return}let S=$s.get(h);if(!S)return;let x=S[w];if(!x)return;pC(x,yr),Po(h),I.repaintNow();return}if(h.startsWith("thought:")){if(!On.has(h))return;let S=Os.get(h);if(S!==void 0){Os.delete(h),I.setRunCollapsed(S,!1,My(h)),I.repaintNow();return}let x=I.contiguousRun(h,new Set(On.keys()));if(x.length===0)return;let A=x[0];Os.set(A,x),I.setRunCollapsed(x,!0,[Ey()]),I.repaintNow();return}};v=(h,w)=>{if(h.kind==="available-commands"){pr=h.commands,Si();return}if(h.kind==="available-modes"){Fe=h.modes;return}if(h.kind==="config-options"){nn=h.options;let x=h.options.find(P=>P.id==="agent");x&&x.currentValue&&x.currentValue!==At&&(At=x.currentValue,I.setSessionbar({agent:x.currentValue}));let A=h.options.find(P=>P.id==="mode");A&&(Fe=A.options.map(P=>({id:P.value,name:P.name??P.value,...P.description!==void 0?{description:P.description}:{}})));return}if(h.kind==="mode-changed"){I.setBanner({currentMode:h.mode||void 0});return}if(h.kind==="session-info"){h.title!==void 0&&I.setSessionbar({title:h.title}),h.agentId!==void 0&&h.agentId!==At&&(At=h.agentId,I.setSessionbar({agent:h.agentId}));return}if(h.kind==="usage-update"){let x=!1;h.used!==void 0&&It.used!==h.used&&(It.used=h.used,x=!0),h.size!==void 0&&It.size!==h.size&&(It.size=h.size,x=!0),h.costAmount!==void 0&&It.costAmount!==h.costAmount&&(It.costAmount=h.costAmount,x=!0),h.costCurrency!==void 0&&It.costCurrency!==h.costCurrency&&(It.costCurrency=h.costCurrency,x=!0),x&&I.setSessionbar({usage:{...It}});return}if(h.kind==="user-text"){vi&&Gn(h.text),ts(),ns(),T!==null&&(B=Date.now(),Kt()),ht=null,I.ensureSeparator();let x=ms(h);x.length>0&&I.appendLines(x),$d(),I.clearKey("plan"),O=null,ne=null,et.clear(),es.clear(),_n.length=0,B=null,au(),I.redraw();return}if(h.kind==="agent-text"){ns(),Me===null&&z(h.workerTaskId),Ty(h.text);return}if(h.kind==="agent-thought"){ts(),Fs===null&&z(h.workerTaskId),_y(h.text,h.workerTaskId);return}if(h.kind==="exit-plan-mode"){ts(),ns();let x=es.get(h.toolCallId),A={plan:h.plan??x?.plan??"",status:h.status??x?.status};if(es.set(h.toolCallId,A),A.plan.length===0)return;let P=Vh(A);P.length>0&&I.upsertLines(h.toolCallId,P);return}if(h.kind==="tool-call"){ts(),ns(),et.has(h.toolCallId)||z(h.workerTaskId),cu(h.toolCallId,h.title,h.status,void 0,h.editDiff,h.detail,h.detailFull,h.locations,h.workerTaskId,w),Kt(),lu(h.toolCallId);return}if(h.kind==="plan"){ts(),ns(),O=h;let x=ms(h,Ne());x.length>0&&I.upsertLines("plan",[{body:""},...x]);let A=h.entries.length>0&&h.entries.every(P=>(P.status??"pending")==="completed");I.setStickyBottomKey(A?null:"plan");return}if(h.kind==="tool-call-update"){ts(),ns(),cu(h.toolCallId,h.title,h.status,h.errorText,h.editDiff,h.detail,h.detailFull,h.locations,h.workerTaskId,w),h.upstreamInterrupted&&(Oe=!0),Kt(),lu(h.toolCallId);return}h.kind==="model-changed"&&I.setSessionbar({model:h.model});let S=ms(h);if(S.length>0&&I.appendLines(S),h.kind==="turn-complete"){te=void 0,ts(),ns();let x=h.amended?"amended":h.stopReason;if(!h.amended&&Oe&&(x===void 0||x==="end_turn")&&(x="error"),O!==null&&x!==void 0&&x!=="end_turn"){let A=ms({...O,stopped:!0,amended:h.amended===!0},Ne());A.length>0&&I.upsertLines("plan",[{body:""},...A])}O=null,ne=null,I.clearKey("plan"),I.setStickyBottomKey("plan"),T!==null?(B=Date.now(),ae=x??null,Kt(),$d()):x!==void 0&&x!=="end_turn"&&x!=="amended"&&I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`turn ended: ${x}`,bodyStyle:"tool-status-fail"}]),et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null,Oe=!1,I.ensureSeparator(),ay({pendingTurns:U,queueSize:pt.size,ownTurnInFlight:ft!==null,hasInFlightHead:te!==void 0,replayDraining:k,amended:h.amended===!0})&&j(-U)}};let uu=y;y=[];let Oo=[];for(let{event:h}of uu)h.kind==="user-text"&&typeof h.text=="string"&&Oo.push(h.text);I.pauseRepaint(),k=!0;try{for(let{event:h,rawUpdate:w}of uu)v(h,w)}finally{k=!1,I.resumeRepaint()}if(Oo.length>0){let h=$c(Ve,Oo);h!==Ve&&(Ve=h,Wt=$c(Wt,Oo),he.setHistory(aa(Ft,Wt)),qs(tn,Ve).catch(()=>{}))}vi=!0,Ie!==void 0&&U>0?(Z=Ie,I.setBanner({status:"busy",elapsedMs:Date.now()-Ie}),ee===null&&(ee=oe()),T===null&&au(),T=Ie,Kt()):Ie===void 0&&U>0&&j(-U);let jy=()=>{if(be){let h=be.resolve;be=null,I.setPermissionPrompt(null),h({outcome:{outcome:"cancelled"}})}ts(),ns()},fu=()=>{T!==null&&(B=Date.now(),ae="reconnect-recovery-failed",Kt(),$d(),et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null)};return p=()=>{I.setBanner({status:"disconnected",elapsedMs:void 0})},u=async()=>{jy();let h={jsonrpc:"2.0",id:`tui-reinit-${ly()}`,method:"initialize",params:{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}}};try{await m.request(h)}catch{}let w=$e!==void 0,S={jsonrpc:"2.0",id:`tui-reattach-${ly()}`,method:"session/attach",params:{sessionId:ve,historyPolicy:w?"after_message":"none",...w?{afterMessageId:$e}:{},clientInfo:{name:"hydra-acp-tui",version:fe},...(()=>{let _={};return xs!==void 0&&(_.resume={upstreamSessionId:xs,agentId:At,cwd:Ke}),e.tui.toolContent==="references"&&(_.toolContent="references"),Object.keys(_).length>0?{_meta:{[lt]:_}}:{}})()}};kn=[];let x,A,P;try{let _=await m.request(S);if(_.error)throw new Error(_.error.message);P=oy(_.result),x=P.appliedPolicy,P.clientId!==void 0&&(Vn=P.clientId)}catch(_){A=_}let L=kn??[];if(kn=null,A)fu(),I.appendLines([{prefix:" ",body:`reattach failed: ${A.message}`,bodyStyle:"tool-status-fail"}]);else if(w&&x!=="after_message")fu(),I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"reconnect couldn't replay events since last seen \u2014 scrollback may be incomplete",bodyStyle:"tool-status-fail"}]);else{k=!0;try{for(let _ of L)Ot(_)}finally{k=!1}}if(P){let _=dy({daemonTurnStartedAt:P.turnStartedAt,pendingTurns:U});_.pendingTurnsDelta!==0&&j(_.pendingTurnsDelta),_.banner==="busy"&&_.busySince!==void 0?(Z=_.busySince,I.setBanner({status:"busy",elapsedMs:Date.now()-_.busySince}),ee===null&&(ee=oe())):I.setBanner({status:"ready",elapsedMs:void 0})}else I.setBanner({status:U>0?"busy":"ready",elapsedMs:U>0?0:void 0})},g.onClose(h=>{h&&t.red(`
@@ -225,8 +225,8 @@ ${gc}`:gc;await n.connection.request("session/prompt",{sessionId:d,prompt:[{type
225
225
  `):(g.push(v),g.length>m&&g.shift()))})),r.raw.on("close",()=>{u?.(),i.raw.writableEnded||i.raw.end()});try{f=await l.getHistorySnapshot()}catch(v){throw u?.(),v}}else{let v=await e.getHistory(c);if(v===void 0)return i.code(404).send({error:"session not found"}),i;f=v}i.raw.setHeader("Content-Type","application/x-ndjson"),i.raw.setHeader("Cache-Control","no-cache"),i.raw.statusCode=200;let y=new Set;for(let v of f??[]){i.raw.write(JSON.stringify(v)+`
226
226
  `);let b=v;typeof b.recordedAt=="number"&&y.add(String(b.recordedAt))}for(;g.length>0;){let v=g.splice(0,g.length);for(let b of v){let k=b,R=typeof k.recordedAt=="number"?String(k.recordedAt):"";R&&y.has(R)||i.raw.write(JSON.stringify(b)+`
227
227
  `)}}return p=!0,u||i.raw.end(),i})}yt();function Hp(t,e,n,s={}){t.get("/v1/agents",async()=>Er(e)),t.get("/v1/registry",async()=>e.load()),t.post("/v1/registry/refresh",async()=>{let r=await e.refresh();return{version:r.version,agentCount:r.agents.length}}),t.post("/v1/agents/:id/install",async(r,i)=>{let o=r.params.id,a=await e.getAgent(o);if(!a){i.code(404).send({error:`agent ${o} not found in registry`});return}if(a.distribution.uvx&&!a.distribution.npx&&!a.distribution.binary){i.send({agentId:a.id,version:a.version??"current",distribution:"uvx",installed:!1,message:"uvx agents resolve on first run; nothing to pre-install."});return}try{let d=await fn(a,[],{npmRegistry:s.npmRegistry}),c=a.distribution.npx?"npx":a.distribution.binary?"binary":"unknown";i.send({agentId:a.id,version:d.version,distribution:c,installed:!0,command:d.command})}catch(d){i.code(500).send({error:d.message})}}),t.post("/v1/agents/:id/sync",async(r,i)=>{let o=r.params.id;try{let{synced:a,skipped:d}=await n.syncFromAgent(o);return{synced:a.map(c=>({sessionId:c.sessionId,upstreamSessionId:c.upstreamSessionId,agentId:c.agentId,cwd:c.cwd,title:c.title,updatedAt:c.updatedAt})),skipped:d}}catch(a){let d=a;if(d.code===D.AgentNotInstalled){i.code(404).send({error:d.message});return}i.code(409).send({error:d.message})}})}function Up(t,e,n){t.get("/v1/health",{config:{skipAuth:!0}},async()=>({status:"ok",version:e,configDigest:n}))}var CI=/^[A-Za-z0-9._-]+$/;function Pa(t,e,n){let s=e==="extension"?"extensions":"transformers",r=`/v1/${s}`;t.get(r,async()=>({[s]:n.list()})),t.get(`${r}/:name`,async(i,o)=>{let a=i.params.name,d=n.get(a);if(!d){o.code(404).send({error:`unknown ${e}: ${a}`});return}return d}),t.post(r,async(i,o)=>{let a=i.body??{},d=RI(a);if("error"in d){o.code(400).send({error:d.error});return}try{let c=n.register(d.config);o.code(201).send(c)}catch(c){Zi(o,c)}}),t.delete(`${r}/:name`,async(i,o)=>{let a=i.params.name;try{await n.unregister(a),o.code(204).send()}catch(d){Zi(o,d)}}),t.post(`${r}/:name/start`,async(i,o)=>{let a=i.params.name;try{let d=await n.startByName(a);o.code(200).send(d)}catch(d){Zi(o,d)}}),t.post(`${r}/:name/stop`,async(i,o)=>{let a=i.params.name;try{let d=await n.stopByName(a);o.code(200).send(d)}catch(d){Zi(o,d)}}),t.post(`${r}/:name/restart`,async(i,o)=>{let a=i.params.name;try{let d=await n.restartByName(a);o.code(200).send(d)}catch(d){Zi(o,d)}})}function Zi(t,e){let n=e.code,s=e.message??"unknown error";if(n==="NOT_FOUND"){t.code(404).send({error:s});return}if(n==="CONFLICT"){t.code(409).send({error:s});return}t.code(500).send({error:s})}function RI(t){let e=t.name;if(typeof e!="string"||!CI.test(e))return{error:"name must match [A-Za-z0-9._-]+"};let n=t.command;if(n!==void 0&&(!Array.isArray(n)||n.some(o=>typeof o!="string")))return{error:"command must be string[]"};let s=t.args;if(s!==void 0&&(!Array.isArray(s)||s.some(o=>typeof o!="string")))return{error:"args must be string[]"};let r=t.env;if(r!==void 0&&(typeof r!="object"||r===null||Array.isArray(r)))return{error:"env must be an object of string\u2192string"};if(r&&Object.values(r).some(o=>typeof o!="string"))return{error:"env values must be strings"};let i=t.enabled;return i!==void 0&&typeof i!="boolean"?{error:"enabled must be a boolean"}:{config:{name:e,command:n??[],args:s??[],env:r??{},enabled:i===void 0?!0:i}}}function jp(t,e){Pa(t,"extension",e)}function qp(t,e){Pa(t,"transformer",e)}function Wp(t,e){t.get("/v1/config",async()=>e)}import{z as jr}from"zod";ge();import*as ls from"fs/promises";import*as Vp from"path";import{randomBytes as TI,scrypt as EI,timingSafeEqual as PI}from"crypto";import{promisify as MI}from"util";var Yp=MI(EI);function Uc(){return Vp.join(M.home(),"password-hash")}var Jp=32768,zp=8,Kp=1,_I=64,$I=16,Gp=128*1024*1024;async function Qp(t){if(typeof t!="string"||t.length===0)throw new Error("password must be a non-empty string");let e=TI($I),n=await Yp(t,e,_I,{N:Jp,r:zp,p:Kp,maxmem:Gp}),s=`scrypt$${Jp}$${zp}$${Kp}$${e.toString("hex")}$${n.toString("hex")}
228
- `;await ls.mkdir(M.home(),{recursive:!0}),await ls.writeFile(Uc(),s,{encoding:"utf8",mode:384})}async function Ma(){try{return(await ls.readFile(Uc(),"utf8")).trim().length>0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function _a(t){if(typeof t!="string"||t.length===0)return!1;let e;try{e=(await ls.readFile(Uc(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let n=e.split("$");if(n.length!==6||n[0]!=="scrypt")return!1;let s=parseInt(n[1],10),r=parseInt(n[2],10),i=parseInt(n[3],10);if(!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i))return!1;let o=Buffer.from(n[4],"hex"),a=Buffer.from(n[5],"hex");if(o.length===0||a.length===0)return!1;let d=await Yp(t,o,a.length,{N:s,r,p:i,maxmem:Gp});return d.length!==a.length?!1:PI(d,a)}var OI=jr.object({password:jr.string().min(1),label:jr.string().min(1).max(256).optional(),ttlSec:jr.number().int().positive().optional()}),FI=jr.object({id:jr.string().optional()}).optional();function Xp(t,e){t.post("/v1/auth/login",{config:{skipAuth:!0}},async(n,s)=>{let r=LI(n);if(e.rateLimiter.isBlocked(r))return s.code(429).send({error:"Too many failed attempts; try again later."});let i;try{i=OI.parse(n.body)}catch{return s.code(400).send({error:"Invalid request body"})}if(!await Ma())return s.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await _a(i.password))return e.rateLimiter.recordFailure(r),s.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(r);let a=await e.store.issue({label:i.label,ttlSec:i.ttlSec});return s.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),t.post("/v1/auth/logout",async(n,s)=>{let r;try{r=FI.parse(n.body??void 0)}catch{return s.code(400).send({error:"Invalid request body"})}let i=r?.id??n.authIdentity;if(!i||i==="service")return s.code(200).send({revoked:!1});let o=await e.store.revoke(i);return s.code(200).send({revoked:o})}),t.get("/v1/auth/verify",async(n,s)=>s.code(200).send({ok:!0})),t.get("/v1/auth/sessions",async(n,s)=>s.code(200).send({sessions:e.store.list()})),t.delete("/v1/auth/sessions/:id",async(n,s)=>{let r=n.params.id;return await e.store.revoke(r)?s.code(204).send():s.code(404).send({error:"Not found"})})}function LI(t){return t.ip||"unknown"}Us();qr();import{nanoid as zc}from"nanoid";ea();yt();_t();import{randomBytes as UI}from"crypto";import*as eh from"os";function we(t,e,n){let s=new Error(e);return s.code=t,n!==void 0&&(s.data=n),s}function jI(t){if(!t||typeof t!="object")return 512;let s=t.params?.update;if(!s)return 512;let r=512,i=s.content;if(typeof i=="string")r+=i.length;else if(i&&typeof i=="object"){let a=i;typeof a.text=="string"&&(r+=a.text.length),typeof a.data=="string"&&(r+=a.data.length)}let o=s.toolCall;if(o&&(typeof o.rawInput=="string"?r+=o.rawInput.length:o.rawInput&&typeof o.rawInput=="object"&&(r+=256),typeof o.rawOutput=="string"?r+=o.rawOutput.length:o.rawOutput&&typeof o.rawOutput=="object"&&(r+=256),Array.isArray(o.content)))for(let a of o.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(r+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(r+=c.text.length)}}return r}function Qt(t,e,n){let s=t.get(e);if(!s)throw we(D.SessionNotFound,n??`session ${e} not found`);return s}async function jc(t,e){let n=Qi(t),s;try{s=await t.manager.resurrect({...e,mcpServers:n?.descriptors})}catch(r){throw n!==void 0&&n.abandon(r instanceof Error?r:void 0),r}return n!==void 0&&n.bindToSession(s),VI(s,t),s}function th(t,e){t.get("/acp",{websocket:!0},async(n,s)=>{let r=kp({headers:s.headers,url:s.url});if(!r||!await e.validator.validate(r)){n.close(4401,"Unauthorized");return}let i=e.processRegistry?.resolve(r),o=wn(n),a=new kt(o),d={clientId:`hydra_client_${zc(12)}`,processIdentity:i,attached:new Map};a.onClose(()=>{for(let f of d.attached.values())e.manager.get(f.sessionId)?.detach(f.clientId);d.attached.clear()});let c=(f,u)=>{if(d.attached.get(f)?.readonly)throw we(D.PermissionDenied,`${u} not permitted on a read-only attachment`)};if(a.onRequest("initialize",async f=>{let u=nf.parse(f??{});u.clientInfo?.name&&(d.clientInfo={name:u.clientInfo.name,...u.clientInfo.version!==void 0?{version:u.clientInfo.version}:{}});let p=u.clientInfo?.version;return p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p)),KI()}),i&&e.extensionCommands){let f=e.extensionCommands;a.onRequest("hydra-acp/commands/register",async u=>{let p=u??{},m=Array.isArray(p.commands)?p.commands.map(g=>{if(!g||typeof g!="object")return;let y=g;if(typeof y.verb!="string")return;let v={verb:y.verb};return typeof y.argsHint=="string"&&(v.argsHint=y.argsHint),typeof y.description=="string"&&(v.description=y.description),v}).filter(g=>g!==void 0):[];return f.register(i.name,a,m),{ok:!0,registered:m.length}}),a.onClose(()=>{f.clear(i.name)})}if(i&&e.extensionMcp){let f=e.extensionMcp;a.onRequest("hydra-acp/mcp_tools/register",async u=>{let p=u??{},m=typeof p.instructions=="string"?p.instructions:void 0,g=Array.isArray(p.tools)?p.tools.map(y=>{if(!y||typeof y!="object")return;let v=y;if(typeof v.name!="string"||v.name.length===0||typeof v.description!="string"||v.inputSchema===null||typeof v.inputSchema!="object")return;let b={name:v.name,description:v.description,inputSchema:v.inputSchema};return v.outputSchema!==null&&typeof v.outputSchema=="object"&&(b.outputSchema=v.outputSchema),b}).filter(y=>y!==void 0):[];if(g.length===0)throw new Error("register_mcp_tools requires at least one tool");return f.register(i.name,a,m,g),{ok:!0,registered:g.length}}),a.onClose(()=>{f.clear(i.name)})}i?.kind==="transformer"&&(a.onRequest("hydra-acp/transformer/initialize",async f=>{let u=f??{},p=Array.isArray(u.intercepts)?u.intercepts.filter(m=>typeof m=="string"):[];if(e.transformers&&(e.transformers.registerConnection(i.name,a,p),e.manager?.defaultTransformers.includes(i.name))){let m=e.transformers.resolveChain([i.name])[0];if(m)for(let g of e.manager.liveSessions())g.addTransformer(m)}return{ack:!0}}),a.onClose(()=>{e.transformers?.deregisterConnection(i.name)}),a.onRequest("hydra-acp/message/emit",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0,m=typeof u.method=="string"?u.method:void 0,g=u.envelope,y=u.route;if(!p||!m)throw we(-32602,"emit_message requires sessionId and method");let v=Qt(e.manager,p),b=typeof u.respondsTo=="string"?u.respondsTo:void 0;if(b)return v.dischargeClaim(b,g),{ok:!0};if(y==="chain")return{ok:!0,response:await v.emitToChain(i.name,m,g)};if(y==="daemon")return{ok:!0,response:await v.emitToChain(i.name,m,g)};throw we(-32602,`unsupported route: ${JSON.stringify(y)}`)}),a.onRequest("hydra-acp/session/request_permission",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(-32602,"hydra-acp/session/request_permission requires sessionId");return Qt(e.manager,p).requestPermissionFromClients(u)}),a.onRequest("hydra-acp/transformer/attach",async f=>JI(f,i.name,e)),a.onRequest("hydra-acp/child_session/spawn",async f=>{let u=f??{},p=typeof u.agentId=="string"?u.agentId:e.defaultAgent,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.parentSessionId=="string"?u.parentSessionId:void 0,y=u._meta&&typeof u._meta=="object"?u._meta:void 0,v=y&&y["hydra-acp"]&&typeof y["hydra-acp"]=="object"?y["hydra-acp"]:void 0,b=v&&typeof v.title=="string"?v.title:void 0,k=v&&typeof v.model=="string"?v.model:void 0;if(!m&&g){let z=e.manager.get(g);z&&(m=z.cwd)}if(!m)throw we(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let R=typeof u.interactive=="boolean"?u.interactive:!1;return{childSessionId:(await e.manager.create({agentId:p,cwd:m,parentSessionId:g,interactive:R,transformChain:[],title:b,model:k})).sessionId}}),a.onRequest("hydra-acp/session/fork",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"fork_session requires sessionId");let p=typeof u.forkAt=="string"?u.forkAt:void 0,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.agentId=="string"?u.agentId:void 0;return await e.manager.forkSession(u.sessionId,{...p!==void 0?{forkAt:p}:{},...m!==void 0?{cwd:m}:{},...g!==void 0?{agentId:g}:{}})}),a.onRequest("hydra-acp/session/delete",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"hydra-acp/session/delete requires sessionId");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=e.manager.get(p);if(m)return await m.close({deleteRecord:!0}),{deleted:!0,sessionId:p};if(!await e.manager.deleteRecord(p))throw we(D.SessionNotFound,`session ${p} not found`);return{deleted:!0,sessionId:p}}),a.onRequest("hydra-acp/child_session/await",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0,m=u.until==="idle"?"idle":"turn_complete",g=typeof u.timeoutMs=="number"?Math.min(u.timeoutMs,18e5):3e5;if(!p)throw we(-32602,"await_child requires childSessionId");let y=Qt(e.manager,p,`child session ${p} not found`);return new Promise(v=>{let R=[],H=[],z=0,K=!1,J,W,F=!1,U=()=>{F||(F=!0,clearTimeout(Y),J?.(),W?.(),v(K?{entries:R,truncated:!0}:{entries:R}))};J=y.onBroadcast(te=>{let Z=jI(te);for(R.push(te),H.push(Z),z+=Z;R.length>0&&(R.length>1e3||z>1048576);)R.shift(),z-=H.shift()??0,K=!0;m==="turn_complete"&&te.params?.update?.sessionUpdate==="turn_complete"&&U()});let Y=setTimeout(U,g);typeof Y.unref=="function"&&Y.unref(),W=y.onClose(()=>U())})}),a.onRequest("hydra-acp/child_session/close",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0;if(!p)throw we(-32602,"close_child_session requires childSessionId");let m=e.manager.get(p);return m&&await m.close({deleteRecord:!1}),{ok:!0}}),a.onRequest("hydra-acp/connection/keep_alive",async f=>{let u=f??{},p=typeof u.token=="string"?u.token:void 0,m=typeof u.sessionId=="string"?u.sessionId:void 0,g=typeof u.estimatedRemainingMs=="number"?u.estimatedRemainingMs:void 0;return p&&m&&e.manager.get(m)?.keepAliveClaim(p,g),{ok:!0}})),a.onRequest("hydra-acp/session/tool_content",async f=>{let u=f??{};if(typeof u.sessionId!="string"||typeof u.hash!="string")throw we(D.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=await e.manager.loadToolBlob(p,u.hash);if(m===null)throw we(D.SessionNotFound,"tool content not found");return{content:m}}),a.onRequest("authenticate",async f=>qI(f,e)),a.onRequest("session/new",async f=>{let u=sf.parse(f),p=Mt(f?._meta),m=Array.isArray(p.transformers)&&p.transformers.every(W=>typeof W=="string")?p.transformers:e.manager.defaultTransformers??[],g=e.transformers?.resolveChain(m)??[],y,v,b=u.mcpServers;if(p.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){y=UI(32).toString("hex"),v=e.mcpTokenRegistry.reserve(y);let F={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${y}`}]};b=[...u.mcpServers??[],F]}let k=Qi(e);k!==void 0&&(b=[...b??[],...k.descriptors]);let R;try{R=await e.manager.create({cwd:u.cwd,agentId:p.agentId??e.defaultAgent,mcpServers:b,title:p.title,agentArgs:p.agentArgs,model:p.model,onInstallProgress:Zp(a),transformChain:g,originatingClient:d.clientInfo,...p.interactive!==void 0?{interactive:p.interactive}:{},...p.env!==void 0?{forwardedEnv:p.env}:{}})}catch(W){throw v!==void 0&&v.abandon(W instanceof Error?W:void 0),k!==void 0&&k.abandon(W instanceof Error?W:void 0),W}if(y!==void 0&&v!==void 0&&e.mcpTokenRegistry!==void 0){let W=y,F=e.mcpTokenRegistry;v.complete(R),R.onClose(()=>{F.unbind(W)})}k!==void 0&&k.bindToSession(R);let H,z;try{H=$a(a,R,d),{entries:z}=await R.attach(H,"full")}catch(W){throw await R.close({deleteRecord:!1}).catch(()=>{}),W}d.attached.set(R.sessionId,{sessionId:R.sessionId,clientId:H.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let W of z){if(a.isClosed())break;await a.notify(W.method,W.params).catch(()=>{})}})()});let K=qc(R),J=Wc(R);return{sessionId:R.sessionId,...K?{modes:K}:{},...J?{models:J}:{},configOptions:R.buildConfigOptions(),_meta:Jc(e.manager,R,{clientId:H.clientId})}}),a.onRequest("session/attach",async f=>{let u=of.parse(f),p=u.clientInfo?.version;p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p));let m=Mt(u._meta),g=m.resume,y=m.readonly===!0,v=m.env;t.log.info(`session/attach sessionId=${u.sessionId} hasResumeHints=${!!g} readonly=${y}`);let b=g?u.sessionId:await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,k=e.manager.get(b);if(!k&&y){let F=await e.manager.loadFromDisk(b);if(!F)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);let U=await e.manager.loadHistory(b),Y=u.clientId??`cli_${zc(8)}`;d.attached.set(F.hydraSessionId,{sessionId:F.hydraSessionId,clientId:Y,readonly:!0}),t.log.info(`session/attach OK (viewer) sessionId=${F.hydraSessionId} clientId=${Y} attachedCount=${d.attached.size} replayed=${U.length}`);for(let te of U)await a.notify(te.method,te.params).catch(()=>{});return{sessionId:F.hydraSessionId,clientId:Y,connectedClients:[Y],historyPolicy:"full",replayed:U.length,_meta:zI(F)}}if(!k){let F=await e.manager.loadFromDisk(b),U=F;if(g&&(U={...F,hydraSessionId:u.sessionId,upstreamSessionId:g.upstreamSessionId,agentId:g.agentId,cwd:g.cwd,...g.title!==void 0?{title:g.title}:{},...g.agentArgs!==void 0?{agentArgs:g.agentArgs}:{}}),!U)throw we(D.SessionNotFound,`session ${u.sessionId} not found and no resume hints provided`);let Y=U.originatingClient?U:{...U,originatingClient:d.clientInfo},te=v!==void 0?{...Y,forwardedEnv:v}:Y;k=await jc(e,{...te,onInstallProgress:Zp(a)})}let R=$a(a,k,d,u.clientInfo,u.clientId),H=m.replayMode==="drip",{entries:z,appliedPolicy:K}=await k.attach(R,u.historyPolicy,{afterMessageId:u.afterMessageId,raw:H,...m.toolContent!==void 0?{toolContent:m.toolContent}:{}});if(d.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:R.clientId,readonly:y}),v!==void 0&&await e.manager.setForwardedEnv(k.sessionId,v).catch(()=>{}),t.log.info(`session/attach OK sessionId=${k.sessionId} clientId=${R.clientId} attachedCount=${d.attached.size} requestedPolicy=${u.historyPolicy} appliedPolicy=${K} replayed=${z.length} readonly=${y}${H?" replayMode=drip":""}`),H){let F=m.dripSpeed&&m.dripSpeed>0?m.dripSpeed:1,U=750;(async()=>{let Y=null;for(let te of z){let Z=typeof te.recordedAt=="number"?te.recordedAt:null;if(Y!==null&&Z!==null){let ee=Math.min(U,Math.max(0,(Z-Y)/F));ee>0&&await new Promise(Q=>setTimeout(Q,ee))}Z!==null&&(Y=Z);try{await a.notify(te.method,te.params)}catch{return}}})()}else for(let F=0;F<z.length&&!a.isClosed();F++){let U=z[F],Y=a.notify(U.method,U.params).catch(()=>{});(F+1)%200===0&&await Y}k.replayPendingPermissions(R);let J=qc(k),W=Wc(k);return{sessionId:k.sessionId,clientId:R.clientId,connectedClients:k.connectedClients(R.clientId),historyPolicy:K,replayed:z.length,...J?{modes:J}:{},...W?{models:W}:{},configOptions:k.buildConfigOptions(),_meta:Jc(e.manager,k)}}),a.onRequest("session/detach",async f=>{let u=af.parse(f),p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"client not attached to that session");let m=e.manager.get(u.sessionId);return m?.detach(p.clientId),d.attached.delete(u.sessionId),m&&e.manager.reapIfOrphanedNonInteractive(u.sessionId),{sessionId:u.sessionId,_meta:{[lt]:{detachStatus:"detached"}}}}),a.onRequest("session/list",async f=>{let u=df.parse(f??{});return{sessions:(await e.manager.list({cwd:u.cwd})).filter(y=>y.originatingClient?.name!==js).map(cf)}}),a.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw we(D.InternalError,"agent registry unavailable");return Er(e.registry)}),a.onRequest("session/prompt",async f=>{let u=lf.parse(f);c(u.sessionId,"session/prompt");let p=d.attached.get(u.sessionId);if(!p)throw t.log.warn(`session/prompt rejected: not attached sessionId=${u.sessionId} attachedKeys=[${[...d.attached.keys()].join(",")}]`),we(D.SessionNotFound,"not attached to session");let m=e.manager.get(u.sessionId);if(!m){let g=await e.manager.loadFromDisk(u.sessionId);if(!g)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);t.log.info(`session/prompt auto-resurrecting cold sessionId=${u.sessionId}`),m=await jc(e,g);let y=$a(a,m,d,void 0,p.clientId);await m.attach(y,"none")}return m.prompt(p.clientId,u)});let l=f=>{let u;try{u=Vo.parse(f)}catch(g){t.log.warn(`session/cancel: invalid params: ${g.message}`);return}let p=d.attached.get(u.sessionId);if(!p)return;if(p.readonly){t.log.warn(`session/cancel dropped (readonly attachment) sessionId=${u.sessionId}`);return}let m=e.manager.get(u.sessionId);m&&m.cancel(p.clientId).catch(g=>{t.log.warn(`session/cancel for ${u.sessionId}: ${g.message}`)})};a.onNotification("session/cancel",l),a.onRequest("session/cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"session/cancel"),l(f),null}),a.onRequest("hydra-acp/prompt/cancel",async f=>{let u=ff.parse(f);return c(u.sessionId,"hydra-acp/prompt/cancel"),Qt(e.manager,u.sessionId).cancelQueuedPrompt(u.messageId)}),a.onRequest("hydra-acp/session/force_cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"hydra-acp/session/force_cancel"),Qt(e.manager,u.sessionId).forceCancel()}),a.onRequest("hydra-acp/prompt/update",async f=>{let u=pf.parse(f);return c(u.sessionId,"hydra-acp/prompt/update"),Qt(e.manager,u.sessionId).updateQueuedPrompt(u.messageId,u.prompt)}),a.onRequest("hydra-acp/prompt/amend",async f=>{let u=hf.parse(f);c(u.sessionId,"hydra-acp/prompt/amend");let p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"not attached to session");return Qt(e.manager,u.sessionId).amendPrompt(p.clientId,u)}),a.onRequest("session/load",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(D.InvalidParams,"session/load requires sessionId");let m=await e.manager.resolveCanonicalId(p)??p,g=e.manager.get(m);if(!g){let R=await e.manager.loadFromDisk(m);if(!R)throw we(D.SessionNotFound,`session ${p} not found in memory or on disk`);g=await jc(e,R)}let y=$a(a,g,d),{entries:v}=await g.attach(y,"pending_only");d.attached.set(g.sessionId,{sessionId:g.sessionId,clientId:y.clientId,readonly:!1});for(let R of v){if(a.isClosed())break;await a.notify(R.method,R.params).catch(()=>{})}g.replayPendingPermissions(y);let b=qc(g),k=Wc(g);return{sessionId:g.sessionId,...b?{modes:b}:{},...k?{models:k}:{},configOptions:g.buildConfigOptions(),_meta:Jc(e.manager,g,{clientId:y.clientId})}}),a.onRequest("session/set_model",async f=>{let u=f?.sessionId;typeof u=="string"&&c(u,"session/set_model");let p=WI(f,e.manager);if(p.kind==="error")throw t.log.warn(p.logMessage),we(p.code,p.message);if(p.kind==="no_op")return t.log.warn(p.logMessage),await a.notify("session/update",{sessionId:p.sessionId,update:{sessionUpdate:"current_model_update",currentModel:p.currentModel}}).catch(()=>{}),null;t.log.info(p.logMessage);let{modelId:m}=p,g=await p.session.forwardRequest("session/set_model",{...f,modelId:m});return p.session.applyModelChange(m),g}),a.onRequest("session/set_mode",async f=>{let u=f,p=u?.sessionId;if(typeof p=="string"&&c(p,"session/set_mode"),!u||typeof u.sessionId!="string")throw we(D.InvalidParams,"session/set_mode requires string sessionId");if(typeof u.modeId!="string")throw we(D.InvalidParams,"session/set_mode requires string modeId");let m=Qt(e.manager,u.sessionId),g=await m.forwardRequest("session/set_mode",f);return m.applyModeChange(u.modeId),g}),a.onRequest("session/set_config_option",async f=>{let u=f,p=v=>we(D.InvalidParams,v),m=u?.sessionId;if(typeof m=="string"&&c(m,"session/set_config_option"),!u||typeof u.sessionId!="string")throw p("session/set_config_option requires string sessionId");if(typeof u.configId!="string")throw p("session/set_config_option requires string configId");if(typeof u.value!="string")throw p("session/set_config_option requires string value");let g=Qt(e.manager,u.sessionId),y=g.buildConfigOptions().find(v=>v.id===u.configId);if(!y)throw p(`unknown configId ${JSON.stringify(u.configId)} for this session`);if(!y.options.some(v=>v.value===u.value))throw p(`value ${JSON.stringify(u.value)} is not valid for configId ${JSON.stringify(u.configId)}`);switch(u.configId){case"model":{u.value!==g.currentModel&&await g.forwardRequest("session/set_model",{sessionId:u.sessionId,modelId:u.value}),g.applyModelChange(u.value);break}case"mode":{u.value!==g.currentMode&&await g.forwardRequest("session/set_mode",{sessionId:u.sessionId,modeId:u.value}),g.applyModeChange(u.value);break}case"agent":{u.value!==g.agentId&&await g.setAgent(u.value);break}default:throw p(`configId ${JSON.stringify(u.configId)} is not settable`)}return{configOptions:g.buildConfigOptions()}}),a.setDefaultHandler(async(f,u)=>{if(!u.startsWith("session/")||f===null||typeof f!="object")throw we(D.MethodNotFound,`Method not found: ${u}`);let p=f.sessionId;if(typeof p!="string")throw we(D.MethodNotFound,`Method not found: ${u}`);return c(p,u),Qt(e.manager,p).forwardRequest(u,f)})})}async function qI(t,e){let n=t??{};if(typeof n.methodId!="string"||n.methodId.length===0)throw we(D.InvalidParams,"authenticate requires a non-empty methodId string");let s=n.methodId,r=n._meta?.["hydra-acp"],i=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,a=i!==void 0?e.manager.getAgentForSession(i):void 0;if(!a||!a.isAlive()){let u=o??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(u)}let d=a.authMethods??[],c=d.find(u=>u.id===s);if(!c){let u=d.map(p=>p.id);throw we(D.InvalidParams,`authenticate: methodId ${JSON.stringify(s)} is not advertised by agent ${a.agentId}; valid: [${u.map(p=>JSON.stringify(p)).join(", ")}]`)}let l=c._meta?.type;if((c.type??(l==="agent"||l==="terminal"?l:"agent"))==="terminal"){let u=c._meta?.args,p=[];if(u!==void 0){if(!Array.isArray(u))throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be a string[]; got ${u===null?"null":typeof u}`);for(let v of u)if(typeof v!="string")throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be string[]; got non-string entry ${JSON.stringify(v)}`);p=u}let m=await e.manager.planSpawnForAgent(a.agentId),g={};for(let[v,b]of Object.entries(process.env))typeof b=="string"&&(g[v]=b);Object.assign(g,m.env);let y=eh.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${s}`),{kind:"terminal",command:m.command,args:[...m.args,...p],env:g,cwd:y}}try{return await a.connection.request("authenticate",{methodId:s})}catch(u){throw Js(u,a)}}function Zp(t){return e=>{let n={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(n.receivedBytes=e.receivedBytes),"totalBytes"in e&&(n.totalBytes=e.totalBytes),"packageSpec"in e&&(n.packageSpec=e.packageSpec),t.notify(Yo,n).catch(()=>{})}}function qc(t){let e=t.availableModes();if(e.length===0)return;let n=e.map(r=>{let i={id:r.id,name:r.name??r.id};return r.description!==void 0&&(i.description=r.description),i});return{currentModeId:t.currentMode??e[0].id,availableModes:n}}function Wc(t){let e=t.availableModels();if(e.length===0)return;let n=e.map(r=>{let i={modelId:r.modelId};return r.name!==void 0&&(i.name=r.name),r.description!==void 0&&(i.description=r.description),i});return{currentModelId:t.currentModel??e[0].modelId,availableModels:n}}function WI(t,e){if(!t||typeof t!="object")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let n=t;if(typeof n.sessionId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof n.modelId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${n.sessionId}`};let s=e.get(n.sessionId);if(!s)return{kind:"error",code:D.SessionNotFound,message:`session ${n.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${n.sessionId}`};let r=s.availableModels(),i=Mr(n.modelId,r);if(i.kind==="none")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="exact")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model accepted sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="resolved")return{kind:"ok",session:s,modelId:i.modelId,logMessage:`session/set_model resolved sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} \u2192 ${JSON.stringify(i.modelId)}`};let o=r.map(d=>d.modelId).join(", "),a=i.kind==="ambiguous"?`ambiguous (trailing-segment matches [${i.candidates.join(", ")}])`:"not in availableModels";return s.currentModel!==void 0&&s.currentModel.length>0?{kind:"no_op",session:s,sessionId:n.sessionId,currentModel:s.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} ${a} actual=${JSON.stringify(s.currentModel)} agentId=${s.agentId} known=[${o}]`}:{kind:"error",code:D.InvalidParams,message:`model "${n.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${s.agentId}); known models: ${o}`,logMessage:`session/set_model rejected sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)} ${a} agentId=${s.agentId} known=[${o}] (no current model to fall back to)`}}async function JI(t,e,n){let s=t??{},r=typeof s.sessionId=="string"?s.sessionId:void 0;if(!r)throw we(D.InvalidParams,"transformer/attach requires sessionId");if(!n.transformers)throw we(D.InternalError,"transformer manager not configured");let i=n.transformers.resolveChain([e])[0];if(!i)throw we(D.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return Qt(n.manager,r).addTransformer(i),{ok:!0}}function zI(t){let e={sessionId:t.hydraSessionId,upstreamSessionId:t.upstreamSessionId,cwd:t.cwd,title:t.title,agentId:t.agentId,currentModel:t.currentModel,currentUsage:t.currentUsage,forkedFromSessionId:t.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId,originatingClient:t.originatingClient,interactive:t.interactive,updatedAt:t.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,awaitingInput:!1},n={currentMode:t.currentMode,agentArgs:t.agentArgs,availableCommands:t.agentCommands,availableModes:t.agentModes,availableModels:t.agentModels};return{[lt]:zo(e,n)}}function Jc(t,e,n={}){let s=t.liveListEntry(e),r={clientId:n.clientId,currentMode:e.currentMode,agentArgs:e.agentArgs,availableCommands:e.mergedAvailableCommands(),availableModes:e.availableModes(),availableModels:e.availableModels(),turnStartedAt:e.turnStartedAt,agentCapabilities:e.agentCapabilities,queue:e.queueSnapshot()};return _i(e.agentMeta,zo(s,r))}function KI(){return{protocolVersion:1,agentInfo:{name:"hydra",version:fe},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,sessionCapabilities:{attach:{},list:{}}},authMethods:[{id:"proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:_i(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0}})}}function VI(t,e){if(!(!e.transformers||!e.manager))for(let n of e.manager.defaultTransformers){let s=e.transformers.resolveChain([n])[0];s&&t.addTransformer(s)}}function $a(t,e,n,s,r){return{clientId:r??`cli_${zc(8)}`,connection:t,clientInfo:s}}var Oa=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let n,s,r=new Promise((o,a)=>{n=o,s=a});r.catch(()=>{});let i={session:void 0,sessionReady:r,disposers:[]};return this.byToken.set(e,i),{complete:o=>{i.session=o,n(o)},abandon:o=>{this.byToken.delete(e),s(o??new Error("mcp token reservation abandoned"))}}}bind(e,n){let{complete:s}=this.reserve(e);s(n)}lookup(e){return this.byToken.get(e)}addDisposer(e,n){let s=this.byToken.get(e);s!==void 0&&s.disposers.push(n)}async unbind(e){let n=this.byToken.get(e);if(n!==void 0){this.byToken.delete(e);for(let s of n.disposers)try{await s()}catch{}}}size(){return this.byToken.size}};import{randomUUID as YI}from"crypto";import{McpServer as GI}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as QI}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as ut}from"zod";var nh="Bearer ";function Fa(t){let e=t.headers.authorization;if(typeof e!="string"||!e.startsWith(nh))return;let n=e.slice(nh.length).trim();return n.length>0?n:void 0}function XI(t){let e=new GI({name:"hydra-acp-stdin",version:"1.0.0"},{instructions:"Piped input from `hydra cat --stream` is exposed here as a byte stream. Use `tail` for the latest N bytes (good for finding the end of a log), `head` for the first N bytes (good for headers/preamble), `read` for windowed reads against an absolute byte cursor, `wait_for_more` to block until new bytes arrive past a cursor, and `info` for the current cursors/capacity/closed status. Byte payloads come back base64-encoded."});return e.registerTool("tail",{description:"Return the most recent `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means older bytes existed but have been evicted from the ring.",inputSchema:{bytes:ut.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:n})=>{let s=t.streamTail(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("head",{description:"Return the first `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means the head has already been evicted from the ring and the returned bytes start at the oldest still-resident cursor.",inputSchema:{bytes:ut.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:n})=>{let s=t.streamHead(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("read",{description:"Read up to `max_bytes` bytes starting at absolute byte `cursor`. Returns `{bytes, nextCursor, gap?, eof?}` \u2014 `gap` is the number of bytes silently skipped because the ring had evicted them; `eof:true` means the producer closed and there is nothing left to read.",inputSchema:{cursor:ut.number().int().min(0).describe("Absolute byte offset to start reading from. Use 0 to read from the very beginning (may produce a gap if old bytes have been evicted)."),max_bytes:ut.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:ut.number().int().min(0).optional().describe("If no bytes are available, block up to this many ms for more (capped server-side at 60_000).")}},async({cursor:n,max_bytes:s,wait_ms:r})=>{let i=await t.streamRead(n,s,r);return{content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i}}),e.registerTool("wait_for_more",{description:"Block until bytes are available past `cursor`, the stream closes, or `timeout_ms` elapses. Returns one of {data, eof, timeout} plus the current `writeCursor`. Use this when you've consumed everything up to a cursor and want to wait for more without busy-polling.",inputSchema:{cursor:ut.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:ut.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:n,timeout_ms:s})=>{let r=await t.streamWaitFor(n,s),i=t.streamInfo(),o={outcome:r,writeCursor:i.writeCursor,closed:i.closed};return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o}}),e.registerTool("grep",{description:"Scan piped stdin line-by-line and return lines matching `pattern`. Prefer this over `read` when the question is 'find lines that mention X' \u2014 it filters server-side so you don't pull and decode 64 KiB base64 windows. Returns `{matches: [{cursor, line, before?, after?}], truncated, nextCursor, gap?, scannedBytes, eof?}`. Lines come back as decoded UTF-8 strings (not base64). When `truncated:true`, re-call with `cursor: nextCursor` to resume.",inputSchema:{pattern:ut.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:ut.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:ut.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:ut.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:ut.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:ut.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:ut.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:ut.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:ut.number().int().min(0).optional().describe("Optional absolute byte offset to start scanning from. Omit to scan from the oldest still-resident byte. Pass the `nextCursor` from a previous truncated call to resume.")}},async n=>{let s={pattern:n.pattern};n.regex!==void 0&&(s.regex=n.regex),n.case_insensitive!==void 0&&(s.caseInsensitive=n.case_insensitive),n.invert!==void 0&&(s.invert=n.invert),n.max_matches!==void 0&&(s.maxMatches=n.max_matches),n.max_bytes!==void 0&&(s.maxBytes=n.max_bytes),n.context_before!==void 0&&(s.contextBefore=n.context_before),n.context_after!==void 0&&(s.contextAfter=n.context_after),n.cursor!==void 0&&(s.cursor=n.cursor);let r=t.streamGrep(s),i=r;return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:i}}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let n=t.streamInfo();return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}),e}var ZI=1e4;function sh(t,e){let n=new Map;async function s(o,a){let d=n.get(o);if(d!==void 0)return d.transport;let c=XI(a),l=new QI({sessionIdGenerator:()=>YI()});await c.connect(l);let f={server:c,transport:l};return n.set(o,f),e.addDisposer(o,async()=>{n.delete(o);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function r(o,a){let d=Fa(o);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown stdin token"});return}let l;if(c.session!==void 0)l=c.session;else{let u,p=new Promise(g=>{u=setTimeout(()=>g(void 0),ZI)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(u!==void 0&&clearTimeout(u),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let f=await s(d,l);a.hijack(),await f.handleRequest(o.raw,a.raw,o.body)}let i={config:{skipAuth:!0}};t.post("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.get("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.delete("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)})}var La=class{byName=new Map;changeHandlers=[];register(e,n,s,r){this.byName.set(e,{connection:n,instructions:s,tools:[...r]}),this.fireChanged(e,"register")}clear(e){this.byName.delete(e)&&this.fireChanged(e,"clear")}lookup(e){return this.byName.get(e)}list(){return Array.from(this.byName.keys())}onChange(e){return this.changeHandlers.push(e),()=>{let n=this.changeHandlers.indexOf(e);n>=0&&this.changeHandlers.splice(n,1)}}fireChanged(e,n){for(let s of this.changeHandlers)try{s(e,n)}catch{}}};import{StreamableHTTPServerTransport as oS}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as aS}from"crypto";import{Server as eS}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as tS,ListToolsRequestSchema as nS}from"@modelcontextprotocol/sdk/types.js";var sS=6e4;function rh(t,e,n,s={}){let r=s.invokeTimeoutMs??sS,i=typeof n=="function"?async()=>n():async()=>n,o=new eS({name:t,version:"1.0.0"},{capabilities:{tools:{listChanged:!1}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),a=new Map(e.tools.map(d=>[d.name,d]));return o.setRequestHandler(nS,async()=>({tools:e.tools.map(d=>({name:d.name,description:d.description,inputSchema:d.inputSchema,...d.outputSchema!==void 0?{outputSchema:d.outputSchema}:{}}))})),o.setRequestHandler(tS,async d=>{let c=d.params.name;if(!a.has(c))return Ba(`unknown tool: ${c}`);try{let l=await i(),f=await rS(e.connection,t,c,d.params.arguments??{},l,r);return iS(f,c)}catch(l){return Ba(l instanceof Error?l.message:String(l))}}),o}async function rS(t,e,n,s,r,i){let o,a=new Promise((d,c)=>{o=setTimeout(()=>c(new Error(`extension timeout after ${i}ms`)),i)});try{return await Promise.race([t.request("hydra-acp/mcp_tools/invoke",{server:e,tool:n,args:s,sessionId:r}),a])}finally{o!==void 0&&clearTimeout(o)}}function iS(t,e){if(t===null||typeof t!="object")return Ba(`extension ${e} returned non-object`);let n=t;return Array.isArray(n.content)?n:Ba(`extension ${e} omitted content array`)}function Ba(t){return{content:[{type:"text",text:t}],isError:!0}}var dS=1e4;function ih(t,e,n,s={}){let r=new Map;async function i(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let f of r.values()){let u=f.get(l);u!==void 0&&(f.delete(l),i(u))}}n.onChange(l=>{o(l)});async function a(l,f){let u=r.get(l);u===void 0&&(u=new Map,r.set(l,u),e.addDisposer(l,async()=>{let b=r.get(l);if(b!==void 0){r.delete(l);for(let k of b.values())await i(k)}}));let p=u.get(f);if(p!==void 0)return p.transport;let m=n.lookup(f);if(m===void 0)return;let y=rh(f,m,async()=>{let b=e.lookup(l);if(b===void 0)throw new Error("mcp token no longer bound");if(b.session!==void 0)return b.session.sessionId;let k,R=new Promise(z=>{k=setTimeout(()=>z(void 0),dS)}),H=await Promise.race([b.sessionReady.catch(()=>{}),R]);if(k!==void 0&&clearTimeout(k),H===void 0)throw new Error("session not ready");return H.sessionId},s.buildOptions),v=new oS({sessionIdGenerator:()=>aS()});return await y.connect(v),u.set(f,{server:y,transport:v}),v}async function d(l,f){let u=Fa(l);if(u===void 0){f.code(401).send({error:"missing bearer token"});return}if(e.lookup(u)===void 0){f.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,g=await a(u,m);if(g===void 0){f.code(404).send({error:`unknown mcp server: ${m}`});return}f.hijack(),await g.handleRequest(l.raw,f.raw,l.body)}let c={config:{skipAuth:!0}};t.post("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.get("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.delete("/mcp/:name",c,async(l,f)=>{await d(l,f)})}async function dh(t,e){pS(t);let n=t.daemon.tls?{key:await us.readFile(t.daemon.tls.key),cert:await us.readFile(t.daemon.tls.cert)}:void 0;await us.mkdir(M.home(),{recursive:!0});let{stream:s,fileStream:r}=await fS(t.daemon.logLevel),i=cS({logger:{level:t.daemon.logLevel,stream:s},https:n??null,bodyLimit:256*1024*1024});await i.register(lS,{options:{handleProtocols:Bu}}),Zd(j=>{i.log.info(j)}),nc(j=>{i.log.info(j)});let o=await ba.load(),a=new xa,d=new ka,c=new Sa([new va(e),new Ia(o),d]),l=Sp({validator:c});i.addHook("onRequest",async(j,ue)=>{j.routeOptions.config?.skipAuth||j.url==="/acp"||j.url?.startsWith("/acp?")||await l(j,ue)});let f=setInterval(()=>{o.sweepExpired()},300*1e3);f.unref();let u=setInterval(()=>{a.sweepExpired()},300*1e3);u.unref();let p=new qo(t,{onFetched:()=>{pp(p,v)}});Lc(j=>i.log.info(j));let m={info:j=>i.log.info(j),warn:j=>i.log.warn(j)},g=j=>os.spawn({...j,stderrTailBytes:t.daemon.agentStderrTailBytes,logger:m});Uu(t.compressToolContent);let y=new ya,v=new ua(p,g,void 0,{idleTimeoutMs:t.daemon.sessionIdleTimeoutSeconds*1e3,defaultModels:t.defaultModels,synopsisAgent:t.synopsisAgent,synopsisModel:t.synopsisModel,synopsisOnClose:t.synopsisOnClose,defaultTransformers:t.defaultTransformers,sessionHistoryMaxEntries:t.daemon.sessionHistoryMaxEntries,logger:m,npmRegistry:t.npmRegistry,extensionCommands:y,defaultCwd:t.defaultCwd}),b=new ma(bu(t),void 0,{tokenRegistry:d}),k=new ga(vu(t),void 0,{tokenRegistry:d});Up(i,fe,ds(t));let R=new Oa,H=new La,z,K=()=>{if(z!==void 0)return z;let j=i.server.address(),ue=j&&typeof j=="object"?j.port:t.daemon.port;return z=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${ue}`,z};Dp(i,v,{agentId:t.defaultAgent,cwd:t.defaultCwd,publicHost:t.daemon.publicHost,host:t.daemon.host,port:t.daemon.port},{extensionMcp:H,mcpTokenRegistry:R,getDaemonOrigin:K}),Hp(i,p,v,{npmRegistry:t.npmRegistry}),jp(i,b),qp(i,k),Wp(i,{defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,defaultModels:{...t.defaultModels},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},synopsisOnClose:t.synopsisOnClose,defaultTransformers:[...t.defaultTransformers]}),Xp(i,{store:o,rateLimiter:a}),sh(i,R),ih(i,R,H),th(i,{validator:c,manager:v,defaultAgent:t.defaultAgent,processRegistry:d,onExtensionVersion:(j,ue)=>b.reportVersion(j,ue),onTransformerVersion:(j,ue)=>k.reportVersion(j,ue),transformers:k,extensionCommands:y,mcpTokenRegistry:R,extensionMcp:H,getDaemonOrigin:K,registry:p}),await i.listen({host:t.daemon.host,port:t.daemon.port});let J=i.server.address(),W=J&&typeof J=="object"?J.port:t.daemon.port;await us.mkdir(M.home(),{recursive:!0}),await us.writeFile(M.pidFile(),JSON.stringify({pid:process.pid,host:t.daemon.host,port:W,startedAt:new Date().toISOString()})+`
229
- `,{encoding:"utf8",mode:384});let F=t.daemon.tls?"https":"http",U=t.daemon.tls?"wss":"ws",Y={daemonUrl:`${F}://${t.daemon.host}:${W}`,daemonHost:t.daemon.host,daemonPort:W,serviceToken:e,daemonWsUrl:`${U}://${t.daemon.host}:${W}/acp`,hydraHome:M.home()};b.setContext(Y),k.setContext(Y),await b.start(),await k.start(),v.resurrectPendingQueues().catch(j=>{i.log.warn(`queue replay scan failed: ${j.message}`)});let te=t.daemon.agentSyncIntervalMinutes*60*1e3,Z=te>0?hp({registry:p,manager:v,intervalMs:te,logger:m}):void 0,ee=t.daemon.sessionGcIntervalMinutes*60*1e3,Q=t.daemon.sessionGcMaxAgeDays*24*60*60*1e3,oe=ee>0?mp({manager:v,intervalMs:ee,maxAgeMs:Q,logger:m}):void 0;return{app:i,manager:v,registry:p,extensions:b,transformers:k,mcpTokenRegistry:R,extensionMcp:H,processRegistry:d,shutdown:async()=>{oe&&oe(),Z&&Z(),clearInterval(f),clearInterval(u);let j=async(ue,_e)=>{try{await _e()}catch($e){i.log.warn(`shutdown step ${ue} failed: ${$e instanceof Error?$e.message:String($e)}`)}};await j("sessionTokenStore.flush",()=>o.flush()),await j("extensions.stop",()=>b.stop()),await j("transformers.stop",()=>k.stop()),await j("manager.closeAll",()=>v.closeAll()),await j("manager.flushSynopsis",()=>v.flushSynopsis(3e4)),await j("manager.shutdownSynopsis",()=>v.shutdownSynopsis()),await j("manager.flushMetaWrites",()=>v.flushMetaWrites()),await j("manager.flushHistoryWrites",()=>v.flushHistoryWrites()),Zd(null),nc(null),Lc(null),await j("app.close",()=>i.close());try{ah.unlinkSync(M.pidFile())}catch{}await j("fileStream.flushSync",()=>r.flushSync())}}}async function fS(t){let e=await uS({file:M.logFile(),size:"10m",frequency:"daily",mkdir:!0,symlink:!0}),n=oh.destination(2);return{stream:oh.multistream([{stream:e,level:t},{stream:n,level:t}]),fileStream:e}}function pS(t){let e=t.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!t.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}Ys();_t();Vi();import*as ch from"fs";import*as Wr from"fs/promises";async function Jr(t,e,n){let s=wS(e),r;try{r=await Wr.stat(t)}catch(d){if(d.code==="ENOENT"){process.stderr.write(`${n} (${t})
228
+ `;await ls.mkdir(M.home(),{recursive:!0}),await ls.writeFile(Uc(),s,{encoding:"utf8",mode:384})}async function Ma(){try{return(await ls.readFile(Uc(),"utf8")).trim().length>0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function _a(t){if(typeof t!="string"||t.length===0)return!1;let e;try{e=(await ls.readFile(Uc(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let n=e.split("$");if(n.length!==6||n[0]!=="scrypt")return!1;let s=parseInt(n[1],10),r=parseInt(n[2],10),i=parseInt(n[3],10);if(!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i))return!1;let o=Buffer.from(n[4],"hex"),a=Buffer.from(n[5],"hex");if(o.length===0||a.length===0)return!1;let d=await Yp(t,o,a.length,{N:s,r,p:i,maxmem:Gp});return d.length!==a.length?!1:PI(d,a)}var OI=jr.object({password:jr.string().min(1),label:jr.string().min(1).max(256).optional(),ttlSec:jr.number().int().positive().optional()}),FI=jr.object({id:jr.string().optional()}).optional();function Xp(t,e){t.post("/v1/auth/login",{config:{skipAuth:!0}},async(n,s)=>{let r=LI(n);if(e.rateLimiter.isBlocked(r))return s.code(429).send({error:"Too many failed attempts; try again later."});let i;try{i=OI.parse(n.body)}catch{return s.code(400).send({error:"Invalid request body"})}if(!await Ma())return s.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await _a(i.password))return e.rateLimiter.recordFailure(r),s.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(r);let a=await e.store.issue({label:i.label,ttlSec:i.ttlSec});return s.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),t.post("/v1/auth/logout",async(n,s)=>{let r;try{r=FI.parse(n.body??void 0)}catch{return s.code(400).send({error:"Invalid request body"})}let i=r?.id??n.authIdentity;if(!i||i==="service")return s.code(200).send({revoked:!1});let o=await e.store.revoke(i);return s.code(200).send({revoked:o})}),t.get("/v1/auth/verify",async(n,s)=>s.code(200).send({ok:!0})),t.get("/v1/auth/sessions",async(n,s)=>s.code(200).send({sessions:e.store.list()})),t.delete("/v1/auth/sessions/:id",async(n,s)=>{let r=n.params.id;return await e.store.revoke(r)?s.code(204).send():s.code(404).send({error:"Not found"})})}function LI(t){return t.ip||"unknown"}Us();qr();import{nanoid as zc}from"nanoid";ea();yt();_t();import{randomBytes as UI}from"crypto";import*as eh from"os";function we(t,e,n){let s=new Error(e);return s.code=t,n!==void 0&&(s.data=n),s}function jI(t){if(!t||typeof t!="object")return 512;let s=t.params?.update;if(!s)return 512;let r=512,i=s.content;if(typeof i=="string")r+=i.length;else if(i&&typeof i=="object"){let a=i;typeof a.text=="string"&&(r+=a.text.length),typeof a.data=="string"&&(r+=a.data.length)}let o=s.toolCall;if(o&&(typeof o.rawInput=="string"?r+=o.rawInput.length:o.rawInput&&typeof o.rawInput=="object"&&(r+=256),typeof o.rawOutput=="string"?r+=o.rawOutput.length:o.rawOutput&&typeof o.rawOutput=="object"&&(r+=256),Array.isArray(o.content)))for(let a of o.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(r+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(r+=c.text.length)}}return r}function Qt(t,e,n){let s=t.get(e);if(!s)throw we(D.SessionNotFound,n??`session ${e} not found`);return s}async function jc(t,e){let n=Qi(t),s;try{s=await t.manager.resurrect({...e,mcpServers:n?.descriptors})}catch(r){throw n!==void 0&&n.abandon(r instanceof Error?r:void 0),r}return n!==void 0&&n.bindToSession(s),VI(s,t),s}function th(t,e){t.get("/acp",{websocket:!0},async(n,s)=>{let r=kp({headers:s.headers,url:s.url});if(!r||!await e.validator.validate(r)){n.close(4401,"Unauthorized");return}let i=e.processRegistry?.resolve(r),o=wn(n),a=new kt(o),d={clientId:`hydra_client_${zc(12)}`,processIdentity:i,attached:new Map};a.onClose(()=>{for(let f of d.attached.values())e.manager.get(f.sessionId)?.detach(f.clientId);d.attached.clear()});let c=(f,u)=>{if(d.attached.get(f)?.readonly)throw we(D.PermissionDenied,`${u} not permitted on a read-only attachment`)};if(a.onRequest("initialize",async f=>{let u=nf.parse(f??{});u.clientInfo?.name&&(d.clientInfo={name:u.clientInfo.name,...u.clientInfo.version!==void 0?{version:u.clientInfo.version}:{}});let p=u.clientInfo?.version;return p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p)),KI()}),i&&e.extensionCommands){let f=e.extensionCommands;a.onRequest("hydra-acp/commands/register",async u=>{let p=u??{},m=Array.isArray(p.commands)?p.commands.map(g=>{if(!g||typeof g!="object")return;let y=g;if(typeof y.verb!="string")return;let v={verb:y.verb};return typeof y.argsHint=="string"&&(v.argsHint=y.argsHint),typeof y.description=="string"&&(v.description=y.description),v}).filter(g=>g!==void 0):[];return f.register(i.name,a,m),{ok:!0,registered:m.length}}),a.onClose(()=>{f.clear(i.name)})}if(i&&e.extensionMcp){let f=e.extensionMcp;a.onRequest("hydra-acp/mcp_tools/register",async u=>{let p=u??{},m=typeof p.instructions=="string"?p.instructions:void 0,g=Array.isArray(p.tools)?p.tools.map(y=>{if(!y||typeof y!="object")return;let v=y;if(typeof v.name!="string"||v.name.length===0||typeof v.description!="string"||v.inputSchema===null||typeof v.inputSchema!="object")return;let b={name:v.name,description:v.description,inputSchema:v.inputSchema};return v.outputSchema!==null&&typeof v.outputSchema=="object"&&(b.outputSchema=v.outputSchema),b}).filter(y=>y!==void 0):[];if(g.length===0)throw new Error("register_mcp_tools requires at least one tool");return f.register(i.name,a,m,g),{ok:!0,registered:g.length}}),a.onClose(()=>{f.clear(i.name)})}i?.kind==="transformer"&&(a.onRequest("hydra-acp/transformer/initialize",async f=>{let u=f??{},p=Array.isArray(u.intercepts)?u.intercepts.filter(m=>typeof m=="string"):[];if(e.transformers&&(e.transformers.registerConnection(i.name,a,p),e.manager?.defaultTransformers.includes(i.name))){let m=e.transformers.resolveChain([i.name])[0];if(m)for(let g of e.manager.liveSessions())g.addTransformer(m)}return{ack:!0}}),a.onClose(()=>{e.transformers?.deregisterConnection(i.name)}),a.onRequest("hydra-acp/message/emit",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0,m=typeof u.method=="string"?u.method:void 0,g=u.envelope,y=u.route;if(!p||!m)throw we(-32602,"emit_message requires sessionId and method");let v=Qt(e.manager,p),b=typeof u.respondsTo=="string"?u.respondsTo:void 0;if(b)return v.dischargeClaim(b,g),{ok:!0};if(y==="chain")return{ok:!0,response:await v.emitToChain(i.name,m,g)};if(y==="daemon")return{ok:!0,response:await v.emitToChain(i.name,m,g)};throw we(-32602,`unsupported route: ${JSON.stringify(y)}`)}),a.onRequest("hydra-acp/session/request_permission",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(-32602,"hydra-acp/session/request_permission requires sessionId");return Qt(e.manager,p).requestPermissionFromClients(u)}),a.onRequest("hydra-acp/transformer/attach",async f=>JI(f,i.name,e)),a.onRequest("hydra-acp/child_session/spawn",async f=>{let u=f??{},p=typeof u.agentId=="string"?u.agentId:e.defaultAgent,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.parentSessionId=="string"?u.parentSessionId:void 0,y=u._meta&&typeof u._meta=="object"?u._meta:void 0,v=y&&y["hydra-acp"]&&typeof y["hydra-acp"]=="object"?y["hydra-acp"]:void 0,b=v&&typeof v.title=="string"?v.title:void 0,k=v&&typeof v.model=="string"?v.model:void 0;if(!m&&g){let z=e.manager.get(g);z&&(m=z.cwd)}if(!m)throw we(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let R=typeof u.interactive=="boolean"?u.interactive:!1;return{childSessionId:(await e.manager.create({agentId:p,cwd:m,parentSessionId:g,interactive:R,transformChain:[],title:b,model:k})).sessionId}}),a.onRequest("hydra-acp/session/fork",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"fork_session requires sessionId");let p=typeof u.forkAt=="string"?u.forkAt:void 0,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.agentId=="string"?u.agentId:void 0;return await e.manager.forkSession(u.sessionId,{...p!==void 0?{forkAt:p}:{},...m!==void 0?{cwd:m}:{},...g!==void 0?{agentId:g}:{}})}),a.onRequest("hydra-acp/session/delete",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"hydra-acp/session/delete requires sessionId");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=e.manager.get(p);if(m)return await m.close({deleteRecord:!0}),{deleted:!0,sessionId:p};if(!await e.manager.deleteRecord(p))throw we(D.SessionNotFound,`session ${p} not found`);return{deleted:!0,sessionId:p}}),a.onRequest("hydra-acp/child_session/await",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0,m=u.until==="idle"?"idle":"turn_complete",g=typeof u.timeoutMs=="number"?Math.min(u.timeoutMs,18e5):3e5;if(!p)throw we(-32602,"await_child requires childSessionId");let y=Qt(e.manager,p,`child session ${p} not found`);return new Promise(v=>{let R=[],H=[],z=0,K=!1,J,W,F=!1,U=()=>{F||(F=!0,clearTimeout(Y),J?.(),W?.(),v(K?{entries:R,truncated:!0}:{entries:R}))};J=y.onBroadcast(te=>{let Z=jI(te);for(R.push(te),H.push(Z),z+=Z;R.length>0&&(R.length>1e3||z>1048576);)R.shift(),z-=H.shift()??0,K=!0;m==="turn_complete"&&te.params?.update?.sessionUpdate==="turn_complete"&&U()});let Y=setTimeout(U,g);typeof Y.unref=="function"&&Y.unref(),W=y.onClose(()=>U())})}),a.onRequest("hydra-acp/child_session/close",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0;if(!p)throw we(-32602,"close_child_session requires childSessionId");let m=e.manager.get(p);return m&&await m.close({deleteRecord:!1}),{ok:!0}}),a.onRequest("hydra-acp/connection/keep_alive",async f=>{let u=f??{},p=typeof u.token=="string"?u.token:void 0,m=typeof u.sessionId=="string"?u.sessionId:void 0,g=typeof u.estimatedRemainingMs=="number"?u.estimatedRemainingMs:void 0;return p&&m&&e.manager.get(m)?.keepAliveClaim(p,g),{ok:!0}})),a.onRequest("hydra-acp/session/tool_content",async f=>{let u=f??{};if(typeof u.sessionId!="string"||typeof u.hash!="string")throw we(D.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=await e.manager.loadToolBlob(p,u.hash);if(m===null)throw we(D.SessionNotFound,"tool content not found");return{content:m}}),a.onRequest("authenticate",async f=>qI(f,e)),a.onRequest("session/new",async f=>{let u=sf.parse(f),p=Mt(f?._meta),m=Array.isArray(p.transformers)&&p.transformers.every(W=>typeof W=="string")?p.transformers:e.manager.defaultTransformers??[],g=e.transformers?.resolveChain(m)??[],y,v,b=u.mcpServers;if(p.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){y=UI(32).toString("hex"),v=e.mcpTokenRegistry.reserve(y);let F={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${y}`}]};b=[...u.mcpServers??[],F]}let k=Qi(e);k!==void 0&&(b=[...b??[],...k.descriptors]);let R;try{R=await e.manager.create({cwd:u.cwd,agentId:p.agentId??e.defaultAgent,mcpServers:b,title:p.title,agentArgs:p.agentArgs,model:p.model,onInstallProgress:Zp(a),transformChain:g,originatingClient:d.clientInfo,...p.interactive!==void 0?{interactive:p.interactive}:{},...p.env!==void 0?{forwardedEnv:p.env}:{}})}catch(W){throw v!==void 0&&v.abandon(W instanceof Error?W:void 0),k!==void 0&&k.abandon(W instanceof Error?W:void 0),W}if(y!==void 0&&v!==void 0&&e.mcpTokenRegistry!==void 0){let W=y,F=e.mcpTokenRegistry;v.complete(R),R.onClose(()=>{F.unbind(W)})}k!==void 0&&k.bindToSession(R);let H,z;try{H=$a(a,R,d),{entries:z}=await R.attach(H,"full")}catch(W){throw await R.close({deleteRecord:!1}).catch(()=>{}),W}d.attached.set(R.sessionId,{sessionId:R.sessionId,clientId:H.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let W of z){if(a.isClosed())break;await a.notify(W.method,W.params).catch(()=>{})}})()});let K=qc(R),J=Wc(R);return{sessionId:R.sessionId,...K?{modes:K}:{},...J?{models:J}:{},configOptions:R.buildConfigOptions(),_meta:Jc(e.manager,R,{clientId:H.clientId})}}),a.onRequest("session/attach",async f=>{let u=of.parse(f),p=u.clientInfo?.version;p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p));let m=Mt(u._meta),g=m.resume,y=m.readonly===!0,v=m.env;t.log.info(`session/attach sessionId=${u.sessionId} hasResumeHints=${!!g} readonly=${y}`);let b=g?u.sessionId:await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,k=e.manager.get(b);if(!k&&y){let F=await e.manager.loadFromDisk(b);if(!F)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);let U=await e.manager.loadHistory(b),Y=u.clientId??`cli_${zc(8)}`;d.attached.set(F.hydraSessionId,{sessionId:F.hydraSessionId,clientId:Y,readonly:!0}),t.log.info(`session/attach OK (viewer) sessionId=${F.hydraSessionId} clientId=${Y} attachedCount=${d.attached.size} replayed=${U.length}`);for(let te of U)await a.notify(te.method,te.params).catch(()=>{});return{sessionId:F.hydraSessionId,clientId:Y,connectedClients:[Y],historyPolicy:"full",replayed:U.length,_meta:zI(F)}}if(!k){let F=await e.manager.loadFromDisk(b),U=F;if(g&&(U={...F,hydraSessionId:u.sessionId,upstreamSessionId:g.upstreamSessionId,agentId:g.agentId,cwd:g.cwd,...g.title!==void 0?{title:g.title}:{},...g.agentArgs!==void 0?{agentArgs:g.agentArgs}:{}}),!U)throw we(D.SessionNotFound,`session ${u.sessionId} not found and no resume hints provided`);let Y=U.originatingClient?U:{...U,originatingClient:d.clientInfo},te=v!==void 0?{...Y,forwardedEnv:v}:Y;k=await jc(e,{...te,onInstallProgress:Zp(a)})}let R=$a(a,k,d,u.clientInfo,u.clientId),H=m.replayMode==="drip",{entries:z,appliedPolicy:K}=await k.attach(R,u.historyPolicy,{afterMessageId:u.afterMessageId,raw:H,...m.toolContent!==void 0?{toolContent:m.toolContent}:{}});if(d.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:R.clientId,readonly:y}),v!==void 0&&await e.manager.setForwardedEnv(k.sessionId,v).catch(()=>{}),t.log.info(`session/attach OK sessionId=${k.sessionId} clientId=${R.clientId} attachedCount=${d.attached.size} requestedPolicy=${u.historyPolicy} appliedPolicy=${K} replayed=${z.length} readonly=${y}${H?" replayMode=drip":""}`),H){let F=m.dripSpeed&&m.dripSpeed>0?m.dripSpeed:1,U=750;(async()=>{let Y=null;for(let te of z){let Z=typeof te.recordedAt=="number"?te.recordedAt:null;if(Y!==null&&Z!==null){let ee=Math.min(U,Math.max(0,(Z-Y)/F));ee>0&&await new Promise(Q=>setTimeout(Q,ee))}Z!==null&&(Y=Z);try{await a.notify(te.method,te.params)}catch{return}}})()}else for(let F=0;F<z.length&&!a.isClosed();F++){let U=z[F],Y=a.notify(U.method,U.params).catch(()=>{});(F+1)%200===0&&await Y}k.replayPendingPermissions(R);let J=qc(k),W=Wc(k);return{sessionId:k.sessionId,clientId:R.clientId,connectedClients:k.connectedClients(R.clientId),historyPolicy:K,replayed:z.length,...J?{modes:J}:{},...W?{models:W}:{},configOptions:k.buildConfigOptions(),_meta:Jc(e.manager,k)}}),a.onRequest("session/detach",async f=>{let u=af.parse(f),p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"client not attached to that session");let m=e.manager.get(u.sessionId);return m?.detach(p.clientId),d.attached.delete(u.sessionId),m&&e.manager.reapIfOrphanedNonInteractive(u.sessionId),{sessionId:u.sessionId,_meta:{[lt]:{detachStatus:"detached"}}}}),a.onRequest("session/list",async f=>{let u=df.parse(f??{});return{sessions:(await e.manager.list({cwd:u.cwd})).filter(y=>y.originatingClient?.name!==js).map(cf)}}),a.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw we(D.InternalError,"agent registry unavailable");return Er(e.registry)}),a.onRequest("session/prompt",async f=>{let u=lf.parse(f);c(u.sessionId,"session/prompt");let p=d.attached.get(u.sessionId);if(!p)throw t.log.warn(`session/prompt rejected: not attached sessionId=${u.sessionId} attachedKeys=[${[...d.attached.keys()].join(",")}]`),we(D.SessionNotFound,"not attached to session");let m=e.manager.get(u.sessionId);if(!m){let g=await e.manager.loadFromDisk(u.sessionId);if(!g)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);t.log.info(`session/prompt auto-resurrecting cold sessionId=${u.sessionId}`),m=await jc(e,g);let y=$a(a,m,d,void 0,p.clientId);await m.attach(y,"none")}return m.prompt(p.clientId,u)});let l=f=>{let u;try{u=Vo.parse(f)}catch(g){t.log.warn(`session/cancel: invalid params: ${g.message}`);return}let p=d.attached.get(u.sessionId);if(!p)return;if(p.readonly){t.log.warn(`session/cancel dropped (readonly attachment) sessionId=${u.sessionId}`);return}let m=e.manager.get(u.sessionId);m&&m.cancel(p.clientId).catch(g=>{t.log.warn(`session/cancel for ${u.sessionId}: ${g.message}`)})};a.onNotification("session/cancel",l),a.onRequest("session/cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"session/cancel"),l(f),null}),a.onRequest("hydra-acp/prompt/cancel",async f=>{let u=ff.parse(f);return c(u.sessionId,"hydra-acp/prompt/cancel"),Qt(e.manager,u.sessionId).cancelQueuedPrompt(u.messageId)}),a.onRequest("hydra-acp/session/force_cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"hydra-acp/session/force_cancel"),Qt(e.manager,u.sessionId).forceCancel()}),a.onRequest("hydra-acp/prompt/update",async f=>{let u=pf.parse(f);return c(u.sessionId,"hydra-acp/prompt/update"),Qt(e.manager,u.sessionId).updateQueuedPrompt(u.messageId,u.prompt)}),a.onRequest("hydra-acp/prompt/amend",async f=>{let u=hf.parse(f);c(u.sessionId,"hydra-acp/prompt/amend");let p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"not attached to session");return Qt(e.manager,u.sessionId).amendPrompt(p.clientId,u)}),a.onRequest("session/load",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(D.InvalidParams,"session/load requires sessionId");let m=await e.manager.resolveCanonicalId(p)??p,g=e.manager.get(m);if(!g){let R=await e.manager.loadFromDisk(m);if(!R)throw we(D.SessionNotFound,`session ${p} not found in memory or on disk`);g=await jc(e,R)}let y=$a(a,g,d),{entries:v}=await g.attach(y,"pending_only");d.attached.set(g.sessionId,{sessionId:g.sessionId,clientId:y.clientId,readonly:!1});for(let R of v){if(a.isClosed())break;await a.notify(R.method,R.params).catch(()=>{})}g.replayPendingPermissions(y);let b=qc(g),k=Wc(g);return{sessionId:g.sessionId,...b?{modes:b}:{},...k?{models:k}:{},configOptions:g.buildConfigOptions(),_meta:Jc(e.manager,g,{clientId:y.clientId})}}),a.onRequest("session/set_model",async f=>{let u=f?.sessionId;typeof u=="string"&&c(u,"session/set_model");let p=WI(f,e.manager);if(p.kind==="error")throw t.log.warn(p.logMessage),we(p.code,p.message);if(p.kind==="no_op")return t.log.warn(p.logMessage),await a.notify("session/update",{sessionId:p.sessionId,update:{sessionUpdate:"current_model_update",currentModel:p.currentModel}}).catch(()=>{}),null;t.log.info(p.logMessage);let{modelId:m}=p,g=await p.session.forwardRequest("session/set_model",{...f,modelId:m});return p.session.applyModelChange(m),g}),a.onRequest("session/set_mode",async f=>{let u=f,p=u?.sessionId;if(typeof p=="string"&&c(p,"session/set_mode"),!u||typeof u.sessionId!="string")throw we(D.InvalidParams,"session/set_mode requires string sessionId");if(typeof u.modeId!="string")throw we(D.InvalidParams,"session/set_mode requires string modeId");let m=Qt(e.manager,u.sessionId),g=await m.forwardRequest("session/set_mode",f);return m.applyModeChange(u.modeId),g}),a.onRequest("session/set_config_option",async f=>{let u=f,p=v=>we(D.InvalidParams,v),m=u?.sessionId;if(typeof m=="string"&&c(m,"session/set_config_option"),!u||typeof u.sessionId!="string")throw p("session/set_config_option requires string sessionId");if(typeof u.configId!="string")throw p("session/set_config_option requires string configId");if(typeof u.value!="string")throw p("session/set_config_option requires string value");let g=Qt(e.manager,u.sessionId),y=g.buildConfigOptions().find(v=>v.id===u.configId);if(!y)throw p(`unknown configId ${JSON.stringify(u.configId)} for this session`);if(!y.options.some(v=>v.value===u.value))throw p(`value ${JSON.stringify(u.value)} is not valid for configId ${JSON.stringify(u.configId)}`);switch(u.configId){case"model":{u.value!==g.currentModel&&await g.forwardRequest("session/set_model",{sessionId:u.sessionId,modelId:u.value}),g.applyModelChange(u.value);break}case"mode":{u.value!==g.currentMode&&await g.forwardRequest("session/set_mode",{sessionId:u.sessionId,modeId:u.value}),g.applyModeChange(u.value);break}case"agent":{u.value!==g.agentId&&await g.setAgent(u.value);break}default:throw p(`configId ${JSON.stringify(u.configId)} is not settable`)}return{configOptions:g.buildConfigOptions()}}),a.setDefaultHandler(async(f,u)=>{if(!u.startsWith("session/")||f===null||typeof f!="object")throw we(D.MethodNotFound,`Method not found: ${u}`);let p=f.sessionId;if(typeof p!="string")throw we(D.MethodNotFound,`Method not found: ${u}`);return c(p,u),Qt(e.manager,p).forwardRequest(u,f)})})}async function qI(t,e){let n=t??{};if(typeof n.methodId!="string"||n.methodId.length===0)throw we(D.InvalidParams,"authenticate requires a non-empty methodId string");let s=n.methodId,r=n._meta?.["hydra-acp"],i=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,a=i!==void 0?e.manager.getAgentForSession(i):void 0;if(!a||!a.isAlive()){let u=o??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(u)}let d=a.authMethods??[],c=d.find(u=>u.id===s);if(!c){let u=d.map(p=>p.id);throw we(D.InvalidParams,`authenticate: methodId ${JSON.stringify(s)} is not advertised by agent ${a.agentId}; valid: [${u.map(p=>JSON.stringify(p)).join(", ")}]`)}let l=c._meta?.type;if((c.type??(l==="agent"||l==="terminal"?l:"agent"))==="terminal"){let u=c._meta?.args,p=[];if(u!==void 0){if(!Array.isArray(u))throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be a string[]; got ${u===null?"null":typeof u}`);for(let v of u)if(typeof v!="string")throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be string[]; got non-string entry ${JSON.stringify(v)}`);p=u}let m=await e.manager.planSpawnForAgent(a.agentId),g={};for(let[v,b]of Object.entries(process.env))typeof b=="string"&&(g[v]=b);Object.assign(g,m.env);let y=eh.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${s}`),{kind:"terminal",command:m.command,args:[...m.args,...p],env:g,cwd:y}}try{return await a.connection.request("authenticate",{methodId:s})}catch(u){throw Js(u,a)}}function Zp(t){return e=>{let n={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(n.receivedBytes=e.receivedBytes),"totalBytes"in e&&(n.totalBytes=e.totalBytes),"packageSpec"in e&&(n.packageSpec=e.packageSpec),t.notify(Yo,n).catch(()=>{})}}function qc(t){let e=t.availableModes();if(e.length===0)return;let n=e.map(r=>{let i={id:r.id,name:r.name??r.id};return r.description!==void 0&&(i.description=r.description),i});return{currentModeId:t.currentMode??e[0].id,availableModes:n}}function Wc(t){let e=t.availableModels();if(e.length===0)return;let n=e.map(r=>{let i={modelId:r.modelId};return r.name!==void 0&&(i.name=r.name),r.description!==void 0&&(i.description=r.description),i});return{currentModelId:t.currentModel??e[0].modelId,availableModels:n}}function WI(t,e){if(!t||typeof t!="object")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let n=t;if(typeof n.sessionId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof n.modelId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${n.sessionId}`};let s=e.get(n.sessionId);if(!s)return{kind:"error",code:D.SessionNotFound,message:`session ${n.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${n.sessionId}`};let r=s.availableModels(),i=Mr(n.modelId,r);if(i.kind==="none")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="exact")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model accepted sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="resolved")return{kind:"ok",session:s,modelId:i.modelId,logMessage:`session/set_model resolved sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} \u2192 ${JSON.stringify(i.modelId)}`};let o=r.map(d=>d.modelId).join(", "),a=i.kind==="ambiguous"?`ambiguous (trailing-segment matches [${i.candidates.join(", ")}])`:"not in availableModels";return s.currentModel!==void 0&&s.currentModel.length>0?{kind:"no_op",session:s,sessionId:n.sessionId,currentModel:s.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} ${a} actual=${JSON.stringify(s.currentModel)} agentId=${s.agentId} known=[${o}]`}:{kind:"error",code:D.InvalidParams,message:`model "${n.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${s.agentId}); known models: ${o}`,logMessage:`session/set_model rejected sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)} ${a} agentId=${s.agentId} known=[${o}] (no current model to fall back to)`}}async function JI(t,e,n){let s=t??{},r=typeof s.sessionId=="string"?s.sessionId:void 0;if(!r)throw we(D.InvalidParams,"transformer/attach requires sessionId");if(!n.transformers)throw we(D.InternalError,"transformer manager not configured");let i=n.transformers.resolveChain([e])[0];if(!i)throw we(D.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return Qt(n.manager,r).addTransformer(i),{ok:!0}}function zI(t){let e={sessionId:t.hydraSessionId,upstreamSessionId:t.upstreamSessionId,cwd:t.cwd,title:t.title,agentId:t.agentId,currentModel:t.currentModel,currentUsage:t.currentUsage,forkedFromSessionId:t.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId,originatingClient:t.originatingClient,interactive:t.interactive,updatedAt:t.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,awaitingInput:!1},n={currentMode:t.currentMode,agentArgs:t.agentArgs,availableCommands:t.agentCommands,availableModes:t.agentModes,availableModels:t.agentModels};return{[lt]:zo(e,n)}}function Jc(t,e,n={}){let s=t.liveListEntry(e),r={clientId:n.clientId,currentMode:e.currentMode,agentArgs:e.agentArgs,availableCommands:e.mergedAvailableCommands(),availableModes:e.availableModes(),availableModels:e.availableModels(),turnStartedAt:e.turnStartedAt,agentCapabilities:e.agentCapabilities,queue:e.queueSnapshot()};return _i(e.agentMeta,zo(s,r))}function KI(){return{protocolVersion:1,agentInfo:{name:"hydra",version:fe},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,sessionCapabilities:{attach:{},list:{}}},authMethods:[{id:"proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:_i(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0}})}}function VI(t,e){if(!(!e.transformers||!e.manager))for(let n of e.manager.defaultTransformers){let s=e.transformers.resolveChain([n])[0];s&&t.addTransformer(s)}}function $a(t,e,n,s,r){return{clientId:r??`cli_${zc(8)}`,connection:t,clientInfo:s}}var Oa=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let n,s,r=new Promise((o,a)=>{n=o,s=a});r.catch(()=>{});let i={session:void 0,sessionReady:r,disposers:[]};return this.byToken.set(e,i),{complete:o=>{i.session=o,n(o)},abandon:o=>{this.byToken.delete(e),s(o??new Error("mcp token reservation abandoned"))}}}bind(e,n){let{complete:s}=this.reserve(e);s(n)}lookup(e){return this.byToken.get(e)}addDisposer(e,n){let s=this.byToken.get(e);s!==void 0&&s.disposers.push(n)}async unbind(e){let n=this.byToken.get(e);if(n!==void 0){this.byToken.delete(e);for(let s of n.disposers)try{await s()}catch{}}}size(){return this.byToken.size}};import{randomUUID as YI}from"crypto";import{McpServer as GI}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as QI}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as ut}from"zod";var nh="Bearer ";function Fa(t){let e=t.headers.authorization;if(typeof e!="string"||!e.startsWith(nh))return;let n=e.slice(nh.length).trim();return n.length>0?n:void 0}function XI(t){let e=new GI({name:"hydra-acp-stdin",version:"1.0.0"},{instructions:"Piped input from `hydra cat --stream` is exposed here as a byte stream. Use `tail` for the latest N bytes (good for finding the end of a log), `head` for the first N bytes (good for headers/preamble), `read` for windowed reads against an absolute byte cursor, `wait_for_more` to block until new bytes arrive past a cursor, and `info` for the current cursors/capacity/closed status. Byte payloads come back base64-encoded."});return e.registerTool("tail",{description:"Return the most recent `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means older bytes existed but have been evicted from the ring.",inputSchema:{bytes:ut.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:n})=>{let s=t.streamTail(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("head",{description:"Return the first `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means the head has already been evicted from the ring and the returned bytes start at the oldest still-resident cursor.",inputSchema:{bytes:ut.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:n})=>{let s=t.streamHead(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("read",{description:"Read up to `max_bytes` bytes starting at absolute byte `cursor`. Returns `{bytes, nextCursor, gap?, eof?}` \u2014 `gap` is the number of bytes silently skipped because the ring had evicted them; `eof:true` means the producer closed and there is nothing left to read.",inputSchema:{cursor:ut.number().int().min(0).describe("Absolute byte offset to start reading from. Use 0 to read from the very beginning (may produce a gap if old bytes have been evicted)."),max_bytes:ut.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:ut.number().int().min(0).optional().describe("If no bytes are available, block up to this many ms for more (capped server-side at 60_000).")}},async({cursor:n,max_bytes:s,wait_ms:r})=>{let i=await t.streamRead(n,s,r);return{content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i}}),e.registerTool("wait_for_more",{description:"Block until bytes are available past `cursor`, the stream closes, or `timeout_ms` elapses. Returns one of {data, eof, timeout} plus the current `writeCursor`. Use this when you've consumed everything up to a cursor and want to wait for more without busy-polling.",inputSchema:{cursor:ut.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:ut.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:n,timeout_ms:s})=>{let r=await t.streamWaitFor(n,s),i=t.streamInfo(),o={outcome:r,writeCursor:i.writeCursor,closed:i.closed};return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o}}),e.registerTool("grep",{description:"Scan piped stdin line-by-line and return lines matching `pattern`. Prefer this over `read` when the question is 'find lines that mention X' \u2014 it filters server-side so you don't pull and decode 64 KiB base64 windows. Returns `{matches: [{cursor, line, before?, after?}], truncated, nextCursor, gap?, scannedBytes, eof?}`. Lines come back as decoded UTF-8 strings (not base64). When `truncated:true`, re-call with `cursor: nextCursor` to resume.",inputSchema:{pattern:ut.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:ut.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:ut.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:ut.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:ut.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:ut.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:ut.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:ut.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:ut.number().int().min(0).optional().describe("Optional absolute byte offset to start scanning from. Omit to scan from the oldest still-resident byte. Pass the `nextCursor` from a previous truncated call to resume.")}},async n=>{let s={pattern:n.pattern};n.regex!==void 0&&(s.regex=n.regex),n.case_insensitive!==void 0&&(s.caseInsensitive=n.case_insensitive),n.invert!==void 0&&(s.invert=n.invert),n.max_matches!==void 0&&(s.maxMatches=n.max_matches),n.max_bytes!==void 0&&(s.maxBytes=n.max_bytes),n.context_before!==void 0&&(s.contextBefore=n.context_before),n.context_after!==void 0&&(s.contextAfter=n.context_after),n.cursor!==void 0&&(s.cursor=n.cursor);let r=t.streamGrep(s),i=r;return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:i}}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let n=t.streamInfo();return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}),e}var ZI=1e4;function sh(t,e){let n=new Map;async function s(o,a){let d=n.get(o);if(d!==void 0)return d.transport;let c=XI(a),l=new QI({sessionIdGenerator:()=>YI()});await c.connect(l);let f={server:c,transport:l};return n.set(o,f),e.addDisposer(o,async()=>{n.delete(o);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function r(o,a){let d=Fa(o);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown stdin token"});return}let l;if(c.session!==void 0)l=c.session;else{let u,p=new Promise(g=>{u=setTimeout(()=>g(void 0),ZI)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(u!==void 0&&clearTimeout(u),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let f=await s(d,l);a.hijack(),await f.handleRequest(o.raw,a.raw,o.body)}let i={config:{skipAuth:!0}};t.post("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.get("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.delete("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)})}var La=class{byName=new Map;changeHandlers=[];register(e,n,s,r){this.byName.set(e,{connection:n,instructions:s,tools:[...r]}),this.fireChanged(e,"register")}clear(e){this.byName.delete(e)&&this.fireChanged(e,"clear")}lookup(e){return this.byName.get(e)}list(){return Array.from(this.byName.keys())}onChange(e){return this.changeHandlers.push(e),()=>{let n=this.changeHandlers.indexOf(e);n>=0&&this.changeHandlers.splice(n,1)}}fireChanged(e,n){for(let s of this.changeHandlers)try{s(e,n)}catch{}}};import{StreamableHTTPServerTransport as oS}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as aS}from"crypto";import{Server as eS}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as tS,ListToolsRequestSchema as nS}from"@modelcontextprotocol/sdk/types.js";var sS=6e4;function rh(t,e,n,s={}){let r=s.invokeTimeoutMs??sS,i=typeof n=="function"?async()=>n():async()=>n,o=new eS({name:t,version:"1.0.0"},{capabilities:{tools:{listChanged:!1}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),a=new Map(e.tools.map(d=>[d.name,d]));return o.setRequestHandler(nS,async()=>({tools:e.tools.map(d=>({name:d.name,description:d.description,inputSchema:d.inputSchema,...d.outputSchema!==void 0?{outputSchema:d.outputSchema}:{}}))})),o.setRequestHandler(tS,async d=>{let c=d.params.name;if(!a.has(c))return Ba(`unknown tool: ${c}`);try{let l=await i(),f=await rS(e.connection,t,c,d.params.arguments??{},l,r);return iS(f,c)}catch(l){return Ba(l instanceof Error?l.message:String(l))}}),o}async function rS(t,e,n,s,r,i){let o,a=new Promise((d,c)=>{o=setTimeout(()=>c(new Error(`extension timeout after ${i}ms`)),i)});try{return await Promise.race([t.request("hydra-acp/mcp_tools/invoke",{server:e,tool:n,args:s,sessionId:r}),a])}finally{o!==void 0&&clearTimeout(o)}}function iS(t,e){if(t===null||typeof t!="object")return Ba(`extension ${e} returned non-object`);let n=t;return Array.isArray(n.content)?n:Ba(`extension ${e} omitted content array`)}function Ba(t){return{content:[{type:"text",text:t}],isError:!0}}var dS=1e4;function ih(t,e,n,s={}){let r=new Map;async function i(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let f of r.values()){let u=f.get(l);u!==void 0&&(f.delete(l),i(u))}}n.onChange(l=>{o(l)});async function a(l,f){let u=r.get(l);u===void 0&&(u=new Map,r.set(l,u),e.addDisposer(l,async()=>{let b=r.get(l);if(b!==void 0){r.delete(l);for(let k of b.values())await i(k)}}));let p=u.get(f);if(p!==void 0)return p.transport;let m=n.lookup(f);if(m===void 0)return;let y=rh(f,m,async()=>{let b=e.lookup(l);if(b===void 0)throw new Error("mcp token no longer bound");if(b.session!==void 0)return b.session.sessionId;let k,R=new Promise(z=>{k=setTimeout(()=>z(void 0),dS)}),H=await Promise.race([b.sessionReady.catch(()=>{}),R]);if(k!==void 0&&clearTimeout(k),H===void 0)throw new Error("session not ready");return H.sessionId},s.buildOptions),v=new oS({sessionIdGenerator:()=>aS()});return await y.connect(v),u.set(f,{server:y,transport:v}),v}async function d(l,f){let u=Fa(l);if(u===void 0){f.code(401).send({error:"missing bearer token"});return}if(e.lookup(u)===void 0){f.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,g=await a(u,m);if(g===void 0){f.code(404).send({error:`unknown mcp server: ${m}`});return}f.hijack(),await g.handleRequest(l.raw,f.raw,l.body)}let c={config:{skipAuth:!0}};t.post("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.get("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.delete("/mcp/:name",c,async(l,f)=>{await d(l,f)})}async function dh(t,e){pS(t);let n=t.daemon.tls?{key:await us.readFile(t.daemon.tls.key),cert:await us.readFile(t.daemon.tls.cert)}:void 0;await us.mkdir(M.home(),{recursive:!0});let{stream:s,fileStream:r}=await fS(t.daemon.logLevel),i=cS({logger:{level:t.daemon.logLevel,stream:s},https:n??null,bodyLimit:256*1024*1024});await i.register(lS,{options:{handleProtocols:Bu}}),Zd(j=>{i.log.info(j)}),nc(j=>{i.log.info(j)});let o=await ba.load(),a=new xa,d=new ka,c=new Sa([new va(e),new Ia(o),d]),l=Sp({validator:c});i.addHook("onRequest",async(j,ce)=>{j.routeOptions.config?.skipAuth||j.url==="/acp"||j.url?.startsWith("/acp?")||await l(j,ce)});let f=setInterval(()=>{o.sweepExpired()},300*1e3);f.unref();let u=setInterval(()=>{a.sweepExpired()},300*1e3);u.unref();let p=new qo(t,{onFetched:()=>{pp(p,v)}});Lc(j=>i.log.info(j));let m={info:j=>i.log.info(j),warn:j=>i.log.warn(j)},g=j=>os.spawn({...j,stderrTailBytes:t.daemon.agentStderrTailBytes,logger:m});Uu(t.compressToolContent);let y=new ya,v=new ua(p,g,void 0,{idleTimeoutMs:t.daemon.sessionIdleTimeoutSeconds*1e3,defaultModels:t.defaultModels,synopsisAgent:t.synopsisAgent,synopsisModel:t.synopsisModel,synopsisOnClose:t.synopsisOnClose,defaultTransformers:t.defaultTransformers,sessionHistoryMaxEntries:t.daemon.sessionHistoryMaxEntries,logger:m,npmRegistry:t.npmRegistry,extensionCommands:y,defaultCwd:t.defaultCwd}),b=new ma(bu(t),void 0,{tokenRegistry:d}),k=new ga(vu(t),void 0,{tokenRegistry:d});Up(i,fe,ds(t));let R=new Oa,H=new La,z,K=()=>{if(z!==void 0)return z;let j=i.server.address(),ce=j&&typeof j=="object"?j.port:t.daemon.port;return z=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${ce}`,z};Dp(i,v,{agentId:t.defaultAgent,cwd:t.defaultCwd,publicHost:t.daemon.publicHost,host:t.daemon.host,port:t.daemon.port},{extensionMcp:H,mcpTokenRegistry:R,getDaemonOrigin:K}),Hp(i,p,v,{npmRegistry:t.npmRegistry}),jp(i,b),qp(i,k),Wp(i,{defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,defaultModels:{...t.defaultModels},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},synopsisOnClose:t.synopsisOnClose,defaultTransformers:[...t.defaultTransformers]}),Xp(i,{store:o,rateLimiter:a}),sh(i,R),ih(i,R,H),th(i,{validator:c,manager:v,defaultAgent:t.defaultAgent,processRegistry:d,onExtensionVersion:(j,ce)=>b.reportVersion(j,ce),onTransformerVersion:(j,ce)=>k.reportVersion(j,ce),transformers:k,extensionCommands:y,mcpTokenRegistry:R,extensionMcp:H,getDaemonOrigin:K,registry:p}),await i.listen({host:t.daemon.host,port:t.daemon.port});let J=i.server.address(),W=J&&typeof J=="object"?J.port:t.daemon.port;await us.mkdir(M.home(),{recursive:!0}),await us.writeFile(M.pidFile(),JSON.stringify({pid:process.pid,host:t.daemon.host,port:W,startedAt:new Date().toISOString()})+`
229
+ `,{encoding:"utf8",mode:384});let F=t.daemon.tls?"https":"http",U=t.daemon.tls?"wss":"ws",Y={daemonUrl:`${F}://${t.daemon.host}:${W}`,daemonHost:t.daemon.host,daemonPort:W,serviceToken:e,daemonWsUrl:`${U}://${t.daemon.host}:${W}/acp`,hydraHome:M.home()};b.setContext(Y),k.setContext(Y),await b.start(),await k.start(),v.resurrectPendingQueues().catch(j=>{i.log.warn(`queue replay scan failed: ${j.message}`)});let te=t.daemon.agentSyncIntervalMinutes*60*1e3,Z=te>0?hp({registry:p,manager:v,intervalMs:te,logger:m}):void 0,ee=t.daemon.sessionGcIntervalMinutes*60*1e3,Q=t.daemon.sessionGcMaxAgeDays*24*60*60*1e3,oe=ee>0?mp({manager:v,intervalMs:ee,maxAgeMs:Q,logger:m}):void 0;return{app:i,manager:v,registry:p,extensions:b,transformers:k,mcpTokenRegistry:R,extensionMcp:H,processRegistry:d,shutdown:async()=>{oe&&oe(),Z&&Z(),clearInterval(f),clearInterval(u);let j=async(ce,_e)=>{try{await _e()}catch($e){i.log.warn(`shutdown step ${ce} failed: ${$e instanceof Error?$e.message:String($e)}`)}};await j("sessionTokenStore.flush",()=>o.flush()),await j("extensions.stop",()=>b.stop()),await j("transformers.stop",()=>k.stop()),await j("manager.closeAll",()=>v.closeAll()),await j("manager.flushSynopsis",()=>v.flushSynopsis(3e4)),await j("manager.shutdownSynopsis",()=>v.shutdownSynopsis()),await j("manager.flushMetaWrites",()=>v.flushMetaWrites()),await j("manager.flushHistoryWrites",()=>v.flushHistoryWrites()),Zd(null),nc(null),Lc(null),await j("app.close",()=>i.close());try{ah.unlinkSync(M.pidFile())}catch{}await j("fileStream.flushSync",()=>r.flushSync())}}}async function fS(t){let e=await uS({file:M.logFile(),size:"10m",frequency:"daily",mkdir:!0,symlink:!0}),n=oh.destination(2);return{stream:oh.multistream([{stream:e,level:t},{stream:n,level:t}]),fileStream:e}}function pS(t){let e=t.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!t.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}Ys();_t();Vi();import*as ch from"fs";import*as Wr from"fs/promises";async function Jr(t,e,n){let s=wS(e),r;try{r=await Wr.stat(t)}catch(d){if(d.code==="ENOENT"){process.stderr.write(`${n} (${t})
230
230
  `),process.exit(1);return}throw d}let i=await yS(t,r.size,s.tail);if(!s.follow)return;process.stdout.write(`-- following ${t} --
231
231
  `);let o=!1,a=ch.watch(t,()=>{o||(o=!0,setImmediate(async()=>{o=!1;try{let d=await Wr.stat(t);if(d.size<=i){d.size<i&&(i=d.size);return}let c=await Wr.open(t,"r");try{let l=Buffer.alloc(d.size-i);await c.read(l,0,l.length,i),process.stdout.write(l),i=d.size}finally{await c.close()}}catch{}}))});await new Promise(d=>{let c=()=>{a.close(),d()};process.once("SIGINT",c),process.once("SIGTERM",c)})}async function yS(t,e,n){if(n<=0||e===0)return e;let s=64*1024,r=await Wr.open(t,"r");try{let i=e,o="",a=0;for(;i>0&&a<=n;){let l=Math.min(s,i);i-=l;let f=Buffer.alloc(l);await r.read(f,0,l,i),o=f.toString("utf8")+o,a=(o.match(/\n/g)??[]).length}let c=o.split(`
232
232
  `).slice(-n-1);process.stdout.write(c.join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hydra-acp/cli",
3
- "version": "0.1.81",
3
+ "version": "0.1.82",
4
4
  "description": "Multi-client ACP session daemon: spawn agents, attach over WSS, multiplex sessions across editors.",
5
5
  "license": "MIT",
6
6
  "type": "module",